@skyux/phone-field 5.7.2 → 6.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +8 -0
- package/esm2020/lib/modules/phone-field/phone-field-adapter.service.mjs +64 -0
- package/esm2020/lib/modules/phone-field/phone-field-input.directive.mjs +280 -0
- package/esm2020/lib/modules/phone-field/phone-field.component.mjs +332 -0
- package/esm2020/lib/modules/phone-field/phone-field.module.mjs +50 -0
- package/esm2020/lib/modules/phone-field/types/country.mjs +2 -0
- package/esm2020/lib/modules/phone-field/types/number-return-format.mjs +2 -0
- package/esm2020/lib/modules/shared/sky-phone-field-resources.module.mjs +60 -0
- package/esm2020/skyux-phone-field.mjs +5 -0
- package/esm2020/testing/phonefield/phone-field-fixture.mjs +160 -0
- package/esm2020/testing/phonefield/phone-field-testing.module.mjs +27 -0
- package/esm2020/testing/public-api.mjs +3 -0
- package/esm2020/testing/skyux-phone-field-testing.mjs +5 -0
- package/fesm2015/{skyux-phone-field-testing.js → skyux-phone-field-testing.mjs} +5 -5
- package/fesm2015/skyux-phone-field-testing.mjs.map +1 -0
- package/fesm2015/skyux-phone-field.mjs +771 -0
- package/fesm2015/skyux-phone-field.mjs.map +1 -0
- package/fesm2020/skyux-phone-field-testing.mjs +194 -0
- package/fesm2020/skyux-phone-field-testing.mjs.map +1 -0
- package/{fesm2015/skyux-phone-field.js → fesm2020/skyux-phone-field.mjs} +22 -30
- package/fesm2020/skyux-phone-field.mjs.map +1 -0
- package/package.json +42 -18
- package/testing/package.json +5 -5
- package/bundles/skyux-phone-field-testing.umd.js +0 -658
- package/bundles/skyux-phone-field.umd.js +0 -1162
- package/esm2015/index.js +0 -8
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js +0 -64
- package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/phone-field/phone-field-input.directive.js +0 -280
- package/esm2015/lib/modules/phone-field/phone-field-input.directive.js.map +0 -1
- package/esm2015/lib/modules/phone-field/phone-field.component.js +0 -340
- package/esm2015/lib/modules/phone-field/phone-field.component.js.map +0 -1
- package/esm2015/lib/modules/phone-field/phone-field.module.js +0 -50
- package/esm2015/lib/modules/phone-field/phone-field.module.js.map +0 -1
- package/esm2015/lib/modules/phone-field/types/country.js +0 -2
- package/esm2015/lib/modules/phone-field/types/country.js.map +0 -1
- package/esm2015/lib/modules/phone-field/types/number-return-format.js +0 -2
- package/esm2015/lib/modules/phone-field/types/number-return-format.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js +0 -60
- package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js.map +0 -1
- package/esm2015/skyux-phone-field.js +0 -5
- package/esm2015/skyux-phone-field.js.map +0 -1
- package/esm2015/testing/phonefield/phone-field-fixture.js +0 -185
- package/esm2015/testing/phonefield/phone-field-fixture.js.map +0 -1
- package/esm2015/testing/phonefield/phone-field-testing.module.js +0 -27
- package/esm2015/testing/phonefield/phone-field-testing.module.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -3
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-phone-field-testing.js +0 -5
- package/esm2015/testing/skyux-phone-field-testing.js.map +0 -1
- package/fesm2015/skyux-phone-field-testing.js.map +0 -1
- package/fesm2015/skyux-phone-field.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './lib/modules/phone-field/phone-field.module';
|
|
2
|
+
export * from './lib/modules/phone-field/types/country';
|
|
3
|
+
export * from './lib/modules/phone-field/types/number-return-format';
|
|
4
|
+
// Components and directives must be exported to support Angular's "partial" Ivy compiler.
|
|
5
|
+
// Obscure names are used to indicate types are not part of the public API.
|
|
6
|
+
export { SkyPhoneFieldComponent as λ1 } from './lib/modules/phone-field/phone-field.component';
|
|
7
|
+
export { SkyPhoneFieldInputDirective as λ2 } from './lib/modules/phone-field/phone-field-input.directive';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcGhvbmUtZmllbGQvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNEQUFzRCxDQUFDO0FBRXJFLDBGQUEwRjtBQUMxRiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixJQUFJLEVBQUUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSwyQkFBMkIsSUFBSSxFQUFFLEVBQUUsTUFBTSx1REFBdUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvcGhvbmUtZmllbGQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvdHlwZXMvY291bnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3R5cGVzL251bWJlci1yZXR1cm4tZm9ybWF0JztcblxuLy8gQ29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGV4cG9ydGVkIHRvIHN1cHBvcnQgQW5ndWxhcidzIFwicGFydGlhbFwiIEl2eSBjb21waWxlci5cbi8vIE9ic2N1cmUgbmFtZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdHlwZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuZXhwb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCBhcyDOuzEgfSBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3Bob25lLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgeyBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUgYXMgzrsyIH0gZnJvbSAnLi9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUnO1xuIl19
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Injectable, Renderer2 } from '@angular/core';
|
|
2
|
+
import { SkyLibResourcesService } from '@skyux/i18n';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { takeUntil } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@skyux/i18n";
|
|
7
|
+
/**
|
|
8
|
+
* Service for interacting with the DOM elements of the phone field.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export class SkyPhoneFieldAdapterService {
|
|
12
|
+
constructor(renderer, resourcesService) {
|
|
13
|
+
this.renderer = renderer;
|
|
14
|
+
this.resourcesService = resourcesService;
|
|
15
|
+
this.ngUnsubscribe = new Subject();
|
|
16
|
+
}
|
|
17
|
+
ngOnDestroy() {
|
|
18
|
+
this.ngUnsubscribe.next();
|
|
19
|
+
this.ngUnsubscribe.complete();
|
|
20
|
+
}
|
|
21
|
+
addElementClass(elementRef, className) {
|
|
22
|
+
this.renderer.addClass(elementRef.nativeElement, className);
|
|
23
|
+
}
|
|
24
|
+
setElementDisabledState(elementRef, disabled) {
|
|
25
|
+
this.renderer.setProperty(elementRef.nativeElement, 'disabled', disabled);
|
|
26
|
+
}
|
|
27
|
+
setElementPlaceholder(elementRef, placeholder) {
|
|
28
|
+
this.renderer.setAttribute(elementRef.nativeElement, 'placeholder', placeholder);
|
|
29
|
+
}
|
|
30
|
+
setElementType(elementRef) {
|
|
31
|
+
this.renderer.setAttribute(elementRef.nativeElement, 'type', 'tel');
|
|
32
|
+
}
|
|
33
|
+
setElementValue(elementRef, value) {
|
|
34
|
+
if (value) {
|
|
35
|
+
this.renderer.setProperty(elementRef.nativeElement, 'value', value);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setAriaLabel(element) {
|
|
39
|
+
/* Sanity check */
|
|
40
|
+
/* istanbul ignore else */
|
|
41
|
+
if (!element.nativeElement.getAttribute('aria-label')) {
|
|
42
|
+
this.resourcesService
|
|
43
|
+
.getString('skyux_phone_field_default_label')
|
|
44
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
45
|
+
.subscribe((value) => {
|
|
46
|
+
this.renderer.setAttribute(element.nativeElement, 'aria-label', value);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
focusCountrySearchElement(el) {
|
|
51
|
+
const input = el.querySelector('textarea');
|
|
52
|
+
input.focus();
|
|
53
|
+
}
|
|
54
|
+
focusPhoneInput(el) {
|
|
55
|
+
const input = el.querySelector('.sky-phone-field-container input');
|
|
56
|
+
input.focus();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
SkyPhoneFieldAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService, deps: [{ token: i0.Renderer2 }, { token: i1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
60
|
+
SkyPhoneFieldAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService });
|
|
61
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldAdapterService, decorators: [{
|
|
62
|
+
type: Injectable
|
|
63
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.SkyLibResourcesService }]; } });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFM0M7OztHQUdHO0FBRUgsTUFBTSxPQUFPLDJCQUEyQjtJQUd0QyxZQUNVLFFBQW1CLEVBQ25CLGdCQUF3QztRQUR4QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFKMUMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBS25DLENBQUM7SUFFRyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sZUFBZSxDQUFDLFVBQXNCLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sdUJBQXVCLENBQzVCLFVBQXNCLEVBQ3RCLFFBQWlCO1FBRWpCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxxQkFBcUIsQ0FDMUIsVUFBc0IsRUFDdEIsV0FBbUI7UUFFbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQ3hCLFVBQVUsQ0FBQyxhQUFhLEVBQ3hCLGFBQWEsRUFDYixXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjLENBQUMsVUFBc0I7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxVQUFzQixFQUFFLEtBQWE7UUFDMUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsT0FBbUI7UUFDckMsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsU0FBUyxDQUFDLGlDQUFpQyxDQUFDO2lCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixPQUFPLENBQUMsYUFBYSxFQUNyQixZQUFZLEVBQ1osS0FBSyxDQUNOLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQVc7UUFDMUMsTUFBTSxLQUFLLEdBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxlQUFlLENBQUMsRUFBVztRQUNoQyxNQUFNLEtBQUssR0FBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FDekMsa0NBQWtDLENBQ25DLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsQ0FBQzs7d0hBeEVVLDJCQUEyQjs0SEFBM0IsMkJBQTJCOzJGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIERPTSBlbGVtZW50cyBvZiB0aGUgcGhvbmUgZmllbGQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreVBob25lRmllbGRBZGFwdGVyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkRWxlbWVudENsYXNzKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWxlbWVudERpc2FibGVkU3RhdGUoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBkaXNhYmxlZDogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoXG4gICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgcGxhY2Vob2xkZXJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0eXBlJywgJ3RlbCcpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRWYWx1ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBcmlhTGFiZWwoZWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZVxuICAgICAgICAuZ2V0U3RyaW5nKCdza3l1eF9waG9uZV9maWVsZF9kZWZhdWx0X2xhYmVsJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzQ291bnRyeVNlYXJjaEVsZW1lbnQoZWw6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dDogSFRNTEVsZW1lbnQgPSBlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNQaG9uZUlucHV0KGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQ6IEhUTUxFbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcihcbiAgICAgICcuc2t5LXBob25lLWZpZWxkLWNvbnRhaW5lciBpbnB1dCdcbiAgICApO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, forwardRef, } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
3
|
+
import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';
|
|
4
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
5
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { SkyPhoneFieldAdapterService } from './phone-field-adapter.service';
|
|
7
|
+
import { SkyPhoneFieldComponent } from './phone-field.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./phone-field-adapter.service";
|
|
10
|
+
import * as i2 from "./phone-field.component";
|
|
11
|
+
// tslint:disable:no-forward-ref no-use-before-declare
|
|
12
|
+
const SKY_PHONE_FIELD_VALUE_ACCESSOR = {
|
|
13
|
+
provide: NG_VALUE_ACCESSOR,
|
|
14
|
+
useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
|
|
15
|
+
multi: true,
|
|
16
|
+
};
|
|
17
|
+
const SKY_PHONE_FIELD_VALIDATOR = {
|
|
18
|
+
provide: NG_VALIDATORS,
|
|
19
|
+
useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
|
|
20
|
+
multi: true,
|
|
21
|
+
};
|
|
22
|
+
// tslint:enable
|
|
23
|
+
/**
|
|
24
|
+
* Creates a button, search input, and text input for entering and validating
|
|
25
|
+
* international phone numbers. Place this attribute on an `input` element, and wrap
|
|
26
|
+
* that element in a `sky-phone-field` component. By default, the country selector
|
|
27
|
+
* button displays a flag icon for the default country, and the phone number input
|
|
28
|
+
* displays a sample of the correct phone number format. When users select the country
|
|
29
|
+
* selector button, they expose the country search input, which is
|
|
30
|
+
* [an autocomplete input](https://developer.blackbaud.com/skyux/components/autocomplete)
|
|
31
|
+
* that allows them to select different countries. When users enter `+` followed by an
|
|
32
|
+
* international dial code in the phone number input, the country automatically switches
|
|
33
|
+
* to the country associated with the dial code.
|
|
34
|
+
* @required
|
|
35
|
+
*/
|
|
36
|
+
export class SkyPhoneFieldInputDirective {
|
|
37
|
+
constructor(changeDetector, elRef, adapterService, phoneFieldComponent) {
|
|
38
|
+
this.changeDetector = changeDetector;
|
|
39
|
+
this.elRef = elRef;
|
|
40
|
+
this.adapterService = adapterService;
|
|
41
|
+
this.phoneFieldComponent = phoneFieldComponent;
|
|
42
|
+
/**
|
|
43
|
+
* Indicates whether to prevent validation on the phone number input. For validation,
|
|
44
|
+
* phone numbers are driven through the `ngModel` attribute that you specify on an
|
|
45
|
+
* `input` element or on a `FormControl` in a reactive form. To prevent validation,
|
|
46
|
+
* set this property to `true`.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
this.skyPhoneFieldNoValidate = false;
|
|
50
|
+
this.ngUnsubscribe = new Subject();
|
|
51
|
+
this.phoneUtils = PhoneNumberUtil.getInstance();
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
53
|
+
this.onChange = (_) => { };
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
55
|
+
this.onTouched = () => { };
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
57
|
+
this.validatorChange = () => { };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Indicates whether to disable the phone field.
|
|
61
|
+
* @default false
|
|
62
|
+
*/
|
|
63
|
+
set disabled(value) {
|
|
64
|
+
this.phoneFieldComponent.countrySelectDisabled = value;
|
|
65
|
+
this.adapterService.setElementDisabledState(this.elRef, value);
|
|
66
|
+
this._disabled = value;
|
|
67
|
+
}
|
|
68
|
+
get disabled() {
|
|
69
|
+
return this._disabled || false;
|
|
70
|
+
}
|
|
71
|
+
set modelValue(value) {
|
|
72
|
+
this._modelValue = value;
|
|
73
|
+
this.adapterService.setElementValue(this.elRef, value);
|
|
74
|
+
if (value) {
|
|
75
|
+
const formattedValue = this.formatNumber(value.toString());
|
|
76
|
+
this.onChange(formattedValue);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.onChange(value);
|
|
80
|
+
}
|
|
81
|
+
this.validatorChange();
|
|
82
|
+
}
|
|
83
|
+
get modelValue() {
|
|
84
|
+
return this._modelValue;
|
|
85
|
+
}
|
|
86
|
+
ngOnInit() {
|
|
87
|
+
if (!this.phoneFieldComponent) {
|
|
88
|
+
throw new Error('You must wrap the `skyPhoneFieldInput` directive within a ' +
|
|
89
|
+
'`<sky-phone-field>` component!');
|
|
90
|
+
}
|
|
91
|
+
this.adapterService.setElementType(this.elRef);
|
|
92
|
+
this.adapterService.addElementClass(this.elRef, 'sky-form-control');
|
|
93
|
+
if (this.phoneFieldComponent.selectedCountry) {
|
|
94
|
+
this.adapterService.setElementPlaceholder(this.elRef, this.phoneFieldComponent.selectedCountry.exampleNumber);
|
|
95
|
+
}
|
|
96
|
+
this.adapterService.setAriaLabel(this.elRef);
|
|
97
|
+
}
|
|
98
|
+
ngAfterViewInit() {
|
|
99
|
+
this.phoneFieldComponent.selectedCountryChange
|
|
100
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
101
|
+
.subscribe((country) => {
|
|
102
|
+
this.modelValue = this.elRef.nativeElement.value;
|
|
103
|
+
this.adapterService.setElementPlaceholder(this.elRef, country.exampleNumber);
|
|
104
|
+
});
|
|
105
|
+
// This is needed to address a bug in Angular 4, where the value is not changed on the view.
|
|
106
|
+
// See: https://github.com/angular/angular/issues/13792
|
|
107
|
+
/* istanbul ignore else */
|
|
108
|
+
if (this.control && this.modelValue) {
|
|
109
|
+
this.control.setValue(this.modelValue, { emitEvent: false });
|
|
110
|
+
this.changeDetector.detectChanges();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
ngOnDestroy() {
|
|
114
|
+
this.ngUnsubscribe.next();
|
|
115
|
+
this.ngUnsubscribe.complete();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Writes the new value for reactive forms on change events on the input element
|
|
119
|
+
* @param event The change event that was received
|
|
120
|
+
*/
|
|
121
|
+
onInputChange(event) {
|
|
122
|
+
if (!this.textChanges) {
|
|
123
|
+
this.setupTextChangeSubscription(event.target.value);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.textChanges.next(event.target.value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Marks reactive form controls as touched on input blur events
|
|
131
|
+
*/
|
|
132
|
+
onInputBlur() {
|
|
133
|
+
this.onTouched();
|
|
134
|
+
}
|
|
135
|
+
onInputTyping(event) {
|
|
136
|
+
if (!this.textChanges) {
|
|
137
|
+
this.setupTextChangeSubscription(event.target.value);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.textChanges.next(event.target.value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Writes the new value for reactive forms
|
|
145
|
+
* @param value The new value for the input
|
|
146
|
+
*/
|
|
147
|
+
writeValue(value) {
|
|
148
|
+
this.phoneFieldComponent.setCountryByDialCode(value);
|
|
149
|
+
this.modelValue = value;
|
|
150
|
+
}
|
|
151
|
+
registerOnChange(fn) {
|
|
152
|
+
this.onChange = fn;
|
|
153
|
+
}
|
|
154
|
+
registerOnTouched(fn) {
|
|
155
|
+
this.onTouched = fn;
|
|
156
|
+
}
|
|
157
|
+
registerOnValidatorChange(fn) {
|
|
158
|
+
this.validatorChange = fn;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Sets the disabled state on the input
|
|
162
|
+
* @param isDisabled the new value of the input's disabled state
|
|
163
|
+
*/
|
|
164
|
+
setDisabledState(isDisabled) {
|
|
165
|
+
this.disabled = isDisabled;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Validate's the form control's current value
|
|
169
|
+
* @param control the form control for the input
|
|
170
|
+
*/
|
|
171
|
+
validate(control) {
|
|
172
|
+
if (!this.control) {
|
|
173
|
+
this.control = control;
|
|
174
|
+
}
|
|
175
|
+
if (this.skyPhoneFieldNoValidate) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const value = control.value;
|
|
179
|
+
if (!value) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (this.phoneFieldComponent.selectedCountry &&
|
|
183
|
+
!this.validateNumber(value)) {
|
|
184
|
+
if (!this.textChanges) {
|
|
185
|
+
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
|
186
|
+
// (This is only required when the invalid value is set by the FormControl constructor.)
|
|
187
|
+
// We don't do this if the input is the active element so that we don't show validation
|
|
188
|
+
// errors unless it is invalid on initialization or the input has been blurred.
|
|
189
|
+
control.markAsTouched();
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
skyPhoneField: {
|
|
193
|
+
invalid: value,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
setupTextChangeSubscription(text) {
|
|
199
|
+
this.textChanges = new BehaviorSubject(text);
|
|
200
|
+
this.textChanges
|
|
201
|
+
.pipe(debounceTime(500), takeUntil(this.ngUnsubscribe))
|
|
202
|
+
.subscribe((newValue) => {
|
|
203
|
+
this.writeValue(newValue);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
validateNumber(phoneNumber) {
|
|
207
|
+
try {
|
|
208
|
+
const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
|
|
209
|
+
if (!this.phoneFieldComponent.allowExtensions &&
|
|
210
|
+
numberObj.getExtension()) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
return this.phoneUtils.isValidNumber(numberObj);
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Format's the given phone number based on the currently selected country.
|
|
221
|
+
* @param phoneNumber The number to format
|
|
222
|
+
*/
|
|
223
|
+
formatNumber(phoneNumber) {
|
|
224
|
+
try {
|
|
225
|
+
const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
|
|
226
|
+
if (this.phoneUtils.isPossibleNumber(numberObj)) {
|
|
227
|
+
switch (this.phoneFieldComponent.returnFormat) {
|
|
228
|
+
case 'international':
|
|
229
|
+
return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
|
|
230
|
+
case 'national':
|
|
231
|
+
return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
|
|
232
|
+
case 'default':
|
|
233
|
+
default:
|
|
234
|
+
if (this.phoneFieldComponent.selectedCountry.iso2 !==
|
|
235
|
+
this.phoneFieldComponent.defaultCountry) {
|
|
236
|
+
return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
return phoneNumber;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
/* sanity check */
|
|
249
|
+
/* istanbul ignore next */
|
|
250
|
+
return phoneNumber;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
SkyPhoneFieldInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyPhoneFieldAdapterService, optional: true }, { token: i2.SkyPhoneFieldComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
255
|
+
SkyPhoneFieldInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyPhoneFieldInputDirective, selector: "[skyPhoneFieldInput]", inputs: { disabled: "disabled", skyPhoneFieldNoValidate: "skyPhoneFieldNoValidate" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInputTyping($event)" } }, providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR], ngImport: i0 });
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPhoneFieldInputDirective, decorators: [{
|
|
257
|
+
type: Directive,
|
|
258
|
+
args: [{
|
|
259
|
+
selector: '[skyPhoneFieldInput]',
|
|
260
|
+
providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR],
|
|
261
|
+
}]
|
|
262
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyPhoneFieldAdapterService, decorators: [{
|
|
263
|
+
type: Optional
|
|
264
|
+
}] }, { type: i2.SkyPhoneFieldComponent, decorators: [{
|
|
265
|
+
type: Optional
|
|
266
|
+
}] }]; }, propDecorators: { disabled: [{
|
|
267
|
+
type: Input
|
|
268
|
+
}], skyPhoneFieldNoValidate: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], onInputChange: [{
|
|
271
|
+
type: HostListener,
|
|
272
|
+
args: ['change', ['$event']]
|
|
273
|
+
}], onInputBlur: [{
|
|
274
|
+
type: HostListener,
|
|
275
|
+
args: ['blur']
|
|
276
|
+
}], onInputTyping: [{
|
|
277
|
+
type: HostListener,
|
|
278
|
+
args: ['input', ['$event']]
|
|
279
|
+
}] } });
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBR2pFLHNEQUFzRDtBQUN0RCxNQUFNLDhCQUE4QixHQUFHO0lBQ3JDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FB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QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixFQUFFLHlCQUF5QixDQUFDO2lCQUN2RTs7MEJBK0RJLFFBQVE7OzBCQUNSLFFBQVE7NENBdkRBLFFBQVE7c0JBRGxCLEtBQUs7Z0JBbUJDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkEyRkMsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYTNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsTUFBTTtnQkFNYixhQUFhO3NCQURuQixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBob25lTnVtYmVyRm9ybWF0LCBQaG9uZU51bWJlclV0aWwgfSBmcm9tICdnb29nbGUtbGlicGhvbmVudW1iZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZEFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vcGhvbmUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVBob25lRmllbGRDb3VudHJ5IH0gZnJvbSAnLi90eXBlcy9jb3VudHJ5JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tZm9yd2FyZC1yZWYgbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG5jb25zdCBTS1lfUEhPTkVfRklFTERfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IFNLWV9QSE9ORV9GSUVMRF9WQUxJREFUT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNreVBob25lRmllbGRJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcbi8vIHRzbGludDplbmFibGVcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnV0dG9uLCBzZWFyY2ggaW5wdXQsIGFuZCB0ZXh0IGlucHV0IGZvciBlbnRlcmluZyBhbmQgdmFsaWRhdGluZ1xuICogaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXJzLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiBhbiBgaW5wdXRgIGVsZW1lbnQsIGFuZCB3cmFwXG4gKiB0aGF0IGVsZW1lbnQgaW4gYSBgc2t5LXBob25lLWZpZWxkYCBjb21wb25lbnQuIEJ5IGRlZmF1bHQsIHRoZSBjb3VudHJ5IHNlbGVjdG9yXG4gKiBidXR0b24gZGlzcGxheXMgYSBmbGFnIGljb24gZm9yIHRoZSBkZWZhdWx0IGNvdW50cnksIGFuZCB0aGUgcGhvbmUgbnVtYmVyIGlucHV0XG4gKiBkaXNwbGF5cyBhIHNhbXBsZSBvZiB0aGUgY29ycmVjdCBwaG9uZSBudW1iZXIgZm9ybWF0LiBXaGVuIHVzZXJzIHNlbGVjdCB0aGUgY291bnRyeVxuICogc2VsZWN0b3IgYnV0dG9uLCB0aGV5IGV4cG9zZSB0aGUgY291bnRyeSBzZWFyY2ggaW5wdXQsIHdoaWNoIGlzXG4gKiBbYW4gYXV0b2NvbXBsZXRlIGlucHV0XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlKVxuICogdGhhdCBhbGxvd3MgdGhlbSB0byBzZWxlY3QgZGlmZmVyZW50IGNvdW50cmllcy4gV2hlbiB1c2VycyBlbnRlciBgK2AgZm9sbG93ZWQgYnkgYW5cbiAqIGludGVybmF0aW9uYWwgZGlhbCBjb2RlIGluIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQsIHRoZSBjb3VudHJ5IGF1dG9tYXRpY2FsbHkgc3dpdGNoZXNcbiAqIHRvIHRoZSBjb3VudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlhbCBjb2RlLlxuICogQHJlcXVpcmVkXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tza3lQaG9uZUZpZWxkSW5wdXRdJyxcbiAgcHJvdmlkZXJzOiBbU0tZX1BIT05FX0ZJRUxEX1ZBTFVFX0FDQ0VTU09SLCBTS1lfUEhPTkVfRklFTERfVkFMSURBVE9SXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5UGhvbmVGaWVsZElucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3JcbntcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIHBob25lIGZpZWxkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5jb3VudHJ5U2VsZWN0RGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnREaXNhYmxlZFN0YXRlKHRoaXMuZWxSZWYsIHZhbHVlKTtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gcHJldmVudCB2YWxpZGF0aW9uIG9uIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQuIEZvciB2YWxpZGF0aW9uLFxuICAgKiBwaG9uZSBudW1iZXJzIGFyZSBkcml2ZW4gdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSB0aGF0IHlvdSBzcGVjaWZ5IG9uIGFuXG4gICAqIGBpbnB1dGAgZWxlbWVudCBvciBvbiBhIGBGb3JtQ29udHJvbGAgaW4gYSByZWFjdGl2ZSBmb3JtLiBUbyBwcmV2ZW50IHZhbGlkYXRpb24sXG4gICAqIHNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBza3lQaG9uZUZpZWxkTm9WYWxpZGF0ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc2V0IG1vZGVsVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vZGVsVmFsdWUgPSB2YWx1ZTtcblxuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWxlbWVudFZhbHVlKHRoaXMuZWxSZWYsIHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZS50b1N0cmluZygpKTtcblxuICAgICAgdGhpcy5vbkNoYW5nZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbW9kZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgcHJpdmF0ZSB0ZXh0Q2hhbmdlczogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHBob25lVXRpbHMgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9tb2RlbFZhbHVlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhZGFwdGVyU2VydmljZTogU2t5UGhvbmVGaWVsZEFkYXB0ZXJTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcGhvbmVGaWVsZENvbXBvbmVudDogU2t5UGhvbmVGaWVsZENvbXBvbmVudFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgbXVzdCB3cmFwIHRoZSBgc2t5UGhvbmVGaWVsZElucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LXBob25lLWZpZWxkPmAgY29tcG9uZW50ISdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFbGVtZW50VHlwZSh0aGlzLmVsUmVmKTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmFkZEVsZW1lbnRDbGFzcyh0aGlzLmVsUmVmLCAnc2t5LWZvcm0tY29udHJvbCcpO1xuICAgIGlmICh0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICAgICAgdGhpcy5lbFJlZixcbiAgICAgICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNlbGVjdGVkQ291bnRyeS5leGFtcGxlTnVtYmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0QXJpYUxhYmVsKHRoaXMuZWxSZWYpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5Q2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvdW50cnk6IFNreVBob25lRmllbGRDb3VudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFbGVtZW50UGxhY2Vob2xkZXIoXG4gICAgICAgICAgdGhpcy5lbFJlZixcbiAgICAgICAgICBjb3VudHJ5LmV4YW1wbGVOdW1iZXJcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDQsIHdoZXJlIHRoZSB2YWx1ZSBpcyBub3QgY2hhbmdlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMubW9kZWxWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBuZXcgdmFsdWUgZm9yIHJlYWN0aXZlIGZvcm1zIG9uIGNoYW5nZSBldmVudHMgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBjaGFuZ2UgZXZlbnQgdGhhdCB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGV4dENoYW5nZXMpIHtcbiAgICAgIHRoaXMuc2V0dXBUZXh0Q2hhbmdlU3Vic2NyaXB0aW9uKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dENoYW5nZXMubmV4dChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyByZWFjdGl2ZSBmb3JtIGNvbnRyb2xzIGFzIHRvdWNoZWQgb24gaW5wdXQgYmx1ciBldmVudHNcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSW5wdXRUeXBpbmcoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZXh0Q2hhbmdlcykge1xuICAgICAgdGhpcy5zZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q2hhbmdlcy5uZXh0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgbmV3IHZhbHVlIGZvciByZWFjdGl2ZSBmb3Jtc1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGlucHV0XG4gICAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNldENvdW50cnlCeURpYWxDb2RlKHZhbHVlKTtcblxuICAgIHRoaXMubW9kZWxWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb24gdGhlIGlucHV0XG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSdzIHRoZSBmb3JtIGNvbnRyb2wncyBjdXJyZW50IHZhbHVlXG4gICAqIEBwYXJhbSBjb250cm9sIHRoZSBmb3JtIGNvbnRyb2wgZm9yIHRoZSBpbnB1dFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNreVBob25lRmllbGROb1ZhbGlkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnkgJiZcbiAgICAgICF0aGlzLnZhbGlkYXRlTnVtYmVyKHZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKCF0aGlzLnRleHRDaGFuZ2VzKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgICAgLy8gKFRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnZhbGlkIHZhbHVlIGlzIHNldCBieSB0aGUgRm9ybUNvbnRyb2wgY29uc3RydWN0b3IuKVxuICAgICAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbnB1dCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQgc28gdGhhdCB3ZSBkb24ndCBzaG93IHZhbGlkYXRpb25cbiAgICAgICAgLy8gZXJyb3JzIHVubGVzcyBpdCBpcyBpbnZhbGlkIG9uIGluaXRpYWxpemF0aW9uIG9yIHRoZSBpbnB1dCBoYXMgYmVlbiBibHVycmVkLlxuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2t5UGhvbmVGaWVsZDoge1xuICAgICAgICAgIGludmFsaWQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwVGV4dENoYW5nZVN1YnNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRleHRDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0ZXh0KTtcblxuICAgIHRoaXMudGV4dENoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVOdW1iZXIocGhvbmVOdW1iZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBudW1iZXJPYmogPSB0aGlzLnBob25lVXRpbHMucGFyc2VBbmRLZWVwUmF3SW5wdXQoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmlzbzJcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5hbGxvd0V4dGVuc2lvbnMgJiZcbiAgICAgICAgbnVtYmVyT2JqLmdldEV4dGVuc2lvbigpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmlzVmFsaWROdW1iZXIobnVtYmVyT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCdzIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb3VudHJ5LlxuICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIgVGhlIG51bWJlciB0byBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TnVtYmVyKHBob25lTnVtYmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBudW1iZXJPYmogPSB0aGlzLnBob25lVXRpbHMucGFyc2VBbmRLZWVwUmF3SW5wdXQoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmlzbzJcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5waG9uZVV0aWxzLmlzUG9zc2libGVOdW1iZXIobnVtYmVyT2JqKSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5yZXR1cm5Gb3JtYXQpIHtcbiAgICAgICAgICBjYXNlICdpbnRlcm5hdGlvbmFsJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBob25lVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0LklOVEVSTkFUSU9OQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnbmF0aW9uYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgIG51bWJlck9iaixcbiAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuTkFUSU9OQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNlbGVjdGVkQ291bnRyeS5pc28yICE9PVxuICAgICAgICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuZGVmYXVsdENvdW50cnlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuSU5URVJOQVRJT05BTFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgICAgbnVtYmVyT2JqLFxuICAgICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0Lk5BVElPTkFMXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwaG9uZU51bWJlcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm4gcGhvbmVOdW1iZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSB2YWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcbn1cbiJdfQ==
|