angular-three 2.0.0-beta.9 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +221 -4
  2. package/esm2022/index.mjs +13 -14
  3. package/esm2022/lib/canvas.mjs +130 -197
  4. package/esm2022/lib/directives/args.mjs +46 -20
  5. package/esm2022/lib/directives/selection.mjs +65 -0
  6. package/esm2022/lib/dom/events.mjs +2 -2
  7. package/esm2022/lib/events.mjs +33 -31
  8. package/esm2022/lib/html.mjs +40 -0
  9. package/esm2022/lib/instance.mjs +43 -36
  10. package/esm2022/lib/loader.mjs +72 -36
  11. package/esm2022/lib/loop.mjs +29 -26
  12. package/esm2022/lib/pipes/hexify.mjs +67 -0
  13. package/esm2022/lib/portal.mjs +173 -193
  14. package/esm2022/lib/renderer/catalogue.mjs +3 -3
  15. package/esm2022/lib/renderer/constants.mjs +6 -6
  16. package/esm2022/lib/renderer/index.mjs +356 -217
  17. package/esm2022/lib/renderer/state.mjs +54 -0
  18. package/esm2022/lib/renderer/utils.mjs +120 -64
  19. package/esm2022/lib/roots.mjs +86 -62
  20. package/esm2022/lib/routed-scene.mjs +11 -8
  21. package/esm2022/lib/store.mjs +164 -195
  22. package/esm2022/lib/three-types.mjs +1 -1
  23. package/esm2022/lib/types.mjs +1 -1
  24. package/esm2022/lib/utils/apply-props.mjs +31 -28
  25. package/esm2022/lib/utils/attach.mjs +26 -12
  26. package/esm2022/lib/utils/before-render.mjs +12 -0
  27. package/esm2022/lib/utils/is.mjs +6 -5
  28. package/esm2022/lib/utils/make.mjs +19 -17
  29. package/esm2022/lib/utils/non-nullish.mjs +7 -0
  30. package/esm2022/lib/utils/object-events.mjs +91 -0
  31. package/esm2022/lib/utils/parameters.mjs +70 -0
  32. package/esm2022/lib/utils/resolve-ref.mjs +8 -0
  33. package/esm2022/lib/utils/signal-store.mjs +59 -60
  34. package/esm2022/lib/utils/update.mjs +8 -4
  35. package/esm2022/nativescript/angular-three-nativescript.mjs +5 -0
  36. package/esm2022/nativescript/index.mjs +2 -0
  37. package/esm2022/nativescript/lib/canvas.mjs +127 -0
  38. package/esm2022/testing/angular-three-testing.mjs +5 -0
  39. package/esm2022/testing/index.mjs +3 -0
  40. package/esm2022/testing/lib/test-bed.mjs +130 -0
  41. package/esm2022/testing/lib/test-canvas.mjs +45 -0
  42. package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
  43. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
  44. package/fesm2022/angular-three-nativescript.mjs +134 -0
  45. package/fesm2022/angular-three-nativescript.mjs.map +1 -0
  46. package/fesm2022/angular-three-testing.mjs +966 -0
  47. package/fesm2022/angular-three-testing.mjs.map +1 -0
  48. package/fesm2022/angular-three.mjs +2271 -2306
  49. package/fesm2022/angular-three.mjs.map +1 -1
  50. package/index.d.ts +14 -14
  51. package/lib/canvas.d.ts +357 -96
  52. package/lib/directives/args.d.ts +14 -7
  53. package/lib/directives/selection.d.ts +17 -0
  54. package/lib/dom/events.d.ts +2 -3
  55. package/lib/events.d.ts +4 -80
  56. package/lib/html.d.ts +17 -0
  57. package/lib/instance.d.ts +3 -35
  58. package/lib/loader.d.ts +19 -7
  59. package/lib/loop.d.ts +11 -59
  60. package/lib/pipes/hexify.d.ts +20 -0
  61. package/lib/portal.d.ts +54 -48
  62. package/lib/renderer/catalogue.d.ts +7 -3
  63. package/lib/renderer/constants.d.ts +5 -5
  64. package/lib/renderer/index.d.ts +63 -4
  65. package/lib/renderer/state.d.ts +25 -0
  66. package/lib/renderer/utils.d.ts +10 -27
  67. package/lib/roots.d.ts +9 -7
  68. package/lib/store.d.ts +13 -141
  69. package/lib/three-types.d.ts +528 -147
  70. package/lib/types.d.ts +291 -0
  71. package/lib/utils/apply-props.d.ts +2 -3
  72. package/lib/utils/attach.d.ts +4 -6
  73. package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
  74. package/lib/utils/is.d.ts +13 -14
  75. package/lib/utils/make.d.ts +7 -13
  76. package/lib/utils/non-nullish.d.ts +4 -0
  77. package/lib/utils/object-events.d.ts +32 -0
  78. package/lib/utils/parameters.d.ts +20 -0
  79. package/lib/utils/resolve-ref.d.ts +2 -0
  80. package/lib/utils/signal-store.d.ts +13 -4
  81. package/lib/utils/update.d.ts +1 -1
  82. package/metadata.json +1 -1
  83. package/nativescript/README.md +5 -0
  84. package/nativescript/index.d.ts +1 -0
  85. package/nativescript/lib/canvas.d.ts +359 -0
  86. package/nativescript/package.json +3 -0
  87. package/package.json +65 -14
  88. package/plugin/generators.json +8 -30
  89. package/plugin/package.json +3 -3
  90. package/plugin/src/generators/add-soba/compat.js.map +1 -0
  91. package/plugin/src/generators/add-soba/generator.d.ts +3 -0
  92. package/plugin/src/generators/add-soba/generator.js +77 -0
  93. package/plugin/src/generators/add-soba/generator.js.map +1 -0
  94. package/plugin/src/generators/add-soba/schema.json +4 -0
  95. package/plugin/src/generators/init/compat.d.ts +1 -1
  96. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +29 -0
  97. package/plugin/src/generators/init/generator.d.ts +5 -1
  98. package/plugin/src/generators/init/generator.js +131 -25
  99. package/plugin/src/generators/init/generator.js.map +1 -1
  100. package/plugin/src/generators/init/schema.json +9 -2
  101. package/plugin/src/generators/utils.d.ts +2 -0
  102. package/plugin/src/generators/utils.js +35 -0
  103. package/plugin/src/generators/utils.js.map +1 -0
  104. package/plugin/src/generators/version.d.ts +17 -0
  105. package/plugin/src/generators/version.js +21 -0
  106. package/plugin/src/generators/version.js.map +1 -0
  107. package/plugin/src/index.d.ts +0 -3
  108. package/plugin/src/index.js +0 -9
  109. package/plugin/src/index.js.map +1 -1
  110. package/testing/README.md +3 -0
  111. package/testing/index.d.ts +2 -0
  112. package/testing/lib/test-bed.d.ts +38 -0
  113. package/testing/lib/test-canvas.d.ts +11 -0
  114. package/testing/lib/utils/mock-canvas.d.ts +5 -0
  115. package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
  116. package/testing/package.json +3 -0
  117. package/web-types.json +1 -1
  118. package/esm2022/lib/before-render.mjs +0 -13
  119. package/esm2022/lib/directives/common.mjs +0 -41
  120. package/esm2022/lib/directives/key.mjs +0 -29
  121. package/esm2022/lib/directives/parent.mjs +0 -35
  122. package/esm2022/lib/directives/repeat.mjs +0 -17
  123. package/esm2022/lib/ref.mjs +0 -48
  124. package/esm2022/lib/renderer/store.mjs +0 -405
  125. package/esm2022/lib/utils/assert-injection-context.mjs +0 -14
  126. package/esm2022/lib/utils/create-injection-token.mjs +0 -47
  127. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
  128. package/lib/directives/common.d.ts +0 -15
  129. package/lib/directives/key.d.ts +0 -10
  130. package/lib/directives/parent.d.ts +0 -11
  131. package/lib/directives/repeat.d.ts +0 -7
  132. package/lib/ref.d.ts +0 -8
  133. package/lib/renderer/store.d.ts +0 -67
  134. package/lib/utils/assert-injection-context.d.ts +0 -2
  135. package/lib/utils/create-injection-token.d.ts +0 -27
  136. package/lib/utils/safe-detect-changes.d.ts +0 -2
  137. package/plugin/src/generators/init-cannon/compat.js.map +0 -1
  138. package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
  139. package/plugin/src/generators/init-cannon/generator.js +0 -22
  140. package/plugin/src/generators/init-cannon/generator.js.map +0 -1
  141. package/plugin/src/generators/init-cannon/schema.json +0 -6
  142. package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
  143. package/plugin/src/generators/init-postprocessing/compat.js +0 -6
  144. package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
  145. package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
  146. package/plugin/src/generators/init-postprocessing/generator.js +0 -20
  147. package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
  148. package/plugin/src/generators/init-postprocessing/schema.json +0 -6
  149. package/plugin/src/generators/init-soba/compat.d.ts +0 -2
  150. package/plugin/src/generators/init-soba/compat.js +0 -6
  151. package/plugin/src/generators/init-soba/compat.js.map +0 -1
  152. package/plugin/src/generators/init-soba/generator.d.ts +0 -2
  153. package/plugin/src/generators/init-soba/generator.js +0 -24
  154. package/plugin/src/generators/init-soba/generator.js.map +0 -1
  155. package/plugin/src/generators/init-soba/schema.json +0 -6
  156. package/plugin/src/generators/versions.d.ts +0 -12
  157. package/plugin/src/generators/versions.js +0 -16
  158. package/plugin/src/generators/versions.js.map +0 -1
  159. /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
  160. /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
@@ -1,242 +1,222 @@
1
- import { NgIf } from '@angular/common';
2
- import { Component, ContentChild, DestroyRef, Directive, EventEmitter, Injector, Input, NgZone, Output, SkipSelf, TemplateRef, ViewChild, ViewContainerRef, effect, inject, } from '@angular/core';
3
- import * as THREE from 'three';
4
- import { injectBeforeRender } from './before-render';
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, contentChild, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, Directive, inject, Injector, input, signal, TemplateRef, untracked, viewChild, ViewContainerRef, } from '@angular/core';
2
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
3
+ import { Raycaster, Vector2, Vector3 } from 'three';
5
4
  import { getLocalState, prepare } from './instance';
6
- import { injectNgtRef } from './ref';
7
5
  import { SPECIAL_INTERNAL_ADD_COMMENT } from './renderer/constants';
8
- import { NGT_STORE, injectNgtStore } from './store';
6
+ import { injectStore, provideStore } from './store';
7
+ import { injectBeforeRender } from './utils/before-render';
9
8
  import { is } from './utils/is';
10
- import { safeDetectChanges } from './utils/safe-detect-changes';
11
9
  import { signalStore } from './utils/signal-store';
12
10
  import { updateCamera } from './utils/update';
13
11
  import * as i0 from "@angular/core";
14
- const privateKeys = [
15
- 'get',
16
- 'set',
17
- 'select',
18
- 'setSize',
19
- 'setDpr',
20
- 'setFrameloop',
21
- 'events',
22
- 'invalidate',
23
- 'advance',
24
- 'size',
25
- 'viewport',
26
- ];
27
12
  export class NgtPortalBeforeRender {
28
13
  constructor() {
29
- this.portalStore = injectNgtStore();
30
- this.injector = inject(Injector);
31
- this.renderPriority = 1;
32
- this.beforeRender = new EventEmitter();
14
+ this.portalStore = injectStore();
15
+ this.renderPriority = input(1);
16
+ this.parentScene = input.required();
17
+ this.parentCamera = input.required();
18
+ injectAutoEffect()((injector) => {
19
+ // track state
20
+ this.portalStore.state();
21
+ const priority = this.renderPriority();
22
+ let oldClear;
23
+ return injectBeforeRender(() => {
24
+ const { gl, scene, camera } = this.portalStore.snapshot;
25
+ oldClear = gl.autoClear;
26
+ if (this.renderPriority() === 1) {
27
+ // clear scene and render with default
28
+ gl.autoClear = true;
29
+ gl.render(this.parentScene(), this.parentCamera());
30
+ }
31
+ // disable cleaning
32
+ gl.autoClear = false;
33
+ gl.clearDepth();
34
+ gl.render(scene, camera);
35
+ // restore
36
+ gl.autoClear = oldClear;
37
+ }, { priority, injector });
38
+ });
33
39
  }
34
- ngOnInit() {
35
- let oldClear;
36
- injectBeforeRender(({ delta, frame }) => {
37
- this.beforeRender.emit({ ...this.portalStore.get(), delta, frame });
38
- const { gl, scene, camera } = this.portalStore.get();
39
- oldClear = gl.autoClear;
40
- if (this.renderPriority === 1) {
41
- // clear scene and render with default
42
- gl.autoClear = true;
43
- gl.render(this.parentScene, this.parentCamera);
44
- }
45
- // disable cleaning
46
- gl.autoClear = false;
47
- gl.clearDepth();
48
- gl.render(scene, camera);
49
- // restore
50
- gl.autoClear = oldClear;
51
- }, { priority: this.renderPriority, injector: this.injector });
40
+ onPointerOver() {
41
+ /* noop */
52
42
  }
53
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
54
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: NgtPortalBeforeRender, isStandalone: true, selector: "[ngtPortalBeforeRender]", inputs: { renderPriority: "renderPriority", parentScene: "parentScene", parentCamera: "parentCamera" }, outputs: { beforeRender: "beforeRender" }, ngImport: i0 }); }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
44
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtPortalBeforeRender, isStandalone: true, selector: "ngt-portal-before-render", inputs: { renderPriority: { classPropertyName: "renderPriority", publicName: "renderPriority", isSignal: true, isRequired: false, transformFunction: null }, parentScene: { classPropertyName: "parentScene", publicName: "parentScene", isSignal: true, isRequired: true, transformFunction: null }, parentCamera: { classPropertyName: "parentCamera", publicName: "parentCamera", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
45
+ <!-- Without an element that receives pointer events state.pointer will always be 0/0 -->
46
+ <ngt-group (pointerover)="onPointerOver()" attach="none" />
47
+ `, isInline: true }); }
55
48
  }
56
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
57
- type: Directive,
58
- args: [{ selector: '[ngtPortalBeforeRender]', standalone: true }]
59
- }], propDecorators: { renderPriority: [{
60
- type: Input
61
- }], parentScene: [{
62
- type: Input,
63
- args: [{ required: true }]
64
- }], parentCamera: [{
65
- type: Input,
66
- args: [{ required: true }]
67
- }], beforeRender: [{
68
- type: Output
69
- }] } });
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
50
+ type: Component,
51
+ args: [{
52
+ selector: 'ngt-portal-before-render',
53
+ standalone: true,
54
+ template: `
55
+ <!-- Without an element that receives pointer events state.pointer will always be 0/0 -->
56
+ <ngt-group (pointerover)="onPointerOver()" attach="none" />
57
+ `,
58
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
59
+ }]
60
+ }], ctorParameters: () => [] });
70
61
  export class NgtPortalContent {
71
- constructor(vcr, parentVcr) {
72
- const commentNode = vcr.element.nativeElement;
62
+ constructor() {
63
+ const { element: comment } = inject(ViewContainerRef);
64
+ const { element: parentComment } = inject(ViewContainerRef, { skipSelf: true });
65
+ const commentNode = comment.nativeElement;
73
66
  if (commentNode[SPECIAL_INTERNAL_ADD_COMMENT]) {
74
- commentNode[SPECIAL_INTERNAL_ADD_COMMENT](parentVcr.element.nativeElement);
67
+ commentNode[SPECIAL_INTERNAL_ADD_COMMENT](parentComment.nativeElement);
75
68
  delete commentNode[SPECIAL_INTERNAL_ADD_COMMENT];
76
69
  }
77
70
  }
78
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortalContent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ViewContainerRef, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
79
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: NgtPortalContent, isStandalone: true, selector: "ng-template[ngtPortalContent]", ngImport: i0 }); }
71
+ static ngTemplateContextGuard(_, ctx) {
72
+ return true;
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortalContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
75
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: NgtPortalContent, isStandalone: true, selector: "ng-template[portalContent]", ngImport: i0 }); }
80
76
  }
81
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortalContent, decorators: [{
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortalContent, decorators: [{
82
78
  type: Directive,
83
- args: [{ selector: 'ng-template[ngtPortalContent]', standalone: true }]
84
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ViewContainerRef, decorators: [{
85
- type: SkipSelf
86
- }] }]; } });
79
+ args: [{ selector: 'ng-template[portalContent]', standalone: true }]
80
+ }], ctorParameters: () => [] });
81
+ // Keys that shouldn't be copied between stores
82
+ export const privateKeys = [
83
+ 'setSize',
84
+ 'setFrameloop',
85
+ 'setDpr',
86
+ 'events',
87
+ 'setEvents',
88
+ 'invalidate',
89
+ 'advance',
90
+ 'size',
91
+ 'viewport',
92
+ ];
87
93
  export class NgtPortal {
88
- set container(container) {
89
- this.inputs.set({ container });
90
- }
91
- set portalState(state) {
92
- this.inputs.set({ state });
93
- }
94
94
  constructor() {
95
- this.inputs = signalStore({ container: injectNgtRef(prepare(new THREE.Scene())) });
96
- this.autoRender = true;
97
- this.autoRenderPriority = 1;
98
- this.beforeRender = new EventEmitter();
99
- this.parentStore = injectNgtStore({ skipSelf: true });
100
- this.parentScene = this.parentStore.get('scene');
101
- this.parentCamera = this.parentStore.get('camera');
102
- this.portalStore = injectNgtStore({ self: true });
95
+ this.container = input.required();
96
+ this.state = input({});
97
+ /**
98
+ * @decsription turn this on to enable "HUD" like rendering
99
+ */
100
+ this.autoRender = input(false);
101
+ this.autoRenderPriority = input(1);
102
+ this.portalContent = contentChild.required(NgtPortalContent, { read: TemplateRef });
103
+ this.portalAnchor = viewChild.required('anchor', { read: ViewContainerRef });
103
104
  this.injector = inject(Injector);
104
- this.zone = inject(NgZone);
105
- this.raycaster = new THREE.Raycaster();
106
- this.pointer = new THREE.Vector2();
107
- this.portalContentRendered = false;
108
- inject(DestroyRef).onDestroy(() => {
109
- if (this.portalContentView && !this.portalContentView.destroyed) {
110
- this.portalContentView.destroy();
111
- }
112
- });
113
- }
114
- ngOnInit() {
115
- const previousState = this.parentStore.get();
116
- const inputsState = this.inputs.get();
117
- if (!inputsState.state && this.autoRender) {
118
- inputsState.state = { events: { priority: this.autoRenderPriority + 1 } };
119
- }
120
- const { events, size, ...restInputsState } = inputsState.state || {};
121
- const containerState = inputsState.container;
122
- let container = is.ref(containerState) ? containerState.nativeElement : containerState;
123
- if (!is.instance(container)) {
124
- container = prepare(container);
125
- }
126
- const localState = getLocalState(container);
127
- if (!localState.store) {
128
- localState.store = this.portalStore;
129
- }
130
- this.portalStore.set({
131
- ...previousState,
132
- scene: container,
133
- raycaster: this.raycaster,
134
- pointer: this.pointer,
135
- previousRoot: this.parentStore,
136
- events: { ...previousState.events, ...(events || {}) },
137
- size: { ...previousState.size, ...(size || {}) },
138
- ...restInputsState,
139
- setEvents: (events) => this.portalStore.set((state) => ({ ...state, events: { ...state.events, ...events } })),
140
- });
105
+ this.portalStore = injectStore({ self: true });
106
+ this.parentStore = injectStore({ skipSelf: true });
107
+ this.parentScene = this.parentStore.select('scene');
108
+ this.parentCamera = this.parentStore.select('camera');
109
+ this.raycaster = new Raycaster();
110
+ this.pointer = new Vector2();
111
+ this.portalRendered = signal(false);
112
+ this.renderAutoBeforeRender = computed(() => this.portalRendered() && this.autoRender());
113
+ const autoEffect = injectAutoEffect();
141
114
  const parentState = this.parentStore.select();
142
- effect(() => {
143
- const previous = parentState();
144
- this.zone.runOutsideAngular(() => {
145
- this.portalStore.set((state) => this.inject(previous, state));
115
+ afterNextRender(() => {
116
+ const previousState = this.parentStore.snapshot;
117
+ const { events = {}, size = {}, ...rest } = this.state();
118
+ let container = this.container();
119
+ if (!is.instance(container)) {
120
+ container = prepare(container, { store: this.portalStore });
121
+ }
122
+ const localState = getLocalState(container);
123
+ if (localState && !localState.store) {
124
+ localState.store = this.portalStore;
125
+ }
126
+ this.portalStore.update({
127
+ ...previousState,
128
+ scene: container,
129
+ raycaster: this.raycaster,
130
+ pointer: this.pointer,
131
+ events: { ...previousState.events, ...events },
132
+ size: { ...previousState.size, ...size },
133
+ previousRoot: this.parentStore,
134
+ ...rest,
135
+ setEvents: (events) => this.portalStore.update((state) => ({ ...state, events: { ...state.events, ...events } })),
136
+ });
137
+ autoEffect(() => {
138
+ const state = this.state();
139
+ const _parentState = parentState();
140
+ this.portalStore.update((prev) => this.inject(_parentState, prev, state, untracked(this.container)));
141
+ untracked(() => {
142
+ if (this.portalView) {
143
+ this.portalView.detectChanges();
144
+ return;
145
+ }
146
+ this.portalView = this.portalAnchor().createEmbeddedView(this.portalContent(), { container: this.container(), injector: this.injector }, { injector: this.injector });
147
+ this.portalView.detectChanges();
148
+ this.portalRendered.set(true);
149
+ });
146
150
  });
147
- }, { injector: this.injector });
148
- requestAnimationFrame(() => {
149
- this.portalStore.set((injectState) => this.inject(this.parentStore.get(), injectState));
150
151
  });
151
- this.portalContentView = this.portalContentAnchor.createEmbeddedView(this.portalContentTemplate);
152
- safeDetectChanges(this.portalContentView);
153
- this.portalContentRendered = true;
154
- }
155
- onBeforeRender(portal) {
156
- this.beforeRender.emit({
157
- root: { ...this.parentStore.get(), delta: portal.delta, frame: portal.frame },
158
- portal,
152
+ inject(DestroyRef).onDestroy(() => {
153
+ this.portalView?.destroy();
159
154
  });
160
155
  }
161
- inject(rootState, injectState) {
162
- const intersect = { ...rootState };
163
- Object.keys(intersect).forEach((key) => {
156
+ inject(parentState, portalState, injectedState, container) {
157
+ const { events = {}, size, ...rest } = injectedState;
158
+ const intersect = { ...parentState }; // all prev state props
159
+ Object.keys(parentState).forEach((key) => {
164
160
  if (privateKeys.includes(key) ||
165
- rootState[key] !== injectState[key]) {
161
+ (parentState[key] !== portalState[key] &&
162
+ portalState[key])) {
166
163
  delete intersect[key];
167
164
  }
168
165
  });
169
- const inputs = this.inputs.get();
170
- const { size, events, ...restInputsState } = inputs.state || {};
171
166
  let viewport = undefined;
172
- if (injectState && size) {
173
- const camera = injectState.camera;
174
- viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size);
175
- if (camera !== rootState.camera)
167
+ if (portalState && size) {
168
+ const camera = portalState.camera;
169
+ // Calculate the override viewport, if present
170
+ viewport = parentState.viewport.getCurrentViewport(camera, new Vector3(), size);
171
+ // Update the portal camera, if it differs from the previous layer
172
+ if (camera !== parentState.camera) {
176
173
  updateCamera(camera, size);
174
+ }
177
175
  }
178
176
  return {
179
177
  ...intersect,
180
- scene: is.ref(inputs.container) ? inputs.container.nativeElement : inputs.container,
178
+ scene: container,
181
179
  raycaster: this.raycaster,
182
180
  pointer: this.pointer,
183
- previousRoot: this.parentStore,
184
- events: { ...rootState.events, ...(injectState?.events || {}), ...events },
185
- size: { ...rootState.size, ...size },
186
- viewport: { ...rootState.viewport, ...(viewport || {}) },
187
- ...restInputsState,
181
+ events: { ...parentState.events, ...(portalState.events || {}), ...(events || {}) },
182
+ size: { ...parentState.size, ...(size || {}) },
183
+ viewport: { ...parentState.viewport, ...(viewport || {}) },
184
+ ...rest,
188
185
  };
189
186
  }
190
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
191
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { container: "container", portalState: ["state", "portalState"], autoRender: "autoRender", autoRenderPriority: "autoRenderPriority" }, outputs: { beforeRender: "beforeRender" }, providers: [{ provide: NGT_STORE, useFactory: () => signalStore({}) }], queries: [{ propertyName: "portalContentTemplate", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "portalContentAnchor", first: true, predicate: ["portalContentAnchor"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
192
- <ng-container #portalContentAnchor>
193
- <ng-container
194
- *ngIf="autoRender && portalContentRendered"
195
- ngtPortalBeforeRender
196
- [renderPriority]="autoRenderPriority"
197
- [parentScene]="parentScene"
198
- [parentCamera]="parentCamera"
199
- (beforeRender)="onBeforeRender($event)"
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: true, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, autoRender: { classPropertyName: "autoRender", publicName: "autoRender", isSignal: true, isRequired: false, transformFunction: null }, autoRenderPriority: { classPropertyName: "autoRenderPriority", publicName: "autoRenderPriority", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideStore(() => signalStore({}))], queries: [{ propertyName: "portalContent", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "portalAnchor", first: true, predicate: ["anchor"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
189
+ <ng-container #anchor />
190
+
191
+ @if (renderAutoBeforeRender()) {
192
+ <ngt-portal-before-render
193
+ [renderPriority]="autoRenderPriority()"
194
+ [parentScene]="parentScene()"
195
+ [parentCamera]="parentCamera()"
200
196
  />
201
- </ng-container>
202
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgtPortalBeforeRender, selector: "[ngtPortalBeforeRender]", inputs: ["renderPriority", "parentScene", "parentCamera"], outputs: ["beforeRender"] }] }); }
197
+ }
198
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtPortalBeforeRender, selector: "ngt-portal-before-render", inputs: ["renderPriority", "parentScene", "parentCamera"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
203
199
  }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtPortal, decorators: [{
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtPortal, decorators: [{
205
201
  type: Component,
206
202
  args: [{
207
203
  selector: 'ngt-portal',
208
204
  standalone: true,
209
205
  template: `
210
- <ng-container #portalContentAnchor>
211
- <ng-container
212
- *ngIf="autoRender && portalContentRendered"
213
- ngtPortalBeforeRender
214
- [renderPriority]="autoRenderPriority"
215
- [parentScene]="parentScene"
216
- [parentCamera]="parentCamera"
217
- (beforeRender)="onBeforeRender($event)"
206
+ <ng-container #anchor />
207
+
208
+ @if (renderAutoBeforeRender()) {
209
+ <ngt-portal-before-render
210
+ [renderPriority]="autoRenderPriority()"
211
+ [parentScene]="parentScene()"
212
+ [parentCamera]="parentCamera()"
218
213
  />
219
- </ng-container>
214
+ }
220
215
  `,
221
- imports: [NgIf, NgtPortalBeforeRender],
222
- providers: [{ provide: NGT_STORE, useFactory: () => signalStore({}) }],
216
+ imports: [NgtPortalBeforeRender],
217
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
218
+ changeDetection: ChangeDetectionStrategy.OnPush,
219
+ providers: [provideStore(() => signalStore({}))],
223
220
  }]
224
- }], ctorParameters: function () { return []; }, propDecorators: { container: [{
225
- type: Input
226
- }], portalState: [{
227
- type: Input,
228
- args: ['state']
229
- }], autoRender: [{
230
- type: Input
231
- }], autoRenderPriority: [{
232
- type: Input
233
- }], beforeRender: [{
234
- type: Output
235
- }], portalContentTemplate: [{
236
- type: ContentChild,
237
- args: [NgtPortalContent, { read: TemplateRef, static: true }]
238
- }], portalContentAnchor: [{
239
- type: ViewChild,
240
- args: ['portalContentAnchor', { read: ViewContainerRef, static: true }]
241
- }] } });
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixNQUFNLEdBSU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFrQixjQUFjLEVBQStCLE1BQU0sU0FBUyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFOUMsTUFBTSxXQUFXLEdBQUc7SUFDbkIsS0FBSztJQUNMLEtBQUs7SUFDTCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixjQUFjO0lBQ2QsUUFBUTtJQUNSLFlBQVk7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QUMsV0FBVyxDQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsNkVBa0JsRSxnQkFBZ0IsMkJBQVUsV0FBVyxrSkFHVCxnQkFBZ0IsMkNBbENoRDs7Ozs7Ozs7Ozs7RUFXVCw0REFDUyxJQUFJLDZGQTVERixxQkFBcUI7OzJGQStEckIsU0FBUztrQkFsQnJCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7O0VBV1Q7b0JBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDO29CQUN0QyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO2lCQUNoRjswRUFJYSxTQUFTO3NCQUFyQixLQUFLO2dCQUljLFdBQVc7c0JBQTlCLEtBQUs7dUJBQUMsT0FBTztnQkFJTCxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbkUsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0Q29udGVudENoaWxkLFxuXHREZXN0cm95UmVmLFxuXHREaXJlY3RpdmUsXG5cdEV2ZW50RW1pdHRlcixcblx0SW5qZWN0b3IsXG5cdElucHV0LFxuXHROZ1pvbmUsXG5cdE91dHB1dCxcblx0U2tpcFNlbGYsXG5cdFRlbXBsYXRlUmVmLFxuXHRWaWV3Q2hpbGQsXG5cdFZpZXdDb250YWluZXJSZWYsXG5cdGVmZmVjdCxcblx0aW5qZWN0LFxuXHR0eXBlIEVsZW1lbnRSZWYsXG5cdHR5cGUgRW1iZWRkZWRWaWV3UmVmLFxuXHR0eXBlIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIgfSBmcm9tICcuL2JlZm9yZS1yZW5kZXInO1xuaW1wb3J0IHR5cGUgeyBOZ3RFdmVudE1hbmFnZXIgfSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlLCBwcmVwYXJlIH0gZnJvbSAnLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RSZWYgfSBmcm9tICcuL3JlZic7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UIH0gZnJvbSAnLi9yZW5kZXJlci9jb25zdGFudHMnO1xuaW1wb3J0IHsgTkdUX1NUT1JFLCBOZ3RSZW5kZXJTdGF0ZSwgaW5qZWN0Tmd0U3RvcmUsIHR5cGUgTmd0U2l6ZSwgdHlwZSBOZ3RTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcbmltcG9ydCB7IHNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuaW1wb3J0IHsgdXBkYXRlQ2FtZXJhIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5jb25zdCBwcml2YXRlS2V5cyA9IFtcblx0J2dldCcsXG5cdCdzZXQnLFxuXHQnc2VsZWN0Jyxcblx0J3NldFNpemUnLFxuXHQnc2V0RHByJyxcblx0J3NldEZyYW1lbG9vcCcsXG5cdCdldmVudHMnLFxuXHQnaW52YWxpZGF0ZScsXG5cdCdhZHZhbmNlJyxcblx0J3NpemUnLFxuXHQndmlld3BvcnQnLFxuXSBhcyBjb25zdDtcbnR5cGUgUHJpdmF0ZUtleXMgPSAodHlwZW9mIHByaXZhdGVLZXlzKVtudW1iZXJdO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndFBvcnRhbElucHV0cyB7XG5cdGNvbnRhaW5lcjogRWxlbWVudFJlZjxUSFJFRS5PYmplY3QzRD4gfCBUSFJFRS5PYmplY3QzRDtcblx0Y2FtZXJhOiBFbGVtZW50UmVmPFRIUkVFLkNhbWVyYT4gfCBUSFJFRS5DYW1lcmE7XG5cdHN0YXRlOiBQYXJ0aWFsPFxuXHRcdE9taXQ8Tmd0U3RhdGUsIFByaXZhdGVLZXlzPiAmIHtcblx0XHRcdGV2ZW50czogUGFydGlhbDxQaWNrPE5ndEV2ZW50TWFuYWdlcjxhbnk+LCAnZW5hYmxlZCcgfCAncHJpb3JpdHknIHwgJ2NvbXB1dGUnIHwgJ2Nvbm5lY3RlZCc+Pjtcblx0XHRcdHNpemU6IE5ndFNpemU7XG5cdFx0fVxuXHQ+O1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd0UG9ydGFsQmVmb3JlUmVuZGVyXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxCZWZvcmVSZW5kZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXHRwcml2YXRlIHBvcnRhbFN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0QElucHV0KCkgcmVuZGVyUHJpb3JpdHkgPSAxO1xuXHRASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwYXJlbnRTY2VuZSE6IFRIUkVFLlNjZW5lO1xuXHRASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwYXJlbnRDYW1lcmEhOiBUSFJFRS5DYW1lcmE7XG5cblx0QE91dHB1dCgpIGJlZm9yZVJlbmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd0UmVuZGVyU3RhdGU+KCk7XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0bGV0IG9sZENsZWFyOiBib29sZWFuO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcihcblx0XHRcdCh7IGRlbHRhLCBmcmFtZSB9KSA9PiB7XG5cdFx0XHRcdHRoaXMuYmVmb3JlUmVuZGVyLmVtaXQoeyAuLi50aGlzLnBvcnRhbFN0b3JlLmdldCgpLCBkZWx0YSwgZnJhbWUgfSk7XG5cdFx0XHRcdGNvbnN0IHsgZ2wsIHNjZW5lLCBjYW1lcmEgfSA9IHRoaXMucG9ydGFsU3RvcmUuZ2V0KCk7XG5cdFx0XHRcdG9sZENsZWFyID0gZ2wuYXV0b0NsZWFyO1xuXHRcdFx0XHRpZiAodGhpcy5yZW5kZXJQcmlvcml0eSA9PT0gMSkge1xuXHRcdFx0XHRcdC8vIGNsZWFyIHNjZW5lIGFuZCByZW5kZXIgd2l0aCBkZWZhdWx0XG5cdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gdHJ1ZTtcblx0XHRcdFx0XHRnbC5yZW5kZXIodGhpcy5wYXJlbnRTY2VuZSwgdGhpcy5wYXJlbnRDYW1lcmEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGRpc2FibGUgY2xlYW5pbmdcblx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gZmFsc2U7XG5cdFx0XHRcdGdsLmNsZWFyRGVwdGgoKTtcblx0XHRcdFx0Z2wucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuXHRcdFx0XHQvLyByZXN0b3JlXG5cdFx0XHRcdGdsLmF1dG9DbGVhciA9IG9sZENsZWFyO1xuXHRcdFx0fSxcblx0XHRcdHsgcHJpb3JpdHk6IHRoaXMucmVuZGVyUHJpb3JpdHksIGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG5cdFx0KTtcblx0fVxufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtuZ3RQb3J0YWxDb250ZW50XScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxDb250ZW50IHtcblx0Y29uc3RydWN0b3IodmNyOiBWaWV3Q29udGFpbmVyUmVmLCBAU2tpcFNlbGYoKSBwYXJlbnRWY3I6IFZpZXdDb250YWluZXJSZWYpIHtcblx0XHRjb25zdCBjb21tZW50Tm9kZSA9IHZjci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKGNvbW1lbnROb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdKSB7XG5cdFx0XHRjb21tZW50Tm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXShwYXJlbnRWY3IuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblx0XHRcdGRlbGV0ZSBjb21tZW50Tm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXTtcblx0XHR9XG5cdH1cbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0LXBvcnRhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRhaW5lciAjcG9ydGFsQ29udGVudEFuY2hvcj5cblx0XHRcdDxuZy1jb250YWluZXJcblx0XHRcdFx0Km5nSWY9XCJhdXRvUmVuZGVyICYmIHBvcnRhbENvbnRlbnRSZW5kZXJlZFwiXG5cdFx0XHRcdG5ndFBvcnRhbEJlZm9yZVJlbmRlclxuXHRcdFx0XHRbcmVuZGVyUHJpb3JpdHldPVwiYXV0b1JlbmRlclByaW9yaXR5XCJcblx0XHRcdFx0W3BhcmVudFNjZW5lXT1cInBhcmVudFNjZW5lXCJcblx0XHRcdFx0W3BhcmVudENhbWVyYV09XCJwYXJlbnRDYW1lcmFcIlxuXHRcdFx0XHQoYmVmb3JlUmVuZGVyKT1cIm9uQmVmb3JlUmVuZGVyKCRldmVudClcIlxuXHRcdFx0Lz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0YCxcblx0aW1wb3J0czogW05nSWYsIE5ndFBvcnRhbEJlZm9yZVJlbmRlcl0sXG5cdHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdUX1NUT1JFLCB1c2VGYWN0b3J5OiAoKSA9PiBzaWduYWxTdG9yZTxOZ3RTdGF0ZT4oe30pIH1dLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWwgaW1wbGVtZW50cyBPbkluaXQge1xuXHRwcml2YXRlIGlucHV0cyA9IHNpZ25hbFN0b3JlPE5ndFBvcnRhbElucHV0cz4oeyBjb250YWluZXI6IGluamVjdE5ndFJlZjxUSFJFRS5TY2VuZT4ocHJlcGFyZShuZXcgVEhSRUUuU2NlbmUoKSkpIH0pO1xuXG5cdEBJbnB1dCgpIHNldCBjb250YWluZXIoY29udGFpbmVyOiBOZ3RQb3J0YWxJbnB1dHNbJ2NvbnRhaW5lciddKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgY29udGFpbmVyIH0pO1xuXHR9XG5cblx0QElucHV0KCdzdGF0ZScpIHNldCBwb3J0YWxTdGF0ZShzdGF0ZTogTmd0UG9ydGFsSW5wdXRzWydzdGF0ZSddKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgc3RhdGUgfSk7XG5cdH1cblxuXHRASW5wdXQoKSBhdXRvUmVuZGVyID0gdHJ1ZTtcblx0QElucHV0KCkgYXV0b1JlbmRlclByaW9yaXR5ID0gMTtcblxuXHRAT3V0cHV0KCkgYmVmb3JlUmVuZGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJvb3Q6IE5ndFJlbmRlclN0YXRlOyBwb3J0YWw6IE5ndFJlbmRlclN0YXRlIH0+KCk7XG5cblx0QENvbnRlbnRDaGlsZChOZ3RQb3J0YWxDb250ZW50LCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcblx0cG9ydGFsQ29udGVudFRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cblx0QFZpZXdDaGlsZCgncG9ydGFsQ29udGVudEFuY2hvcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG5cdHBvcnRhbENvbnRlbnRBbmNob3IhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG5cdHByaXZhdGUgcGFyZW50U3RvcmUgPSBpbmplY3ROZ3RTdG9yZSh7IHNraXBTZWxmOiB0cnVlIH0pO1xuXHRwYXJlbnRTY2VuZSA9IHRoaXMucGFyZW50U3RvcmUuZ2V0KCdzY2VuZScpO1xuXHRwYXJlbnRDYW1lcmEgPSB0aGlzLnBhcmVudFN0b3JlLmdldCgnY2FtZXJhJyk7XG5cblx0cHJpdmF0ZSBwb3J0YWxTdG9yZSA9IGluamVjdE5ndFN0b3JlKHsgc2VsZjogdHJ1ZSB9KTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cdHByaXZhdGUgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG5cdHByaXZhdGUgcmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpO1xuXHRwcml2YXRlIHBvaW50ZXIgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xuXG5cdHBvcnRhbENvbnRlbnRSZW5kZXJlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHBvcnRhbENvbnRlbnRWaWV3PzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMucG9ydGFsQ29udGVudFZpZXcgJiYgIXRoaXMucG9ydGFsQ29udGVudFZpZXcuZGVzdHJveWVkKSB7XG5cdFx0XHRcdHRoaXMucG9ydGFsQ29udGVudFZpZXcuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNTdGF0ZSA9IHRoaXMucGFyZW50U3RvcmUuZ2V0KCk7XG5cdFx0Y29uc3QgaW5wdXRzU3RhdGUgPSB0aGlzLmlucHV0cy5nZXQoKTtcblxuXHRcdGlmICghaW5wdXRzU3RhdGUuc3RhdGUgJiYgdGhpcy5hdXRvUmVuZGVyKSB7XG5cdFx0XHRpbnB1dHNTdGF0ZS5zdGF0ZSA9IHsgZXZlbnRzOiB7IHByaW9yaXR5OiB0aGlzLmF1dG9SZW5kZXJQcmlvcml0eSArIDEgfSB9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgZXZlbnRzLCBzaXplLCAuLi5yZXN0SW5wdXRzU3RhdGUgfSA9IGlucHV0c1N0YXRlLnN0YXRlIHx8IHt9O1xuXG5cdFx0Y29uc3QgY29udGFpbmVyU3RhdGUgPSBpbnB1dHNTdGF0ZS5jb250YWluZXI7XG5cdFx0bGV0IGNvbnRhaW5lciA9IGlzLnJlZihjb250YWluZXJTdGF0ZSkgPyBjb250YWluZXJTdGF0ZS5uYXRpdmVFbGVtZW50IDogY29udGFpbmVyU3RhdGU7XG5cblx0XHRpZiAoIWlzLmluc3RhbmNlKGNvbnRhaW5lcikpIHtcblx0XHRcdGNvbnRhaW5lciA9IHByZXBhcmUoY29udGFpbmVyKTtcblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShjb250YWluZXIpO1xuXHRcdGlmICghbG9jYWxTdGF0ZS5zdG9yZSkge1xuXHRcdFx0bG9jYWxTdGF0ZS5zdG9yZSA9IHRoaXMucG9ydGFsU3RvcmU7XG5cdFx0fVxuXG5cdFx0dGhpcy5wb3J0YWxTdG9yZS5zZXQoe1xuXHRcdFx0Li4ucHJldmlvdXNTdGF0ZSxcblx0XHRcdHNjZW5lOiBjb250YWluZXIgYXMgVEhSRUUuU2NlbmUsXG5cdFx0XHRyYXljYXN0ZXI6IHRoaXMucmF5Y2FzdGVyLFxuXHRcdFx0cG9pbnRlcjogdGhpcy5wb2ludGVyLFxuXHRcdFx0cHJldmlvdXNSb290OiB0aGlzLnBhcmVudFN0b3JlLFxuXHRcdFx0ZXZlbnRzOiB7IC4uLnByZXZpb3VzU3RhdGUuZXZlbnRzLCAuLi4oZXZlbnRzIHx8IHt9KSB9LFxuXHRcdFx0c2l6ZTogeyAuLi5wcmV2aW91c1N0YXRlLnNpemUsIC4uLihzaXplIHx8IHt9KSB9LFxuXHRcdFx0Li4ucmVzdElucHV0c1N0YXRlLFxuXHRcdFx0c2V0RXZlbnRzOiAoZXZlbnRzKSA9PlxuXHRcdFx0XHR0aGlzLnBvcnRhbFN0b3JlLnNldCgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBldmVudHM6IHsgLi4uc3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSB9KSksXG5cdFx0fSk7XG5cblx0XHRjb25zdCBwYXJlbnRTdGF0ZSA9IHRoaXMucGFyZW50U3RvcmUuc2VsZWN0KCk7XG5cdFx0ZWZmZWN0KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcmV2aW91cyA9IHBhcmVudFN0YXRlKCk7XG5cdFx0XHRcdHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wb3J0YWxTdG9yZS5zZXQoKHN0YXRlKSA9PiB0aGlzLmluamVjdChwcmV2aW91cywgc3RhdGUpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0eyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0dGhpcy5wb3J0YWxTdG9yZS5zZXQoKGluamVjdFN0YXRlKSA9PiB0aGlzLmluamVjdCh0aGlzLnBhcmVudFN0b3JlLmdldCgpLCBpbmplY3RTdGF0ZSkpO1xuXHRcdH0pO1xuXHRcdHRoaXMucG9ydGFsQ29udGVudFZpZXcgPSB0aGlzLnBvcnRhbENvbnRlbnRBbmNob3IuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMucG9ydGFsQ29udGVudFRlbXBsYXRlKTtcblx0XHRzYWZlRGV0ZWN0Q2hhbmdlcyh0aGlzLnBvcnRhbENvbnRlbnRWaWV3KTtcblx0XHR0aGlzLnBvcnRhbENvbnRlbnRSZW5kZXJlZCA9IHRydWU7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcihwb3J0YWw6IE5ndFJlbmRlclN0YXRlKSB7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIuZW1pdCh7XG5cdFx0XHRyb290OiB7IC4uLnRoaXMucGFyZW50U3RvcmUuZ2V0KCksIGRlbHRhOiBwb3J0YWwuZGVsdGEsIGZyYW1lOiBwb3J0YWwuZnJhbWUgfSxcblx0XHRcdHBvcnRhbCxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgaW5qZWN0KHJvb3RTdGF0ZTogTmd0U3RhdGUsIGluamVjdFN0YXRlOiBOZ3RTdGF0ZSkge1xuXHRcdGNvbnN0IGludGVyc2VjdDogUGFydGlhbDxOZ3RTdGF0ZT4gPSB7IC4uLnJvb3RTdGF0ZSB9O1xuXG5cdFx0T2JqZWN0LmtleXMoaW50ZXJzZWN0KS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0cHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5IGFzIFByaXZhdGVLZXlzKSB8fFxuXHRcdFx0XHRyb290U3RhdGVba2V5IGFzIGtleW9mIE5ndFN0YXRlXSAhPT0gaW5qZWN0U3RhdGVba2V5IGFzIGtleW9mIE5ndFN0YXRlXVxuXHRcdFx0KSB7XG5cdFx0XHRcdGRlbGV0ZSBpbnRlcnNlY3Rba2V5IGFzIGtleW9mIE5ndFN0YXRlXTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGNvbnN0IGlucHV0cyA9IHRoaXMuaW5wdXRzLmdldCgpO1xuXHRcdGNvbnN0IHsgc2l6ZSwgZXZlbnRzLCAuLi5yZXN0SW5wdXRzU3RhdGUgfSA9IGlucHV0cy5zdGF0ZSB8fCB7fTtcblxuXHRcdGxldCB2aWV3cG9ydCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoaW5qZWN0U3RhdGUgJiYgc2l6ZSkge1xuXHRcdFx0Y29uc3QgY2FtZXJhID0gaW5qZWN0U3RhdGUuY2FtZXJhO1xuXHRcdFx0dmlld3BvcnQgPSByb290U3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSwgbmV3IFRIUkVFLlZlY3RvcjMoKSwgc2l6ZSk7XG5cdFx0XHRpZiAoY2FtZXJhICE9PSByb290U3RhdGUuY2FtZXJhKSB1cGRhdGVDYW1lcmEoY2FtZXJhLCBzaXplKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uaW50ZXJzZWN0LFxuXHRcdFx0c2NlbmU6IGlzLnJlZihpbnB1dHMuY29udGFpbmVyKSA/IGlucHV0cy5jb250YWluZXIubmF0aXZlRWxlbWVudCA6IGlucHV0cy5jb250YWluZXIsXG5cdFx0XHRyYXljYXN0ZXI6IHRoaXMucmF5Y2FzdGVyLFxuXHRcdFx0cG9pbnRlcjogdGhpcy5wb2ludGVyLFxuXHRcdFx0cHJldmlvdXNSb290OiB0aGlzLnBhcmVudFN0b3JlLFxuXHRcdFx0ZXZlbnRzOiB7IC4uLnJvb3RTdGF0ZS5ldmVudHMsIC4uLihpbmplY3RTdGF0ZT8uZXZlbnRzIHx8IHt9KSwgLi4uZXZlbnRzIH0sXG5cdFx0XHRzaXplOiB7IC4uLnJvb3RTdGF0ZS5zaXplLCAuLi5zaXplIH0sXG5cdFx0XHR2aWV3cG9ydDogeyAuLi5yb290U3RhdGUudmlld3BvcnQsIC4uLih2aWV3cG9ydCB8fCB7fSkgfSxcblx0XHRcdC4uLnJlc3RJbnB1dHNTdGF0ZSxcblx0XHR9IGFzIE5ndFN0YXRlO1xuXHR9XG59XG4iXX0=
221
+ }], ctorParameters: () => [] });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsU0FBUyxFQUVULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFvQixTQUFTLEVBQVMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBVzlDLE1BQU0sT0FBTyxxQkFBcUI7SUFPakM7UUFOUSxnQkFBVyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBRXBDLG1CQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBUyxDQUFDO1FBQ3RDLGlCQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO1FBR3ZDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvQixjQUFjO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkMsSUFBSSxRQUFpQixDQUFDO1lBQ3RCLE9BQU8sa0JBQWtCLENBQ3hCLEdBQUcsRUFBRTtnQkFDSixNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztnQkFDeEQsUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNqQyxzQ0FBc0M7b0JBQ3RDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUNwQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCxtQkFBbUI7Z0JBQ25CLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QixVQUFVO2dCQUNWLEVBQUUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELGFBQWE7UUFDWixVQUFVO0lBQ1gsQ0FBQzs4R0FyQ1cscUJBQXFCO2tHQUFyQixxQkFBcUIsd2dCQU52Qjs7O0VBR1Q7OzJGQUdXLHFCQUFxQjtrQkFUakMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7RUFHVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDakM7O0FBMENELE1BQU0sT0FBTyxnQkFBZ0I7SUFDNUI7UUFDQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFaEYsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUMxQyxJQUFJLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUM7WUFDL0MsV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFFRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBbUIsRUFBRSxHQUFZO1FBQzlELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQzs4R0FkVyxnQkFBZ0I7a0dBQWhCLGdCQUFnQjs7MkZBQWhCLGdCQUFnQjtrQkFENUIsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSw0QkFBNEIsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOztBQWlCdkUsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUMxQixTQUFTO0lBQ1QsY0FBYztJQUNkLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFlBQVk7SUFDWixTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7Q0FDRCxDQUFDO0FBbUNYLE1BQU0sT0FBTyxTQUFTO0lBMkJyQjtRQTFCQSxjQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBWSxDQUFDO1FBQ3ZDLFVBQUssR0FBRyxLQUFLLENBQTJCLEVBQUUsQ0FBQyxDQUFDO1FBRTVDOztXQUVHO1FBQ0gsZUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQix1QkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEIsa0JBQWEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDL0UsaUJBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFFeEUsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixnQkFBVyxHQUFHLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLGdCQUFXLEdBQUcsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUMsZ0JBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxpQkFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELGNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLG1CQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdCLDJCQUFzQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFLN0YsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUV0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRTlDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFFaEQsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3JDLENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDdkIsR0FBRyxhQUFhO2dCQUNoQixLQUFLLEVBQUUsU0FBa0I7Z0JBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixNQUFNLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUU7Z0JBQzlDLElBQUksRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtnQkFDeEMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM5QixHQUFHLElBQUk7Z0JBQ1AsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDM0YsQ0FBQyxDQUFDO1lBRUgsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sWUFBWSxHQUFHLFdBQVcsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckcsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDaEMsT0FBTztvQkFDUixDQUFDO29CQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLGtCQUFrQixDQUN2RCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUN4RCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzNCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUNiLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLGFBQXVDLEVBQ3ZDLFNBQW1CO1FBRW5CLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBc0IsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1FBRWhGLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEMsSUFDQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQTJCLENBQUM7Z0JBQ2pELENBQUMsV0FBVyxDQUFDLEdBQXFCLENBQUMsS0FBSyxXQUFXLENBQUMsR0FBcUIsQ0FBQztvQkFDekUsV0FBVyxDQUFDLEdBQXFCLENBQUMsQ0FBQyxFQUNuQyxDQUFDO2dCQUNGLE9BQU8sU0FBUyxDQUFDLEdBQXFCLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNsQyw4Q0FBOEM7WUFDOUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsa0VBQWtFO1lBQ2xFLElBQUksTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0YsQ0FBQztRQUVELE9BQU87WUFDTixHQUFHLFNBQVM7WUFDWixLQUFLLEVBQUUsU0FBa0I7WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRTtZQUNuRixJQUFJLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRTtZQUM5QyxRQUFRLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUMxRCxHQUFHLElBQUk7U0FDUCxDQUFDO0lBQ0gsQ0FBQzs4R0E5SFcsU0FBUztrR0FBVCxTQUFTLHNtQkFGVixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxxRUFZRixnQkFBZ0IsMkJBQVUsV0FBVyxnSUFDdkIsZ0JBQWdCLDZDQTNCbEU7Ozs7Ozs7Ozs7RUFVVCw0REFqR1cscUJBQXFCOzsyRkF1R3JCLFNBQVM7a0JBbkJyQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO29CQUN0QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7O0VBVVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ2hDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdGNvbnRlbnRDaGlsZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGVzdHJveVJlZixcblx0RGlyZWN0aXZlLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdGluamVjdCxcblx0SW5qZWN0b3IsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdFRlbXBsYXRlUmVmLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcblx0Vmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBDYW1lcmEsIE9iamVjdDNELCBSYXljYXN0ZXIsIFNjZW5lLCBWZWN0b3IyLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHsgU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVCB9IGZyb20gJy4vcmVuZGVyZXIvY29uc3RhbnRzJztcbmltcG9ydCB7IGluamVjdFN0b3JlLCBwcm92aWRlU3RvcmUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7IE5ndENvbXB1dGVGdW5jdGlvbiwgTmd0U2l6ZSwgTmd0U3RhdGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciB9IGZyb20gJy4vdXRpbHMvYmVmb3JlLXJlbmRlcic7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgc2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyB1cGRhdGVDYW1lcmEgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndC1wb3J0YWwtYmVmb3JlLXJlbmRlcicsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PCEtLSBXaXRob3V0IGFuIGVsZW1lbnQgdGhhdCByZWNlaXZlcyBwb2ludGVyIGV2ZW50cyBzdGF0ZS5wb2ludGVyIHdpbGwgYWx3YXlzIGJlIDAvMCAtLT5cblx0XHQ8bmd0LWdyb3VwIChwb2ludGVyb3Zlcik9XCJvblBvaW50ZXJPdmVyKClcIiBhdHRhY2g9XCJub25lXCIgLz5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxCZWZvcmVSZW5kZXIge1xuXHRwcml2YXRlIHBvcnRhbFN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblxuXHRyZW5kZXJQcmlvcml0eSA9IGlucHV0KDEpO1xuXHRwYXJlbnRTY2VuZSA9IGlucHV0LnJlcXVpcmVkPFNjZW5lPigpO1xuXHRwYXJlbnRDYW1lcmEgPSBpbnB1dC5yZXF1aXJlZDxDYW1lcmE+KCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0aW5qZWN0QXV0b0VmZmVjdCgpKChpbmplY3RvcikgPT4ge1xuXHRcdFx0Ly8gdHJhY2sgc3RhdGVcblx0XHRcdHRoaXMucG9ydGFsU3RvcmUuc3RhdGUoKTtcblx0XHRcdGNvbnN0IHByaW9yaXR5ID0gdGhpcy5yZW5kZXJQcmlvcml0eSgpO1xuXG5cdFx0XHRsZXQgb2xkQ2xlYXI6IGJvb2xlYW47XG5cdFx0XHRyZXR1cm4gaW5qZWN0QmVmb3JlUmVuZGVyKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyBnbCwgc2NlbmUsIGNhbWVyYSB9ID0gdGhpcy5wb3J0YWxTdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRvbGRDbGVhciA9IGdsLmF1dG9DbGVhcjtcblx0XHRcdFx0XHRpZiAodGhpcy5yZW5kZXJQcmlvcml0eSgpID09PSAxKSB7XG5cdFx0XHRcdFx0XHQvLyBjbGVhciBzY2VuZSBhbmQgcmVuZGVyIHdpdGggZGVmYXVsdFxuXHRcdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGdsLnJlbmRlcih0aGlzLnBhcmVudFNjZW5lKCksIHRoaXMucGFyZW50Q2FtZXJhKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBkaXNhYmxlIGNsZWFuaW5nXG5cdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gZmFsc2U7XG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCgpO1xuXHRcdFx0XHRcdGdsLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcblx0XHRcdFx0XHQvLyByZXN0b3JlXG5cdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gb2xkQ2xlYXI7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgcHJpb3JpdHksIGluamVjdG9yIH0sXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25Qb2ludGVyT3ZlcigpIHtcblx0XHQvKiBub29wICovXG5cdH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbcG9ydGFsQ29udGVudF0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgTmd0UG9ydGFsQ29udGVudCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IHsgZWxlbWVudDogY29tbWVudCB9ID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXHRcdGNvbnN0IHsgZWxlbWVudDogcGFyZW50Q29tbWVudCB9ID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cblx0XHRjb25zdCBjb21tZW50Tm9kZSA9IGNvbW1lbnQubmF0aXZlRWxlbWVudDtcblx0XHRpZiAoY29tbWVudE5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF0pIHtcblx0XHRcdGNvbW1lbnROb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdKHBhcmVudENvbW1lbnQubmF0aXZlRWxlbWVudCk7XG5cdFx0XHRkZWxldGUgY29tbWVudE5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF07XG5cdFx0fVxuXHR9XG5cblx0c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoXzogTmd0UG9ydGFsQ29udGVudCwgY3R4OiB1bmtub3duKTogY3R4IGlzIHsgY29udGFpbmVyOiBPYmplY3QzRDsgaW5qZWN0b3I6IEluamVjdG9yIH0ge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG4vLyBLZXlzIHRoYXQgc2hvdWxkbid0IGJlIGNvcGllZCBiZXR3ZWVuIHN0b3Jlc1xuZXhwb3J0IGNvbnN0IHByaXZhdGVLZXlzID0gW1xuXHQnc2V0U2l6ZScsXG5cdCdzZXRGcmFtZWxvb3AnLFxuXHQnc2V0RHByJyxcblx0J2V2ZW50cycsXG5cdCdzZXRFdmVudHMnLFxuXHQnaW52YWxpZGF0ZScsXG5cdCdhZHZhbmNlJyxcblx0J3NpemUnLFxuXHQndmlld3BvcnQnLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTmd0UG9ydGFsUHJpdmF0ZUtleXMgPSAodHlwZW9mIHByaXZhdGVLZXlzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBOZ3RQb3J0YWxJbmplY3RhYmxlU3RhdGUgPSBQYXJ0aWFsPFxuXHRPbWl0PE5ndFN0YXRlLCBOZ3RQb3J0YWxQcml2YXRlS2V5cz4gJiB7XG5cdFx0ZXZlbnRzPzoge1xuXHRcdFx0ZW5hYmxlZD86IGJvb2xlYW47XG5cdFx0XHRwcmlvcml0eT86IG51bWJlcjtcblx0XHRcdGNvbXB1dGU/OiBOZ3RDb21wdXRlRnVuY3Rpb247XG5cdFx0XHRjb25uZWN0ZWQ/OiBhbnk7XG5cdFx0fTtcblx0XHRzaXplPzogTmd0U2l6ZTtcblx0fVxuPjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0LXBvcnRhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRhaW5lciAjYW5jaG9yIC8+XG5cblx0XHRAaWYgKHJlbmRlckF1dG9CZWZvcmVSZW5kZXIoKSkge1xuXHRcdFx0PG5ndC1wb3J0YWwtYmVmb3JlLXJlbmRlclxuXHRcdFx0XHRbcmVuZGVyUHJpb3JpdHldPVwiYXV0b1JlbmRlclByaW9yaXR5KClcIlxuXHRcdFx0XHRbcGFyZW50U2NlbmVdPVwicGFyZW50U2NlbmUoKVwiXG5cdFx0XHRcdFtwYXJlbnRDYW1lcmFdPVwicGFyZW50Q2FtZXJhKClcIlxuXHRcdFx0Lz5cblx0XHR9XG5cdGAsXG5cdGltcG9ydHM6IFtOZ3RQb3J0YWxCZWZvcmVSZW5kZXJdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlU3RvcmUoKCkgPT4gc2lnbmFsU3RvcmUoe30pKV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndFBvcnRhbCB7XG5cdGNvbnRhaW5lciA9IGlucHV0LnJlcXVpcmVkPE9iamVjdDNEPigpO1xuXHRzdGF0ZSA9IGlucHV0PE5ndFBvcnRhbEluamVjdGFibGVTdGF0ZT4oe30pO1xuXG5cdC8qKlxuXHQgKiBAZGVjc3JpcHRpb24gdHVybiB0aGlzIG9uIHRvIGVuYWJsZSBcIkhVRFwiIGxpa2UgcmVuZGVyaW5nXG5cdCAqL1xuXHRhdXRvUmVuZGVyID0gaW5wdXQoZmFsc2UpO1xuXHRhdXRvUmVuZGVyUHJpb3JpdHkgPSBpbnB1dCgxKTtcblxuXHRwcml2YXRlIHBvcnRhbENvbnRlbnQgPSBjb250ZW50Q2hpbGQucmVxdWlyZWQoTmd0UG9ydGFsQ29udGVudCwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KTtcblx0cHJpdmF0ZSBwb3J0YWxBbmNob3IgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ2FuY2hvcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KTtcblxuXHRwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblx0cHJpdmF0ZSBwb3J0YWxTdG9yZSA9IGluamVjdFN0b3JlKHsgc2VsZjogdHJ1ZSB9KTtcblx0cHJpdmF0ZSBwYXJlbnRTdG9yZSA9IGluamVjdFN0b3JlKHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cdHByb3RlY3RlZCBwYXJlbnRTY2VuZSA9IHRoaXMucGFyZW50U3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcm90ZWN0ZWQgcGFyZW50Q2FtZXJhID0gdGhpcy5wYXJlbnRTdG9yZS5zZWxlY3QoJ2NhbWVyYScpO1xuXG5cdHByaXZhdGUgcmF5Y2FzdGVyID0gbmV3IFJheWNhc3RlcigpO1xuXHRwcml2YXRlIHBvaW50ZXIgPSBuZXcgVmVjdG9yMigpO1xuXHRwcml2YXRlIHBvcnRhbFJlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuXHRwcm90ZWN0ZWQgcmVuZGVyQXV0b0JlZm9yZVJlbmRlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMucG9ydGFsUmVuZGVyZWQoKSAmJiB0aGlzLmF1dG9SZW5kZXIoKSk7XG5cblx0cHJpdmF0ZSBwb3J0YWxWaWV3PzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cblx0XHRjb25zdCBwYXJlbnRTdGF0ZSA9IHRoaXMucGFyZW50U3RvcmUuc2VsZWN0KCk7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJldmlvdXNTdGF0ZSA9IHRoaXMucGFyZW50U3RvcmUuc25hcHNob3Q7XG5cblx0XHRcdGNvbnN0IHsgZXZlbnRzID0ge30sIHNpemUgPSB7fSwgLi4ucmVzdCB9ID0gdGhpcy5zdGF0ZSgpO1xuXHRcdFx0bGV0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyKCk7XG5cblx0XHRcdGlmICghaXMuaW5zdGFuY2UoY29udGFpbmVyKSkge1xuXHRcdFx0XHRjb250YWluZXIgPSBwcmVwYXJlKGNvbnRhaW5lciwgeyBzdG9yZTogdGhpcy5wb3J0YWxTdG9yZSB9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoY29udGFpbmVyKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlICYmICFsb2NhbFN0YXRlLnN0b3JlKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuc3RvcmUgPSB0aGlzLnBvcnRhbFN0b3JlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnBvcnRhbFN0b3JlLnVwZGF0ZSh7XG5cdFx0XHRcdC4uLnByZXZpb3VzU3RhdGUsXG5cdFx0XHRcdHNjZW5lOiBjb250YWluZXIgYXMgU2NlbmUsXG5cdFx0XHRcdHJheWNhc3RlcjogdGhpcy5yYXljYXN0ZXIsXG5cdFx0XHRcdHBvaW50ZXI6IHRoaXMucG9pbnRlcixcblx0XHRcdFx0ZXZlbnRzOiB7IC4uLnByZXZpb3VzU3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSxcblx0XHRcdFx0c2l6ZTogeyAuLi5wcmV2aW91c1N0YXRlLnNpemUsIC4uLnNpemUgfSxcblx0XHRcdFx0cHJldmlvdXNSb290OiB0aGlzLnBhcmVudFN0b3JlLFxuXHRcdFx0XHQuLi5yZXN0LFxuXHRcdFx0XHRzZXRFdmVudHM6IChldmVudHMpID0+XG5cdFx0XHRcdFx0dGhpcy5wb3J0YWxTdG9yZS51cGRhdGUoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpLFxuXHRcdFx0fSk7XG5cblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcblx0XHRcdFx0Y29uc3QgX3BhcmVudFN0YXRlID0gcGFyZW50U3RhdGUoKTtcblx0XHRcdFx0dGhpcy5wb3J0YWxTdG9yZS51cGRhdGUoKHByZXYpID0+IHRoaXMuaW5qZWN0KF9wYXJlbnRTdGF0ZSwgcHJldiwgc3RhdGUsIHVudHJhY2tlZCh0aGlzLmNvbnRhaW5lcikpKTtcblx0XHRcdFx0dW50cmFja2VkKCgpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpcy5wb3J0YWxWaWV3KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnBvcnRhbFZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMucG9ydGFsVmlldyA9IHRoaXMucG9ydGFsQW5jaG9yKCkuY3JlYXRlRW1iZWRkZWRWaWV3KFxuXHRcdFx0XHRcdFx0dGhpcy5wb3J0YWxDb250ZW50KCksXG5cdFx0XHRcdFx0XHR7IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIoKSwgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHRcdFx0XHRcdHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoaXMucG9ydGFsVmlldy5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0dGhpcy5wb3J0YWxSZW5kZXJlZC5zZXQodHJ1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMucG9ydGFsVmlldz8uZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBpbmplY3QoXG5cdFx0cGFyZW50U3RhdGU6IE5ndFN0YXRlLFxuXHRcdHBvcnRhbFN0YXRlOiBOZ3RTdGF0ZSxcblx0XHRpbmplY3RlZFN0YXRlOiBOZ3RQb3J0YWxJbmplY3RhYmxlU3RhdGUsXG5cdFx0Y29udGFpbmVyOiBPYmplY3QzRCxcblx0KSB7XG5cdFx0Y29uc3QgeyBldmVudHMgPSB7fSwgc2l6ZSwgLi4ucmVzdCB9ID0gaW5qZWN0ZWRTdGF0ZTtcblx0XHRjb25zdCBpbnRlcnNlY3Q6IFBhcnRpYWw8Tmd0U3RhdGU+ID0geyAuLi5wYXJlbnRTdGF0ZSB9OyAvLyBhbGwgcHJldiBzdGF0ZSBwcm9wc1xuXG5cdFx0T2JqZWN0LmtleXMocGFyZW50U3RhdGUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkgYXMgTmd0UG9ydGFsUHJpdmF0ZUtleXMpIHx8XG5cdFx0XHRcdChwYXJlbnRTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdICE9PSBwb3J0YWxTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdICYmXG5cdFx0XHRcdFx0cG9ydGFsU3RhdGVba2V5IGFzIGtleW9mIE5ndFN0YXRlXSlcblx0XHRcdCkge1xuXHRcdFx0XHRkZWxldGUgaW50ZXJzZWN0W2tleSBhcyBrZXlvZiBOZ3RTdGF0ZV07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRsZXQgdmlld3BvcnQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKHBvcnRhbFN0YXRlICYmIHNpemUpIHtcblx0XHRcdGNvbnN0IGNhbWVyYSA9IHBvcnRhbFN0YXRlLmNhbWVyYTtcblx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgb3ZlcnJpZGUgdmlld3BvcnQsIGlmIHByZXNlbnRcblx0XHRcdHZpZXdwb3J0ID0gcGFyZW50U3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSwgbmV3IFZlY3RvcjMoKSwgc2l6ZSk7XG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcnRhbCBjYW1lcmEsIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgbGF5ZXJcblx0XHRcdGlmIChjYW1lcmEgIT09IHBhcmVudFN0YXRlLmNhbWVyYSkge1xuXHRcdFx0XHR1cGRhdGVDYW1lcmEoY2FtZXJhLCBzaXplKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uaW50ZXJzZWN0LFxuXHRcdFx0c2NlbmU6IGNvbnRhaW5lciBhcyBTY2VuZSxcblx0XHRcdHJheWNhc3RlcjogdGhpcy5yYXljYXN0ZXIsXG5cdFx0XHRwb2ludGVyOiB0aGlzLnBvaW50ZXIsXG5cdFx0XHRldmVudHM6IHsgLi4ucGFyZW50U3RhdGUuZXZlbnRzLCAuLi4ocG9ydGFsU3RhdGUuZXZlbnRzIHx8IHt9KSwgLi4uKGV2ZW50cyB8fCB7fSkgfSxcblx0XHRcdHNpemU6IHsgLi4ucGFyZW50U3RhdGUuc2l6ZSwgLi4uKHNpemUgfHwge30pIH0sXG5cdFx0XHR2aWV3cG9ydDogeyAuLi5wYXJlbnRTdGF0ZS52aWV3cG9ydCwgLi4uKHZpZXdwb3J0IHx8IHt9KSB9LFxuXHRcdFx0Li4ucmVzdCxcblx0XHR9O1xuXHR9XG59XG4iXX0=
@@ -1,7 +1,7 @@
1
- import { createInjectionToken } from '../utils/create-injection-token';
1
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
2
2
  const catalogue = {};
3
3
  export function extend(objects) {
4
4
  Object.assign(catalogue, objects);
5
5
  }
6
- export const [injectNgtCatalogue] = createInjectionToken(() => catalogue);
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZ3VlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY2F0YWxvZ3VlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXZFLE1BQU0sU0FBUyxHQUFzQyxFQUFFLENBQUM7QUFFeEQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFlO0lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuXG5leHBvcnQgdHlwZSBOZ3RBbnlDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuY29uc3QgY2F0YWxvZ3VlOiBSZWNvcmQ8c3RyaW5nLCBOZ3RBbnlDb25zdHJ1Y3Rvcj4gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChvYmplY3RzOiBvYmplY3QpOiB2b2lkIHtcblx0T2JqZWN0LmFzc2lnbihjYXRhbG9ndWUsIG9iamVjdHMpO1xufVxuXG5leHBvcnQgY29uc3QgW2luamVjdE5ndENhdGFsb2d1ZV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbigoKSA9PiBjYXRhbG9ndWUpO1xuIl19
6
+ export const [injectCatalogue] = createInjectionToken(() => catalogue);
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZ3VlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY2F0YWxvZ3VlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSXpFLE1BQU0sU0FBUyxHQUFzQyxFQUFFLENBQUM7QUFFeEQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFlO0lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICduZ3h0ZW5zaW9uL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuXG5leHBvcnQgdHlwZSBOZ3RBbnlDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuY29uc3QgY2F0YWxvZ3VlOiBSZWNvcmQ8c3RyaW5nLCBOZ3RBbnlDb25zdHJ1Y3Rvcj4gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChvYmplY3RzOiBvYmplY3QpOiB2b2lkIHtcblx0T2JqZWN0LmFzc2lnbihjYXRhbG9ndWUsIG9iamVjdHMpO1xufVxuXG5leHBvcnQgY29uc3QgW2luamVjdENhdGFsb2d1ZV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbigoKSA9PiBjYXRhbG9ndWUpO1xuIl19
@@ -7,15 +7,15 @@ export const SPECIAL_DOM_TAG = {
7
7
  NGT_VALUE: 'ngt-value',
8
8
  };
9
9
  export const SPECIAL_PROPERTIES = {
10
- COMPOUND: 'ngtCompound',
11
10
  RENDER_PRIORITY: 'priority',
12
11
  ATTACH: 'attach',
13
- VALUE: 'rawValue',
14
- REF: 'ref',
12
+ RAW_VALUE: 'rawValue',
13
+ PARAMETERS: 'parameters',
15
14
  };
16
15
  export const SPECIAL_EVENTS = {
17
16
  BEFORE_RENDER: 'beforeRender',
18
- AFTER_UPDATE: 'afterUpdate',
19
- AFTER_ATTACH: 'afterAttach',
17
+ UPDATED: 'updated',
18
+ ATTACHED: 'attached',
20
19
  };
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzlCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFNBQVMsRUFBRSxXQUFXO0NBQ2IsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2pDLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLGVBQWUsRUFBRSxVQUFVO0lBQzNCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLEdBQUcsRUFBRSxLQUFLO0NBQ0QsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM3QixhQUFhLEVBQUUsY0FBYztJQUM3QixZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsYUFBYTtDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFJPVVRFRF9TQ0VORSA9ICdfX25ndF9yZW5kZXJlcl9pc19yb3V0ZWRfc2NlbmVfXyc7XG5leHBvcnQgY29uc3QgSFRNTCA9ICdfX25ndF9yZW5kZXJlcl9pc19odG1sJztcbmV4cG9ydCBjb25zdCBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UID0gJ19fbmd0X3JlbmRlcmVyX2FkZF9jb21tZW50X18nO1xuXG5leHBvcnQgY29uc3QgU1BFQ0lBTF9ET01fVEFHID0ge1xuXHROR1RfUE9SVEFMOiAnbmd0LXBvcnRhbCcsXG5cdE5HVF9QUklNSVRJVkU6ICduZ3QtcHJpbWl0aXZlJyxcblx0TkdUX1ZBTFVFOiAnbmd0LXZhbHVlJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTUEVDSUFMX1BST1BFUlRJRVMgPSB7XG5cdENPTVBPVU5EOiAnbmd0Q29tcG91bmQnLFxuXHRSRU5ERVJfUFJJT1JJVFk6ICdwcmlvcml0eScsXG5cdEFUVEFDSDogJ2F0dGFjaCcsXG5cdFZBTFVFOiAncmF3VmFsdWUnLFxuXHRSRUY6ICdyZWYnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNQRUNJQUxfRVZFTlRTID0ge1xuXHRCRUZPUkVfUkVOREVSOiAnYmVmb3JlUmVuZGVyJyxcblx0QUZURVJfVVBEQVRFOiAnYWZ0ZXJVcGRhdGUnLFxuXHRBRlRFUl9BVFRBQ0g6ICdhZnRlckF0dGFjaCcsXG59IGFzIGNvbnN0O1xuIl19
20
+ export const THREE_NATIVE_EVENTS = ['added', 'removed', 'childadded', 'childremoved', 'disposed'];
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzlCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFNBQVMsRUFBRSxXQUFXO0NBQ2IsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2pDLGVBQWUsRUFBRSxVQUFVO0lBQzNCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFVBQVUsRUFBRSxZQUFZO0NBQ2YsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM3QixhQUFhLEVBQUUsY0FBYztJQUM3QixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNYLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBST1VURURfU0NFTkUgPSAnX19uZ3RfcmVuZGVyZXJfaXNfcm91dGVkX3NjZW5lX18nO1xuZXhwb3J0IGNvbnN0IEhUTUwgPSAnX19uZ3RfcmVuZGVyZXJfaXNfaHRtbCc7XG5leHBvcnQgY29uc3QgU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVCA9ICdfX25ndF9yZW5kZXJlcl9hZGRfY29tbWVudF9fJztcblxuZXhwb3J0IGNvbnN0IFNQRUNJQUxfRE9NX1RBRyA9IHtcblx0TkdUX1BPUlRBTDogJ25ndC1wb3J0YWwnLFxuXHROR1RfUFJJTUlUSVZFOiAnbmd0LXByaW1pdGl2ZScsXG5cdE5HVF9WQUxVRTogJ25ndC12YWx1ZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgU1BFQ0lBTF9QUk9QRVJUSUVTID0ge1xuXHRSRU5ERVJfUFJJT1JJVFk6ICdwcmlvcml0eScsXG5cdEFUVEFDSDogJ2F0dGFjaCcsXG5cdFJBV19WQUxVRTogJ3Jhd1ZhbHVlJyxcblx0UEFSQU1FVEVSUzogJ3BhcmFtZXRlcnMnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNQRUNJQUxfRVZFTlRTID0ge1xuXHRCRUZPUkVfUkVOREVSOiAnYmVmb3JlUmVuZGVyJyxcblx0VVBEQVRFRDogJ3VwZGF0ZWQnLFxuXHRBVFRBQ0hFRDogJ2F0dGFjaGVkJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBUSFJFRV9OQVRJVkVfRVZFTlRTID0gWydhZGRlZCcsICdyZW1vdmVkJywgJ2NoaWxkYWRkZWQnLCAnY2hpbGRyZW1vdmVkJywgJ2Rpc3Bvc2VkJ107XG4iXX0=