@sitecore-jss/sitecore-jss-angular 21.7.0 → 21.7.1-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE.txt +202 -202
  2. package/README.md +7 -7
  3. package/angular.json +48 -48
  4. package/dist/README.md +7 -7
  5. package/dist/components/date.directive.d.ts +20 -20
  6. package/dist/components/editframe.component.d.ts +22 -22
  7. package/dist/components/file.directive.d.ts +17 -17
  8. package/dist/components/generic-link.directive.d.ts +20 -20
  9. package/dist/components/hidden-rendering.component.d.ts +7 -7
  10. package/dist/components/image.directive.d.ts +35 -35
  11. package/dist/components/link.directive.d.ts +26 -26
  12. package/dist/components/missing-component.component.d.ts +7 -7
  13. package/dist/components/placeholder-loading.directive.d.ts +8 -8
  14. package/dist/components/placeholder.component.d.ts +60 -60
  15. package/dist/components/raw.component.d.ts +12 -12
  16. package/dist/components/render-component.component.d.ts +33 -33
  17. package/dist/components/render-each.directive.d.ts +8 -8
  18. package/dist/components/render-empty.directive.d.ts +8 -8
  19. package/dist/components/rendering-field.d.ts +41 -41
  20. package/dist/components/rendering.d.ts +5 -5
  21. package/dist/components/rich-text.directive.d.ts +18 -18
  22. package/dist/components/router-link.directive.d.ts +19 -19
  23. package/dist/components/text.directive.d.ts +16 -16
  24. package/dist/esm2022/components/date.directive.mjs +67 -67
  25. package/dist/esm2022/components/editframe.component.mjs +70 -70
  26. package/dist/esm2022/components/file.directive.mjs +48 -48
  27. package/dist/esm2022/components/generic-link.directive.mjs +67 -67
  28. package/dist/esm2022/components/hidden-rendering.component.mjs +20 -20
  29. package/dist/esm2022/components/image.directive.mjs +150 -150
  30. package/dist/esm2022/components/link.directive.mjs +122 -122
  31. package/dist/esm2022/components/missing-component.component.mjs +16 -16
  32. package/dist/esm2022/components/placeholder-loading.directive.mjs +16 -16
  33. package/dist/esm2022/components/placeholder.component.mjs +281 -281
  34. package/dist/esm2022/components/raw.component.mjs +38 -38
  35. package/dist/esm2022/components/render-component.component.mjs +98 -98
  36. package/dist/esm2022/components/render-each.directive.mjs +16 -16
  37. package/dist/esm2022/components/render-empty.directive.mjs +16 -16
  38. package/dist/esm2022/components/rendering-field.mjs +1 -1
  39. package/dist/esm2022/components/rendering.mjs +7 -7
  40. package/dist/esm2022/components/rich-text.directive.mjs +68 -68
  41. package/dist/esm2022/components/router-link.directive.mjs +49 -49
  42. package/dist/esm2022/components/text.directive.mjs +61 -61
  43. package/dist/esm2022/lib.module.mjs +160 -160
  44. package/dist/esm2022/public_api.mjs +25 -25
  45. package/dist/esm2022/services/data-resolver-factory.mjs +58 -58
  46. package/dist/esm2022/services/guard-resolver-factory.mjs +86 -86
  47. package/dist/esm2022/services/jss-can-activate-error.mjs +14 -14
  48. package/dist/esm2022/services/jss-component-factory.service.mjs +88 -88
  49. package/dist/esm2022/services/placeholder.token.mjs +27 -27
  50. package/dist/esm2022/sitecore-jss-sitecore-jss-angular.mjs +4 -4
  51. package/dist/esm2022/utils.mjs +16 -16
  52. package/dist/fesm2022/sitecore-jss-sitecore-jss-angular.mjs +1530 -1530
  53. package/dist/index.d.ts +5 -5
  54. package/dist/lib.module.d.ts +48 -48
  55. package/dist/package.json +2 -2
  56. package/dist/public_api.d.ts +26 -26
  57. package/dist/services/data-resolver-factory.d.ts +13 -13
  58. package/dist/services/guard-resolver-factory.d.ts +11 -11
  59. package/dist/services/jss-can-activate-error.d.ts +10 -10
  60. package/dist/services/jss-component-factory.service.d.ts +26 -26
  61. package/dist/services/placeholder.token.d.ts +64 -64
  62. package/dist/utils.d.ts +6 -6
  63. package/ng-package.json +13 -13
  64. package/package.json +3 -3
  65. package/tsconfig.json +9 -9
  66. package/tsconfig.spec.json +17 -17
  67. package/typings/README.md +2 -2
@@ -1,297 +1,297 @@
1
- /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
- import { isPlatformServer } from '@angular/common';
3
- import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
4
- import { UrlTree } from '@angular/router';
5
- import { Observable } from 'rxjs';
6
- import { takeWhile } from 'rxjs/operators';
7
- import { JssCanActivateRedirectError } from '../services/jss-can-activate-error';
8
- import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from '../services/placeholder.token';
9
- import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
10
- import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
11
- import { RenderEachDirective } from './render-each.directive';
12
- import { RenderEmptyDirective } from './render-empty.directive';
13
- import { isRawRendering } from './rendering';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "../services/jss-component-factory.service";
16
- import * as i2 from "@angular/router";
17
- import * as i3 from "@angular/common";
18
- /**
19
- * @param {ComponentRendering} rendering
20
- * @param {string} name
21
- */
22
- function getPlaceholder(rendering, name) {
23
- if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
24
- return rendering.placeholders[name];
25
- }
26
- return null;
27
- }
28
- export class PlaceholderComponent {
29
- differs;
30
- componentFactory;
31
- changeDetectorRef;
32
- elementRef;
33
- renderer;
34
- router;
35
- missingComponentComponent;
36
- hiddenRenderingComponent;
37
- guardResolver;
38
- dataResolver;
39
- platformId;
40
- name;
41
- rendering;
42
- renderings;
43
- outputs;
44
- clientOnly = false;
45
- loaded = new EventEmitter();
46
- failed = new EventEmitter();
47
- renderEachTemplate;
48
- renderEmptyTemplate;
49
- placeholderLoading;
50
- view;
51
- isLoading = true;
52
- _inputs;
53
- _differ;
54
- _componentInstances = [];
55
- destroyed = false;
56
- parentStyleAttribute = '';
57
- constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
58
- // eslint-disable-next-line @typescript-eslint/ban-types
59
- platformId) {
60
- this.differs = differs;
61
- this.componentFactory = componentFactory;
62
- this.changeDetectorRef = changeDetectorRef;
63
- this.elementRef = elementRef;
64
- this.renderer = renderer;
65
- this.router = router;
66
- this.missingComponentComponent = missingComponentComponent;
67
- this.hiddenRenderingComponent = hiddenRenderingComponent;
68
- this.guardResolver = guardResolver;
69
- this.dataResolver = dataResolver;
70
- this.platformId = platformId;
71
- }
72
- set inputs(value) {
73
- this._inputs = value;
74
- if (!this._differ && value) {
75
- this._differ = this.differs.find(value).create();
76
- }
77
- }
78
- ngOnInit() {
79
- // just to ensure the element exists
80
- const elem = this.elementRef.nativeElement;
81
- if (elem) {
82
- const attributes = elem.attributes;
83
- for (let i = 0; i < attributes.length; i++) {
84
- const attr = attributes.item(i);
85
- if (attr && attr.name.indexOf('_ngcontent') !== -1) {
86
- this.parentStyleAttribute = attr.name;
87
- }
88
- }
89
- }
90
- }
91
- ngOnDestroy() {
92
- this.destroyed = true;
93
- this._componentInstances = [];
94
- }
95
- ngOnChanges(changes) {
96
- if (changes.rendering || changes.renderings) {
97
- this._render();
98
- }
99
- }
100
- ngDoCheck() {
101
- if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
102
- return;
103
- }
104
- const changes = this._differ.diff(this._inputs);
105
- if (!changes) {
106
- return;
107
- }
108
- const updates = {};
109
- changes.forEachRemovedItem((change) => (updates[change.key] = null));
110
- changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
111
- changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
112
- this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
113
- }
114
- _setComponentInputs(componentInstance, inputs) {
115
- Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
116
- }
117
- _subscribeComponentOutputs(componentInstance, outputs) {
118
- Object.keys(outputs)
119
- .filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
120
- .forEach((output) => componentInstance[output]
121
- .pipe(takeWhile(() => !this.destroyed))
122
- .subscribe(outputs[output]));
123
- }
124
- async _render() {
125
- if (this.clientOnly && isPlatformServer(this.platformId)) {
126
- return;
127
- }
128
- this._componentInstances = [];
129
- this.view.clear();
130
- if (!this.rendering && !this.renderings) {
131
- return;
132
- }
133
- if (!this.name && !this.renderings) {
134
- console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
135
- this.isLoading = false;
136
- return;
137
- }
138
- const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
139
- if (!placeholder) {
140
- console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
141
- this.isLoading = false;
142
- return;
143
- }
144
- // if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
145
- const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
146
- if (this.renderEmptyTemplate && placeholderIsEmpty) {
147
- this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
148
- renderings: placeholder,
149
- });
150
- this.isLoading = false;
151
- }
152
- else {
153
- const factories = await this.componentFactory.getComponents(placeholder);
154
- try {
155
- const nonGuarded = await this.guardResolver(factories);
156
- const withData = await this.dataResolver(nonGuarded);
157
- withData.forEach((rendering, index) => {
158
- if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
159
- this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
160
- }
161
- else {
162
- this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
163
- }
164
- });
165
- this.isLoading = false;
166
- this.changeDetectorRef.markForCheck();
167
- this.loaded.emit(this.name);
168
- }
169
- catch (e) {
170
- this.isLoading = false;
171
- if (e instanceof JssCanActivateRedirectError) {
172
- const redirectValue = e.redirectValue;
173
- if (redirectValue instanceof UrlTree) {
174
- this.router.navigateByUrl(redirectValue);
175
- }
176
- else if (typeof redirectValue === 'string') {
177
- this.router.navigate([redirectValue]);
178
- }
179
- else {
180
- this.router.navigate(redirectValue);
181
- }
182
- }
183
- else {
184
- this.failed.emit(e);
185
- console.warn(`Placeholder '${this.name}' was not able to render with the current rendering data and error`, JSON.stringify(this.rendering, null, 2), e);
186
- return;
187
- }
188
- }
189
- }
190
- }
191
- _renderTemplatedComponent(rendering, index) {
192
- // the render-each template takes care of all component mapping etc
193
- // generally using <sc-render-component> which is about like _renderEmbeddedComponent()
194
- // as a separate component
195
- this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
196
- rendering,
197
- index,
198
- });
199
- }
200
- _renderEmbeddedComponent(rendering, data, index) {
201
- if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
202
- rendering.componentImplementation = this.hiddenRenderingComponent;
203
- }
204
- if (!rendering.componentImplementation) {
205
- const componentName = rendering.componentDefinition.componentName;
1
+ /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
+ import { isPlatformServer } from '@angular/common';
3
+ import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
4
+ import { UrlTree } from '@angular/router';
5
+ import { Observable } from 'rxjs';
6
+ import { takeWhile } from 'rxjs/operators';
7
+ import { JssCanActivateRedirectError } from '../services/jss-can-activate-error';
8
+ import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from '../services/placeholder.token';
9
+ import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
10
+ import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
11
+ import { RenderEachDirective } from './render-each.directive';
12
+ import { RenderEmptyDirective } from './render-empty.directive';
13
+ import { isRawRendering } from './rendering';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../services/jss-component-factory.service";
16
+ import * as i2 from "@angular/router";
17
+ import * as i3 from "@angular/common";
18
+ /**
19
+ * @param {ComponentRendering} rendering
20
+ * @param {string} name
21
+ */
22
+ function getPlaceholder(rendering, name) {
23
+ if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
24
+ return rendering.placeholders[name];
25
+ }
26
+ return null;
27
+ }
28
+ export class PlaceholderComponent {
29
+ differs;
30
+ componentFactory;
31
+ changeDetectorRef;
32
+ elementRef;
33
+ renderer;
34
+ router;
35
+ missingComponentComponent;
36
+ hiddenRenderingComponent;
37
+ guardResolver;
38
+ dataResolver;
39
+ platformId;
40
+ name;
41
+ rendering;
42
+ renderings;
43
+ outputs;
44
+ clientOnly = false;
45
+ loaded = new EventEmitter();
46
+ failed = new EventEmitter();
47
+ renderEachTemplate;
48
+ renderEmptyTemplate;
49
+ placeholderLoading;
50
+ view;
51
+ isLoading = true;
52
+ _inputs;
53
+ _differ;
54
+ _componentInstances = [];
55
+ destroyed = false;
56
+ parentStyleAttribute = '';
57
+ constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
58
+ // eslint-disable-next-line @typescript-eslint/ban-types
59
+ platformId) {
60
+ this.differs = differs;
61
+ this.componentFactory = componentFactory;
62
+ this.changeDetectorRef = changeDetectorRef;
63
+ this.elementRef = elementRef;
64
+ this.renderer = renderer;
65
+ this.router = router;
66
+ this.missingComponentComponent = missingComponentComponent;
67
+ this.hiddenRenderingComponent = hiddenRenderingComponent;
68
+ this.guardResolver = guardResolver;
69
+ this.dataResolver = dataResolver;
70
+ this.platformId = platformId;
71
+ }
72
+ set inputs(value) {
73
+ this._inputs = value;
74
+ if (!this._differ && value) {
75
+ this._differ = this.differs.find(value).create();
76
+ }
77
+ }
78
+ ngOnInit() {
79
+ // just to ensure the element exists
80
+ const elem = this.elementRef.nativeElement;
81
+ if (elem) {
82
+ const attributes = elem.attributes;
83
+ for (let i = 0; i < attributes.length; i++) {
84
+ const attr = attributes.item(i);
85
+ if (attr && attr.name.indexOf('_ngcontent') !== -1) {
86
+ this.parentStyleAttribute = attr.name;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ ngOnDestroy() {
92
+ this.destroyed = true;
93
+ this._componentInstances = [];
94
+ }
95
+ ngOnChanges(changes) {
96
+ if (changes.rendering || changes.renderings) {
97
+ this._render();
98
+ }
99
+ }
100
+ ngDoCheck() {
101
+ if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
102
+ return;
103
+ }
104
+ const changes = this._differ.diff(this._inputs);
105
+ if (!changes) {
106
+ return;
107
+ }
108
+ const updates = {};
109
+ changes.forEachRemovedItem((change) => (updates[change.key] = null));
110
+ changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
111
+ changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
112
+ this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
113
+ }
114
+ _setComponentInputs(componentInstance, inputs) {
115
+ Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
116
+ }
117
+ _subscribeComponentOutputs(componentInstance, outputs) {
118
+ Object.keys(outputs)
119
+ .filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
120
+ .forEach((output) => componentInstance[output]
121
+ .pipe(takeWhile(() => !this.destroyed))
122
+ .subscribe(outputs[output]));
123
+ }
124
+ async _render() {
125
+ if (this.clientOnly && isPlatformServer(this.platformId)) {
126
+ return;
127
+ }
128
+ this._componentInstances = [];
129
+ this.view.clear();
130
+ if (!this.rendering && !this.renderings) {
131
+ return;
132
+ }
133
+ if (!this.name && !this.renderings) {
134
+ console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
135
+ this.isLoading = false;
136
+ return;
137
+ }
138
+ const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
139
+ if (!placeholder) {
140
+ console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
141
+ this.isLoading = false;
142
+ return;
143
+ }
144
+ // if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
145
+ const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
146
+ if (this.renderEmptyTemplate && placeholderIsEmpty) {
147
+ this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
148
+ renderings: placeholder,
149
+ });
150
+ this.isLoading = false;
151
+ }
152
+ else {
153
+ const factories = await this.componentFactory.getComponents(placeholder);
154
+ try {
155
+ const nonGuarded = await this.guardResolver(factories);
156
+ const withData = await this.dataResolver(nonGuarded);
157
+ withData.forEach((rendering, index) => {
158
+ if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
159
+ this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
160
+ }
161
+ else {
162
+ this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
163
+ }
164
+ });
165
+ this.isLoading = false;
166
+ this.changeDetectorRef.markForCheck();
167
+ this.loaded.emit(this.name);
168
+ }
169
+ catch (e) {
170
+ this.isLoading = false;
171
+ if (e instanceof JssCanActivateRedirectError) {
172
+ const redirectValue = e.redirectValue;
173
+ if (redirectValue instanceof UrlTree) {
174
+ this.router.navigateByUrl(redirectValue);
175
+ }
176
+ else if (typeof redirectValue === 'string') {
177
+ this.router.navigate([redirectValue]);
178
+ }
179
+ else {
180
+ this.router.navigate(redirectValue);
181
+ }
182
+ }
183
+ else {
184
+ this.failed.emit(e);
185
+ console.warn(`Placeholder '${this.name}' was not able to render with the current rendering data and error`, JSON.stringify(this.rendering, null, 2), e);
186
+ return;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ _renderTemplatedComponent(rendering, index) {
192
+ // the render-each template takes care of all component mapping etc
193
+ // generally using <sc-render-component> which is about like _renderEmbeddedComponent()
194
+ // as a separate component
195
+ this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
196
+ rendering,
197
+ index,
198
+ });
199
+ }
200
+ _renderEmbeddedComponent(rendering, data, index) {
201
+ if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
202
+ rendering.componentImplementation = this.hiddenRenderingComponent;
203
+ }
204
+ if (!rendering.componentImplementation) {
205
+ const componentName = rendering.componentDefinition.componentName;
206
206
  console.error(`Placeholder ${this.name} contains unknown component ${componentName}.`, `Ensure component is mapped, like:
207
207
  JssModule.withComponents([
208
208
  { name: '${componentName}', type: ${componentName}Component }
209
- ])`);
210
- rendering.componentImplementation = this.missingComponentComponent;
211
- }
212
- // apply the parent style attribute _ngcontent
213
- // work-around for https://github.com/angular/angular/issues/12215
214
- const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
215
- index: index,
216
- ngModuleRef: rendering.componentModuleRef,
217
- });
218
- if (this.parentStyleAttribute) {
219
- this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
220
- }
221
- const componentInstance = createdComponentRef.instance;
222
- componentInstance.rendering = rendering.componentDefinition;
223
- componentInstance.data = data;
224
- if (this._inputs) {
225
- this._setComponentInputs(componentInstance, this._inputs);
226
- }
227
- if (this.outputs) {
228
- this._subscribeComponentOutputs(componentInstance, this.outputs);
229
- }
230
- this._componentInstances.push(componentInstance);
231
- }
232
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
209
+ ])`);
210
+ rendering.componentImplementation = this.missingComponentComponent;
211
+ }
212
+ // apply the parent style attribute _ngcontent
213
+ // work-around for https://github.com/angular/angular/issues/12215
214
+ const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
215
+ index: index,
216
+ ngModuleRef: rendering.componentModuleRef,
217
+ });
218
+ if (this.parentStyleAttribute) {
219
+ this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
220
+ }
221
+ const componentInstance = createdComponentRef.instance;
222
+ componentInstance.rendering = rendering.componentDefinition;
223
+ componentInstance.data = data;
224
+ if (this._inputs) {
225
+ this._setComponentInputs(componentInstance, this._inputs);
226
+ }
227
+ if (this.outputs) {
228
+ this._subscribeComponentOutputs(componentInstance, this.outputs);
229
+ }
230
+ this._componentInstances.push(componentInstance);
231
+ }
232
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
233
233
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PlaceholderComponent, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded", failed: "failed" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
234
234
  <ng-template
235
235
  *ngIf="isLoading"
236
236
  [ngTemplateOutlet]="placeholderLoading?.templateRef"
237
237
  ></ng-template>
238
238
  <ng-template #view></ng-template>
239
- `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
240
- }
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, decorators: [{
242
- type: Component,
243
- args: [{
244
- selector: 'sc-placeholder,[sc-placeholder]',
239
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
240
+ }
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PlaceholderComponent, decorators: [{
242
+ type: Component,
243
+ args: [{
244
+ selector: 'sc-placeholder,[sc-placeholder]',
245
245
  template: `
246
246
  <ng-template
247
247
  *ngIf="isLoading"
248
248
  [ngTemplateOutlet]="placeholderLoading?.templateRef"
249
249
  ></ng-template>
250
250
  <ng-template #view></ng-template>
251
- `,
252
- }]
253
- }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
254
- type: Inject,
255
- args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
256
- }] }, { type: i0.Type, decorators: [{
257
- type: Inject,
258
- args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
259
- }] }, { type: undefined, decorators: [{
260
- type: Inject,
261
- args: [GUARD_RESOLVER]
262
- }] }, { type: undefined, decorators: [{
263
- type: Inject,
264
- args: [DATA_RESOLVER]
265
- }] }, { type: Object, decorators: [{
266
- type: Inject,
267
- args: [PLATFORM_ID]
268
- }] }]; }, propDecorators: { name: [{
269
- type: Input
270
- }], rendering: [{
271
- type: Input
272
- }], renderings: [{
273
- type: Input
274
- }], outputs: [{
275
- type: Input
276
- }], clientOnly: [{
277
- type: Input
278
- }], loaded: [{
279
- type: Output
280
- }], failed: [{
281
- type: Output
282
- }], renderEachTemplate: [{
283
- type: ContentChild,
284
- args: [RenderEachDirective, { static: true }]
285
- }], renderEmptyTemplate: [{
286
- type: ContentChild,
287
- args: [RenderEmptyDirective, { static: true }]
288
- }], placeholderLoading: [{
289
- type: ContentChild,
290
- args: [PlaceholderLoadingDirective, { static: true }]
291
- }], view: [{
292
- type: ViewChild,
293
- args: ['view', { read: ViewContainerRef, static: true }]
294
- }], inputs: [{
295
- type: Input
296
- }] } });
251
+ `,
252
+ }]
253
+ }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
254
+ type: Inject,
255
+ args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
256
+ }] }, { type: i0.Type, decorators: [{
257
+ type: Inject,
258
+ args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
259
+ }] }, { type: undefined, decorators: [{
260
+ type: Inject,
261
+ args: [GUARD_RESOLVER]
262
+ }] }, { type: undefined, decorators: [{
263
+ type: Inject,
264
+ args: [DATA_RESOLVER]
265
+ }] }, { type: Object, decorators: [{
266
+ type: Inject,
267
+ args: [PLATFORM_ID]
268
+ }] }]; }, propDecorators: { name: [{
269
+ type: Input
270
+ }], rendering: [{
271
+ type: Input
272
+ }], renderings: [{
273
+ type: Input
274
+ }], outputs: [{
275
+ type: Input
276
+ }], clientOnly: [{
277
+ type: Input
278
+ }], loaded: [{
279
+ type: Output
280
+ }], failed: [{
281
+ type: Output
282
+ }], renderEachTemplate: [{
283
+ type: ContentChild,
284
+ args: [RenderEachDirective, { static: true }]
285
+ }], renderEmptyTemplate: [{
286
+ type: ContentChild,
287
+ args: [RenderEmptyDirective, { static: true }]
288
+ }], placeholderLoading: [{
289
+ type: ContentChild,
290
+ args: [PlaceholderLoadingDirective, { static: true }]
291
+ }], view: [{
292
+ type: ViewChild,
293
+ args: ['view', { read: ViewContainerRef, static: true }]
294
+ }], inputs: [{
295
+ type: Input
296
+ }] } });
297
297
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGxhY2Vob2xkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFHWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ04sV0FBVyxFQUlYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUtqRixPQUFPLEVBRUwsYUFBYSxFQUViLGNBQWMsRUFDZCxzQ0FBc0MsRUFDdEMsdUNBQXVDLEdBQ3hDLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7QUFFN0M7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsU0FBNkIsRUFBRSxJQUFZO0lBQ2pFLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxZQUFZLElBQUksTUFB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OzBCQWlDSSxNQUFNOzJCQUFDLHVDQUF1Qzs7MEJBRTlDLE1BQU07MkJBQUMsc0NBQXNDOzswQkFDN0MsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxhQUFhOzswQkFFcEIsTUFBTTsyQkFBQyxXQUFXOzRDQXJDWixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBRThDLGtCQUFrQjtzQkFBdEUsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0csbUJBQW1CO3NCQUF4RSxZQUFZO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFcEQsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHVSxJQUFJO3NCQUF4RSxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQTJCdkQsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZSAqL1xyXG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIERvQ2hlY2ssXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIEtleVZhbHVlRGlmZmVyLFxyXG4gIEtleVZhbHVlRGlmZmVycyxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUExBVEZPUk1fSUQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVHlwZSxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YSwgUm91dGVyLCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyaW5nLCBIdG1sRWxlbWVudFJlbmRlcmluZyB9IGZyb20gJ0BzaXRlY29yZS1qc3Mvc2l0ZWNvcmUtanNzL2xheW91dCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBKc3NDYW5BY3RpdmF0ZVJlZGlyZWN0RXJyb3IgfSBmcm9tICcuLi9zZXJ2aWNlcy9qc3MtY2FuLWFjdGl2YXRlLWVycm9yJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRGYWN0b3J5UmVzdWx0LFxyXG4gIEpzc0NvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL3NlcnZpY2VzL2pzcy1jb21wb25lbnQtZmFjdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBEYXRhUmVzb2x2ZXIsXHJcbiAgREFUQV9SRVNPTFZFUixcclxuICBHdWFyZFJlc29sdmVyLFxyXG4gIEdVQVJEX1JFU09MVkVSLFxyXG4gIFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5ULFxyXG4gIFBMQUNFSE9MREVSX01JU1NJTkdfQ09NUE9ORU5UX0NPTVBPTkVOVCxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9wbGFjZWhvbGRlci50b2tlbic7XHJcbmltcG9ydCB7IEhJRERFTl9SRU5ERVJJTkdfTkFNRSB9IGZyb20gJy4vaGlkZGVuLXJlbmRlcmluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL3BsYWNlaG9sZGVyLWxvYWRpbmcuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVuZGVyRWFjaERpcmVjdGl2ZSB9IGZyb20gJy4vcmVuZGVyLWVhY2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVuZGVyRW1wdHlEaXJlY3RpdmUgfSBmcm9tICcuL3JlbmRlci1lbXB0eS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBpc1Jhd1JlbmRlcmluZyB9IGZyb20gJy4vcmVuZGVyaW5nJztcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0NvbXBvbmVudFJlbmRlcmluZ30gcmVuZGVyaW5nXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQbGFjZWhvbGRlcihyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgaWYgKHJlbmRlcmluZyAmJiByZW5kZXJpbmcucGxhY2Vob2xkZXJzICYmIE9iamVjdC5rZXlzKHJlbmRlcmluZy5wbGFjZWhvbGRlcnMpLmxlbmd0aCA+IDApIHtcclxuICAgIHJldHVybiByZW5kZXJpbmcucGxhY2Vob2xkZXJzW25hbWVdO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGYWN0b3J5V2l0aERhdGEge1xyXG4gIGZhY3Rvcnk6IENvbXBvbmVudEZhY3RvcnlSZXN1bHQ7XHJcbiAgZGF0YT86IERhdGE7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2MtcGxhY2Vob2xkZXIsW3NjLXBsYWNlaG9sZGVyXScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAqbmdJZj1cImlzTG9hZGluZ1wiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyTG9hZGluZz8udGVtcGxhdGVSZWZcIlxyXG4gICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI3ZpZXc+PC9uZy10ZW1wbGF0ZT5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGxhY2Vob2xkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjaywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBuYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZzogQ29tcG9uZW50UmVuZGVyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZ3M/OiBBcnJheTxDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZz47XHJcbiAgQElucHV0KCkgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9O1xyXG4gIEBJbnB1dCgpIGNsaWVudE9ubHkgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xyXG4gIEBPdXRwdXQoKSBmYWlsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFJlbmRlckVhY2hEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlckVhY2hUZW1wbGF0ZTogUmVuZGVyRWFjaERpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFJlbmRlckVtcHR5RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSByZW5kZXJFbXB0eVRlbXBsYXRlOiBSZW5kZXJFbXB0eURpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwbGFjZWhvbGRlckxvYWRpbmc/OiBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpZXcnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHZpZXc6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xyXG4gIHByaXZhdGUgX2RpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPjtcclxuICBwcml2YXRlIF9jb21wb25lbnRJbnN0YW5jZXM6IHsgW3Byb3A6IHN0cmluZ106IHVua25vd24gfVtdID0gW107XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIHBhcmVudFN0eWxlQXR0cmlidXRlID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk6IEpzc0NvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgQEluamVjdChQTEFDRUhPTERFUl9NSVNTSU5HX0NPTVBPTkVOVF9DT01QT05FTlQpXHJcbiAgICBwcml2YXRlIG1pc3NpbmdDb21wb25lbnRDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4sXHJcbiAgICBASW5qZWN0KFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5UKSBwcml2YXRlIGhpZGRlblJlbmRlcmluZ0NvbXBvbmVudDogVHlwZTx1bmtub3duPixcclxuICAgIEBJbmplY3QoR1VBUkRfUkVTT0xWRVIpIHByaXZhdGUgZ3VhcmRSZXNvbHZlcjogR3VhcmRSZXNvbHZlcixcclxuICAgIEBJbmplY3QoREFUQV9SRVNPTFZFUikgcHJpdmF0ZSBkYXRhUmVzb2x2ZXI6IERhdGFSZXNvbHZlcixcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdFxyXG4gICkge31cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaW5wdXRzKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xyXG4gICAgdGhpcy5faW5wdXRzID0gdmFsdWU7XHJcbiAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIGp1c3QgdG8gZW5zdXJlIHRoZSBlbGVtZW50IGV4aXN0c1xyXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCA9IGVsZW0uYXR0cmlidXRlcztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYXR0cjogQXR0ciB8IG51bGwgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7XHJcbiAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5uYW1lLmluZGV4T2YoJ19uZ2NvbnRlbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGFyZW50U3R5bGVBdHRyaWJ1dGUgPSBhdHRyLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucmVuZGVyaW5nIHx8IGNoYW5nZXMucmVuZGVyaW5ncykge1xyXG4gICAgICB0aGlzLl9yZW5kZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIGlmICghdGhpcy5fZGlmZmVyIHx8ICF0aGlzLl9pbnB1dHMgfHwgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX2lucHV0cyk7XHJcbiAgICBpZiAoIWNoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXBkYXRlczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gbnVsbCkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gY2hhbmdlLmN1cnJlbnRWYWx1ZSkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKGNoYW5nZSkgPT4gKHVwZGF0ZXNbY2hhbmdlLmtleV0gPSBjaGFuZ2UuY3VycmVudFZhbHVlKSk7XHJcbiAgICB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMuZm9yRWFjaCgoY29tcG9uZW50SW5zdGFuY2UpID0+XHJcbiAgICAgIHRoaXMuX3NldENvbXBvbmVudElucHV0cyhjb21wb25lbnRJbnN0YW5jZSwgdXBkYXRlcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDb21wb25lbnRJbnB1dHMoXHJcbiAgICBjb21wb25lbnRJbnN0YW5jZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sXHJcbiAgICBpbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZvckVhY2goXHJcbiAgICAgIChbaW5wdXQsIGlucHV0VmFsdWVdKSA9PiAoY29tcG9uZW50SW5zdGFuY2VbaW5wdXRdID0gaW5wdXRWYWx1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdWJzY3JpYmVDb21wb25lbnRPdXRwdXRzKFxyXG4gICAgY29tcG9uZW50SW5zdGFuY2U6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxyXG4gICAgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3Qua2V5cyhvdXRwdXRzKVxyXG4gICAgICAuZmlsdGVyKFxyXG4gICAgICAgIChvdXRwdXQpID0+IGNvbXBvbmVudEluc3RhbmNlW291dHB1dF0gJiYgY29tcG9uZW50SW5zdGFuY2Vbb3V0cHV0XSBpbnN0YW5jZW9mIE9ic2VydmFibGVcclxuICAgICAgKVxyXG4gICAgICAuZm9yRWFjaCgob3V0cHV0KSA9PlxyXG4gICAgICAgIChjb21wb25lbnRJbnN0YW5jZVtvdXRwdXRdIGFzIE9ic2VydmFibGU8dW5rbm93bj4pXHJcbiAgICAgICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuZGVzdHJveWVkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUob3V0cHV0c1tvdXRwdXRdKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuY2xpZW50T25seSAmJiBpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gICAgdGhpcy52aWV3LmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmluZyAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMubmFtZSAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAnUGxhY2Vob2xkZXIgbmFtZSB3YXMgbm90IHNwZWNpZmllZCwgYW5kIGV4cGxpY2l0IHJlbmRlcmluZ3MgYXJyYXkgd2FzIG5vdCBwYXNzZWQuIFBsYWNlaG9sZGVyIHJlcXVpcmVzIGVpdGhlciBuYW1lIGFuZCByZW5kZXJpbmcsIG9yIHJlbmRlcmluZ3MuJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnJlbmRlcmluZ3MgfHwgZ2V0UGxhY2Vob2xkZXIodGhpcy5yZW5kZXJpbmcsIHRoaXMubmFtZSB8fCAnJyk7XHJcblxyXG4gICAgaWYgKCFwbGFjZWhvbGRlcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFBsYWNlaG9sZGVyICcke3RoaXMubmFtZX0nIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGRhdGFgLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVuZGVyaW5nLCBudWxsLCAyKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdGhlIHBsYWNlaG9sZGVyIGlzIGVtcHR5IChjb250YWlucyBvbmx5IHJhdyByZW5kZXJpbmdzKSwgdGhlbiB3ZSBtYXkgbmVlZCB0byB1c2UgdGhlIGVtcHR5IHRlbXBsYXRlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJJc0VtcHR5ID0gcGxhY2Vob2xkZXIuZXZlcnkoXHJcbiAgICAgIChyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZyB8IEh0bWxFbGVtZW50UmVuZGVyaW5nKSA9PiBpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLnJlbmRlckVtcHR5VGVtcGxhdGUgJiYgcGxhY2Vob2xkZXJJc0VtcHR5KSB7XHJcbiAgICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFbXB0eVRlbXBsYXRlLnRlbXBsYXRlUmVmLCB7XHJcbiAgICAgICAgcmVuZGVyaW5nczogcGxhY2Vob2xkZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5jb21wb25lbnRGYWN0b3J5LmdldENvbXBvbmVudHMocGxhY2Vob2xkZXIpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBub25HdWFyZGVkID0gYXdhaXQgdGhpcy5ndWFyZFJlc29sdmVyKGZhY3Rvcmllcyk7XHJcbiAgICAgICAgY29uc3Qgd2l0aERhdGEgPSBhd2FpdCB0aGlzLmRhdGFSZXNvbHZlcihub25HdWFyZGVkKTtcclxuXHJcbiAgICAgICAgd2l0aERhdGEuZm9yRWFjaCgocmVuZGVyaW5nLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMucmVuZGVyRWFjaFRlbXBsYXRlICYmICFpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcuZmFjdG9yeS5jb21wb25lbnREZWZpbml0aW9uKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUZW1wbGF0ZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnkuY29tcG9uZW50RGVmaW5pdGlvbiwgaW5kZXgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnksIHJlbmRlcmluZy5kYXRhLCBpbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmxvYWRlZC5lbWl0KHRoaXMubmFtZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgSnNzQ2FuQWN0aXZhdGVSZWRpcmVjdEVycm9yKSB7XHJcbiAgICAgICAgICBjb25zdCByZWRpcmVjdFZhbHVlID0gZS5yZWRpcmVjdFZhbHVlO1xyXG4gICAgICAgICAgaWYgKHJlZGlyZWN0VmFsdWUgaW5zdGFuY2VvZiBVcmxUcmVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocmVkaXJlY3RWYWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWRpcmVjdFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcmVkaXJlY3RWYWx1ZV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUocmVkaXJlY3RWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmFpbGVkLmVtaXQoZSBhcyBFcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIGBQbGFjZWhvbGRlciAnJHt0aGlzLm5hbWV9JyB3YXMgbm90IGFibGUgdG8gcmVuZGVyIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGRhdGEgYW5kIGVycm9yYCxcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5yZW5kZXJpbmcsIG51bGwsIDIpLFxyXG4gICAgICAgICAgICBlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyVGVtcGxhdGVkQ29tcG9uZW50KFxyXG4gICAgcmVuZGVyaW5nOiBDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZyxcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIC8vIHRoZSByZW5kZXItZWFjaCB0ZW1wbGF0ZSB0YWtlcyBjYXJlIG9mIGFsbCBjb21wb25lbnQgbWFwcGluZyBldGNcclxuICAgIC8vIGdlbmVyYWxseSB1c2luZyA8c2MtcmVuZGVyLWNvbXBvbmVudD4gd2hpY2ggaXMgYWJvdXQgbGlrZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQoKVxyXG4gICAgLy8gYXMgYSBzZXBhcmF0ZSBjb21wb25lbnRcclxuICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFYWNoVGVtcGxhdGUudGVtcGxhdGVSZWYsIHtcclxuICAgICAgcmVuZGVyaW5nLFxyXG4gICAgICBpbmRleCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nOiBDb21wb25lbnRGYWN0b3J5UmVzdWx0LCBkYXRhOiBEYXRhLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChyZW5kZXJpbmcuY29tcG9uZW50RGVmaW5pdGlvbiBhcyBDb21wb25lbnRSZW5kZXJpbmcpLmNvbXBvbmVudE5hbWUgPT09IEhJRERFTl9SRU5ERVJJTkdfTkFNRVxyXG4gICAgKSB7XHJcbiAgICAgIHJlbmRlcmluZy5jb21wb25lbnRJbXBsZW1lbnRhdGlvbiA9IHRoaXMuaGlkZGVuUmVuZGVyaW5nQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAocmVuZGVyaW5nLmNvbXBvbmVudERlZmluaXRpb24gYXMgQ29tcG9uZW50UmVuZGVyaW5nKS5jb21wb25lbnROYW1lO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgIGBQbGFjZWhvbGRlciAke3RoaXMubmFtZX0gY29udGFpbnMgdW5rbm93biBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gLFxyXG4gICAgICAgIGBFbnN1cmUgY29tcG9uZW50IGlzIG1hcHBlZCwgbGlrZTpcclxuICAgICAgICBKc3NNb2R1bGUud2l0aENvbXBvbmVudHMoW1xyXG4gICAgICAgICAgeyBuYW1lOiAnJHtjb21wb25lbnROYW1lfScsIHR5cGU6ICR7Y29tcG9uZW50TmFtZX1Db21wb25lbnQgfVxyXG4gICAgICAgIF0pYFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uID0gdGhpcy5taXNzaW5nQ29tcG9uZW50Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gICAgLy8gYXBwbHkgdGhlIHBhcmVudCBzdHlsZSBhdHRyaWJ1dGUgX25nY29udGVudFxyXG4gICAgLy8gd29yay1hcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEyMjE1XHJcbiAgICBjb25zdCBjcmVhdGVkQ29tcG9uZW50UmVmID0gdGhpcy52aWV3LmNyZWF0ZUNvbXBvbmVudChyZW5kZXJpbmcuY29tcG9uZW50SW1wbGVtZW50YXRpb24sIHtcclxuICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICBuZ01vZHVsZVJlZjogcmVuZGVyaW5nLmNvbXBvbmVudE1vZHVsZVJlZixcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMucGFyZW50U3R5bGVBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgY3JlYXRlZENvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIHRoaXMucGFyZW50U3R5bGVBdHRyaWJ1dGUsXHJcbiAgICAgICAgJydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZWRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICBjb21wb25lbnRJbnN0YW5jZS5yZW5kZXJpbmcgPSByZW5kZXJpbmcuY29tcG9uZW50RGVmaW5pdGlvbjtcclxuICAgIGNvbXBvbmVudEluc3RhbmNlLmRhdGEgPSBkYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLl9pbnB1dHMpIHtcclxuICAgICAgdGhpcy5fc2V0Q29tcG9uZW50SW5wdXRzKGNvbXBvbmVudEluc3RhbmNlLCB0aGlzLl9pbnB1dHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3V0cHV0cykge1xyXG4gICAgICB0aGlzLl9zdWJzY3JpYmVDb21wb25lbnRPdXRwdXRzKGNvbXBvbmVudEluc3RhbmNlLCB0aGlzLm91dHB1dHMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzLnB1c2goY29tcG9uZW50SW5zdGFuY2UpO1xyXG4gIH1cclxufVxyXG4iXX0=