angular-three-soba 2.0.0-beta.255 → 2.0.0-beta.257

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.
Files changed (39) hide show
  1. package/abstractions/README.md +46 -0
  2. package/abstractions/index.d.ts +2 -0
  3. package/abstractions/lib/edges.d.ts +1 -1
  4. package/abstractions/lib/gradient-texture.d.ts +24 -0
  5. package/abstractions/lib/helper.d.ts +25 -0
  6. package/abstractions/lib/text.d.ts +1 -1
  7. package/esm2022/abstractions/index.mjs +3 -1
  8. package/esm2022/abstractions/lib/edges.mjs +7 -3
  9. package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
  10. package/esm2022/abstractions/lib/helper.mjs +80 -0
  11. package/esm2022/materials/lib/mesh-refraction-material.mjs +34 -4
  12. package/esm2022/materials/lib/mesh-transmission-material.mjs +3 -3
  13. package/esm2022/shaders/index.mjs +2 -1
  14. package/esm2022/shaders/lib/caustics.mjs +174 -0
  15. package/esm2022/staging/index.mjs +2 -1
  16. package/esm2022/staging/lib/accumulative-shadows.mjs +75 -195
  17. package/esm2022/staging/lib/caustics.mjs +320 -0
  18. package/esm2022/staging/lib/randomized-lights.mjs +17 -22
  19. package/fesm2022/angular-three-soba-abstractions.mjs +179 -15
  20. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  21. package/fesm2022/angular-three-soba-materials.mjs +32 -3
  22. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  23. package/fesm2022/angular-three-soba-shaders.mjs +173 -2
  24. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  25. package/fesm2022/angular-three-soba-staging.mjs +409 -222
  26. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  27. package/package.json +23 -20
  28. package/shaders/index.d.ts +1 -0
  29. package/shaders/lib/caustics.d.ts +96 -0
  30. package/shaders/lib/mesh-refraction-material.d.ts +2 -2
  31. package/staging/README.md +49 -0
  32. package/staging/index.d.ts +1 -0
  33. package/staging/lib/accumulative-shadows.d.ts +24 -55
  34. package/staging/lib/caustics.d.ts +49 -0
  35. package/staging/lib/center.d.ts +2 -2
  36. package/staging/lib/contact-shadows.d.ts +1 -1
  37. package/staging/lib/lightformer.d.ts +1 -1
  38. package/staging/lib/randomized-lights.d.ts +3 -4
  39. package/staging/lib/stage.d.ts +1 -1
@@ -25,6 +25,9 @@ npm install troika-three-text
25
25
  - [NgtsCatmullRomLine](#ngtscatmullromline)
26
26
  - [NgtsEdges](#ngtsedges)
27
27
  - [NgtsPrismGeometry](#ngtsprismgeometry)
28
+ - [NgtsGradientTexture](#ngtsgradienttexture)
29
+ - [injectHelper](#injecthelper)
30
+ - [NgtsHelper](#ngtshelper)
28
31
 
29
32
  ## NgtsGrid
30
33
 
@@ -231,3 +234,46 @@ Abstracts [THREE.ExtrudeGeometry](https://threejs.org/docs/#api/en/geometries/Ex
231
234
  <ngt-mesh-basic-material />
232
235
  </ngt-mesh>
233
236
  ```
237
+
238
+ ## NgtsGradientTexture
239
+
240
+ A declarative `THREE.Texture` which attaches to "map" by default. You can use this to create gradient backgrounds.
241
+
242
+ ### Object Inputs (NgtsGradientTextureOptions)
243
+
244
+ | Property | Description | Default Value |
245
+ | ------------------- | ------------------------------------------------------- | ------------- |
246
+ | `stops` | Gradient stops array. | required |
247
+ | `colors` | Gradient colors array. Must be the same size as `stops` | required |
248
+ | `type` | Gradient type. Can be `'linear'` or `'radial'`. | `'linear'` |
249
+ | `size` | Texture size. | `1024` |
250
+ | `width` | Texture width. | `16` |
251
+ | `innerCircleRadius` | Inner circle radius for radial gradients. | `0` |
252
+ | `outerCircleRadius` | Outer circle radius for radial gradients. | `auto` |
253
+
254
+ ```html
255
+ <ngt-mesh-basic-material>
256
+ <ngts-gradient-texture [stops]="[0, 0.5, 1]" [colors]="['red', 'green', 'blue']" />
257
+ </ngt-mesh-basic-material>
258
+ ```
259
+
260
+ ## `injectHelper`
261
+
262
+ A custom inject function to add helpers to existing nodes in the scene. It handles removal of the helper on destroy and auto-updates it by default.
263
+
264
+ ```ts
265
+ class MyCmp {
266
+ mesh = viewChild.required<ElementRef<Mesh>>('mesh');
267
+ helper = injectHelper(this.mesh, () => BoxHelper, { args: ['cyan'] });
268
+ }
269
+ ```
270
+
271
+ ### `NgtsHelper`
272
+
273
+ A declarative way to add helpers to existing nodes in the scene. It handles removal of the helper on destroy and auto-updates it by default.
274
+
275
+ ```html
276
+ <ngt-mesh>
277
+ <ngts-helper [type]="BoxHelper" [options]="['cyan']" />
278
+ </ngt-mesh>
279
+ ```
@@ -1,7 +1,9 @@
1
1
  export * from './lib/catmull-rom-line';
2
2
  export * from './lib/cubic-bezier-line';
3
3
  export * from './lib/edges';
4
+ export * from './lib/gradient-texture';
4
5
  export * from './lib/grid';
6
+ export * from './lib/helper';
5
7
  export * from './lib/line';
6
8
  export * from './lib/prism-geometry';
7
9
  export * from './lib/quadratic-bezier-line';
@@ -846,5 +846,5 @@ export declare class NgtsEdges {
846
846
  private memoizedThreshold?;
847
847
  constructor();
848
848
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtsEdges, never>;
849
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtsEdges, "ngts-edges", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
849
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtsEdges, "ngts-edges", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
850
850
  }
@@ -0,0 +1,24 @@
1
+ import { NgtTexture } from 'angular-three';
2
+ import { ColorRepresentation } from 'three';
3
+ import * as i0 from "@angular/core";
4
+ export interface NgtsGradientTextureOptions extends Partial<Omit<NgtTexture, 'type'>> {
5
+ size: number;
6
+ width: number;
7
+ type: 'linear' | 'radial';
8
+ innerCircleRadius: number;
9
+ outerCircleRadius: string | number;
10
+ }
11
+ export declare class NgtsGradientTexture {
12
+ attach: import("@angular/core").InputSignal<string>;
13
+ stops: import("@angular/core").InputSignal<number[]>;
14
+ colors: import("@angular/core").InputSignal<ColorRepresentation[]>;
15
+ options: import("@angular/core").InputSignalWithTransform<NgtsGradientTextureOptions, "" | Partial<NgtsGradientTextureOptions>>;
16
+ parameters: import("@angular/core").Signal<Omit<NgtsGradientTextureOptions, "type" | "size" | "width" | "innerCircleRadius" | "outerCircleRadius">>;
17
+ private store;
18
+ gl: import("@angular/core").Signal<import("three").WebGLRenderer>;
19
+ private document;
20
+ canvas: import("@angular/core").Signal<HTMLCanvasElement>;
21
+ constructor();
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtsGradientTexture, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtsGradientTexture, "ngts-gradient-texture", never, { "attach": { "alias": "attach"; "required": false; "isSignal": true; }; "stops": { "alias": "stops"; "required": true; "isSignal": true; }; "colors": { "alias": "colors"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
24
+ }
@@ -0,0 +1,25 @@
1
+ import { ElementRef, Injector } from '@angular/core';
2
+ import { Object3D } from 'three';
3
+ import * as i0 from "@angular/core";
4
+ type HelperArgs<T> = T extends [infer _, ...infer R] ? R : never;
5
+ export declare function injectHelper<TConstructor extends new (...args: any[]) => Object3D, THelperInstance extends InstanceType<TConstructor> & {
6
+ update: () => void;
7
+ dispose: () => void;
8
+ }>(object: () => ElementRef<Object3D> | Object3D | undefined | null, helperConstructor: () => TConstructor, { injector, args, }?: {
9
+ injector?: Injector;
10
+ args?: () => HelperArgs<TConstructor>;
11
+ }): import("@angular/core").Signal<THelperInstance | null>;
12
+ export declare class NgtsHelper<TConstructor extends new (...args: any[]) => Object3D> {
13
+ type: import("@angular/core").InputSignal<TConstructor>;
14
+ options: import("@angular/core").InputSignal<HelperArgs<TConstructor>>;
15
+ helperRef: import("@angular/core").Signal<ElementRef<Object3D<import("three").Object3DEventMap>>>;
16
+ private parent;
17
+ helper: import("@angular/core").Signal<(InstanceType<TConstructor> & {
18
+ update: () => void;
19
+ dispose: () => void;
20
+ }) | null>;
21
+ constructor();
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtsHelper<any>, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtsHelper<any>, "ngts-helper", never, { "type": { "alias": "type"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
24
+ }
25
+ export {};
@@ -43,7 +43,7 @@ export declare class NgtsText {
43
43
  private invalidate;
44
44
  private characters;
45
45
  font: import("@angular/core").Signal<string | undefined>;
46
- anchorX: import("@angular/core").Signal<number | "left" | "right" | "center">;
46
+ anchorX: import("@angular/core").Signal<number | "center" | "left" | "right">;
47
47
  anchorY: import("@angular/core").Signal<number | "top" | "top-baseline" | "middle" | "bottom-baseline" | "bottom">;
48
48
  sdfGlyphSize: import("@angular/core").Signal<number>;
49
49
  fontSize: import("@angular/core").Signal<number>;
@@ -1,10 +1,12 @@
1
1
  export * from './lib/catmull-rom-line';
2
2
  export * from './lib/cubic-bezier-line';
3
3
  export * from './lib/edges';
4
+ export * from './lib/gradient-texture';
4
5
  export * from './lib/grid';
6
+ export * from './lib/helper';
5
7
  export * from './lib/line';
6
8
  export * from './lib/prism-geometry';
7
9
  export * from './lib/quadratic-bezier-line';
8
10
  export * from './lib/text';
9
11
  export * from './lib/text-3d';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvYWJzdHJhY3Rpb25zL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2F0bXVsbC1yb20tbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jdWJpYy1iZXppZXItbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9lZGdlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncmlkJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcHJpc20tZ2VvbWV0cnknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcXVhZHJhdGljLWJlemllci1saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGV4dC0zZCc7XG4iXX0=
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvYWJzdHJhY3Rpb25zL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9jYXRtdWxsLXJvbS1saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2N1YmljLWJlemllci1saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2VkZ2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyYWRpZW50LXRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3JpZCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9oZWxwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wcmlzbS1nZW9tZXRyeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9xdWFkcmF0aWMtYmV6aWVyLWxpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90ZXh0LTNkJztcbiJdfQ==
@@ -48,7 +48,9 @@ export class NgtsEdges {
48
48
  }
49
49
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsEdges, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
50
50
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.0.6", type: NgtsEdges, isStandalone: true, selector: "ngts-edges", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "line", first: true, predicate: NgtsLine, descendants: true, isSignal: true }], ngImport: i0, template: `
51
- <ngts-line [points]="tmpPoints" [options]="lineOptions()"></ngts-line>
51
+ <ngts-line [points]="tmpPoints" [options]="lineOptions()">
52
+ <ng-content />
53
+ </ngts-line>
52
54
  `, isInline: true, dependencies: [{ kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
53
55
  }
54
56
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsEdges, decorators: [{
@@ -57,10 +59,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
57
59
  selector: 'ngts-edges',
58
60
  standalone: true,
59
61
  template: `
60
- <ngts-line [points]="tmpPoints" [options]="lineOptions()"></ngts-line>
62
+ <ngts-line [points]="tmpPoints" [options]="lineOptions()">
63
+ <ng-content />
64
+ </ngts-line>
61
65
  `,
62
66
  imports: [NgtsLine],
63
67
  changeDetection: ChangeDetectionStrategy.OnPush,
64
68
  }]
65
69
  }], ctorParameters: () => [] });
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvYWJzdHJhY3Rpb25zL3NyYy9saWIvZWRnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBVyxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBd0QsYUFBYSxFQUFRLE1BQU0sT0FBTyxDQUFDO0FBRWxHLE9BQU8sRUFBNkIsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQVk3RCxNQUFNLGNBQWMsR0FBcUI7SUFDeEMsU0FBUyxFQUFFLENBQUM7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNiLENBQUM7QUFXRixNQUFNLE9BQU8sU0FBUztJQVlyQjtRQVhBLFlBQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFekQsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUUsY0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6QyxTQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQU1uQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUVsQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxFQUFFO29CQUFFLE9BQU87Z0JBRWhCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQVUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTztnQkFFcEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pFLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBRXRCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQztnQkFDMUYsSUFBSSxNQUFNO29CQUFFLE9BQU87Z0JBRW5CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7Z0JBRW5DLE1BQU0sTUFBTSxHQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFxQjtxQkFDL0YsS0FBcUIsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQTNDVyxTQUFTO2tHQUFULFNBQVMsc1BBT0ssUUFBUSxnRUFieEI7O0VBRVQsNERBQ1MsUUFBUTs7MkZBR04sU0FBUztrQkFUckIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ25CLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFmdGVyTmV4dFJlbmRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNoZWNrTmVlZHNVcGRhdGUsIGdldExvY2FsU3RhdGUsIE5ndE1lc2gsIG9taXQgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSwgQnVmZmVyR2VvbWV0cnksIENvbG9yUmVwcmVzZW50YXRpb24sIEVkZ2VzR2VvbWV0cnksIE1lc2ggfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBMaW5lTWF0ZXJpYWxQYXJhbWV0ZXJzIH0gZnJvbSAndGhyZWUtc3RkbGliJztcbmltcG9ydCB7IE5ndExpbmUyLCBOZ3RMaW5lTWF0ZXJpYWwsIE5ndHNMaW5lIH0gZnJvbSAnLi9saW5lJztcblxuZXhwb3J0IHR5cGUgTmd0c0VkZ2VzT3B0aW9ucyA9IFBhcnRpYWw8Tmd0TWVzaD4gJiB7XG5cdHRocmVzaG9sZD86IG51bWJlcjtcblx0bGluZVdpZHRoPzogbnVtYmVyO1xufSAmIE9taXQ8TGluZU1hdGVyaWFsUGFyYW1ldGVycywgJ3ZlcnRleENvbG9ycycgfCAnY29sb3InPiAmXG5cdE9taXQ8UGFydGlhbDxOZ3RMaW5lMj4sICdnZW9tZXRyeSc+ICZcblx0T21pdDxQYXJ0aWFsPE5ndExpbmVNYXRlcmlhbD4sICdjb2xvcicgfCAndmVydGV4Q29sb3JzJz4gJiB7XG5cdFx0Z2VvbWV0cnk/OiBCdWZmZXJHZW9tZXRyeTtcblx0XHRjb2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247XG5cdH07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzRWRnZXNPcHRpb25zID0ge1xuXHRsaW5lV2lkdGg6IDEsXG5cdHRocmVzaG9sZDogMTUsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWVkZ2VzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0cy1saW5lIFtwb2ludHNdPVwidG1wUG9pbnRzXCIgW29wdGlvbnNdPVwibGluZU9wdGlvbnMoKVwiPjwvbmd0cy1saW5lPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0c0xpbmVdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0VkZ2VzIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXHRwcml2YXRlIHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWyd0aHJlc2hvbGQnLCAnZ2VvbWV0cnknXSk7XG5cblx0cHJvdGVjdGVkIGxpbmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gKHsgLi4udGhpcy5wYXJhbWV0ZXJzKCksIHJheWNhc3Q6ICgpID0+IG51bGwgfSkpO1xuXHRwcm90ZWN0ZWQgdG1wUG9pbnRzID0gWzAsIDAsIDAsIDEsIDAsIDBdO1xuXG5cdGxpbmUgPSB2aWV3Q2hpbGQucmVxdWlyZWQoTmd0c0xpbmUpO1xuXG5cdHByaXZhdGUgbWVtb2l6ZWRHZW9tZXRyeT86IEJ1ZmZlckdlb21ldHJ5O1xuXHRwcml2YXRlIG1lbW9pemVkVGhyZXNob2xkPzogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBsaW5lID0gdGhpcy5saW5lKCkubGluZSgpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRpZiAoIWxpbmUpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBsUyA9IGdldExvY2FsU3RhdGUobGluZSk7XG5cdFx0XHRcdGlmICghbFMpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBwYXJlbnQgPSBsUy5wYXJlbnQoKSBhcyBNZXNoO1xuXHRcdFx0XHRpZiAoIXBhcmVudCkgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IHsgZ2VvbWV0cnk6IGV4cGxpY2l0R2VvbWV0cnksIHRocmVzaG9sZCB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gZXhwbGljaXRHZW9tZXRyeSA/PyBwYXJlbnQuZ2VvbWV0cnk7XG5cdFx0XHRcdGlmICghZ2VvbWV0cnkpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1lbW9pemVkR2VvbWV0cnkgPT09IGdlb21ldHJ5ICYmIHRoaXMubWVtb2l6ZWRUaHJlc2hvbGQgPT09IHRocmVzaG9sZDtcblx0XHRcdFx0aWYgKGNhY2hlZCkgcmV0dXJuO1xuXG5cdFx0XHRcdHRoaXMubWVtb2l6ZWRHZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHRcdFx0XHR0aGlzLm1lbW9pemVkVGhyZXNob2xkID0gdGhyZXNob2xkO1xuXG5cdFx0XHRcdGNvbnN0IHBvaW50cyA9IChuZXcgRWRnZXNHZW9tZXRyeShnZW9tZXRyeSwgdGhyZXNob2xkKS5hdHRyaWJ1dGVzWydwb3NpdGlvbiddIGFzIEJ1ZmZlckF0dHJpYnV0ZSlcblx0XHRcdFx0XHQuYXJyYXkgYXMgRmxvYXQzMkFycmF5O1xuXHRcdFx0XHRsaW5lLmdlb21ldHJ5LnNldFBvc2l0aW9ucyhwb2ludHMpO1xuXHRcdFx0XHRjaGVja05lZWRzVXBkYXRlKGxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlc1snaW5zdGFuY2VTdGFydCddKTtcblx0XHRcdFx0Y2hlY2tOZWVkc1VwZGF0ZShsaW5lLmdlb21ldHJ5LmF0dHJpYnV0ZXNbJ2luc3RhbmNlRW5kJ10pO1xuXHRcdFx0XHRsaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvYWJzdHJhY3Rpb25zL3NyYy9saWIvZWRnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBVyxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBd0QsYUFBYSxFQUFRLE1BQU0sT0FBTyxDQUFDO0FBRWxHLE9BQU8sRUFBNkIsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQVk3RCxNQUFNLGNBQWMsR0FBcUI7SUFDeEMsU0FBUyxFQUFFLENBQUM7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNiLENBQUM7QUFhRixNQUFNLE9BQU8sU0FBUztJQVlyQjtRQVhBLFlBQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFekQsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUUsY0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6QyxTQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQU1uQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUVsQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxFQUFFO29CQUFFLE9BQU87Z0JBRWhCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQVUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTztnQkFFcEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pFLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBRXRCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQztnQkFDMUYsSUFBSSxNQUFNO29CQUFFLE9BQU87Z0JBRW5CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7Z0JBRW5DLE1BQU0sTUFBTSxHQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFxQjtxQkFDL0YsS0FBcUIsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQTNDVyxTQUFTO2tHQUFULFNBQVMsc1BBT0ssUUFBUSxnRUFmeEI7Ozs7RUFJVCw0REFDUyxRQUFROzsyRkFHTixTQUFTO2tCQVhyQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO29CQUN0QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO29CQUNuQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZnRlck5leHRSZW5kZXIsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjaGVja05lZWRzVXBkYXRlLCBnZXRMb2NhbFN0YXRlLCBOZ3RNZXNoLCBvbWl0IH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUsIEJ1ZmZlckdlb21ldHJ5LCBDb2xvclJlcHJlc2VudGF0aW9uLCBFZGdlc0dlb21ldHJ5LCBNZXNoIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTGluZU1hdGVyaWFsUGFyYW1ldGVycyB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5pbXBvcnQgeyBOZ3RMaW5lMiwgTmd0TGluZU1hdGVyaWFsLCBOZ3RzTGluZSB9IGZyb20gJy4vbGluZSc7XG5cbmV4cG9ydCB0eXBlIE5ndHNFZGdlc09wdGlvbnMgPSBQYXJ0aWFsPE5ndE1lc2g+ICYge1xuXHR0aHJlc2hvbGQ/OiBudW1iZXI7XG5cdGxpbmVXaWR0aD86IG51bWJlcjtcbn0gJiBPbWl0PExpbmVNYXRlcmlhbFBhcmFtZXRlcnMsICd2ZXJ0ZXhDb2xvcnMnIHwgJ2NvbG9yJz4gJlxuXHRPbWl0PFBhcnRpYWw8Tmd0TGluZTI+LCAnZ2VvbWV0cnknPiAmXG5cdE9taXQ8UGFydGlhbDxOZ3RMaW5lTWF0ZXJpYWw+LCAnY29sb3InIHwgJ3ZlcnRleENvbG9ycyc+ICYge1xuXHRcdGdlb21ldHJ5PzogQnVmZmVyR2VvbWV0cnk7XG5cdFx0Y29sb3I/OiBDb2xvclJlcHJlc2VudGF0aW9uO1xuXHR9O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c0VkZ2VzT3B0aW9ucyA9IHtcblx0bGluZVdpZHRoOiAxLFxuXHR0aHJlc2hvbGQ6IDE1LFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1lZGdlcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndHMtbGluZSBbcG9pbnRzXT1cInRtcFBvaW50c1wiIFtvcHRpb25zXT1cImxpbmVPcHRpb25zKClcIj5cblx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0PC9uZ3RzLWxpbmU+XG5cdGAsXG5cdGltcG9ydHM6IFtOZ3RzTGluZV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzRWRnZXMge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHByaXZhdGUgcGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ3RocmVzaG9sZCcsICdnZW9tZXRyeSddKTtcblxuXHRwcm90ZWN0ZWQgbGluZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiAoeyAuLi50aGlzLnBhcmFtZXRlcnMoKSwgcmF5Y2FzdDogKCkgPT4gbnVsbCB9KSk7XG5cdHByb3RlY3RlZCB0bXBQb2ludHMgPSBbMCwgMCwgMCwgMSwgMCwgMF07XG5cblx0bGluZSA9IHZpZXdDaGlsZC5yZXF1aXJlZChOZ3RzTGluZSk7XG5cblx0cHJpdmF0ZSBtZW1vaXplZEdlb21ldHJ5PzogQnVmZmVyR2VvbWV0cnk7XG5cdHByaXZhdGUgbWVtb2l6ZWRUaHJlc2hvbGQ/OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGxpbmUgPSB0aGlzLmxpbmUoKS5saW5lKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdGlmICghbGluZSkgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IGxTID0gZ2V0TG9jYWxTdGF0ZShsaW5lKTtcblx0XHRcdFx0aWYgKCFsUykgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IHBhcmVudCA9IGxTLnBhcmVudCgpIGFzIE1lc2g7XG5cdFx0XHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRcdFx0Y29uc3QgeyBnZW9tZXRyeTogZXhwbGljaXRHZW9tZXRyeSwgdGhyZXNob2xkIH0gPSB0aGlzLm9wdGlvbnMoKTtcblx0XHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSBleHBsaWNpdEdlb21ldHJ5ID8/IHBhcmVudC5nZW9tZXRyeTtcblx0XHRcdFx0aWYgKCFnZW9tZXRyeSkgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubWVtb2l6ZWRHZW9tZXRyeSA9PT0gZ2VvbWV0cnkgJiYgdGhpcy5tZW1vaXplZFRocmVzaG9sZCA9PT0gdGhyZXNob2xkO1xuXHRcdFx0XHRpZiAoY2FjaGVkKSByZXR1cm47XG5cblx0XHRcdFx0dGhpcy5tZW1vaXplZEdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cdFx0XHRcdHRoaXMubWVtb2l6ZWRUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG5cblx0XHRcdFx0Y29uc3QgcG9pbnRzID0gKG5ldyBFZGdlc0dlb21ldHJ5KGdlb21ldHJ5LCB0aHJlc2hvbGQpLmF0dHJpYnV0ZXNbJ3Bvc2l0aW9uJ10gYXMgQnVmZmVyQXR0cmlidXRlKVxuXHRcdFx0XHRcdC5hcnJheSBhcyBGbG9hdDMyQXJyYXk7XG5cdFx0XHRcdGxpbmUuZ2VvbWV0cnkuc2V0UG9zaXRpb25zKHBvaW50cyk7XG5cdFx0XHRcdGNoZWNrTmVlZHNVcGRhdGUobGluZS5nZW9tZXRyeS5hdHRyaWJ1dGVzWydpbnN0YW5jZVN0YXJ0J10pO1xuXHRcdFx0XHRjaGVja05lZWRzVXBkYXRlKGxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlc1snaW5zdGFuY2VFbmQnXSk7XG5cdFx0XHRcdGxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,91 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, inject, input, untracked, } from '@angular/core';
3
+ import { extend, injectStore, NgtArgs, omit } from 'angular-three';
4
+ import { mergeInputs } from 'ngxtension/inject-inputs';
5
+ import { CanvasTexture, Color } from 'three';
6
+ import * as i0 from "@angular/core";
7
+ const defaultOptions = {
8
+ size: 1024,
9
+ width: 16,
10
+ type: 'linear',
11
+ innerCircleRadius: 0,
12
+ outerCircleRadius: 'auto',
13
+ };
14
+ export class NgtsGradientTexture {
15
+ constructor() {
16
+ this.attach = input('map');
17
+ this.stops = input.required();
18
+ this.colors = input.required();
19
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
20
+ this.parameters = omit(this.options, ['size', 'width', 'type', 'innerCircleRadius', 'outerCircleRadius']);
21
+ this.store = injectStore();
22
+ this.gl = this.store.select('gl');
23
+ this.document = inject(DOCUMENT);
24
+ this.canvas = computed(() => {
25
+ const canvas = this.document.createElement('canvas');
26
+ const context = canvas.getContext('2d');
27
+ const [{ width, size, type, outerCircleRadius, innerCircleRadius }, stops, colors] = [
28
+ untracked(this.options),
29
+ this.stops(),
30
+ this.colors(),
31
+ ];
32
+ canvas.width = width;
33
+ canvas.height = size;
34
+ let gradient;
35
+ if (type === 'linear') {
36
+ gradient = context.createLinearGradient(0, 0, 0, size);
37
+ }
38
+ else {
39
+ const canvasCenterX = canvas.width / 2;
40
+ const canvasCenterY = canvas.height / 2;
41
+ const radius = outerCircleRadius !== 'auto'
42
+ ? Math.abs(Number(outerCircleRadius))
43
+ : Math.sqrt(canvasCenterX ** 2 + canvasCenterY ** 2);
44
+ gradient = context.createRadialGradient(canvasCenterX, canvasCenterY, Math.abs(innerCircleRadius), canvasCenterX, canvasCenterY, radius);
45
+ }
46
+ const tempColor = new Color(); // reuse instance for performance
47
+ let i = stops.length;
48
+ while (i--) {
49
+ gradient.addColorStop(stops[i], tempColor.set(colors[i]).getStyle());
50
+ }
51
+ context.save();
52
+ context.fillStyle = gradient;
53
+ context.fillRect(0, 0, width, size);
54
+ context.restore();
55
+ return canvas;
56
+ });
57
+ extend({ CanvasTexture });
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsGradientTexture, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtsGradientTexture, isStandalone: true, selector: "ngts-gradient-texture", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, stops: { classPropertyName: "stops", publicName: "stops", isSignal: true, isRequired: true, transformFunction: null }, colors: { classPropertyName: "colors", publicName: "colors", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
61
+ <ngt-canvas-texture
62
+ *args="[canvas()]"
63
+ [attach]="attach()"
64
+ [colorSpace]="gl().outputColorSpace"
65
+ [parameters]="parameters()"
66
+ >
67
+ <ng-content />
68
+ </ngt-canvas-texture>
69
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsGradientTexture, decorators: [{
72
+ type: Component,
73
+ args: [{
74
+ selector: 'ngts-gradient-texture',
75
+ standalone: true,
76
+ template: `
77
+ <ngt-canvas-texture
78
+ *args="[canvas()]"
79
+ [attach]="attach()"
80
+ [colorSpace]="gl().outputColorSpace"
81
+ [parameters]="parameters()"
82
+ >
83
+ <ng-content />
84
+ </ngt-canvas-texture>
85
+ `,
86
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
87
+ changeDetection: ChangeDetectionStrategy.OnPush,
88
+ imports: [NgtArgs],
89
+ }]
90
+ }], ctorParameters: () => [] });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhZGllbnQtdGV4dHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9hYnN0cmFjdGlvbnMvc3JjL2xpYi9ncmFkaWVudC10ZXh0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBYyxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUF1QixNQUFNLE9BQU8sQ0FBQzs7QUFVbEUsTUFBTSxjQUFjLEdBQStCO0lBQ2xELElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLEVBQUU7SUFDVCxJQUFJLEVBQUUsUUFBUTtJQUNkLGlCQUFpQixFQUFFLENBQUM7SUFDcEIsaUJBQWlCLEVBQUUsTUFBTTtDQUN6QixDQUFDO0FBbUJGLE1BQU0sT0FBTyxtQkFBbUI7SUEwRC9CO1FBekRBLFdBQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsVUFBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWlCLENBQUM7UUFDeEMsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQThCLENBQUM7UUFDdEQsWUFBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RSxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFP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LDREQUdTLE9BQU87OzJGQUVMLG1CQUFtQjtrQkFqQi9CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7O0VBU1Q7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGluamVjdFN0b3JlLCBOZ3RBcmdzLCBOZ3RUZXh0dXJlLCBvbWl0IH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQgeyBDYW52YXNUZXh0dXJlLCBDb2xvciwgQ29sb3JSZXByZXNlbnRhdGlvbiB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzR3JhZGllbnRUZXh0dXJlT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8T21pdDxOZ3RUZXh0dXJlLCAndHlwZSc+PiB7XG5cdHNpemU6IG51bWJlcjtcblx0d2lkdGg6IG51bWJlcjtcblx0dHlwZTogJ2xpbmVhcicgfCAncmFkaWFsJztcblx0aW5uZXJDaXJjbGVSYWRpdXM6IG51bWJlcjtcblx0b3V0ZXJDaXJjbGVSYWRpdXM6IHN0cmluZyB8IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNHcmFkaWVudFRleHR1cmVPcHRpb25zID0ge1xuXHRzaXplOiAxMDI0LFxuXHR3aWR0aDogMTYsXG5cdHR5cGU6ICdsaW5lYXInLFxuXHRpbm5lckNpcmNsZVJhZGl1czogMCxcblx0b3V0ZXJDaXJjbGVSYWRpdXM6ICdhdXRvJyxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtZ3JhZGllbnQtdGV4dHVyZScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1jYW52YXMtdGV4dHVyZVxuXHRcdFx0KmFyZ3M9XCJbY2FudmFzKCldXCJcblx0XHRcdFthdHRhY2hdPVwiYXR0YWNoKClcIlxuXHRcdFx0W2NvbG9yU3BhY2VdPVwiZ2woKS5vdXRwdXRDb2xvclNwYWNlXCJcblx0XHRcdFtwYXJhbWV0ZXJzXT1cInBhcmFtZXRlcnMoKVwiXG5cdFx0PlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1jYW52YXMtdGV4dHVyZT5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzR3JhZGllbnRUZXh0dXJlIHtcblx0YXR0YWNoID0gaW5wdXQoJ21hcCcpO1xuXHRzdG9wcyA9IGlucHV0LnJlcXVpcmVkPEFycmF5PG51bWJlcj4+KCk7XG5cdGNvbG9ycyA9IGlucHV0LnJlcXVpcmVkPEFycmF5PENvbG9yUmVwcmVzZW50YXRpb24+PigpO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydzaXplJywgJ3dpZHRoJywgJ3R5cGUnLCAnaW5uZXJDaXJjbGVSYWRpdXMnLCAnb3V0ZXJDaXJjbGVSYWRpdXMnXSk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cdHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG5cdGNhbnZhcyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBjYW52YXMgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXHRcdGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG5cdFx0Y29uc3QgW3sgd2lkdGgsIHNpemUsIHR5cGUsIG91dGVyQ2lyY2xlUmFkaXVzLCBpbm5lckNpcmNsZVJhZGl1cyB9LCBzdG9wcywgY29sb3JzXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLFxuXHRcdFx0dGhpcy5zdG9wcygpLFxuXHRcdFx0dGhpcy5jb2xvcnMoKSxcblx0XHRdO1xuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuXHRcdGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuXG5cdFx0bGV0IGdyYWRpZW50OiBDYW52YXNHcmFkaWVudDtcblxuXHRcdGlmICh0eXBlID09PSAnbGluZWFyJykge1xuXHRcdFx0Z3JhZGllbnQgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIHNpemUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBjYW52YXNDZW50ZXJYID0gY2FudmFzLndpZHRoIC8gMjtcblx0XHRcdGNvbnN0IGNhbnZhc0NlbnRlclkgPSBjYW52YXMuaGVpZ2h0IC8gMjtcblx0XHRcdGNvbnN0IHJhZGl1cyA9XG5cdFx0XHRcdG91dGVyQ2lyY2xlUmFkaXVzICE9PSAnYXV0bydcblx0XHRcdFx0XHQ/IE1hdGguYWJzKE51bWJlcihvdXRlckNpcmNsZVJhZGl1cykpXG5cdFx0XHRcdFx0OiBNYXRoLnNxcnQoY2FudmFzQ2VudGVyWCAqKiAyICsgY2FudmFzQ2VudGVyWSAqKiAyKTtcblx0XHRcdGdyYWRpZW50ID0gY29udGV4dC5jcmVhdGVSYWRpYWxHcmFkaWVudChcblx0XHRcdFx0Y2FudmFzQ2VudGVyWCxcblx0XHRcdFx0Y2FudmFzQ2VudGVyWSxcblx0XHRcdFx0TWF0aC5hYnMoaW5uZXJDaXJjbGVSYWRpdXMpLFxuXHRcdFx0XHRjYW52YXNDZW50ZXJYLFxuXHRcdFx0XHRjYW52YXNDZW50ZXJZLFxuXHRcdFx0XHRyYWRpdXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlbXBDb2xvciA9IG5ldyBDb2xvcigpOyAvLyByZXVzZSBpbnN0YW5jZSBmb3IgcGVyZm9ybWFuY2VcblxuXHRcdGxldCBpID0gc3RvcHMubGVuZ3RoO1xuXHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdGdyYWRpZW50LmFkZENvbG9yU3RvcChzdG9wc1tpXSwgdGVtcENvbG9yLnNldChjb2xvcnNbaV0pLmdldFN0eWxlKCkpO1xuXHRcdH1cblxuXHRcdGNvbnRleHQuc2F2ZSgpO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gZ3JhZGllbnQ7XG5cdFx0Y29udGV4dC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgc2l6ZSk7XG5cdFx0Y29udGV4dC5yZXN0b3JlKCk7XG5cblx0XHRyZXR1cm4gY2FudmFzO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRleHRlbmQoeyBDYW52YXNUZXh0dXJlIH0pO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,80 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, signal, untracked, viewChild, } from '@angular/core';
2
+ import { extend, getLocalState, injectBeforeRender, injectStore, resolveRef } from 'angular-three';
3
+ import { assertInjector } from 'ngxtension/assert-injector';
4
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
5
+ import { Object3D } from 'three';
6
+ import * as i0 from "@angular/core";
7
+ export function injectHelper(object, helperConstructor, { injector, args = () => [], } = {}) {
8
+ return assertInjector(injectHelper, injector, () => {
9
+ const autoEffect = injectAutoEffect();
10
+ const store = injectStore();
11
+ const scene = store.select('scene');
12
+ const helper = signal(null);
13
+ afterNextRender(() => {
14
+ autoEffect(() => {
15
+ let currentHelper = undefined;
16
+ const maybeObject3D = object();
17
+ if (!maybeObject3D)
18
+ return;
19
+ const object3D = resolveRef(maybeObject3D);
20
+ if (!object3D)
21
+ return;
22
+ currentHelper = new (helperConstructor())(object3D, ...args());
23
+ if (!currentHelper)
24
+ return;
25
+ untracked(() => {
26
+ helper.set(currentHelper);
27
+ });
28
+ // Prevent the helpers from blocking rays
29
+ currentHelper.traverse((child) => (child.raycast = () => null));
30
+ scene().add(currentHelper);
31
+ return () => {
32
+ helper.set(null);
33
+ scene().remove(currentHelper);
34
+ currentHelper.dispose?.();
35
+ };
36
+ });
37
+ });
38
+ injectBeforeRender(() => {
39
+ const currentHelper = helper();
40
+ if (currentHelper)
41
+ currentHelper.update();
42
+ });
43
+ return helper.asReadonly();
44
+ });
45
+ }
46
+ export class NgtsHelper {
47
+ constructor() {
48
+ this.type = input.required();
49
+ this.options = input([]);
50
+ this.helperRef = viewChild.required('helper');
51
+ this.parent = computed(() => {
52
+ const helper = this.helperRef().nativeElement;
53
+ if (!helper)
54
+ return;
55
+ const localState = getLocalState(helper);
56
+ if (!localState)
57
+ return;
58
+ return localState.parent();
59
+ });
60
+ this.helper = injectHelper(this.parent, this.type, { args: this.options });
61
+ extend({ Object3D });
62
+ }
63
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsHelper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
64
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.0.6", type: NgtsHelper, isStandalone: true, selector: "ngts-helper", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "helperRef", first: true, predicate: ["helper"], descendants: true, isSignal: true }], ngImport: i0, template: `
65
+ <ngt-object-3D #helper />
66
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtsHelper, decorators: [{
69
+ type: Component,
70
+ args: [{
71
+ standalone: true,
72
+ selector: 'ngts-helper',
73
+ template: `
74
+ <ngt-object-3D #helper />
75
+ `,
76
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
77
+ changeDetection: ChangeDetectionStrategy.OnPush,
78
+ }]
79
+ }], ctorParameters: () => [] });
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL2Fic3RyYWN0aW9ucy9zcmMvbGliL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUd0QixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFJakMsTUFBTSxVQUFVLFlBQVksQ0FJM0IsTUFBZ0UsRUFDaEUsaUJBQXFDLEVBQ3JDLEVBQ0MsUUFBUSxFQUNSLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUF5QyxNQUNhLEVBQUU7SUFFdEUsT0FBTyxjQUFjLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDbEQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBeUIsSUFBSSxDQUFDLENBQUM7UUFFcEQsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksYUFBYSxHQUFnQyxTQUFTLENBQUM7Z0JBQzNELE1BQU0sYUFBYSxHQUFHLE1BQU0sRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsYUFBYTtvQkFBRSxPQUFPO2dCQUUzQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBRXRCLGFBQWEsR0FBRyxLQUFLLGlCQUFpQixFQUFVLEVBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLGFBQWE7b0JBQUUsT0FBTztnQkFFM0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQztnQkFFSCx5Q0FBeUM7Z0JBQ3pDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRTNCLE9BQU8sR0FBRyxFQUFFO29CQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDOUIsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDdkIsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxhQUFhO2dCQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVdELE1BQU0sT0FBTyxVQUFVO0lBZ0J0QjtRQWZBLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFnQixDQUFDO1FBQ3RDLFlBQU8sR0FBRyxLQUFLLENBQTJCLEVBQXlDLENBQUMsQ0FBQztRQUVyRixjQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBdUIsUUFBUSxDQUFDLENBQUM7UUFFdkQsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBQ3BCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPO1lBQ3hCLE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFHckUsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN0QixDQUFDOzhHQWxCVyxVQUFVO2tHQUFWLFVBQVUsMGJBTlo7O0VBRVQ7OzJGQUlXLFVBQVU7a0JBVHRCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUU7O0VBRVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdEluamVjdG9yLFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGdldExvY2FsU3RhdGUsIGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUsIHJlc29sdmVSZWYgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICd0aHJlZSc7XG5cbnR5cGUgSGVscGVyQXJnczxUPiA9IFQgZXh0ZW5kcyBbaW5mZXIgXywgLi4uaW5mZXIgUl0gPyBSIDogbmV2ZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RIZWxwZXI8XG5cdFRDb25zdHJ1Y3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IE9iamVjdDNELFxuXHRUSGVscGVySW5zdGFuY2UgZXh0ZW5kcyBJbnN0YW5jZVR5cGU8VENvbnN0cnVjdG9yPiAmIHsgdXBkYXRlOiAoKSA9PiB2b2lkOyBkaXNwb3NlOiAoKSA9PiB2b2lkIH0sXG4+KFxuXHRvYmplY3Q6ICgpID0+IEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0QgfCB1bmRlZmluZWQgfCBudWxsLFxuXHRoZWxwZXJDb25zdHJ1Y3RvcjogKCkgPT4gVENvbnN0cnVjdG9yLFxuXHR7XG5cdFx0aW5qZWN0b3IsXG5cdFx0YXJncyA9ICgpID0+IFtdIGFzIHVua25vd24gYXMgSGVscGVyQXJnczxUQ29uc3RydWN0b3I+LFxuXHR9OiB7IGluamVjdG9yPzogSW5qZWN0b3I7IGFyZ3M/OiAoKSA9PiBIZWxwZXJBcmdzPFRDb25zdHJ1Y3Rvcj4gfSA9IHt9LFxuKSB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3RIZWxwZXIsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0XHRjb25zdCBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdFx0Y29uc3Qgc2NlbmUgPSBzdG9yZS5zZWxlY3QoJ3NjZW5lJyk7XG5cblx0XHRjb25zdCBoZWxwZXIgPSBzaWduYWw8VEhlbHBlckluc3RhbmNlIHwgbnVsbD4obnVsbCk7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGxldCBjdXJyZW50SGVscGVyOiBUSGVscGVySW5zdGFuY2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IG1heWJlT2JqZWN0M0QgPSBvYmplY3QoKTtcblx0XHRcdFx0aWYgKCFtYXliZU9iamVjdDNEKSByZXR1cm47XG5cblx0XHRcdFx0Y29uc3Qgb2JqZWN0M0QgPSByZXNvbHZlUmVmKG1heWJlT2JqZWN0M0QpO1xuXHRcdFx0XHRpZiAoIW9iamVjdDNEKSByZXR1cm47XG5cblx0XHRcdFx0Y3VycmVudEhlbHBlciA9IG5ldyAoaGVscGVyQ29uc3RydWN0b3IoKSBhcyBhbnkpKG9iamVjdDNELCAuLi5hcmdzKCkpO1xuXHRcdFx0XHRpZiAoIWN1cnJlbnRIZWxwZXIpIHJldHVybjtcblxuXHRcdFx0XHR1bnRyYWNrZWQoKCkgPT4ge1xuXHRcdFx0XHRcdGhlbHBlci5zZXQoY3VycmVudEhlbHBlcik7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgdGhlIGhlbHBlcnMgZnJvbSBibG9ja2luZyByYXlzXG5cdFx0XHRcdGN1cnJlbnRIZWxwZXIudHJhdmVyc2UoKGNoaWxkKSA9PiAoY2hpbGQucmF5Y2FzdCA9ICgpID0+IG51bGwpKTtcblx0XHRcdFx0c2NlbmUoKS5hZGQoY3VycmVudEhlbHBlcik7XG5cblx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRoZWxwZXIuc2V0KG51bGwpO1xuXHRcdFx0XHRcdHNjZW5lKCkucmVtb3ZlKGN1cnJlbnRIZWxwZXIpO1xuXHRcdFx0XHRcdGN1cnJlbnRIZWxwZXIuZGlzcG9zZT8uKCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50SGVscGVyID0gaGVscGVyKCk7XG5cdFx0XHRpZiAoY3VycmVudEhlbHBlcikgY3VycmVudEhlbHBlci51cGRhdGUoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBoZWxwZXIuYXNSZWFkb25seSgpO1xuXHR9KTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHNlbGVjdG9yOiAnbmd0cy1oZWxwZXInLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3Qtb2JqZWN0LTNEICNoZWxwZXIgLz5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0hlbHBlcjxUQ29uc3RydWN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBPYmplY3QzRD4ge1xuXHR0eXBlID0gaW5wdXQucmVxdWlyZWQ8VENvbnN0cnVjdG9yPigpO1xuXHRvcHRpb25zID0gaW5wdXQ8SGVscGVyQXJnczxUQ29uc3RydWN0b3I+PihbXSBhcyB1bmtub3duIGFzIEhlbHBlckFyZ3M8VENvbnN0cnVjdG9yPik7XG5cblx0aGVscGVyUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8T2JqZWN0M0Q+PignaGVscGVyJyk7XG5cblx0cHJpdmF0ZSBwYXJlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgaGVscGVyID0gdGhpcy5oZWxwZXJSZWYoKS5uYXRpdmVFbGVtZW50O1xuXHRcdGlmICghaGVscGVyKSByZXR1cm47XG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoaGVscGVyKTtcblx0XHRpZiAoIWxvY2FsU3RhdGUpIHJldHVybjtcblx0XHRyZXR1cm4gbG9jYWxTdGF0ZS5wYXJlbnQoKTtcblx0fSk7XG5cblx0aGVscGVyID0gaW5qZWN0SGVscGVyKHRoaXMucGFyZW50LCB0aGlzLnR5cGUsIHsgYXJnczogdGhpcy5vcHRpb25zIH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IE9iamVjdDNEIH0pO1xuXHR9XG59XG4iXX0=
@@ -1,7 +1,9 @@
1
- import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, inject, input, untracked, viewChild, } from '@angular/core';
2
- import { injectStore, NgtArgs, omit, pick } from 'angular-three';
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, inject, input, untracked, viewChild, } from '@angular/core';
2
+ import { getLocalState, injectBeforeRender, injectStore, NgtArgs, omit, pick, } from 'angular-three';
3
3
  import { MeshRefractionMaterial } from 'angular-three-soba/shaders';
4
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
5
  import { mergeInputs } from 'ngxtension/inject-inputs';
6
+ import { MeshBVH, MeshBVHUniformStruct, SAH } from 'three-mesh-bvh';
5
7
  import * as i0 from "@angular/core";
6
8
  const defaultOptions = {
7
9
  bounces: 2,
@@ -28,7 +30,11 @@ export class NgtsMeshRefractionMaterial {
28
30
  this.resolution = computed(() => [this.size().width, this.size().height]);
29
31
  this.defines = computed(() => {
30
32
  const temp = {};
31
- const [envMap, aberrationStrength, fastChroma] = [this.envMap(), this.aberrationStrength(), this.fastChroma()];
33
+ const [envMap, aberrationStrength, fastChroma] = [
34
+ untracked(this.envMap),
35
+ this.aberrationStrength(),
36
+ this.fastChroma(),
37
+ ];
32
38
  const isCubeMap = isCubeTexture(envMap);
33
39
  const w = (isCubeMap ? envMap.image[0]?.width : envMap.image.width) ?? 1024;
34
40
  const cubeSize = w / 4;
@@ -62,6 +68,30 @@ export class NgtsMeshRefractionMaterial {
62
68
  this.defineKeys();
63
69
  return new MeshRefractionMaterial();
64
70
  });
71
+ const autoEffect = injectAutoEffect();
72
+ afterNextRender(() => {
73
+ autoEffect(() => {
74
+ const material = this.materialRef()?.nativeElement;
75
+ if (!material)
76
+ return;
77
+ const localState = getLocalState(material);
78
+ if (!localState)
79
+ return;
80
+ const parent = untracked(localState.parent);
81
+ const geometry = parent.geometry;
82
+ if (geometry) {
83
+ material.bvh = new MeshBVHUniformStruct();
84
+ material.bvh.updateFrom(new MeshBVH(geometry.clone().toNonIndexed(), { strategy: SAH }));
85
+ }
86
+ });
87
+ });
88
+ injectBeforeRender(({ camera }) => {
89
+ const material = this.materialRef()?.nativeElement;
90
+ if (material) {
91
+ material.viewMatrixInverse = camera.matrixWorld;
92
+ material.projectionMatrixInverse = camera.projectionMatrixInverse;
93
+ }
94
+ });
65
95
  inject(DestroyRef).onDestroy(() => {
66
96
  const material = this.materialRef()?.nativeElement;
67
97
  if (material) {
@@ -111,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
111
141
  imports: [NgtArgs],
112
142
  }]
113
143
  }], ctorParameters: () => [] });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21hdGVyaWFscy9zcmMvbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFFVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBZ0IsT0FBTyxFQUFxQixJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFrQnZELE1BQU0sY0FBYyxHQUFzQztJQUN6RCxPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxHQUFHO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLElBQUk7Q0FDaEIsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLEdBQTBCO0lBQ2hELE9BQU8sR0FBRyxJQUFLLEdBQW1CLENBQUMsYUFBYSxDQUFDO0FBQ2xELENBQUM7QUF1QkQsTUFBTSxPQUFPLDBCQUEwQjtJQXlEdEM7UUF4REEsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXlCLENBQUM7UUFDakQsV0FBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFD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Y3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGVzdHJveVJlZixcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0U3RvcmUsIE5ndEFueVJlY29yZCwgTmd0QXJncywgTmd0U2hhZGVyTWF0ZXJpYWwsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE1lc2hSZWZyYWN0aW9uTWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycyc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQgeyBDb2xvclJlcHJlc2VudGF0aW9uLCBDdWJlVGV4dHVyZSwgVGV4dHVyZSB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzTWVzaFJlZnJhY3Rpb25NYXRlcmlhbE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPE5ndFNoYWRlck1hdGVyaWFsPiB7XG5cdC8qKiBOdW1iZXIgb2YgcmF5LWNhc3QgYm91bmNlcywgaXQgY2FuIGJlIGV4cGVuc2l2ZSB0byBoYXZlIHRvbyBtYW55LCAyICovXG5cdGJvdW5jZXM6IG51bWJlcjtcblx0LyoqIFJlZnJhY3Rpb24gaW5kZXgsIDIuNCAqL1xuXHRpb3I6IG51bWJlcjtcblx0LyoqIEZyZXNuZWwgKHN0cmlwIGxpZ2h0KSwgMCAqL1xuXHRmcmVzbmVsOiBudW1iZXI7XG5cdC8qKiBSR0Igc2hpZnQgaW50ZW5zaXR5LCBjYW4gYmUgZXhwZW5zaXZlLCAwICovXG5cdGFiZXJyYXRpb25TdHJlbmd0aDogbnVtYmVyO1xuXHQvKiogQ29sb3IsIHdoaXRlICovXG5cdGNvbG9yOiBDb2xvclJlcHJlc2VudGF0aW9uO1xuXHQvKiogSWYgdGhpcyBpcyBvbiBpdCB1c2VzIGZld2VyIHJheSBjYXN0cyBmb3IgdGhlIFJHQiBzaGlmdCBzYWNyaWZpY2luZyBwaHlzaWNhbCBhY2N1cmFjeSwgdHJ1ZSAqL1xuXHRmYXN0Q2hyb21hOiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c01lc2hSZWZyYWN0aW9uTWF0ZXJpYWxPcHRpb25zID0ge1xuXHRib3VuY2VzOiAyLFxuXHRpb3I6IDIuNCxcblx0ZnJlc25lbDogMCxcblx0YWJlcnJhdGlvblN0cmVuZ3RoOiAwLFxuXHRjb2xvcjogJ3doaXRlJyxcblx0ZmFzdENocm9tYTogdHJ1ZSxcbn07XG5cbmZ1bmN0aW9uIGlzQ3ViZVRleHR1cmUoZGVmOiBDdWJlVGV4dHVyZSB8IFRleHR1cmUpOiBkZWYgaXMgQ3ViZVRleHR1cmUge1xuXHRyZXR1cm4gZGVmICYmIChkZWYgYXMgQ3ViZVRleHR1cmUpLmlzQ3ViZVRleHR1cmU7XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtbWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZVxuXHRcdFx0KmFyZ3M9XCJbbWF0ZXJpYWwoKV1cIlxuXHRcdFx0I21hdGVyaWFsXG5cdFx0XHRbYXR0YWNoXT1cImF0dGFjaCgpXCJcblx0XHRcdFtwYXJhbWV0ZXJzXT1cInBhcmFtZXRlcnMoKVwiXG5cdFx0XHRbZW52TWFwXT1cImVudk1hcCgpXCJcblx0XHRcdFthYmVycmF0aW9uU3RyZW5ndGhdPVwiYWJlcnJhdGlvblN0cmVuZ3RoKClcIlxuXHRcdFx0W3Jlc29sdXRpb25dPVwicmVzb2x1dGlvbigpXCJcblx0XHRcdFtkZWZpbmVzXT1cImRlZmluZXMoKVwiXG5cdFx0PlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1wcmltaXRpdmU+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c01lc2hSZWZyYWN0aW9uTWF0ZXJpYWwge1xuXHRlbnZNYXAgPSBpbnB1dC5yZXF1aXJlZDxDdWJlVGV4dHVyZSB8IFRleHR1cmU+KCk7XG5cdGF0dGFjaCA9IGlucHV0KCdtYXRlcmlhbCcpO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydmYXN0Q2hyb21hJywgJ2FiZXJyYXRpb25TdHJlbmd0aCddKTtcblxuXHRwcml2YXRlIGZhc3RDaHJvbWEgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2Zhc3RDaHJvbWEnKTtcblx0YWJlcnJhdGlvblN0cmVuZ3RoID0gcGljayh0aGlzLm9wdGlvbnMsICdhYmVycmF0aW9uU3RyZW5ndGgnKTtcblxuXHRtYXRlcmlhbFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEluc3RhbmNlVHlwZTx0eXBlb2YgTWVzaFJlZnJhY3Rpb25NYXRlcmlhbD4+PignbWF0ZXJpYWwnKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblxuXHRyZXNvbHV0aW9uID0gY29tcHV0ZWQoKCkgPT4gW3RoaXMuc2l6ZSgpLndpZHRoLCB0aGlzLnNpemUoKS5oZWlnaHRdKTtcblx0ZGVmaW5lcyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0ZW1wID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblx0XHRjb25zdCBbZW52TWFwLCBhYmVycmF0aW9uU3RyZW5ndGgsIGZhc3RDaHJvbWFdID0gW3RoaXMuZW52TWFwKCksIHRoaXMuYWJlcnJhdGlvblN0cmVuZ3RoKCksIHRoaXMuZmFzdENocm9tYSgpXTtcblx0XHRjb25zdCBpc0N1YmVNYXAgPSBpc0N1YmVUZXh0dXJlKGVudk1hcCk7XG5cblx0XHRjb25zdCB3ID0gKGlzQ3ViZU1hcCA/IGVudk1hcC5pbWFnZVswXT8ud2lkdGggOiBlbnZNYXAuaW1hZ2Uud2lkdGgpID8/IDEwMjQ7XG5cdFx0Y29uc3QgY3ViZVNpemUgPSB3IC8gNDtcblx0XHRjb25zdCBfbG9kTWF4ID0gTWF0aC5mbG9vcihNYXRoLmxvZzIoY3ViZVNpemUpKTtcblx0XHRjb25zdCBfY3ViZVNpemUgPSBNYXRoLnBvdygyLCBfbG9kTWF4KTtcblx0XHRjb25zdCB3aWR0aCA9IDMgKiBNYXRoLm1heChfY3ViZVNpemUsIDE2ICogNyk7XG5cdFx0Y29uc3QgaGVpZ2h0ID0gNCAqIF9jdWJlU2l6ZTtcblxuXHRcdGlmIChpc0N1YmVNYXApIHRlbXBbJ0VOVk1BUF9UWVBFX0NVQkVNJ10gPSAnJztcblx0XHR0ZW1wWydDVUJFVVZfVEVYRUxfV0lEVEgnXSA9IGAkezEuMCAvIHdpZHRofWA7XG5cdFx0dGVtcFsnQ1VCRVVWX1RFWEVMX0hFSUdIVCddID0gYCR7MS4wIC8gaGVpZ2h0fWA7XG5cdFx0dGVtcFsnQ1VCRVVWX01BWF9NSVAnXSA9IGAke19sb2RNYXh9LjBgO1xuXG5cdFx0Ly8gQWRkIGRlZmluZXMgZnJvbSBjaHJvbWF0aWMgYWJlcnJhdGlvblxuXHRcdGlmIChhYmVycmF0aW9uU3RyZW5ndGggPiAwKSB0ZW1wWydDSFJPTUFUSUNfQUJFUlJBVElPTlMnXSA9ICcnO1xuXHRcdGlmIChmYXN0Q2hyb21hKSB0ZW1wWydGQVNUX0NIUk9NQSddID0gJyc7XG5cblx0XHRyZXR1cm4gdGVtcDtcblx0fSk7XG5cblx0cHJpdmF0ZSBkZWZpbmVLZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMoKSkuam9pbignICcpO1xuXHR9KTtcblxuXHRtYXRlcmlhbCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBwcmV2TWF0ZXJpYWwgPSB1bnRyYWNrZWQodGhpcy5tYXRlcmlhbFJlZik/Lm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRpZiAocHJldk1hdGVyaWFsKSB7XG5cdFx0XHRwcmV2TWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0ZGVsZXRlIChwcmV2TWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdH1cblxuXHRcdC8vIHRyYWNrIGJ5IHRoaXMuZGVmaW5lS2V5c1xuXHRcdHRoaXMuZGVmaW5lS2V5cygpO1xuXHRcdHJldHVybiBuZXcgTWVzaFJlZnJhY3Rpb25NYXRlcmlhbCgpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0aWYgKG1hdGVyaWFsKSB7XG5cdFx0XHRcdG1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0XHRcdFx0ZGVsZXRlIChtYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRcdGRlbGV0ZSAobWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21hdGVyaWFscy9zcmMvbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBRVYsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFdBQVcsRUFFWCxPQUFPLEVBRVAsSUFBSSxFQUNKLElBQUksR0FDSixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQnBFLE1BQU0sY0FBYyxHQUFzQztJQUN6RCxPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxHQUFHO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLElBQUk7Q0FDaEIsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLEdBQTBCO0lBQ2hELE9BQU8sR0FBRyxJQUFLLEdBQW1CLENBQUMsYUFBYSxDQUFDO0FBQ2xELENBQUM7QUF1QkQsTUFBTSxPQUFPLDBCQUEwQjtJQTZEdEM7UUE1REEsV0FBTSxHQUFHLEtBQUssQ0FBQyxR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QUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGVzdHJveVJlZixcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3RBcmdzLFxuXHROZ3RTaGFkZXJNYXRlcmlhbCxcblx0b21pdCxcblx0cGljayxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBNZXNoUmVmcmFjdGlvbk1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQ29sb3JSZXByZXNlbnRhdGlvbiwgQ3ViZVRleHR1cmUsIE1lc2gsIFRleHR1cmUgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBNZXNoQlZILCBNZXNoQlZIVW5pZm9ybVN0cnVjdCwgU0FIIH0gZnJvbSAndGhyZWUtbWVzaC1idmgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNNZXNoUmVmcmFjdGlvbk1hdGVyaWFsT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8Tmd0U2hhZGVyTWF0ZXJpYWw+IHtcblx0LyoqIE51bWJlciBvZiByYXktY2FzdCBib3VuY2VzLCBpdCBjYW4gYmUgZXhwZW5zaXZlIHRvIGhhdmUgdG9vIG1hbnksIDIgKi9cblx0Ym91bmNlczogbnVtYmVyO1xuXHQvKiogUmVmcmFjdGlvbiBpbmRleCwgMi40ICovXG5cdGlvcjogbnVtYmVyO1xuXHQvKiogRnJlc25lbCAoc3RyaXAgbGlnaHQpLCAwICovXG5cdGZyZXNuZWw6IG51bWJlcjtcblx0LyoqIFJHQiBzaGlmdCBpbnRlbnNpdHksIGNhbiBiZSBleHBlbnNpdmUsIDAgKi9cblx0YWJlcnJhdGlvblN0cmVuZ3RoOiBudW1iZXI7XG5cdC8qKiBDb2xvciwgd2hpdGUgKi9cblx0Y29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247XG5cdC8qKiBJZiB0aGlzIGlzIG9uIGl0IHVzZXMgZmV3ZXIgcmF5IGNhc3RzIGZvciB0aGUgUkdCIHNoaWZ0IHNhY3JpZmljaW5nIHBoeXNpY2FsIGFjY3VyYWN5LCB0cnVlICovXG5cdGZhc3RDaHJvbWE6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzTWVzaFJlZnJhY3Rpb25NYXRlcmlhbE9wdGlvbnMgPSB7XG5cdGJvdW5jZXM6IDIsXG5cdGlvcjogMi40LFxuXHRmcmVzbmVsOiAwLFxuXHRhYmVycmF0aW9uU3RyZW5ndGg6IDAsXG5cdGNvbG9yOiAnd2hpdGUnLFxuXHRmYXN0Q2hyb21hOiB0cnVlLFxufTtcblxuZnVuY3Rpb24gaXNDdWJlVGV4dHVyZShkZWY6IEN1YmVUZXh0dXJlIHwgVGV4dHVyZSk6IGRlZiBpcyBDdWJlVGV4dHVyZSB7XG5cdHJldHVybiBkZWYgJiYgKGRlZiBhcyBDdWJlVGV4dHVyZSkuaXNDdWJlVGV4dHVyZTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlXG5cdFx0XHQqYXJncz1cIlttYXRlcmlhbCgpXVwiXG5cdFx0XHQjbWF0ZXJpYWxcblx0XHRcdFthdHRhY2hdPVwiYXR0YWNoKClcIlxuXHRcdFx0W3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCJcblx0XHRcdFtlbnZNYXBdPVwiZW52TWFwKClcIlxuXHRcdFx0W2FiZXJyYXRpb25TdHJlbmd0aF09XCJhYmVycmF0aW9uU3RyZW5ndGgoKVwiXG5cdFx0XHRbcmVzb2x1dGlvbl09XCJyZXNvbHV0aW9uKClcIlxuXHRcdFx0W2RlZmluZXNdPVwiZGVmaW5lcygpXCJcblx0XHQ+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LXByaW1pdGl2ZT5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWVzaFJlZnJhY3Rpb25NYXRlcmlhbCB7XG5cdGVudk1hcCA9IGlucHV0LnJlcXVpcmVkPEN1YmVUZXh0dXJlIHwgVGV4dHVyZT4oKTtcblx0YXR0YWNoID0gaW5wdXQoJ21hdGVyaWFsJyk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ2Zhc3RDaHJvbWEnLCAnYWJlcnJhdGlvblN0cmVuZ3RoJ10pO1xuXG5cdHByaXZhdGUgZmFzdENocm9tYSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZmFzdENocm9tYScpO1xuXHRhYmVycmF0aW9uU3RyZW5ndGggPSBwaWNrKHRoaXMub3B0aW9ucywgJ2FiZXJyYXRpb25TdHJlbmd0aCcpO1xuXG5cdG1hdGVyaWFsUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SW5zdGFuY2VUeXBlPHR5cGVvZiBNZXNoUmVmcmFjdGlvbk1hdGVyaWFsPj4+KCdtYXRlcmlhbCcpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIHNpemUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2l6ZScpO1xuXG5cdHJlc29sdXRpb24gPSBjb21wdXRlZCgoKSA9PiBbdGhpcy5zaXplKCkud2lkdGgsIHRoaXMuc2l6ZSgpLmhlaWdodF0pO1xuXHRkZWZpbmVzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHRlbXAgPSB7fSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXHRcdGNvbnN0IFtlbnZNYXAsIGFiZXJyYXRpb25TdHJlbmd0aCwgZmFzdENocm9tYV0gPSBbXG5cdFx0XHR1bnRyYWNrZWQodGhpcy5lbnZNYXApLFxuXHRcdFx0dGhpcy5hYmVycmF0aW9uU3RyZW5ndGgoKSxcblx0XHRcdHRoaXMuZmFzdENocm9tYSgpLFxuXHRcdF07XG5cdFx0Y29uc3QgaXNDdWJlTWFwID0gaXNDdWJlVGV4dHVyZShlbnZNYXApO1xuXG5cdFx0Y29uc3QgdyA9IChpc0N1YmVNYXAgPyBlbnZNYXAuaW1hZ2VbMF0/LndpZHRoIDogZW52TWFwLmltYWdlLndpZHRoKSA/PyAxMDI0O1xuXHRcdGNvbnN0IGN1YmVTaXplID0gdyAvIDQ7XG5cdFx0Y29uc3QgX2xvZE1heCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKGN1YmVTaXplKSk7XG5cdFx0Y29uc3QgX2N1YmVTaXplID0gTWF0aC5wb3coMiwgX2xvZE1heCk7XG5cdFx0Y29uc3Qgd2lkdGggPSAzICogTWF0aC5tYXgoX2N1YmVTaXplLCAxNiAqIDcpO1xuXHRcdGNvbnN0IGhlaWdodCA9IDQgKiBfY3ViZVNpemU7XG5cblx0XHRpZiAoaXNDdWJlTWFwKSB0ZW1wWydFTlZNQVBfVFlQRV9DVUJFTSddID0gJyc7XG5cdFx0dGVtcFsnQ1VCRVVWX1RFWEVMX1dJRFRIJ10gPSBgJHsxLjAgLyB3aWR0aH1gO1xuXHRcdHRlbXBbJ0NVQkVVVl9URVhFTF9IRUlHSFQnXSA9IGAkezEuMCAvIGhlaWdodH1gO1xuXHRcdHRlbXBbJ0NVQkVVVl9NQVhfTUlQJ10gPSBgJHtfbG9kTWF4fS4wYDtcblxuXHRcdC8vIEFkZCBkZWZpbmVzIGZyb20gY2hyb21hdGljIGFiZXJyYXRpb25cblx0XHRpZiAoYWJlcnJhdGlvblN0cmVuZ3RoID4gMCkgdGVtcFsnQ0hST01BVElDX0FCRVJSQVRJT05TJ10gPSAnJztcblx0XHRpZiAoZmFzdENocm9tYSkgdGVtcFsnRkFTVF9DSFJPTUEnXSA9ICcnO1xuXG5cdFx0cmV0dXJuIHRlbXA7XG5cdH0pO1xuXG5cdHByaXZhdGUgZGVmaW5lS2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXModGhpcy5kZWZpbmVzKCkpLmpvaW4oJyAnKTtcblx0fSk7XG5cblx0bWF0ZXJpYWwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcHJldk1hdGVyaWFsID0gdW50cmFja2VkKHRoaXMubWF0ZXJpYWxSZWYpPy5uYXRpdmVFbGVtZW50O1xuXG5cdFx0aWYgKHByZXZNYXRlcmlhbCkge1xuXHRcdFx0cHJldk1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0XHRcdGRlbGV0ZSAocHJldk1hdGVyaWFsIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXTtcblx0XHRcdGRlbGV0ZSAocHJldk1hdGVyaWFsIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X3JlbmRlcmVyX18nXTtcblx0XHR9XG5cblx0XHQvLyB0cmFjayBieSB0aGlzLmRlZmluZUtleXNcblx0XHR0aGlzLmRlZmluZUtleXMoKTtcblx0XHRyZXR1cm4gbmV3IE1lc2hSZWZyYWN0aW9uTWF0ZXJpYWwoKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShtYXRlcmlhbCk7XG5cdFx0XHRcdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IHBhcmVudCA9IHVudHJhY2tlZChsb2NhbFN0YXRlLnBhcmVudCk7XG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gKHBhcmVudCBhcyBNZXNoKS5nZW9tZXRyeTtcblx0XHRcdFx0aWYgKGdlb21ldHJ5KSB7XG5cdFx0XHRcdFx0KG1hdGVyaWFsIGFzIGFueSkuYnZoID0gbmV3IE1lc2hCVkhVbmlmb3JtU3RydWN0KCk7XG5cdFx0XHRcdFx0KG1hdGVyaWFsIGFzIGFueSkuYnZoLnVwZGF0ZUZyb20obmV3IE1lc2hCVkgoZ2VvbWV0cnkuY2xvbmUoKS50b05vbkluZGV4ZWQoKSwgeyBzdHJhdGVneTogU0FIIH0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKHsgY2FtZXJhIH0pID0+IHtcblx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0aWYgKG1hdGVyaWFsKSB7XG5cdFx0XHRcdChtYXRlcmlhbCBhcyBhbnkpLnZpZXdNYXRyaXhJbnZlcnNlID0gY2FtZXJhLm1hdHJpeFdvcmxkO1xuXHRcdFx0XHQobWF0ZXJpYWwgYXMgYW55KS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRpZiAobWF0ZXJpYWwpIHtcblx0XHRcdFx0bWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdFx0XHRkZWxldGUgKG1hdGVyaWFsIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXTtcblx0XHRcdFx0ZGVsZXRlIChtYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9yZW5kZXJlcl9fJ107XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==