angular-phone-number
Version:
A comprehensive international phone number input component for Angular applications with country selection, validation, and formatting.
393 lines • 64.2 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output, forwardRef, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DomSanitizer } from '@angular/platform-browser';
import { Countries } from '../assets/country-dataset';
import { globeSVG } from '../assets/globe-svg';
import { isValidPhoneNumber } from 'libphonenumber-js';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class AngularPhoneNumber {
// Arab country codes - moved to a static property
static { this.ARAB_COUNTRY_CODES = ['SA', 'AE', 'QA', 'BH', 'KW', 'OM', 'JO', 'PS', 'LB', 'SY', 'IQ', 'YE', 'LY', 'EG', 'SD', 'SO', 'DJ', 'MA', 'DZ', 'TN', 'MR']; }
constructor(elementRef) {
this.elementRef = elementRef;
this.error = false;
this.defaultCountry = 'US'; // Added default value
this.preferredCountries = [];
this.border = true;
this.disabled = false;
this.language = 'en';
this.mode = 'all';
this.priorityCountries = [];
this.inputChanged = new EventEmitter();
this.countryChanged = new EventEmitter();
this.modalOpened = new EventEmitter();
this.sanitizer = inject(DomSanitizer);
this.countryList = Countries;
this.dataSet = Object.values(this.countryList);
this.showModal = false;
this.inputFocused = false;
this.value = '';
this.globeSVG = globeSVG;
// Callbacks for ControlValueAccessor
this.onChange = () => { };
this.onTouched = () => { };
}
// Handle click outside component
onClickOutside(event) {
const clickedInside = this.elementRef.nativeElement.contains(event.target);
const clickedOnInput = event.target.classList.contains('input-box');
if (!clickedInside || clickedOnInput) {
this.showModal = false;
this.modalOpened.emit(false); // Emit event when modal is closed
}
}
// Input event handlers
onBlur() {
this.inputFocused = false;
this.onTouched();
}
onFocus() {
this.inputFocused = true;
}
// ControlValueAccessor implementation
writeValue(value) {
if (value !== undefined) {
this.extractValues(value);
// Don't call onChange here - writeValue shouldn't trigger onChange
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
// Disable the component when needed
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
ngOnInit() {
this.initializeComponent();
}
ngOnChanges(changes) {
const shouldResetCountryList = changes['mode'] && !changes['mode'].firstChange;
if (shouldResetCountryList) {
// Reset country list to default
this.resetCountryList();
}
const needsReordering = (changes['mode'] && !changes['mode'].firstChange) || (changes['priorityCountries'] && !changes['priorityCountries'].firstChange);
if (needsReordering) {
this.applyCountryOrdering();
}
}
/**
* Initialize component with the correct country ordering and filtering
*/
initializeComponent() {
// Set default country
this.setDefaultCountry();
// Apply country ordering
this.applyCountryOrdering();
// Notify that the modal is closed initially
this.modalOpened.emit(false);
}
/**
* Apply all ordering rules to the country list
*/
applyCountryOrdering() {
// Finally apply preferred countries filter
this.applyPreferredCountriesFilter();
// First apply mode-based ordering
this.prioritizeArabCountries();
// Then apply custom priority countries
this.applyPriorityCountries();
}
/**
* Reset country list to the original dataset
*/
resetCountryList() {
this.countryList = { ...Countries };
this.dataSet = Object.values(this.countryList);
}
/**
* Sets the default country based on input
*/
setDefaultCountry() {
if (!this.defaultCountry) {
return;
}
const defCountryData = this.countryList[this.defaultCountry];
if (defCountryData) {
this.selectedCountry = defCountryData;
}
}
/**
* Apply preferred countries filter to narrow down the available options
*/
applyPreferredCountriesFilter() {
if (!this.preferredCountries || this.preferredCountries.length === 0) {
return;
}
// Filter the countries to include only preferred countries
const preferredCountryList = Object.fromEntries(Object.entries(this.countryList).filter(([code]) => this.preferredCountries.includes(code)));
// If preferred countries are found, update the countryList
if (Object.keys(preferredCountryList).length > 0) {
this.countryList = preferredCountryList;
this.dataSet = Object.values(this.countryList);
}
}
/**
* Toggle the country selection modal
*/
toggleModal() {
this.showModal = !this.showModal;
this.dataSet = Object.values(this.countryList);
this.modalOpened.emit(this.showModal);
}
/**
* Update the full phone number value and notify changes
*/
setFullPhoneNumber() {
const fullPhoneNumber = this.selectedCountry ? `${this.selectedCountry.dialCode}${this.value || ''}` : this.value || '';
this.onChange(fullPhoneNumber);
}
/**
* Handle country selection
*/
selectCountry(data) {
this.selectedCountry = data;
this.setFullPhoneNumber();
this.showModal = false;
this.countryChanged.emit(data);
}
/**
* Extract country code and phone number from input
*/
extractValues(phoneNumber) {
if (!phoneNumber) {
this.value = '';
return;
}
// Ensure we're working with a string
phoneNumber = phoneNumber.toString();
// Try to match with a country code
const countryCodes = Object.keys(Countries);
const sortedCodes = countryCodes.sort((a, b) => Countries[b].dialCode.length - Countries[a].dialCode.length);
// Check if the number starts with any country code
for (const code of sortedCodes) {
if (phoneNumber.startsWith(Countries[code].dialCode)) {
this.selectedCountry = Countries[code];
this.value = phoneNumber.substring(Countries[code].dialCode.length);
return;
}
}
// If no direct match was found, try to extract based on common prefixes
if (phoneNumber.startsWith('+')) {
// Try to match the first 1-4 digits as country code
for (let i = 1; i <= 4; i++) {
const prefix = phoneNumber.substring(0, i + 1); // include the + sign
const matchingCode = countryCodes.find((code) => `+${Countries[code].dialCode.replace('+', '')}` === prefix);
if (matchingCode) {
this.selectedCountry = Countries[matchingCode];
this.value = phoneNumber.substring(i + 1);
return;
}
}
// If still not found, just remove the + sign
this.value = phoneNumber.substring(1);
}
else {
// No + prefix, just use the value as is
this.value = phoneNumber;
}
}
/**
* Try to determine the country from user input
*/
getCountryWithInput() {
if (!this.value || this.selectedCountry) {
return;
}
const tempNum = `+${this.value}`;
// Only try to detect if we have at least a few digits
if (tempNum.length >= 4) {
const countryCodes = Object.keys(Countries);
const sortedCodes = countryCodes.sort((a, b) => Countries[b].dialCode.length - Countries[a].dialCode.length);
for (const code of sortedCodes) {
if (tempNum.startsWith(Countries[code].dialCode)) {
this.selectedCountry = Countries[code];
// Remove the country code from input value
this.value = this.value.substring(this.selectedCountry.dialCode.length - 1);
break;
}
}
}
}
/**
* Handle input changes
*/
onInputChanged() {
// Prevent non-numeric input
if (this.value === '') {
this.value = '';
return;
}
this.value = this.value?.toString().replace(/[^0-9]/g, '') || '';
this.getCountryWithInput();
this.setFullPhoneNumber();
this.inputChanged.emit(this.value);
}
/**
* Filter countries based on search term
*/
filterCountries(searchTerm) {
if (!searchTerm) {
this.dataSet = Object.values(this.countryList);
return;
}
// Convert search term to lowercase for case-insensitive matching
const term = searchTerm.toLowerCase();
this.dataSet = Object.values(this.countryList).filter((country) => country.country.toLowerCase().includes(term) || (country.countryAr && country.countryAr.toLowerCase().includes(term)) || country.dialCode.includes(term));
}
/**
* Handle search input changes
*/
onSearchChange(event) {
const searchTerm = event.target.value;
this.filterCountries(searchTerm);
}
/**
* Prioritize Arab countries if mode is 'ar'
*/
prioritizeArabCountries() {
if (this.mode !== 'ar') {
return;
}
const arabCountries = {};
const otherCountries = {};
// Split countries into Arab and non-Arab groups
Object.entries(this.countryList).forEach(([code, country]) => {
if (AngularPhoneNumber.ARAB_COUNTRY_CODES.includes(code)) {
arabCountries[code] = country;
}
else {
otherCountries[code] = country;
}
});
// Combine with Arab countries first
this.countryList = { ...arabCountries, ...otherCountries };
this.dataSet = Object.values(this.countryList);
}
/**
* Apply priority countries to the top of the list
*/
applyPriorityCountries() {
if (!this.priorityCountries || this.priorityCountries.length === 0) {
return;
}
const priorityCountries = {};
const otherCountries = {};
// Add priority countries in specified order
this.priorityCountries.forEach((code) => {
if (this.countryList[code]) {
priorityCountries[code] = Countries[code];
}
});
// Add remaining countries
Object.entries(this.countryList).forEach(([code, country]) => {
if (!this.priorityCountries.includes(code)) {
otherCountries[code] = country;
}
});
// Combine with priority countries first
this.countryList = { ...priorityCountries, ...otherCountries };
this.dataSet = Object.values(this.countryList);
}
/**
* Get sanitized SVG icon
*/
getIcon(iconString) {
if (iconString) {
return this.sanitizer.bypassSecurityTrustHtml(iconString);
}
return undefined;
}
/**
* Validate the phone number input
*/
validate() {
// Empty validation
if (!this.value || this.value === '') {
return { required: true };
}
// Create full phone number for validation
const fullPhoneNumber = this.selectedCountry ? `${this.selectedCountry.dialCode}${this.value}` : `+${this.value}`;
// Validate using libphonenumber-js
try {
if (!isValidPhoneNumber(fullPhoneNumber)) {
return { invalidPhoneNumber: true };
}
}
catch (error) {
return { invalidPhoneFormat: true };
}
return null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularPhoneNumber, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AngularPhoneNumber, isStandalone: true, selector: "angular-phone-number", inputs: { error: "error", defaultCountry: "defaultCountry", preferredCountries: "preferredCountries", border: "border", disabled: "disabled", language: "language", mode: "mode", priorityCountries: "priorityCountries" }, outputs: { inputChanged: "inputChanged", countryChanged: "countryChanged", modalOpened: "modalOpened" }, host: { listeners: { "document:mousedown": "onClickOutside($event)" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AngularPhoneNumber),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AngularPhoneNumber),
multi: true,
},
], usesOnChanges: true, ngImport: i0, template: "<div class=\"wrap flex form-control align-center\" [class.border]=\"border\" [class.active]=\"inputFocused\" [class.error]=\"error\">\r\n <div class=\"flex\">\r\n @if(selectedCountry){\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\">\r\n <img [src]=\"selectedCountry.flag\" [alt]=\"selectedCountry.country\" srcset=\"\" />\r\n </span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <span class=\"text ml-5\" (click)=\"!disabled && toggleModal()\">{{ selectedCountry.dialCode }}</span>\r\n }@else{\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" [innerHTML]=\"getIcon(globeSVG)\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\"></span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n\r\n <input class=\"input-box text\" type=\"number\" placeholder=\"\" [(ngModel)]=\"value\" [disabled]=\"disabled\" (input)=\"onChange(value); onInputChanged()\" (blur)=\"onBlur(); onTouched()\" (focus)=\"onFocus()\" />\r\n\r\n @if(showModal){\r\n <div class=\"modal-wrap\">\r\n <div class=\"search-box\">\r\n <div class=\"search-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M12.803 13.8637C13.0959 14.1566 13.5708 14.1566 13.8637 13.8637C14.1566 13.5708 14.1566 13.0959 13.8637 12.803L12.803 13.8637ZM11.25 7C11.25 9.34721 9.34721 11.25 7 11.25V12.75C10.1756 12.75 12.75 10.1756 12.75 7H11.25ZM7 11.25C4.65279 11.25 2.75 9.34721 2.75 7H1.25C1.25 10.1756 3.82436 12.75 7 12.75V11.25ZM2.75 7C2.75 4.65279 4.65279 2.75 7 2.75V1.25C3.82436 1.25 1.25 3.82436 1.25 7H2.75ZM7 2.75C9.34721 2.75 11.25 4.65279 11.25 7H12.75C12.75 3.82436 10.1756 1.25 7 1.25V2.75ZM13.8637 12.803L11.0719 10.0113L10.0113 11.0719L12.803 13.8637L13.8637 12.803Z\"\r\n fill=\"#546C84\"\r\n />\r\n </svg>\r\n </div>\r\n <input class=\"search-box\" (input)=\"onSearchChange($event)\" placeholder=\"Search\" />\r\n </div>\r\n <div class=\"country-list\">\r\n <div style=\"display: flex\" *ngFor=\"let data of dataSet\">\r\n <div class=\"modal-country-wrap flex\" (click)=\"selectCountry(data)\">\r\n <span class=\"flag\">\r\n <img [src]=\"data.flag\" [alt]=\"data.country\" srcset=\"\" />\r\n </span>\r\n <span class=\"modal-country ml-5\">{{ data.dialCode }}</span>\r\n <span class=\"modal-country ml-5\">{{ language == 'en' ? data.country : data.countryAr }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.wrap{position:relative;border-bottom:1px solid rgba(0,0,0,.1);border-radius:8px;height:45px;padding:0 12px;direction:ltr;background-color:#fff}.wrap .modal-wrap{position:absolute;background-color:#fff;top:55px;left:0;border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:6px;z-index:9999}.wrap .modal-wrap .country-list{margin-top:10px;overflow:-moz-scrollbars-none;overflow-y:scroll;width:280px;max-height:250px}.wrap .modal-wrap .country-list::-webkit-scrollbar{display:none}.wrap .modal-wrap .modal-country-wrap{width:100%;padding:5px 0}.wrap .modal-wrap .modal-country-wrap:hover{background-color:#0000001a}.wrap .modal-wrap .search-box{display:flex;align-items:center;gap:8px}.wrap .modal-wrap .search-box input{border:none;outline:none;width:100%;border-bottom:1px solid rgba(0,0,0,.1);font-size:13px}.wrap .input-box{border:none;outline:none;width:100%;padding:0 8px;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(0,0,0,.1)}.wrap .text{font-size:16px;font-weight:400;line-height:24px;letter-spacing:-.011px}.wrap .flag{width:20px;height:auto;display:flex;align-items:center}.active{border:1px solid #0043ce}.active .input-box{border-color:#0043ce}.error{border:1px solid #dd3130}.error .input-box{border-color:#dd3130}.border{border:1px solid rgba(0,0,0,.1)}.flex{display:flex}.align-center{align-items:center}.ml-5{margin-left:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularPhoneNumber, decorators: [{
type: Component,
args: [{ selector: 'angular-phone-number', standalone: true, imports: [CommonModule, FormsModule], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AngularPhoneNumber),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AngularPhoneNumber),
multi: true,
},
], template: "<div class=\"wrap flex form-control align-center\" [class.border]=\"border\" [class.active]=\"inputFocused\" [class.error]=\"error\">\r\n <div class=\"flex\">\r\n @if(selectedCountry){\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\">\r\n <img [src]=\"selectedCountry.flag\" [alt]=\"selectedCountry.country\" srcset=\"\" />\r\n </span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <span class=\"text ml-5\" (click)=\"!disabled && toggleModal()\">{{ selectedCountry.dialCode }}</span>\r\n }@else{\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" [innerHTML]=\"getIcon(globeSVG)\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\"></span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n\r\n <input class=\"input-box text\" type=\"number\" placeholder=\"\" [(ngModel)]=\"value\" [disabled]=\"disabled\" (input)=\"onChange(value); onInputChanged()\" (blur)=\"onBlur(); onTouched()\" (focus)=\"onFocus()\" />\r\n\r\n @if(showModal){\r\n <div class=\"modal-wrap\">\r\n <div class=\"search-box\">\r\n <div class=\"search-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M12.803 13.8637C13.0959 14.1566 13.5708 14.1566 13.8637 13.8637C14.1566 13.5708 14.1566 13.0959 13.8637 12.803L12.803 13.8637ZM11.25 7C11.25 9.34721 9.34721 11.25 7 11.25V12.75C10.1756 12.75 12.75 10.1756 12.75 7H11.25ZM7 11.25C4.65279 11.25 2.75 9.34721 2.75 7H1.25C1.25 10.1756 3.82436 12.75 7 12.75V11.25ZM2.75 7C2.75 4.65279 4.65279 2.75 7 2.75V1.25C3.82436 1.25 1.25 3.82436 1.25 7H2.75ZM7 2.75C9.34721 2.75 11.25 4.65279 11.25 7H12.75C12.75 3.82436 10.1756 1.25 7 1.25V2.75ZM13.8637 12.803L11.0719 10.0113L10.0113 11.0719L12.803 13.8637L13.8637 12.803Z\"\r\n fill=\"#546C84\"\r\n />\r\n </svg>\r\n </div>\r\n <input class=\"search-box\" (input)=\"onSearchChange($event)\" placeholder=\"Search\" />\r\n </div>\r\n <div class=\"country-list\">\r\n <div style=\"display: flex\" *ngFor=\"let data of dataSet\">\r\n <div class=\"modal-country-wrap flex\" (click)=\"selectCountry(data)\">\r\n <span class=\"flag\">\r\n <img [src]=\"data.flag\" [alt]=\"data.country\" srcset=\"\" />\r\n </span>\r\n <span class=\"modal-country ml-5\">{{ data.dialCode }}</span>\r\n <span class=\"modal-country ml-5\">{{ language == 'en' ? data.country : data.countryAr }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.wrap{position:relative;border-bottom:1px solid rgba(0,0,0,.1);border-radius:8px;height:45px;padding:0 12px;direction:ltr;background-color:#fff}.wrap .modal-wrap{position:absolute;background-color:#fff;top:55px;left:0;border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:6px;z-index:9999}.wrap .modal-wrap .country-list{margin-top:10px;overflow:-moz-scrollbars-none;overflow-y:scroll;width:280px;max-height:250px}.wrap .modal-wrap .country-list::-webkit-scrollbar{display:none}.wrap .modal-wrap .modal-country-wrap{width:100%;padding:5px 0}.wrap .modal-wrap .modal-country-wrap:hover{background-color:#0000001a}.wrap .modal-wrap .search-box{display:flex;align-items:center;gap:8px}.wrap .modal-wrap .search-box input{border:none;outline:none;width:100%;border-bottom:1px solid rgba(0,0,0,.1);font-size:13px}.wrap .input-box{border:none;outline:none;width:100%;padding:0 8px;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(0,0,0,.1)}.wrap .text{font-size:16px;font-weight:400;line-height:24px;letter-spacing:-.011px}.wrap .flag{width:20px;height:auto;display:flex;align-items:center}.active{border:1px solid #0043ce}.active .input-box{border-color:#0043ce}.error{border:1px solid #dd3130}.error .input-box{border-color:#dd3130}.border{border:1px solid rgba(0,0,0,.1)}.flex{display:flex}.align-center{align-items:center}.ml-5{margin-left:5px}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { error: [{
type: Input
}], defaultCountry: [{
type: Input
}], preferredCountries: [{
type: Input
}], border: [{
type: Input
}], disabled: [{
type: Input
}], language: [{
type: Input
}], mode: [{
type: Input
}], priorityCountries: [{
type: Input
}], inputChanged: [{
type: Output
}], countryChanged: [{
type: Output
}], modalOpened: [{
type: Output
}], onClickOutside: [{
type: HostListener,
args: ['document:mousedown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1waG9uZS1udW1iZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1waG9uZS1udW1iZXIvc3JjL2xpYi9hbmd1bGFyLXBob25lLW51bWJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXBob25lLW51bWJlci9zcmMvbGliL2FuZ3VsYXItcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixVQUFVLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2SixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUErQixNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBcUJ2RCxNQUFNLE9BQU8sa0JBQWtCO0lBc0I3QixrREFBa0Q7YUFDMUIsdUJBQWtCLEdBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFF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QjtrQkFuQjlCLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsYUFHekI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUM7NEJBQ2pELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7K0VBR1EsS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFrQlAsY0FBYztzQkFEYixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiwgaW5qZWN0LCBPbkluaXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ291bnRyaWVzIH0gZnJvbSAnLi4vYXNzZXRzL2NvdW50cnktZGF0YXNldCc7XHJcbmltcG9ydCB7IENvdW50cnlEYXRhIH0gZnJvbSAnLi4vZGF0YS10eXBlcy9jb3VudHJ5TGlzdCc7XHJcbmltcG9ydCB7IGdsb2JlU1ZHIH0gZnJvbSAnLi4vYXNzZXRzL2dsb2JlLXN2Zyc7XHJcbmltcG9ydCB7IENvdW50cnkgfSBmcm9tICcuLi9kYXRhLXR5cGVzL2NvdW50cnknO1xyXG5pbXBvcnQgeyBpc1ZhbGlkUGhvbmVOdW1iZXIgfSBmcm9tICdsaWJwaG9uZW51bWJlci1qcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItcGhvbmUtbnVtYmVyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1waG9uZS1udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FuZ3VsYXItcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBbmd1bGFyUGhvbmVOdW1iZXIpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFuZ3VsYXJQaG9uZU51bWJlciksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclBob25lTnVtYmVyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGVycm9yOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGVmYXVsdENvdW50cnkgPSAnVVMnOyAvLyBBZGRlZCBkZWZhdWx0IHZhbHVlXHJcbiAgQElucHV0KCkgcHJlZmVycmVkQ291bnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGJvcmRlciA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsYW5ndWFnZTogJ2FyJyB8ICdlbicgPSAnZW4nO1xyXG4gIEBJbnB1dCgpIG1vZGU6ICdhcicgfCAnYWxsJyA9ICdhbGwnO1xyXG4gIEBJbnB1dCgpIHByaW9yaXR5Q291bnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bWJlciB8IG51bGw+KCk7XHJcbiAgQE91dHB1dCgpIGNvdW50cnlDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDb3VudHJ5IHwgbnVsbD4oKTtcclxuICBAT3V0cHV0KCkgbW9kYWxPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIHNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xyXG4gIGNvdW50cnlMaXN0OiBDb3VudHJ5RGF0YSA9IENvdW50cmllcztcclxuICBkYXRhU2V0OiBDb3VudHJ5W10gPSBPYmplY3QudmFsdWVzKHRoaXMuY291bnRyeUxpc3QpO1xyXG4gIHNob3dNb2RhbCA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkQ291bnRyeSE6IENvdW50cnk7XHJcbiAgaW5wdXRGb2N1c2VkID0gZmFsc2U7XHJcbiAgdmFsdWUgPSAnJztcclxuICBnbG9iZVNWRzogc3RyaW5nID0gZ2xvYmVTVkc7XHJcblxyXG4gIC8vIEFyYWIgY291bnRyeSBjb2RlcyAtIG1vdmVkIHRvIGEgc3RhdGljIHByb3BlcnR5XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJBQl9DT1VOVFJZX0NPREVTOiBzdHJpbmdbXSA9IFsnU0EnLCAnQUUnLCAnUUEnLCAnQkgnLCAnS1cnLCAnT00nLCAnSk8nLCAnUFMnLCAnTEInLCAnU1knLCAnSVEnLCAnWUUnLCAnTFknLCAnRUcnLCAnU0QnLCAnU08nLCAnREonLCAnTUEnLCAnRFonLCAnVE4nLCAnTVInXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICAvLyBIYW5kbGUgY2xpY2sgb3V0c2lkZSBjb21wb25lbnRcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuICAgIGNvbnN0IGNsaWNrZWRPbklucHV0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnB1dC1ib3gnKTtcclxuXHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUgfHwgY2xpY2tlZE9uSW5wdXQpIHtcclxuICAgICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tb2RhbE9wZW5lZC5lbWl0KGZhbHNlKTsgLy8gRW1pdCBldmVudCB3aGVuIG1vZGFsIGlzIGNsb3NlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2FsbGJhY2tzIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvLyBJbnB1dCBldmVudCBoYW5kbGVyc1xyXG4gIG9uQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgb25Gb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmV4dHJhY3RWYWx1ZXModmFsdWUpO1xyXG4gICAgICAvLyBEb24ndCBjYWxsIG9uQ2hhbmdlIGhlcmUgLSB3cml0ZVZhbHVlIHNob3VsZG4ndCB0cmlnZ2VyIG9uQ2hhbmdlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIHRoZSBjb21wb25lbnQgd2hlbiBuZWVkZWRcclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNob3VsZFJlc2V0Q291bnRyeUxpc3QgPSBjaGFuZ2VzWydtb2RlJ10gJiYgIWNoYW5nZXNbJ21vZGUnXS5maXJzdENoYW5nZTtcclxuXHJcbiAgICBpZiAoc2hvdWxkUmVzZXRDb3VudHJ5TGlzdCkge1xyXG4gICAgICAvLyBSZXNldCBjb3VudHJ5IGxpc3QgdG8gZGVmYXVsdFxyXG4gICAgICB0aGlzLnJlc2V0Q291bnRyeUxpc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZWVkc1Jlb3JkZXJpbmcgPSAoY2hhbmdlc1snbW9kZSddICYmICFjaGFuZ2VzWydtb2RlJ10uZmlyc3RDaGFuZ2UpIHx8IChjaGFuZ2VzWydwcmlvcml0eUNvdW50cmllcyddICYmICFjaGFuZ2VzWydwcmlvcml0eUNvdW50cmllcyddLmZpcnN0Q2hhbmdlKTtcclxuXHJcbiAgICBpZiAobmVlZHNSZW9yZGVyaW5nKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlDb3VudHJ5T3JkZXJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgY29tcG9uZW50IHdpdGggdGhlIGNvcnJlY3QgY291bnRyeSBvcmRlcmluZyBhbmQgZmlsdGVyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xyXG4gICAgLy8gU2V0IGRlZmF1bHQgY291bnRyeVxyXG4gICAgdGhpcy5zZXREZWZhdWx0Q291bnRyeSgpO1xyXG5cclxuICAgIC8vIEFwcGx5IGNvdW50cnkgb3JkZXJpbmdcclxuICAgIHRoaXMuYXBwbHlDb3VudHJ5T3JkZXJpbmcoKTtcclxuXHJcbiAgICAvLyBOb3RpZnkgdGhhdCB0aGUgbW9kYWwgaXMgY2xvc2VkIGluaXRpYWxseVxyXG4gICAgdGhpcy5tb2RhbE9wZW5lZC5lbWl0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGFsbCBvcmRlcmluZyBydWxlcyB0byB0aGUgY291bnRyeSBsaXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseUNvdW50cnlPcmRlcmluZygpOiB2b2lkIHtcclxuICAgIC8vIEZpbmFsbHkgYXBwbHkgcHJlZmVycmVkIGNvdW50cmllcyBmaWx0ZXJcclxuICAgIHRoaXMuYXBwbHlQcmVmZXJyZWRDb3VudHJpZXNGaWx0ZXIoKTtcclxuXHJcbiAgICAvLyBGaXJzdCBhcHBseSBtb2RlLWJhc2VkIG9yZGVyaW5nXHJcbiAgICB0aGlzLnByaW9yaXRpemVBcmFiQ291bnRyaWVzKCk7XHJcblxyXG4gICAgLy8gVGhlbiBhcHBseSBjdXN0b20gcHJpb3JpdHkgY291bnRyaWVzXHJcbiAgICB0aGlzLmFwcGx5UHJpb3JpdHlDb3VudHJpZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGNvdW50cnkgbGlzdCB0byB0aGUgb3JpZ2luYWwgZGF0YXNldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzZXRDb3VudHJ5TGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnRyeUxpc3QgPSB7IC4uLkNvdW50cmllcyB9O1xyXG4gICAgdGhpcy5kYXRhU2V0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmNvdW50cnlMaXN0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgY291bnRyeSBiYXNlZCBvbiBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0RGVmYXVsdENvdW50cnkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGVmYXVsdENvdW50cnkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRlZkNvdW50cnlEYXRhID0gdGhpcy5jb3VudHJ5TGlzdFt0aGlzLmRlZmF1bHRDb3VudHJ5XTtcclxuICAgIGlmIChkZWZDb3VudHJ5RGF0YSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ291bnRyeSA9IGRlZkNvdW50cnlEYXRhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgcHJlZmVycmVkIGNvdW50cmllcyBmaWx0ZXIgdG8gbmFycm93IGRvd24gdGhlIGF2YWlsYWJsZSBvcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseVByZWZlcnJlZENvdW50cmllc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wcmVmZXJyZWRDb3VudHJpZXMgfHwgdGhpcy5wcmVmZXJyZWRDb3VudHJpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgdGhlIGNvdW50cmllcyB0byBpbmNsdWRlIG9ubHkgcHJlZmVycmVkIGNvdW50cmllc1xyXG4gICAgY29uc3QgcHJlZmVycmVkQ291bnRyeUxpc3QgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModGhpcy5jb3VudHJ5TGlzdCkuZmlsdGVyKChbY29kZV0pID0+IHRoaXMucHJlZmVycmVkQ291bnRyaWVzLmluY2x1ZGVzKGNvZGUpKSk7XHJcblxyXG4gICAgLy8gSWYgcHJlZmVycmVkIGNvdW50cmllcyBhcmUgZm91bmQsIHVwZGF0ZSB0aGUgY291bnRyeUxpc3RcclxuICAgIGlmIChPYmplY3Qua2V5cyhwcmVmZXJyZWRDb3VudHJ5TGlzdCkubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvdW50cnlMaXN0ID0gcHJlZmVycmVkQ291bnRyeUxpc3Q7XHJcbiAgICAgIHRoaXMuZGF0YVNldCA9IE9iamVjdC52YWx1ZXModGhpcy5jb3VudHJ5TGlzdCk7XHJcbiAgI