@skyux/popovers 5.0.2 → 5.5.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.
- package/README.md +6 -4
- package/bundles/skyux-popovers-testing.umd.js +8 -8
- package/bundles/skyux-popovers.umd.js +43 -39
- package/documentation.json +241 -44
- package/esm2015/index.js +23 -0
- package/esm2015/index.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown-button.component.js +14 -0
- package/esm2015/lib/modules/dropdown/dropdown-button.component.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown-extensions.js +14 -0
- package/esm2015/lib/modules/dropdown/dropdown-extensions.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown-item.component.js +72 -0
- package/esm2015/lib/modules/dropdown/dropdown-item.component.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown-menu.component.js +307 -0
- package/esm2015/lib/modules/dropdown/dropdown-menu.component.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown.component.js +360 -0
- package/esm2015/lib/modules/dropdown/dropdown.component.js.map +1 -0
- package/esm2015/lib/modules/dropdown/dropdown.module.js +60 -0
- package/esm2015/lib/modules/dropdown/dropdown.module.js.map +1 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js +2 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js.map +1 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js +2 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js.map +1 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js +37 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js.map +1 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-message.js +2 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-message.js.map +1 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js +2 -0
- package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-adapter.service.js +74 -0
- package/esm2015/lib/modules/popover/popover-adapter.service.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-animation-state.js +2 -0
- package/esm2015/lib/modules/popover/popover-animation-state.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-animation.js +19 -0
- package/esm2015/lib/modules/popover/popover-animation.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-content.component.js +268 -0
- package/esm2015/lib/modules/popover/popover-content.component.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-context.js +10 -0
- package/esm2015/lib/modules/popover/popover-context.js.map +1 -0
- package/esm2015/lib/modules/popover/popover-extensions.js +29 -0
- package/esm2015/lib/modules/popover/popover-extensions.js.map +1 -0
- package/esm2015/lib/modules/popover/popover.component.js +203 -0
- package/esm2015/lib/modules/popover/popover.component.js.map +1 -0
- package/esm2015/lib/modules/popover/popover.directive.js +176 -0
- package/esm2015/lib/modules/popover/popover.directive.js.map +1 -0
- package/esm2015/lib/modules/popover/popover.module.js +56 -0
- package/esm2015/lib/modules/popover/popover.module.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-adapter-elements.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-adapter-elements.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-alignment.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-alignment.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-message-type.js +24 -0
- package/esm2015/lib/modules/popover/types/popover-message-type.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-message.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-message.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-placement.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-placement.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-position.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-position.js.map +1 -0
- package/esm2015/lib/modules/popover/types/popover-trigger.js +2 -0
- package/esm2015/lib/modules/popover/types/popover-trigger.js.map +1 -0
- package/esm2015/lib/modules/shared/sky-popovers-resources.module.js +47 -0
- package/esm2015/lib/modules/shared/sky-popovers-resources.module.js.map +1 -0
- package/esm2015/skyux-popovers.js +2 -2
- package/esm2015/skyux-popovers.js.map +1 -0
- package/esm2015/testing/dropdown/dropdown-fixture.js +1 -1
- package/esm2015/testing/dropdown/dropdown-fixture.js.map +1 -0
- package/esm2015/testing/dropdown/dropdown-testing.module.js +5 -5
- package/esm2015/testing/dropdown/dropdown-testing.module.js.map +1 -0
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js +1 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js.map +1 -0
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js +1 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js.map +1 -0
- package/esm2015/testing/dropdown/popovers-fixture-dropdown.js +1 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown.js.map +1 -0
- package/esm2015/testing/popover/popover-fixture.js +1 -1
- package/esm2015/testing/popover/popover-fixture.js.map +1 -0
- package/esm2015/testing/popover/popover-testing.module.js +5 -5
- package/esm2015/testing/popover/popover-testing.module.js.map +1 -0
- package/esm2015/testing/public-api.js +1 -1
- package/esm2015/testing/public-api.js.map +1 -0
- package/esm2015/testing/skyux-popovers-testing.js +1 -1
- package/esm2015/testing/skyux-popovers-testing.js.map +1 -0
- package/fesm2015/skyux-popovers-testing.js +8 -8
- package/fesm2015/skyux-popovers-testing.js.map +1 -1
- package/fesm2015/skyux-popovers.js +53 -49
- package/fesm2015/skyux-popovers.js.map +1 -1
- package/index.d.ts +20 -0
- package/{modules → lib/modules}/dropdown/dropdown-button.component.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/dropdown-extensions.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/dropdown-item.component.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/dropdown-menu.component.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/dropdown.component.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/dropdown.module.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/types/dropdown-horizontal-alignment.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/types/dropdown-menu-change.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/types/dropdown-message-type.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/types/dropdown-message.d.ts +0 -0
- package/{modules → lib/modules}/dropdown/types/dropdown-trigger-type.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-adapter.service.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-animation-state.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-animation.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-content.component.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-context.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover-extensions.d.ts +0 -0
- package/{modules → lib/modules}/popover/popover.component.d.ts +4 -1
- package/{modules → lib/modules}/popover/popover.directive.d.ts +2 -0
- package/{modules → lib/modules}/popover/popover.module.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-adapter-arrow-coordinates.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-adapter-elements.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-alignment.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-message-type.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-message.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-placement.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-position.d.ts +0 -0
- package/{modules → lib/modules}/popover/types/popover-trigger.d.ts +0 -0
- package/{modules → lib/modules}/shared/sky-popovers-resources.module.d.ts +0 -0
- package/package.json +23 -9
- package/skyux-popovers.d.ts +1 -1
- package/LICENSE +0 -21
- package/esm2015/modules/dropdown/dropdown-button.component.js +0 -14
- package/esm2015/modules/dropdown/dropdown-extensions.js +0 -14
- package/esm2015/modules/dropdown/dropdown-item.component.js +0 -72
- package/esm2015/modules/dropdown/dropdown-menu.component.js +0 -306
- package/esm2015/modules/dropdown/dropdown.component.js +0 -357
- package/esm2015/modules/dropdown/dropdown.module.js +0 -60
- package/esm2015/modules/dropdown/types/dropdown-horizontal-alignment.js +0 -2
- package/esm2015/modules/dropdown/types/dropdown-menu-change.js +0 -2
- package/esm2015/modules/dropdown/types/dropdown-message-type.js +0 -37
- package/esm2015/modules/dropdown/types/dropdown-message.js +0 -2
- package/esm2015/modules/dropdown/types/dropdown-trigger-type.js +0 -2
- package/esm2015/modules/popover/popover-adapter.service.js +0 -74
- package/esm2015/modules/popover/popover-animation-state.js +0 -2
- package/esm2015/modules/popover/popover-animation.js +0 -19
- package/esm2015/modules/popover/popover-content.component.js +0 -266
- package/esm2015/modules/popover/popover-context.js +0 -10
- package/esm2015/modules/popover/popover-extensions.js +0 -29
- package/esm2015/modules/popover/popover.component.js +0 -200
- package/esm2015/modules/popover/popover.directive.js +0 -175
- package/esm2015/modules/popover/popover.module.js +0 -56
- package/esm2015/modules/popover/types/popover-adapter-arrow-coordinates.js +0 -2
- package/esm2015/modules/popover/types/popover-adapter-elements.js +0 -2
- package/esm2015/modules/popover/types/popover-alignment.js +0 -2
- package/esm2015/modules/popover/types/popover-message-type.js +0 -24
- package/esm2015/modules/popover/types/popover-message.js +0 -2
- package/esm2015/modules/popover/types/popover-placement.js +0 -2
- package/esm2015/modules/popover/types/popover-position.js +0 -2
- package/esm2015/modules/popover/types/popover-trigger.js +0 -2
- package/esm2015/modules/shared/sky-popovers-resources.module.js +0 -47
- package/esm2015/public-api.js +0 -23
- package/public-api.d.ts +0 -20
|
@@ -15,6 +15,7 @@ export declare class SkyPopoverDirective implements OnInit, OnDestroy {
|
|
|
15
15
|
skyPopover: SkyPopoverComponent;
|
|
16
16
|
/**
|
|
17
17
|
* Specifies the horizontal alignment of the popover in relation to the trigger element.
|
|
18
|
+
* Options include:`"center"`, `"right"`, and `"left"`.
|
|
18
19
|
* @default "center"
|
|
19
20
|
*/
|
|
20
21
|
skyPopoverAlignment: SkyPopoverAlignment;
|
|
@@ -24,6 +25,7 @@ export declare class SkyPopoverDirective implements OnInit, OnDestroy {
|
|
|
24
25
|
skyPopoverMessageStream: Subject<SkyPopoverMessage>;
|
|
25
26
|
/**
|
|
26
27
|
* Specifies the placement of the popover in relation to the trigger element.
|
|
28
|
+
* Options include:`"above"`, `"below"`, `"right"`, and `"left"`.
|
|
27
29
|
* @default "above"
|
|
28
30
|
*/
|
|
29
31
|
skyPopoverPlacement: SkyPopoverPlacement;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skyux/popovers",
|
|
3
|
-
"version": "5.0
|
|
3
|
+
"version": "5.5.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/animations": "^12.2.
|
|
6
|
-
"@angular/common": "^12.2.
|
|
7
|
-
"@angular/core": "^12.2.
|
|
8
|
-
"@angular/platform-browser": "^12.2.
|
|
9
|
-
"@skyux/core": "
|
|
10
|
-
"@skyux/i18n": "
|
|
11
|
-
"@skyux/indicators": "
|
|
12
|
-
"@skyux/theme": "
|
|
5
|
+
"@angular/animations": "^12.2.16",
|
|
6
|
+
"@angular/common": "^12.2.16",
|
|
7
|
+
"@angular/core": "^12.2.16",
|
|
8
|
+
"@angular/platform-browser": "^12.2.16",
|
|
9
|
+
"@skyux/core": "5.5.0",
|
|
10
|
+
"@skyux/i18n": "5.5.0",
|
|
11
|
+
"@skyux/indicators": "5.5.0",
|
|
12
|
+
"@skyux/theme": "5.5.0"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"tslib": "^2.3.1"
|
|
16
16
|
},
|
|
17
|
+
"author": "Blackbaud, Inc.",
|
|
18
|
+
"keywords": [
|
|
19
|
+
"blackbaud",
|
|
20
|
+
"skyux"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/blackbaud/skyux.git"
|
|
26
|
+
},
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/blackbaud/skyux/issues"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://github.com/blackbaud/skyux#readme",
|
|
17
31
|
"main": "bundles/skyux-popovers.umd.js",
|
|
18
32
|
"module": "fesm2015/skyux-popovers.js",
|
|
19
33
|
"es2015": "fesm2015/skyux-popovers.js",
|
package/skyux-popovers.d.ts
CHANGED
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
The MIT License (MIT)
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2020 Blackbaud
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class SkyDropdownButtonComponent {
|
|
4
|
-
}
|
|
5
|
-
SkyDropdownButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6
|
-
SkyDropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" });
|
|
7
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
|
|
8
|
-
type: Component,
|
|
9
|
-
args: [{
|
|
10
|
-
selector: 'sky-dropdown-button',
|
|
11
|
-
templateUrl: './dropdown-button.component.html',
|
|
12
|
-
}]
|
|
13
|
-
}] });
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNMUMsTUFBTSxPQUFPLDBCQUEwQjs7d0hBQTFCLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDJEQ052Qyw2QkFDQTs0RkRLYSwwQkFBMEI7a0JBSnRDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsV0FBVyxFQUFFLGtDQUFrQztpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEcm9wZG93bkJ1dHRvbkNvbXBvbmVudCB7fVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export function parseAffixHorizontalAlignment(alignment) {
|
|
2
|
-
switch (alignment) {
|
|
3
|
-
case 'center':
|
|
4
|
-
return 'center';
|
|
5
|
-
case 'left':
|
|
6
|
-
return 'left';
|
|
7
|
-
case 'right':
|
|
8
|
-
return 'right';
|
|
9
|
-
/* istanbul ignore next */
|
|
10
|
-
default:
|
|
11
|
-
throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWV4dGVuc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxTQUF5QztJQUV6QyxRQUFRLFNBQVMsRUFBRTtRQUNqQixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLE1BQU0sQ0FBQztRQUNoQixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQztRQUNqQiwwQkFBMEI7UUFDMUI7WUFDRSxNQUFNLG1FQUFtRSxTQUFTLElBQUksQ0FBQztLQUMxRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7IFNreURyb3Bkb3duSG9yaXpvbnRhbEFsaWdubWVudCB9IGZyb20gJy4vdHlwZXMvZHJvcGRvd24taG9yaXpvbnRhbC1hbGlnbm1lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBZmZpeEhvcml6b250YWxBbGlnbm1lbnQoXG4gIGFsaWdubWVudDogU2t5RHJvcGRvd25Ib3Jpem9udGFsQWxpZ25tZW50XG4pOiBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQge1xuICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGBTa3lBZmZpeEhvcml6b250YWxBbGlnbm1lbnQgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIHZhbHVlIGZvciAnJHthbGlnbm1lbnR9JyFgO1xuICB9XG59XG4iXX0=
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
export class SkyDropdownItemComponent {
|
|
5
|
-
constructor(elementRef, changeDetector, renderer) {
|
|
6
|
-
this.elementRef = elementRef;
|
|
7
|
-
this.changeDetector = changeDetector;
|
|
8
|
-
this.renderer = renderer;
|
|
9
|
-
this.isActive = false;
|
|
10
|
-
this.isDisabled = false;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Specifies an ARIA role for the dropdown menu item
|
|
14
|
-
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
15
|
-
* by indicating how the item functions and what it controls. For information about
|
|
16
|
-
* how an ARIA role indicates what an item represents on a web page, see the
|
|
17
|
-
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
|
|
18
|
-
* @default "menuitem"
|
|
19
|
-
*/
|
|
20
|
-
set ariaRole(value) {
|
|
21
|
-
this._ariaRole = value;
|
|
22
|
-
}
|
|
23
|
-
get ariaRole() {
|
|
24
|
-
return this._ariaRole || 'menuitem';
|
|
25
|
-
}
|
|
26
|
-
get buttonElement() {
|
|
27
|
-
return this.elementRef.nativeElement.querySelector('button,a');
|
|
28
|
-
}
|
|
29
|
-
ngAfterViewInit() {
|
|
30
|
-
this.isDisabled = !this.isFocusable();
|
|
31
|
-
// Make sure anchor elements are tab-able.
|
|
32
|
-
const buttonElement = this.buttonElement;
|
|
33
|
-
/* istanbul ignore else */
|
|
34
|
-
if (buttonElement) {
|
|
35
|
-
this.renderer.setAttribute(buttonElement, 'tabIndex', '0');
|
|
36
|
-
}
|
|
37
|
-
this.changeDetector.detectChanges();
|
|
38
|
-
}
|
|
39
|
-
focusElement(enableNativeFocus) {
|
|
40
|
-
this.isActive = true;
|
|
41
|
-
if (enableNativeFocus) {
|
|
42
|
-
this.buttonElement.focus();
|
|
43
|
-
}
|
|
44
|
-
this.changeDetector.detectChanges();
|
|
45
|
-
}
|
|
46
|
-
isFocusable() {
|
|
47
|
-
/*tslint:disable no-null-keyword */
|
|
48
|
-
const isFocusable = this.buttonElement &&
|
|
49
|
-
this.buttonElement.getAttribute('disabled') === null;
|
|
50
|
-
/*tslint:enable */
|
|
51
|
-
return isFocusable;
|
|
52
|
-
}
|
|
53
|
-
resetState() {
|
|
54
|
-
this.isActive = false;
|
|
55
|
-
this.changeDetector.markForCheck();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
SkyDropdownItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
-
SkyDropdownItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyDropdownItemComponent, selector: "sky-dropdown-item", inputs: { ariaRole: "ariaRole" }, ngImport: i0, template: "<div\n class=\"sky-dropdown-item\"\n [attr.role]=\"ariaRole\"\n [ngClass]=\"{\n 'sky-dropdown-item-active': isActive,\n 'sky-dropdown-item-disabled': isDisabled\n }\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left}.sky-dropdown-item.sky-dropdown-item-active,.sky-dropdown-item:hover{background-color:#eeeeef}.sky-dropdown-item.sky-dropdown-item-disabled{cursor:default}.sky-dropdown-item.sky-dropdown-item-disabled:hover{background-color:transparent}.sky-dropdown-item>a,.sky-dropdown-item>button{background-color:transparent;border:none;color:#212327;cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-dropdown-item>a:hover,.sky-dropdown-item>button:hover{text-decoration:none}.sky-dropdown-item>a[disabled],.sky-dropdown-item>button[disabled]{color:#686c73}.sky-dropdown-item>a[disabled]:hover,.sky-dropdown-item>button[disabled]:hover{cursor:default}.sky-theme-modern .sky-dropdown-item{margin:0}.sky-theme-modern .sky-dropdown-item.sky-dropdown-item-active,.sky-theme-modern .sky-dropdown-item:hover{background-color:transparent}.sky-theme-modern .sky-dropdown-item>a,.sky-theme-modern .sky-dropdown-item>button{padding:8px 20px;transition:box-shadow .15s}.sky-theme-modern .sky-dropdown-item>a:hover,.sky-theme-modern .sky-dropdown-item>button:hover{outline:solid 1px #1870B8;outline-offset:-1px}.sky-theme-modern .sky-dropdown-item>a:focus,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>a,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>button{color:#fbfcfe}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
60
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownItemComponent, decorators: [{
|
|
61
|
-
type: Component,
|
|
62
|
-
args: [{
|
|
63
|
-
selector: 'sky-dropdown-item',
|
|
64
|
-
templateUrl: './dropdown-item.component.html',
|
|
65
|
-
styleUrls: ['./dropdown-item.component.scss'],
|
|
66
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
67
|
-
encapsulation: ViewEncapsulation.None,
|
|
68
|
-
}]
|
|
69
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { ariaRole: [{
|
|
70
|
-
type: Input
|
|
71
|
-
}] } });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsS0FBSyxFQUVMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBU3ZCLE1BQU0sT0FBTyx3QkFBd0I7SUE0Qm5DLFlBQ1MsVUFBc0IsRUFDckIsY0FBaUMsRUFDakMsUUFBbUI7UUFGcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVR0QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGVBQVUsR0FBRyxLQUFLLENBQUM7SUFRdkIsQ0FBQztJQS9CSjs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBY00sZUFBZTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXRDLDBDQUEwQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pDLDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sWUFBWSxDQUFDLGlCQUEwQjtRQUM1QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLG1DQUFtQztRQUNuQyxNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDdkQsa0JBQWtCO1FBQ2xCLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztzSEFyRVUsd0JBQXdCOzBHQUF4Qix3QkFBd0IsMkZDbEJyQyw2TkFVQTs0RkRRYSx3QkFBd0I7a0JBUHBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7b0JBQzdDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7eUpBV1ksUUFBUTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1kcm9wZG93bi1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBBUklBIHJvbGUgZm9yIHRoZSBkcm9wZG93biBtZW51IGl0ZW1cbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KVxuICAgKiBieSBpbmRpY2F0aW5nIGhvdyB0aGUgaXRlbSBmdW5jdGlvbnMgYW5kIHdoYXQgaXQgY29udHJvbHMuIEZvciBpbmZvcm1hdGlvbiBhYm91dFxuICAgKiBob3cgYW4gQVJJQSByb2xlIGluZGljYXRlcyB3aGF0IGFuIGl0ZW0gcmVwcmVzZW50cyBvbiBhIHdlYiBwYWdlLCBzZWUgdGhlXG4gICAqIFtXQUktQVJJQSByb2xlcyBtb2RlbF0oaHR0cHM6Ly93d3cudzMub3JnL1dBSS9QRi9hcmlhL3JvbGVzKS5cbiAgICogQGRlZmF1bHQgXCJtZW51aXRlbVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hcmlhUm9sZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhUm9sZSB8fCAnbWVudWl0ZW0nO1xuICB9XG5cbiAgcHVibGljIGdldCBidXR0b25FbGVtZW50KCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLGEnKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYXJpYVJvbGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9ICF0aGlzLmlzRm9jdXNhYmxlKCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgYW5jaG9yIGVsZW1lbnRzIGFyZSB0YWItYWJsZS5cbiAgICBjb25zdCBidXR0b25FbGVtZW50ID0gdGhpcy5idXR0b25FbGVtZW50O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvbkVsZW1lbnQsICd0YWJJbmRleCcsICcwJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNFbGVtZW50KGVuYWJsZU5hdGl2ZUZvY3VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICBpZiAoZW5hYmxlTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuYnV0dG9uRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGlzRm9jdXNhYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8qdHNsaW50OmRpc2FibGUgbm8tbnVsbC1rZXl3b3JkICovXG4gICAgY29uc3QgaXNGb2N1c2FibGUgPVxuICAgICAgdGhpcy5idXR0b25FbGVtZW50ICYmXG4gICAgICB0aGlzLmJ1dHRvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpID09PSBudWxsO1xuICAgIC8qdHNsaW50OmVuYWJsZSAqL1xuICAgIHJldHVybiBpc0ZvY3VzYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2t5LWRyb3Bkb3duLWl0ZW1cIlxuICBbYXR0ci5yb2xlXT1cImFyaWFSb2xlXCJcbiAgW25nQ2xhc3NdPVwie1xuICAgICdza3ktZHJvcGRvd24taXRlbS1hY3RpdmUnOiBpc0FjdGl2ZSxcbiAgICAnc2t5LWRyb3Bkb3duLWl0ZW0tZGlzYWJsZWQnOiBpc0Rpc2FibGVkXG4gIH1cIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { fromEvent as observableFromEvent, Subject } from 'rxjs';
|
|
3
|
-
import { takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { SkyDropdownItemComponent } from './dropdown-item.component';
|
|
5
|
-
import { SkyDropdownMessageType } from './types/dropdown-message-type';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "./dropdown.component";
|
|
8
|
-
let nextId = 0;
|
|
9
|
-
export class SkyDropdownMenuComponent {
|
|
10
|
-
constructor(changeDetector, elementRef, dropdownComponent) {
|
|
11
|
-
this.changeDetector = changeDetector;
|
|
12
|
-
this.elementRef = elementRef;
|
|
13
|
-
this.dropdownComponent = dropdownComponent;
|
|
14
|
-
/**
|
|
15
|
-
* Fires when the dropdown menu's active index or selected item changes. This event provides an
|
|
16
|
-
* observable to emit changes, and the response is of
|
|
17
|
-
* the SkyDropdownMenuChange type.
|
|
18
|
-
*/
|
|
19
|
-
this.menuChanges = new EventEmitter();
|
|
20
|
-
this.dropdownMenuId = `sky-dropdown-menu-${++nextId}`;
|
|
21
|
-
this.ngUnsubscribe = new Subject();
|
|
22
|
-
this._menuIndex = 0;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Specifies an ARIA role for the dropdown menu
|
|
26
|
-
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
27
|
-
* by indicating how the dropdown menu functions and what it controls. The dropdown button
|
|
28
|
-
* inherits this value to set its `aria-haspopup` property. For information
|
|
29
|
-
* about how an ARIA role indicates what an item represents on a web page, see the
|
|
30
|
-
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
|
|
31
|
-
* @default "menu"
|
|
32
|
-
*/
|
|
33
|
-
set ariaRole(value) {
|
|
34
|
-
this._ariaRole = value;
|
|
35
|
-
}
|
|
36
|
-
get ariaRole() {
|
|
37
|
-
return this._ariaRole || 'menu';
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Indicates whether to use the browser's native focus function when users navigate through menu
|
|
41
|
-
* items with the keyboard. To disable the native focus function, set this property to `false`.
|
|
42
|
-
* For example, to let users interact with the dropdown menu but keep the keyboard focus on a
|
|
43
|
-
* different element, set this property to `false`.
|
|
44
|
-
* @default true
|
|
45
|
-
*/
|
|
46
|
-
set useNativeFocus(value) {
|
|
47
|
-
this._useNativeFocus = value;
|
|
48
|
-
}
|
|
49
|
-
get useNativeFocus() {
|
|
50
|
-
if (this._useNativeFocus === undefined) {
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
return this._useNativeFocus;
|
|
54
|
-
}
|
|
55
|
-
get hasFocusableItems() {
|
|
56
|
-
const found = this.menuItems.find((item) => item.isFocusable());
|
|
57
|
-
return found !== undefined;
|
|
58
|
-
}
|
|
59
|
-
set menuIndex(value) {
|
|
60
|
-
if (value < 0) {
|
|
61
|
-
value = this.menuItems.length - 1;
|
|
62
|
-
}
|
|
63
|
-
if (value >= this.menuItems.length) {
|
|
64
|
-
value = 0;
|
|
65
|
-
}
|
|
66
|
-
this._menuIndex = value;
|
|
67
|
-
}
|
|
68
|
-
get menuIndex() {
|
|
69
|
-
return this._menuIndex;
|
|
70
|
-
}
|
|
71
|
-
ngAfterContentInit() {
|
|
72
|
-
/* istanbul ignore else */
|
|
73
|
-
if (this.dropdownComponent) {
|
|
74
|
-
this.dropdownComponent.menuId = this.dropdownMenuId;
|
|
75
|
-
this.dropdownComponent.menuAriaRole = this.ariaRole;
|
|
76
|
-
this.dropdownComponent.messageStream
|
|
77
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
78
|
-
.subscribe((message) => {
|
|
79
|
-
/* tslint:disable-next-line:switch-default */
|
|
80
|
-
switch (message.type) {
|
|
81
|
-
case SkyDropdownMessageType.Open:
|
|
82
|
-
case SkyDropdownMessageType.Close:
|
|
83
|
-
this.reset();
|
|
84
|
-
break;
|
|
85
|
-
case SkyDropdownMessageType.FocusFirstItem:
|
|
86
|
-
this.focusFirstItem();
|
|
87
|
-
break;
|
|
88
|
-
case SkyDropdownMessageType.FocusNextItem:
|
|
89
|
-
this.focusNextItem();
|
|
90
|
-
break;
|
|
91
|
-
case SkyDropdownMessageType.FocusPreviousItem:
|
|
92
|
-
this.focusPreviousItem();
|
|
93
|
-
break;
|
|
94
|
-
case SkyDropdownMessageType.FocusLastItem:
|
|
95
|
-
this.focusLastItem();
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
this.menuChanges
|
|
100
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
101
|
-
.subscribe((change) => {
|
|
102
|
-
// Close the dropdown when a menu item is selected.
|
|
103
|
-
if (change.selectedItem) {
|
|
104
|
-
this.sendMessage(SkyDropdownMessageType.Close);
|
|
105
|
-
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
106
|
-
}
|
|
107
|
-
if (change.items) {
|
|
108
|
-
// Update the popover style and position whenever the number of items changes.
|
|
109
|
-
this.sendMessage(SkyDropdownMessageType.Reposition);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
// Reset dropdown whenever the menu items change.
|
|
114
|
-
this.menuItems.changes
|
|
115
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
116
|
-
.subscribe((items) => {
|
|
117
|
-
this.reset();
|
|
118
|
-
this.menuChanges.emit({
|
|
119
|
-
items: items.toArray(),
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
this.addEventListeners();
|
|
123
|
-
}
|
|
124
|
-
ngOnDestroy() {
|
|
125
|
-
this.ngUnsubscribe.next();
|
|
126
|
-
this.ngUnsubscribe.complete();
|
|
127
|
-
this.ngUnsubscribe = undefined;
|
|
128
|
-
}
|
|
129
|
-
focusFirstItem() {
|
|
130
|
-
if (!this.hasFocusableItems) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
this.menuIndex = 0;
|
|
134
|
-
const firstItem = this.getItemByIndex(this.menuIndex);
|
|
135
|
-
if (firstItem && firstItem.isFocusable()) {
|
|
136
|
-
this.focusItem(firstItem);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this.focusNextItem();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
focusLastItem() {
|
|
143
|
-
if (!this.hasFocusableItems) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
this.menuIndex = this.menuItems.length - 1;
|
|
147
|
-
const lastItem = this.getItemByIndex(this.menuIndex);
|
|
148
|
-
if (lastItem && lastItem.isFocusable()) {
|
|
149
|
-
this.focusItem(lastItem);
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
this.focusPreviousItem();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
focusPreviousItem() {
|
|
156
|
-
if (!this.hasFocusableItems) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
this.menuIndex--;
|
|
160
|
-
const previousItem = this.getItemByIndex(this.menuIndex);
|
|
161
|
-
if (previousItem && previousItem.isFocusable()) {
|
|
162
|
-
this.focusItem(previousItem);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
this.focusPreviousItem();
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
focusNextItem() {
|
|
169
|
-
if (!this.hasFocusableItems) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
this.menuIndex++;
|
|
173
|
-
const nextItem = this.getItemByIndex(this.menuIndex);
|
|
174
|
-
if (nextItem && nextItem.isFocusable()) {
|
|
175
|
-
this.focusItem(nextItem);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
this.focusNextItem();
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
reset() {
|
|
182
|
-
this._menuIndex = -1;
|
|
183
|
-
this.resetItemsActiveState();
|
|
184
|
-
this.changeDetector.markForCheck();
|
|
185
|
-
}
|
|
186
|
-
resetItemsActiveState() {
|
|
187
|
-
this.menuItems.forEach((item) => {
|
|
188
|
-
item.resetState();
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
focusItem(item) {
|
|
192
|
-
this.resetItemsActiveState();
|
|
193
|
-
item.focusElement(this.useNativeFocus);
|
|
194
|
-
this.menuChanges.emit({
|
|
195
|
-
activeIndex: this.menuIndex,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
getItemByIndex(index) {
|
|
199
|
-
return this.menuItems.find((item, i) => {
|
|
200
|
-
return i === index;
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
selectItemByEventTarget(target) {
|
|
204
|
-
const selectedItem = this.menuItems.find((item, i) => {
|
|
205
|
-
const found = item.elementRef.nativeElement.contains(target);
|
|
206
|
-
if (found) {
|
|
207
|
-
this.menuIndex = i;
|
|
208
|
-
this.menuChanges.next({
|
|
209
|
-
activeIndex: this.menuIndex,
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
return found;
|
|
213
|
-
});
|
|
214
|
-
/* istanbul ignore else */
|
|
215
|
-
if (selectedItem) {
|
|
216
|
-
this.menuChanges.next({
|
|
217
|
-
selectedItem,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
sendMessage(type) {
|
|
222
|
-
this.dropdownComponent.messageStream.next({ type });
|
|
223
|
-
}
|
|
224
|
-
addEventListeners() {
|
|
225
|
-
const dropdownMenuElement = this.elementRef.nativeElement;
|
|
226
|
-
observableFromEvent(dropdownMenuElement, 'click')
|
|
227
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
228
|
-
.subscribe((event) => {
|
|
229
|
-
this.selectItemByEventTarget(event.target);
|
|
230
|
-
});
|
|
231
|
-
observableFromEvent(dropdownMenuElement, 'keydown')
|
|
232
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
233
|
-
.subscribe((event) => {
|
|
234
|
-
const key = event.key.toLowerCase();
|
|
235
|
-
/*tslint:disable-next-line:switch-default*/
|
|
236
|
-
switch (key) {
|
|
237
|
-
case 'escape':
|
|
238
|
-
this.sendMessage(SkyDropdownMessageType.Close);
|
|
239
|
-
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
240
|
-
event.stopPropagation();
|
|
241
|
-
event.preventDefault();
|
|
242
|
-
break;
|
|
243
|
-
case 'arrowdown':
|
|
244
|
-
case 'down':
|
|
245
|
-
this.focusNextItem();
|
|
246
|
-
event.preventDefault();
|
|
247
|
-
break;
|
|
248
|
-
case 'arrowup':
|
|
249
|
-
case 'up':
|
|
250
|
-
this.focusPreviousItem();
|
|
251
|
-
event.preventDefault();
|
|
252
|
-
break;
|
|
253
|
-
case 'tab':
|
|
254
|
-
if (this.dropdownComponent.dismissOnBlur) {
|
|
255
|
-
this.sendMessage(SkyDropdownMessageType.Close);
|
|
256
|
-
}
|
|
257
|
-
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
258
|
-
break;
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
observableFromEvent(dropdownMenuElement, 'mouseenter')
|
|
262
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
263
|
-
.subscribe(() => {
|
|
264
|
-
this.dropdownComponent.isMouseEnter = true;
|
|
265
|
-
});
|
|
266
|
-
observableFromEvent(dropdownMenuElement, 'mouseleave')
|
|
267
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
268
|
-
.subscribe(() => {
|
|
269
|
-
this.dropdownComponent.isMouseEnter = false;
|
|
270
|
-
// Allow the dropdown component to set isMouseEnter before checking if the close action
|
|
271
|
-
// should be taken.
|
|
272
|
-
setTimeout(() => {
|
|
273
|
-
if (this.dropdownComponent.trigger === 'hover' &&
|
|
274
|
-
this.dropdownComponent.isMouseEnter === false) {
|
|
275
|
-
this.sendMessage(SkyDropdownMessageType.Close);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
SkyDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyDropdownComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
282
|
-
SkyDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyDropdownMenuComponent, selector: "sky-dropdown-menu", inputs: { ariaLabelledBy: "ariaLabelledBy", ariaRole: "ariaRole", useNativeFocus: "useNativeFocus" }, outputs: { menuChanges: "menuChanges" }, queries: [{ propertyName: "menuItems", predicate: SkyDropdownItemComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"sky-dropdown-menu sky-shadow sky-elevation-4\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.role]=\"ariaRole\"\n [id]=\"dropdownMenuId\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-menu{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px);display:flex;flex-direction:column;background-color:#fff}.sky-dropdown-menu button{overflow:hidden;text-overflow:ellipsis}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
283
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyDropdownMenuComponent, decorators: [{
|
|
284
|
-
type: Component,
|
|
285
|
-
args: [{
|
|
286
|
-
selector: 'sky-dropdown-menu',
|
|
287
|
-
templateUrl: './dropdown-menu.component.html',
|
|
288
|
-
styleUrls: ['./dropdown-menu.component.scss'],
|
|
289
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
290
|
-
encapsulation: ViewEncapsulation.None,
|
|
291
|
-
}]
|
|
292
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyDropdownComponent, decorators: [{
|
|
293
|
-
type: Optional
|
|
294
|
-
}] }]; }, propDecorators: { ariaLabelledBy: [{
|
|
295
|
-
type: Input
|
|
296
|
-
}], ariaRole: [{
|
|
297
|
-
type: Input
|
|
298
|
-
}], useNativeFocus: [{
|
|
299
|
-
type: Input
|
|
300
|
-
}], menuChanges: [{
|
|
301
|
-
type: Output
|
|
302
|
-
}], menuItems: [{
|
|
303
|
-
type: ContentChildren,
|
|
304
|
-
args: [SkyDropdownItemComponent, { descendants: true }]
|
|
305
|
-
}] } });
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wb3BvdmVycy9zcmMvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BvcG92ZXJzL3NyYy9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBTXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUFFdkUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBU2YsTUFBTSxPQUFPLHdCQUF3QjtJQXlGbkMsWUFDVSxjQUFpQyxFQUNqQyxVQUFzQixFQUNWLGlCQUF1QztRQUZuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUE3QzdEOzs7O1dBSUc7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBRXhELG1CQUFjLEdBQVcscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7UUEwQnhELGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUk5QixlQUFVLEdBQUcsQ0FBQyxDQUFDO0lBUXBCLENBQUM7SUFwRko7Ozs7Ozs7O09BUUc7SUFDSCxJQUNXLFFBQVEsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDVyxjQUFjLENBQUMsS0FBYztRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBWUQsSUFBWSxpQkFBaUI7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsS0FBYTtRQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDbEMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNYO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQW1CTSxrQkFBa0I7UUFDdkIsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFFcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWE7aUJBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNuQyxTQUFTLENBQUMsQ0FBQyxPQUEyQixFQUFFLEVBQUU7Z0JBQ3pDLDZDQUE2QztnQkFDN0MsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFO29CQUNwQixLQUFLLHNCQUFzQixDQUFDLElBQUksQ0FBQztvQkFDakMsS0FBSyxzQkFBc0IsQ0FBQyxLQUFLO3dCQUMvQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2IsTUFBTTtvQkFFUixLQUFLLHNCQUFzQixDQUFDLGNBQWM7d0JBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTTtvQkFFUixLQUFLLHNCQUFzQixDQUFDLGFBQWE7d0JBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDckIsTUFBTTtvQkFFUixLQUFLLHNCQUFzQixDQUFDLGlCQUFpQjt3QkFDM0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQ3pCLE1BQU07b0JBRVIsS0FBSyxzQkFBc0IsQ0FBQyxhQUFhO3dCQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3JCLE1BQU07aUJBQ1Q7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVMLElBQUksQ0FBQyxXQUFXO2lCQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNuQyxTQUFTLENBQUMsQ0FBQyxNQUE2QixFQUFFLEVBQUU7Z0JBQzNDLG1EQUFtRDtnQkFDbkQsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO29CQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7aUJBQzdEO2dCQUVELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtvQkFDaEIsOEVBQThFO29CQUM5RSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNyRDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxDQUFDLEtBQTBDLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBOEIsRUFBRSxFQUFFO1lBQ3hELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBOEI7UUFDOUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBYTtRQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQ2xELE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxNQUFtQjtRQUNqRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDdEMsQ0FBQyxJQUE4QixFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU3RCxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FDRixDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixZQUFZO2FBQ2IsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLElBQTRCO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFMUQsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDO2FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDO2FBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXBDLDJDQUEyQztZQUMzQyxRQUFRLEdBQUcsRUFBRTtnQkFDWCxLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUM1RCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsTUFBTTtnQkFFUixLQUFLLFdBQVcsQ0FBQztnQkFDakIsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixNQUFNO2dCQUVSLEtBQUssU0FBUyxDQUFDO2dCQUNmLEtBQUssSUFBSTtvQkFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixNQUFNO2dCQUVSLEtBQUssS0FBSztvQkFDUixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7d0JBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hEO29CQUNELElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDNUQsTUFBTTthQUNUO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUM7YUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDO2FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25DLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUM1Qyx1RkFBdUY7WUFDdkYsbUJBQW1CO1lBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxLQUFLLE9BQU87b0JBQzFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUM3QztvQkFDQSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoRDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztzSEF2VlUsd0JBQXdCOzBHQUF4Qix3QkFBd0Isa09BOEVsQix3QkFBd0IsZ0RDckgzQywrTUFRQTs0RkQrQmEsd0JBQXdCO2tCQVBwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO29CQUM3QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDOzswQkE2RkksUUFBUTs0Q0FyRkosY0FBYztzQkFEcEIsS0FBSztnQkFhSyxRQUFRO3NCQURsQixLQUFLO2dCQWlCSyxjQUFjO3NCQUR4QixLQUFLO2dCQW1CQyxXQUFXO3NCQURqQixNQUFNO2dCQTJCQSxTQUFTO3NCQURmLGVBQWU7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50IGFzIG9ic2VydmFibGVGcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vZHJvcGRvd24uY29tcG9uZW50JztcblxuaW1wb3J0IHsgU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNreURyb3Bkb3duTWVudUNoYW5nZSB9IGZyb20gJy4vdHlwZXMvZHJvcGRvd24tbWVudS1jaGFuZ2UnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2Ryb3Bkb3duLW1lc3NhZ2UnO1xuXG5pbXBvcnQgeyBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi90eXBlcy9kcm9wZG93bi1tZXNzYWdlLXR5cGUnO1xuXG5sZXQgbmV4dElkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWRyb3Bkb3duLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreURyb3Bkb3duTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIEhUTUwgZWxlbWVudCBJRCAod2l0aG91dCB0aGUgbGVhZGluZyBgI2ApIG9mIHRoZSBlbGVtZW50IHRoYXQgbGFiZWxzXG4gICAqIHRoZSBkcm9wZG93biBtZW51LiBUaGlzIHNldHMgdGhlIGRyb3Bkb3duIG1lbnUncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gQVJJQSByb2xlIGZvciB0aGUgZHJvcGRvd24gbWVudVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpXG4gICAqIGJ5IGluZGljYXRpbmcgaG93IHRoZSBkcm9wZG93biBtZW51IGZ1bmN0aW9ucyBhbmQgd2hhdCBpdCBjb250cm9scy4gVGhlIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBpbmhlcml0cyB0aGlzIHZhbHVlIHRvIHNldCBpdHMgYGFyaWEtaGFzcG9wdXBgIHByb3BlcnR5LiBGb3IgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgaG93IGFuIEFSSUEgcm9sZSBpbmRpY2F0ZXMgd2hhdCBhbiBpdGVtIHJlcHJlc2VudHMgb24gYSB3ZWIgcGFnZSwgc2VlIHRoZVxuICAgKiBbV0FJLUFSSUEgcm9sZXMgbW9kZWxdKGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvUEYvYXJpYS9yb2xlcykuXG4gICAqIEBkZWZhdWx0IFwibWVudVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFyaWFSb2xlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hcmlhUm9sZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhUm9sZSB8fCAnbWVudSc7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBicm93c2VyJ3MgbmF0aXZlIGZvY3VzIGZ1bmN0aW9uIHdoZW4gdXNlcnMgbmF2aWdhdGUgdGhyb3VnaCBtZW51XG4gICAqIGl0ZW1zIHdpdGggdGhlIGtleWJvYXJkLiBUbyBkaXNhYmxlIHRoZSBuYXRpdmUgZm9jdXMgZnVuY3Rpb24sIHNldCB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWAuXG4gICAqIEZvciBleGFtcGxlLCB0byBsZXQgdXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGUgZHJvcGRvd24gbWVudSBidXQga2VlcCB0aGUga2V5Ym9hcmQgZm9jdXMgb24gYVxuICAgKiBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB1c2VOYXRpdmVGb2N1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3VzZU5hdGl2ZUZvY3VzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVzZU5hdGl2ZUZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl91c2VOYXRpdmVGb2N1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdXNlTmF0aXZlRm9jdXM7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgZHJvcGRvd24gbWVudSdzIGFjdGl2ZSBpbmRleCBvciBzZWxlY3RlZCBpdGVtIGNoYW5nZXMuIFRoaXMgZXZlbnQgcHJvdmlkZXMgYW5cbiAgICogb2JzZXJ2YWJsZSB0byBlbWl0IGNoYW5nZXMsIGFuZCB0aGUgcmVzcG9uc2UgaXMgb2ZcbiAgICogdGhlIFNreURyb3Bkb3duTWVudUNoYW5nZSB0eXBlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtZW51Q2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RHJvcGRvd25NZW51Q2hhbmdlPigpO1xuXG4gIHB1YmxpYyBkcm9wZG93bk1lbnVJZDogc3RyaW5nID0gYHNreS1kcm9wZG93bi1tZW51LSR7KytuZXh0SWR9YDtcblxuICBwcml2YXRlIGdldCBoYXNGb2N1c2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubWVudUl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNGb2N1c2FibGUoKSk7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1lbnVJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdmFsdWUgPSB0aGlzLm1lbnVJdGVtcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+PSB0aGlzLm1lbnVJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLl9tZW51SW5kZXggPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnVJbmRleDtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5RHJvcGRvd25JdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHB1YmxpYyBtZW51SXRlbXM6IFF1ZXJ5TGlzdDxTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQ+O1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfYXJpYVJvbGU6IHN0cmluZztcblxuICBwcml2YXRlIF9tZW51SW5kZXggPSAwO1xuXG4gIHByaXZhdGUgX3VzZU5hdGl2ZUZvY3VzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRyb3Bkb3duQ29tcG9uZW50OiBTa3lEcm9wZG93bkNvbXBvbmVudFxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmRyb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50Lm1lbnVJZCA9IHRoaXMuZHJvcGRvd25NZW51SWQ7XG4gICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50Lm1lbnVBcmlhUm9sZSA9IHRoaXMuYXJpYVJvbGU7XG5cbiAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQubWVzc2FnZVN0cmVhbVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogU2t5RHJvcGRvd25NZXNzYWdlKSA9PiB7XG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0ICovXG4gICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5PcGVuOlxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlOlxuICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNreURyb3Bkb3duTWVzc2FnZVR5cGUuRm9jdXNGaXJzdEl0ZW06XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c05leHRJdGVtOlxuICAgICAgICAgICAgICB0aGlzLmZvY3VzTmV4dEl0ZW0oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1ByZXZpb3VzSXRlbTpcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzSXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzTGFzdEl0ZW06XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNMYXN0SXRlbSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLm1lbnVDaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFNreURyb3Bkb3duTWVudUNoYW5nZSkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIHRoZSBkcm9wZG93biB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIGlmIChjaGFuZ2Uuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzVHJpZ2dlckJ1dHRvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNoYW5nZS5pdGVtcykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwb3BvdmVyIHN0eWxlIGFuZCBwb3NpdGlvbiB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIGl0ZW1zIGNoYW5nZXMuXG4gICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuUmVwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkcm9wZG93biB3aGVuZXZlciB0aGUgbWVudSBpdGVtcyBjaGFuZ2UuXG4gICAgdGhpcy5tZW51SXRlbXMuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogUXVlcnlMaXN0PFNreURyb3Bkb3duSXRlbUNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLm1lbnVDaGFuZ2VzLmVtaXQoe1xuICAgICAgICAgIGl0ZW1zOiBpdGVtcy50b0FycmF5KCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNGaXJzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXggPSAwO1xuXG4gICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy5nZXRJdGVtQnlJbmRleCh0aGlzLm1lbnVJbmRleCk7XG4gICAgaWYgKGZpcnN0SXRlbSAmJiBmaXJzdEl0ZW0uaXNGb2N1c2FibGUoKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oZmlyc3RJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXggPSB0aGlzLm1lbnVJdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLmdldEl0ZW1CeUluZGV4KHRoaXMubWVudUluZGV4KTtcbiAgICBpZiAobGFzdEl0ZW0gJiYgbGFzdEl0ZW0uaXNGb2N1c2FibGUoKSkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0obGFzdEl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzUHJldmlvdXNJdGVtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNGb2N1c2FibGVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWVudUluZGV4LS07XG5cbiAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSB0aGlzLmdldEl0ZW1CeUluZGV4KHRoaXMubWVudUluZGV4KTtcbiAgICBpZiAocHJldmlvdXNJdGVtICYmIHByZXZpb3VzSXRlbS5pc0ZvY3VzYWJsZSgpKSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbShwcmV2aW91c0l0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzTmV4dEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzYWJsZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZW51SW5kZXgrKztcblxuICAgIGNvbnN0IG5leHRJdGVtID0gdGhpcy5nZXRJdGVtQnlJbmRleCh0aGlzLm1lbnVJbmRleCk7XG4gICAgaWYgKG5leHRJdGVtICYmIG5leHRJdGVtLmlzRm9jdXNhYmxlKCkpIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX21lbnVJbmRleCA9IC0xO1xuICAgIHRoaXMucmVzZXRJdGVtc0FjdGl2ZVN0YXRlKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRJdGVtc0FjdGl2ZVN0YXRlKCkge1xuICAgIHRoaXMubWVudUl0ZW1zLmZvckVhY2goKGl0ZW06IFNreURyb3Bkb3duSXRlbUNvbXBvbmVudCkgPT4ge1xuICAgICAgaXRlbS5yZXNldFN0YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSXRlbShpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0SXRlbXNBY3RpdmVTdGF0ZSgpO1xuICAgIGl0ZW0uZm9jdXNFbGVtZW50KHRoaXMudXNlTmF0aXZlRm9jdXMpO1xuICAgIHRoaXMubWVudUNoYW5nZXMuZW1pdCh7XG4gICAgICBhY3RpdmVJbmRleDogdGhpcy5tZW51SW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIpOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLm1lbnVJdGVtcy5maW5kKChpdGVtOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGkgPT09IGluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RJdGVtQnlFdmVudFRhcmdldCh0YXJnZXQ6IEV2ZW50VGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5tZW51SXRlbXMuZmluZChcbiAgICAgIChpdGVtOiBTa3lEcm9wZG93bkl0ZW1Db21wb25lbnQsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgdGhpcy5tZW51SW5kZXggPSBpO1xuICAgICAgICAgIHRoaXMubWVudUNoYW5nZXMubmV4dCh7XG4gICAgICAgICAgICBhY3RpdmVJbmRleDogdGhpcy5tZW51SW5kZXgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5tZW51Q2hhbmdlcy5uZXh0KHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kTWVzc2FnZSh0eXBlOiBTa3lEcm9wZG93bk1lc3NhZ2VUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bkNvbXBvbmVudC5tZXNzYWdlU3RyZWFtLm5leHQoeyB0eXBlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBjb25zdCBkcm9wZG93bk1lbnVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRyb3Bkb3duTWVudUVsZW1lbnQsICdjbGljaycpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbUJ5RXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudChkcm9wZG93bk1lbnVFbGVtZW50LCAna2V5ZG93bicpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0Ki9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoU2t5RHJvcGRvd25NZXNzYWdlVHlwZS5Gb2N1c1RyaWdnZXJCdXR0b24pO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgICAgdGhpcy5mb2N1c05leHRJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNJdGVtKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25Db21wb25lbnQuZGlzbWlzc09uQmx1cikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKFNreURyb3Bkb3duTWVzc2FnZVR5cGUuQ2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkZvY3VzVHJpZ2dlckJ1dHRvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRyb3Bkb3duTWVudUVsZW1lbnQsICdtb3VzZWVudGVyJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudChkcm9wZG93bk1lbnVFbGVtZW50LCAnbW91c2VsZWF2ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50LmlzTW91c2VFbnRlciA9IGZhbHNlO1xuICAgICAgICAvLyBBbGxvdyB0aGUgZHJvcGRvd24gY29tcG9uZW50IHRvIHNldCBpc01vdXNlRW50ZXIgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBjbG9zZSBhY3Rpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHRha2VuLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29tcG9uZW50LnRyaWdnZXIgPT09ICdob3ZlcicgJiZcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db21wb25lbnQuaXNNb3VzZUVudGVyID09PSBmYWxzZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShTa3lEcm9wZG93bk1lc3NhZ2VUeXBlLkNsb3NlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktZHJvcGRvd24tbWVudSBza3ktc2hhZG93IHNreS1lbGV2YXRpb24tNFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFthdHRyLnJvbGVdPVwiYXJpYVJvbGVcIlxuICBbaWRdPVwiZHJvcGRvd25NZW51SWRcIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
|