@acpaas-ui/ngx-forms 6.1.8 → 6.1.10
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/.eslintrc.json +42 -0
- package/LICENSE.md +21 -0
- package/dist/README.md +23 -0
- package/dist/esm2020/lib/auto-complete/auto-complete.module.mjs +23 -0
- package/dist/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +265 -0
- package/dist/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +232 -0
- package/dist/esm2020/lib/datepicker/datepicker.module.mjs +54 -0
- package/dist/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +297 -0
- package/dist/esm2020/lib/range-slider/range-slider.module.mjs +19 -0
- package/dist/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +149 -0
- package/dist/esm2020/lib/search-filter/search-filter.module.mjs +21 -0
- package/{esm2020 → dist/esm2020}/lib/shared/services/search.service.mjs +6 -6
- package/dist/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +130 -0
- package/dist/esm2020/lib/timepicker/timepicker.module.mjs +21 -0
- package/dist/esm2020/lib/upload/components/upload/upload.component.mjs +69 -0
- package/dist/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +39 -0
- package/dist/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +42 -0
- package/dist/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +143 -0
- package/dist/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +33 -0
- package/dist/esm2020/lib/upload/services/validation-messages.service.mjs +29 -0
- package/dist/esm2020/lib/upload/upload.module.mjs +44 -0
- package/{fesm2015 → dist/fesm2015}/acpaas-ui-ngx-forms.mjs +141 -994
- package/dist/fesm2015/acpaas-ui-ngx-forms.mjs.map +1 -0
- package/dist/fesm2020/acpaas-ui-ngx-forms.mjs +1727 -0
- package/dist/fesm2020/acpaas-ui-ngx-forms.mjs.map +1 -0
- package/dist/package.json +44 -0
- package/karma.conf.js +38 -0
- package/ng-package.json +8 -0
- package/package.json +6 -30
- package/src/lib/auto-complete/README.md +148 -0
- package/src/lib/auto-complete/auto-complete.module.ts +15 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.html +51 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.scss +4 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.spec.ts +378 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.ts +281 -0
- package/src/lib/auto-complete/public-api.ts +2 -0
- package/src/lib/datepicker/README.md +110 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.html +47 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.scss +13 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.spec.ts +204 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.ts +251 -0
- package/src/lib/datepicker/datepicker.conf.ts +11 -0
- package/src/lib/datepicker/datepicker.module.ts +50 -0
- package/src/lib/datepicker/public-api.ts +8 -0
- package/src/lib/datepicker/types/datepicker.types.ts +8 -0
- package/src/lib/range-slider/README.md +56 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.html +46 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.scss +12 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.spec.ts +216 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.ts +301 -0
- package/src/lib/range-slider/public-api.ts +3 -0
- package/src/lib/range-slider/range-slider.module.ts +11 -0
- package/src/lib/range-slider/types/range-slider.types.ts +4 -0
- package/src/lib/search-filter/README.md +86 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.html +66 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.scss +23 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.spec.ts +264 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.ts +140 -0
- package/src/lib/search-filter/public-api.ts +3 -0
- package/src/lib/search-filter/search-filter.module.ts +13 -0
- package/src/lib/search-filter/types/search-filter.types.ts +4 -0
- package/src/lib/shared/services/search.service.spec.ts +78 -0
- package/src/lib/shared/services/search.service.ts +32 -0
- package/src/lib/shared/types/search.types.ts +6 -0
- package/src/lib/timepicker/README.md +84 -0
- package/src/lib/timepicker/classes/timepicker.validators.spec.ts +54 -0
- package/src/lib/timepicker/classes/timepicker.validators.ts +61 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.html +37 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.scss +3 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.spec.ts +161 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.ts +128 -0
- package/src/lib/timepicker/public-api.ts +4 -0
- package/src/lib/timepicker/timepicker.module.ts +13 -0
- package/src/lib/timepicker/types/timepicker.types.ts +5 -0
- package/src/lib/upload/README.md +283 -0
- package/src/lib/upload/classes/uploader.class.spec.ts +100 -0
- package/src/lib/upload/classes/uploader.class.ts +144 -0
- package/src/lib/upload/components/upload/upload.component.html +28 -0
- package/src/lib/upload/components/upload/upload.component.scss +3 -0
- package/src/lib/upload/components/upload/upload.component.spec.ts +117 -0
- package/src/lib/upload/components/upload/upload.component.ts +50 -0
- package/src/lib/upload/components/upload-input/upload-input.component.html +11 -0
- package/src/lib/upload/components/upload-input/upload-input.component.spec.ts +55 -0
- package/src/lib/upload/components/upload-input/upload-input.component.ts +35 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.html +16 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.spec.ts +99 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.ts +36 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.html +55 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.scss +3 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.spec.ts +144 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.ts +142 -0
- package/src/lib/upload/components/validation-list/validation-list.component.html +15 -0
- package/src/lib/upload/components/validation-list/validation-list.component.spec.ts +57 -0
- package/src/lib/upload/components/validation-list/validation-list.component.ts +29 -0
- package/src/lib/upload/public-api.ts +10 -0
- package/src/lib/upload/services/validation-messages.service.spec.ts +66 -0
- package/src/lib/upload/services/validation-messages.service.ts +27 -0
- package/src/lib/upload/types/upload.types.ts +20 -0
- package/src/lib/upload/upload.conf.ts +15 -0
- package/src/lib/upload/upload.module.ts +34 -0
- package/src/public-api.ts +6 -0
- package/src/test.ts +9 -0
- package/tsconfig.lib.json +26 -0
- package/tsconfig.spec.json +17 -0
- package/esm2020/lib/auto-complete/auto-complete.module.mjs +0 -24
- package/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +0 -347
- package/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +0 -308
- package/esm2020/lib/datepicker/datepicker.module.mjs +0 -55
- package/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +0 -349
- package/esm2020/lib/range-slider/range-slider.module.mjs +0 -20
- package/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +0 -266
- package/esm2020/lib/search-filter/search-filter.module.mjs +0 -22
- package/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +0 -243
- package/esm2020/lib/timepicker/timepicker.module.mjs +0 -22
- package/esm2020/lib/upload/components/upload/upload.component.mjs +0 -97
- package/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +0 -56
- package/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +0 -78
- package/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +0 -252
- package/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +0 -64
- package/esm2020/lib/upload/services/validation-messages.service.mjs +0 -29
- package/esm2020/lib/upload/upload.module.mjs +0 -45
- package/fesm2015/acpaas-ui-ngx-forms.mjs.map +0 -1
- package/fesm2020/acpaas-ui-ngx-forms.mjs +0 -2394
- package/fesm2020/acpaas-ui-ngx-forms.mjs.map +0 -1
- /package/{esm2020 → dist/esm2020}/acpaas-ui-ngx-forms.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/auto-complete/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.conf.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/types/datepicker.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/types/range-slider.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/types/search-filter.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/shared/types/search.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/classes/timepicker.validators.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/types/timepicker.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/classes/uploader.class.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/types/upload.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/upload.conf.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/public-api.mjs +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/auto-complete/auto-complete.module.d.ts +0 -0
- /package/{lib → dist/lib}/auto-complete/components/auto-complete/auto-complete.component.d.ts +0 -0
- /package/{lib → dist/lib}/auto-complete/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/components/datepicker/datepicker.component.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/datepicker.conf.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/datepicker.module.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/types/datepicker.types.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/components/range-slider/range-slider.component.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/range-slider.module.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/types/range-slider.types.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/components/search-filter/search-filter.component.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/search-filter.module.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/types/search-filter.types.d.ts +0 -0
- /package/{lib → dist/lib}/shared/services/search.service.d.ts +0 -0
- /package/{lib → dist/lib}/shared/types/search.types.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/classes/timepicker.validators.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/components/timepicker/timepicker.component.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/timepicker.module.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/types/timepicker.types.d.ts +0 -0
- /package/{lib → dist/lib}/upload/classes/uploader.class.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload/upload.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-input/upload-input.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-queue/upload-queue.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-zone/upload-zone.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/validation-list/validation-list.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/upload/services/validation-messages.service.d.ts +0 -0
- /package/{lib → dist/lib}/upload/types/upload.types.d.ts +0 -0
- /package/{lib → dist/lib}/upload/upload.conf.d.ts +0 -0
- /package/{lib → dist/lib}/upload/upload.module.d.ts +0 -0
- /package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../.eslintrc.json",
|
|
3
|
+
"ignorePatterns": [
|
|
4
|
+
"!**/*"
|
|
5
|
+
],
|
|
6
|
+
"overrides": [
|
|
7
|
+
{
|
|
8
|
+
"files": [
|
|
9
|
+
"*.ts"
|
|
10
|
+
],
|
|
11
|
+
"parserOptions": {
|
|
12
|
+
"project": [
|
|
13
|
+
"packages/ngx-forms/tsconfig.(lib|spec).json"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"rules": {
|
|
17
|
+
"@angular-eslint/directive-selector": [
|
|
18
|
+
"error",
|
|
19
|
+
{
|
|
20
|
+
"type": "attribute",
|
|
21
|
+
"prefix": "aui",
|
|
22
|
+
"style": "camelCase"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"@angular-eslint/component-selector": [
|
|
26
|
+
"error",
|
|
27
|
+
{
|
|
28
|
+
"type": "element",
|
|
29
|
+
"prefix": "aui",
|
|
30
|
+
"style": "kebab-case"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": [
|
|
37
|
+
"*.html"
|
|
38
|
+
],
|
|
39
|
+
"rules": {}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016-present Digipolis
|
|
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.
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# @acpaas-ui/ngx-forms
|
|
2
|
+
|
|
3
|
+
The forms module is a collection of several forms-related modules, like an autocomplete, a datepicker, a range slider, a timepicker, etc.
|
|
4
|
+
You can find an overview in the [Modules](#modules) section below.
|
|
5
|
+
|
|
6
|
+
## Documentation
|
|
7
|
+
|
|
8
|
+
Visit our [documentation site](https://antwerp-ui.digipolis.be/) for full how-to docs and guidelines
|
|
9
|
+
|
|
10
|
+
## <a name="modules"></a>Modules
|
|
11
|
+
|
|
12
|
+
| Name | Description | Documentation |
|
|
13
|
+
| -------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
|
|
14
|
+
| `AutoCompleteModule` | This module creates an input field with autocomplete functionality. | [Documentation](src/lib/auto-complete/README.md) |
|
|
15
|
+
| `DatepickerModule` | This package allows the user to select a date either by input or by picking one in the calendar flyout. | [Documentation](src/lib/datepicker/README.md) |
|
|
16
|
+
| `RangeSliderModule` | This module provides a range slider. | [Documentation](src/lib/range-slider/README.md) |
|
|
17
|
+
| `SearchFilterModule` | This package allows the user to use a JIRA-like filter component with remote search capabilities. | [Documentation](src/lib/search-filter/README.md) |
|
|
18
|
+
| `TimepickerModule` | This package allows the user set the time either by choosing a slot in the dropdown or by typing in the autocomplete field. | [Documentation](src/lib/timepicker/README.md) |
|
|
19
|
+
| `UploadModule` | This module provides a couple of upload components and a specific `Uploader` class. | [Documentation](src/lib/upload/README.md) |
|
|
20
|
+
|
|
21
|
+
## Contributing
|
|
22
|
+
|
|
23
|
+
Visit our [Contribution Guidelines](../../CONTRIBUTING.md) for more information on how to contribute.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { FlyoutModule } from '@acpaas-ui/ngx-flyout';
|
|
5
|
+
import { SelectableListModule } from '@acpaas-ui/ngx-selectable-list';
|
|
6
|
+
import { SearchService } from '../shared/services/search.service';
|
|
7
|
+
import { AutoCompleteComponent } from './components/auto-complete/auto-complete.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class AutoCompleteModule {
|
|
10
|
+
}
|
|
11
|
+
/** @nocollapse */ AutoCompleteModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
/** @nocollapse */ AutoCompleteModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, declarations: [AutoCompleteComponent], imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule], exports: [AutoCompleteComponent] });
|
|
13
|
+
/** @nocollapse */ AutoCompleteModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, providers: [SearchService], imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule] });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, decorators: [{
|
|
15
|
+
type: NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule],
|
|
18
|
+
declarations: [AutoCompleteComponent],
|
|
19
|
+
exports: [AutoCompleteComponent],
|
|
20
|
+
providers: [SearchService],
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBUTNGLE1BQU0sT0FBTyxrQkFBa0I7O2tJQUFsQixrQkFBa0I7bUlBQWxCLGtCQUFrQixpQkFKZCxxQkFBcUIsYUFEMUIsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLGFBRTdELHFCQUFxQjttSUFHcEIsa0JBQWtCLGFBRmxCLENBQUMsYUFBYSxDQUFDLFlBSGhCLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG9CQUFvQjsyRkFLNUQsa0JBQWtCO2tCQU45QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixDQUFDO29CQUN4RSxZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDckMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ2hDLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmx5b3V0TW9kdWxlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtZmx5b3V0JztcbmltcG9ydCB7IFNlbGVjdGFibGVMaXN0TW9kdWxlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtc2VsZWN0YWJsZS1saXN0JztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0b0NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRmx5b3V0TW9kdWxlLCBTZWxlY3RhYmxlTGlzdE1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0F1dG9Db21wbGV0ZUNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBdXRvQ29tcGxldGVDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtTZWFyY2hTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b0NvbXBsZXRlTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { Component, ContentChild, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { get, isEqual } from 'lodash-es';
|
|
4
|
+
import { FlyoutDirective, FlyoutZoneDirective } from '@acpaas-ui/ngx-flyout';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../shared/services/search.service";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
import * as i3 from "@angular/forms";
|
|
9
|
+
import * as i4 from "@acpaas-ui/ngx-flyout";
|
|
10
|
+
import * as i5 from "@acpaas-ui/ngx-selectable-list";
|
|
11
|
+
export class AutoCompleteComponent {
|
|
12
|
+
constructor(ref, searchService) {
|
|
13
|
+
this.ref = ref;
|
|
14
|
+
this.searchService = searchService;
|
|
15
|
+
this.results = []; // The values for the selectable list
|
|
16
|
+
this.data = []; // The values to search in when remote search is disabled
|
|
17
|
+
this.remote = false; // Disable or enamble remote search
|
|
18
|
+
this.minCharacters = 0;
|
|
19
|
+
this.clearInvalid = false;
|
|
20
|
+
this.showAllByDefault = false;
|
|
21
|
+
this.autoComplete = 'off';
|
|
22
|
+
// Eventemitter for searchvalue (parent object should update the results with this param)
|
|
23
|
+
this.search = new EventEmitter();
|
|
24
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
25
|
+
this.select = new EventEmitter();
|
|
26
|
+
this.query = '';
|
|
27
|
+
this.index = -1; // index for active element in selectable list, by default -1 (so it starts in the input field)
|
|
28
|
+
this.selectedItem = null; // keep a backup of the selectedItem
|
|
29
|
+
this.searching = false; // track remote search state
|
|
30
|
+
this.focused = false;
|
|
31
|
+
this.isDisabled = false;
|
|
32
|
+
this.remoteValue = false;
|
|
33
|
+
this.updateModel = (_) => { };
|
|
34
|
+
}
|
|
35
|
+
// CONTROL_VALUE_ACCESSOR interface
|
|
36
|
+
writeValue(value = '') {
|
|
37
|
+
if (this.value) {
|
|
38
|
+
const selected = this.data.find((item) => item[this.value] === value);
|
|
39
|
+
if (selected) {
|
|
40
|
+
return (this.query = selected[this.label]);
|
|
41
|
+
}
|
|
42
|
+
if (this.remote && !!value) {
|
|
43
|
+
this.remoteValue = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.query = value;
|
|
47
|
+
}
|
|
48
|
+
// CONTROL_VALUE_ACCESSOR interface
|
|
49
|
+
registerOnChange(fn) {
|
|
50
|
+
this.updateModel = fn;
|
|
51
|
+
}
|
|
52
|
+
// CONTROL_VALUE_ACCESSOR interface
|
|
53
|
+
registerOnTouched() { }
|
|
54
|
+
setDisabledState(isDisabled) {
|
|
55
|
+
this.isDisabled = isDisabled;
|
|
56
|
+
}
|
|
57
|
+
ngOnInit() {
|
|
58
|
+
if (Array.isArray(this.data) && this.data.length > 0 && !this.query && this.showAllByDefault) {
|
|
59
|
+
this.results = [...this.data];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// OnChanges interface
|
|
63
|
+
ngOnChanges(changes) {
|
|
64
|
+
if (!changes) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const newData = get(changes, 'data.currentValue', []);
|
|
68
|
+
if (!isEqual(newData, get(changes, 'data.previousValue', []))) {
|
|
69
|
+
if (this.remote) {
|
|
70
|
+
this.remoteSearch();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.localSearch();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (changes.results && changes.results.currentValue) {
|
|
77
|
+
this.searching = false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
propagateChange(item) {
|
|
81
|
+
this.query = item !== null ? (this.label ? item[this.label] : item) : '';
|
|
82
|
+
this.select.emit(item);
|
|
83
|
+
if (!item) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const key = this.value ? this.value : this.label ? this.label : null;
|
|
87
|
+
this.updateModel(key ? item[key] || '' : item);
|
|
88
|
+
this.selectedItem = item;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* triggers on input value change
|
|
92
|
+
*/
|
|
93
|
+
doSearch() {
|
|
94
|
+
this.index = -1; // reset index
|
|
95
|
+
this.searching = true;
|
|
96
|
+
if (this.remote) {
|
|
97
|
+
this.search.emit(this.query); // ask for new remote data
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.localSearch();
|
|
101
|
+
}
|
|
102
|
+
this.openFlyout(); // open the flyout when there is a change
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* triggers on selectable-list:select -> onClick event in selectable-list
|
|
106
|
+
*/
|
|
107
|
+
onSelect(item) {
|
|
108
|
+
this.propagateChange(item);
|
|
109
|
+
this.closeFlyout(); // Close the flyout manually
|
|
110
|
+
}
|
|
111
|
+
onFlyoutClosed() {
|
|
112
|
+
// there is only 1 result, select it
|
|
113
|
+
if (this.index >= 0 && this.results.length === 1) {
|
|
114
|
+
return this.onSelect(this.results[0]);
|
|
115
|
+
}
|
|
116
|
+
// there is no query nor selected item, clear the selected item
|
|
117
|
+
if (!this.query && this.index < 0) {
|
|
118
|
+
return this.onSelect(null);
|
|
119
|
+
}
|
|
120
|
+
// reset the query for an invalid query if clearInvalid is true
|
|
121
|
+
if (this.clearInvalid && this.query && !this.results.length && this.index < 0) {
|
|
122
|
+
this.query = this.selectedItem ? (this.label ? this.selectedItem[this.label] : this.selectedItem) : '';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
onKeyArrowDown() {
|
|
126
|
+
if (this.index < this.results.length - 1) {
|
|
127
|
+
this.scrollList(1);
|
|
128
|
+
}
|
|
129
|
+
this.openFlyout();
|
|
130
|
+
}
|
|
131
|
+
onKeyArrowUp() {
|
|
132
|
+
if (this.index >= 0) {
|
|
133
|
+
this.scrollList(-1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
onKeyEnter(event) {
|
|
137
|
+
event.preventDefault(); // Do not submit form when selecting an item.
|
|
138
|
+
const query = this.index >= 0 ? this.results[this.index] : this.query;
|
|
139
|
+
this.propagateChange(query);
|
|
140
|
+
this.closeFlyout();
|
|
141
|
+
}
|
|
142
|
+
onKeyEscape() {
|
|
143
|
+
this.closeFlyout();
|
|
144
|
+
}
|
|
145
|
+
onFocus() {
|
|
146
|
+
this.focused = true;
|
|
147
|
+
this.openFlyout();
|
|
148
|
+
}
|
|
149
|
+
openFlyout() {
|
|
150
|
+
if (this.flyout) {
|
|
151
|
+
this.flyout.open();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
closeFlyout() {
|
|
155
|
+
if (this.flyout) {
|
|
156
|
+
this.flyout.close();
|
|
157
|
+
}
|
|
158
|
+
this.focused = false;
|
|
159
|
+
}
|
|
160
|
+
localSearch() {
|
|
161
|
+
this.results = this.searchService.search(this.data, {
|
|
162
|
+
minLength: this.minCharacters,
|
|
163
|
+
key: this.label,
|
|
164
|
+
query: this.query,
|
|
165
|
+
showAllByDefault: this.showAllByDefault,
|
|
166
|
+
});
|
|
167
|
+
if (this.results.length === 1 && this.query === this.results[0][this.label]) {
|
|
168
|
+
this.index = 0;
|
|
169
|
+
}
|
|
170
|
+
this.searching = false;
|
|
171
|
+
}
|
|
172
|
+
remoteSearch() {
|
|
173
|
+
if (!this.remoteValue || !this.data) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const selected = this.data.find((item) => {
|
|
177
|
+
if (this.value) {
|
|
178
|
+
return item[this.value] === this.query;
|
|
179
|
+
}
|
|
180
|
+
return item === this.query;
|
|
181
|
+
});
|
|
182
|
+
if (selected) {
|
|
183
|
+
this.query = this.label ? selected[this.label] : selected;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
this.query = '';
|
|
187
|
+
}
|
|
188
|
+
this.remoteValue = false;
|
|
189
|
+
}
|
|
190
|
+
scrollList(factor) {
|
|
191
|
+
this.index += factor;
|
|
192
|
+
if (!this.flyoutZone) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const liItems = this.flyoutZone.element.getElementsByTagName('li');
|
|
196
|
+
const liHeight = liItems[1] ? liItems[1].offsetHeight : liItems[0].offsetHeight;
|
|
197
|
+
const zoneHeight = this.flyoutZone.element.offsetHeight;
|
|
198
|
+
const offset = zoneHeight / liHeight / 2;
|
|
199
|
+
this.flyoutZone.element.scrollTop = this.index * liHeight - offset * liHeight;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** @nocollapse */ AutoCompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: i0.ElementRef }, { token: i1.SearchService }], target: i0.ɵɵFactoryTarget.Component });
|
|
203
|
+
/** @nocollapse */ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: AutoCompleteComponent, selector: "aui-auto-complete", inputs: { id: "id", placeholder: "placeholder", description: "description", inputLabel: "inputLabel", results: "results", data: "data", remote: "remote", minCharacters: "minCharacters", clearInvalid: "clearInvalid", searchIncentiveText: "searchIncentiveText", loadingText: "loadingText", noResultsText: "noResultsText", showAllByDefault: "showAllByDefault", autoComplete: "autoComplete", label: "label", value: "value" }, outputs: { search: "search", select: "select" }, providers: [
|
|
204
|
+
{
|
|
205
|
+
provide: NG_VALUE_ACCESSOR,
|
|
206
|
+
useExisting: forwardRef((() => AutoCompleteComponent)),
|
|
207
|
+
multi: true,
|
|
208
|
+
},
|
|
209
|
+
], queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true, static: true }], viewQueries: [{ propertyName: "flyout", first: true, predicate: FlyoutDirective, descendants: true, static: true }, { propertyName: "flyoutZone", first: true, predicate: FlyoutZoneDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div\n (closed)=\"onFlyoutClosed()\"\n [toggleClick]=\"false\"\n aria-haspopup=\"listbox\"\n auiFlyout\n class=\"m-flyout m-flyout--scrollable m-flyout--full o-auto-complete\"\n>\n <input\n (focus)=\"onFocus()\"\n (keyArrowDown)=\"onKeyArrowDown()\"\n (keyArrowUp)=\"onKeyArrowUp()\"\n (keyEnter)=\"onKeyEnter($event)\"\n (keyEscape)=\"onKeyEscape()\"\n [(ngModel)]=\"query\"\n (ngModelChange)=\"doSearch()\"\n [disabled]=\"isDisabled ? true : null\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n aria-autocomplete=\"list\"\n auiFlyoutAction\n auiSelectableActions\n [autocomplete]=\"autoComplete\"\n type=\"text\"\n class=\"a-input\"\n />\n <div *ngIf=\"!isDisabled\" auiFlyoutZone>\n <span *ngIf=\"focused && loadingText && searching\" class=\"a-spinner a-spinner--s u-margin-xs\" role=\"alert\">\n <span class=\"a-spinner__circle\"></span>\n <span class=\"a-spinner__text\">{{ loadingText }}</span>\n </span>\n <span\n *ngIf=\"focused && searchIncentiveText && !searching && !query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ searchIncentiveText }}</span\n >\n <span\n *ngIf=\"focused && noResultsText && !searching && query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ noResultsText }}</span\n >\n <aui-selectable-list\n (selected)=\"onSelect($event)\"\n *ngIf=\"results.length > 0 && !(focused && loadingText && searching)\"\n [index]=\"index\"\n [itemTemplate]=\"template\"\n [items]=\"results\"\n [label]=\"label\"\n [search]=\"query\"\n ></aui-selectable-list>\n </div>\n</div>\n", styles: [".o-auto-complete,.o-auto-complete__info{display:block}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.FlyoutActionDirective, selector: "[auiFlyoutAction]", inputs: ["openOnFocus", "disabled"], exportAs: ["auiFlyoutAction"] }, { kind: "directive", type: i4.FlyoutZoneDirective, selector: "[auiFlyoutZone]", inputs: ["auiFlyoutZone"], exportAs: ["auiFlyoutZone"] }, { kind: "directive", type: i4.FlyoutDirective, selector: "[auiFlyout]", inputs: ["size", "align", "toggleClick", "activateOnFocus"], outputs: ["opened", "closed"], exportAs: ["auiFlyout"] }, { kind: "component", type: i5.SelectableListComponent, selector: "aui-selectable-list", inputs: ["items", "index", "search", "label", "itemTemplate"], outputs: ["selected"] }, { kind: "directive", type: i5.SelectableActionsDirective, selector: "[auiSelectableActions]", outputs: ["keyArrowUp", "keyArrowDown", "keyEnter", "keyEscape"], exportAs: ["auiSelectableActions"] }] });
|
|
210
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteComponent, decorators: [{
|
|
211
|
+
type: Component,
|
|
212
|
+
args: [{ selector: 'aui-auto-complete', providers: [
|
|
213
|
+
{
|
|
214
|
+
provide: NG_VALUE_ACCESSOR,
|
|
215
|
+
useExisting: forwardRef((() => AutoCompleteComponent)),
|
|
216
|
+
multi: true,
|
|
217
|
+
},
|
|
218
|
+
], template: "<div\n (closed)=\"onFlyoutClosed()\"\n [toggleClick]=\"false\"\n aria-haspopup=\"listbox\"\n auiFlyout\n class=\"m-flyout m-flyout--scrollable m-flyout--full o-auto-complete\"\n>\n <input\n (focus)=\"onFocus()\"\n (keyArrowDown)=\"onKeyArrowDown()\"\n (keyArrowUp)=\"onKeyArrowUp()\"\n (keyEnter)=\"onKeyEnter($event)\"\n (keyEscape)=\"onKeyEscape()\"\n [(ngModel)]=\"query\"\n (ngModelChange)=\"doSearch()\"\n [disabled]=\"isDisabled ? true : null\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n aria-autocomplete=\"list\"\n auiFlyoutAction\n auiSelectableActions\n [autocomplete]=\"autoComplete\"\n type=\"text\"\n class=\"a-input\"\n />\n <div *ngIf=\"!isDisabled\" auiFlyoutZone>\n <span *ngIf=\"focused && loadingText && searching\" class=\"a-spinner a-spinner--s u-margin-xs\" role=\"alert\">\n <span class=\"a-spinner__circle\"></span>\n <span class=\"a-spinner__text\">{{ loadingText }}</span>\n </span>\n <span\n *ngIf=\"focused && searchIncentiveText && !searching && !query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ searchIncentiveText }}</span\n >\n <span\n *ngIf=\"focused && noResultsText && !searching && query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ noResultsText }}</span\n >\n <aui-selectable-list\n (selected)=\"onSelect($event)\"\n *ngIf=\"results.length > 0 && !(focused && loadingText && searching)\"\n [index]=\"index\"\n [itemTemplate]=\"template\"\n [items]=\"results\"\n [label]=\"label\"\n [search]=\"query\"\n ></aui-selectable-list>\n </div>\n</div>\n", styles: [".o-auto-complete,.o-auto-complete__info{display:block}\n"] }]
|
|
219
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SearchService }]; }, propDecorators: { id: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], placeholder: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], description: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], inputLabel: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], results: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], data: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}], remote: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], minCharacters: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], clearInvalid: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], searchIncentiveText: [{
|
|
238
|
+
type: Input
|
|
239
|
+
}], loadingText: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], noResultsText: [{
|
|
242
|
+
type: Input
|
|
243
|
+
}], showAllByDefault: [{
|
|
244
|
+
type: Input
|
|
245
|
+
}], autoComplete: [{
|
|
246
|
+
type: Input
|
|
247
|
+
}], label: [{
|
|
248
|
+
type: Input
|
|
249
|
+
}], value: [{
|
|
250
|
+
type: Input
|
|
251
|
+
}], search: [{
|
|
252
|
+
type: Output
|
|
253
|
+
}], select: [{
|
|
254
|
+
type: Output
|
|
255
|
+
}], flyout: [{
|
|
256
|
+
type: ViewChild,
|
|
257
|
+
args: [FlyoutDirective, { static: true }]
|
|
258
|
+
}], flyoutZone: [{
|
|
259
|
+
type: ViewChild,
|
|
260
|
+
args: [FlyoutZoneDirective, { static: true }]
|
|
261
|
+
}], template: [{
|
|
262
|
+
type: ContentChild,
|
|
263
|
+
args: [TemplateRef, { static: true }]
|
|
264
|
+
}] } });
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F1dG8tY29tcGxldGUvY29tcG9uZW50cy9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hdXRvLWNvbXBsZXRlL2NvbXBvbmVudHMvYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFlN0UsTUFBTSxPQUFPLHFCQUFxQjtJQXVDaEMsWUFBb0IsR0FBZSxFQUFVLGFBQTRCO1FBQXJELFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWxDaEUsWUFBTyxHQUFVLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztRQUMxRCxTQUFJLEdBQVUsRUFBRSxDQUFDLENBQUMseURBQXlEO1FBQzNFLFdBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxtQ0FBbUM7UUFDbkQsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFJckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBTTlCLHlGQUF5RjtR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Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUdJLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRXVDLE1BQU07c0JBQW5ELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDTSxVQUFVO3NCQUEzRCxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFSSxRQUFRO3NCQUEzRCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBnZXQsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgRmx5b3V0RGlyZWN0aXZlLCBGbHlvdXRab25lRGlyZWN0aXZlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtZmx5b3V0JztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdWktYXV0by1jb21wbGV0ZScsXG4gIHN0eWxlVXJsczogWycuL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG8tY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9Db21wbGV0ZUNvbXBvbmVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlucHV0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcmVzdWx0czogYW55W10gPSBbXTsgLy8gVGhlIHZhbHVlcyBmb3IgdGhlIHNlbGVjdGFibGUgbGlzdFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdOyAvLyBUaGUgdmFsdWVzIHRvIHNlYXJjaCBpbiB3aGVuIHJlbW90ZSBzZWFyY2ggaXMgZGlzYWJsZWRcbiAgQElucHV0KCkgcmVtb3RlID0gZmFsc2U7IC8vIERpc2FibGUgb3IgZW5hbWJsZSByZW1vdGUgc2VhcmNoXG4gIEBJbnB1dCgpIG1pbkNoYXJhY3RlcnMgPSAwO1xuICBASW5wdXQoKSBjbGVhckludmFsaWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VhcmNoSW5jZW50aXZlVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkaW5nVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBub1Jlc3VsdHNUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dBbGxCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b0NvbXBsZXRlID0gJ29mZic7XG5cbiAgLy8gc3BlY2lmeSB3aGljaCBsYWJlbC92YWx1ZSBwcm9wcyB0byB1c2VcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcblxuICAvLyBFdmVudGVtaXR0ZXIgZm9yIHNlYXJjaHZhbHVlIChwYXJlbnQgb2JqZWN0IHNob3VsZCB1cGRhdGUgdGhlIHJlc3VsdHMgd2l0aCB0aGlzIHBhcmFtKVxuICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoRmx5b3V0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXQ6IEZseW91dERpcmVjdGl2ZTtcbiAgQFZpZXdDaGlsZChGbHlvdXRab25lRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXRab25lOiBGbHlvdXRab25lRGlyZWN0aXZlO1xuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwdWJsaWMgcXVlcnkgPSAnJztcbiAgcHVibGljIGluZGV4ID0gLTE7IC8vIGluZGV4IGZvciBhY3RpdmUgZWxlbWVudCBpbiBzZWxlY3RhYmxlIGxpc3QsIGJ5IGRlZmF1bHQgLTEgKHNvIGl0IHN0YXJ0cyBpbiB0aGUgaW5wdXQgZmllbGQpXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW06IGFueSA9IG51bGw7IC8vIGtlZXAgYSBiYWNrdXAgb2YgdGhlIHNlbGVjdGVkSXRlbVxuICBwdWJsaWMgc2VhcmNoaW5nID0gZmFsc2U7IC8vIHRyYWNrIHJlbW90ZSBzZWFyY2ggc3RhdGVcbiAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgcHVibGljIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlbW90ZVZhbHVlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSkge31cblxuICBwdWJsaWMgdXBkYXRlTW9kZWwgPSAoXzogYW55KSA9PiB7fTtcblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSA9ICcnKSB7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kYXRhLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbVt0aGlzLnZhbHVlXSA9PT0gdmFsdWUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnF1ZXJ5ID0gc2VsZWN0ZWRbdGhpcy5sYWJlbF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgISF2YWx1ZSkge1xuICAgICAgICB0aGlzLnJlbW90ZVZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnF1ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgIHRoaXMudXBkYXRlTW9kZWwgPSBmbjtcbiAgfVxuXG4gIC8vIENPTlRST0xfVkFMVUVfQUNDRVNTT1IgaW50ZXJmYWNlXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCgpIHt9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhKSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJiAhdGhpcy5xdWVyeSAmJiB0aGlzLnNob3dBbGxCeURlZmF1bHQpIHtcbiAgICAgIHRoaXMucmVzdWx0cyA9IFsuLi50aGlzLmRhdGFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uQ2hhbmdlcyBpbnRlcmZhY2VcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdEYXRhID0gZ2V0KGNoYW5nZXMsICdkYXRhLmN1cnJlbnRWYWx1ZScsIFtdKTtcbiAgICBpZiAoIWlzRXF1YWwobmV3RGF0YSwgZ2V0KGNoYW5nZXMsICdkYXRhLnByZXZpb3VzVmFsdWUnLCBbXSkpKSB7XG4gICAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVTZWFyY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5yZXN1bHRzICYmIGNoYW5nZXMucmVzdWx0cy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3BhZ2F0ZUNoYW5nZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gaXRlbSAhPT0gbnVsbCA/ICh0aGlzLmxhYmVsID8gaXRlbVt0aGlzLmxhYmVsXSA6IGl0ZW0pIDogJyc7XG4gICAgdGhpcy5zZWxlY3QuZW1pdChpdGVtKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiBudWxsO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoa2V5ID8gaXRlbVtrZXldIHx8ICcnIDogaXRlbSk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIG9uIGlucHV0IHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIGRvU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXggPSAtMTsgLy8gcmVzZXQgaW5kZXhcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgIHRoaXMuc2VhcmNoLmVtaXQodGhpcy5xdWVyeSk7IC8vIGFzayBmb3IgbmV3IHJlbW90ZSBkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5GbHlvdXQoKTsgLy8gb3BlbiB0aGUgZmx5b3V0IHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyBvbiBzZWxlY3RhYmxlLWxpc3Q6c2VsZWN0IC0+IG9uQ2xpY2sgZXZlbnQgaW4gc2VsZWN0YWJsZS1saXN0XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3QoaXRlbTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbSk7XG4gICAgdGhpcy5jbG9zZUZseW91dCgpOyAvLyBDbG9zZSB0aGUgZmx5b3V0IG1hbnVhbGx5XG4gIH1cblxuICBwdWJsaWMgb25GbHlvdXRDbG9zZWQoKTogdm9pZCB7XG4gICAgLy8gdGhlcmUgaXMgb25seSAxIHJlc3VsdCwgc2VsZWN0IGl0XG4gICAgaWYgKHRoaXMuaW5kZXggPj0gMCAmJiB0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5vblNlbGVjdCh0aGlzLnJlc3VsdHNbMF0pO1xuICAgIH1cblxuICAgIC8vIHRoZXJlIGlzIG5vIHF1ZXJ5IG5vciBzZWxlY3RlZCBpdGVtLCBjbGVhciB0aGUgc2VsZWN0ZWQgaXRlbVxuICAgIGlmICghdGhpcy5xdWVyeSAmJiB0aGlzLmluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIHRoaXMub25TZWxlY3QobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgdGhlIHF1ZXJ5IGZvciBhbiBpbnZhbGlkIHF1ZXJ5IGlmIGNsZWFySW52YWxpZCBpcyB0cnVlXG4gICAgaWYgKHRoaXMuY2xlYXJJbnZhbGlkICYmIHRoaXMucXVlcnkgJiYgIXRoaXMucmVzdWx0cy5sZW5ndGggJiYgdGhpcy5pbmRleCA8IDApIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkSXRlbSA/ICh0aGlzLmxhYmVsID8gdGhpcy5zZWxlY3RlZEl0ZW1bdGhpcy5sYWJlbF0gOiB0aGlzLnNlbGVjdGVkSXRlbSkgOiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25LZXlBcnJvd0Rvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0KDEpO1xuICAgIH1cblxuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5QXJyb3dVcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbExpc3QoLTEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbktleUVudGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHNlbGVjdGluZyBhbiBpdGVtLlxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmluZGV4ID49IDAgPyB0aGlzLnJlc3VsdHNbdGhpcy5pbmRleF0gOiB0aGlzLnF1ZXJ5O1xuXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UocXVlcnkpO1xuICAgIHRoaXMuY2xvc2VGbHlvdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleUVzY2FwZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRmx5b3V0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9wZW5GbHlvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx5b3V0KSB7XG4gICAgICB0aGlzLmZseW91dC5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsb3NlRmx5b3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZseW91dCkge1xuICAgICAgdGhpcy5mbHlvdXQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NhbFNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdHMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHRoaXMuZGF0YSwge1xuICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbkNoYXJhY3RlcnMsXG4gICAgICBrZXk6IHRoaXMubGFiZWwsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgIHNob3dBbGxCeURlZmF1bHQ6IHRoaXMuc2hvd0FsbEJ5RGVmYXVsdCxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxICYmIHRoaXMucXVlcnkgPT09IHRoaXMucmVzdWx0c1swXVt0aGlzLmxhYmVsXSkge1xuICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdGVTZWFyY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbW90ZVZhbHVlIHx8ICF0aGlzLmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZGF0YS5maW5kKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMudmFsdWVdID09PSB0aGlzLnF1ZXJ5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbSA9PT0gdGhpcy5xdWVyeTtcbiAgICB9KTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMubGFiZWwgPyBzZWxlY3RlZFt0aGlzLmxhYmVsXSA6IHNlbGVjdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdGVWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbExpc3QoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4ICs9IGZhY3RvcjtcblxuICAgIGlmICghdGhpcy5mbHlvdXRab25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGlJdGVtcyA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpO1xuICAgIGNvbnN0IGxpSGVpZ2h0ID0gbGlJdGVtc1sxXSA/IGxpSXRlbXNbMV0ub2Zmc2V0SGVpZ2h0IDogbGlJdGVtc1swXS5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgem9uZUhlaWdodCA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSB6b25lSGVpZ2h0IC8gbGlIZWlnaHQgLyAyO1xuXG4gICAgdGhpcy5mbHlvdXRab25lLmVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5pbmRleCAqIGxpSGVpZ2h0IC0gb2Zmc2V0ICogbGlIZWlnaHQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKGNsb3NlZCk9XCJvbkZseW91dENsb3NlZCgpXCJcbiAgW3RvZ2dsZUNsaWNrXT1cImZhbHNlXCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBhdWlGbHlvdXRcbiAgY2xhc3M9XCJtLWZseW91dCBtLWZseW91dC0tc2Nyb2xsYWJsZSBtLWZseW91dC0tZnVsbCBvLWF1dG8tY29tcGxldGVcIlxuPlxuICA8aW5wdXRcbiAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAoa2V5QXJyb3dEb3duKT1cIm9uS2V5QXJyb3dEb3duKClcIlxuICAgIChrZXlBcnJvd1VwKT1cIm9uS2V5QXJyb3dVcCgpXCJcbiAgICAoa2V5RW50ZXIpPVwib25LZXlFbnRlcigkZXZlbnQpXCJcbiAgICAoa2V5RXNjYXBlKT1cIm9uS2V5RXNjYXBlKClcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImRvU2VhcmNoKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgIGF1aUZseW91dEFjdGlvblxuICAgIGF1aVNlbGVjdGFibGVBY3Rpb25zXG4gICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvQ29tcGxldGVcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBjbGFzcz1cImEtaW5wdXRcIlxuICAvPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRGlzYWJsZWRcIiBhdWlGbHlvdXRab25lPlxuICAgIDxzcGFuICpuZ0lmPVwiZm9jdXNlZCAmJiBsb2FkaW5nVGV4dCAmJiBzZWFyY2hpbmdcIiBjbGFzcz1cImEtc3Bpbm5lciBhLXNwaW5uZXItLXMgdS1tYXJnaW4teHNcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYS1zcGlubmVyX19jaXJjbGVcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImEtc3Bpbm5lcl9fdGV4dFwiPnt7IGxvYWRpbmdUZXh0IH19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIHNlYXJjaEluY2VudGl2ZVRleHQgJiYgIXNlYXJjaGluZyAmJiAhcXVlcnkgJiYgIXJlc3VsdHMubGVuZ3RoXCJcbiAgICAgIGNsYXNzPVwiby1hdXRvLWNvbXBsZXRlX19pbmZvIHUtdGV4dC1saWdodCB1LW1hcmdpbi14c1wiXG4gICAgICA+e3sgc2VhcmNoSW5jZW50aXZlVGV4dCB9fTwvc3BhblxuICAgID5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIG5vUmVzdWx0c1RleHQgJiYgIXNlYXJjaGluZyAmJiBxdWVyeSAmJiAhcmVzdWx0cy5sZW5ndGhcIlxuICAgICAgY2xhc3M9XCJvLWF1dG8tY29tcGxldGVfX2luZm8gdS10ZXh0LWxpZ2h0IHUtbWFyZ2luLXhzXCJcbiAgICAgID57eyBub1Jlc3VsdHNUZXh0IH19PC9zcGFuXG4gICAgPlxuICAgIDxhdWktc2VsZWN0YWJsZS1saXN0XG4gICAgICAoc2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cInJlc3VsdHMubGVuZ3RoID4gMCAmJiAhKGZvY3VzZWQgJiYgbG9hZGluZ1RleHQgJiYgc2VhcmNoaW5nKVwiXG4gICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiXG4gICAgICBbaXRlbXNdPVwicmVzdWx0c1wiXG4gICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgW3NlYXJjaF09XCJxdWVyeVwiXG4gICAgPjwvYXVpLXNlbGVjdGFibGUtbGlzdD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|