@angular/core 14.1.0-rc.0 → 14.2.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2020/src/application_ref.mjs +25 -20
  2. package/esm2020/src/core.mjs +2 -1
  3. package/esm2020/src/core_private_export.mjs +2 -2
  4. package/esm2020/src/di/injector_compatibility.mjs +2 -2
  5. package/esm2020/src/di/r3_injector.mjs +7 -1
  6. package/esm2020/src/errors.mjs +1 -1
  7. package/esm2020/src/linker/component_factory_resolver.mjs +1 -1
  8. package/esm2020/src/render3/component.mjs +120 -127
  9. package/esm2020/src/render3/component_ref.mjs +144 -9
  10. package/esm2020/src/render3/errors.mjs +9 -5
  11. package/esm2020/src/render3/index.mjs +2 -2
  12. package/esm2020/src/render3/instructions/element_validation.mjs +9 -5
  13. package/esm2020/src/render3/ng_module_ref.mjs +4 -14
  14. package/esm2020/src/version.mjs +1 -1
  15. package/esm2020/testing/src/logger.mjs +3 -3
  16. package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
  17. package/esm2020/testing/src/test_bed.mjs +442 -15
  18. package/esm2020/testing/src/test_bed_common.mjs +1 -1
  19. package/esm2020/testing/src/test_bed_compiler.mjs +823 -0
  20. package/esm2020/testing/src/test_hooks.mjs +5 -5
  21. package/esm2020/testing/src/testing.mjs +1 -1
  22. package/fesm2015/core.mjs +13088 -12945
  23. package/fesm2015/core.mjs.map +1 -1
  24. package/fesm2015/testing.mjs +13215 -13220
  25. package/fesm2015/testing.mjs.map +1 -1
  26. package/fesm2020/core.mjs +13088 -12945
  27. package/fesm2020/core.mjs.map +1 -1
  28. package/fesm2020/testing.mjs +13215 -13221
  29. package/fesm2020/testing.mjs.map +1 -1
  30. package/index.d.ts +155 -8
  31. package/package.json +1 -1
  32. package/testing/index.d.ts +19 -95
  33. package/esm2020/testing/src/r3_test_bed.mjs +0 -433
  34. package/esm2020/testing/src/r3_test_bed_compiler.mjs +0 -823
@@ -5,146 +5,139 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
- import { assertDefined, assertIndexInRange } from '../util/assert';
9
- import { diPublicInInjector, getOrCreateNodeInjectorForNode } from './di';
10
- import { throwProviderNotFoundError } from './errors_di';
11
- import { registerPostOrderHooks } from './hooks';
12
- import { addToViewTree, CLEAN_PROMISE, createLView, getOrCreateTComponentView, getOrCreateTNode, initTNodeFlags, instantiateRootComponent, invokeHostBindingsInCreationMode, markAsComponentHost, registerHostBindingOpCodes } from './instructions/shared';
13
- import { CONTEXT, HEADER_OFFSET, TVIEW } from './interfaces/view';
14
- import { writeDirectClass, writeDirectStyle } from './node_manipulation';
15
- import { getCurrentTNode, getLView, setSelectedIndex } from './state';
16
- import { computeStaticStyling } from './styling/static_styling';
17
- import { setUpAttributes } from './util/attrs_utils';
18
- import { defaultScheduler } from './util/misc_utils';
19
- import { getRootContext } from './util/view_traversal_utils';
20
- // TODO: A hack to not pull in the NullInjector from @angular/core.
21
- export const NULL_INJECTOR = {
22
- get: (token, notFoundValue) => {
23
- throwProviderNotFoundError(token, 'NullInjector');
24
- }
25
- };
8
+ import { getNullInjector } from '../di/r3_injector';
9
+ import { ComponentFactory } from './component_ref';
10
+ import { getComponentDef } from './definition';
11
+ import { assertComponentDef } from './errors';
26
12
  /**
27
- * Creates the root component view and the root component node.
13
+ * Creates a `ComponentRef` instance based on provided component type and a set of options.
28
14
  *
29
- * @param rNode Render host element.
30
- * @param def ComponentDef
31
- * @param rootView The parent view where the host node is stored
32
- * @param rendererFactory Factory to be used for creating child renderers.
33
- * @param hostRenderer The current renderer
34
- * @param sanitizer The sanitizer, if provided
15
+ * @usageNotes
35
16
  *
36
- * @returns Component view created
37
- */
38
- export function createRootComponentView(rNode, def, rootView, rendererFactory, hostRenderer, sanitizer) {
39
- const tView = rootView[TVIEW];
40
- const index = HEADER_OFFSET;
41
- ngDevMode && assertIndexInRange(rootView, index);
42
- rootView[index] = rNode;
43
- // '#host' is added here as we don't know the real host DOM name (we don't want to read it) and at
44
- // the same time we want to communicate the debug `TNode` that this is a special `TNode`
45
- // representing a host element.
46
- const tNode = getOrCreateTNode(tView, index, 2 /* TNodeType.Element */, '#host', null);
47
- const mergedAttrs = tNode.mergedAttrs = def.hostAttrs;
48
- if (mergedAttrs !== null) {
49
- computeStaticStyling(tNode, mergedAttrs, true);
50
- if (rNode !== null) {
51
- setUpAttributes(hostRenderer, rNode, mergedAttrs);
52
- if (tNode.classes !== null) {
53
- writeDirectClass(hostRenderer, rNode, tNode.classes);
54
- }
55
- if (tNode.styles !== null) {
56
- writeDirectStyle(hostRenderer, rNode, tNode.styles);
57
- }
58
- }
59
- }
60
- const viewRenderer = rendererFactory.createRenderer(rNode, def);
61
- const componentView = createLView(rootView, getOrCreateTComponentView(def), null, def.onPush ? 32 /* LViewFlags.Dirty */ : 16 /* LViewFlags.CheckAlways */, rootView[index], tNode, rendererFactory, viewRenderer, sanitizer || null, null, null);
62
- if (tView.firstCreatePass) {
63
- diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, rootView), tView, def.type);
64
- markAsComponentHost(tView, tNode);
65
- initTNodeFlags(tNode, rootView.length, 1);
66
- }
67
- addToViewTree(rootView, componentView);
68
- // Store component view at node index, with node as the HOST
69
- return rootView[index] = componentView;
70
- }
71
- /**
72
- * Creates a root component and sets it up with features and host bindings. Shared by
73
- * renderComponent() and ViewContainerRef.createComponent().
74
- */
75
- export function createRootComponent(componentView, componentDef, rootLView, rootContext, hostFeatures) {
76
- const tView = rootLView[TVIEW];
77
- // Create directive instance with factory() and store at next index in viewData
78
- const component = instantiateRootComponent(tView, rootLView, componentDef);
79
- rootContext.components.push(component);
80
- componentView[CONTEXT] = component;
81
- if (hostFeatures !== null) {
82
- for (const feature of hostFeatures) {
83
- feature(component, componentDef);
84
- }
85
- }
86
- // We want to generate an empty QueryList for root content queries for backwards
87
- // compatibility with ViewEngine.
88
- if (componentDef.contentQueries) {
89
- const tNode = getCurrentTNode();
90
- ngDevMode && assertDefined(tNode, 'TNode expected');
91
- componentDef.contentQueries(1 /* RenderFlags.Create */, component, tNode.directiveStart);
92
- }
93
- const rootTNode = getCurrentTNode();
94
- ngDevMode && assertDefined(rootTNode, 'tNode should have been already created');
95
- if (tView.firstCreatePass &&
96
- (componentDef.hostBindings !== null || componentDef.hostAttrs !== null)) {
97
- setSelectedIndex(rootTNode.index);
98
- const rootTView = rootLView[TVIEW];
99
- registerHostBindingOpCodes(rootTView, rootTNode, rootLView, rootTNode.directiveStart, rootTNode.directiveEnd, componentDef);
100
- invokeHostBindingsInCreationMode(componentDef, component);
101
- }
102
- return component;
103
- }
104
- export function createRootContext(scheduler, playerHandler) {
105
- return {
106
- components: [],
107
- scheduler: scheduler || defaultScheduler,
108
- clean: CLEAN_PROMISE,
109
- playerHandler: playerHandler || null,
110
- flags: 0 /* RootContextFlags.Empty */
111
- };
112
- }
113
- /**
114
- * Used to enable lifecycle hooks on the root component.
17
+ * The example below demonstrates how the `createComponent` function can be used
18
+ * to create an instance of a ComponentRef dynamically and attach it to an ApplicationRef,
19
+ * so that it gets included into change detection cycles.
115
20
  *
116
- * Include this feature when calling `renderComponent` if the root component
117
- * you are rendering has lifecycle hooks defined. Otherwise, the hooks won't
118
- * be called properly.
21
+ * Note: the example uses standalone components, but the function can also be used for
22
+ * non-standalone components (declared in an NgModule) as well.
119
23
  *
120
- * Example:
24
+ * ```typescript
25
+ * @Component({
26
+ * standalone: true,
27
+ * template: `Hello {{ name }}!`
28
+ * })
29
+ * class HelloComponent {
30
+ * name = 'Angular';
31
+ * }
121
32
  *
33
+ * @Component({
34
+ * standalone: true,
35
+ * template: `<div id="hello-component-host"></div>`
36
+ * })
37
+ * class RootComponent {}
38
+ *
39
+ * // Bootstrap an application.
40
+ * const applicationRef = await bootstrapApplication(RootComponent);
41
+ *
42
+ * // Locate a DOM node that would be used as a host.
43
+ * const host = document.getElementById('hello-component-host');
44
+ *
45
+ * // Get an `EnvironmentInjector` instance from the `ApplicationRef`.
46
+ * const environmentInjector = applicationRef.injector;
47
+ *
48
+ * // We can now create a `ComponentRef` instance.
49
+ * const componentRef = createComponent(HelloComponent, {host, environmentInjector});
50
+ *
51
+ * // Last step is to register the newly created ref using the `ApplicationRef` instance
52
+ * // to include the component view into change detection cycles.
53
+ * applicationRef.attachView(componentRef.hostView);
122
54
  * ```
123
- * renderComponent(AppComponent, {hostFeatures: [LifecycleHooksFeature]});
124
- * ```
55
+ *
56
+ * @param component Component class reference.
57
+ * @param options Set of options to use:
58
+ * * `environmentInjector`: An `EnvironmentInjector` instance to be used for the component, see
59
+ * additional info about it at https://angular.io/guide/standalone-components#environment-injectors.
60
+ * * `hostElement` (optional): A DOM node that should act as a host node for the component. If not
61
+ * provided, Angular creates one based on the tag name used in the component selector (and falls
62
+ * back to using `div` if selector doesn't have tag name info).
63
+ * * `elementInjector` (optional): An `ElementInjector` instance, see additional info about it at
64
+ * https://angular.io/guide/hierarchical-dependency-injection#elementinjector.
65
+ * * `projectableNodes` (optional): A list of DOM nodes that should be projected through
66
+ * [`<ng-content>`](api/core/ng-content) of the new component instance.
67
+ * @returns ComponentRef instance that represents a given Component.
68
+ *
69
+ * @publicApi
125
70
  */
126
- export function LifecycleHooksFeature() {
127
- const tNode = getCurrentTNode();
128
- ngDevMode && assertDefined(tNode, 'TNode is required');
129
- registerPostOrderHooks(getLView()[TVIEW], tNode);
71
+ export function createComponent(component, options) {
72
+ ngDevMode && assertComponentDef(component);
73
+ const componentDef = getComponentDef(component);
74
+ const elementInjector = options.elementInjector || getNullInjector();
75
+ const factory = new ComponentFactory(componentDef);
76
+ return factory.create(elementInjector, options.projectableNodes, options.hostElement, options.environmentInjector);
130
77
  }
131
78
  /**
132
- * Wait on component until it is rendered.
79
+ * Creates an object that allows to retrieve component metadata.
133
80
  *
134
- * This function returns a `Promise` which is resolved when the component's
135
- * change detection is executed. This is determined by finding the scheduler
136
- * associated with the `component`'s render tree and waiting until the scheduler
137
- * flushes. If nothing is scheduled, the function returns a resolved promise.
81
+ * @usageNotes
138
82
  *
139
- * Example:
140
- * ```
141
- * await whenRendered(myComponent);
83
+ * The example below demonstrates how to use the function and how the fields
84
+ * of the returned object map to the component metadata.
85
+ *
86
+ * ```typescript
87
+ * @Component({
88
+ * standalone: true,
89
+ * selector: 'foo-component',
90
+ * template: `
91
+ * <ng-content></ng-content>
92
+ * <ng-content select="content-selector-a"></ng-content>
93
+ * `,
94
+ * })
95
+ * class FooComponent {
96
+ * @Input('inputName') inputPropName: string;
97
+ * @Output('outputName') outputPropName = new EventEmitter<void>();
98
+ * }
99
+ *
100
+ * const mirror = reflectComponentType(FooComponent);
101
+ * expect(mirror.type).toBe(FooComponent);
102
+ * expect(mirror.selector).toBe('foo-component');
103
+ * expect(mirror.isStandalone).toBe(true);
104
+ * expect(mirror.inputs).toEqual([{propName: 'inputName', templateName: 'inputPropName'}]);
105
+ * expect(mirror.outputs).toEqual([{propName: 'outputName', templateName: 'outputPropName'}]);
106
+ * expect(mirror.ngContentSelectors).toEqual([
107
+ * '*', // first `<ng-content>` in a template, the selector defaults to `*`
108
+ * 'content-selector-a' // second `<ng-content>` in a template
109
+ * ]);
142
110
  * ```
143
111
  *
144
- * @param component Component to wait upon
145
- * @returns Promise which resolves when the component is rendered.
112
+ * @param component Component class reference.
113
+ * @returns An object that allows to retrieve component metadata.
114
+ *
115
+ * @publicApi
146
116
  */
147
- export function whenRendered(component) {
148
- return getRootContext(component).clean;
117
+ export function reflectComponentType(component) {
118
+ const componentDef = getComponentDef(component);
119
+ if (!componentDef)
120
+ return null;
121
+ const factory = new ComponentFactory(componentDef);
122
+ return {
123
+ get selector() {
124
+ return factory.selector;
125
+ },
126
+ get type() {
127
+ return factory.componentType;
128
+ },
129
+ get inputs() {
130
+ return factory.inputs;
131
+ },
132
+ get outputs() {
133
+ return factory.outputs;
134
+ },
135
+ get ngContentSelectors() {
136
+ return factory.ngContentSelectors;
137
+ },
138
+ get isStandalone() {
139
+ return componentDef.standalone;
140
+ },
141
+ };
149
142
  }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBTUgsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSw4QkFBOEIsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsZ0NBQWdDLEVBQUUsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU0xUCxPQUFPLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBb0QsS0FBSyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEgsT0FBTyxFQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQXdEM0QsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGFB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QUFTLENBQUM7QUFDbkIsQ0FBQztBQUdELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsU0FBd0MsRUFBRSxhQUFrQztJQUM5RSxPQUFPO1FBQ0wsVUFBVSxFQUFFLEVBQUU7UUFDZCxTQUFTLEVBQUUsU0FBUyxJQUFJLGdCQUFnQjtRQUN4QyxLQUFLLEVBQUUsYUFBYTtRQUNwQixhQUFhLEVBQUUsYUFBYSxJQUFJLElBQUk7UUFDcEMsS0FBSyxnQ0FBd0I7S0FDOUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE1BQU0sS0FBSyxHQUFHLGVBQWUsRUFBRyxDQUFDO0lBQ2pDLFNBQVMsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDdkQsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsU0FBYztJQUN6QyxPQUFPLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBXZSBhcmUgdGVtcG9yYXJpbHkgaW1wb3J0aW5nIHRoZSBleGlzdGluZyB2aWV3RW5naW5lIGZyb20gY29yZSBzbyB3ZSBjYW4gYmUgc3VyZSB3ZSBhcmVcbi8vIGNvcnJlY3RseSBpbXBsZW1lbnRpbmcgaXRzIGludGVyZmFjZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnLi4vZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtTYW5pdGl6ZXJ9IGZyb20gJy4uL3Nhbml0aXphdGlvbi9zYW5pdGl6ZXInO1xuaW1wb3J0IHthc3NlcnREZWZpbmVkLCBhc3NlcnRJbmRleEluUmFuZ2V9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuaW1wb3J0IHtkaVB1YmxpY0luSW5qZWN0b3IsIGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZX0gZnJvbSAnLi9kaSc7XG5pbXBvcnQge3Rocm93UHJvdmlkZXJOb3RGb3VuZEVycm9yfSBmcm9tICcuL2Vycm9yc19kaSc7XG5pbXBvcnQge3JlZ2lzdGVyUG9zdE9yZGVySG9va3N9IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHthZGRUb1ZpZXdUcmVlLCBDTEVBTl9QUk9NSVNFLCBjcmVhdGVMVmlldywgZ2V0T3JDcmVhdGVUQ29tcG9uZW50VmlldywgZ2V0T3JDcmVhdGVUTm9kZSwgaW5pdFROb2RlRmxhZ3MsIGluc3RhbnRpYXRlUm9vdENvbXBvbmVudCwgaW52b2tlSG9zdEJpbmRpbmdzSW5DcmVhdGlvbk1vZGUsIG1hcmtBc0NvbXBvbmVudEhvc3QsIHJlZ2lzdGVySG9zdEJpbmRpbmdPcENvZGVzfSBmcm9tICcuL2luc3RydWN0aW9ucy9zaGFyZWQnO1xuaW1wb3J0IHtDb21wb25lbnREZWYsIFJlbmRlckZsYWdzfSBmcm9tICcuL2ludGVyZmFjZXMvZGVmaW5pdGlvbic7XG5pbXBvcnQge1RFbGVtZW50Tm9kZSwgVE5vZGVUeXBlfSBmcm9tICcuL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQge1BsYXllckhhbmRsZXJ9IGZyb20gJy4vaW50ZXJmYWNlcy9wbGF5ZXInO1xuaW1wb3J0IHtSZW5kZXJlciwgUmVuZGVyZXJGYWN0b3J5fSBmcm9tICcuL2ludGVyZmFjZXMvcmVuZGVyZXInO1xuaW1wb3J0IHtSRWxlbWVudH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5pbXBvcnQge0NPTlRFWFQsIEhFQURFUl9PRkZTRVQsIExWaWV3LCBMVmlld0ZsYWdzLCBSb290Q29udGV4dCwgUm9vdENvbnRleHRGbGFncywgVFZJRVd9IGZyb20gJy4vaW50ZXJmYWNlcy92aWV3JztcbmltcG9ydCB7d3JpdGVEaXJlY3RDbGFzcywgd3JpdGVEaXJlY3RTdHlsZX0gZnJvbSAnLi9ub2RlX21hbmlwdWxhdGlvbic7XG5pbXBvcnQge2dldEN1cnJlbnRUTm9kZSwgZ2V0TFZpZXcsIHNldFNlbGVjdGVkSW5kZXh9IGZyb20gJy4vc3RhdGUnO1xuaW1wb3J0IHtjb21wdXRlU3RhdGljU3R5bGluZ30gZnJvbSAnLi9zdHlsaW5nL3N0YXRpY19zdHlsaW5nJztcbmltcG9ydCB7c2V0VXBBdHRyaWJ1dGVzfSBmcm9tICcuL3V0aWwvYXR0cnNfdXRpbHMnO1xuaW1wb3J0IHtkZWZhdWx0U2NoZWR1bGVyfSBmcm9tICcuL3V0aWwvbWlzY191dGlscyc7XG5pbXBvcnQge2dldFJvb3RDb250ZXh0fSBmcm9tICcuL3V0aWwvdmlld190cmF2ZXJzYWxfdXRpbHMnO1xuXG5cblxuLyoqIE9wdGlvbnMgdGhhdCBjb250cm9sIGhvdyB0aGUgY29tcG9uZW50IHNob3VsZCBiZSBib290c3RyYXBwZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvbXBvbmVudE9wdGlvbnMge1xuICAvKiogV2hpY2ggcmVuZGVyZXIgZmFjdG9yeSB0byB1c2UuICovXG4gIHJlbmRlcmVyRmFjdG9yeT86IFJlbmRlcmVyRmFjdG9yeTtcblxuICAvKiogQSBjdXN0b20gc2FuaXRpemVyIGluc3RhbmNlICovXG4gIHNhbml0aXplcj86IFNhbml0aXplcjtcblxuICAvKiogQSBjdXN0b20gYW5pbWF0aW9uIHBsYXllciBoYW5kbGVyICovXG4gIHBsYXllckhhbmRsZXI/OiBQbGF5ZXJIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIb3N0IGVsZW1lbnQgb24gd2hpY2ggdGhlIGNvbXBvbmVudCB3aWxsIGJlIGJvb3RzdHJhcHBlZC4gSWYgbm90IHNwZWNpZmllZCxcbiAgICogdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uJ3MgYHRhZ2AgaXMgdXNlZCB0byBxdWVyeSB0aGUgZXhpc3RpbmcgRE9NIGZvciB0aGVcbiAgICogZWxlbWVudCB0byBib290c3RyYXAuXG4gICAqL1xuICBob3N0PzogUkVsZW1lbnR8c3RyaW5nO1xuXG4gIC8qKiBNb2R1bGUgaW5qZWN0b3IgZm9yIHRoZSBjb21wb25lbnQuIElmIHVuc3BlY2lmaWVkLCB0aGUgaW5qZWN0b3Igd2lsbCBiZSBOVUxMX0lOSkVDVE9SLiAqL1xuICBpbmplY3Rvcj86IEluamVjdG9yO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgY29tcG9uZW50LiBGZWF0dXJlcyBhcmUgc2ltcGx5XG4gICAqIGZ1bmN0aW9ucyB0aGF0IGRlY29yYXRlIGEgY29tcG9uZW50IHdpdGggYSBjZXJ0YWluIGJlaGF2aW9yLlxuICAgKlxuICAgKiBUeXBpY2FsbHksIHRoZSBmZWF0dXJlcyBpbiB0aGlzIGxpc3QgYXJlIGZlYXR1cmVzIHRoYXQgY2Fubm90IGJlIGFkZGVkIHRvIHRoZVxuICAgKiBvdGhlciBmZWF0dXJlcyBsaXN0IGluIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbiBiZWNhdXNlIHRoZXkgcmVseSBvbiBvdGhlciBmYWN0b3JzLlxuICAgKlxuICAgKiBFeGFtcGxlOiBgTGlmZWN5Y2xlSG9va3NGZWF0dXJlYCBpcyBhIGZ1bmN0aW9uIHRoYXQgYWRkcyBsaWZlY3ljbGUgaG9vayBjYXBhYmlsaXRpZXNcbiAgICogdG8gcm9vdCBjb21wb25lbnRzIGluIGEgdHJlZS1zaGFrYWJsZSB3YXkuIEl0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgY29tcG9uZW50XG4gICAqIGZlYXR1cmVzIGxpc3QgYmVjYXVzZSB0aGVyZSdzIG5vIHdheSBvZiBrbm93aW5nIHdoZW4gdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVzZWQgYXNcbiAgICogYSByb290IGNvbXBvbmVudC5cbiAgICovXG4gIGhvc3RGZWF0dXJlcz86IEhvc3RGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBzY2hlZHVsZSBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmsgaW4gdGhlIGZ1dHVyZS5cbiAgICpcbiAgICogV2hlbiBtYXJraW5nIGNvbXBvbmVudHMgYXMgZGlydHksIGl0IGlzIG5lY2Vzc2FyeSB0byBzY2hlZHVsZSB0aGUgd29yayBvZlxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIGluIHRoZSBmdXR1cmUuIFRoaXMgaXMgZG9uZSB0byBjb2FsZXNjZSBtdWx0aXBsZVxuICAgKiB7QGxpbmsgbWFya0RpcnR5fSBjYWxscyBpbnRvIGEgc2luZ2xlIGNoYW5nZWQgZGV0ZWN0aW9uIHByb2Nlc3NpbmcuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzY2hlZHVsZXIgaXMgdGhlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBJdCBpcyBhbHNvIHVzZWZ1bCB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgKi9cbiAgc2NoZWR1bGVyPzogKHdvcms6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG59XG5cbi8qKiBTZWUgQ3JlYXRlQ29tcG9uZW50T3B0aW9ucy5ob3N0RmVhdHVyZXMgKi9cbnR5cGUgSG9zdEZlYXR1cmUgPSAoPFQ+KGNvbXBvbmVudDogVCwgY29tcG9uZW50RGVmOiBDb21wb25lbnREZWY8VD4pID0+IHZvaWQpO1xuXG4vLyBUT0RPOiBBIGhhY2sgdG8gbm90IHB1bGwgaW4gdGhlIE51bGxJbmplY3RvciBmcm9tIEBhbmd1bGFyL2NvcmUuXG5leHBvcnQgY29uc3QgTlVMTF9JTkpFQ1RPUjogSW5qZWN0b3IgPSB7XG4gIGdldDogKHRva2VuOiBhbnksIG5vdEZvdW5kVmFsdWU/OiBhbnkpID0+IHtcbiAgICB0aHJvd1Byb3ZpZGVyTm90Rm91bmRFcnJvcih0b2tlbiwgJ051bGxJbmplY3RvcicpO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHJvb3QgY29tcG9uZW50IHZpZXcgYW5kIHRoZSByb290IGNvbXBvbmVudCBub2RlLlxuICpcbiAqIEBwYXJhbSByTm9kZSBSZW5kZXIgaG9zdCBlbGVtZW50LlxuICogQHBhcmFtIGRlZiBDb21wb25lbnREZWZcbiAqIEBwYXJhbSByb290VmlldyBUaGUgcGFyZW50IHZpZXcgd2hlcmUgdGhlIGhvc3Qgbm9kZSBpcyBzdG9yZWRcbiAqIEBwYXJhbSByZW5kZXJlckZhY3RvcnkgRmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBjaGlsZCByZW5kZXJlcnMuXG4gKiBAcGFyYW0gaG9zdFJlbmRlcmVyIFRoZSBjdXJyZW50IHJlbmRlcmVyXG4gKiBAcGFyYW0gc2FuaXRpemVyIFRoZSBzYW5pdGl6ZXIsIGlmIHByb3ZpZGVkXG4gKlxuICogQHJldHVybnMgQ29tcG9uZW50IHZpZXcgY3JlYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm9vdENvbXBvbmVudFZpZXcoXG4gICAgck5vZGU6IFJFbGVtZW50fG51bGwsIGRlZjogQ29tcG9uZW50RGVmPGFueT4sIHJvb3RWaWV3OiBMVmlldywgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnksXG4gICAgaG9zdFJlbmRlcmVyOiBSZW5kZXJlciwgc2FuaXRpemVyPzogU2FuaXRpemVyfG51bGwpOiBMVmlldyB7XG4gIGNvbnN0IHRWaWV3ID0gcm9vdFZpZXdbVFZJRVddO1xuICBjb25zdCBpbmRleCA9IEhFQURFUl9PRkZTRVQ7XG4gIG5nRGV2TW9kZSAmJiBhc3NlcnRJbmRleEluUmFuZ2Uocm9vdFZpZXcsIGluZGV4KTtcbiAgcm9vdFZpZXdbaW5kZXhdID0gck5vZGU7XG4gIC8vICcjaG9zdCcgaXMgYWRkZWQgaGVyZSBhcyB3ZSBkb24ndCBrbm93IHRoZSByZWFsIGhvc3QgRE9NIG5hbWUgKHdlIGRvbid0IHdhbnQgdG8gcmVhZCBpdCkgYW5kIGF0XG4gIC8vIHRoZSBzYW1lIHRpbWUgd2Ugd2FudCB0byBjb21tdW5pY2F0ZSB0aGUgZGVidWcgYFROb2RlYCB0aGF0IHRoaXMgaXMgYSBzcGVjaWFsIGBUTm9kZWBcbiAgLy8gcmVwcmVzZW50aW5nIGEgaG9zdCBlbGVtZW50LlxuICBjb25zdCB0Tm9kZTogVEVsZW1lbnROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgaW5kZXgsIFROb2RlVHlwZS5FbGVtZW50LCAnI2hvc3QnLCBudWxsKTtcbiAgY29uc3QgbWVyZ2VkQXR0cnMgPSB0Tm9kZS5tZXJnZWRBdHRycyA9IGRlZi5ob3N0QXR0cnM7XG4gIGlmIChtZXJnZWRBdHRycyAhPT0gbnVsbCkge1xuICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCBtZXJnZWRBdHRycywgdHJ1ZSk7XG4gICAgaWYgKHJOb2RlICE9PSBudWxsKSB7XG4gICAgICBzZXRVcEF0dHJpYnV0ZXMoaG9zdFJlbmRlcmVyLCByTm9kZSwgbWVyZ2VkQXR0cnMpO1xuICAgICAgaWYgKHROb2RlLmNsYXNzZXMgIT09IG51bGwpIHtcbiAgICAgICAgd3JpdGVEaXJlY3RDbGFzcyhob3N0UmVuZGVyZXIsIHJOb2RlLCB0Tm9kZS5jbGFzc2VzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0Tm9kZS5zdHlsZXMgIT09IG51bGwpIHtcbiAgICAgICAgd3JpdGVEaXJlY3RTdHlsZShob3N0UmVuZGVyZXIsIHJOb2RlLCB0Tm9kZS5zdHlsZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHZpZXdSZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihyTm9kZSwgZGVmKTtcbiAgY29uc3QgY29tcG9uZW50VmlldyA9IGNyZWF0ZUxWaWV3KFxuICAgICAgcm9vdFZpZXcsIGdldE9yQ3JlYXRlVENvbXBvbmVudFZpZXcoZGVmKSwgbnVsbCxcbiAgICAgIGRlZi5vblB1c2ggPyBMVmlld0ZsYWdzLkRpcnR5IDogTFZpZXdGbGFncy5DaGVja0Fsd2F5cywgcm9vdFZpZXdbaW5kZXhdLCB0Tm9kZSxcbiAgICAgIHJlbmRlcmVyRmFjdG9yeSwgdmlld1JlbmRlcmVyLCBzYW5pdGl6ZXIgfHwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykge1xuICAgIGRpUHVibGljSW5JbmplY3RvcihnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUodE5vZGUsIHJvb3RWaWV3KSwgdFZpZXcsIGRlZi50eXBlKTtcbiAgICBtYXJrQXNDb21wb25lbnRIb3N0KHRWaWV3LCB0Tm9kZSk7XG4gICAgaW5pdFROb2RlRmxhZ3ModE5vZGUsIHJvb3RWaWV3Lmxlbmd0aCwgMSk7XG4gIH1cblxuICBhZGRUb1ZpZXdUcmVlKHJvb3RWaWV3LCBjb21wb25lbnRWaWV3KTtcblxuICAvLyBTdG9yZSBjb21wb25lbnQgdmlldyBhdCBub2RlIGluZGV4LCB3aXRoIG5vZGUgYXMgdGhlIEhPU1RcbiAgcmV0dXJuIHJvb3RWaWV3W2luZGV4XSA9IGNvbXBvbmVudFZpZXc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvb3QgY29tcG9uZW50IGFuZCBzZXRzIGl0IHVwIHdpdGggZmVhdHVyZXMgYW5kIGhvc3QgYmluZGluZ3MuIFNoYXJlZCBieVxuICogcmVuZGVyQ29tcG9uZW50KCkgYW5kIFZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50PFQ+KFxuICAgIGNvbXBvbmVudFZpZXc6IExWaWV3LCBjb21wb25lbnREZWY6IENvbXBvbmVudERlZjxUPiwgcm9vdExWaWV3OiBMVmlldywgcm9vdENvbnRleHQ6IFJvb3RDb250ZXh0LFxuICAgIGhvc3RGZWF0dXJlczogSG9zdEZlYXR1cmVbXXxudWxsKTogYW55IHtcbiAgY29uc3QgdFZpZXcgPSByb290TFZpZXdbVFZJRVddO1xuICAvLyBDcmVhdGUgZGlyZWN0aXZlIGluc3RhbmNlIHdpdGggZmFjdG9yeSgpIGFuZCBzdG9yZSBhdCBuZXh0IGluZGV4IGluIHZpZXdEYXRhXG4gIGNvbnN0IGNvbXBvbmVudCA9IGluc3RhbnRpYXRlUm9vdENvbXBvbmVudCh0Vmlldywgcm9vdExWaWV3LCBjb21wb25lbnREZWYpO1xuXG4gIHJvb3RDb250ZXh0LmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICBjb21wb25lbnRWaWV3W0NPTlRFWFRdID0gY29tcG9uZW50O1xuXG4gIGlmIChob3N0RmVhdHVyZXMgIT09IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgaG9zdEZlYXR1cmVzKSB7XG4gICAgICBmZWF0dXJlKGNvbXBvbmVudCwgY29tcG9uZW50RGVmKTtcbiAgICB9XG4gIH1cblxuICAvLyBXZSB3YW50IHRvIGdlbmVyYXRlIGFuIGVtcHR5IFF1ZXJ5TGlzdCBmb3Igcm9vdCBjb250ZW50IHF1ZXJpZXMgZm9yIGJhY2t3YXJkc1xuICAvLyBjb21wYXRpYmlsaXR5IHdpdGggVmlld0VuZ2luZS5cbiAgaWYgKGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcykge1xuICAgIGNvbnN0IHROb2RlID0gZ2V0Q3VycmVudFROb2RlKCkhO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHROb2RlLCAnVE5vZGUgZXhwZWN0ZWQnKTtcbiAgICBjb21wb25lbnREZWYuY29udGVudFF1ZXJpZXMoUmVuZGVyRmxhZ3MuQ3JlYXRlLCBjb21wb25lbnQsIHROb2RlLmRpcmVjdGl2ZVN0YXJ0KTtcbiAgfVxuXG4gIGNvbnN0IHJvb3RUTm9kZSA9IGdldEN1cnJlbnRUTm9kZSgpITtcbiAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocm9vdFROb2RlLCAndE5vZGUgc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IGNyZWF0ZWQnKTtcbiAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyAmJlxuICAgICAgKGNvbXBvbmVudERlZi5ob3N0QmluZGluZ3MgIT09IG51bGwgfHwgY29tcG9uZW50RGVmLmhvc3RBdHRycyAhPT0gbnVsbCkpIHtcbiAgICBzZXRTZWxlY3RlZEluZGV4KHJvb3RUTm9kZS5pbmRleCk7XG5cbiAgICBjb25zdCByb290VFZpZXcgPSByb290TFZpZXdbVFZJRVddO1xuICAgIHJlZ2lzdGVySG9zdEJpbmRpbmdPcENvZGVzKFxuICAgICAgICByb290VFZpZXcsIHJvb3RUTm9kZSwgcm9vdExWaWV3LCByb290VE5vZGUuZGlyZWN0aXZlU3RhcnQsIHJvb3RUTm9kZS5kaXJlY3RpdmVFbmQsXG4gICAgICAgIGNvbXBvbmVudERlZik7XG5cbiAgICBpbnZva2VIb3N0QmluZGluZ3NJbkNyZWF0aW9uTW9kZShjb21wb25lbnREZWYsIGNvbXBvbmVudCk7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm9vdENvbnRleHQoXG4gICAgc2NoZWR1bGVyPzogKHdvcmtGbjogKCkgPT4gdm9pZCkgPT4gdm9pZCwgcGxheWVySGFuZGxlcj86IFBsYXllckhhbmRsZXJ8bnVsbCk6IFJvb3RDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBzY2hlZHVsZXI6IHNjaGVkdWxlciB8fCBkZWZhdWx0U2NoZWR1bGVyLFxuICAgIGNsZWFuOiBDTEVBTl9QUk9NSVNFLFxuICAgIHBsYXllckhhbmRsZXI6IHBsYXllckhhbmRsZXIgfHwgbnVsbCxcbiAgICBmbGFnczogUm9vdENvbnRleHRGbGFncy5FbXB0eVxuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgdG8gZW5hYmxlIGxpZmVjeWNsZSBob29rcyBvbiB0aGUgcm9vdCBjb21wb25lbnQuXG4gKlxuICogSW5jbHVkZSB0aGlzIGZlYXR1cmUgd2hlbiBjYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIGlmIHRoZSByb290IGNvbXBvbmVudFxuICogeW91IGFyZSByZW5kZXJpbmcgaGFzIGxpZmVjeWNsZSBob29rcyBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBob29rcyB3b24ndFxuICogYmUgY2FsbGVkIHByb3Blcmx5LlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiByZW5kZXJDb21wb25lbnQoQXBwQ29tcG9uZW50LCB7aG9zdEZlYXR1cmVzOiBbTGlmZWN5Y2xlSG9va3NGZWF0dXJlXX0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMaWZlY3ljbGVIb29rc0ZlYXR1cmUoKTogdm9pZCB7XG4gIGNvbnN0IHROb2RlID0gZ2V0Q3VycmVudFROb2RlKCkhO1xuICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ1ROb2RlIGlzIHJlcXVpcmVkJyk7XG4gIHJlZ2lzdGVyUG9zdE9yZGVySG9va3MoZ2V0TFZpZXcoKVtUVklFV10sIHROb2RlKTtcbn1cblxuLyoqXG4gKiBXYWl0IG9uIGNvbXBvbmVudCB1bnRpbCBpdCBpcyByZW5kZXJlZC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBgUHJvbWlzZWAgd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgY29tcG9uZW50J3NcbiAqIGNoYW5nZSBkZXRlY3Rpb24gaXMgZXhlY3V0ZWQuIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBmaW5kaW5nIHRoZSBzY2hlZHVsZXJcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgYGNvbXBvbmVudGAncyByZW5kZXIgdHJlZSBhbmQgd2FpdGluZyB1bnRpbCB0aGUgc2NoZWR1bGVyXG4gKiBmbHVzaGVzLiBJZiBub3RoaW5nIGlzIHNjaGVkdWxlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIGF3YWl0IHdoZW5SZW5kZXJlZChteUNvbXBvbmVudCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0byB3YWl0IHVwb25cbiAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbmRlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlbmRlcmVkKGNvbXBvbmVudDogYW55KTogUHJvbWlzZTxudWxsPiB7XG4gIHJldHVybiBnZXRSb290Q29udGV4dChjb21wb25lbnQpLmNsZWFuO1xufVxuIl19
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFzQixlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUl2RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUksU0FBa0IsRUFBRSxPQUt0RDtJQUNDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFFLENBQUM7SUFDakQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDakIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFvQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFJLFNBQWtCO0lBQ3hELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRS9CLE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUksWUFBWSxDQUFDLENBQUM7SUFDdEQsT0FBTztRQUNMLElBQUksUUFBUTtZQUNWLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxJQUFJO1lBQ04sT0FBTyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksT0FBTztZQUNULE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxrQkFBa0I7WUFDcEIsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksWUFBWTtZQUNkLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNqQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnLi4vZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtFbnZpcm9ubWVudEluamVjdG9yLCBnZXROdWxsSW5qZWN0b3J9IGZyb20gJy4uL2RpL3IzX2luamVjdG9yJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnLi4vaW50ZXJmYWNlL3R5cGUnO1xuaW1wb3J0IHtDb21wb25lbnRSZWZ9IGZyb20gJy4uL2xpbmtlci9jb21wb25lbnRfZmFjdG9yeSc7XG5cbmltcG9ydCB7Q29tcG9uZW50RmFjdG9yeX0gZnJvbSAnLi9jb21wb25lbnRfcmVmJztcbmltcG9ydCB7Z2V0Q29tcG9uZW50RGVmfSBmcm9tICcuL2RlZmluaXRpb24nO1xuaW1wb3J0IHthc3NlcnRDb21wb25lbnREZWZ9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYENvbXBvbmVudFJlZmAgaW5zdGFuY2UgYmFzZWQgb24gcHJvdmlkZWQgY29tcG9uZW50IHR5cGUgYW5kIGEgc2V0IG9mIG9wdGlvbnMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgaG93IHRoZSBgY3JlYXRlQ29tcG9uZW50YCBmdW5jdGlvbiBjYW4gYmUgdXNlZFxuICogdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50UmVmIGR5bmFtaWNhbGx5IGFuZCBhdHRhY2ggaXQgdG8gYW4gQXBwbGljYXRpb25SZWYsXG4gKiBzbyB0aGF0IGl0IGdldHMgaW5jbHVkZWQgaW50byBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlcy5cbiAqXG4gKiBOb3RlOiB0aGUgZXhhbXBsZSB1c2VzIHN0YW5kYWxvbmUgY29tcG9uZW50cywgYnV0IHRoZSBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIGZvclxuICogbm9uLXN0YW5kYWxvbmUgY29tcG9uZW50cyAoZGVjbGFyZWQgaW4gYW4gTmdNb2R1bGUpIGFzIHdlbGwuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHN0YW5kYWxvbmU6IHRydWUsXG4gKiAgIHRlbXBsYXRlOiBgSGVsbG8ge3sgbmFtZSB9fSFgXG4gKiB9KVxuICogY2xhc3MgSGVsbG9Db21wb25lbnQge1xuICogICBuYW1lID0gJ0FuZ3VsYXInO1xuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzdGFuZGFsb25lOiB0cnVlLFxuICogICB0ZW1wbGF0ZTogYDxkaXYgaWQ9XCJoZWxsby1jb21wb25lbnQtaG9zdFwiPjwvZGl2PmBcbiAqIH0pXG4gKiBjbGFzcyBSb290Q29tcG9uZW50IHt9XG4gKlxuICogLy8gQm9vdHN0cmFwIGFuIGFwcGxpY2F0aW9uLlxuICogY29uc3QgYXBwbGljYXRpb25SZWYgPSBhd2FpdCBib290c3RyYXBBcHBsaWNhdGlvbihSb290Q29tcG9uZW50KTtcbiAqXG4gKiAvLyBMb2NhdGUgYSBET00gbm9kZSB0aGF0IHdvdWxkIGJlIHVzZWQgYXMgYSBob3N0LlxuICogY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWxsby1jb21wb25lbnQtaG9zdCcpO1xuICpcbiAqIC8vIEdldCBhbiBgRW52aXJvbm1lbnRJbmplY3RvcmAgaW5zdGFuY2UgZnJvbSB0aGUgYEFwcGxpY2F0aW9uUmVmYC5cbiAqIGNvbnN0IGVudmlyb25tZW50SW5qZWN0b3IgPSBhcHBsaWNhdGlvblJlZi5pbmplY3RvcjtcbiAqXG4gKiAvLyBXZSBjYW4gbm93IGNyZWF0ZSBhIGBDb21wb25lbnRSZWZgIGluc3RhbmNlLlxuICogY29uc3QgY29tcG9uZW50UmVmID0gY3JlYXRlQ29tcG9uZW50KEhlbGxvQ29tcG9uZW50LCB7aG9zdCwgZW52aXJvbm1lbnRJbmplY3Rvcn0pO1xuICpcbiAqIC8vIExhc3Qgc3RlcCBpcyB0byByZWdpc3RlciB0aGUgbmV3bHkgY3JlYXRlZCByZWYgdXNpbmcgdGhlIGBBcHBsaWNhdGlvblJlZmAgaW5zdGFuY2VcbiAqIC8vIHRvIGluY2x1ZGUgdGhlIGNvbXBvbmVudCB2aWV3IGludG8gY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuXG4gKiBhcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCBjbGFzcyByZWZlcmVuY2UuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZXQgb2Ygb3B0aW9ucyB0byB1c2U6XG4gKiAgKiBgZW52aXJvbm1lbnRJbmplY3RvcmA6IEFuIGBFbnZpcm9ubWVudEluamVjdG9yYCBpbnN0YW5jZSB0byBiZSB1c2VkIGZvciB0aGUgY29tcG9uZW50LCBzZWVcbiAqIGFkZGl0aW9uYWwgaW5mbyBhYm91dCBpdCBhdCBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvc3RhbmRhbG9uZS1jb21wb25lbnRzI2Vudmlyb25tZW50LWluamVjdG9ycy5cbiAqICAqIGBob3N0RWxlbWVudGAgKG9wdGlvbmFsKTogQSBET00gbm9kZSB0aGF0IHNob3VsZCBhY3QgYXMgYSBob3N0IG5vZGUgZm9yIHRoZSBjb21wb25lbnQuIElmIG5vdFxuICogcHJvdmlkZWQsIEFuZ3VsYXIgY3JlYXRlcyBvbmUgYmFzZWQgb24gdGhlIHRhZyBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudCBzZWxlY3RvciAoYW5kIGZhbGxzXG4gKiBiYWNrIHRvIHVzaW5nIGBkaXZgIGlmIHNlbGVjdG9yIGRvZXNuJ3QgaGF2ZSB0YWcgbmFtZSBpbmZvKS5cbiAqICAqIGBlbGVtZW50SW5qZWN0b3JgIChvcHRpb25hbCk6IEFuIGBFbGVtZW50SW5qZWN0b3JgIGluc3RhbmNlLCBzZWUgYWRkaXRpb25hbCBpbmZvIGFib3V0IGl0IGF0XG4gKiBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaGllcmFyY2hpY2FsLWRlcGVuZGVuY3ktaW5qZWN0aW9uI2VsZW1lbnRpbmplY3Rvci5cbiAqICAqIGBwcm9qZWN0YWJsZU5vZGVzYCAob3B0aW9uYWwpOiBBIGxpc3Qgb2YgRE9NIG5vZGVzIHRoYXQgc2hvdWxkIGJlIHByb2plY3RlZCB0aHJvdWdoXG4gKiAgICAgICAgICAgICAgICAgICAgICBbYDxuZy1jb250ZW50PmBdKGFwaS9jb3JlL25nLWNvbnRlbnQpIG9mIHRoZSBuZXcgY29tcG9uZW50IGluc3RhbmNlLlxuICogQHJldHVybnMgQ29tcG9uZW50UmVmIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyBhIGdpdmVuIENvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQ8Qz4oY29tcG9uZW50OiBUeXBlPEM+LCBvcHRpb25zOiB7XG4gIGVudmlyb25tZW50SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gIGhvc3RFbGVtZW50PzogRWxlbWVudCxcbiAgZWxlbWVudEluamVjdG9yPzogSW5qZWN0b3IsXG4gIHByb2plY3RhYmxlTm9kZXM/OiBOb2RlW11bXSxcbn0pOiBDb21wb25lbnRSZWY8Qz4ge1xuICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Q29tcG9uZW50RGVmKGNvbXBvbmVudCk7XG4gIGNvbnN0IGNvbXBvbmVudERlZiA9IGdldENvbXBvbmVudERlZihjb21wb25lbnQpITtcbiAgY29uc3QgZWxlbWVudEluamVjdG9yID0gb3B0aW9ucy5lbGVtZW50SW5qZWN0b3IgfHwgZ2V0TnVsbEluamVjdG9yKCk7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQ29tcG9uZW50RmFjdG9yeTxDPihjb21wb25lbnREZWYpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoXG4gICAgICBlbGVtZW50SW5qZWN0b3IsIG9wdGlvbnMucHJvamVjdGFibGVOb2Rlcywgb3B0aW9ucy5ob3N0RWxlbWVudCwgb3B0aW9ucy5lbnZpcm9ubWVudEluamVjdG9yKTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgdGhlIHN1YnNldCBvZiBjb21wb25lbnQgbWV0YWRhdGFcbiAqIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgYHJlZmxlY3RDb21wb25lbnRUeXBlYCBmdW5jdGlvbi5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50TWlycm9yPEM+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQncyBIVE1MIHNlbGVjdG9yLlxuICAgKi9cbiAgZ2V0IHNlbGVjdG9yKCk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0aGUgZmFjdG9yeSB3aWxsIGNyZWF0ZS5cbiAgICovXG4gIGdldCB0eXBlKCk6IFR5cGU8Qz47XG4gIC8qKlxuICAgKiBUaGUgaW5wdXRzIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBnZXQgaW5wdXRzKCk6IFJlYWRvbmx5QXJyYXk8e3JlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmcsIHJlYWRvbmx5IHRlbXBsYXRlTmFtZTogc3RyaW5nfT47XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogUmVhZG9ubHlBcnJheTx7cmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZywgcmVhZG9ubHkgdGVtcGxhdGVOYW1lOiBzdHJpbmd9PjtcbiAgLyoqXG4gICAqIFNlbGVjdG9yIGZvciBhbGwgPG5nLWNvbnRlbnQ+IGVsZW1lbnRzIGluIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBnZXQgbmdDb250ZW50U2VsZWN0b3JzKCk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb21wb25lbnQgaXMgbWFya2VkIGFzIHN0YW5kYWxvbmUuXG4gICAqIE5vdGU6IGFuIGV4dHJhIGZsYWcsIG5vdCBwcmVzZW50IGluIGBDb21wb25lbnRGYWN0b3J5YC5cbiAgICovXG4gIGdldCBpc1N0YW5kYWxvbmUoKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFsbG93cyB0byByZXRyaWV2ZSBjb21wb25lbnQgbWV0YWRhdGEuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgZnVuY3Rpb24gYW5kIGhvdyB0aGUgZmllbGRzXG4gKiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IG1hcCB0byB0aGUgY29tcG9uZW50IG1ldGFkYXRhLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzdGFuZGFsb25lOiB0cnVlLFxuICogICBzZWxlY3RvcjogJ2Zvby1jb21wb25lbnQnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAqICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjb250ZW50LXNlbGVjdG9yLWFcIj48L25nLWNvbnRlbnQ+XG4gKiAgIGAsXG4gKiB9KVxuICogY2xhc3MgRm9vQ29tcG9uZW50IHtcbiAqICAgQElucHV0KCdpbnB1dE5hbWUnKSBpbnB1dFByb3BOYW1lOiBzdHJpbmc7XG4gKiAgIEBPdXRwdXQoJ291dHB1dE5hbWUnKSBvdXRwdXRQcm9wTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAqIH1cbiAqXG4gKiBjb25zdCBtaXJyb3IgPSByZWZsZWN0Q29tcG9uZW50VHlwZShGb29Db21wb25lbnQpO1xuICogZXhwZWN0KG1pcnJvci50eXBlKS50b0JlKEZvb0NvbXBvbmVudCk7XG4gKiBleHBlY3QobWlycm9yLnNlbGVjdG9yKS50b0JlKCdmb28tY29tcG9uZW50Jyk7XG4gKiBleHBlY3QobWlycm9yLmlzU3RhbmRhbG9uZSkudG9CZSh0cnVlKTtcbiAqIGV4cGVjdChtaXJyb3IuaW5wdXRzKS50b0VxdWFsKFt7cHJvcE5hbWU6ICdpbnB1dE5hbWUnLCB0ZW1wbGF0ZU5hbWU6ICdpbnB1dFByb3BOYW1lJ31dKTtcbiAqIGV4cGVjdChtaXJyb3Iub3V0cHV0cykudG9FcXVhbChbe3Byb3BOYW1lOiAnb3V0cHV0TmFtZScsIHRlbXBsYXRlTmFtZTogJ291dHB1dFByb3BOYW1lJ31dKTtcbiAqIGV4cGVjdChtaXJyb3IubmdDb250ZW50U2VsZWN0b3JzKS50b0VxdWFsKFtcbiAqICAgJyonLCAgICAgICAgICAgICAgICAgLy8gZmlyc3QgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZSwgdGhlIHNlbGVjdG9yIGRlZmF1bHRzIHRvIGAqYFxuICogICAnY29udGVudC1zZWxlY3Rvci1hJyAvLyBzZWNvbmQgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZVxuICogXSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCBjbGFzcyByZWZlcmVuY2UuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgdGhhdCBhbGxvd3MgdG8gcmV0cmlldmUgY29tcG9uZW50IG1ldGFkYXRhLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3RDb21wb25lbnRUeXBlPEM+KGNvbXBvbmVudDogVHlwZTxDPik6IENvbXBvbmVudE1pcnJvcjxDPnxudWxsIHtcbiAgY29uc3QgY29tcG9uZW50RGVmID0gZ2V0Q29tcG9uZW50RGVmKGNvbXBvbmVudCk7XG4gIGlmICghY29tcG9uZW50RGVmKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IENvbXBvbmVudEZhY3Rvcnk8Qz4oY29tcG9uZW50RGVmKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQgc2VsZWN0b3IoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBmYWN0b3J5LnNlbGVjdG9yO1xuICAgIH0sXG4gICAgZ2V0IHR5cGUoKTogVHlwZTxDPiB7XG4gICAgICByZXR1cm4gZmFjdG9yeS5jb21wb25lbnRUeXBlO1xuICAgIH0sXG4gICAgZ2V0IGlucHV0cygpOiBSZWFkb25seUFycmF5PHtwcm9wTmFtZTogc3RyaW5nLCB0ZW1wbGF0ZU5hbWU6IHN0cmluZ30+IHtcbiAgICAgIHJldHVybiBmYWN0b3J5LmlucHV0cztcbiAgICB9LFxuICAgIGdldCBvdXRwdXRzKCk6IFJlYWRvbmx5QXJyYXk8e3Byb3BOYW1lOiBzdHJpbmcsIHRlbXBsYXRlTmFtZTogc3RyaW5nfT4ge1xuICAgICAgcmV0dXJuIGZhY3Rvcnkub3V0cHV0cztcbiAgICB9LFxuICAgIGdldCBuZ0NvbnRlbnRTZWxlY3RvcnMoKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHtcbiAgICAgIHJldHVybiBmYWN0b3J5Lm5nQ29udGVudFNlbGVjdG9ycztcbiAgICB9LFxuICAgIGdldCBpc1N0YW5kYWxvbmUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gY29tcG9uZW50RGVmLnN0YW5kYWxvbmU7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==