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