${php_vars.i18n_1}
${php_vars.i18n_1}
localhost
."
+msgstr ""
+
+#: wwa-admin-content.php:87
+msgid "Settings saved."
+msgstr ""
+
+#: wwa-admin-content.php:89
+msgid "Settings NOT saved."
+msgstr ""
+
+#: wwa-admin-content.php:104
+msgid "Preferred login method"
+msgstr ""
+
+#: wwa-admin-content.php:108
+msgid "Prefer WebAuthn"
+msgstr ""
+
+#: wwa-admin-content.php:109
+msgid "Prefer password"
+msgstr ""
+
+#: wwa-admin-content.php:110
+#: wwa-profile-content.php:56
+msgid "WebAuthn Only"
+msgstr ""
+
+#: wwa-admin-content.php:112
+msgid "When using \"WebAuthn Only\", password login will be completely disabled. Please make sure your browser supports WebAuthn, otherwise you may unable to login.localhost
"
+"."
+msgstr ""
+"Les fonctionnalités de WebAuthn sont limitées aux sites web dans des "
+"contextes sécurisés. Veuillez vous assurer que votre site web est diffusé "
+"via HTTPS ou localement avec localhost
."
+
+#: wwa-admin-content.php:62
+msgid "Settings saved."
+msgstr "Paramètres sauvegardés."
+
+#: wwa-admin-content.php:64
+msgid "Settings NOT saved."
+msgstr "Paramètres NON sauvegardés"
+
+#: wwa-admin-content.php:79
+msgid "Preferred login method"
+msgstr "Méthode de connexion préférée"
+
+#: wwa-admin-content.php:83
+msgid "WebAuthn"
+msgstr "WebAuthn"
+
+#: wwa-admin-content.php:84
+msgid "Username + Password"
+msgstr "Nom d’utilisateur + mot de passe"
+
+#: wwa-admin-content.php:85
+msgid ""
+"Since WebAuthn hasn't been fully supported by all browsers, you can only "
+"choose the preferred (default) login method and CANNOT completely "
+"disable the traditional Username+Password methodlocalhost"
+"code>."
+msgstr ""
+"WebAuthn özellikleri, güvenli bağlamlardaki web siteleriyle sınırlıdır. "
+"Lütfen web sitenizin HTTPS üzerinden veya yerel olarak localhost"
+"code> ile sunulduğundan emin olun."
+
+#: wwa-admin-content.php:87
+msgid "Settings saved."
+msgstr "Ayarlar kaydedildi."
+
+#: wwa-admin-content.php:89
+msgid "Settings NOT saved."
+msgstr "Ayarlar KAYDEDİLMEDİ."
+
+#: wwa-admin-content.php:104
+msgid "Preferred login method"
+msgstr "Tercih edilen oturum açma yöntemi"
+
+#: wwa-admin-content.php:108
+msgid "Prefer WebAuthn"
+msgstr "WebAuthn'u Tercih Et"
+
+#: wwa-admin-content.php:109
+msgid "Prefer password"
+msgstr "Şifre tercih et"
+
+#: wwa-admin-content.php:110 wwa-profile-content.php:56
+msgid "WebAuthn Only"
+msgstr "Yalnızca WebAuthn"
+
+#: wwa-admin-content.php:112
+msgid ""
+"When using \"WebAuthn Only\", password login will be completely disabled. "
+"Please make sure your browser supports WebAuthn, otherwise you may unable to "
+"login.
User that doesn't have any registered authenticator (e.g. new "
+"user) will unable to login when using \"WebAuthn Only\".
When the browser "
+"does not support WebAuthn, the login method will default to password if "
+"password login is not disabled."
+msgstr ""
+"\"Yalnızca WebAuthn\" kullanılırken, şifre girişi tamamen devre dışı "
+"bırakılacaktır. Lütfen tarayıcınızın WebAuthn'u desteklediğinden emin olun, "
+"aksi takdirde oturum açamayabilirsiniz.
Kayıtlı bir kimlik "
+"doğrulayıcısı olmayan kullanıcılar (ör. Yeni kullanıcı) \"Yalnızca WebAuthn"
+"\" kullanırken oturum açamaz.
Tarayıcı yaptığında WebAuthn'u "
+"desteklemezse, parola ile oturum açma devre dışı bırakılmamışsa oturum açma "
+"yöntemi varsayılan olarak parola olacaktır."
+
+#: wwa-admin-content.php:116
+msgid "Website identifier"
+msgstr "Web sitesi tanımlayıcı"
+
+#: wwa-admin-content.php:119
+msgid ""
+"This identifier is for identification purpose only and DOES NOT"
+"strong> affect the authentication process in anyway."
+msgstr ""
+"Bu tanımlayıcı yalnızca tanımlama amaçlıdır ve kimlik doğrulama sürecini "
+"hiçbir şekilde ETKİLEMEZ."
+
+#: wwa-admin-content.php:123
+msgid "Website domain"
+msgstr "Web sitesi domaini"
+
+#: wwa-admin-content.php:126
+msgid ""
+"This field MUST be exactly the same with the current domain "
+"or parent domain."
+msgstr ""
+"Bu alan, mevcut alan adı veya üst alan adı ile tam olarak aynı "
+"OLMALIDIR."
+
+#: wwa-admin-content.php:130
+msgid "Allow to remember login"
+msgstr "Girişin hatırlanmasına izin ver"
+
+#: wwa-admin-content.php:139 wwa-admin-content.php:150
+#: wwa-admin-content.php:183 wwa-admin-content.php:199
+#: wwa-profile-content.php:130 wwa-shortcodes.php:118
+msgid "Enable"
+msgstr "Etkinleştir"
+
+#: wwa-admin-content.php:140 wwa-admin-content.php:151
+#: wwa-admin-content.php:184 wwa-admin-content.php:200
+#: wwa-profile-content.php:131 wwa-shortcodes.php:118
+msgid "Disable"
+msgstr "Devredışı Bırak"
+
+#: wwa-admin-content.php:141
+msgid ""
+"Show the 'Remember Me' checkbox beside the login form when using WebAuthn."
+msgstr ""
+"WebAuthn'u kullanırken giriş formunun yanında 'Beni Hatırla' onay kutusunu "
+"gösterin."
+
+#: wwa-admin-content.php:146
+msgid "Require user verification"
+msgstr "Kullanıcı doğrulaması gerektir"
+
+#: wwa-admin-content.php:152
+msgid ""
+"User verification can improve security, but is not fully supported by mobile "
+"devices.
If you cannot register or verify your authenticators, please "
+"consider disabling user verification."
+msgstr ""
+"Kullanıcı doğrulama, güvenliği artırabilir, ancak mobil cihazlar tarafından "
+"tam olarak desteklenmemektedir.
Doğrulayıcılarınızı kaydedemiyor veya "
+"doğrulayamıyorsanız, lütfen kullanıcı doğrulamasını devre dışı bırakmayı "
+"düşünün."
+
+#: wwa-admin-content.php:157
+msgid "Allow a specific type of authenticator"
+msgstr "Belirli bir kimlik doğrulayıcı türüne izin ver"
+
+#: wwa-admin-content.php:166 wwa-profile-content.php:15
+#: wwa-profile-content.php:111 wwa-shortcodes.php:33 wwa-shortcodes.php:118
+msgid "Any"
+msgstr "Herhangi"
+
+#: wwa-admin-content.php:167 wwa-profile-content.php:112 wwa-shortcodes.php:118
+msgid "Platform (e.g. built-in fingerprint sensors)"
+msgstr "Platform (ör. Yerleşik parmak izi sensörleri)"
+
+#: wwa-admin-content.php:168 wwa-profile-content.php:113 wwa-shortcodes.php:118
+msgid "Roaming (e.g. USB security keys)"
+msgstr "Mobil (ör. USB güvenlik anahtarları)"
+
+#: wwa-admin-content.php:170
+msgid ""
+"If a type is selected, the browser will only prompt for authenticators of "
+"selected type when authenticating and user can only register authenticators "
+"of selected type."
+msgstr ""
+"Bir tür seçilirse, tarayıcı kimlik doğrulama sırasında yalnızca seçilen "
+"türdeki kimlik doğrulayıcıları ister ve kullanıcı yalnızca seçilen türdeki "
+"kimlik doğrulayıcıları kaydedebilir."
+
+#: wwa-admin-content.php:174
+msgid "Allow to login without username"
+msgstr "Kullanıcı adı olmadan giriş yapmaya izin ver"
+
+#: wwa-admin-content.php:185
+msgid ""
+"Allow users to register authenticator with usernameless authentication "
+"feature and login without username.
User verification will be "
+"enabled automatically when authenticating with usernameless authentication "
+"feature.
Some authenticators and some browsers DO NOT"
+"strong> support this feature."
+msgstr ""
+"Kullanıcıların, kimlik doğrulayıcısını gereksiz kimlik doğrulama özelliği "
+"ile kaydetmesine ve kullanıcı adı olmadan oturum açmasına izin verin.
"
+" Kullanılmayan kimlik doğrulama özelliği ile kimlik doğrulaması "
+"yapılırken kullanıcı doğrulama otomatik olarak etkinleştirilecektir. "
+"strong>
Bazı kimlik doğrulayıcılar ve bazı tarayıcılar bu özelliği "
+"desteklemeyebilir."
+
+#: wwa-admin-content.php:190
+msgid "Logging"
+msgstr "Günlük tutuluyor"
+
+#: wwa-admin-content.php:202
+msgid "Clear log"
+msgstr "Günlüğü temizle"
+
+#: wwa-admin-content.php:204
+msgid ""
+"For debugging only. Enable only when needed.
Note: Logs may "
+"contain sensitive information."
+msgstr ""
+"Yalnızca hata ayıklama için. Yalnızca gerektiğinde etkinleştirin. "
+"
Not: Günlükler hassas bilgiler içerebilir."
+
+#: wwa-admin-content.php:213
+msgid "Log"
+msgstr "Günlük"
+
+#: wwa-admin-content.php:215
+msgid "Automatic update every 5 seconds."
+msgstr "Her 5 saniyede bir otomatik güncelleme."
+
+#: wwa-admin-content.php:219
+msgid ""
+"To register a new authenticator or edit your authenticators, please go to your profile."
+msgstr ""
+"Yeni bir kimlik doğrulayıcı kaydettirmek veya kimlik doğrulayıcılarınızı "
+"düzenlemek için lütfen profilinize "
+"gidin."
+
+#: wwa-functions.php:148 wwa-shortcodes.php:88
+msgid "Auth"
+msgstr "Yetkilendirme"
+
+#: wwa-functions.php:149 wwa-shortcodes.php:11 wwa-shortcodes.php:85
+#: wwa-shortcodes.php:88
+msgid "Authenticate with WebAuthn"
+msgstr "WebAuthn ile kimlik doğrulama"
+
+#: wwa-functions.php:150 wwa-shortcodes.php:12
+msgid "Hold on..."
+msgstr "Bekle..."
+
+#: wwa-functions.php:151 wwa-shortcodes.php:13
+msgid "Please proceed..."
+msgstr "Lütfen devam edin..."
+
+#: wwa-functions.php:152 wwa-shortcodes.php:14
+msgid "Authenticating..."
+msgstr "Kimlik doğrulanıyor..."
+
+#: wwa-functions.php:153 wwa-shortcodes.php:15
+msgid "Authenticated"
+msgstr "Kimliği doğrulandı"
+
+#: wwa-functions.php:154 wwa-shortcodes.php:16
+msgid "Auth failed"
+msgstr "Yetkilendirme başarısız oldu"
+
+#: wwa-functions.php:155
+msgid ""
+"It looks like your browser doesn't support WebAuthn, which means you may "
+"unable to login."
+msgstr ""
+"Görünüşe göre tarayıcınız WebAuthn'u desteklemiyor, bu da oturum "
+"açamayabileceğiniz anlamına geliyor."
+
+#: wwa-functions.php:156 wwa-shortcodes.php:88
+msgid "Username"
+msgstr "Kullanıcı adı"
+
+#: wwa-functions.php:158
+msgid "Error: The username field is empty."
+msgstr "Hata: Kullanıcı adı alanı boş."
+
+#: wwa-functions.php:159 wwa-shortcodes.php:42
+msgid "Try to enter the username"
+msgstr "Kullanıcı adını girmeyi deneyin"
+
+#: wwa-functions.php:176
+msgid "Logging in with password has been disabled by the site manager."
+msgstr "Şifre ile oturum açma site yöneticisi tarafından devre dışı bırakıldı."
+
+#: wwa-functions.php:182
+msgid "Logging in with password has been disabled for this account."
+msgstr "Bu hesap için şifre ile giriş devre dışı bırakıldı."
+
+#: wwa-functions.php:220
+msgid ""
+"Logging in with password has been disabled for %s but you haven't register "
+"any WebAuthn authenticator yet. You may unable to login again once you log "
+"out. Register"
+msgstr ""
+"Parola ile oturum açma %s için devre dışı bırakıldı, ancak henüz herhangi "
+"bir WebAuthn doğrulayıcısı kaydetmediniz. Oturumu kapattıktan sonra tekrar "
+"oturum açamayabilirsiniz. Kaydolun "
+
+#: wwa-functions.php:220 wwa-functions.php:265
+msgid "the site"
+msgstr "site"
+
+#: wwa-functions.php:220
+msgid "your account"
+msgstr "hesabınız"
+
+#: wwa-functions.php:265
+msgid ""
+"Logging in with password has been disabled for %s but this account"
+"strong> haven't register any WebAuthn authenticator yet. This user may "
+"unable to login."
+msgstr ""
+"Şifre ile giriş %s için devre dışı bırakıldı, ancak bu hesap"
+"strong> henüz herhangi bir WebAuthn doğrulayıcısı kaydetmedi. Bu kullanıcı "
+"giriş yapamayabilir."
+
+#: wwa-functions.php:265
+msgid "this account"
+msgstr "bu hesap"
+
+#: wwa-functions.php:293
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: wwa-functions.php:301
+msgid "GitHub"
+msgstr "GitHub"
+
+#: wwa-functions.php:302
+msgid "Documentation"
+msgstr "Dokümantasyon"
+
+#: wwa-profile-content.php:7
+msgid "Initializing..."
+msgstr "Başlatılıyor..."
+
+#: wwa-profile-content.php:8 wwa-shortcodes.php:37
+msgid "Please follow instructions to finish registration..."
+msgstr "Kaydı tamamlamak için lütfen talimatları izleyin..."
+
+#: wwa-profile-content.php:9 wwa-shortcodes.php:38
+msgctxt "action"
+msgid "Registered"
+msgstr "Kayıtlı"
+
+#: wwa-profile-content.php:10 wwa-shortcodes.php:39
+msgid "Registration failed"
+msgstr "Kayıt başarısız"
+
+#: wwa-profile-content.php:11 wwa-shortcodes.php:40
+msgid "Your browser does not support WebAuthn"
+msgstr "Tarayıcınız WebAuthn'u desteklemiyor"
+
+#: wwa-profile-content.php:12 wwa-shortcodes.php:41
+msgid "Registrating..."
+msgstr "Kaydediliyor..."
+
+#: wwa-profile-content.php:13 wwa-shortcodes.php:21
+msgid "Please enter the authenticator identifier"
+msgstr "Lütfen kimlik doğrulayıcı tanımlayıcıyı girin"
+
+#: wwa-profile-content.php:14 wwa-shortcodes.php:26
+msgid "Loading failed, maybe try refreshing?"
+msgstr "Yükleme başarısız oldu, belki yenilemeyi deneyin?"
+
+#: wwa-profile-content.php:16 wwa-shortcodes.php:34
+msgid "Platform authenticator"
+msgstr "Platform doğrulayıcı"
+
+#: wwa-profile-content.php:17 wwa-shortcodes.php:35
+msgid "Roaming authenticator"
+msgstr "Mobil kimlik doğrulayıcı"
+
+#: wwa-profile-content.php:18 wwa-shortcodes.php:36
+msgid "Remove"
+msgstr "Kaldırmak"
+
+#: wwa-profile-content.php:19 wwa-shortcodes.php:22
+msgid "Please follow instructions to finish verification..."
+msgstr "Doğrulamayı tamamlamak için lütfen talimatları izleyin..."
+
+#: wwa-profile-content.php:20 wwa-shortcodes.php:23
+msgid "Verifying..."
+msgstr "Doğrulanıyor..."
+
+#: wwa-profile-content.php:21 wwa-shortcodes.php:24
+msgid "Verification failed"
+msgstr "Doğrulama başarısız oldu"
+
+#: wwa-profile-content.php:22 wwa-shortcodes.php:25
+msgid "Verification passed! You can now log in through WebAuthn"
+msgstr "Doğrulama geçti! Artık WebAuthn aracılığıyla giriş yapabilirsiniz"
+
+#: wwa-profile-content.php:23 wwa-shortcodes.php:32
+msgid "No registered authenticators"
+msgstr "Kayıtlı kimlik doğrulayıcı yok"
+
+#: wwa-profile-content.php:24 wwa-shortcodes.php:27
+msgid "Confirm removal of authenticator: "
+msgstr "Kimlik doğrulayıcının kaldırılmasını onaylayın: "
+
+#: wwa-profile-content.php:25 wwa-shortcodes.php:28
+msgid "Removing..."
+msgstr "Kaldırılıyor..."
+
+#: wwa-profile-content.php:26 wwa-shortcodes.php:29
+msgid "Rename"
+msgstr "Yeniden adlandır"
+
+#: wwa-profile-content.php:27 wwa-shortcodes.php:30
+msgid "Rename the authenticator"
+msgstr "Doğrulayıcıyı yeniden adlandır"
+
+#: wwa-profile-content.php:28 wwa-shortcodes.php:31
+msgid "Renaming..."
+msgstr "Yeniden adlandırılıyor..."
+
+#: wwa-profile-content.php:29 wwa-shortcodes.php:10
+msgid "Ready"
+msgstr "Hazır"
+
+#: wwa-profile-content.php:30 wwa-shortcodes.php:17
+msgid "No"
+msgstr "Hayır"
+
+#: wwa-profile-content.php:31 wwa-shortcodes.php:18
+msgid " (Unavailable)"
+msgstr " (Kullanılamaz)"
+
+#: wwa-profile-content.php:32 wwa-shortcodes.php:19
+msgid "The site administrator has disabled usernameless login feature."
+msgstr "Site yöneticisi, gereksiz oturum açma özelliğini devre dışı bıraktı."
+
+#: wwa-profile-content.php:33 wwa-shortcodes.php:43
+msgid ""
+"After removing this authenticator, you will not be able to login with "
+"WebAuthn"
+msgstr ""
+"Bu doğrulayıcıyı kaldırdıktan sonra, WebAuthn ile oturum açamayacaksınız"
+
+#: wwa-profile-content.php:34 wwa-shortcodes.php:44
+msgid " (Disabled)"
+msgstr " (Devredışı)"
+
+#: wwa-profile-content.php:35 wwa-shortcodes.php:45
+msgid "The site administrator only allow platform authenticators currently."
+msgstr ""
+"Site yöneticisi şu anda yalnızca platform kimlik doğrulayıcılarına izin "
+"veriyor."
+
+#: wwa-profile-content.php:36 wwa-shortcodes.php:46
+msgid "The site administrator only allow roaming authenticators currently."
+msgstr ""
+"Site yöneticisi şu anda yalnızca mobil kimlik doğrulayıcılarına izin veriyor."
+
+#: wwa-profile-content.php:50
+msgid ""
+"This site is not correctly configured to use WebAuthn. Please contact the "
+"site administrator."
+msgstr ""
+"Bu site, WebAuthn kullanmak için doğru şekilde yapılandırılmamış. Lütfen "
+"site yöneticisiyle iletişime geçin."
+
+#: wwa-profile-content.php:60
+msgid "Disable password login for this account"
+msgstr "Bu hesap için şifre girişini devre dışı bırakın"
+
+#: wwa-profile-content.php:62
+msgid ""
+"When checked, password login will be completely disabled. Please make sure "
+"your browser supports WebAuthn and you have a registered authenticator, "
+"otherwise you may unable to login."
+msgstr ""
+"İşaretlendiğinde, şifre girişi tamamen devre dışı bırakılacaktır. Lütfen "
+"tarayıcınızın WebAuthn'u desteklediğinden ve kayıtlı bir kimlik "
+"doğrulayıcınız olduğundan emin olun, aksi takdirde oturum açamayabilirsiniz."
+
+#: wwa-profile-content.php:62
+msgid "The site administrator has disabled password login for the whole site."
+msgstr "Site yöneticisi tüm site için şifre girişini devre dışı bıraktı."
+
+#: wwa-profile-content.php:66
+msgid "Registered WebAuthn Authenticators"
+msgstr "Kayıtlı WebAuthn Kimlik Doğrulayıcıları"
+
+#: wwa-profile-content.php:71 wwa-profile-content.php:86 wwa-shortcodes.php:156
+#: wwa-shortcodes.php:158
+msgid "Identifier"
+msgstr "Tanımlayıcı"
+
+#: wwa-profile-content.php:72 wwa-profile-content.php:87 wwa-shortcodes.php:156
+#: wwa-shortcodes.php:158
+msgid "Type"
+msgstr "Tip"
+
+#: wwa-profile-content.php:73 wwa-profile-content.php:88 wwa-shortcodes.php:156
+#: wwa-shortcodes.php:158
+msgctxt "time"
+msgid "Registered"
+msgstr "Kayıtlı"
+
+#: wwa-profile-content.php:74 wwa-profile-content.php:89
+msgid "Last used"
+msgstr "Son kullanım"
+
+#: wwa-profile-content.php:75 wwa-profile-content.php:90 wwa-shortcodes.php:156
+#: wwa-shortcodes.php:158
+msgid "Usernameless"
+msgstr "Kullanıcı adsız"
+
+#: wwa-profile-content.php:76 wwa-profile-content.php:91 wwa-shortcodes.php:156
+#: wwa-shortcodes.php:158
+msgid "Action"
+msgstr "Eylem"
+
+#: wwa-profile-content.php:81 wwa-shortcodes.php:157
+msgid "Loading..."
+msgstr "Yükleniyor..."
+
+#: wwa-profile-content.php:98 wwa-profile-content.php:101
+msgid "Register New Authenticator"
+msgstr "Yeni Kimlik Doğrulayıcıyı Kaydet"
+
+#: wwa-profile-content.php:98 wwa-profile-content.php:142
+msgid "Verify Authenticator"
+msgstr "Kimlik Doğrulayıcıyı Doğrula"
+
+#: wwa-profile-content.php:102
+msgid ""
+"You are about to associate an authenticator with the current account "
+"%s.
You can register multiple authenticators for an account."
+msgstr ""
+"Bir doğrulayıcıyı geçerli hesapla %s ilişkilendirmek "
+"üzeresiniz.
Bir hesap için birden fazla doğrulayıcı kaydedebilirsiniz."
+
+#: wwa-profile-content.php:105 wwa-shortcodes.php:118
+msgid "Type of authenticator"
+msgstr "Doğrulayıcı türü"
+
+#: wwa-profile-content.php:115 wwa-shortcodes.php:118
+msgid ""
+"If a type is selected, the browser will only prompt for authenticators of "
+"selected type.
Regardless of the type, you can only log in with the "
+"very same authenticators you've registered."
+msgstr ""
+"Bir tür seçilirse, tarayıcı yalnızca seçilen türdeki doğrulayıcıları "
+"soracaktır.
Türüne bakılmaksızın, yalnızca kaydettiğiniz kimlik "
+"doğrulayıcılarla giriş yapabilirsiniz."
+
+#: wwa-profile-content.php:119
+msgid "Authenticator Identifier"
+msgstr "Kimlik Doğrulayıcı Tanımlayıcı"
+
+#: wwa-profile-content.php:122 wwa-shortcodes.php:118
+msgid ""
+"An easily identifiable name for the authenticator. DOES NOT "
+"affect the authentication process in anyway."
+msgstr ""
+"Kimlik doğrulayıcı için kolayca tanımlanabilen bir ad. Kimlik doğrulama "
+"sürecini hiçbir şekilde ETKİLEMEZ."
+
+#: wwa-profile-content.php:127 wwa-shortcodes.php:118
+msgid "Login without username"
+msgstr "Kullanıcı adı olmadan giriş yap"
+
+#: wwa-profile-content.php:132 wwa-shortcodes.php:118
+msgid ""
+"If registered authenticator with this feature, you can login without enter "
+"your username.
Some authenticators like U2F-only authenticators and some "
+"browsers DO NOT support this feature.
A record will be "
+"stored in the authenticator permanently untill you reset it."
+msgstr ""
+"Kimlik doğrulayıcısı bu özellikle kaydolduysa, kullanıcı adınızı girmeden "
+"oturum açabilirsiniz.
Yalnızca U2F kimlik doğrulayıcıları gibi bazı "
+"kimlik doğrulayıcılar ve bazı tarayıcılar bu özelliği DESTEKLEMEZ"
+"strong>.
Kayıtlar kimlik doğrulayıcısında siz sıfırlayana kadar kalıcı "
+"olarak duracak."
+
+#: wwa-profile-content.php:138
+msgid "Start Registration"
+msgstr "Kaydı Başlat"
+
+#: wwa-profile-content.php:143
+msgid ""
+"Click Test Login to verify that the registered authenticators are working."
+msgstr ""
+"Kayıtlı kimlik doğrulayıcıların çalıştığını doğrulamak için Oturum Açmayı "
+"Test Et'e tıklayın."
+
+#: wwa-profile-content.php:144 wwa-shortcodes.php:144
+msgid "Test Login"
+msgstr "Test Girişi"
+
+#: wwa-profile-content.php:146 wwa-shortcodes.php:144
+msgid "Test Login (usernameless)"
+msgstr "Test Girişi (kullanıcı adsız)"
+
+#: wwa-shortcodes.php:20
+msgid "Error: The username field is empty."
+msgstr "Hata: Kullanıcı adı alanı boş."
+
+#: wwa-shortcodes.php:88
+msgid "Authenticate with password"
+msgstr "Parola ile doğrulayın"
+
+#: wwa-shortcodes.php:105 wwa-shortcodes.php:133 wwa-shortcodes.php:166
+msgid "You haven't logged in yet."
+msgstr "Henüz giriş yapmadınız."
+
+#: wwa-shortcodes.php:118
+msgid "Authenticator identifier"
+msgstr "Kimlik doğrulayıcı tanımlayıcı"
+
+#: wwa-shortcodes.php:118
+msgid "Start registration"
+msgstr "Kaydı başlat"
diff --git a/wp-content/plugins/wp-webauthn/readme.txt b/wp-content/plugins/wp-webauthn/readme.txt
new file mode 100644
index 00000000..82df5b99
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/readme.txt
@@ -0,0 +1,147 @@
+=== WP-WebAuthn ===
+Contributors: axton
+Donate link: https://flyhigher.top/about
+Tags: u2f, fido, fido2, webauthn, login, security, password, authentication
+Requires at least: 5.0
+Tested up to: 6.0
+Stable tag: 1.2.8
+Requires PHP: 7.2
+License: GPLv3
+License URI: https://www.gnu.org/licenses/gpl-3.0.html
+
+WP-WebAuthn enables passwordless login through FIDO2 and U2F devices like FaceID or Windows Hello for your site.
+
+== Description ==
+
+WebAuthn is a new way for you to authenticate in web. It helps you replace your passwords with devices like USB Keys, fingerprint scanners, Windows Hello compatible cameras, FaceID/TouchID and more. Using WebAuthn, you can login to your a website with a glance or touch.
+
+When using WebAuthn, you just need to click once and perform a simple verification on the authenticator, then you are logged in. **No password needed.**
+
+WP-WebAuthn is a plug-in for WordPress to enable WebAuthn on your site. Just download and install it, and you are in the future of web authentication.
+
+WP-WebAuthn also supports usernameless authentication.
+
+This plugin has 4 built-in shortcodes and 4 built-in Gutenberg blocks, so you can add components like register form to frontend pages.
+
+Please refer to the [documentation](http://doc.flyhigher.top/wp-webauthn) before using the plugin.
+
+**PHP extensions gmp and mbstring are required.**
+
+**WebAuthn requires HTTPS connection or `localhost` to function normally.**
+
+You can contribute to this plugin on [GitHub](https://github.com/yrccondor/wp-webauthn).
+
+Please note that this plugin does NOT support Internet Explorer (including IE 11). To use FaceID or TouchID, you need to use iOS/iPadOS 14+.
+
+= Security and Privacy =
+
+WebAuthn has become a W3C Recommendation since March 2019, which enabling the creation and use of strong, attested, scoped, public key-based credentials by web applications, for the purpose of strongly authenticating users using hardware authenticators. WebAuthn focuses on both security and privacy, it offers the possibility to create a secure authentication process without having to transfer any private data such as recognition data and fingerprint data. It will be the future of web authentication.
+
+= GDPR Friendly =
+
+When authenticating with WebAuthn, no private data will leave user's device and no third-party involvement. The credentials transferred are not associate to any user's information but only for authentication. It's GDPR Friendly.
+
+== Installation ==
+
+Notice: PHP extensions gmp and mbstring are required.
+
+1. Upload the plugin files to the `/wp-content/plugins/wp-webauthn` directory, or install the plugin through the WordPress plugins screen directly
+2. Activate the plugin through the 'Plugins' screen in WordPress
+3. Use the Settings->WP-WebAuthn screen to configure the plugin
+4. Make sure that all settings are set, and you can start to register authenticators in your profile page
+
+== Frequently Asked Questions ==
+
+= What languages does this plugin support? =
+
+This plugin supports English, Chinese (Simplified), Traditional Chinese (Hong Kong), Traditional Chinese (Taiwan), Turkish, French & German currently. If you are using WordPress in none of those languages, English will be displayed as default language.
+
+All translation files are hosted on [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/wp-webauthn/) and [GitHub](https://github.com/yrccondor/wp-webauthn/tree/master/languages). You can help us to translate WP-WebAuthn into other languages!
+
+= What should I do if the plugin could not work? =
+
+Make sure your are using HTTPS or host your site in `localhost`. Then check whether you have installed the gmp extension for PHP.
+
+If you can't solve the problem, [open an issue](https://github.com/yrccondor/wp-webauthn/issues/new) on [GitHub](https://github.com/yrccondor/wp-webauthn) with plugin log.
+
+= Which browsers support WebAuthn? =
+
+The latest version of Chrome, FireFox, Edge and Safari are support WebAuthn. You can learn more on [Can I Use](https://caniuse.com/#feat=webauthn).
+
+To use FaceID or TouchID, you need to use iOS/iPadOS 14+.
+
+== Screenshots ==
+
+1. Verifying
+2. Verifying without username on iPad
+3. The login page
+4. The settings page
+5. Profile
+
+== Changelog ==
+
+= 1.2.8 =
+Fix: privilege check for admin panel
+
+= 1.2.7 =
+Add: Now a security warning will be shown if user verification is disabled
+Fix: Style broken with some locales
+Fix: privilege check for admin panel (thanks to @vanpop)
+Update: Third party libraries
+
+= 1.2.6 =
+Update: Third party libraries
+
+= 1.2.5 =
+Update: German translation (thanks to niiconn)
+Fix: HTTPS check
+
+= 1.2.4 =
+Add: French translation (thanks to Spomky) and Turkish translate (thanks to Sn0bzy)
+Fix: HTTPS check
+Update: Existing translations
+Update: Third party libraries
+
+= 1.2.3 =
+Feat: Avoid locking users out if WebAuthn is not available
+Update: translations
+Update: Third party libraries
+
+= 1.2.2 =
+Fix: Cannot access to js files in apache 2.4+
+
+= 1.2.1 =
+Feat: Allow to disable password login completely
+Feat: Now we use WordPress transients instead of PHP sessions
+Feat: Move register related settings to user's profile
+Feat: Gutenberg block support
+Feat: Traditional Chinese (Hong Kong) & Traditional Chinese (Taiwan) translation
+Update: Chinese translation
+Update: Third-party libraries
+
+= 1.1.0 =
+Add: Allow to remember login option
+Add: Only allow a specific type of authenticator option
+Fix: Toggle button may not working in login form
+Update: Chinese translation
+Update: Third-party libraries
+
+== Upgrade Notice ==
+
+= 1.2.5 =
+Improvred HTTPS checking and updated German translation (by niiconn)
+
+= 1.2.4 =
+Improvred HTTPS checking and added new translations
+
+= 1.2.3 =
+Avoid locking users out if WebAuthn is not available and update translations
+
+= 1.2.2 =
+Fixed a problem that js files were broken in apache 2.4+
+
+= 1.2.1 =
+New features, bug fixing and new translations
+
+= 1.1.0 =
+2 new features & bug fixing
diff --git a/wp-content/plugins/wp-webauthn/vendor/autoload.php b/wp-content/plugins/wp-webauthn/vendor/autoload.php
new file mode 100644
index 00000000..8737b350
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/autoload.php
@@ -0,0 +1,12 @@
+=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ },
+ "files": [
+ "lib/Assert/functions.php"
+ ]
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Assert\\Tests\\": "tests/Assert/Tests"
+ },
+ "files": [
+ "tests/Assert/Tests/Fixtures/functions.php"
+ ]
+ },
+ "scripts": {
+ "assert:generate-docs": "php bin/generate_method_docs.php",
+ "assert:cs-lint": "php-cs-fixer fix --diff -vvv --dry-run",
+ "assert:cs-fix": "php-cs-fixer fix . -vvv || true",
+ "assert:sa-code": "vendor/bin/phpstan analyse --configuration=phpstan-code.neon --no-progress --ansi -l 7 bin lib",
+ "assert:sa-tests": "vendor/bin/phpstan analyse --configuration=phpstan-tests.neon --no-progress --ansi -l 7 tests"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assert.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assert.php
new file mode 100644
index 00000000..3614b345
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assert.php
@@ -0,0 +1,85 @@
+notEmpty()->integer();
+ * Assert::that($value)->nullOr()->string()->startsWith("Foo");
+ *
+ * The assertion chain can be stateful, that means be careful when you reuse
+ * it. You should never pass around the chain.
+ */
+ public static function that($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+ {
+ $assertionChain = new AssertionChain($value, $defaultMessage, $defaultPropertyPath);
+
+ return $assertionChain->setAssertionClassName(static::$assertionClass);
+ }
+
+ /**
+ * Start validation on a set of values, returns {@link AssertionChain}.
+ *
+ * @param mixed $values
+ * @param string|callable|null $defaultMessage
+ */
+ public static function thatAll($values, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+ {
+ return static::that($values, $defaultMessage, $defaultPropertyPath)->all();
+ }
+
+ /**
+ * Start validation and allow NULL, returns {@link AssertionChain}.
+ *
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ */
+ public static function thatNullOr($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+ {
+ return static::that($value, $defaultMessage, $defaultPropertyPath)->nullOr();
+ }
+
+ /**
+ * Create a lazy assertion object.
+ */
+ public static function lazy(): LazyAssertion
+ {
+ $lazyAssertion = new LazyAssertion();
+
+ return $lazyAssertion
+ ->setAssertClass(\get_called_class())
+ ->setExceptionClass(static::$lazyAssertionExceptionClass);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assertion.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assertion.php
new file mode 100644
index 00000000..243e64d2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/Assertion.php
@@ -0,0 +1,2797 @@
+
+ *
+ * @method static bool allAlnum(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric for all values.
+ * @method static bool allBase64(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
+ * @method static bool allBetween(mixed[] $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit for all values.
+ * @method static bool allBetweenExclusive(mixed[] $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit for all values.
+ * @method static bool allBetweenLength(mixed[] $value, int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths for all values.
+ * @method static bool allBoolean(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is php boolean for all values.
+ * @method static bool allChoice(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices for all values.
+ * @method static bool allChoicesNotEmpty(array[] $values, array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content for all values.
+ * @method static bool allClassExists(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the class exists for all values.
+ * @method static bool allContains(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars for all values.
+ * @method static bool allCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count for all values.
+ * @method static bool allDate(string[] $value, string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format for all values.
+ * @method static bool allDefined(mixed[] $constant, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
+ * @method static bool allDigit(mixed[] $value, string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit for all values.
+ * @method static bool allDirectory(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a directory exists for all values.
+ * @method static bool allE164(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number for all values.
+ * @method static bool allEmail(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL) for all values.
+ * @method static bool allEndsWith(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars for all values.
+ * @method static bool allEq(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==) for all values.
+ * @method static bool allEqArraySubset(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset for all values.
+ * @method static bool allExtensionLoaded(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded for all values.
+ * @method static bool allExtensionVersion(string[] $extension, string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed for all values.
+ * @method static bool allFalse(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False for all values.
+ * @method static bool allFile(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a file exists for all values.
+ * @method static bool allFloat(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php float for all values.
+ * @method static bool allGreaterOrEqualThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit for all values.
+ * @method static bool allGreaterThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit for all values.
+ * @method static bool allImplementsInterface(mixed[] $class, string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface for all values.
+ * @method static bool allInArray(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice() for all values.
+ * @method static bool allInteger(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer for all values.
+ * @method static bool allIntegerish(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish for all values.
+ * @method static bool allInterfaceExists(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the interface exists for all values.
+ * @method static bool allIp(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address for all values.
+ * @method static bool allIpv4(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address for all values.
+ * @method static bool allIpv6(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address for all values.
+ * @method static bool allIsArray(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array for all values.
+ * @method static bool allIsArrayAccessible(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object for all values.
+ * @method static bool allIsCallable(mixed[] $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable for all values.
+ * @method static bool allIsCountable(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable for all values.
+ * @method static bool allIsInstanceOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name for all values.
+ * @method static bool allIsJsonString(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string for all values.
+ * @method static bool allIsObject(mixed[] $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object for all values.
+ * @method static bool allIsResource(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a resource for all values.
+ * @method static bool allIsTraversable(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object for all values.
+ * @method static bool allKeyExists(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array for all values.
+ * @method static bool allKeyIsset(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset() for all values.
+ * @method static bool allKeyNotExists(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array for all values.
+ * @method static bool allLength(mixed[] $value, int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length for all values.
+ * @method static bool allLessOrEqualThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit for all values.
+ * @method static bool allLessThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit for all values.
+ * @method static bool allMax(mixed[] $value, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit for all values.
+ * @method static bool allMaxCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements for all values.
+ * @method static bool allMaxLength(mixed[] $value, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars for all values.
+ * @method static bool allMethodExists(string[] $value, mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object for all values.
+ * @method static bool allMin(mixed[] $value, mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit for all values.
+ * @method static bool allMinCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements for all values.
+ * @method static bool allMinLength(mixed[] $value, int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long for all values.
+ * @method static bool allNoContent(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is empty for all values.
+ * @method static bool allNotBlank(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not blank for all values.
+ * @method static bool allNotContains(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars for all values.
+ * @method static bool allNotEmpty(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not empty for all values.
+ * @method static bool allNotEmptyKey(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty for all values.
+ * @method static bool allNotEq(mixed[] $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==) for all values.
+ * @method static bool allNotInArray(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices for all values.
+ * @method static bool allNotIsInstanceOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name for all values.
+ * @method static bool allNotNull(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not null for all values.
+ * @method static bool allNotRegex(mixed[] $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex for all values.
+ * @method static bool allNotSame(mixed[] $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===) for all values.
+ * @method static bool allNull(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is null for all values.
+ * @method static bool allNumeric(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is numeric for all values.
+ * @method static bool allObjectOrClass(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists for all values.
+ * @method static bool allPhpVersion(string[] $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version for all values.
+ * @method static bool allPropertiesExist(mixed[] $value, array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist for all values.
+ * @method static bool allPropertyExists(mixed[] $value, string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists for all values.
+ * @method static bool allRange(mixed[] $value, mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers for all values.
+ * @method static bool allReadable(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something readable for all values.
+ * @method static bool allRegex(mixed[] $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex for all values.
+ * @method static bool allSame(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===) for all values.
+ * @method static bool allSatisfy(mixed[] $value, callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback for all values.
+ * @method static bool allScalar(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar for all values.
+ * @method static bool allStartsWith(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars for all values.
+ * @method static bool allString(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a string for all values.
+ * @method static bool allSubclassOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name for all values.
+ * @method static bool allTrue(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True for all values.
+ * @method static bool allUniqueValues(array[] $values, string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality) for all values.
+ * @method static bool allUrl(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an URL for all values.
+ * @method static bool allUuid(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID for all values.
+ * @method static bool allVersion(string[] $version1, string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions for all values.
+ * @method static bool allWriteable(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable for all values.
+ * @method static bool nullOrAlnum(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric or that the value is null.
+ * @method static bool nullOrBase64(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined or that the value is null.
+ * @method static bool nullOrBetween(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit or that the value is null.
+ * @method static bool nullOrBetweenExclusive(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit or that the value is null.
+ * @method static bool nullOrBetweenLength(mixed|null $value, int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths or that the value is null.
+ * @method static bool nullOrBoolean(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is php boolean or that the value is null.
+ * @method static bool nullOrChoice(mixed|null $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices or that the value is null.
+ * @method static bool nullOrChoicesNotEmpty(array|null $values, array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content or that the value is null.
+ * @method static bool nullOrClassExists(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the class exists or that the value is null.
+ * @method static bool nullOrContains(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars or that the value is null.
+ * @method static bool nullOrCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count or that the value is null.
+ * @method static bool nullOrDate(string|null $value, string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format or that the value is null.
+ * @method static bool nullOrDefined(mixed|null $constant, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined or that the value is null.
+ * @method static bool nullOrDigit(mixed|null $value, string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit or that the value is null.
+ * @method static bool nullOrDirectory(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that a directory exists or that the value is null.
+ * @method static bool nullOrE164(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number or that the value is null.
+ * @method static bool nullOrEmail(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL) or that the value is null.
+ * @method static bool nullOrEndsWith(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars or that the value is null.
+ * @method static bool nullOrEq(mixed|null $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==) or that the value is null.
+ * @method static bool nullOrEqArraySubset(mixed|null $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset or that the value is null.
+ * @method static bool nullOrExtensionLoaded(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded or that the value is null.
+ * @method static bool nullOrExtensionVersion(string|null $extension, string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed or that the value is null.
+ * @method static bool nullOrFalse(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False or that the value is null.
+ * @method static bool nullOrFile(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that a file exists or that the value is null.
+ * @method static bool nullOrFloat(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php float or that the value is null.
+ * @method static bool nullOrGreaterOrEqualThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit or that the value is null.
+ * @method static bool nullOrGreaterThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit or that the value is null.
+ * @method static bool nullOrImplementsInterface(mixed|null $class, string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface or that the value is null.
+ * @method static bool nullOrInArray(mixed|null $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice() or that the value is null.
+ * @method static bool nullOrInteger(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer or that the value is null.
+ * @method static bool nullOrIntegerish(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish or that the value is null.
+ * @method static bool nullOrInterfaceExists(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the interface exists or that the value is null.
+ * @method static bool nullOrIp(string|null $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address or that the value is null.
+ * @method static bool nullOrIpv4(string|null $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address or that the value is null.
+ * @method static bool nullOrIpv6(string|null $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address or that the value is null.
+ * @method static bool nullOrIsArray(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or that the value is null.
+ * @method static bool nullOrIsArrayAccessible(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object or that the value is null.
+ * @method static bool nullOrIsCallable(mixed|null $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable or that the value is null.
+ * @method static bool nullOrIsCountable(array|Countable|ResourceBundle|SimpleXMLElement|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable or that the value is null.
+ * @method static bool nullOrIsInstanceOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name or that the value is null.
+ * @method static bool nullOrIsJsonString(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string or that the value is null.
+ * @method static bool nullOrIsObject(mixed|null $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object or that the value is null.
+ * @method static bool nullOrIsResource(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a resource or that the value is null.
+ * @method static bool nullOrIsTraversable(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object or that the value is null.
+ * @method static bool nullOrKeyExists(mixed|null $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array or that the value is null.
+ * @method static bool nullOrKeyIsset(mixed|null $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset() or that the value is null.
+ * @method static bool nullOrKeyNotExists(mixed|null $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array or that the value is null.
+ * @method static bool nullOrLength(mixed|null $value, int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length or that the value is null.
+ * @method static bool nullOrLessOrEqualThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit or that the value is null.
+ * @method static bool nullOrLessThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit or that the value is null.
+ * @method static bool nullOrMax(mixed|null $value, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit or that the value is null.
+ * @method static bool nullOrMaxCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements or that the value is null.
+ * @method static bool nullOrMaxLength(mixed|null $value, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars or that the value is null.
+ * @method static bool nullOrMethodExists(string|null $value, mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object or that the value is null.
+ * @method static bool nullOrMin(mixed|null $value, mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit or that the value is null.
+ * @method static bool nullOrMinCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements or that the value is null.
+ * @method static bool nullOrMinLength(mixed|null $value, int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long or that the value is null.
+ * @method static bool nullOrNoContent(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is empty or that the value is null.
+ * @method static bool nullOrNotBlank(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not blank or that the value is null.
+ * @method static bool nullOrNotContains(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars or that the value is null.
+ * @method static bool nullOrNotEmpty(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not empty or that the value is null.
+ * @method static bool nullOrNotEmptyKey(mixed|null $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty or that the value is null.
+ * @method static bool nullOrNotEq(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==) or that the value is null.
+ * @method static bool nullOrNotInArray(mixed|null $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices or that the value is null.
+ * @method static bool nullOrNotIsInstanceOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name or that the value is null.
+ * @method static bool nullOrNotNull(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not null or that the value is null.
+ * @method static bool nullOrNotRegex(mixed|null $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex or that the value is null.
+ * @method static bool nullOrNotSame(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===) or that the value is null.
+ * @method static bool nullOrNull(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is null or that the value is null.
+ * @method static bool nullOrNumeric(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is numeric or that the value is null.
+ * @method static bool nullOrObjectOrClass(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists or that the value is null.
+ * @method static bool nullOrPhpVersion(string|null $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version or that the value is null.
+ * @method static bool nullOrPropertiesExist(mixed|null $value, array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist or that the value is null.
+ * @method static bool nullOrPropertyExists(mixed|null $value, string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists or that the value is null.
+ * @method static bool nullOrRange(mixed|null $value, mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers or that the value is null.
+ * @method static bool nullOrReadable(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something readable or that the value is null.
+ * @method static bool nullOrRegex(mixed|null $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex or that the value is null.
+ * @method static bool nullOrSame(mixed|null $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===) or that the value is null.
+ * @method static bool nullOrSatisfy(mixed|null $value, callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback or that the value is null.
+ * @method static bool nullOrScalar(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar or that the value is null.
+ * @method static bool nullOrStartsWith(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars or that the value is null.
+ * @method static bool nullOrString(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a string or that the value is null.
+ * @method static bool nullOrSubclassOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name or that the value is null.
+ * @method static bool nullOrTrue(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True or that the value is null.
+ * @method static bool nullOrUniqueValues(array|null $values, string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality) or that the value is null.
+ * @method static bool nullOrUrl(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an URL or that the value is null.
+ * @method static bool nullOrUuid(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID or that the value is null.
+ * @method static bool nullOrVersion(string|null $version1, string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions or that the value is null.
+ * @method static bool nullOrWriteable(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable or that the value is null.
+ */
+class Assertion
+{
+ const INVALID_FLOAT = 9;
+ const INVALID_INTEGER = 10;
+ const INVALID_DIGIT = 11;
+ const INVALID_INTEGERISH = 12;
+ const INVALID_BOOLEAN = 13;
+ const VALUE_EMPTY = 14;
+ const VALUE_NULL = 15;
+ const VALUE_NOT_NULL = 25;
+ const INVALID_STRING = 16;
+ const INVALID_REGEX = 17;
+ const INVALID_MIN_LENGTH = 18;
+ const INVALID_MAX_LENGTH = 19;
+ const INVALID_STRING_START = 20;
+ const INVALID_STRING_CONTAINS = 21;
+ const INVALID_CHOICE = 22;
+ const INVALID_NUMERIC = 23;
+ const INVALID_ARRAY = 24;
+ const INVALID_KEY_EXISTS = 26;
+ const INVALID_NOT_BLANK = 27;
+ const INVALID_INSTANCE_OF = 28;
+ const INVALID_SUBCLASS_OF = 29;
+ const INVALID_RANGE = 30;
+ const INVALID_ALNUM = 31;
+ const INVALID_TRUE = 32;
+ const INVALID_EQ = 33;
+ const INVALID_SAME = 34;
+ const INVALID_MIN = 35;
+ const INVALID_MAX = 36;
+ const INVALID_LENGTH = 37;
+ const INVALID_FALSE = 38;
+ const INVALID_STRING_END = 39;
+ const INVALID_UUID = 40;
+ const INVALID_COUNT = 41;
+ const INVALID_NOT_EQ = 42;
+ const INVALID_NOT_SAME = 43;
+ const INVALID_TRAVERSABLE = 44;
+ const INVALID_ARRAY_ACCESSIBLE = 45;
+ const INVALID_KEY_ISSET = 46;
+ const INVALID_VALUE_IN_ARRAY = 47;
+ const INVALID_E164 = 48;
+ const INVALID_BASE64 = 49;
+ const INVALID_NOT_REGEX = 50;
+ const INVALID_DIRECTORY = 101;
+ const INVALID_FILE = 102;
+ const INVALID_READABLE = 103;
+ const INVALID_WRITEABLE = 104;
+ const INVALID_CLASS = 105;
+ const INVALID_INTERFACE = 106;
+ const INVALID_FILE_NOT_EXISTS = 107;
+ const INVALID_EMAIL = 201;
+ const INTERFACE_NOT_IMPLEMENTED = 202;
+ const INVALID_URL = 203;
+ const INVALID_NOT_INSTANCE_OF = 204;
+ const VALUE_NOT_EMPTY = 205;
+ const INVALID_JSON_STRING = 206;
+ const INVALID_OBJECT = 207;
+ const INVALID_METHOD = 208;
+ const INVALID_SCALAR = 209;
+ const INVALID_LESS = 210;
+ const INVALID_LESS_OR_EQUAL = 211;
+ const INVALID_GREATER = 212;
+ const INVALID_GREATER_OR_EQUAL = 213;
+ const INVALID_DATE = 214;
+ const INVALID_CALLABLE = 215;
+ const INVALID_KEY_NOT_EXISTS = 216;
+ const INVALID_SATISFY = 217;
+ const INVALID_IP = 218;
+ const INVALID_BETWEEN = 219;
+ const INVALID_BETWEEN_EXCLUSIVE = 220;
+ const INVALID_EXTENSION = 222;
+ const INVALID_CONSTANT = 221;
+ const INVALID_VERSION = 223;
+ const INVALID_PROPERTY = 224;
+ const INVALID_RESOURCE = 225;
+ const INVALID_COUNTABLE = 226;
+ const INVALID_MIN_COUNT = 227;
+ const INVALID_MAX_COUNT = 228;
+ const INVALID_STRING_NOT_CONTAINS = 229;
+ const INVALID_UNIQUE_VALUES = 230;
+
+ /**
+ * Exception to throw when an assertion failed.
+ *
+ * @var string
+ */
+ protected static $exceptionClass = InvalidArgumentException::class;
+
+ /**
+ * Assert that two values are equal (using ==).
+ *
+ * @param mixed $value
+ * @param mixed $value2
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function eq($value, $value2, $message = null, string $propertyPath = null): bool
+ {
+ if ($value != $value2) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" does not equal expected value "%s".'),
+ static::stringify($value),
+ static::stringify($value2)
+ );
+
+ throw static::createException($value, $message, static::INVALID_EQ, $propertyPath, ['expected' => $value2]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the array contains the subset.
+ *
+ * @param mixed $value
+ * @param mixed $value2
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function eqArraySubset($value, $value2, $message = null, string $propertyPath = null): bool
+ {
+ static::isArray($value, $message, $propertyPath);
+ static::isArray($value2, $message, $propertyPath);
+
+ $patched = \array_replace_recursive($value, $value2);
+ static::eq($patched, $value, $message, $propertyPath);
+
+ return true;
+ }
+
+ /**
+ * Assert that two values are the same (using ===).
+ *
+ * @param mixed $value
+ * @param mixed $value2
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType
+ * @psalm-param ExpectedType $value2
+ * @psalm-assert =ExpectedType $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function same($value, $value2, $message = null, string $propertyPath = null): bool
+ {
+ if ($value !== $value2) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not the same as expected value "%s".'),
+ static::stringify($value),
+ static::stringify($value2)
+ );
+
+ throw static::createException($value, $message, static::INVALID_SAME, $propertyPath, ['expected' => $value2]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that two values are not equal (using ==).
+ *
+ * @param mixed $value1
+ * @param mixed $value2
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notEq($value1, $value2, $message = null, string $propertyPath = null): bool
+ {
+ if ($value1 == $value2) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was not expected to be equal to value "%s".'),
+ static::stringify($value1),
+ static::stringify($value2)
+ );
+ throw static::createException($value1, $message, static::INVALID_NOT_EQ, $propertyPath, ['expected' => $value2]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that two values are not the same (using ===).
+ *
+ * @param mixed $value1
+ * @param mixed $value2
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType
+ * @psalm-param ExpectedType $value2
+ * @psalm-assert !=ExpectedType $value1
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notSame($value1, $value2, $message = null, string $propertyPath = null): bool
+ {
+ if ($value1 === $value2) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was not expected to be the same as value "%s".'),
+ static::stringify($value1),
+ static::stringify($value2)
+ );
+ throw static::createException($value1, $message, static::INVALID_NOT_SAME, $propertyPath, ['expected' => $value2]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is not in array of choices.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notInArray($value, array $choices, $message = null, string $propertyPath = null): bool
+ {
+ if (true === \in_array($value, $choices)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was not expected to be an element of the values: %s'),
+ static::stringify($value),
+ static::stringify($choices)
+ );
+ throw static::createException($value, $message, static::INVALID_VALUE_IN_ARRAY, $propertyPath, ['choices' => $choices]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a php integer.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert int $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function integer($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_int($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an integer.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_INTEGER, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a php float.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert float $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function float($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_float($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a float.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_FLOAT, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Validates if an integer or integerish is a digit.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function digit($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\ctype_digit((string)$value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a digit.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_DIGIT, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a php integer'ish.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function integerish($value, $message = null, string $propertyPath = null): bool
+ {
+ if (
+ \is_resource($value) ||
+ \is_object($value) ||
+ \is_bool($value) ||
+ \is_null($value) ||
+ \is_array($value) ||
+ (\is_string($value) && '' == $value) ||
+ (
+ \strval(\intval($value)) !== \strval($value) &&
+ \strval(\intval($value)) !== \strval(\ltrim($value, '0')) &&
+ '' !== \strval(\intval($value)) &&
+ '' !== \strval(\ltrim($value, '0'))
+ )
+ ) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an integer or a number castable to integer.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_INTEGERISH, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is php boolean.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert bool $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function boolean($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_bool($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a boolean.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_BOOLEAN, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a PHP scalar.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert scalar $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function scalar($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_scalar($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a scalar.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_SCALAR, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is not empty.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert !empty $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notEmpty($value, $message = null, string $propertyPath = null): bool
+ {
+ if (empty($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is empty, but non empty value was expected.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::VALUE_EMPTY, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is empty.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert empty $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function noContent($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!empty($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not empty, but empty value was expected.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::VALUE_NOT_EMPTY, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is null.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert null $value
+ *
+ * @return bool
+ */
+ public static function null($value, $message = null, string $propertyPath = null): bool
+ {
+ if (null !== $value) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not null, but null value was expected.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::VALUE_NOT_NULL, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is not null.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert !null $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notNull($value, $message = null, string $propertyPath = null): bool
+ {
+ if (null === $value) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is null, but non null value was expected.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::VALUE_NULL, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a string.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function string($value, $message = null, string $propertyPath = null)
+ {
+ if (!\is_string($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" expected to be string, type %s given.'),
+ static::stringify($value),
+ \gettype($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_STRING, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value matches a regex.
+ *
+ * @param mixed $value
+ * @param string $pattern
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function regex($value, $pattern, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (!\preg_match($pattern, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" does not match expression.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_REGEX, $propertyPath, ['pattern' => $pattern]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value does not match a regex.
+ *
+ * @param mixed $value
+ * @param string $pattern
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert !=string $value
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notRegex($value, $pattern, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (\preg_match($pattern, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" matches expression.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_NOT_REGEX, $propertyPath, ['pattern' => $pattern]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string has a given length.
+ *
+ * @param mixed $value
+ * @param int $length
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function length($value, $length, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (\mb_strlen($value, $encoding) !== $length) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" has to be %d exactly characters long, but length is %d.'),
+ static::stringify($value),
+ $length,
+ \mb_strlen($value, $encoding)
+ );
+
+ throw static::createException($value, $message, static::INVALID_LENGTH, $propertyPath, ['length' => $length, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a string is at least $minLength chars long.
+ *
+ * @param mixed $value
+ * @param int $minLength
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function minLength($value, $minLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (\mb_strlen($value, $encoding) < $minLength) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is too short, it should have at least %d characters, but only has %d characters.'),
+ static::stringify($value),
+ $minLength,
+ \mb_strlen($value, $encoding)
+ );
+
+ throw static::createException($value, $message, static::INVALID_MIN_LENGTH, $propertyPath, ['min_length' => $minLength, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string value is not longer than $maxLength chars.
+ *
+ * @param mixed $value
+ * @param int $maxLength
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function maxLength($value, $maxLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (\mb_strlen($value, $encoding) > $maxLength) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is too long, it should have no more than %d characters, but has %d characters.'),
+ static::stringify($value),
+ $maxLength,
+ \mb_strlen($value, $encoding)
+ );
+
+ throw static::createException($value, $message, static::INVALID_MAX_LENGTH, $propertyPath, ['max_length' => $maxLength, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string length is between min and max lengths.
+ *
+ * @param mixed $value
+ * @param int $minLength
+ * @param int $maxLength
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function betweenLength($value, $minLength, $maxLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($value, $message, $propertyPath);
+ static::minLength($value, $minLength, $message, $propertyPath, $encoding);
+ static::maxLength($value, $maxLength, $message, $propertyPath, $encoding);
+
+ return true;
+ }
+
+ /**
+ * Assert that string starts with a sequence of chars.
+ *
+ * @param mixed $string
+ * @param string $needle
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function startsWith($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($string, $message, $propertyPath);
+
+ if (0 !== \mb_strpos($string, $needle, 0, $encoding)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" does not start with "%s".'),
+ static::stringify($string),
+ static::stringify($needle)
+ );
+
+ throw static::createException($string, $message, static::INVALID_STRING_START, $propertyPath, ['needle' => $needle, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string ends with a sequence of chars.
+ *
+ * @param mixed $string
+ * @param string $needle
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function endsWith($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($string, $message, $propertyPath);
+
+ $stringPosition = \mb_strlen($string, $encoding) - \mb_strlen($needle, $encoding);
+
+ if (\mb_strripos($string, $needle, 0, $encoding) !== $stringPosition) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" does not end with "%s".'),
+ static::stringify($string),
+ static::stringify($needle)
+ );
+
+ throw static::createException($string, $message, static::INVALID_STRING_END, $propertyPath, ['needle' => $needle, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string contains a sequence of chars.
+ *
+ * @param mixed $string
+ * @param string $needle
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function contains($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($string, $message, $propertyPath);
+
+ if (false === \mb_strpos($string, $needle, 0, $encoding)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" does not contain "%s".'),
+ static::stringify($string),
+ static::stringify($needle)
+ );
+
+ throw static::createException($string, $message, static::INVALID_STRING_CONTAINS, $propertyPath, ['needle' => $needle, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that string does not contains a sequence of chars.
+ *
+ * @param mixed $string
+ * @param string $needle
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notContains($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
+ {
+ static::string($string, $message, $propertyPath);
+
+ if (false !== \mb_strpos($string, $needle, 0, $encoding)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" contains "%s".'),
+ static::stringify($string),
+ static::stringify($needle)
+ );
+
+ throw static::createException($string, $message, static::INVALID_STRING_NOT_CONTAINS, $propertyPath, ['needle' => $needle, 'encoding' => $encoding]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is in array of choices.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function choice($value, array $choices, $message = null, string $propertyPath = null): bool
+ {
+ if (!\in_array($value, $choices, true)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an element of the valid values: %s'),
+ static::stringify($value),
+ \implode(', ', \array_map([\get_called_class(), 'stringify'], $choices))
+ );
+
+ throw static::createException($value, $message, static::INVALID_CHOICE, $propertyPath, ['choices' => $choices]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is in array of choices.
+ *
+ * This is an alias of {@see choice()}.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function inArray($value, array $choices, $message = null, string $propertyPath = null): bool
+ {
+ return static::choice($value, $choices, $message, $propertyPath);
+ }
+
+ /**
+ * Assert that value is numeric.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert numeric $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function numeric($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_numeric($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not numeric.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_NUMERIC, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is a resource.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert resource $value
+ *
+ * @return bool
+ */
+ public static function isResource($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_resource($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a resource.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_RESOURCE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an array.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert array $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isArray($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_array($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an array.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_ARRAY, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an array or a traversable object.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert iterable $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isTraversable($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_array($value) && !$value instanceof Traversable) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an array and does not implement Traversable.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_TRAVERSABLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an array or an array-accessible object.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isArrayAccessible($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_array($value) && !$value instanceof ArrayAccess) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an array and does not implement ArrayAccess.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_ARRAY_ACCESSIBLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is countable.
+ *
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert countable $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isCountable($value, $message = null, string $propertyPath = null): bool
+ {
+ if (\function_exists('is_countable')) {
+ $assert = \is_countable($value);
+ } else {
+ $assert = \is_array($value) || $value instanceof Countable || $value instanceof ResourceBundle || $value instanceof SimpleXMLElement;
+ }
+
+ if (!$assert) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not an array and does not implement Countable.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_COUNTABLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that key exists in an array.
+ *
+ * @param mixed $value
+ * @param string|int $key
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function keyExists($value, $key, $message = null, string $propertyPath = null): bool
+ {
+ static::isArray($value, $message, $propertyPath);
+
+ if (!\array_key_exists($key, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Array does not contain an element with key "%s"'),
+ static::stringify($key)
+ );
+
+ throw static::createException($value, $message, static::INVALID_KEY_EXISTS, $propertyPath, ['key' => $key]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that key does not exist in an array.
+ *
+ * @param mixed $value
+ * @param string|int $key
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function keyNotExists($value, $key, $message = null, string $propertyPath = null): bool
+ {
+ static::isArray($value, $message, $propertyPath);
+
+ if (\array_key_exists($key, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Array contains an element with key "%s"'),
+ static::stringify($key)
+ );
+
+ throw static::createException($value, $message, static::INVALID_KEY_NOT_EXISTS, $propertyPath, ['key' => $key]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that values in array are unique (using strict equality).
+ *
+ * @param mixed[] $values
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function uniqueValues(array $values, $message = null, string $propertyPath = null): bool
+ {
+ foreach ($values as $key => $value) {
+ if (\array_search($value, $values, true) !== $key) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" occurs more than once in array'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_UNIQUE_VALUES, $propertyPath, ['value' => $value]);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that key exists in an array/array-accessible object using isset().
+ *
+ * @param mixed $value
+ * @param string|int $key
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function keyIsset($value, $key, $message = null, string $propertyPath = null): bool
+ {
+ static::isArrayAccessible($value, $message, $propertyPath);
+
+ if (!isset($value[$key])) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'The element with key "%s" was not found'),
+ static::stringify($key)
+ );
+
+ throw static::createException($value, $message, static::INVALID_KEY_ISSET, $propertyPath, ['key' => $key]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that key exists in an array/array-accessible object and its value is not empty.
+ *
+ * @param mixed $value
+ * @param string|int $key
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notEmptyKey($value, $key, $message = null, string $propertyPath = null): bool
+ {
+ static::keyIsset($value, $key, $message, $propertyPath);
+ static::notEmpty($value[$key], $message, $propertyPath);
+
+ return true;
+ }
+
+ /**
+ * Assert that value is not blank.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notBlank($value, $message = null, string $propertyPath = null): bool
+ {
+ if (false === $value || (empty($value) && '0' != $value) || (\is_string($value) && '' === \trim($value))) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is blank, but was expected to contain a value.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_NOT_BLANK, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is instance of given class-name.
+ *
+ * @param mixed $value
+ * @param string $className
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string $className
+ * @psalm-assert ExpectedType $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isInstanceOf($value, $className, $message = null, string $propertyPath = null): bool
+ {
+ if (!($value instanceof $className)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" was expected to be instanceof of "%s" but is not.'),
+ static::stringify($value),
+ $className
+ );
+
+ throw static::createException($value, $message, static::INVALID_INSTANCE_OF, $propertyPath, ['class' => $className]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is not instance of given class-name.
+ *
+ * @param mixed $value
+ * @param string $className
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string $className
+ * @psalm-assert !ExpectedType $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function notIsInstanceOf($value, $className, $message = null, string $propertyPath = null): bool
+ {
+ if ($value instanceof $className) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" was not expected to be instanceof of "%s".'),
+ static::stringify($value),
+ $className
+ );
+
+ throw static::createException($value, $message, static::INVALID_NOT_INSTANCE_OF, $propertyPath, ['class' => $className]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is subclass of given class-name.
+ *
+ * @param mixed $value
+ * @param string $className
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function subclassOf($value, $className, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_subclass_of($value, $className)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" was expected to be subclass of "%s".'),
+ static::stringify($value),
+ $className
+ );
+
+ throw static::createException($value, $message, static::INVALID_SUBCLASS_OF, $propertyPath, ['class' => $className]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is in range of numbers.
+ *
+ * @param mixed $value
+ * @param mixed $minValue
+ * @param mixed $maxValue
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function range($value, $minValue, $maxValue, $message = null, string $propertyPath = null): bool
+ {
+ static::numeric($value, $message, $propertyPath);
+
+ if ($value < $minValue || $value > $maxValue) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Number "%s" was expected to be at least "%d" and at most "%d".'),
+ static::stringify($value),
+ static::stringify($minValue),
+ static::stringify($maxValue)
+ );
+
+ throw static::createException($value, $message, static::INVALID_RANGE, $propertyPath, ['min' => $minValue, 'max' => $maxValue]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a value is at least as big as a given limit.
+ *
+ * @param mixed $value
+ * @param mixed $minValue
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function min($value, $minValue, $message = null, string $propertyPath = null): bool
+ {
+ static::numeric($value, $message, $propertyPath);
+
+ if ($value < $minValue) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Number "%s" was expected to be at least "%s".'),
+ static::stringify($value),
+ static::stringify($minValue)
+ );
+
+ throw static::createException($value, $message, static::INVALID_MIN, $propertyPath, ['min' => $minValue]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a number is smaller as a given limit.
+ *
+ * @param mixed $value
+ * @param mixed $maxValue
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function max($value, $maxValue, $message = null, string $propertyPath = null): bool
+ {
+ static::numeric($value, $message, $propertyPath);
+
+ if ($value > $maxValue) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Number "%s" was expected to be at most "%s".'),
+ static::stringify($value),
+ static::stringify($maxValue)
+ );
+
+ throw static::createException($value, $message, static::INVALID_MAX, $propertyPath, ['max' => $maxValue]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a file exists.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function file($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+ static::notEmpty($value, $message, $propertyPath);
+
+ if (!\is_file($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'File "%s" was expected to exist.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_FILE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a directory exists.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function directory($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (!\is_dir($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Path "%s" was expected to be a directory.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_DIRECTORY, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is something readable.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function readable($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (!\is_readable($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Path "%s" was expected to be readable.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_READABLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is something writeable.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function writeable($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (!\is_writable($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Path "%s" was expected to be writeable.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_WRITEABLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function email($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ if (!\filter_var($value, FILTER_VALIDATE_EMAIL)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was expected to be a valid e-mail address.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_EMAIL, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an URL.
+ *
+ * This code snipped was taken from the Symfony project and modified to the special demands of this method.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ *
+ * @see https://github.com/symfony/Validator/blob/master/Constraints/UrlValidator.php
+ * @see https://github.com/symfony/Validator/blob/master/Constraints/Url.php
+ */
+ public static function url($value, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+
+ $protocols = ['http', 'https'];
+
+ $pattern = '~^
+ (%s):// # protocol
+ (([\.\pL\pN-]+:)?([\.\pL\pN-]+)@)? # basic auth
+ (
+ ([\pL\pN\pS\-\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name
+ | # or
+ \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address
+ | # or
+ \[
+ (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))
+ \] # an IPv6 address
+ )
+ (:[0-9]+)? # a port (optional)
+ (?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path
+ (?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
+ (?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional)
+ $~ixu';
+
+ $pattern = \sprintf($pattern, \implode('|', $protocols));
+
+ if (!\preg_match($pattern, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was expected to be a valid URL starting with http or https'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_URL, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is alphanumeric.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function alnum($value, $message = null, string $propertyPath = null): bool
+ {
+ try {
+ static::regex($value, '(^([a-zA-Z]{1}[a-zA-Z0-9]*)$)', $message, $propertyPath);
+ } catch (Throwable $e) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not alphanumeric, starting with letters and containing only letters and numbers.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_ALNUM, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is boolean True.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert true $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function true($value, $message = null, string $propertyPath = null): bool
+ {
+ if (true !== $value) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not TRUE.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_TRUE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is boolean False.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert false $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function false($value, $message = null, string $propertyPath = null): bool
+ {
+ if (false !== $value) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not FALSE.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_FALSE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the class exists.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert class-string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function classExists($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\class_exists($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" does not exist.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_CLASS, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the interface exists.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert class-string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function interfaceExists($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\interface_exists($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Interface "%s" does not exist.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_INTERFACE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the class implements the interface.
+ *
+ * @param mixed $class
+ * @param string $interfaceName
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function implementsInterface($class, $interfaceName, $message = null, string $propertyPath = null): bool
+ {
+ try {
+ $reflection = new ReflectionClass($class);
+ if (!$reflection->implementsInterface($interfaceName)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" does not implement interface "%s".'),
+ static::stringify($class),
+ static::stringify($interfaceName)
+ );
+
+ throw static::createException($class, $message, static::INTERFACE_NOT_IMPLEMENTED, $propertyPath, ['interface' => $interfaceName]);
+ }
+ } catch (ReflectionException $e) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" failed reflection.'),
+ static::stringify($class)
+ );
+ throw static::createException($class, $message, static::INTERFACE_NOT_IMPLEMENTED, $propertyPath, ['interface' => $interfaceName]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the given string is a valid json string.
+ *
+ * NOTICE:
+ * Since this does a json_decode to determine its validity
+ * you probably should consider, when using the variable
+ * content afterwards, just to decode and check for yourself instead
+ * of using this assertion.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isJsonString($value, $message = null, string $propertyPath = null): bool
+ {
+ if (null === \json_decode($value) && JSON_ERROR_NONE !== \json_last_error()) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a valid JSON string.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_JSON_STRING, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the given string is a valid UUID.
+ *
+ * Uses code from {@link https://github.com/ramsey/uuid} that is MIT licensed.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function uuid($value, $message = null, string $propertyPath = null): bool
+ {
+ $value = \str_replace(['urn:', 'uuid:', '{', '}'], '', $value);
+
+ if ('00000000-0000-0000-0000-000000000000' === $value) {
+ return true;
+ }
+
+ if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a valid UUID.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_UUID, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the given string is a valid E164 Phone Number.
+ *
+ * @see https://en.wikipedia.org/wiki/E.164
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function e164($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\preg_match('/^\+?[1-9]\d{1,14}$/', $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" is not a valid E164.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_E164, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the count of countable is equal to count.
+ *
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function count($countable, $count, $message = null, string $propertyPath = null): bool
+ {
+ if ($count !== \count($countable)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'List does not contain exactly %d elements (%d given).'),
+ static::stringify($count),
+ static::stringify(\count($countable))
+ );
+
+ throw static::createException($countable, $message, static::INVALID_COUNT, $propertyPath, ['count' => $count]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the countable have at least $count elements.
+ *
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function minCount($countable, $count, $message = null, string $propertyPath = null): bool
+ {
+ if ($count > \count($countable)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'List should have at least %d elements, but has %d elements.'),
+ static::stringify($count),
+ static::stringify(\count($countable))
+ );
+
+ throw static::createException($countable, $message, static::INVALID_MIN_COUNT, $propertyPath, ['count' => $count]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the countable have at most $count elements.
+ *
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function maxCount($countable, $count, $message = null, string $propertyPath = null): bool
+ {
+ if ($count < \count($countable)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'List should have at most %d elements, but has %d elements.'),
+ static::stringify($count),
+ static::stringify(\count($countable))
+ );
+
+ throw static::createException($countable, $message, static::INVALID_MAX_COUNT, $propertyPath, ['count' => $count]);
+ }
+
+ return true;
+ }
+
+ /**
+ * static call handler to implement:
+ * - "null or assertion" delegation
+ * - "all" delegation.
+ *
+ * @param string $method
+ * @param array $args
+ *
+ * @return bool|mixed
+ *
+ * @throws AssertionFailedException
+ */
+ public static function __callStatic($method, $args)
+ {
+ if (0 === \strpos($method, 'nullOr')) {
+ if (!\array_key_exists(0, $args)) {
+ throw new BadMethodCallException('Missing the first argument.');
+ }
+
+ if (null === $args[0]) {
+ return true;
+ }
+
+ $method = \substr($method, 6);
+
+ return \call_user_func_array([\get_called_class(), $method], $args);
+ }
+
+ if (0 === \strpos($method, 'all')) {
+ if (!\array_key_exists(0, $args)) {
+ throw new BadMethodCallException('Missing the first argument.');
+ }
+
+ static::isTraversable($args[0]);
+
+ $method = \substr($method, 3);
+ $values = \array_shift($args);
+ $calledClass = \get_called_class();
+
+ foreach ($values as $value) {
+ \call_user_func_array([$calledClass, $method], \array_merge([$value], $args));
+ }
+
+ return true;
+ }
+
+ throw new BadMethodCallException('No assertion Assertion#'.$method.' exists.');
+ }
+
+ /**
+ * Determines if the values array has every choice as key and that this choice has content.
+ *
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function choicesNotEmpty(array $values, array $choices, $message = null, string $propertyPath = null): bool
+ {
+ static::notEmpty($values, $message, $propertyPath);
+
+ foreach ($choices as $choice) {
+ static::notEmptyKey($values, $choice, $message, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines that the named method is defined in the provided object.
+ *
+ * @param string $value
+ * @param mixed $object
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function methodExists($value, $object, $message = null, string $propertyPath = null): bool
+ {
+ static::isObject($object, $message, $propertyPath);
+
+ if (!\method_exists($object, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Expected "%s" does not exist in provided object.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_METHOD, $propertyPath, ['object' => \get_class($object)]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines that the provided value is an object.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert object $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isObject($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_object($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not a valid object.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_OBJECT, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines if the value is less than given limit.
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function lessThan($value, $limit, $message = null, string $propertyPath = null): bool
+ {
+ if ($value >= $limit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not less than "%s".'),
+ static::stringify($value),
+ static::stringify($limit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_LESS, $propertyPath, ['limit' => $limit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines if the value is less or equal than given limit.
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function lessOrEqualThan($value, $limit, $message = null, string $propertyPath = null): bool
+ {
+ if ($value > $limit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not less or equal than "%s".'),
+ static::stringify($value),
+ static::stringify($limit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_LESS_OR_EQUAL, $propertyPath, ['limit' => $limit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines if the value is greater than given limit.
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function greaterThan($value, $limit, $message = null, string $propertyPath = null): bool
+ {
+ if ($value <= $limit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not greater than "%s".'),
+ static::stringify($value),
+ static::stringify($limit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_GREATER, $propertyPath, ['limit' => $limit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Determines if the value is greater or equal than given limit.
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function greaterOrEqualThan($value, $limit, $message = null, string $propertyPath = null): bool
+ {
+ if ($value < $limit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not greater or equal than "%s".'),
+ static::stringify($value),
+ static::stringify($limit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_GREATER_OR_EQUAL, $propertyPath, ['limit' => $limit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
+ *
+ * @param mixed $value
+ * @param mixed $lowerLimit
+ * @param mixed $upperLimit
+ * @param string|callable|null $message
+ * @param string $propertyPath
+ *
+ * @throws AssertionFailedException
+ */
+ public static function between($value, $lowerLimit, $upperLimit, $message = null, string $propertyPath = null): bool
+ {
+ if ($lowerLimit > $value || $value > $upperLimit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is neither greater than or equal to "%s" nor less than or equal to "%s".'),
+ static::stringify($value),
+ static::stringify($lowerLimit),
+ static::stringify($upperLimit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_BETWEEN, $propertyPath, ['lower' => $lowerLimit, 'upper' => $upperLimit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a value is greater than a lower limit, and less than an upper limit.
+ *
+ * @param mixed $value
+ * @param mixed $lowerLimit
+ * @param mixed $upperLimit
+ * @param string|callable|null $message
+ * @param string $propertyPath
+ *
+ * @throws AssertionFailedException
+ */
+ public static function betweenExclusive($value, $lowerLimit, $upperLimit, $message = null, string $propertyPath = null): bool
+ {
+ if ($lowerLimit >= $value || $value >= $upperLimit) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is neither greater than "%s" nor less than "%s".'),
+ static::stringify($value),
+ static::stringify($lowerLimit),
+ static::stringify($upperLimit)
+ );
+
+ throw static::createException($value, $message, static::INVALID_BETWEEN_EXCLUSIVE, $propertyPath, ['lower' => $lowerLimit, 'upper' => $upperLimit]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that extension is loaded.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function extensionLoaded($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\extension_loaded($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Extension "%s" is required.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_EXTENSION, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that date is valid and corresponds to the given format.
+ *
+ * @param string $value
+ * @param string $format supports all of the options date(), except for the following:
+ * N, w, W, t, L, o, B, a, A, g, h, I, O, P, Z, c, r
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ *
+ * @see http://php.net/manual/function.date.php#refsect1-function.date-parameters
+ */
+ public static function date($value, $format, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+ static::string($format, $message, $propertyPath);
+
+ $dateTime = DateTime::createFromFormat('!'.$format, $value);
+
+ if (false === $dateTime || $value !== $dateTime->format($format)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Date "%s" is invalid or does not match format "%s".'),
+ static::stringify($value),
+ static::stringify($format)
+ );
+
+ throw static::createException($value, $message, static::INVALID_DATE, $propertyPath, ['format' => $format]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is an object, or a class that exists.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function objectOrClass($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_object($value)) {
+ static::classExists($value, $message, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is an object or class, and that the property exists.
+ *
+ * @param mixed $value
+ * @param string $property
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function propertyExists($value, $property, $message = null, string $propertyPath = null): bool
+ {
+ static::objectOrClass($value);
+
+ if (!\property_exists($value, $property)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" does not have property "%s".'),
+ static::stringify($value),
+ static::stringify($property)
+ );
+
+ throw static::createException($value, $message, static::INVALID_PROPERTY, $propertyPath, ['property' => $property]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the value is an object or class, and that the properties all exist.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function propertiesExist($value, array $properties, $message = null, string $propertyPath = null): bool
+ {
+ static::objectOrClass($value);
+ static::allString($properties, $message, $propertyPath);
+
+ $invalidProperties = [];
+ foreach ($properties as $property) {
+ if (!\property_exists($value, $property)) {
+ $invalidProperties[] = $property;
+ }
+ }
+
+ if ($invalidProperties) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Class "%s" does not have these properties: %s.'),
+ static::stringify($value),
+ static::stringify(\implode(', ', $invalidProperties))
+ );
+
+ throw static::createException($value, $message, static::INVALID_PROPERTY, $propertyPath, ['properties' => $properties]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert comparison of two versions.
+ *
+ * @param string $version1
+ * @param string $operator
+ * @param string $version2
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function version($version1, $operator, $version2, $message = null, string $propertyPath = null): bool
+ {
+ static::notEmpty($operator, 'versionCompare operator is required and cannot be empty.');
+
+ if (true !== \version_compare($version1, $version2, $operator)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Version "%s" is not "%s" version "%s".'),
+ static::stringify($version1),
+ static::stringify($operator),
+ static::stringify($version2)
+ );
+
+ throw static::createException($version1, $message, static::INVALID_VERSION, $propertyPath, ['operator' => $operator, 'version' => $version2]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert on PHP version.
+ *
+ * @param string $operator
+ * @param mixed $version
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function phpVersion($operator, $version, $message = null, string $propertyPath = null): bool
+ {
+ static::defined('PHP_VERSION');
+
+ return static::version(PHP_VERSION, $operator, $version, $message, $propertyPath);
+ }
+
+ /**
+ * Assert that extension is loaded and a specific version is installed.
+ *
+ * @param string $extension
+ * @param string $operator
+ * @param mixed $version
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function extensionVersion($extension, $operator, $version, $message = null, string $propertyPath = null): bool
+ {
+ static::extensionLoaded($extension, $message, $propertyPath);
+
+ return static::version(\phpversion($extension), $operator, $version, $message, $propertyPath);
+ }
+
+ /**
+ * Determines that the provided value is callable.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert callable $value
+ *
+ * @return bool
+ *
+ * @throws AssertionFailedException
+ */
+ public static function isCallable($value, $message = null, string $propertyPath = null): bool
+ {
+ if (!\is_callable($value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is not a callable.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_CALLABLE, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that the provided value is valid according to a callback.
+ *
+ * If the callback returns `false` the assertion will fail.
+ *
+ * @param mixed $value
+ * @param callable $callback
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function satisfy($value, $callback, $message = null, string $propertyPath = null): bool
+ {
+ static::isCallable($callback);
+
+ if (false === \call_user_func($callback, $value)) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Provided "%s" is invalid according to custom rule.'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_SATISFY, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an IPv4 or IPv6 address
+ * (using input_filter/FILTER_VALIDATE_IP).
+ *
+ * @param string $value
+ * @param int|null $flag
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ *
+ * @see http://php.net/manual/filter.filters.flags.php
+ */
+ public static function ip($value, $flag = null, $message = null, string $propertyPath = null): bool
+ {
+ static::string($value, $message, $propertyPath);
+ if ($flag === null) {
+ $filterVarResult = \filter_var($value, FILTER_VALIDATE_IP);
+ } else {
+ $filterVarResult = \filter_var($value, FILTER_VALIDATE_IP, $flag);
+ }
+ if (!$filterVarResult) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" was expected to be a valid IP address.'),
+ static::stringify($value)
+ );
+ throw static::createException($value, $message, static::INVALID_IP, $propertyPath, ['flag' => $flag]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an IPv4 address
+ * (using input_filter/FILTER_VALIDATE_IP).
+ *
+ * @param string $value
+ * @param int|null $flag
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ *
+ * @see http://php.net/manual/filter.filters.flags.php
+ */
+ public static function ipv4($value, $flag = null, $message = null, string $propertyPath = null): bool
+ {
+ static::ip($value, $flag | FILTER_FLAG_IPV4, static::generateMessage($message ?: 'Value "%s" was expected to be a valid IPv4 address.'), $propertyPath);
+
+ return true;
+ }
+
+ /**
+ * Assert that value is an IPv6 address
+ * (using input_filter/FILTER_VALIDATE_IP).
+ *
+ * @param string $value
+ * @param int|null $flag
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ *
+ * @see http://php.net/manual/filter.filters.flags.php
+ */
+ public static function ipv6($value, $flag = null, $message = null, string $propertyPath = null): bool
+ {
+ static::ip($value, $flag | FILTER_FLAG_IPV6, static::generateMessage($message ?: 'Value "%s" was expected to be a valid IPv6 address.'), $propertyPath);
+
+ return true;
+ }
+
+ /**
+ * Assert that a constant is defined.
+ *
+ * @param mixed $constant
+ * @param string|callable|null $message
+ */
+ public static function defined($constant, $message = null, string $propertyPath = null): bool
+ {
+ if (!\defined($constant)) {
+ $message = \sprintf(static::generateMessage($message ?: 'Value "%s" expected to be a defined constant.'), $constant);
+
+ throw static::createException($constant, $message, static::INVALID_CONSTANT, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Assert that a constant is defined.
+ *
+ * @param string $value
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function base64($value, $message = null, string $propertyPath = null): bool
+ {
+ if (false === \base64_decode($value, true)) {
+ $message = \sprintf(static::generateMessage($message ?: 'Value "%s" is not a valid base64 string.'), $value);
+
+ throw static::createException($value, $message, static::INVALID_BASE64, $propertyPath);
+ }
+
+ return true;
+ }
+
+ /**
+ * Helper method that handles building the assertion failure exceptions.
+ * They are returned from this method so that the stack trace still shows
+ * the assertions method.
+ *
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param int $code
+ *
+ * @return mixed
+ */
+ protected static function createException($value, $message, $code, $propertyPath = null, array $constraints = [])
+ {
+ $exceptionClass = static::$exceptionClass;
+
+ return new $exceptionClass($message, $code, $propertyPath, $value, $constraints);
+ }
+
+ /**
+ * Make a string version of a value.
+ *
+ * @param mixed $value
+ */
+ protected static function stringify($value): string
+ {
+ $result = \gettype($value);
+
+ if (\is_bool($value)) {
+ $result = $value ? '' : '';
+ } elseif (\is_scalar($value)) {
+ $val = (string)$value;
+
+ if (\mb_strlen($val) > 100) {
+ $val = \mb_substr($val, 0, 97).'...';
+ }
+
+ $result = $val;
+ } elseif (\is_array($value)) {
+ $result = '';
+ } elseif (\is_object($value)) {
+ $result = \get_class($value);
+ } elseif (\is_resource($value)) {
+ $result = \get_resource_type($value);
+ } elseif (null === $value) {
+ $result = '';
+ }
+
+ return $result;
+ }
+
+ /**
+ * Generate the message.
+ *
+ * @param string|callable|null $message
+ */
+ protected static function generateMessage($message): string
+ {
+ if (\is_callable($message)) {
+ $traces = \debug_backtrace(0);
+
+ $parameters = [];
+
+ try {
+ $reflection = new ReflectionClass($traces[1]['class']);
+ $method = $reflection->getMethod($traces[1]['function']);
+ foreach ($method->getParameters() as $index => $parameter) {
+ if ('message' !== $parameter->getName()) {
+ $parameters[$parameter->getName()] = \array_key_exists($index, $traces[1]['args'])
+ ? $traces[1]['args'][$index]
+ : $parameter->getDefaultValue();
+ }
+ }
+
+ $parameters['::assertion'] = \sprintf('%s%s%s', $traces[1]['class'], $traces[1]['type'], $traces[1]['function']);
+
+ $message = \call_user_func_array($message, [$parameters]);
+ } // @codeCoverageIgnoreStart
+ catch (Throwable $exception) {
+ $message = \sprintf('Unable to generate message : %s', $exception->getMessage());
+ } // @codeCoverageIgnoreEnd
+ }
+
+ return (string)$message;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionChain.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionChain.php
new file mode 100644
index 00000000..4c444350
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionChain.php
@@ -0,0 +1,247 @@
+
+ *
+ * @method AssertionChain alnum(string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric.
+ * @method AssertionChain base64(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method AssertionChain between(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
+ * @method AssertionChain betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
+ * @method AssertionChain betweenLength(int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths.
+ * @method AssertionChain boolean(string|callable $message = null, string $propertyPath = null) Assert that value is php boolean.
+ * @method AssertionChain choice(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices.
+ * @method AssertionChain choicesNotEmpty(array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content.
+ * @method AssertionChain classExists(string|callable $message = null, string $propertyPath = null) Assert that the class exists.
+ * @method AssertionChain contains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars.
+ * @method AssertionChain count(int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
+ * @method AssertionChain date(string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format.
+ * @method AssertionChain defined(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method AssertionChain digit(string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit.
+ * @method AssertionChain directory(string|callable $message = null, string $propertyPath = null) Assert that a directory exists.
+ * @method AssertionChain e164(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number.
+ * @method AssertionChain email(string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
+ * @method AssertionChain endsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars.
+ * @method AssertionChain eq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==).
+ * @method AssertionChain eqArraySubset(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset.
+ * @method AssertionChain extensionLoaded(string|callable $message = null, string $propertyPath = null) Assert that extension is loaded.
+ * @method AssertionChain extensionVersion(string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed.
+ * @method AssertionChain false(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False.
+ * @method AssertionChain file(string|callable $message = null, string $propertyPath = null) Assert that a file exists.
+ * @method AssertionChain float(string|callable $message = null, string $propertyPath = null) Assert that value is a php float.
+ * @method AssertionChain greaterOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit.
+ * @method AssertionChain greaterThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit.
+ * @method AssertionChain implementsInterface(string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface.
+ * @method AssertionChain inArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice().
+ * @method AssertionChain integer(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer.
+ * @method AssertionChain integerish(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish.
+ * @method AssertionChain interfaceExists(string|callable $message = null, string $propertyPath = null) Assert that the interface exists.
+ * @method AssertionChain ip(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address.
+ * @method AssertionChain ipv4(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address.
+ * @method AssertionChain ipv6(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address.
+ * @method AssertionChain isArray(string|callable $message = null, string $propertyPath = null) Assert that value is an array.
+ * @method AssertionChain isArrayAccessible(string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object.
+ * @method AssertionChain isCallable(string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable.
+ * @method AssertionChain isCountable(string|callable $message = null, string $propertyPath = null) Assert that value is countable.
+ * @method AssertionChain isInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name.
+ * @method AssertionChain isJsonString(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string.
+ * @method AssertionChain isObject(string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object.
+ * @method AssertionChain isResource(string|callable $message = null, string $propertyPath = null) Assert that value is a resource.
+ * @method AssertionChain isTraversable(string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object.
+ * @method AssertionChain keyExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array.
+ * @method AssertionChain keyIsset(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset().
+ * @method AssertionChain keyNotExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array.
+ * @method AssertionChain length(int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length.
+ * @method AssertionChain lessOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit.
+ * @method AssertionChain lessThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit.
+ * @method AssertionChain max(mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit.
+ * @method AssertionChain maxCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
+ * @method AssertionChain maxLength(int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars.
+ * @method AssertionChain methodExists(mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object.
+ * @method AssertionChain min(mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit.
+ * @method AssertionChain minCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
+ * @method AssertionChain minLength(int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long.
+ * @method AssertionChain noContent(string|callable $message = null, string $propertyPath = null) Assert that value is empty.
+ * @method AssertionChain notBlank(string|callable $message = null, string $propertyPath = null) Assert that value is not blank.
+ * @method AssertionChain notContains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars.
+ * @method AssertionChain notEmpty(string|callable $message = null, string $propertyPath = null) Assert that value is not empty.
+ * @method AssertionChain notEmptyKey(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty.
+ * @method AssertionChain notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==).
+ * @method AssertionChain notInArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices.
+ * @method AssertionChain notIsInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name.
+ * @method AssertionChain notNull(string|callable $message = null, string $propertyPath = null) Assert that value is not null.
+ * @method AssertionChain notRegex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex.
+ * @method AssertionChain notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===).
+ * @method AssertionChain null(string|callable $message = null, string $propertyPath = null) Assert that value is null.
+ * @method AssertionChain numeric(string|callable $message = null, string $propertyPath = null) Assert that value is numeric.
+ * @method AssertionChain objectOrClass(string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists.
+ * @method AssertionChain phpVersion(mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version.
+ * @method AssertionChain propertiesExist(array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist.
+ * @method AssertionChain propertyExists(string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists.
+ * @method AssertionChain range(mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers.
+ * @method AssertionChain readable(string|callable $message = null, string $propertyPath = null) Assert that the value is something readable.
+ * @method AssertionChain regex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex.
+ * @method AssertionChain same(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===).
+ * @method AssertionChain satisfy(callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback.
+ * @method AssertionChain scalar(string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar.
+ * @method AssertionChain startsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars.
+ * @method AssertionChain string(string|callable $message = null, string $propertyPath = null) Assert that value is a string.
+ * @method AssertionChain subclassOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name.
+ * @method AssertionChain true(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True.
+ * @method AssertionChain uniqueValues(string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality).
+ * @method AssertionChain url(string|callable $message = null, string $propertyPath = null) Assert that value is an URL.
+ * @method AssertionChain uuid(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID.
+ * @method AssertionChain version(string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions.
+ * @method AssertionChain writeable(string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable.
+ */
+class AssertionChain
+{
+ /**
+ * @var mixed
+ */
+ private $value;
+
+ /**
+ * @var string|callable|null
+ */
+ private $defaultMessage;
+
+ /**
+ * @var string|null
+ */
+ private $defaultPropertyPath;
+
+ /**
+ * Return each assertion as always valid.
+ *
+ * @var bool
+ */
+ private $alwaysValid = false;
+
+ /**
+ * Perform assertion on every element of array or traversable.
+ *
+ * @var bool
+ */
+ private $all = false;
+
+ /** @var string|Assertion Class to use for assertion calls */
+ private $assertionClassName = 'Assert\Assertion';
+
+ /**
+ * AssertionChain constructor.
+ *
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ */
+ public function __construct($value, $defaultMessage = null, string $defaultPropertyPath = null)
+ {
+ $this->value = $value;
+ $this->defaultMessage = $defaultMessage;
+ $this->defaultPropertyPath = $defaultPropertyPath;
+ }
+
+ /**
+ * Call assertion on the current value in the chain.
+ *
+ * @param string $methodName
+ * @param array $args
+ */
+ public function __call($methodName, $args): AssertionChain
+ {
+ if (true === $this->alwaysValid) {
+ return $this;
+ }
+
+ try {
+ $method = new \ReflectionMethod($this->assertionClassName, $methodName);
+ } catch (\ReflectionException $exception) {
+ throw new \RuntimeException("Assertion '".$methodName."' does not exist.");
+ }
+
+ \array_unshift($args, $this->value);
+ $params = $method->getParameters();
+
+ foreach ($params as $idx => $param) {
+ if (isset($args[$idx])) {
+ continue;
+ }
+
+ switch ($param->getName()) {
+ case 'message':
+ $args[$idx] = $this->defaultMessage;
+ break;
+ case 'propertyPath':
+ $args[$idx] = $this->defaultPropertyPath;
+ break;
+ }
+ }
+
+ if ($this->all) {
+ $methodName = 'all'.$methodName;
+ }
+
+ \call_user_func_array([$this->assertionClassName, $methodName], $args);
+
+ return $this;
+ }
+
+ /**
+ * Switch chain into validation mode for an array of values.
+ */
+ public function all(): AssertionChain
+ {
+ $this->all = true;
+
+ return $this;
+ }
+
+ /**
+ * Switch chain into mode allowing nulls, ignoring further assertions.
+ */
+ public function nullOr(): AssertionChain
+ {
+ if (null === $this->value) {
+ $this->alwaysValid = true;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return $this
+ */
+ public function setAssertionClassName($className): AssertionChain
+ {
+ if (!\is_string($className)) {
+ throw new LogicException('Exception class name must be passed as a string');
+ }
+
+ if (Assertion::class !== $className && !\is_subclass_of($className, Assertion::class)) {
+ throw new LogicException($className.' is not (a subclass of) '.Assertion::class);
+ }
+
+ $this->assertionClassName = $className;
+
+ return $this;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php
new file mode 100644
index 00000000..7e0b2ec3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php
@@ -0,0 +1,32 @@
+propertyPath = $propertyPath;
+ $this->value = $value;
+ $this->constraints = $constraints;
+ }
+
+ /**
+ * User controlled way to define a sub-property causing
+ * the failure of a currently asserted objects.
+ *
+ * Useful to transport information about the nature of the error
+ * back to higher layers.
+ *
+ * @return string|null
+ */
+ public function getPropertyPath()
+ {
+ return $this->propertyPath;
+ }
+
+ /**
+ * Get the value that caused the assertion to fail.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Get the constraints that applied to the failed assertion.
+ */
+ public function getConstraints(): array
+ {
+ return $this->constraints;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertion.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertion.php
new file mode 100644
index 00000000..b3052178
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertion.php
@@ -0,0 +1,228 @@
+
+ *
+ * @method LazyAssertion alnum(string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric.
+ * @method LazyAssertion base64(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method LazyAssertion between(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
+ * @method LazyAssertion betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
+ * @method LazyAssertion betweenLength(int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths.
+ * @method LazyAssertion boolean(string|callable $message = null, string $propertyPath = null) Assert that value is php boolean.
+ * @method LazyAssertion choice(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices.
+ * @method LazyAssertion choicesNotEmpty(array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content.
+ * @method LazyAssertion classExists(string|callable $message = null, string $propertyPath = null) Assert that the class exists.
+ * @method LazyAssertion contains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars.
+ * @method LazyAssertion count(int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
+ * @method LazyAssertion date(string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format.
+ * @method LazyAssertion defined(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method LazyAssertion digit(string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit.
+ * @method LazyAssertion directory(string|callable $message = null, string $propertyPath = null) Assert that a directory exists.
+ * @method LazyAssertion e164(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number.
+ * @method LazyAssertion email(string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
+ * @method LazyAssertion endsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars.
+ * @method LazyAssertion eq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==).
+ * @method LazyAssertion eqArraySubset(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset.
+ * @method LazyAssertion extensionLoaded(string|callable $message = null, string $propertyPath = null) Assert that extension is loaded.
+ * @method LazyAssertion extensionVersion(string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed.
+ * @method LazyAssertion false(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False.
+ * @method LazyAssertion file(string|callable $message = null, string $propertyPath = null) Assert that a file exists.
+ * @method LazyAssertion float(string|callable $message = null, string $propertyPath = null) Assert that value is a php float.
+ * @method LazyAssertion greaterOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit.
+ * @method LazyAssertion greaterThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit.
+ * @method LazyAssertion implementsInterface(string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface.
+ * @method LazyAssertion inArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice().
+ * @method LazyAssertion integer(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer.
+ * @method LazyAssertion integerish(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish.
+ * @method LazyAssertion interfaceExists(string|callable $message = null, string $propertyPath = null) Assert that the interface exists.
+ * @method LazyAssertion ip(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address.
+ * @method LazyAssertion ipv4(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address.
+ * @method LazyAssertion ipv6(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address.
+ * @method LazyAssertion isArray(string|callable $message = null, string $propertyPath = null) Assert that value is an array.
+ * @method LazyAssertion isArrayAccessible(string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object.
+ * @method LazyAssertion isCallable(string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable.
+ * @method LazyAssertion isCountable(string|callable $message = null, string $propertyPath = null) Assert that value is countable.
+ * @method LazyAssertion isInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name.
+ * @method LazyAssertion isJsonString(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string.
+ * @method LazyAssertion isObject(string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object.
+ * @method LazyAssertion isResource(string|callable $message = null, string $propertyPath = null) Assert that value is a resource.
+ * @method LazyAssertion isTraversable(string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object.
+ * @method LazyAssertion keyExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array.
+ * @method LazyAssertion keyIsset(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset().
+ * @method LazyAssertion keyNotExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array.
+ * @method LazyAssertion length(int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length.
+ * @method LazyAssertion lessOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit.
+ * @method LazyAssertion lessThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit.
+ * @method LazyAssertion max(mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit.
+ * @method LazyAssertion maxCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
+ * @method LazyAssertion maxLength(int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars.
+ * @method LazyAssertion methodExists(mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object.
+ * @method LazyAssertion min(mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit.
+ * @method LazyAssertion minCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
+ * @method LazyAssertion minLength(int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long.
+ * @method LazyAssertion noContent(string|callable $message = null, string $propertyPath = null) Assert that value is empty.
+ * @method LazyAssertion notBlank(string|callable $message = null, string $propertyPath = null) Assert that value is not blank.
+ * @method LazyAssertion notContains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars.
+ * @method LazyAssertion notEmpty(string|callable $message = null, string $propertyPath = null) Assert that value is not empty.
+ * @method LazyAssertion notEmptyKey(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty.
+ * @method LazyAssertion notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==).
+ * @method LazyAssertion notInArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices.
+ * @method LazyAssertion notIsInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name.
+ * @method LazyAssertion notNull(string|callable $message = null, string $propertyPath = null) Assert that value is not null.
+ * @method LazyAssertion notRegex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex.
+ * @method LazyAssertion notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===).
+ * @method LazyAssertion null(string|callable $message = null, string $propertyPath = null) Assert that value is null.
+ * @method LazyAssertion numeric(string|callable $message = null, string $propertyPath = null) Assert that value is numeric.
+ * @method LazyAssertion objectOrClass(string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists.
+ * @method LazyAssertion phpVersion(mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version.
+ * @method LazyAssertion propertiesExist(array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist.
+ * @method LazyAssertion propertyExists(string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists.
+ * @method LazyAssertion range(mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers.
+ * @method LazyAssertion readable(string|callable $message = null, string $propertyPath = null) Assert that the value is something readable.
+ * @method LazyAssertion regex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex.
+ * @method LazyAssertion same(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===).
+ * @method LazyAssertion satisfy(callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback.
+ * @method LazyAssertion scalar(string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar.
+ * @method LazyAssertion startsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars.
+ * @method LazyAssertion string(string|callable $message = null, string $propertyPath = null) Assert that value is a string.
+ * @method LazyAssertion subclassOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name.
+ * @method LazyAssertion true(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True.
+ * @method LazyAssertion uniqueValues(string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality).
+ * @method LazyAssertion url(string|callable $message = null, string $propertyPath = null) Assert that value is an URL.
+ * @method LazyAssertion uuid(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID.
+ * @method LazyAssertion version(string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions.
+ * @method LazyAssertion writeable(string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable.
+ * @method LazyAssertion all() Switch chain into validation mode for an array of values.
+ * @method LazyAssertion nullOr() Switch chain into mode allowing nulls, ignoring further assertions.
+ */
+class LazyAssertion
+{
+ private $currentChainFailed = false;
+ private $alwaysTryAll = false;
+ private $thisChainTryAll = false;
+ private $currentChain;
+ private $errors = [];
+
+ /** @var string The class to use as AssertionChain factory */
+ private $assertClass = Assert::class;
+
+ /** @var string|LazyAssertionException The class to use for exceptions */
+ private $exceptionClass = LazyAssertionException::class;
+
+ /**
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ *
+ * @return static
+ */
+ public function that($value, string $propertyPath = null, $defaultMessage = null)
+ {
+ $this->currentChainFailed = false;
+ $this->thisChainTryAll = false;
+ $assertClass = $this->assertClass;
+ $this->currentChain = $assertClass::that($value, $defaultMessage, $propertyPath);
+
+ return $this;
+ }
+
+ /**
+ * @return static
+ */
+ public function tryAll()
+ {
+ if (!$this->currentChain) {
+ $this->alwaysTryAll = true;
+ }
+
+ $this->thisChainTryAll = true;
+
+ return $this;
+ }
+
+ /**
+ * @param string $method
+ * @param array $args
+ *
+ * @return static
+ */
+ public function __call($method, $args)
+ {
+ if (false === $this->alwaysTryAll
+ && false === $this->thisChainTryAll
+ && true === $this->currentChainFailed
+ ) {
+ return $this;
+ }
+
+ try {
+ \call_user_func_array([$this->currentChain, $method], $args);
+ } catch (AssertionFailedException $e) {
+ $this->errors[] = $e;
+ $this->currentChainFailed = true;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @throws LazyAssertionException
+ */
+ public function verifyNow(): bool
+ {
+ if ($this->errors) {
+ throw \call_user_func([$this->exceptionClass, 'fromErrors'], $this->errors);
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return static
+ */
+ public function setAssertClass(string $className): LazyAssertion
+ {
+ if (Assert::class !== $className && !\is_subclass_of($className, Assert::class)) {
+ throw new LogicException($className.' is not (a subclass of) '.Assert::class);
+ }
+
+ $this->assertClass = $className;
+
+ return $this;
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return static
+ */
+ public function setExceptionClass(string $className): LazyAssertion
+ {
+ if (LazyAssertionException::class !== $className && !\is_subclass_of($className, LazyAssertionException::class)) {
+ throw new LogicException($className.' is not (a subclass of) '.LazyAssertionException::class);
+ }
+
+ $this->exceptionClass = $className;
+
+ return $this;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php
new file mode 100644
index 00000000..2ba59dd7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php
@@ -0,0 +1,53 @@
+getPropertyPath(), $error->getMessage());
+ }
+
+ return new static($message, $errors);
+ }
+
+ public function __construct($message, array $errors)
+ {
+ parent::__construct($message, 0, null, null);
+
+ $this->errors = $errors;
+ }
+
+ /**
+ * @return InvalidArgumentException[]
+ */
+ public function getErrorExceptions(): array
+ {
+ return $this->errors;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/functions.php b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/functions.php
new file mode 100644
index 00000000..1a4e84d9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/beberlei/assert/lib/Assert/functions.php
@@ -0,0 +1,72 @@
+notEmpty()->integer();
+ * \Assert\that($value)->nullOr()->string()->startsWith("Foo");
+ *
+ * The assertion chain can be stateful, that means be careful when you reuse
+ * it. You should never pass around the chain.
+ */
+function that($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+{
+ return Assert::that($value, $defaultMessage, $defaultPropertyPath);
+}
+
+/**
+ * Start validation on a set of values, returns {@link AssertionChain}.
+ *
+ * @param mixed $values
+ * @param string|callable|null $defaultMessage
+ * @param string $defaultPropertyPath
+ */
+function thatAll($values, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+{
+ return Assert::thatAll($values, $defaultMessage, $defaultPropertyPath);
+}
+
+/**
+ * Start validation and allow NULL, returns {@link AssertionChain}.
+ *
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ * @param string $defaultPropertyPath
+ *
+ * @deprecated In favour of Assert::thatNullOr($value, $defaultMessage = null, $defaultPropertyPath = null)
+ */
+function thatNullOr($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
+{
+ return Assert::thatNullOr($value, $defaultMessage, $defaultPropertyPath);
+}
+
+/**
+ * Create a lazy assertion object.
+ */
+function lazy(): LazyAssertion
+{
+ return Assert::lazy();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/brick/math/CHANGELOG.md
new file mode 100644
index 00000000..03c3d824
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/CHANGELOG.md
@@ -0,0 +1,415 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+## [0.9.3](https://github.com/brick/math/releases/tag/0.9.3) - 2021-08-15
+
+🚀 **Compatibility with PHP 8.1**
+
+- Support for custom object serialization; this removes a warning on PHP 8.1 due to the `Serializable` interface being deprecated (thanks @TRowbotham)
+
+## [0.9.2](https://github.com/brick/math/releases/tag/0.9.2) - 2021-01-20
+
+🐛 **Bug fix**
+
+- Incorrect results could be returned when using the BCMath calculator, with a default scale set with `bcscale()`, on PHP >= 7.2 (#55).
+
+## [0.9.1](https://github.com/brick/math/releases/tag/0.9.1) - 2020-08-19
+
+✨ New features
+
+- `BigInteger::not()` returns the bitwise `NOT` value
+
+🐛 **Bug fixes**
+
+- `BigInteger::toBytes()` could return an incorrect binary representation for some numbers
+- The bitwise operations `and()`, `or()`, `xor()` on `BigInteger` could return an incorrect result when the GMP extension is not available
+
+## [0.9.0](https://github.com/brick/math/releases/tag/0.9.0) - 2020-08-18
+
+👌 **Improvements**
+
+- `BigNumber::of()` now accepts `.123` and `123.` formats, both of which return a `BigDecimal`
+
+💥 **Breaking changes**
+
+- Deprecated method `BigInteger::powerMod()` has been removed - use `modPow()` instead
+- Deprecated method `BigInteger::parse()` has been removed - use `fromBase()` instead
+
+## [0.8.17](https://github.com/brick/math/releases/tag/0.8.17) - 2020-08-19
+
+🐛 **Bug fix**
+
+- `BigInteger::toBytes()` could return an incorrect binary representation for some numbers
+- The bitwise operations `and()`, `or()`, `xor()` on `BigInteger` could return an incorrect result when the GMP extension is not available
+
+## [0.8.16](https://github.com/brick/math/releases/tag/0.8.16) - 2020-08-18
+
+🚑 **Critical fix**
+
+- This version reintroduces the deprecated `BigInteger::parse()` method, that has been removed by mistake in version `0.8.9` and should have lasted for the whole `0.8` release cycle.
+
+✨ **New features**
+
+- `BigInteger::modInverse()` calculates a modular multiplicative inverse
+- `BigInteger::fromBytes()` creates a `BigInteger` from a byte string
+- `BigInteger::toBytes()` converts a `BigInteger` to a byte string
+- `BigInteger::randomBits()` creates a pseudo-random `BigInteger` of a given bit length
+- `BigInteger::randomRange()` creates a pseudo-random `BigInteger` between two bounds
+
+💩 **Deprecations**
+
+- `BigInteger::powerMod()` is now deprecated in favour of `modPow()`
+
+## [0.8.15](https://github.com/brick/math/releases/tag/0.8.15) - 2020-04-15
+
+🐛 **Fixes**
+
+- added missing `ext-json` requirement, due to `BigNumber` implementing `JsonSerializable`
+
+⚡️ **Optimizations**
+
+- additional optimization in `BigInteger::remainder()`
+
+## [0.8.14](https://github.com/brick/math/releases/tag/0.8.14) - 2020-02-18
+
+✨ **New features**
+
+- `BigInteger::getLowestSetBit()` returns the index of the rightmost one bit
+
+## [0.8.13](https://github.com/brick/math/releases/tag/0.8.13) - 2020-02-16
+
+✨ **New features**
+
+- `BigInteger::isEven()` tests whether the number is even
+- `BigInteger::isOdd()` tests whether the number is odd
+- `BigInteger::testBit()` tests if a bit is set
+- `BigInteger::getBitLength()` returns the number of bits in the minimal representation of the number
+
+## [0.8.12](https://github.com/brick/math/releases/tag/0.8.12) - 2020-02-03
+
+🛠️ **Maintenance release**
+
+Classes are now annotated for better static analysis with [psalm](https://psalm.dev/).
+
+This is a maintenance release: no bug fixes, no new features, no breaking changes.
+
+## [0.8.11](https://github.com/brick/math/releases/tag/0.8.11) - 2020-01-23
+
+✨ **New feature**
+
+`BigInteger::powerMod()` performs a power-with-modulo operation. Useful for crypto.
+
+## [0.8.10](https://github.com/brick/math/releases/tag/0.8.10) - 2020-01-21
+
+✨ **New feature**
+
+`BigInteger::mod()` returns the **modulo** of two numbers. The *modulo* differs from the *remainder* when the signs of the operands are different.
+
+## [0.8.9](https://github.com/brick/math/releases/tag/0.8.9) - 2020-01-08
+
+⚡️ **Performance improvements**
+
+A few additional optimizations in `BigInteger` and `BigDecimal` when one of the operands can be returned as is. Thanks to @tomtomsen in #24.
+
+## [0.8.8](https://github.com/brick/math/releases/tag/0.8.8) - 2019-04-25
+
+🐛 **Bug fixes**
+
+- `BigInteger::toBase()` could return an empty string for zero values (BCMath & Native calculators only, GMP calculator unaffected)
+
+✨ **New features**
+
+- `BigInteger::toArbitraryBase()` converts a number to an arbitrary base, using a custom alphabet
+- `BigInteger::fromArbitraryBase()` converts a string in an arbitrary base, using a custom alphabet, back to a number
+
+These methods can be used as the foundation to convert strings between different bases/alphabets, using BigInteger as an intermediate representation.
+
+💩 **Deprecations**
+
+- `BigInteger::parse()` is now deprecated in favour of `fromBase()`
+
+`BigInteger::fromBase()` works the same way as `parse()`, with 2 minor differences:
+
+- the `$base` parameter is required, it does not default to `10`
+- it throws a `NumberFormatException` instead of an `InvalidArgumentException` when the number is malformed
+
+## [0.8.7](https://github.com/brick/math/releases/tag/0.8.7) - 2019-04-20
+
+**Improvements**
+
+- Safer conversion from `float` when using custom locales
+- **Much faster** `NativeCalculator` implementation 🚀
+
+You can expect **at least a 3x performance improvement** for common arithmetic operations when using the library on systems without GMP or BCMath; it gets exponentially faster on multiplications with a high number of digits. This is due to calculations now being performed on whole blocks of digits (the block size depending on the platform, 32-bit or 64-bit) instead of digit-by-digit as before.
+
+## [0.8.6](https://github.com/brick/math/releases/tag/0.8.6) - 2019-04-11
+
+**New method**
+
+`BigNumber::sum()` returns the sum of one or more numbers.
+
+## [0.8.5](https://github.com/brick/math/releases/tag/0.8.5) - 2019-02-12
+
+**Bug fix**: `of()` factory methods could fail when passing a `float` in environments using a `LC_NUMERIC` locale with a decimal separator other than `'.'` (#20).
+
+Thanks @manowark 👍
+
+## [0.8.4](https://github.com/brick/math/releases/tag/0.8.4) - 2018-12-07
+
+**New method**
+
+`BigDecimal::sqrt()` calculates the square root of a decimal number, to a given scale.
+
+## [0.8.3](https://github.com/brick/math/releases/tag/0.8.3) - 2018-12-06
+
+**New method**
+
+`BigInteger::sqrt()` calculates the square root of a number (thanks @peter279k).
+
+**New exception**
+
+`NegativeNumberException` is thrown when calling `sqrt()` on a negative number.
+
+## [0.8.2](https://github.com/brick/math/releases/tag/0.8.2) - 2018-11-08
+
+**Performance update**
+
+- Further improvement of `toInt()` performance
+- `NativeCalculator` can now perform some multiplications more efficiently
+
+## [0.8.1](https://github.com/brick/math/releases/tag/0.8.1) - 2018-11-07
+
+Performance optimization of `toInt()` methods.
+
+## [0.8.0](https://github.com/brick/math/releases/tag/0.8.0) - 2018-10-13
+
+**Breaking changes**
+
+The following deprecated methods have been removed. Use the new method name instead:
+
+| Method removed | Replacement method |
+| --- | --- |
+| `BigDecimal::getIntegral()` | `BigDecimal::getIntegralPart()` |
+| `BigDecimal::getFraction()` | `BigDecimal::getFractionalPart()` |
+
+---
+
+**New features**
+
+`BigInteger` has been augmented with 5 new methods for bitwise operations:
+
+| New method | Description |
+| --- | --- |
+| `and()` | performs a bitwise `AND` operation on two numbers |
+| `or()` | performs a bitwise `OR` operation on two numbers |
+| `xor()` | performs a bitwise `XOR` operation on two numbers |
+| `shiftedLeft()` | returns the number shifted left by a number of bits |
+| `shiftedRight()` | returns the number shifted right by a number of bits |
+
+Thanks to @DASPRiD 👍
+
+## [0.7.3](https://github.com/brick/math/releases/tag/0.7.3) - 2018-08-20
+
+**New method:** `BigDecimal::hasNonZeroFractionalPart()`
+
+**Renamed/deprecated methods:**
+
+- `BigDecimal::getIntegral()` has been renamed to `getIntegralPart()` and is now deprecated
+- `BigDecimal::getFraction()` has been renamed to `getFractionalPart()` and is now deprecated
+
+## [0.7.2](https://github.com/brick/math/releases/tag/0.7.2) - 2018-07-21
+
+**Performance update**
+
+`BigInteger::parse()` and `toBase()` now use GMP's built-in base conversion features when available.
+
+## [0.7.1](https://github.com/brick/math/releases/tag/0.7.1) - 2018-03-01
+
+This is a maintenance release, no code has been changed.
+
+- When installed with `--no-dev`, the autoloader does not autoload tests anymore
+- Tests and other files unnecessary for production are excluded from the dist package
+
+This will help make installations more compact.
+
+## [0.7.0](https://github.com/brick/math/releases/tag/0.7.0) - 2017-10-02
+
+Methods renamed:
+
+- `BigNumber:sign()` has been renamed to `getSign()`
+- `BigDecimal::unscaledValue()` has been renamed to `getUnscaledValue()`
+- `BigDecimal::scale()` has been renamed to `getScale()`
+- `BigDecimal::integral()` has been renamed to `getIntegral()`
+- `BigDecimal::fraction()` has been renamed to `getFraction()`
+- `BigRational::numerator()` has been renamed to `getNumerator()`
+- `BigRational::denominator()` has been renamed to `getDenominator()`
+
+Classes renamed:
+
+- `ArithmeticException` has been renamed to `MathException`
+
+## [0.6.2](https://github.com/brick/math/releases/tag/0.6.2) - 2017-10-02
+
+The base class for all exceptions is now `MathException`.
+`ArithmeticException` has been deprecated, and will be removed in 0.7.0.
+
+## [0.6.1](https://github.com/brick/math/releases/tag/0.6.1) - 2017-10-02
+
+A number of methods have been renamed:
+
+- `BigNumber:sign()` is deprecated; use `getSign()` instead
+- `BigDecimal::unscaledValue()` is deprecated; use `getUnscaledValue()` instead
+- `BigDecimal::scale()` is deprecated; use `getScale()` instead
+- `BigDecimal::integral()` is deprecated; use `getIntegral()` instead
+- `BigDecimal::fraction()` is deprecated; use `getFraction()` instead
+- `BigRational::numerator()` is deprecated; use `getNumerator()` instead
+- `BigRational::denominator()` is deprecated; use `getDenominator()` instead
+
+The old methods will be removed in version 0.7.0.
+
+## [0.6.0](https://github.com/brick/math/releases/tag/0.6.0) - 2017-08-25
+
+- Minimum PHP version is now [7.1](https://gophp71.org/); for PHP 5.6 and PHP 7.0 support, use version `0.5`
+- Deprecated method `BigDecimal::withScale()` has been removed; use `toScale()` instead
+- Method `BigNumber::toInteger()` has been renamed to `toInt()`
+
+## [0.5.4](https://github.com/brick/math/releases/tag/0.5.4) - 2016-10-17
+
+`BigNumber` classes now implement [JsonSerializable](http://php.net/manual/en/class.jsonserializable.php).
+The JSON output is always a string.
+
+## [0.5.3](https://github.com/brick/math/releases/tag/0.5.3) - 2016-03-31
+
+This is a bugfix release. Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6.
+
+## [0.5.2](https://github.com/brick/math/releases/tag/0.5.2) - 2015-08-06
+
+The `$scale` parameter of `BigDecimal::dividedBy()` is now optional again.
+
+## [0.5.1](https://github.com/brick/math/releases/tag/0.5.1) - 2015-07-05
+
+**New method: `BigNumber::toScale()`**
+
+This allows to convert any `BigNumber` to a `BigDecimal` with a given scale, using rounding if necessary.
+
+## [0.5.0](https://github.com/brick/math/releases/tag/0.5.0) - 2015-07-04
+
+**New features**
+- Common `BigNumber` interface for all classes, with the following methods:
+ - `sign()` and derived methods (`isZero()`, `isPositive()`, ...)
+ - `compareTo()` and derived methods (`isEqualTo()`, `isGreaterThan()`, ...) that work across different `BigNumber` types
+ - `toBigInteger()`, `toBigDecimal()`, `toBigRational`() conversion methods
+ - `toInteger()` and `toFloat()` conversion methods to native types
+- Unified `of()` behaviour: every class now accepts any type of number, provided that it can be safely converted to the current type
+- New method: `BigDecimal::exactlyDividedBy()`; this method automatically computes the scale of the result, provided that the division yields a finite number of digits
+- New methods: `BigRational::quotient()` and `remainder()`
+- Fine-grained exceptions: `DivisionByZeroException`, `RoundingNecessaryException`, `NumberFormatException`
+- Factory methods `zero()`, `one()` and `ten()` available in all classes
+- Rounding mode reintroduced in `BigInteger::dividedBy()`
+
+This release also comes with many performance improvements.
+
+---
+
+**Breaking changes**
+- `BigInteger`:
+ - `getSign()` is renamed to `sign()`
+ - `toString()` is renamed to `toBase()`
+ - `BigInteger::dividedBy()` now throws an exception by default if the remainder is not zero; use `quotient()` to get the previous behaviour
+- `BigDecimal`:
+ - `getSign()` is renamed to `sign()`
+ - `getUnscaledValue()` is renamed to `unscaledValue()`
+ - `getScale()` is renamed to `scale()`
+ - `getIntegral()` is renamed to `integral()`
+ - `getFraction()` is renamed to `fraction()`
+ - `divideAndRemainder()` is renamed to `quotientAndRemainder()`
+ - `dividedBy()` now takes a **mandatory** `$scale` parameter **before** the rounding mode
+ - `toBigInteger()` does not accept a `$roundingMode` parameter any more
+ - `toBigRational()` does not simplify the fraction any more; explicitly add `->simplified()` to get the previous behaviour
+- `BigRational`:
+ - `getSign()` is renamed to `sign()`
+ - `getNumerator()` is renamed to `numerator()`
+ - `getDenominator()` is renamed to `denominator()`
+ - `of()` is renamed to `nd()`, while `parse()` is renamed to `of()`
+- Miscellaneous:
+ - `ArithmeticException` is moved to an `Exception\` sub-namespace
+ - `of()` factory methods now throw `NumberFormatException` instead of `InvalidArgumentException`
+
+## [0.4.3](https://github.com/brick/math/releases/tag/0.4.3) - 2016-03-31
+
+Backport of two bug fixes from the 0.5 branch:
+- `BigInteger::parse()` did not always throw `InvalidArgumentException` as expected
+- Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6.
+
+## [0.4.2](https://github.com/brick/math/releases/tag/0.4.2) - 2015-06-16
+
+New method: `BigDecimal::stripTrailingZeros()`
+
+## [0.4.1](https://github.com/brick/math/releases/tag/0.4.1) - 2015-06-12
+
+Introducing a `BigRational` class, to perform calculations on fractions of any size.
+
+## [0.4.0](https://github.com/brick/math/releases/tag/0.4.0) - 2015-06-12
+
+Rounding modes have been removed from `BigInteger`, and are now a concept specific to `BigDecimal`.
+
+`BigInteger::dividedBy()` now always returns the quotient of the division.
+
+## [0.3.5](https://github.com/brick/math/releases/tag/0.3.5) - 2016-03-31
+
+Backport of two bug fixes from the 0.5 branch:
+
+- `BigInteger::parse()` did not always throw `InvalidArgumentException` as expected
+- Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6.
+
+## [0.3.4](https://github.com/brick/math/releases/tag/0.3.4) - 2015-06-11
+
+New methods:
+- `BigInteger::remainder()` returns the remainder of a division only
+- `BigInteger::gcd()` returns the greatest common divisor of two numbers
+
+## [0.3.3](https://github.com/brick/math/releases/tag/0.3.3) - 2015-06-07
+
+Fix `toString()` not handling negative numbers.
+
+## [0.3.2](https://github.com/brick/math/releases/tag/0.3.2) - 2015-06-07
+
+`BigInteger` and `BigDecimal` now have a `getSign()` method that returns:
+- `-1` if the number is negative
+- `0` if the number is zero
+- `1` if the number is positive
+
+## [0.3.1](https://github.com/brick/math/releases/tag/0.3.1) - 2015-06-05
+
+Minor performance improvements
+
+## [0.3.0](https://github.com/brick/math/releases/tag/0.3.0) - 2015-06-04
+
+The `$roundingMode` and `$scale` parameters have been swapped in `BigDecimal::dividedBy()`.
+
+## [0.2.2](https://github.com/brick/math/releases/tag/0.2.2) - 2015-06-04
+
+Stronger immutability guarantee for `BigInteger` and `BigDecimal`.
+
+So far, it would have been possible to break immutability of these classes by calling the `unserialize()` internal function. This release fixes that.
+
+## [0.2.1](https://github.com/brick/math/releases/tag/0.2.1) - 2015-06-02
+
+Added `BigDecimal::divideAndRemainder()`
+
+## [0.2.0](https://github.com/brick/math/releases/tag/0.2.0) - 2015-05-22
+
+- `min()` and `max()` do not accept an `array` any more, but a variable number of parameters
+- **minimum PHP version is now 5.6**
+- continuous integration with PHP 7
+
+## [0.1.1](https://github.com/brick/math/releases/tag/0.1.1) - 2014-09-01
+
+- Added `BigInteger::power()`
+- Added HHVM support
+
+## [0.1.0](https://github.com/brick/math/releases/tag/0.1.0) - 2014-08-31
+
+First beta release.
+
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/LICENSE b/wp-content/plugins/wp-webauthn/vendor/brick/math/LICENSE
new file mode 100644
index 00000000..f9b724f0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-present Benjamin Morel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/SECURITY.md b/wp-content/plugins/wp-webauthn/vendor/brick/math/SECURITY.md
new file mode 100644
index 00000000..cc8289bb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/SECURITY.md
@@ -0,0 +1,17 @@
+# Security Policy
+
+## Supported Versions
+
+Only the last two release streams are supported.
+
+| Version | Supported |
+| ------- | ------------------ |
+| 0.9.x | :white_check_mark: |
+| 0.8.x | :white_check_mark: |
+| < 0.8 | :x: |
+
+## Reporting a Vulnerability
+
+To report a security vulnerability, please use the
+[Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/composer.json b/wp-content/plugins/wp-webauthn/vendor/brick/math/composer.json
new file mode 100644
index 00000000..ec196632
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/composer.json
@@ -0,0 +1,35 @@
+{
+ "name": "brick/math",
+ "description": "Arbitrary-precision arithmetic library",
+ "type": "library",
+ "keywords": [
+ "Brick",
+ "Math",
+ "Arbitrary-precision",
+ "Arithmetic",
+ "BigInteger",
+ "BigDecimal",
+ "BigRational",
+ "Bignum"
+ ],
+ "license": "MIT",
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "ext-json": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+ "php-coveralls/php-coveralls": "^2.2",
+ "vimeo/psalm": "4.9.2"
+ },
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Brick\\Math\\Tests\\": "tests/"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigDecimal.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigDecimal.php
new file mode 100644
index 00000000..78246500
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigDecimal.php
@@ -0,0 +1,895 @@
+value = $value;
+ $this->scale = $scale;
+ }
+
+ /**
+ * Creates a BigDecimal of the given value.
+ *
+ * @param BigNumber|int|float|string $value
+ *
+ * @return BigDecimal
+ *
+ * @throws MathException If the value cannot be converted to a BigDecimal.
+ *
+ * @psalm-pure
+ */
+ public static function of($value) : BigNumber
+ {
+ return parent::of($value)->toBigDecimal();
+ }
+
+ /**
+ * Creates a BigDecimal from an unscaled value and a scale.
+ *
+ * Example: `(12345, 3)` will result in the BigDecimal `12.345`.
+ *
+ * @param BigNumber|int|float|string $value The unscaled value. Must be convertible to a BigInteger.
+ * @param int $scale The scale of the number, positive or zero.
+ *
+ * @return BigDecimal
+ *
+ * @throws \InvalidArgumentException If the scale is negative.
+ *
+ * @psalm-pure
+ */
+ public static function ofUnscaledValue($value, int $scale = 0) : BigDecimal
+ {
+ if ($scale < 0) {
+ throw new \InvalidArgumentException('The scale cannot be negative.');
+ }
+
+ return new BigDecimal((string) BigInteger::of($value), $scale);
+ }
+
+ /**
+ * Returns a BigDecimal representing zero, with a scale of zero.
+ *
+ * @return BigDecimal
+ *
+ * @psalm-pure
+ */
+ public static function zero() : BigDecimal
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigDecimal|null $zero
+ */
+ static $zero;
+
+ if ($zero === null) {
+ $zero = new BigDecimal('0');
+ }
+
+ return $zero;
+ }
+
+ /**
+ * Returns a BigDecimal representing one, with a scale of zero.
+ *
+ * @return BigDecimal
+ *
+ * @psalm-pure
+ */
+ public static function one() : BigDecimal
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigDecimal|null $one
+ */
+ static $one;
+
+ if ($one === null) {
+ $one = new BigDecimal('1');
+ }
+
+ return $one;
+ }
+
+ /**
+ * Returns a BigDecimal representing ten, with a scale of zero.
+ *
+ * @return BigDecimal
+ *
+ * @psalm-pure
+ */
+ public static function ten() : BigDecimal
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigDecimal|null $ten
+ */
+ static $ten;
+
+ if ($ten === null) {
+ $ten = new BigDecimal('10');
+ }
+
+ return $ten;
+ }
+
+ /**
+ * Returns the sum of this number and the given one.
+ *
+ * The result has a scale of `max($this->scale, $that->scale)`.
+ *
+ * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The result.
+ *
+ * @throws MathException If the number is not valid, or is not convertible to a BigDecimal.
+ */
+ public function plus($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->value === '0' && $that->scale <= $this->scale) {
+ return $this;
+ }
+
+ if ($this->value === '0' && $this->scale <= $that->scale) {
+ return $that;
+ }
+
+ [$a, $b] = $this->scaleValues($this, $that);
+
+ $value = Calculator::get()->add($a, $b);
+ $scale = $this->scale > $that->scale ? $this->scale : $that->scale;
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns the difference of this number and the given one.
+ *
+ * The result has a scale of `max($this->scale, $that->scale)`.
+ *
+ * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The result.
+ *
+ * @throws MathException If the number is not valid, or is not convertible to a BigDecimal.
+ */
+ public function minus($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->value === '0' && $that->scale <= $this->scale) {
+ return $this;
+ }
+
+ [$a, $b] = $this->scaleValues($this, $that);
+
+ $value = Calculator::get()->sub($a, $b);
+ $scale = $this->scale > $that->scale ? $this->scale : $that->scale;
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns the product of this number and the given one.
+ *
+ * The result has a scale of `$this->scale + $that->scale`.
+ *
+ * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The result.
+ *
+ * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigDecimal.
+ */
+ public function multipliedBy($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->value === '1' && $that->scale === 0) {
+ return $this;
+ }
+
+ if ($this->value === '1' && $this->scale === 0) {
+ return $that;
+ }
+
+ $value = Calculator::get()->mul($this->value, $that->value);
+ $scale = $this->scale + $that->scale;
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns the result of the division of this number by the given one, at the given scale.
+ *
+ * @param BigNumber|int|float|string $that The divisor.
+ * @param int|null $scale The desired scale, or null to use the scale of this number.
+ * @param int $roundingMode An optional rounding mode.
+ *
+ * @return BigDecimal
+ *
+ * @throws \InvalidArgumentException If the scale or rounding mode is invalid.
+ * @throws MathException If the number is invalid, is zero, or rounding was necessary.
+ */
+ public function dividedBy($that, ?int $scale = null, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->isZero()) {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ if ($scale === null) {
+ $scale = $this->scale;
+ } elseif ($scale < 0) {
+ throw new \InvalidArgumentException('Scale cannot be negative.');
+ }
+
+ if ($that->value === '1' && $that->scale === 0 && $scale === $this->scale) {
+ return $this;
+ }
+
+ $p = $this->valueWithMinScale($that->scale + $scale);
+ $q = $that->valueWithMinScale($this->scale - $scale);
+
+ $result = Calculator::get()->divRound($p, $q, $roundingMode);
+
+ return new BigDecimal($result, $scale);
+ }
+
+ /**
+ * Returns the exact result of the division of this number by the given one.
+ *
+ * The scale of the result is automatically calculated to fit all the fraction digits.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The result.
+ *
+ * @throws MathException If the divisor is not a valid number, is not convertible to a BigDecimal, is zero,
+ * or the result yields an infinite number of digits.
+ */
+ public function exactlyDividedBy($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ [, $b] = $this->scaleValues($this, $that);
+
+ $d = \rtrim($b, '0');
+ $scale = \strlen($b) - \strlen($d);
+
+ $calculator = Calculator::get();
+
+ foreach ([5, 2] as $prime) {
+ for (;;) {
+ $lastDigit = (int) $d[-1];
+
+ if ($lastDigit % $prime !== 0) {
+ break;
+ }
+
+ $d = $calculator->divQ($d, (string) $prime);
+ $scale++;
+ }
+ }
+
+ return $this->dividedBy($that, $scale)->stripTrailingZeros();
+ }
+
+ /**
+ * Returns this number exponentiated to the given value.
+ *
+ * The result has a scale of `$this->scale * $exponent`.
+ *
+ * @param int $exponent The exponent.
+ *
+ * @return BigDecimal The result.
+ *
+ * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000.
+ */
+ public function power(int $exponent) : BigDecimal
+ {
+ if ($exponent === 0) {
+ return BigDecimal::one();
+ }
+
+ if ($exponent === 1) {
+ return $this;
+ }
+
+ if ($exponent < 0 || $exponent > Calculator::MAX_POWER) {
+ throw new \InvalidArgumentException(\sprintf(
+ 'The exponent %d is not in the range 0 to %d.',
+ $exponent,
+ Calculator::MAX_POWER
+ ));
+ }
+
+ return new BigDecimal(Calculator::get()->pow($this->value, $exponent), $this->scale * $exponent);
+ }
+
+ /**
+ * Returns the quotient of the division of this number by this given one.
+ *
+ * The quotient has a scale of `0`.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The quotient.
+ *
+ * @throws MathException If the divisor is not a valid decimal number, or is zero.
+ */
+ public function quotient($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->isZero()) {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $p = $this->valueWithMinScale($that->scale);
+ $q = $that->valueWithMinScale($this->scale);
+
+ $quotient = Calculator::get()->divQ($p, $q);
+
+ return new BigDecimal($quotient, 0);
+ }
+
+ /**
+ * Returns the remainder of the division of this number by this given one.
+ *
+ * The remainder has a scale of `max($this->scale, $that->scale)`.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal The remainder.
+ *
+ * @throws MathException If the divisor is not a valid decimal number, or is zero.
+ */
+ public function remainder($that) : BigDecimal
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->isZero()) {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $p = $this->valueWithMinScale($that->scale);
+ $q = $that->valueWithMinScale($this->scale);
+
+ $remainder = Calculator::get()->divR($p, $q);
+
+ $scale = $this->scale > $that->scale ? $this->scale : $that->scale;
+
+ return new BigDecimal($remainder, $scale);
+ }
+
+ /**
+ * Returns the quotient and remainder of the division of this number by the given one.
+ *
+ * The quotient has a scale of `0`, and the remainder has a scale of `max($this->scale, $that->scale)`.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal.
+ *
+ * @return BigDecimal[] An array containing the quotient and the remainder.
+ *
+ * @throws MathException If the divisor is not a valid decimal number, or is zero.
+ */
+ public function quotientAndRemainder($that) : array
+ {
+ $that = BigDecimal::of($that);
+
+ if ($that->isZero()) {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $p = $this->valueWithMinScale($that->scale);
+ $q = $that->valueWithMinScale($this->scale);
+
+ [$quotient, $remainder] = Calculator::get()->divQR($p, $q);
+
+ $scale = $this->scale > $that->scale ? $this->scale : $that->scale;
+
+ $quotient = new BigDecimal($quotient, 0);
+ $remainder = new BigDecimal($remainder, $scale);
+
+ return [$quotient, $remainder];
+ }
+
+ /**
+ * Returns the square root of this number, rounded down to the given number of decimals.
+ *
+ * @param int $scale
+ *
+ * @return BigDecimal
+ *
+ * @throws \InvalidArgumentException If the scale is negative.
+ * @throws NegativeNumberException If this number is negative.
+ */
+ public function sqrt(int $scale) : BigDecimal
+ {
+ if ($scale < 0) {
+ throw new \InvalidArgumentException('Scale cannot be negative.');
+ }
+
+ if ($this->value === '0') {
+ return new BigDecimal('0', $scale);
+ }
+
+ if ($this->value[0] === '-') {
+ throw new NegativeNumberException('Cannot calculate the square root of a negative number.');
+ }
+
+ $value = $this->value;
+ $addDigits = 2 * $scale - $this->scale;
+
+ if ($addDigits > 0) {
+ // add zeros
+ $value .= \str_repeat('0', $addDigits);
+ } elseif ($addDigits < 0) {
+ // trim digits
+ if (-$addDigits >= \strlen($this->value)) {
+ // requesting a scale too low, will always yield a zero result
+ return new BigDecimal('0', $scale);
+ }
+
+ $value = \substr($value, 0, $addDigits);
+ }
+
+ $value = Calculator::get()->sqrt($value);
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns a copy of this BigDecimal with the decimal point moved $n places to the left.
+ *
+ * @param int $n
+ *
+ * @return BigDecimal
+ */
+ public function withPointMovedLeft(int $n) : BigDecimal
+ {
+ if ($n === 0) {
+ return $this;
+ }
+
+ if ($n < 0) {
+ return $this->withPointMovedRight(-$n);
+ }
+
+ return new BigDecimal($this->value, $this->scale + $n);
+ }
+
+ /**
+ * Returns a copy of this BigDecimal with the decimal point moved $n places to the right.
+ *
+ * @param int $n
+ *
+ * @return BigDecimal
+ */
+ public function withPointMovedRight(int $n) : BigDecimal
+ {
+ if ($n === 0) {
+ return $this;
+ }
+
+ if ($n < 0) {
+ return $this->withPointMovedLeft(-$n);
+ }
+
+ $value = $this->value;
+ $scale = $this->scale - $n;
+
+ if ($scale < 0) {
+ if ($value !== '0') {
+ $value .= \str_repeat('0', -$scale);
+ }
+ $scale = 0;
+ }
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns a copy of this BigDecimal with any trailing zeros removed from the fractional part.
+ *
+ * @return BigDecimal
+ */
+ public function stripTrailingZeros() : BigDecimal
+ {
+ if ($this->scale === 0) {
+ return $this;
+ }
+
+ $trimmedValue = \rtrim($this->value, '0');
+
+ if ($trimmedValue === '') {
+ return BigDecimal::zero();
+ }
+
+ $trimmableZeros = \strlen($this->value) - \strlen($trimmedValue);
+
+ if ($trimmableZeros === 0) {
+ return $this;
+ }
+
+ if ($trimmableZeros > $this->scale) {
+ $trimmableZeros = $this->scale;
+ }
+
+ $value = \substr($this->value, 0, -$trimmableZeros);
+ $scale = $this->scale - $trimmableZeros;
+
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Returns the absolute value of this number.
+ *
+ * @return BigDecimal
+ */
+ public function abs() : BigDecimal
+ {
+ return $this->isNegative() ? $this->negated() : $this;
+ }
+
+ /**
+ * Returns the negated value of this number.
+ *
+ * @return BigDecimal
+ */
+ public function negated() : BigDecimal
+ {
+ return new BigDecimal(Calculator::get()->neg($this->value), $this->scale);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function compareTo($that) : int
+ {
+ $that = BigNumber::of($that);
+
+ if ($that instanceof BigInteger) {
+ $that = $that->toBigDecimal();
+ }
+
+ if ($that instanceof BigDecimal) {
+ [$a, $b] = $this->scaleValues($this, $that);
+
+ return Calculator::get()->cmp($a, $b);
+ }
+
+ return - $that->compareTo($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getSign() : int
+ {
+ return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1);
+ }
+
+ /**
+ * @return BigInteger
+ */
+ public function getUnscaledValue() : BigInteger
+ {
+ return BigInteger::create($this->value);
+ }
+
+ /**
+ * @return int
+ */
+ public function getScale() : int
+ {
+ return $this->scale;
+ }
+
+ /**
+ * Returns a string representing the integral part of this decimal number.
+ *
+ * Example: `-123.456` => `-123`.
+ *
+ * @return string
+ */
+ public function getIntegralPart() : string
+ {
+ if ($this->scale === 0) {
+ return $this->value;
+ }
+
+ $value = $this->getUnscaledValueWithLeadingZeros();
+
+ return \substr($value, 0, -$this->scale);
+ }
+
+ /**
+ * Returns a string representing the fractional part of this decimal number.
+ *
+ * If the scale is zero, an empty string is returned.
+ *
+ * Examples: `-123.456` => '456', `123` => ''.
+ *
+ * @return string
+ */
+ public function getFractionalPart() : string
+ {
+ if ($this->scale === 0) {
+ return '';
+ }
+
+ $value = $this->getUnscaledValueWithLeadingZeros();
+
+ return \substr($value, -$this->scale);
+ }
+
+ /**
+ * Returns whether this decimal number has a non-zero fractional part.
+ *
+ * @return bool
+ */
+ public function hasNonZeroFractionalPart() : bool
+ {
+ return $this->getFractionalPart() !== \str_repeat('0', $this->scale);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigInteger() : BigInteger
+ {
+ $zeroScaleDecimal = $this->scale === 0 ? $this : $this->dividedBy(1, 0);
+
+ return BigInteger::create($zeroScaleDecimal->value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigDecimal() : BigDecimal
+ {
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigRational() : BigRational
+ {
+ $numerator = BigInteger::create($this->value);
+ $denominator = BigInteger::create('1' . \str_repeat('0', $this->scale));
+
+ return BigRational::create($numerator, $denominator, false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
+ {
+ if ($scale === $this->scale) {
+ return $this;
+ }
+
+ return $this->dividedBy(BigDecimal::one(), $scale, $roundingMode);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toInt() : int
+ {
+ return $this->toBigInteger()->toInt();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toFloat() : float
+ {
+ return (float) (string) $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString() : string
+ {
+ if ($this->scale === 0) {
+ return $this->value;
+ }
+
+ $value = $this->getUnscaledValueWithLeadingZeros();
+
+ return \substr($value, 0, -$this->scale) . '.' . \substr($value, -$this->scale);
+ }
+
+ /**
+ * This method is required for serializing the object and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return array{value: string, scale: int}
+ */
+ public function __serialize(): array
+ {
+ return ['value' => $this->value, 'scale' => $this->scale];
+ }
+
+ /**
+ * This method is only here to allow unserializing the object and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param array{value: string, scale: int} $data
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function __unserialize(array $data): void
+ {
+ if (isset($this->value)) {
+ throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
+ }
+
+ $this->value = $data['value'];
+ $this->scale = $data['scale'];
+ }
+
+ /**
+ * This method is required by interface Serializable and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return string
+ */
+ public function serialize() : string
+ {
+ return $this->value . ':' . $this->scale;
+ }
+
+ /**
+ * This method is only here to implement interface Serializable and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param string $value
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function unserialize($value) : void
+ {
+ if (isset($this->value)) {
+ throw new \LogicException('unserialize() is an internal function, it must not be called directly.');
+ }
+
+ [$value, $scale] = \explode(':', $value);
+
+ $this->value = $value;
+ $this->scale = (int) $scale;
+ }
+
+ /**
+ * Puts the internal values of the given decimal numbers on the same scale.
+ *
+ * @param BigDecimal $x The first decimal number.
+ * @param BigDecimal $y The second decimal number.
+ *
+ * @return array{string, string} The scaled integer values of $x and $y.
+ */
+ private function scaleValues(BigDecimal $x, BigDecimal $y) : array
+ {
+ $a = $x->value;
+ $b = $y->value;
+
+ if ($b !== '0' && $x->scale > $y->scale) {
+ $b .= \str_repeat('0', $x->scale - $y->scale);
+ } elseif ($a !== '0' && $x->scale < $y->scale) {
+ $a .= \str_repeat('0', $y->scale - $x->scale);
+ }
+
+ return [$a, $b];
+ }
+
+ /**
+ * @param int $scale
+ *
+ * @return string
+ */
+ private function valueWithMinScale(int $scale) : string
+ {
+ $value = $this->value;
+
+ if ($this->value !== '0' && $scale > $this->scale) {
+ $value .= \str_repeat('0', $scale - $this->scale);
+ }
+
+ return $value;
+ }
+
+ /**
+ * Adds leading zeros if necessary to the unscaled value to represent the full decimal number.
+ *
+ * @return string
+ */
+ private function getUnscaledValueWithLeadingZeros() : string
+ {
+ $value = $this->value;
+ $targetLength = $this->scale + 1;
+ $negative = ($value[0] === '-');
+ $length = \strlen($value);
+
+ if ($negative) {
+ $length--;
+ }
+
+ if ($length >= $targetLength) {
+ return $this->value;
+ }
+
+ if ($negative) {
+ $value = \substr($value, 1);
+ }
+
+ $value = \str_pad($value, $targetLength, '0', STR_PAD_LEFT);
+
+ if ($negative) {
+ $value = '-' . $value;
+ }
+
+ return $value;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigInteger.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigInteger.php
new file mode 100644
index 00000000..f213fbed
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigInteger.php
@@ -0,0 +1,1184 @@
+value = $value;
+ }
+
+ /**
+ * Creates a BigInteger of the given value.
+ *
+ * @param BigNumber|int|float|string $value
+ *
+ * @return BigInteger
+ *
+ * @throws MathException If the value cannot be converted to a BigInteger.
+ *
+ * @psalm-pure
+ */
+ public static function of($value) : BigNumber
+ {
+ return parent::of($value)->toBigInteger();
+ }
+
+ /**
+ * Creates a number from a string in a given base.
+ *
+ * The string can optionally be prefixed with the `+` or `-` sign.
+ *
+ * Bases greater than 36 are not supported by this method, as there is no clear consensus on which of the lowercase
+ * or uppercase characters should come first. Instead, this method accepts any base up to 36, and does not
+ * differentiate lowercase and uppercase characters, which are considered equal.
+ *
+ * For bases greater than 36, and/or custom alphabets, use the fromArbitraryBase() method.
+ *
+ * @param string $number The number to convert, in the given base.
+ * @param int $base The base of the number, between 2 and 36.
+ *
+ * @return BigInteger
+ *
+ * @throws NumberFormatException If the number is empty, or contains invalid chars for the given base.
+ * @throws \InvalidArgumentException If the base is out of range.
+ *
+ * @psalm-pure
+ */
+ public static function fromBase(string $number, int $base) : BigInteger
+ {
+ if ($number === '') {
+ throw new NumberFormatException('The number cannot be empty.');
+ }
+
+ if ($base < 2 || $base > 36) {
+ throw new \InvalidArgumentException(\sprintf('Base %d is not in range 2 to 36.', $base));
+ }
+
+ if ($number[0] === '-') {
+ $sign = '-';
+ $number = \substr($number, 1);
+ } elseif ($number[0] === '+') {
+ $sign = '';
+ $number = \substr($number, 1);
+ } else {
+ $sign = '';
+ }
+
+ if ($number === '') {
+ throw new NumberFormatException('The number cannot be empty.');
+ }
+
+ $number = \ltrim($number, '0');
+
+ if ($number === '') {
+ // The result will be the same in any base, avoid further calculation.
+ return BigInteger::zero();
+ }
+
+ if ($number === '1') {
+ // The result will be the same in any base, avoid further calculation.
+ return new BigInteger($sign . '1');
+ }
+
+ $pattern = '/[^' . \substr(Calculator::ALPHABET, 0, $base) . ']/';
+
+ if (\preg_match($pattern, \strtolower($number), $matches) === 1) {
+ throw new NumberFormatException(\sprintf('"%s" is not a valid character in base %d.', $matches[0], $base));
+ }
+
+ if ($base === 10) {
+ // The number is usable as is, avoid further calculation.
+ return new BigInteger($sign . $number);
+ }
+
+ $result = Calculator::get()->fromBase($number, $base);
+
+ return new BigInteger($sign . $result);
+ }
+
+ /**
+ * Parses a string containing an integer in an arbitrary base, using a custom alphabet.
+ *
+ * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers.
+ *
+ * @param string $number The number to parse.
+ * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8.
+ *
+ * @return BigInteger
+ *
+ * @throws NumberFormatException If the given number is empty or contains invalid chars for the given alphabet.
+ * @throws \InvalidArgumentException If the alphabet does not contain at least 2 chars.
+ *
+ * @psalm-pure
+ */
+ public static function fromArbitraryBase(string $number, string $alphabet) : BigInteger
+ {
+ if ($number === '') {
+ throw new NumberFormatException('The number cannot be empty.');
+ }
+
+ $base = \strlen($alphabet);
+
+ if ($base < 2) {
+ throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.');
+ }
+
+ $pattern = '/[^' . \preg_quote($alphabet, '/') . ']/';
+
+ if (\preg_match($pattern, $number, $matches) === 1) {
+ throw NumberFormatException::charNotInAlphabet($matches[0]);
+ }
+
+ $number = Calculator::get()->fromArbitraryBase($number, $alphabet, $base);
+
+ return new BigInteger($number);
+ }
+
+ /**
+ * Translates a string of bytes containing the binary representation of a BigInteger into a BigInteger.
+ *
+ * The input string is assumed to be in big-endian byte-order: the most significant byte is in the zeroth element.
+ *
+ * If `$signed` is true, the input is assumed to be in two's-complement representation, and the leading bit is
+ * interpreted as a sign bit. If `$signed` is false, the input is interpreted as an unsigned number, and the
+ * resulting BigInteger will always be positive or zero.
+ *
+ * This method can be used to retrieve a number exported by `toBytes()`, as long as the `$signed` flags match.
+ *
+ * @param string $value The byte string.
+ * @param bool $signed Whether to interpret as a signed number in two's-complement representation with a leading
+ * sign bit.
+ *
+ * @return BigInteger
+ *
+ * @throws NumberFormatException If the string is empty.
+ */
+ public static function fromBytes(string $value, bool $signed = true) : BigInteger
+ {
+ if ($value === '') {
+ throw new NumberFormatException('The byte string must not be empty.');
+ }
+
+ $twosComplement = false;
+
+ if ($signed) {
+ $x = \ord($value[0]);
+
+ if (($twosComplement = ($x >= 0x80))) {
+ $value = ~$value;
+ }
+ }
+
+ $number = self::fromBase(\bin2hex($value), 16);
+
+ if ($twosComplement) {
+ return $number->plus(1)->negated();
+ }
+
+ return $number;
+ }
+
+ /**
+ * Generates a pseudo-random number in the range 0 to 2^numBits - 1.
+ *
+ * Using the default random bytes generator, this method is suitable for cryptographic use.
+ *
+ * @psalm-param callable(int): string $randomBytesGenerator
+ *
+ * @param int $numBits The number of bits.
+ * @param callable|null $randomBytesGenerator A function that accepts a number of bytes as an integer, and returns a
+ * string of random bytes of the given length. Defaults to the
+ * `random_bytes()` function.
+ *
+ * @return BigInteger
+ *
+ * @throws \InvalidArgumentException If $numBits is negative.
+ */
+ public static function randomBits(int $numBits, ?callable $randomBytesGenerator = null) : BigInteger
+ {
+ if ($numBits < 0) {
+ throw new \InvalidArgumentException('The number of bits cannot be negative.');
+ }
+
+ if ($numBits === 0) {
+ return BigInteger::zero();
+ }
+
+ if ($randomBytesGenerator === null) {
+ $randomBytesGenerator = 'random_bytes';
+ }
+
+ $byteLength = \intdiv($numBits - 1, 8) + 1;
+
+ $extraBits = ($byteLength * 8 - $numBits);
+ $bitmask = \chr(0xFF >> $extraBits);
+
+ $randomBytes = $randomBytesGenerator($byteLength);
+ $randomBytes[0] = $randomBytes[0] & $bitmask;
+
+ return self::fromBytes($randomBytes, false);
+ }
+
+ /**
+ * Generates a pseudo-random number between `$min` and `$max`.
+ *
+ * Using the default random bytes generator, this method is suitable for cryptographic use.
+ *
+ * @psalm-param (callable(int): string)|null $randomBytesGenerator
+ *
+ * @param BigNumber|int|float|string $min The lower bound. Must be convertible to a BigInteger.
+ * @param BigNumber|int|float|string $max The upper bound. Must be convertible to a BigInteger.
+ * @param callable|null $randomBytesGenerator A function that accepts a number of bytes as an integer,
+ * and returns a string of random bytes of the given length.
+ * Defaults to the `random_bytes()` function.
+ *
+ * @return BigInteger
+ *
+ * @throws MathException If one of the parameters cannot be converted to a BigInteger,
+ * or `$min` is greater than `$max`.
+ */
+ public static function randomRange($min, $max, ?callable $randomBytesGenerator = null) : BigInteger
+ {
+ $min = BigInteger::of($min);
+ $max = BigInteger::of($max);
+
+ if ($min->isGreaterThan($max)) {
+ throw new MathException('$min cannot be greater than $max.');
+ }
+
+ if ($min->isEqualTo($max)) {
+ return $min;
+ }
+
+ $diff = $max->minus($min);
+ $bitLength = $diff->getBitLength();
+
+ // try until the number is in range (50% to 100% chance of success)
+ do {
+ $randomNumber = self::randomBits($bitLength, $randomBytesGenerator);
+ } while ($randomNumber->isGreaterThan($diff));
+
+ return $randomNumber->plus($min);
+ }
+
+ /**
+ * Returns a BigInteger representing zero.
+ *
+ * @return BigInteger
+ *
+ * @psalm-pure
+ */
+ public static function zero() : BigInteger
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigInteger|null $zero
+ */
+ static $zero;
+
+ if ($zero === null) {
+ $zero = new BigInteger('0');
+ }
+
+ return $zero;
+ }
+
+ /**
+ * Returns a BigInteger representing one.
+ *
+ * @return BigInteger
+ *
+ * @psalm-pure
+ */
+ public static function one() : BigInteger
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigInteger|null $one
+ */
+ static $one;
+
+ if ($one === null) {
+ $one = new BigInteger('1');
+ }
+
+ return $one;
+ }
+
+ /**
+ * Returns a BigInteger representing ten.
+ *
+ * @return BigInteger
+ *
+ * @psalm-pure
+ */
+ public static function ten() : BigInteger
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigInteger|null $ten
+ */
+ static $ten;
+
+ if ($ten === null) {
+ $ten = new BigInteger('10');
+ }
+
+ return $ten;
+ }
+
+ /**
+ * Returns the sum of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger The result.
+ *
+ * @throws MathException If the number is not valid, or is not convertible to a BigInteger.
+ */
+ public function plus($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '0') {
+ return $this;
+ }
+
+ if ($this->value === '0') {
+ return $that;
+ }
+
+ $value = Calculator::get()->add($this->value, $that->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the difference of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger The result.
+ *
+ * @throws MathException If the number is not valid, or is not convertible to a BigInteger.
+ */
+ public function minus($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '0') {
+ return $this;
+ }
+
+ $value = Calculator::get()->sub($this->value, $that->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the product of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger The result.
+ *
+ * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigInteger.
+ */
+ public function multipliedBy($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '1') {
+ return $this;
+ }
+
+ if ($this->value === '1') {
+ return $that;
+ }
+
+ $value = Calculator::get()->mul($this->value, $that->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the result of the division of this number by the given one.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
+ * @param int $roundingMode An optional rounding mode.
+ *
+ * @return BigInteger The result.
+ *
+ * @throws MathException If the divisor is not a valid number, is not convertible to a BigInteger, is zero,
+ * or RoundingMode::UNNECESSARY is used and the remainder is not zero.
+ */
+ public function dividedBy($that, int $roundingMode = RoundingMode::UNNECESSARY) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '1') {
+ return $this;
+ }
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $result = Calculator::get()->divRound($this->value, $that->value, $roundingMode);
+
+ return new BigInteger($result);
+ }
+
+ /**
+ * Returns this number exponentiated to the given value.
+ *
+ * @param int $exponent The exponent.
+ *
+ * @return BigInteger The result.
+ *
+ * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000.
+ */
+ public function power(int $exponent) : BigInteger
+ {
+ if ($exponent === 0) {
+ return BigInteger::one();
+ }
+
+ if ($exponent === 1) {
+ return $this;
+ }
+
+ if ($exponent < 0 || $exponent > Calculator::MAX_POWER) {
+ throw new \InvalidArgumentException(\sprintf(
+ 'The exponent %d is not in the range 0 to %d.',
+ $exponent,
+ Calculator::MAX_POWER
+ ));
+ }
+
+ return new BigInteger(Calculator::get()->pow($this->value, $exponent));
+ }
+
+ /**
+ * Returns the quotient of the division of this number by the given one.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger
+ *
+ * @throws DivisionByZeroException If the divisor is zero.
+ */
+ public function quotient($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '1') {
+ return $this;
+ }
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $quotient = Calculator::get()->divQ($this->value, $that->value);
+
+ return new BigInteger($quotient);
+ }
+
+ /**
+ * Returns the remainder of the division of this number by the given one.
+ *
+ * The remainder, when non-zero, has the same sign as the dividend.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger
+ *
+ * @throws DivisionByZeroException If the divisor is zero.
+ */
+ public function remainder($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '1') {
+ return BigInteger::zero();
+ }
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ $remainder = Calculator::get()->divR($this->value, $that->value);
+
+ return new BigInteger($remainder);
+ }
+
+ /**
+ * Returns the quotient and remainder of the division of this number by the given one.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger[] An array containing the quotient and the remainder.
+ *
+ * @throws DivisionByZeroException If the divisor is zero.
+ */
+ public function quotientAndRemainder($that) : array
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::divisionByZero();
+ }
+
+ [$quotient, $remainder] = Calculator::get()->divQR($this->value, $that->value);
+
+ return [
+ new BigInteger($quotient),
+ new BigInteger($remainder)
+ ];
+ }
+
+ /**
+ * Returns the modulo of this number and the given one.
+ *
+ * The modulo operation yields the same result as the remainder operation when both operands are of the same sign,
+ * and may differ when signs are different.
+ *
+ * The result of the modulo operation, when non-zero, has the same sign as the divisor.
+ *
+ * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger.
+ *
+ * @return BigInteger
+ *
+ * @throws DivisionByZeroException If the divisor is zero.
+ */
+ public function mod($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '0') {
+ throw DivisionByZeroException::modulusMustNotBeZero();
+ }
+
+ $value = Calculator::get()->mod($this->value, $that->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the modular multiplicative inverse of this BigInteger modulo $m.
+ *
+ * @param BigInteger $m
+ *
+ * @return BigInteger
+ *
+ * @throws DivisionByZeroException If $m is zero.
+ * @throws NegativeNumberException If $m is negative.
+ * @throws MathException If this BigInteger has no multiplicative inverse mod m (that is, this BigInteger
+ * is not relatively prime to m).
+ */
+ public function modInverse(BigInteger $m) : BigInteger
+ {
+ if ($m->value === '0') {
+ throw DivisionByZeroException::modulusMustNotBeZero();
+ }
+
+ if ($m->isNegative()) {
+ throw new NegativeNumberException('Modulus must not be negative.');
+ }
+
+ if ($m->value === '1') {
+ return BigInteger::zero();
+ }
+
+ $value = Calculator::get()->modInverse($this->value, $m->value);
+
+ if ($value === null) {
+ throw new MathException('Unable to compute the modInverse for the given modulus.');
+ }
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns this number raised into power with modulo.
+ *
+ * This operation only works on positive numbers.
+ *
+ * @param BigNumber|int|float|string $exp The exponent. Must be positive or zero.
+ * @param BigNumber|int|float|string $mod The modulus. Must be strictly positive.
+ *
+ * @return BigInteger
+ *
+ * @throws NegativeNumberException If any of the operands is negative.
+ * @throws DivisionByZeroException If the modulus is zero.
+ */
+ public function modPow($exp, $mod) : BigInteger
+ {
+ $exp = BigInteger::of($exp);
+ $mod = BigInteger::of($mod);
+
+ if ($this->isNegative() || $exp->isNegative() || $mod->isNegative()) {
+ throw new NegativeNumberException('The operands cannot be negative.');
+ }
+
+ if ($mod->isZero()) {
+ throw DivisionByZeroException::modulusMustNotBeZero();
+ }
+
+ $result = Calculator::get()->modPow($this->value, $exp->value, $mod->value);
+
+ return new BigInteger($result);
+ }
+
+ /**
+ * Returns the greatest common divisor of this number and the given one.
+ *
+ * The GCD is always positive, unless both operands are zero, in which case it is zero.
+ *
+ * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
+ *
+ * @return BigInteger
+ */
+ public function gcd($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ if ($that->value === '0' && $this->value[0] !== '-') {
+ return $this;
+ }
+
+ if ($this->value === '0' && $that->value[0] !== '-') {
+ return $that;
+ }
+
+ $value = Calculator::get()->gcd($this->value, $that->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the integer square root number of this number, rounded down.
+ *
+ * The result is the largest x such that x² ≤ n.
+ *
+ * @return BigInteger
+ *
+ * @throws NegativeNumberException If this number is negative.
+ */
+ public function sqrt() : BigInteger
+ {
+ if ($this->value[0] === '-') {
+ throw new NegativeNumberException('Cannot calculate the square root of a negative number.');
+ }
+
+ $value = Calculator::get()->sqrt($this->value);
+
+ return new BigInteger($value);
+ }
+
+ /**
+ * Returns the absolute value of this number.
+ *
+ * @return BigInteger
+ */
+ public function abs() : BigInteger
+ {
+ return $this->isNegative() ? $this->negated() : $this;
+ }
+
+ /**
+ * Returns the inverse of this number.
+ *
+ * @return BigInteger
+ */
+ public function negated() : BigInteger
+ {
+ return new BigInteger(Calculator::get()->neg($this->value));
+ }
+
+ /**
+ * Returns the integer bitwise-and combined with another integer.
+ *
+ * This method returns a negative BigInteger if and only if both operands are negative.
+ *
+ * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
+ *
+ * @return BigInteger
+ */
+ public function and($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ return new BigInteger(Calculator::get()->and($this->value, $that->value));
+ }
+
+ /**
+ * Returns the integer bitwise-or combined with another integer.
+ *
+ * This method returns a negative BigInteger if and only if either of the operands is negative.
+ *
+ * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
+ *
+ * @return BigInteger
+ */
+ public function or($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ return new BigInteger(Calculator::get()->or($this->value, $that->value));
+ }
+
+ /**
+ * Returns the integer bitwise-xor combined with another integer.
+ *
+ * This method returns a negative BigInteger if and only if exactly one of the operands is negative.
+ *
+ * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number.
+ *
+ * @return BigInteger
+ */
+ public function xor($that) : BigInteger
+ {
+ $that = BigInteger::of($that);
+
+ return new BigInteger(Calculator::get()->xor($this->value, $that->value));
+ }
+
+ /**
+ * Returns the bitwise-not of this BigInteger.
+ *
+ * @return BigInteger
+ */
+ public function not() : BigInteger
+ {
+ return $this->negated()->minus(1);
+ }
+
+ /**
+ * Returns the integer left shifted by a given number of bits.
+ *
+ * @param int $distance The distance to shift.
+ *
+ * @return BigInteger
+ */
+ public function shiftedLeft(int $distance) : BigInteger
+ {
+ if ($distance === 0) {
+ return $this;
+ }
+
+ if ($distance < 0) {
+ return $this->shiftedRight(- $distance);
+ }
+
+ return $this->multipliedBy(BigInteger::of(2)->power($distance));
+ }
+
+ /**
+ * Returns the integer right shifted by a given number of bits.
+ *
+ * @param int $distance The distance to shift.
+ *
+ * @return BigInteger
+ */
+ public function shiftedRight(int $distance) : BigInteger
+ {
+ if ($distance === 0) {
+ return $this;
+ }
+
+ if ($distance < 0) {
+ return $this->shiftedLeft(- $distance);
+ }
+
+ $operand = BigInteger::of(2)->power($distance);
+
+ if ($this->isPositiveOrZero()) {
+ return $this->quotient($operand);
+ }
+
+ return $this->dividedBy($operand, RoundingMode::UP);
+ }
+
+ /**
+ * Returns the number of bits in the minimal two's-complement representation of this BigInteger, excluding a sign bit.
+ *
+ * For positive BigIntegers, this is equivalent to the number of bits in the ordinary binary representation.
+ * Computes (ceil(log2(this < 0 ? -this : this+1))).
+ *
+ * @return int
+ */
+ public function getBitLength() : int
+ {
+ if ($this->value === '0') {
+ return 0;
+ }
+
+ if ($this->isNegative()) {
+ return $this->abs()->minus(1)->getBitLength();
+ }
+
+ return \strlen($this->toBase(2));
+ }
+
+ /**
+ * Returns the index of the rightmost (lowest-order) one bit in this BigInteger.
+ *
+ * Returns -1 if this BigInteger contains no one bits.
+ *
+ * @return int
+ */
+ public function getLowestSetBit() : int
+ {
+ $n = $this;
+ $bitLength = $this->getBitLength();
+
+ for ($i = 0; $i <= $bitLength; $i++) {
+ if ($n->isOdd()) {
+ return $i;
+ }
+
+ $n = $n->shiftedRight(1);
+ }
+
+ return -1;
+ }
+
+ /**
+ * Returns whether this number is even.
+ *
+ * @return bool
+ */
+ public function isEven() : bool
+ {
+ return \in_array($this->value[-1], ['0', '2', '4', '6', '8'], true);
+ }
+
+ /**
+ * Returns whether this number is odd.
+ *
+ * @return bool
+ */
+ public function isOdd() : bool
+ {
+ return \in_array($this->value[-1], ['1', '3', '5', '7', '9'], true);
+ }
+
+ /**
+ * Returns true if and only if the designated bit is set.
+ *
+ * Computes ((this & (1<shiftedRight($n)->isOdd();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function compareTo($that) : int
+ {
+ $that = BigNumber::of($that);
+
+ if ($that instanceof BigInteger) {
+ return Calculator::get()->cmp($this->value, $that->value);
+ }
+
+ return - $that->compareTo($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getSign() : int
+ {
+ return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigInteger() : BigInteger
+ {
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigDecimal() : BigDecimal
+ {
+ return BigDecimal::create($this->value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigRational() : BigRational
+ {
+ return BigRational::create($this, BigInteger::one(), false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
+ {
+ return $this->toBigDecimal()->toScale($scale, $roundingMode);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toInt() : int
+ {
+ $intValue = (int) $this->value;
+
+ if ($this->value !== (string) $intValue) {
+ throw IntegerOverflowException::toIntOverflow($this);
+ }
+
+ return $intValue;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toFloat() : float
+ {
+ return (float) $this->value;
+ }
+
+ /**
+ * Returns a string representation of this number in the given base.
+ *
+ * The output will always be lowercase for bases greater than 10.
+ *
+ * @param int $base
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the base is out of range.
+ */
+ public function toBase(int $base) : string
+ {
+ if ($base === 10) {
+ return $this->value;
+ }
+
+ if ($base < 2 || $base > 36) {
+ throw new \InvalidArgumentException(\sprintf('Base %d is out of range [2, 36]', $base));
+ }
+
+ return Calculator::get()->toBase($this->value, $base);
+ }
+
+ /**
+ * Returns a string representation of this number in an arbitrary base with a custom alphabet.
+ *
+ * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers;
+ * a NegativeNumberException will be thrown when attempting to call this method on a negative number.
+ *
+ * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8.
+ *
+ * @return string
+ *
+ * @throws NegativeNumberException If this number is negative.
+ * @throws \InvalidArgumentException If the given alphabet does not contain at least 2 chars.
+ */
+ public function toArbitraryBase(string $alphabet) : string
+ {
+ $base = \strlen($alphabet);
+
+ if ($base < 2) {
+ throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.');
+ }
+
+ if ($this->value[0] === '-') {
+ throw new NegativeNumberException(__FUNCTION__ . '() does not support negative numbers.');
+ }
+
+ return Calculator::get()->toArbitraryBase($this->value, $alphabet, $base);
+ }
+
+ /**
+ * Returns a string of bytes containing the binary representation of this BigInteger.
+ *
+ * The string is in big-endian byte-order: the most significant byte is in the zeroth element.
+ *
+ * If `$signed` is true, the output will be in two's-complement representation, and a sign bit will be prepended to
+ * the output. If `$signed` is false, no sign bit will be prepended, and this method will throw an exception if the
+ * number is negative.
+ *
+ * The string will contain the minimum number of bytes required to represent this BigInteger, including a sign bit
+ * if `$signed` is true.
+ *
+ * This representation is compatible with the `fromBytes()` factory method, as long as the `$signed` flags match.
+ *
+ * @param bool $signed Whether to output a signed number in two's-complement representation with a leading sign bit.
+ *
+ * @return string
+ *
+ * @throws NegativeNumberException If $signed is false, and the number is negative.
+ */
+ public function toBytes(bool $signed = true) : string
+ {
+ if (! $signed && $this->isNegative()) {
+ throw new NegativeNumberException('Cannot convert a negative number to a byte string when $signed is false.');
+ }
+
+ $hex = $this->abs()->toBase(16);
+
+ if (\strlen($hex) % 2 !== 0) {
+ $hex = '0' . $hex;
+ }
+
+ $baseHexLength = \strlen($hex);
+
+ if ($signed) {
+ if ($this->isNegative()) {
+ $bin = \hex2bin($hex);
+ assert($bin !== false);
+
+ $hex = \bin2hex(~$bin);
+ $hex = self::fromBase($hex, 16)->plus(1)->toBase(16);
+
+ $hexLength = \strlen($hex);
+
+ if ($hexLength < $baseHexLength) {
+ $hex = \str_repeat('0', $baseHexLength - $hexLength) . $hex;
+ }
+
+ if ($hex[0] < '8') {
+ $hex = 'FF' . $hex;
+ }
+ } else {
+ if ($hex[0] >= '8') {
+ $hex = '00' . $hex;
+ }
+ }
+ }
+
+ return \hex2bin($hex);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString() : string
+ {
+ return $this->value;
+ }
+
+ /**
+ * This method is required for serializing the object and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return array{value: string}
+ */
+ public function __serialize(): array
+ {
+ return ['value' => $this->value];
+ }
+
+ /**
+ * This method is only here to allow unserializing the object and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param array{value: string} $data
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function __unserialize(array $data): void
+ {
+ if (isset($this->value)) {
+ throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
+ }
+
+ $this->value = $data['value'];
+ }
+
+ /**
+ * This method is required by interface Serializable and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return string
+ */
+ public function serialize() : string
+ {
+ return $this->value;
+ }
+
+ /**
+ * This method is only here to implement interface Serializable and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param string $value
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function unserialize($value) : void
+ {
+ if (isset($this->value)) {
+ throw new \LogicException('unserialize() is an internal function, it must not be called directly.');
+ }
+
+ $this->value = $value;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigNumber.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigNumber.php
new file mode 100644
index 00000000..38c8c554
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigNumber.php
@@ -0,0 +1,572 @@
+[\-\+])?' .
+ '(?:' .
+ '(?:' .
+ '(?[0-9]+)?' .
+ '(?\.)?' .
+ '(?[0-9]+)?' .
+ '(?:[eE](?[\-\+]?[0-9]+))?' .
+ ')|(?:' .
+ '(?[0-9]+)' .
+ '\/?' .
+ '(?[0-9]+)' .
+ ')' .
+ ')' .
+ '$/';
+
+ /**
+ * Creates a BigNumber of the given value.
+ *
+ * The concrete return type is dependent on the given value, with the following rules:
+ *
+ * - BigNumber instances are returned as is
+ * - integer numbers are returned as BigInteger
+ * - floating point numbers are converted to a string then parsed as such
+ * - strings containing a `/` character are returned as BigRational
+ * - strings containing a `.` character or using an exponential notation are returned as BigDecimal
+ * - strings containing only digits with an optional leading `+` or `-` sign are returned as BigInteger
+ *
+ * @param BigNumber|int|float|string $value
+ *
+ * @return BigNumber
+ *
+ * @throws NumberFormatException If the format of the number is not valid.
+ * @throws DivisionByZeroException If the value represents a rational number with a denominator of zero.
+ *
+ * @psalm-pure
+ */
+ public static function of($value) : BigNumber
+ {
+ if ($value instanceof BigNumber) {
+ return $value;
+ }
+
+ if (\is_int($value)) {
+ return new BigInteger((string) $value);
+ }
+
+ /** @psalm-suppress RedundantCastGivenDocblockType We cannot trust the untyped $value here! */
+ $value = \is_float($value) ? self::floatToString($value) : (string) $value;
+
+ $throw = static function() use ($value) : void {
+ throw new NumberFormatException(\sprintf(
+ 'The given value "%s" does not represent a valid number.',
+ $value
+ ));
+ };
+
+ if (\preg_match(self::PARSE_REGEXP, $value, $matches) !== 1) {
+ $throw();
+ }
+
+ $getMatch = static function(string $value) use ($matches) : ?string {
+ return isset($matches[$value]) && $matches[$value] !== '' ? $matches[$value] : null;
+ };
+
+ $sign = $getMatch('sign');
+ $numerator = $getMatch('numerator');
+ $denominator = $getMatch('denominator');
+
+ if ($numerator !== null) {
+ assert($denominator !== null);
+
+ if ($sign !== null) {
+ $numerator = $sign . $numerator;
+ }
+
+ $numerator = self::cleanUp($numerator);
+ $denominator = self::cleanUp($denominator);
+
+ if ($denominator === '0') {
+ throw DivisionByZeroException::denominatorMustNotBeZero();
+ }
+
+ return new BigRational(
+ new BigInteger($numerator),
+ new BigInteger($denominator),
+ false
+ );
+ }
+
+ $point = $getMatch('point');
+ $integral = $getMatch('integral');
+ $fractional = $getMatch('fractional');
+ $exponent = $getMatch('exponent');
+
+ if ($integral === null && $fractional === null) {
+ $throw();
+ }
+
+ if ($integral === null) {
+ $integral = '0';
+ }
+
+ if ($point !== null || $exponent !== null) {
+ $fractional = ($fractional ?? '');
+ $exponent = ($exponent !== null) ? (int) $exponent : 0;
+
+ if ($exponent === PHP_INT_MIN || $exponent === PHP_INT_MAX) {
+ throw new NumberFormatException('Exponent too large.');
+ }
+
+ $unscaledValue = self::cleanUp(($sign ?? ''). $integral . $fractional);
+
+ $scale = \strlen($fractional) - $exponent;
+
+ if ($scale < 0) {
+ if ($unscaledValue !== '0') {
+ $unscaledValue .= \str_repeat('0', - $scale);
+ }
+ $scale = 0;
+ }
+
+ return new BigDecimal($unscaledValue, $scale);
+ }
+
+ $integral = self::cleanUp(($sign ?? '') . $integral);
+
+ return new BigInteger($integral);
+ }
+
+ /**
+ * Safely converts float to string, avoiding locale-dependent issues.
+ *
+ * @see https://github.com/brick/math/pull/20
+ *
+ * @param float $float
+ *
+ * @return string
+ *
+ * @psalm-pure
+ * @psalm-suppress ImpureFunctionCall
+ */
+ private static function floatToString(float $float) : string
+ {
+ $currentLocale = \setlocale(LC_NUMERIC, '0');
+ \setlocale(LC_NUMERIC, 'C');
+
+ $result = (string) $float;
+
+ \setlocale(LC_NUMERIC, $currentLocale);
+
+ return $result;
+ }
+
+ /**
+ * Proxy method to access protected constructors from sibling classes.
+ *
+ * @internal
+ *
+ * @param mixed ...$args The arguments to the constructor.
+ *
+ * @return static
+ *
+ * @psalm-pure
+ * @psalm-suppress TooManyArguments
+ * @psalm-suppress UnsafeInstantiation
+ */
+ protected static function create(... $args) : BigNumber
+ {
+ return new static(... $args);
+ }
+
+ /**
+ * Returns the minimum of the given values.
+ *
+ * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible
+ * to an instance of the class this method is called on.
+ *
+ * @return static The minimum value.
+ *
+ * @throws \InvalidArgumentException If no values are given.
+ * @throws MathException If an argument is not valid.
+ *
+ * @psalm-suppress LessSpecificReturnStatement
+ * @psalm-suppress MoreSpecificReturnType
+ * @psalm-pure
+ */
+ public static function min(...$values) : BigNumber
+ {
+ $min = null;
+
+ foreach ($values as $value) {
+ $value = static::of($value);
+
+ if ($min === null || $value->isLessThan($min)) {
+ $min = $value;
+ }
+ }
+
+ if ($min === null) {
+ throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
+ }
+
+ return $min;
+ }
+
+ /**
+ * Returns the maximum of the given values.
+ *
+ * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible
+ * to an instance of the class this method is called on.
+ *
+ * @return static The maximum value.
+ *
+ * @throws \InvalidArgumentException If no values are given.
+ * @throws MathException If an argument is not valid.
+ *
+ * @psalm-suppress LessSpecificReturnStatement
+ * @psalm-suppress MoreSpecificReturnType
+ * @psalm-pure
+ */
+ public static function max(...$values) : BigNumber
+ {
+ $max = null;
+
+ foreach ($values as $value) {
+ $value = static::of($value);
+
+ if ($max === null || $value->isGreaterThan($max)) {
+ $max = $value;
+ }
+ }
+
+ if ($max === null) {
+ throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
+ }
+
+ return $max;
+ }
+
+ /**
+ * Returns the sum of the given values.
+ *
+ * @param BigNumber|int|float|string ...$values The numbers to add. All the numbers need to be convertible
+ * to an instance of the class this method is called on.
+ *
+ * @return static The sum.
+ *
+ * @throws \InvalidArgumentException If no values are given.
+ * @throws MathException If an argument is not valid.
+ *
+ * @psalm-suppress LessSpecificReturnStatement
+ * @psalm-suppress MoreSpecificReturnType
+ * @psalm-pure
+ */
+ public static function sum(...$values) : BigNumber
+ {
+ /** @var BigNumber|null $sum */
+ $sum = null;
+
+ foreach ($values as $value) {
+ $value = static::of($value);
+
+ $sum = $sum === null ? $value : self::add($sum, $value);
+ }
+
+ if ($sum === null) {
+ throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
+ }
+
+ return $sum;
+ }
+
+ /**
+ * Adds two BigNumber instances in the correct order to avoid a RoundingNecessaryException.
+ *
+ * @todo This could be better resolved by creating an abstract protected method in BigNumber, and leaving to
+ * concrete classes the responsibility to perform the addition themselves or delegate it to the given number,
+ * depending on their ability to perform the operation. This will also require a version bump because we're
+ * potentially breaking custom BigNumber implementations (if any...)
+ *
+ * @param BigNumber $a
+ * @param BigNumber $b
+ *
+ * @return BigNumber
+ *
+ * @psalm-pure
+ */
+ private static function add(BigNumber $a, BigNumber $b) : BigNumber
+ {
+ if ($a instanceof BigRational) {
+ return $a->plus($b);
+ }
+
+ if ($b instanceof BigRational) {
+ return $b->plus($a);
+ }
+
+ if ($a instanceof BigDecimal) {
+ return $a->plus($b);
+ }
+
+ if ($b instanceof BigDecimal) {
+ return $b->plus($a);
+ }
+
+ /** @var BigInteger $a */
+
+ return $a->plus($b);
+ }
+
+ /**
+ * Removes optional leading zeros and + sign from the given number.
+ *
+ * @param string $number The number, validated as a non-empty string of digits with optional leading sign.
+ *
+ * @return string
+ *
+ * @psalm-pure
+ */
+ private static function cleanUp(string $number) : string
+ {
+ $firstChar = $number[0];
+
+ if ($firstChar === '+' || $firstChar === '-') {
+ $number = \substr($number, 1);
+ }
+
+ $number = \ltrim($number, '0');
+
+ if ($number === '') {
+ return '0';
+ }
+
+ if ($firstChar === '-') {
+ return '-' . $number;
+ }
+
+ return $number;
+ }
+
+ /**
+ * Checks if this number is equal to the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return bool
+ */
+ public function isEqualTo($that) : bool
+ {
+ return $this->compareTo($that) === 0;
+ }
+
+ /**
+ * Checks if this number is strictly lower than the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return bool
+ */
+ public function isLessThan($that) : bool
+ {
+ return $this->compareTo($that) < 0;
+ }
+
+ /**
+ * Checks if this number is lower than or equal to the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return bool
+ */
+ public function isLessThanOrEqualTo($that) : bool
+ {
+ return $this->compareTo($that) <= 0;
+ }
+
+ /**
+ * Checks if this number is strictly greater than the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return bool
+ */
+ public function isGreaterThan($that) : bool
+ {
+ return $this->compareTo($that) > 0;
+ }
+
+ /**
+ * Checks if this number is greater than or equal to the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return bool
+ */
+ public function isGreaterThanOrEqualTo($that) : bool
+ {
+ return $this->compareTo($that) >= 0;
+ }
+
+ /**
+ * Checks if this number equals zero.
+ *
+ * @return bool
+ */
+ public function isZero() : bool
+ {
+ return $this->getSign() === 0;
+ }
+
+ /**
+ * Checks if this number is strictly negative.
+ *
+ * @return bool
+ */
+ public function isNegative() : bool
+ {
+ return $this->getSign() < 0;
+ }
+
+ /**
+ * Checks if this number is negative or zero.
+ *
+ * @return bool
+ */
+ public function isNegativeOrZero() : bool
+ {
+ return $this->getSign() <= 0;
+ }
+
+ /**
+ * Checks if this number is strictly positive.
+ *
+ * @return bool
+ */
+ public function isPositive() : bool
+ {
+ return $this->getSign() > 0;
+ }
+
+ /**
+ * Checks if this number is positive or zero.
+ *
+ * @return bool
+ */
+ public function isPositiveOrZero() : bool
+ {
+ return $this->getSign() >= 0;
+ }
+
+ /**
+ * Returns the sign of this number.
+ *
+ * @return int -1 if the number is negative, 0 if zero, 1 if positive.
+ */
+ abstract public function getSign() : int;
+
+ /**
+ * Compares this number to the given one.
+ *
+ * @param BigNumber|int|float|string $that
+ *
+ * @return int [-1,0,1] If `$this` is lower than, equal to, or greater than `$that`.
+ *
+ * @throws MathException If the number is not valid.
+ */
+ abstract public function compareTo($that) : int;
+
+ /**
+ * Converts this number to a BigInteger.
+ *
+ * @return BigInteger The converted number.
+ *
+ * @throws RoundingNecessaryException If this number cannot be converted to a BigInteger without rounding.
+ */
+ abstract public function toBigInteger() : BigInteger;
+
+ /**
+ * Converts this number to a BigDecimal.
+ *
+ * @return BigDecimal The converted number.
+ *
+ * @throws RoundingNecessaryException If this number cannot be converted to a BigDecimal without rounding.
+ */
+ abstract public function toBigDecimal() : BigDecimal;
+
+ /**
+ * Converts this number to a BigRational.
+ *
+ * @return BigRational The converted number.
+ */
+ abstract public function toBigRational() : BigRational;
+
+ /**
+ * Converts this number to a BigDecimal with the given scale, using rounding if necessary.
+ *
+ * @param int $scale The scale of the resulting `BigDecimal`.
+ * @param int $roundingMode A `RoundingMode` constant.
+ *
+ * @return BigDecimal
+ *
+ * @throws RoundingNecessaryException If this number cannot be converted to the given scale without rounding.
+ * This only applies when RoundingMode::UNNECESSARY is used.
+ */
+ abstract public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal;
+
+ /**
+ * Returns the exact value of this number as a native integer.
+ *
+ * If this number cannot be converted to a native integer without losing precision, an exception is thrown.
+ * Note that the acceptable range for an integer depends on the platform and differs for 32-bit and 64-bit.
+ *
+ * @return int The converted value.
+ *
+ * @throws MathException If this number cannot be exactly converted to a native integer.
+ */
+ abstract public function toInt() : int;
+
+ /**
+ * Returns an approximation of this number as a floating-point value.
+ *
+ * Note that this method can discard information as the precision of a floating-point value
+ * is inherently limited.
+ *
+ * If the number is greater than the largest representable floating point number, positive infinity is returned.
+ * If the number is less than the smallest representable floating point number, negative infinity is returned.
+ *
+ * @return float The converted value.
+ */
+ abstract public function toFloat() : float;
+
+ /**
+ * Returns a string representation of this number.
+ *
+ * The output of this method can be parsed by the `of()` factory method;
+ * this will yield an object equal to this one, without any information loss.
+ *
+ * @return string
+ */
+ abstract public function __toString() : string;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function jsonSerialize() : string
+ {
+ return $this->__toString();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigRational.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigRational.php
new file mode 100644
index 00000000..bee094f7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/BigRational.php
@@ -0,0 +1,523 @@
+isZero()) {
+ throw DivisionByZeroException::denominatorMustNotBeZero();
+ }
+
+ if ($denominator->isNegative()) {
+ $numerator = $numerator->negated();
+ $denominator = $denominator->negated();
+ }
+ }
+
+ $this->numerator = $numerator;
+ $this->denominator = $denominator;
+ }
+
+ /**
+ * Creates a BigRational of the given value.
+ *
+ * @param BigNumber|int|float|string $value
+ *
+ * @return BigRational
+ *
+ * @throws MathException If the value cannot be converted to a BigRational.
+ *
+ * @psalm-pure
+ */
+ public static function of($value) : BigNumber
+ {
+ return parent::of($value)->toBigRational();
+ }
+
+ /**
+ * Creates a BigRational out of a numerator and a denominator.
+ *
+ * If the denominator is negative, the signs of both the numerator and the denominator
+ * will be inverted to ensure that the denominator is always positive.
+ *
+ * @param BigNumber|int|float|string $numerator The numerator. Must be convertible to a BigInteger.
+ * @param BigNumber|int|float|string $denominator The denominator. Must be convertible to a BigInteger.
+ *
+ * @return BigRational
+ *
+ * @throws NumberFormatException If an argument does not represent a valid number.
+ * @throws RoundingNecessaryException If an argument represents a non-integer number.
+ * @throws DivisionByZeroException If the denominator is zero.
+ *
+ * @psalm-pure
+ */
+ public static function nd($numerator, $denominator) : BigRational
+ {
+ $numerator = BigInteger::of($numerator);
+ $denominator = BigInteger::of($denominator);
+
+ return new BigRational($numerator, $denominator, true);
+ }
+
+ /**
+ * Returns a BigRational representing zero.
+ *
+ * @return BigRational
+ *
+ * @psalm-pure
+ */
+ public static function zero() : BigRational
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigRational|null $zero
+ */
+ static $zero;
+
+ if ($zero === null) {
+ $zero = new BigRational(BigInteger::zero(), BigInteger::one(), false);
+ }
+
+ return $zero;
+ }
+
+ /**
+ * Returns a BigRational representing one.
+ *
+ * @return BigRational
+ *
+ * @psalm-pure
+ */
+ public static function one() : BigRational
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigRational|null $one
+ */
+ static $one;
+
+ if ($one === null) {
+ $one = new BigRational(BigInteger::one(), BigInteger::one(), false);
+ }
+
+ return $one;
+ }
+
+ /**
+ * Returns a BigRational representing ten.
+ *
+ * @return BigRational
+ *
+ * @psalm-pure
+ */
+ public static function ten() : BigRational
+ {
+ /**
+ * @psalm-suppress ImpureStaticVariable
+ * @var BigRational|null $ten
+ */
+ static $ten;
+
+ if ($ten === null) {
+ $ten = new BigRational(BigInteger::ten(), BigInteger::one(), false);
+ }
+
+ return $ten;
+ }
+
+ /**
+ * @return BigInteger
+ */
+ public function getNumerator() : BigInteger
+ {
+ return $this->numerator;
+ }
+
+ /**
+ * @return BigInteger
+ */
+ public function getDenominator() : BigInteger
+ {
+ return $this->denominator;
+ }
+
+ /**
+ * Returns the quotient of the division of the numerator by the denominator.
+ *
+ * @return BigInteger
+ */
+ public function quotient() : BigInteger
+ {
+ return $this->numerator->quotient($this->denominator);
+ }
+
+ /**
+ * Returns the remainder of the division of the numerator by the denominator.
+ *
+ * @return BigInteger
+ */
+ public function remainder() : BigInteger
+ {
+ return $this->numerator->remainder($this->denominator);
+ }
+
+ /**
+ * Returns the quotient and remainder of the division of the numerator by the denominator.
+ *
+ * @return BigInteger[]
+ */
+ public function quotientAndRemainder() : array
+ {
+ return $this->numerator->quotientAndRemainder($this->denominator);
+ }
+
+ /**
+ * Returns the sum of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The number to add.
+ *
+ * @return BigRational The result.
+ *
+ * @throws MathException If the number is not valid.
+ */
+ public function plus($that) : BigRational
+ {
+ $that = BigRational::of($that);
+
+ $numerator = $this->numerator->multipliedBy($that->denominator);
+ $numerator = $numerator->plus($that->numerator->multipliedBy($this->denominator));
+ $denominator = $this->denominator->multipliedBy($that->denominator);
+
+ return new BigRational($numerator, $denominator, false);
+ }
+
+ /**
+ * Returns the difference of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The number to subtract.
+ *
+ * @return BigRational The result.
+ *
+ * @throws MathException If the number is not valid.
+ */
+ public function minus($that) : BigRational
+ {
+ $that = BigRational::of($that);
+
+ $numerator = $this->numerator->multipliedBy($that->denominator);
+ $numerator = $numerator->minus($that->numerator->multipliedBy($this->denominator));
+ $denominator = $this->denominator->multipliedBy($that->denominator);
+
+ return new BigRational($numerator, $denominator, false);
+ }
+
+ /**
+ * Returns the product of this number and the given one.
+ *
+ * @param BigNumber|int|float|string $that The multiplier.
+ *
+ * @return BigRational The result.
+ *
+ * @throws MathException If the multiplier is not a valid number.
+ */
+ public function multipliedBy($that) : BigRational
+ {
+ $that = BigRational::of($that);
+
+ $numerator = $this->numerator->multipliedBy($that->numerator);
+ $denominator = $this->denominator->multipliedBy($that->denominator);
+
+ return new BigRational($numerator, $denominator, false);
+ }
+
+ /**
+ * Returns the result of the division of this number by the given one.
+ *
+ * @param BigNumber|int|float|string $that The divisor.
+ *
+ * @return BigRational The result.
+ *
+ * @throws MathException If the divisor is not a valid number, or is zero.
+ */
+ public function dividedBy($that) : BigRational
+ {
+ $that = BigRational::of($that);
+
+ $numerator = $this->numerator->multipliedBy($that->denominator);
+ $denominator = $this->denominator->multipliedBy($that->numerator);
+
+ return new BigRational($numerator, $denominator, true);
+ }
+
+ /**
+ * Returns this number exponentiated to the given value.
+ *
+ * @param int $exponent The exponent.
+ *
+ * @return BigRational The result.
+ *
+ * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000.
+ */
+ public function power(int $exponent) : BigRational
+ {
+ if ($exponent === 0) {
+ $one = BigInteger::one();
+
+ return new BigRational($one, $one, false);
+ }
+
+ if ($exponent === 1) {
+ return $this;
+ }
+
+ return new BigRational(
+ $this->numerator->power($exponent),
+ $this->denominator->power($exponent),
+ false
+ );
+ }
+
+ /**
+ * Returns the reciprocal of this BigRational.
+ *
+ * The reciprocal has the numerator and denominator swapped.
+ *
+ * @return BigRational
+ *
+ * @throws DivisionByZeroException If the numerator is zero.
+ */
+ public function reciprocal() : BigRational
+ {
+ return new BigRational($this->denominator, $this->numerator, true);
+ }
+
+ /**
+ * Returns the absolute value of this BigRational.
+ *
+ * @return BigRational
+ */
+ public function abs() : BigRational
+ {
+ return new BigRational($this->numerator->abs(), $this->denominator, false);
+ }
+
+ /**
+ * Returns the negated value of this BigRational.
+ *
+ * @return BigRational
+ */
+ public function negated() : BigRational
+ {
+ return new BigRational($this->numerator->negated(), $this->denominator, false);
+ }
+
+ /**
+ * Returns the simplified value of this BigRational.
+ *
+ * @return BigRational
+ */
+ public function simplified() : BigRational
+ {
+ $gcd = $this->numerator->gcd($this->denominator);
+
+ $numerator = $this->numerator->quotient($gcd);
+ $denominator = $this->denominator->quotient($gcd);
+
+ return new BigRational($numerator, $denominator, false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function compareTo($that) : int
+ {
+ return $this->minus($that)->getSign();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getSign() : int
+ {
+ return $this->numerator->getSign();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigInteger() : BigInteger
+ {
+ $simplified = $this->simplified();
+
+ if (! $simplified->denominator->isEqualTo(1)) {
+ throw new RoundingNecessaryException('This rational number cannot be represented as an integer value without rounding.');
+ }
+
+ return $simplified->numerator;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigDecimal() : BigDecimal
+ {
+ return $this->numerator->toBigDecimal()->exactlyDividedBy($this->denominator);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toBigRational() : BigRational
+ {
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toScale(int $scale, int $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
+ {
+ return $this->numerator->toBigDecimal()->dividedBy($this->denominator, $scale, $roundingMode);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toInt() : int
+ {
+ return $this->toBigInteger()->toInt();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toFloat() : float
+ {
+ return $this->numerator->toFloat() / $this->denominator->toFloat();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString() : string
+ {
+ $numerator = (string) $this->numerator;
+ $denominator = (string) $this->denominator;
+
+ if ($denominator === '1') {
+ return $numerator;
+ }
+
+ return $this->numerator . '/' . $this->denominator;
+ }
+
+ /**
+ * This method is required for serializing the object and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return array{numerator: BigInteger, denominator: BigInteger}
+ */
+ public function __serialize(): array
+ {
+ return ['numerator' => $this->numerator, 'denominator' => $this->denominator];
+ }
+
+ /**
+ * This method is only here to allow unserializing the object and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param array{numerator: BigInteger, denominator: BigInteger} $data
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function __unserialize(array $data): void
+ {
+ if (isset($this->numerator)) {
+ throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
+ }
+
+ $this->numerator = $data['numerator'];
+ $this->denominator = $data['denominator'];
+ }
+
+ /**
+ * This method is required by interface Serializable and SHOULD NOT be accessed directly.
+ *
+ * @internal
+ *
+ * @return string
+ */
+ public function serialize() : string
+ {
+ return $this->numerator . '/' . $this->denominator;
+ }
+
+ /**
+ * This method is only here to implement interface Serializable and cannot be accessed directly.
+ *
+ * @internal
+ * @psalm-suppress RedundantPropertyInitializationCheck
+ *
+ * @param string $value
+ *
+ * @return void
+ *
+ * @throws \LogicException
+ */
+ public function unserialize($value) : void
+ {
+ if (isset($this->numerator)) {
+ throw new \LogicException('unserialize() is an internal function, it must not be called directly.');
+ }
+
+ [$numerator, $denominator] = \explode('/', $value);
+
+ $this->numerator = BigInteger::of($numerator);
+ $this->denominator = BigInteger::of($denominator);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/DivisionByZeroException.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/DivisionByZeroException.php
new file mode 100644
index 00000000..a4e44317
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/DivisionByZeroException.php
@@ -0,0 +1,41 @@
+ 126) {
+ $char = \strtoupper(\dechex($ord));
+
+ if ($ord < 10) {
+ $char = '0' . $char;
+ }
+ } else {
+ $char = '"' . $char . '"';
+ }
+
+ return new self(sprintf('Char %s is not a valid character in the given alphabet.', $char));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/RoundingNecessaryException.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/RoundingNecessaryException.php
new file mode 100644
index 00000000..1c610056
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Exception/RoundingNecessaryException.php
@@ -0,0 +1,21 @@
+init($a, $b);
+
+ if ($aNeg && ! $bNeg) {
+ return -1;
+ }
+
+ if ($bNeg && ! $aNeg) {
+ return 1;
+ }
+
+ $aLen = \strlen($aDig);
+ $bLen = \strlen($bDig);
+
+ if ($aLen < $bLen) {
+ $result = -1;
+ } elseif ($aLen > $bLen) {
+ $result = 1;
+ } else {
+ $result = $aDig <=> $bDig;
+ }
+
+ return $aNeg ? -$result : $result;
+ }
+
+ /**
+ * Adds two numbers.
+ *
+ * @param string $a The augend.
+ * @param string $b The addend.
+ *
+ * @return string The sum.
+ */
+ abstract public function add(string $a, string $b) : string;
+
+ /**
+ * Subtracts two numbers.
+ *
+ * @param string $a The minuend.
+ * @param string $b The subtrahend.
+ *
+ * @return string The difference.
+ */
+ abstract public function sub(string $a, string $b) : string;
+
+ /**
+ * Multiplies two numbers.
+ *
+ * @param string $a The multiplicand.
+ * @param string $b The multiplier.
+ *
+ * @return string The product.
+ */
+ abstract public function mul(string $a, string $b) : string;
+
+ /**
+ * Returns the quotient of the division of two numbers.
+ *
+ * @param string $a The dividend.
+ * @param string $b The divisor, must not be zero.
+ *
+ * @return string The quotient.
+ */
+ abstract public function divQ(string $a, string $b) : string;
+
+ /**
+ * Returns the remainder of the division of two numbers.
+ *
+ * @param string $a The dividend.
+ * @param string $b The divisor, must not be zero.
+ *
+ * @return string The remainder.
+ */
+ abstract public function divR(string $a, string $b) : string;
+
+ /**
+ * Returns the quotient and remainder of the division of two numbers.
+ *
+ * @param string $a The dividend.
+ * @param string $b The divisor, must not be zero.
+ *
+ * @return string[] An array containing the quotient and remainder.
+ */
+ abstract public function divQR(string $a, string $b) : array;
+
+ /**
+ * Exponentiates a number.
+ *
+ * @param string $a The base number.
+ * @param int $e The exponent, validated as an integer between 0 and MAX_POWER.
+ *
+ * @return string The power.
+ */
+ abstract public function pow(string $a, int $e) : string;
+
+ /**
+ * @param string $a
+ * @param string $b The modulus; must not be zero.
+ *
+ * @return string
+ */
+ public function mod(string $a, string $b) : string
+ {
+ return $this->divR($this->add($this->divR($a, $b), $b), $b);
+ }
+
+ /**
+ * Returns the modular multiplicative inverse of $x modulo $m.
+ *
+ * If $x has no multiplicative inverse mod m, this method must return null.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library has built-in support.
+ *
+ * @param string $x
+ * @param string $m The modulus; must not be negative or zero.
+ *
+ * @return string|null
+ */
+ public function modInverse(string $x, string $m) : ?string
+ {
+ if ($m === '1') {
+ return '0';
+ }
+
+ $modVal = $x;
+
+ if ($x[0] === '-' || ($this->cmp($this->abs($x), $m) >= 0)) {
+ $modVal = $this->mod($x, $m);
+ }
+
+ $x = '0';
+ $y = '0';
+ $g = $this->gcdExtended($modVal, $m, $x, $y);
+
+ if ($g !== '1') {
+ return null;
+ }
+
+ return $this->mod($this->add($this->mod($x, $m), $m), $m);
+ }
+
+ /**
+ * Raises a number into power with modulo.
+ *
+ * @param string $base The base number; must be positive or zero.
+ * @param string $exp The exponent; must be positive or zero.
+ * @param string $mod The modulus; must be strictly positive.
+ *
+ * @return string The power.
+ */
+ abstract public function modPow(string $base, string $exp, string $mod) : string;
+
+ /**
+ * Returns the greatest common divisor of the two numbers.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for GCD calculations.
+ *
+ * @param string $a The first number.
+ * @param string $b The second number.
+ *
+ * @return string The GCD, always positive, or zero if both arguments are zero.
+ */
+ public function gcd(string $a, string $b) : string
+ {
+ if ($a === '0') {
+ return $this->abs($b);
+ }
+
+ if ($b === '0') {
+ return $this->abs($a);
+ }
+
+ return $this->gcd($b, $this->divR($a, $b));
+ }
+
+ private function gcdExtended(string $a, string $b, string &$x, string &$y) : string
+ {
+ if ($a === '0') {
+ $x = '0';
+ $y = '1';
+
+ return $b;
+ }
+
+ $x1 = '0';
+ $y1 = '0';
+
+ $gcd = $this->gcdExtended($this->mod($b, $a), $a, $x1, $y1);
+
+ $x = $this->sub($y1, $this->mul($this->divQ($b, $a), $x1));
+ $y = $x1;
+
+ return $gcd;
+ }
+
+ /**
+ * Returns the square root of the given number, rounded down.
+ *
+ * The result is the largest x such that x² ≤ n.
+ * The input MUST NOT be negative.
+ *
+ * @param string $n The number.
+ *
+ * @return string The square root.
+ */
+ abstract public function sqrt(string $n) : string;
+
+ /**
+ * Converts a number from an arbitrary base.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for base conversion.
+ *
+ * @param string $number The number, positive or zero, non-empty, case-insensitively validated for the given base.
+ * @param int $base The base of the number, validated from 2 to 36.
+ *
+ * @return string The converted number, following the Calculator conventions.
+ */
+ public function fromBase(string $number, int $base) : string
+ {
+ return $this->fromArbitraryBase(\strtolower($number), self::ALPHABET, $base);
+ }
+
+ /**
+ * Converts a number to an arbitrary base.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for base conversion.
+ *
+ * @param string $number The number to convert, following the Calculator conventions.
+ * @param int $base The base to convert to, validated from 2 to 36.
+ *
+ * @return string The converted number, lowercase.
+ */
+ public function toBase(string $number, int $base) : string
+ {
+ $negative = ($number[0] === '-');
+
+ if ($negative) {
+ $number = \substr($number, 1);
+ }
+
+ $number = $this->toArbitraryBase($number, self::ALPHABET, $base);
+
+ if ($negative) {
+ return '-' . $number;
+ }
+
+ return $number;
+ }
+
+ /**
+ * Converts a non-negative number in an arbitrary base using a custom alphabet, to base 10.
+ *
+ * @param string $number The number to convert, validated as a non-empty string,
+ * containing only chars in the given alphabet/base.
+ * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum.
+ * @param int $base The base of the number, validated from 2 to alphabet length.
+ *
+ * @return string The number in base 10, following the Calculator conventions.
+ */
+ final public function fromArbitraryBase(string $number, string $alphabet, int $base) : string
+ {
+ // remove leading "zeros"
+ $number = \ltrim($number, $alphabet[0]);
+
+ if ($number === '') {
+ return '0';
+ }
+
+ // optimize for "one"
+ if ($number === $alphabet[1]) {
+ return '1';
+ }
+
+ $result = '0';
+ $power = '1';
+
+ $base = (string) $base;
+
+ for ($i = \strlen($number) - 1; $i >= 0; $i--) {
+ $index = \strpos($alphabet, $number[$i]);
+
+ if ($index !== 0) {
+ $result = $this->add($result, ($index === 1)
+ ? $power
+ : $this->mul($power, (string) $index)
+ );
+ }
+
+ if ($i !== 0) {
+ $power = $this->mul($power, $base);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Converts a non-negative number to an arbitrary base using a custom alphabet.
+ *
+ * @param string $number The number to convert, positive or zero, following the Calculator conventions.
+ * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum.
+ * @param int $base The base to convert to, validated from 2 to alphabet length.
+ *
+ * @return string The converted number in the given alphabet.
+ */
+ final public function toArbitraryBase(string $number, string $alphabet, int $base) : string
+ {
+ if ($number === '0') {
+ return $alphabet[0];
+ }
+
+ $base = (string) $base;
+ $result = '';
+
+ while ($number !== '0') {
+ [$number, $remainder] = $this->divQR($number, $base);
+ $remainder = (int) $remainder;
+
+ $result .= $alphabet[$remainder];
+ }
+
+ return \strrev($result);
+ }
+
+ /**
+ * Performs a rounded division.
+ *
+ * Rounding is performed when the remainder of the division is not zero.
+ *
+ * @param string $a The dividend.
+ * @param string $b The divisor, must not be zero.
+ * @param int $roundingMode The rounding mode.
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the rounding mode is invalid.
+ * @throws RoundingNecessaryException If RoundingMode::UNNECESSARY is provided but rounding is necessary.
+ */
+ final public function divRound(string $a, string $b, int $roundingMode) : string
+ {
+ [$quotient, $remainder] = $this->divQR($a, $b);
+
+ $hasDiscardedFraction = ($remainder !== '0');
+ $isPositiveOrZero = ($a[0] === '-') === ($b[0] === '-');
+
+ $discardedFractionSign = function() use ($remainder, $b) : int {
+ $r = $this->abs($this->mul($remainder, '2'));
+ $b = $this->abs($b);
+
+ return $this->cmp($r, $b);
+ };
+
+ $increment = false;
+
+ switch ($roundingMode) {
+ case RoundingMode::UNNECESSARY:
+ if ($hasDiscardedFraction) {
+ throw RoundingNecessaryException::roundingNecessary();
+ }
+ break;
+
+ case RoundingMode::UP:
+ $increment = $hasDiscardedFraction;
+ break;
+
+ case RoundingMode::DOWN:
+ break;
+
+ case RoundingMode::CEILING:
+ $increment = $hasDiscardedFraction && $isPositiveOrZero;
+ break;
+
+ case RoundingMode::FLOOR:
+ $increment = $hasDiscardedFraction && ! $isPositiveOrZero;
+ break;
+
+ case RoundingMode::HALF_UP:
+ $increment = $discardedFractionSign() >= 0;
+ break;
+
+ case RoundingMode::HALF_DOWN:
+ $increment = $discardedFractionSign() > 0;
+ break;
+
+ case RoundingMode::HALF_CEILING:
+ $increment = $isPositiveOrZero ? $discardedFractionSign() >= 0 : $discardedFractionSign() > 0;
+ break;
+
+ case RoundingMode::HALF_FLOOR:
+ $increment = $isPositiveOrZero ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0;
+ break;
+
+ case RoundingMode::HALF_EVEN:
+ $lastDigit = (int) $quotient[-1];
+ $lastDigitIsEven = ($lastDigit % 2 === 0);
+ $increment = $lastDigitIsEven ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0;
+ break;
+
+ default:
+ throw new \InvalidArgumentException('Invalid rounding mode.');
+ }
+
+ if ($increment) {
+ return $this->add($quotient, $isPositiveOrZero ? '1' : '-1');
+ }
+
+ return $quotient;
+ }
+
+ /**
+ * Calculates bitwise AND of two numbers.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for bitwise operations.
+ *
+ * @param string $a
+ * @param string $b
+ *
+ * @return string
+ */
+ public function and(string $a, string $b) : string
+ {
+ return $this->bitwise('and', $a, $b);
+ }
+
+ /**
+ * Calculates bitwise OR of two numbers.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for bitwise operations.
+ *
+ * @param string $a
+ * @param string $b
+ *
+ * @return string
+ */
+ public function or(string $a, string $b) : string
+ {
+ return $this->bitwise('or', $a, $b);
+ }
+
+ /**
+ * Calculates bitwise XOR of two numbers.
+ *
+ * This method can be overridden by the concrete implementation if the underlying library
+ * has built-in support for bitwise operations.
+ *
+ * @param string $a
+ * @param string $b
+ *
+ * @return string
+ */
+ public function xor(string $a, string $b) : string
+ {
+ return $this->bitwise('xor', $a, $b);
+ }
+
+ /**
+ * Performs a bitwise operation on a decimal number.
+ *
+ * @param string $operator The operator to use, must be "and", "or" or "xor".
+ * @param string $a The left operand.
+ * @param string $b The right operand.
+ *
+ * @return string
+ */
+ private function bitwise(string $operator, string $a, string $b) : string
+ {
+ [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);
+
+ $aBin = $this->toBinary($aDig);
+ $bBin = $this->toBinary($bDig);
+
+ $aLen = \strlen($aBin);
+ $bLen = \strlen($bBin);
+
+ if ($aLen > $bLen) {
+ $bBin = \str_repeat("\x00", $aLen - $bLen) . $bBin;
+ } elseif ($bLen > $aLen) {
+ $aBin = \str_repeat("\x00", $bLen - $aLen) . $aBin;
+ }
+
+ if ($aNeg) {
+ $aBin = $this->twosComplement($aBin);
+ }
+ if ($bNeg) {
+ $bBin = $this->twosComplement($bBin);
+ }
+
+ switch ($operator) {
+ case 'and':
+ $value = $aBin & $bBin;
+ $negative = ($aNeg and $bNeg);
+ break;
+
+ case 'or':
+ $value = $aBin | $bBin;
+ $negative = ($aNeg or $bNeg);
+ break;
+
+ case 'xor':
+ $value = $aBin ^ $bBin;
+ $negative = ($aNeg xor $bNeg);
+ break;
+
+ // @codeCoverageIgnoreStart
+ default:
+ throw new \InvalidArgumentException('Invalid bitwise operator.');
+ // @codeCoverageIgnoreEnd
+ }
+
+ if ($negative) {
+ $value = $this->twosComplement($value);
+ }
+
+ $result = $this->toDecimal($value);
+
+ return $negative ? $this->neg($result) : $result;
+ }
+
+ /**
+ * @param string $number A positive, binary number.
+ *
+ * @return string
+ */
+ private function twosComplement(string $number) : string
+ {
+ $xor = \str_repeat("\xff", \strlen($number));
+
+ $number ^= $xor;
+
+ for ($i = \strlen($number) - 1; $i >= 0; $i--) {
+ $byte = \ord($number[$i]);
+
+ if (++$byte !== 256) {
+ $number[$i] = \chr($byte);
+ break;
+ }
+
+ $number[$i] = "\x00";
+
+ if ($i === 0) {
+ $number = "\x01" . $number;
+ }
+ }
+
+ return $number;
+ }
+
+ /**
+ * Converts a decimal number to a binary string.
+ *
+ * @param string $number The number to convert, positive or zero, only digits.
+ *
+ * @return string
+ */
+ private function toBinary(string $number) : string
+ {
+ $result = '';
+
+ while ($number !== '0') {
+ [$number, $remainder] = $this->divQR($number, '256');
+ $result .= \chr((int) $remainder);
+ }
+
+ return \strrev($result);
+ }
+
+ /**
+ * Returns the positive decimal representation of a binary number.
+ *
+ * @param string $bytes The bytes representing the number.
+ *
+ * @return string
+ */
+ private function toDecimal(string $bytes) : string
+ {
+ $result = '0';
+ $power = '1';
+
+ for ($i = \strlen($bytes) - 1; $i >= 0; $i--) {
+ $index = \ord($bytes[$i]);
+
+ if ($index !== 0) {
+ $result = $this->add($result, ($index === 1)
+ ? $power
+ : $this->mul($power, (string) $index)
+ );
+ }
+
+ if ($i !== 0) {
+ $power = $this->mul($power, '256');
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php
new file mode 100644
index 00000000..6632b378
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php
@@ -0,0 +1,116 @@
+= 0) {
+ return \bcmod($a, $b, 0);
+ }
+
+ return \bcmod($a, $b);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function divQR(string $a, string $b) : array
+ {
+ $q = \bcdiv($a, $b, 0);
+
+ if (version_compare(PHP_VERSION, '7.2') >= 0) {
+ $r = \bcmod($a, $b, 0);
+ } else {
+ $r = \bcmod($a, $b);
+ }
+
+ assert($q !== null);
+ assert($r !== null);
+
+ return [$q, $r];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function pow(string $a, int $e) : string
+ {
+ return \bcpow($a, (string) $e, 0);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @psalm-suppress InvalidNullableReturnType
+ * @psalm-suppress NullableReturnStatement
+ */
+ public function modPow(string $base, string $exp, string $mod) : string
+ {
+ return \bcpowmod($base, $exp, $mod, 0);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @psalm-suppress NullableReturnStatement
+ * @psalm-suppress InvalidNullableReturnType
+ */
+ public function sqrt(string $n) : string
+ {
+ return \bcsqrt($n, 0);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/GmpCalculator.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/GmpCalculator.php
new file mode 100644
index 00000000..52d18800
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/Internal/Calculator/GmpCalculator.php
@@ -0,0 +1,156 @@
+maxDigits = 9;
+ break;
+
+ case 8:
+ $this->maxDigits = 18;
+ break;
+
+ default:
+ throw new \RuntimeException('The platform is not 32-bit or 64-bit as expected.');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function add(string $a, string $b) : string
+ {
+ /**
+ * @psalm-var numeric-string $a
+ * @psalm-var numeric-string $b
+ */
+ $result = $a + $b;
+
+ if (is_int($result)) {
+ return (string) $result;
+ }
+
+ if ($a === '0') {
+ return $b;
+ }
+
+ if ($b === '0') {
+ return $a;
+ }
+
+ [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);
+
+ $result = $aNeg === $bNeg ? $this->doAdd($aDig, $bDig) : $this->doSub($aDig, $bDig);
+
+ if ($aNeg) {
+ $result = $this->neg($result);
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function sub(string $a, string $b) : string
+ {
+ return $this->add($a, $this->neg($b));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function mul(string $a, string $b) : string
+ {
+ /**
+ * @psalm-var numeric-string $a
+ * @psalm-var numeric-string $b
+ */
+ $result = $a * $b;
+
+ if (is_int($result)) {
+ return (string) $result;
+ }
+
+ if ($a === '0' || $b === '0') {
+ return '0';
+ }
+
+ if ($a === '1') {
+ return $b;
+ }
+
+ if ($b === '1') {
+ return $a;
+ }
+
+ if ($a === '-1') {
+ return $this->neg($b);
+ }
+
+ if ($b === '-1') {
+ return $this->neg($a);
+ }
+
+ [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);
+
+ $result = $this->doMul($aDig, $bDig);
+
+ if ($aNeg !== $bNeg) {
+ $result = $this->neg($result);
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function divQ(string $a, string $b) : string
+ {
+ return $this->divQR($a, $b)[0];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function divR(string $a, string $b): string
+ {
+ return $this->divQR($a, $b)[1];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function divQR(string $a, string $b) : array
+ {
+ if ($a === '0') {
+ return ['0', '0'];
+ }
+
+ if ($a === $b) {
+ return ['1', '0'];
+ }
+
+ if ($b === '1') {
+ return [$a, '0'];
+ }
+
+ if ($b === '-1') {
+ return [$this->neg($a), '0'];
+ }
+
+ /** @psalm-var numeric-string $a */
+ $na = $a * 1; // cast to number
+
+ if (is_int($na)) {
+ /** @psalm-var numeric-string $b */
+ $nb = $b * 1;
+
+ if (is_int($nb)) {
+ // the only division that may overflow is PHP_INT_MIN / -1,
+ // which cannot happen here as we've already handled a divisor of -1 above.
+ $r = $na % $nb;
+ $q = ($na - $r) / $nb;
+
+ assert(is_int($q));
+
+ return [
+ (string) $q,
+ (string) $r
+ ];
+ }
+ }
+
+ [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);
+
+ [$q, $r] = $this->doDiv($aDig, $bDig);
+
+ if ($aNeg !== $bNeg) {
+ $q = $this->neg($q);
+ }
+
+ if ($aNeg) {
+ $r = $this->neg($r);
+ }
+
+ return [$q, $r];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function pow(string $a, int $e) : string
+ {
+ if ($e === 0) {
+ return '1';
+ }
+
+ if ($e === 1) {
+ return $a;
+ }
+
+ $odd = $e % 2;
+ $e -= $odd;
+
+ $aa = $this->mul($a, $a);
+
+ /** @psalm-suppress PossiblyInvalidArgument We're sure that $e / 2 is an int now */
+ $result = $this->pow($aa, $e / 2);
+
+ if ($odd === 1) {
+ $result = $this->mul($result, $a);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Algorithm from: https://www.geeksforgeeks.org/modular-exponentiation-power-in-modular-arithmetic/
+ *
+ * {@inheritdoc}
+ */
+ public function modPow(string $base, string $exp, string $mod) : string
+ {
+ // special case: the algorithm below fails with 0 power 0 mod 1 (returns 1 instead of 0)
+ if ($base === '0' && $exp === '0' && $mod === '1') {
+ return '0';
+ }
+
+ // special case: the algorithm below fails with power 0 mod 1 (returns 1 instead of 0)
+ if ($exp === '0' && $mod === '1') {
+ return '0';
+ }
+
+ $x = $base;
+
+ $res = '1';
+
+ // numbers are positive, so we can use remainder instead of modulo
+ $x = $this->divR($x, $mod);
+
+ while ($exp !== '0') {
+ if (in_array($exp[-1], ['1', '3', '5', '7', '9'])) { // odd
+ $res = $this->divR($this->mul($res, $x), $mod);
+ }
+
+ $exp = $this->divQ($exp, '2');
+ $x = $this->divR($this->mul($x, $x), $mod);
+ }
+
+ return $res;
+ }
+
+ /**
+ * Adapted from https://cp-algorithms.com/num_methods/roots_newton.html
+ *
+ * {@inheritDoc}
+ */
+ public function sqrt(string $n) : string
+ {
+ if ($n === '0') {
+ return '0';
+ }
+
+ // initial approximation
+ $x = \str_repeat('9', \intdiv(\strlen($n), 2) ?: 1);
+
+ $decreased = false;
+
+ for (;;) {
+ $nx = $this->divQ($this->add($x, $this->divQ($n, $x)), '2');
+
+ if ($x === $nx || $this->cmp($nx, $x) > 0 && $decreased) {
+ break;
+ }
+
+ $decreased = $this->cmp($nx, $x) < 0;
+ $x = $nx;
+ }
+
+ return $x;
+ }
+
+ /**
+ * Performs the addition of two non-signed large integers.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return string
+ */
+ private function doAdd(string $a, string $b) : string
+ {
+ [$a, $b, $length] = $this->pad($a, $b);
+
+ $carry = 0;
+ $result = '';
+
+ for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) {
+ $blockLength = $this->maxDigits;
+
+ if ($i < 0) {
+ $blockLength += $i;
+ /** @psalm-suppress LoopInvalidation */
+ $i = 0;
+ }
+
+ /** @psalm-var numeric-string $blockA */
+ $blockA = \substr($a, $i, $blockLength);
+
+ /** @psalm-var numeric-string $blockB */
+ $blockB = \substr($b, $i, $blockLength);
+
+ $sum = (string) ($blockA + $blockB + $carry);
+ $sumLength = \strlen($sum);
+
+ if ($sumLength > $blockLength) {
+ $sum = \substr($sum, 1);
+ $carry = 1;
+ } else {
+ if ($sumLength < $blockLength) {
+ $sum = \str_repeat('0', $blockLength - $sumLength) . $sum;
+ }
+ $carry = 0;
+ }
+
+ $result = $sum . $result;
+
+ if ($i === 0) {
+ break;
+ }
+ }
+
+ if ($carry === 1) {
+ $result = '1' . $result;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Performs the subtraction of two non-signed large integers.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return string
+ */
+ private function doSub(string $a, string $b) : string
+ {
+ if ($a === $b) {
+ return '0';
+ }
+
+ // Ensure that we always subtract to a positive result: biggest minus smallest.
+ $cmp = $this->doCmp($a, $b);
+
+ $invert = ($cmp === -1);
+
+ if ($invert) {
+ $c = $a;
+ $a = $b;
+ $b = $c;
+ }
+
+ [$a, $b, $length] = $this->pad($a, $b);
+
+ $carry = 0;
+ $result = '';
+
+ $complement = 10 ** $this->maxDigits;
+
+ for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) {
+ $blockLength = $this->maxDigits;
+
+ if ($i < 0) {
+ $blockLength += $i;
+ /** @psalm-suppress LoopInvalidation */
+ $i = 0;
+ }
+
+ /** @psalm-var numeric-string $blockA */
+ $blockA = \substr($a, $i, $blockLength);
+
+ /** @psalm-var numeric-string $blockB */
+ $blockB = \substr($b, $i, $blockLength);
+
+ $sum = $blockA - $blockB - $carry;
+
+ if ($sum < 0) {
+ $sum += $complement;
+ $carry = 1;
+ } else {
+ $carry = 0;
+ }
+
+ $sum = (string) $sum;
+ $sumLength = \strlen($sum);
+
+ if ($sumLength < $blockLength) {
+ $sum = \str_repeat('0', $blockLength - $sumLength) . $sum;
+ }
+
+ $result = $sum . $result;
+
+ if ($i === 0) {
+ break;
+ }
+ }
+
+ // Carry cannot be 1 when the loop ends, as a > b
+ assert($carry === 0);
+
+ $result = \ltrim($result, '0');
+
+ if ($invert) {
+ $result = $this->neg($result);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Performs the multiplication of two non-signed large integers.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return string
+ */
+ private function doMul(string $a, string $b) : string
+ {
+ $x = \strlen($a);
+ $y = \strlen($b);
+
+ $maxDigits = \intdiv($this->maxDigits, 2);
+ $complement = 10 ** $maxDigits;
+
+ $result = '0';
+
+ for ($i = $x - $maxDigits;; $i -= $maxDigits) {
+ $blockALength = $maxDigits;
+
+ if ($i < 0) {
+ $blockALength += $i;
+ /** @psalm-suppress LoopInvalidation */
+ $i = 0;
+ }
+
+ $blockA = (int) \substr($a, $i, $blockALength);
+
+ $line = '';
+ $carry = 0;
+
+ for ($j = $y - $maxDigits;; $j -= $maxDigits) {
+ $blockBLength = $maxDigits;
+
+ if ($j < 0) {
+ $blockBLength += $j;
+ /** @psalm-suppress LoopInvalidation */
+ $j = 0;
+ }
+
+ $blockB = (int) \substr($b, $j, $blockBLength);
+
+ $mul = $blockA * $blockB + $carry;
+ $value = $mul % $complement;
+ $carry = ($mul - $value) / $complement;
+
+ $value = (string) $value;
+ $value = \str_pad($value, $maxDigits, '0', STR_PAD_LEFT);
+
+ $line = $value . $line;
+
+ if ($j === 0) {
+ break;
+ }
+ }
+
+ if ($carry !== 0) {
+ $line = $carry . $line;
+ }
+
+ $line = \ltrim($line, '0');
+
+ if ($line !== '') {
+ $line .= \str_repeat('0', $x - $blockALength - $i);
+ $result = $this->add($result, $line);
+ }
+
+ if ($i === 0) {
+ break;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Performs the division of two non-signed large integers.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return string[] The quotient and remainder.
+ */
+ private function doDiv(string $a, string $b) : array
+ {
+ $cmp = $this->doCmp($a, $b);
+
+ if ($cmp === -1) {
+ return ['0', $a];
+ }
+
+ $x = \strlen($a);
+ $y = \strlen($b);
+
+ // we now know that a >= b && x >= y
+
+ $q = '0'; // quotient
+ $r = $a; // remainder
+ $z = $y; // focus length, always $y or $y+1
+
+ for (;;) {
+ $focus = \substr($a, 0, $z);
+
+ $cmp = $this->doCmp($focus, $b);
+
+ if ($cmp === -1) {
+ if ($z === $x) { // remainder < dividend
+ break;
+ }
+
+ $z++;
+ }
+
+ $zeros = \str_repeat('0', $x - $z);
+
+ $q = $this->add($q, '1' . $zeros);
+ $a = $this->sub($a, $b . $zeros);
+
+ $r = $a;
+
+ if ($r === '0') { // remainder == 0
+ break;
+ }
+
+ $x = \strlen($a);
+
+ if ($x < $y) { // remainder < dividend
+ break;
+ }
+
+ $z = $y;
+ }
+
+ return [$q, $r];
+ }
+
+ /**
+ * Compares two non-signed large numbers.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return int [-1, 0, 1]
+ */
+ private function doCmp(string $a, string $b) : int
+ {
+ $x = \strlen($a);
+ $y = \strlen($b);
+
+ $cmp = $x <=> $y;
+
+ if ($cmp !== 0) {
+ return $cmp;
+ }
+
+ return \strcmp($a, $b) <=> 0; // enforce [-1, 0, 1]
+ }
+
+ /**
+ * Pads the left of one of the given numbers with zeros if necessary to make both numbers the same length.
+ *
+ * The numbers must only consist of digits, without leading minus sign.
+ *
+ * @param string $a The first operand.
+ * @param string $b The second operand.
+ *
+ * @return array{string, string, int}
+ */
+ private function pad(string $a, string $b) : array
+ {
+ $x = \strlen($a);
+ $y = \strlen($b);
+
+ if ($x > $y) {
+ $b = \str_repeat('0', $x - $y) . $b;
+
+ return [$a, $b, $x];
+ }
+
+ if ($x < $y) {
+ $a = \str_repeat('0', $y - $x) . $a;
+
+ return [$a, $b, $y];
+ }
+
+ return [$a, $b, $x];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/brick/math/src/RoundingMode.php b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/RoundingMode.php
new file mode 100644
index 00000000..06936d8d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/brick/math/src/RoundingMode.php
@@ -0,0 +1,107 @@
+= 0.5; otherwise, behaves as for DOWN.
+ * Note that this is the rounding mode commonly taught at school.
+ */
+ public const HALF_UP = 5;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
+ *
+ * Behaves as for UP if the discarded fraction is > 0.5; otherwise, behaves as for DOWN.
+ */
+ public const HALF_DOWN = 6;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards positive infinity.
+ *
+ * If the result is positive, behaves as for HALF_UP; if negative, behaves as for HALF_DOWN.
+ */
+ public const HALF_CEILING = 7;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards negative infinity.
+ *
+ * If the result is positive, behaves as for HALF_DOWN; if negative, behaves as for HALF_UP.
+ */
+ public const HALF_FLOOR = 8;
+
+ /**
+ * Rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case rounds towards the even neighbor.
+ *
+ * Behaves as for HALF_UP if the digit to the left of the discarded fraction is odd;
+ * behaves as for HALF_DOWN if it's even.
+ *
+ * Note that this is the rounding mode that statistically minimizes
+ * cumulative error when applied repeatedly over a sequence of calculations.
+ * It is sometimes known as "Banker's rounding", and is chiefly used in the USA.
+ */
+ public const HALF_EVEN = 9;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/ClassLoader.php b/wp-content/plugins/wp-webauthn/vendor/composer/ClassLoader.php
new file mode 100644
index 00000000..afef3fa2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/ClassLoader.php
@@ -0,0 +1,572 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see https://www.php-fig.org/psr/psr-0/
+ * @see https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ /** @var ?string */
+ private $vendorDir;
+
+ // PSR-4
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixLengthsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixDirsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array
+ */
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixesPsr0 = array();
+ /**
+ * @var array[]
+ * @psalm-var array
+ */
+ private $fallbackDirsPsr0 = array();
+
+ /** @var bool */
+ private $useIncludePath = false;
+
+ /**
+ * @var string[]
+ * @psalm-var array
+ */
+ private $classMap = array();
+
+ /** @var bool */
+ private $classMapAuthoritative = false;
+
+ /**
+ * @var bool[]
+ * @psalm-var array
+ */
+ private $missingClasses = array();
+
+ /** @var ?string */
+ private $apcuPrefix;
+
+ /**
+ * @var self[]
+ */
+ private static $registeredLoaders = array();
+
+ /**
+ * @param ?string $vendorDir
+ */
+ public function __construct($vendorDir = null)
+ {
+ $this->vendorDir = $vendorDir;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+ }
+
+ return array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array>
+ */
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array
+ */
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array
+ */
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ /**
+ * @return string[] Array of classname => path
+ * @psalm-return array
+ */
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param string[] $classMap Class to filename map
+ * @psalm-param array $classMap
+ *
+ * @return void
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @return void
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 base directories
+ *
+ * @return void
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ *
+ * @return void
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ *
+ * @return void
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ *
+ * @return void
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ *
+ * @return void
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+ if (null === $this->vendorDir) {
+ return;
+ }
+
+ if ($prepend) {
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+ } else {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ self::$registeredLoaders[$this->vendorDir] = $this;
+ }
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ *
+ * @return void
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+
+ if (null !== $this->vendorDir) {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ }
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return true|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+
+ return null;
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ /**
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ *
+ * @return self[]
+ */
+ public static function getRegisteredLoaders()
+ {
+ return self::$registeredLoaders;
+ }
+
+ /**
+ * @param string $class
+ * @param string $ext
+ * @return string|false
+ */
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath . '\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ if (file_exists($file = $dir . $pathEnd)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param string $file
+ * @return void
+ * @private
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/InstalledVersions.php b/wp-content/plugins/wp-webauthn/vendor/composer/InstalledVersions.php
new file mode 100644
index 00000000..41bc143c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/InstalledVersions.php
@@ -0,0 +1,352 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
+ */
+class InstalledVersions
+{
+ /**
+ * @var mixed[]|null
+ * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null
+ */
+ private static $installed;
+
+ /**
+ * @var bool|null
+ */
+ private static $canGetVendors;
+
+ /**
+ * @var array[]
+ * @psalm-var array}>
+ */
+ private static $installedByVendor = array();
+
+ /**
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
+ *
+ * @return string[]
+ * @psalm-return list
+ */
+ public static function getInstalledPackages()
+ {
+ $packages = array();
+ foreach (self::getInstalled() as $installed) {
+ $packages[] = array_keys($installed['versions']);
+ }
+
+ if (1 === \count($packages)) {
+ return $packages[0];
+ }
+
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+ }
+
+ /**
+ * Returns a list of all package names with a specific type e.g. 'library'
+ *
+ * @param string $type
+ * @return string[]
+ * @psalm-return list
+ */
+ public static function getInstalledPackagesByType($type)
+ {
+ $packagesByType = array();
+
+ foreach (self::getInstalled() as $installed) {
+ foreach ($installed['versions'] as $name => $package) {
+ if (isset($package['type']) && $package['type'] === $type) {
+ $packagesByType[] = $name;
+ }
+ }
+ }
+
+ return $packagesByType;
+ }
+
+ /**
+ * Checks whether the given package is installed
+ *
+ * This also returns true if the package name is provided or replaced by another package
+ *
+ * @param string $packageName
+ * @param bool $includeDevRequirements
+ * @return bool
+ */
+ public static function isInstalled($packageName, $includeDevRequirements = true)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (isset($installed['versions'][$packageName])) {
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks whether the given package satisfies a version constraint
+ *
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+ *
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+ *
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
+ * @param string $packageName
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+ * @return bool
+ */
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
+ {
+ $constraint = $parser->parseConstraints($constraint);
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+ return $provided->matches($constraint);
+ }
+
+ /**
+ * Returns a version constraint representing all the range(s) which are installed for a given package
+ *
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+ * whether a given version of a package is installed, and not just whether it exists
+ *
+ * @param string $packageName
+ * @return string Version constraint usable with composer/semver
+ */
+ public static function getVersionRanges($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ $ranges = array();
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+ }
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+ }
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+ }
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+ }
+
+ return implode(' || ', $ranges);
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getPrettyVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['pretty_version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+ */
+ public static function getReference($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['reference'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['reference'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+ */
+ public static function getInstallPath($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @return array
+ * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+ */
+ public static function getRootPackage()
+ {
+ $installed = self::getInstalled();
+
+ return $installed[0]['root'];
+ }
+
+ /**
+ * Returns the raw installed.php data for custom implementations
+ *
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+ * @return array[]
+ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}
+ */
+ public static function getRawData()
+ {
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = include __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+
+ return self::$installed;
+ }
+
+ /**
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
+ *
+ * @return array[]
+ * @psalm-return list}>
+ */
+ public static function getAllRawData()
+ {
+ return self::getInstalled();
+ }
+
+ /**
+ * Lets you reload the static array from another file
+ *
+ * This is only useful for complex integrations in which a project needs to use
+ * this class but then also needs to execute another project's autoloader in process,
+ * and wants to ensure both projects have access to their version of installed.php.
+ *
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
+ * the data it needs from this class, then call reload() with
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+ * the project in which it runs can then also use this class safely, without
+ * interference between PHPUnit's dependencies and the project's dependencies.
+ *
+ * @param array[] $data A vendor/composer/installed.php data set
+ * @return void
+ *
+ * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data
+ */
+ public static function reload($data)
+ {
+ self::$installed = $data;
+ self::$installedByVendor = array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return list}>
+ */
+ private static function getInstalled()
+ {
+ if (null === self::$canGetVendors) {
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+ }
+
+ $installed = array();
+
+ if (self::$canGetVendors) {
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+ if (isset(self::$installedByVendor[$vendorDir])) {
+ $installed[] = self::$installedByVendor[$vendorDir];
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+ self::$installed = $installed[count($installed) - 1];
+ }
+ }
+ }
+ }
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = require __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+ $installed[] = self::$installed;
+
+ return $installed;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/LICENSE b/wp-content/plugins/wp-webauthn/vendor/composer/LICENSE
new file mode 100644
index 00000000..f27399a0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/autoload_classmap.php b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_classmap.php
new file mode 100644
index 00000000..13811eda
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_classmap.php
@@ -0,0 +1,673 @@
+ $vendorDir . '/beberlei/assert/lib/Assert/Assert.php',
+ 'Assert\\Assertion' => $vendorDir . '/beberlei/assert/lib/Assert/Assertion.php',
+ 'Assert\\AssertionChain' => $vendorDir . '/beberlei/assert/lib/Assert/AssertionChain.php',
+ 'Assert\\AssertionFailedException' => $vendorDir . '/beberlei/assert/lib/Assert/AssertionFailedException.php',
+ 'Assert\\InvalidArgumentException' => $vendorDir . '/beberlei/assert/lib/Assert/InvalidArgumentException.php',
+ 'Assert\\LazyAssertion' => $vendorDir . '/beberlei/assert/lib/Assert/LazyAssertion.php',
+ 'Assert\\LazyAssertionException' => $vendorDir . '/beberlei/assert/lib/Assert/LazyAssertionException.php',
+ 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+ 'Base64Url\\Base64Url' => $vendorDir . '/spomky-labs/base64url/src/Base64Url.php',
+ 'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php',
+ 'Brick\\Math\\BigInteger' => $vendorDir . '/brick/math/src/BigInteger.php',
+ 'Brick\\Math\\BigNumber' => $vendorDir . '/brick/math/src/BigNumber.php',
+ 'Brick\\Math\\BigRational' => $vendorDir . '/brick/math/src/BigRational.php',
+ 'Brick\\Math\\Exception\\DivisionByZeroException' => $vendorDir . '/brick/math/src/Exception/DivisionByZeroException.php',
+ 'Brick\\Math\\Exception\\IntegerOverflowException' => $vendorDir . '/brick/math/src/Exception/IntegerOverflowException.php',
+ 'Brick\\Math\\Exception\\MathException' => $vendorDir . '/brick/math/src/Exception/MathException.php',
+ 'Brick\\Math\\Exception\\NegativeNumberException' => $vendorDir . '/brick/math/src/Exception/NegativeNumberException.php',
+ 'Brick\\Math\\Exception\\NumberFormatException' => $vendorDir . '/brick/math/src/Exception/NumberFormatException.php',
+ 'Brick\\Math\\Exception\\RoundingNecessaryException' => $vendorDir . '/brick/math/src/Exception/RoundingNecessaryException.php',
+ 'Brick\\Math\\Internal\\Calculator' => $vendorDir . '/brick/math/src/Internal/Calculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/BcMathCalculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/GmpCalculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/NativeCalculator.php',
+ 'Brick\\Math\\RoundingMode' => $vendorDir . '/brick/math/src/RoundingMode.php',
+ 'CBOR\\AbstractCBORObject' => $vendorDir . '/spomky-labs/cbor-php/src/AbstractCBORObject.php',
+ 'CBOR\\ByteStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/ByteStringObject.php',
+ 'CBOR\\ByteStringWithChunkObject' => $vendorDir . '/spomky-labs/cbor-php/src/ByteStringWithChunkObject.php',
+ 'CBOR\\CBORObject' => $vendorDir . '/spomky-labs/cbor-php/src/CBORObject.php',
+ 'CBOR\\Decoder' => $vendorDir . '/spomky-labs/cbor-php/src/Decoder.php',
+ 'CBOR\\DecoderInterface' => $vendorDir . '/spomky-labs/cbor-php/src/DecoderInterface.php',
+ 'CBOR\\IndefiniteLengthByteStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthByteStringObject.php',
+ 'CBOR\\IndefiniteLengthListObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php',
+ 'CBOR\\IndefiniteLengthMapObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php',
+ 'CBOR\\IndefiniteLengthTextStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php',
+ 'CBOR\\InfiniteListObject' => $vendorDir . '/spomky-labs/cbor-php/src/InfiniteListObject.php',
+ 'CBOR\\InfiniteMapObject' => $vendorDir . '/spomky-labs/cbor-php/src/InfiniteMapObject.php',
+ 'CBOR\\LengthCalculator' => $vendorDir . '/spomky-labs/cbor-php/src/LengthCalculator.php',
+ 'CBOR\\ListObject' => $vendorDir . '/spomky-labs/cbor-php/src/ListObject.php',
+ 'CBOR\\MapItem' => $vendorDir . '/spomky-labs/cbor-php/src/MapItem.php',
+ 'CBOR\\MapObject' => $vendorDir . '/spomky-labs/cbor-php/src/MapObject.php',
+ 'CBOR\\NegativeIntegerObject' => $vendorDir . '/spomky-labs/cbor-php/src/NegativeIntegerObject.php',
+ 'CBOR\\Normalizable' => $vendorDir . '/spomky-labs/cbor-php/src/Normalizable.php',
+ 'CBOR\\OtherObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject.php',
+ 'CBOR\\OtherObject\\BreakObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/BreakObject.php',
+ 'CBOR\\OtherObject\\DoublePrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/DoublePrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\FalseObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/FalseObject.php',
+ 'CBOR\\OtherObject\\GenericObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/GenericObject.php',
+ 'CBOR\\OtherObject\\HalfPrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\NullObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/NullObject.php',
+ 'CBOR\\OtherObject\\OtherObjectManager' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php',
+ 'CBOR\\OtherObject\\OtherObjectManagerInterface' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php',
+ 'CBOR\\OtherObject\\SimpleObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/SimpleObject.php',
+ 'CBOR\\OtherObject\\SinglePrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\TrueObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/TrueObject.php',
+ 'CBOR\\OtherObject\\UndefinedObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php',
+ 'CBOR\\SignedIntegerObject' => $vendorDir . '/spomky-labs/cbor-php/src/SignedIntegerObject.php',
+ 'CBOR\\Stream' => $vendorDir . '/spomky-labs/cbor-php/src/Stream.php',
+ 'CBOR\\StringStream' => $vendorDir . '/spomky-labs/cbor-php/src/StringStream.php',
+ 'CBOR\\Tag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag.php',
+ 'CBOR\\TagObject' => $vendorDir . '/spomky-labs/cbor-php/src/TagObject.php',
+ 'CBOR\\Tag\\Base16EncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php',
+ 'CBOR\\Tag\\Base64EncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php',
+ 'CBOR\\Tag\\Base64Tag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64Tag.php',
+ 'CBOR\\Tag\\Base64UrlEncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php',
+ 'CBOR\\Tag\\Base64UrlTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php',
+ 'CBOR\\Tag\\BigFloatTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/BigFloatTag.php',
+ 'CBOR\\Tag\\CBOREncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php',
+ 'CBOR\\Tag\\CBORTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/CBORTag.php',
+ 'CBOR\\Tag\\DatetimeTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/DatetimeTag.php',
+ 'CBOR\\Tag\\DecimalFractionTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php',
+ 'CBOR\\Tag\\EpochTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/EpochTag.php',
+ 'CBOR\\Tag\\GenericTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/GenericTag.php',
+ 'CBOR\\Tag\\MimeTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/MimeTag.php',
+ 'CBOR\\Tag\\NegativeBigIntegerTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php',
+ 'CBOR\\Tag\\PositiveBigIntegerTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/PositiveBigIntegerTag.php',
+ 'CBOR\\Tag\\TagManager' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagManager.php',
+ 'CBOR\\Tag\\TagManagerInterface' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php',
+ 'CBOR\\Tag\\TagObjectManager' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagObjectManager.php',
+ 'CBOR\\Tag\\TimestampTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TimestampTag.php',
+ 'CBOR\\Tag\\UnsignedBigIntegerTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php',
+ 'CBOR\\Tag\\UriTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/UriTag.php',
+ 'CBOR\\TextStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/TextStringObject.php',
+ 'CBOR\\TextStringWithChunkObject' => $vendorDir . '/spomky-labs/cbor-php/src/TextStringWithChunkObject.php',
+ 'CBOR\\UnsignedIntegerObject' => $vendorDir . '/spomky-labs/cbor-php/src/UnsignedIntegerObject.php',
+ 'CBOR\\Utils' => $vendorDir . '/spomky-labs/cbor-php/src/Utils.php',
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+ 'Cose\\Algorithm\\Algorithm' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Algorithm.php',
+ 'Cose\\Algorithm\\Mac\\HS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS256.php',
+ 'Cose\\Algorithm\\Mac\\HS256Truncated64' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS256Truncated64.php',
+ 'Cose\\Algorithm\\Mac\\HS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS384.php',
+ 'Cose\\Algorithm\\Mac\\HS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS512.php',
+ 'Cose\\Algorithm\\Mac\\Hmac' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/Hmac.php',
+ 'Cose\\Algorithm\\Mac\\Mac' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/Mac.php',
+ 'Cose\\Algorithm\\Manager' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Manager.php',
+ 'Cose\\Algorithm\\ManagerFactory' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/ManagerFactory.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ECDSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECDSA.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ECSignature' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECSignature.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES256K' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256K.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES384.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES512.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\ED256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/ED256.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\ED512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/ED512.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\Ed25519' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed25519.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\EdDSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/EdDSA.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS256.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS384.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS512.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PSSRSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PSSRSA.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS1' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS1.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS256.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS384.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS512.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RSA.php',
+ 'Cose\\Algorithm\\Signature\\Signature' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/Signature.php',
+ 'Cose\\Algorithms' => $vendorDir . '/web-auth/cose-lib/src/Algorithms.php',
+ 'Cose\\BigInteger' => $vendorDir . '/web-auth/cose-lib/src/BigInteger.php',
+ 'Cose\\Hash' => $vendorDir . '/web-auth/cose-lib/src/Hash.php',
+ 'Cose\\Key\\Ec2Key' => $vendorDir . '/web-auth/cose-lib/src/Key/Ec2Key.php',
+ 'Cose\\Key\\Key' => $vendorDir . '/web-auth/cose-lib/src/Key/Key.php',
+ 'Cose\\Key\\OkpKey' => $vendorDir . '/web-auth/cose-lib/src/Key/OkpKey.php',
+ 'Cose\\Key\\RsaKey' => $vendorDir . '/web-auth/cose-lib/src/Key/RsaKey.php',
+ 'Cose\\Key\\SymmetricKey' => $vendorDir . '/web-auth/cose-lib/src/Key/SymmetricKey.php',
+ 'Cose\\Verifier' => $vendorDir . '/web-auth/cose-lib/src/Verifier.php',
+ 'FG\\ASN1\\ASNObject' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/ASNObject.php',
+ 'FG\\ASN1\\AbstractString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/AbstractString.php',
+ 'FG\\ASN1\\AbstractTime' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/AbstractTime.php',
+ 'FG\\ASN1\\Base128' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Base128.php',
+ 'FG\\ASN1\\Composite\\AttributeTypeAndValue' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Composite/AttributeTypeAndValue.php',
+ 'FG\\ASN1\\Composite\\RDNString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Composite/RDNString.php',
+ 'FG\\ASN1\\Composite\\RelativeDistinguishedName' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Composite/RelativeDistinguishedName.php',
+ 'FG\\ASN1\\Construct' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Construct.php',
+ 'FG\\ASN1\\Exception\\NotImplementedException' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Exception/NotImplementedException.php',
+ 'FG\\ASN1\\Exception\\ParserException' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Exception/ParserException.php',
+ 'FG\\ASN1\\ExplicitlyTaggedObject' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/ExplicitlyTaggedObject.php',
+ 'FG\\ASN1\\Identifier' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Identifier.php',
+ 'FG\\ASN1\\OID' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/OID.php',
+ 'FG\\ASN1\\Parsable' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Parsable.php',
+ 'FG\\ASN1\\TemplateParser' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/TemplateParser.php',
+ 'FG\\ASN1\\Universal\\BMPString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/BMPString.php',
+ 'FG\\ASN1\\Universal\\BitString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/BitString.php',
+ 'FG\\ASN1\\Universal\\Boolean' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/Boolean.php',
+ 'FG\\ASN1\\Universal\\CharacterString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/CharacterString.php',
+ 'FG\\ASN1\\Universal\\Enumerated' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/Enumerated.php',
+ 'FG\\ASN1\\Universal\\GeneralString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/GeneralString.php',
+ 'FG\\ASN1\\Universal\\GeneralizedTime' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/GeneralizedTime.php',
+ 'FG\\ASN1\\Universal\\GraphicString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/GraphicString.php',
+ 'FG\\ASN1\\Universal\\IA5String' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/IA5String.php',
+ 'FG\\ASN1\\Universal\\Integer' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/Integer.php',
+ 'FG\\ASN1\\Universal\\NullObject' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/NullObject.php',
+ 'FG\\ASN1\\Universal\\NumericString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/NumericString.php',
+ 'FG\\ASN1\\Universal\\ObjectDescriptor' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/ObjectDescriptor.php',
+ 'FG\\ASN1\\Universal\\ObjectIdentifier' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/ObjectIdentifier.php',
+ 'FG\\ASN1\\Universal\\OctetString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/OctetString.php',
+ 'FG\\ASN1\\Universal\\PrintableString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/PrintableString.php',
+ 'FG\\ASN1\\Universal\\RelativeObjectIdentifier' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/RelativeObjectIdentifier.php',
+ 'FG\\ASN1\\Universal\\Sequence' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/Sequence.php',
+ 'FG\\ASN1\\Universal\\Set' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/Set.php',
+ 'FG\\ASN1\\Universal\\T61String' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/T61String.php',
+ 'FG\\ASN1\\Universal\\UTCTime' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/UTCTime.php',
+ 'FG\\ASN1\\Universal\\UTF8String' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/UTF8String.php',
+ 'FG\\ASN1\\Universal\\UniversalString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/UniversalString.php',
+ 'FG\\ASN1\\Universal\\VisibleString' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/Universal/VisibleString.php',
+ 'FG\\ASN1\\UnknownConstructedObject' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/UnknownConstructedObject.php',
+ 'FG\\ASN1\\UnknownObject' => $vendorDir . '/fgrosse/phpasn1/lib/ASN1/UnknownObject.php',
+ 'FG\\Utility\\BigInteger' => $vendorDir . '/fgrosse/phpasn1/lib/Utility/BigInteger.php',
+ 'FG\\Utility\\BigIntegerBcmath' => $vendorDir . '/fgrosse/phpasn1/lib/Utility/BigIntegerBcmath.php',
+ 'FG\\Utility\\BigIntegerGmp' => $vendorDir . '/fgrosse/phpasn1/lib/Utility/BigIntegerGmp.php',
+ 'FG\\X509\\AlgorithmIdentifier' => $vendorDir . '/fgrosse/phpasn1/lib/X509/AlgorithmIdentifier.php',
+ 'FG\\X509\\CSR\\Attributes' => $vendorDir . '/fgrosse/phpasn1/lib/X509/CSR/Attributes.php',
+ 'FG\\X509\\CSR\\CSR' => $vendorDir . '/fgrosse/phpasn1/lib/X509/CSR/CSR.php',
+ 'FG\\X509\\CertificateExtensions' => $vendorDir . '/fgrosse/phpasn1/lib/X509/CertificateExtensions.php',
+ 'FG\\X509\\CertificateSubject' => $vendorDir . '/fgrosse/phpasn1/lib/X509/CertificateSubject.php',
+ 'FG\\X509\\PrivateKey' => $vendorDir . '/fgrosse/phpasn1/lib/X509/PrivateKey.php',
+ 'FG\\X509\\PublicKey' => $vendorDir . '/fgrosse/phpasn1/lib/X509/PublicKey.php',
+ 'FG\\X509\\SAN\\DNSName' => $vendorDir . '/fgrosse/phpasn1/lib/X509/SAN/DNSName.php',
+ 'FG\\X509\\SAN\\IPAddress' => $vendorDir . '/fgrosse/phpasn1/lib/X509/SAN/IPAddress.php',
+ 'FG\\X509\\SAN\\SubjectAlternativeNames' => $vendorDir . '/fgrosse/phpasn1/lib/X509/SAN/SubjectAlternativeNames.php',
+ 'Http\\Message\\MessageFactory' => $vendorDir . '/php-http/message-factory/src/MessageFactory.php',
+ 'Http\\Message\\RequestFactory' => $vendorDir . '/php-http/message-factory/src/RequestFactory.php',
+ 'Http\\Message\\ResponseFactory' => $vendorDir . '/php-http/message-factory/src/ResponseFactory.php',
+ 'Http\\Message\\StreamFactory' => $vendorDir . '/php-http/message-factory/src/StreamFactory.php',
+ 'Http\\Message\\UriFactory' => $vendorDir . '/php-http/message-factory/src/UriFactory.php',
+ 'Jose\\Component\\Core\\Algorithm' => $vendorDir . '/web-token/jwt-core/Algorithm.php',
+ 'Jose\\Component\\Core\\AlgorithmManager' => $vendorDir . '/web-token/jwt-core/AlgorithmManager.php',
+ 'Jose\\Component\\Core\\AlgorithmManagerFactory' => $vendorDir . '/web-token/jwt-core/AlgorithmManagerFactory.php',
+ 'Jose\\Component\\Core\\JWK' => $vendorDir . '/web-token/jwt-core/JWK.php',
+ 'Jose\\Component\\Core\\JWKSet' => $vendorDir . '/web-token/jwt-core/JWKSet.php',
+ 'Jose\\Component\\Core\\JWT' => $vendorDir . '/web-token/jwt-core/JWT.php',
+ 'Jose\\Component\\Core\\Util\\BigInteger' => $vendorDir . '/web-token/jwt-core/Util/BigInteger.php',
+ 'Jose\\Component\\Core\\Util\\ECKey' => $vendorDir . '/web-token/jwt-core/Util/ECKey.php',
+ 'Jose\\Component\\Core\\Util\\ECSignature' => $vendorDir . '/web-token/jwt-core/Util/ECSignature.php',
+ 'Jose\\Component\\Core\\Util\\Hash' => $vendorDir . '/web-token/jwt-core/Util/Hash.php',
+ 'Jose\\Component\\Core\\Util\\JsonConverter' => $vendorDir . '/web-token/jwt-core/Util/JsonConverter.php',
+ 'Jose\\Component\\Core\\Util\\KeyChecker' => $vendorDir . '/web-token/jwt-core/Util/KeyChecker.php',
+ 'Jose\\Component\\Core\\Util\\RSAKey' => $vendorDir . '/web-token/jwt-core/Util/RSAKey.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\AlgorithmAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/AlgorithmAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES256KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/ES256KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES384KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/ES384KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES512KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/ES512KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS256KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/HS256KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS384KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/HS384KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS512KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/HS512KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyAnalyzerManager' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/KeyAnalyzerManager.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyIdentifierAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/KeyIdentifierAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeysetAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/KeysetAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeysetAnalyzerManager' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/KeysetAnalyzerManager.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\Message' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/Message.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MessageBag' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/MessageBag.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MixedKeyTypes' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/MixedKeyTypes.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MixedPublicAndPrivateKeys' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/MixedPublicAndPrivateKeys.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\NoneAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/NoneAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\OctAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/OctAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\RsaAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/RsaAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\UsageAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/UsageAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ZxcvbnKeyAnalyzer' => $vendorDir . '/web-token/jwt-key-mgmt/Analyzer/ZxcvbnKeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\JKUFactory' => $vendorDir . '/web-token/jwt-key-mgmt/JKUFactory.php',
+ 'Jose\\Component\\KeyManagement\\JWKFactory' => $vendorDir . '/web-token/jwt-key-mgmt/JWKFactory.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\ECKey' => $vendorDir . '/web-token/jwt-key-mgmt/KeyConverter/ECKey.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\KeyConverter' => $vendorDir . '/web-token/jwt-key-mgmt/KeyConverter/KeyConverter.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\RSAKey' => $vendorDir . '/web-token/jwt-key-mgmt/KeyConverter/RSAKey.php',
+ 'Jose\\Component\\KeyManagement\\UrlKeySetFactory' => $vendorDir . '/web-token/jwt-key-mgmt/UrlKeySetFactory.php',
+ 'Jose\\Component\\KeyManagement\\X5UFactory' => $vendorDir . '/web-token/jwt-key-mgmt/X5UFactory.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ECDSA' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/ECDSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES256' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/ES256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES384' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/ES384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES512' => $vendorDir . '/web-token/jwt-signature-algorithm-ecdsa/ES512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\EdDSA' => $vendorDir . '/web-token/jwt-signature-algorithm-eddsa/EdDSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\MacAlgorithm' => $vendorDir . '/web-token/jwt-signature/Algorithm/MacAlgorithm.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS256' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/PS256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS384' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/PS384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS512' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/PS512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS256' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RS256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS384' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RS384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS512' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RS512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSA' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSAPKCS1' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RSAPKCS1.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSAPSS' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/RSAPSS.php',
+ 'Jose\\Component\\Signature\\Algorithm\\SignatureAlgorithm' => $vendorDir . '/web-token/jwt-signature/Algorithm/SignatureAlgorithm.php',
+ 'Jose\\Component\\Signature\\Algorithm\\Util\\RSA' => $vendorDir . '/web-token/jwt-signature-algorithm-rsa/Util/RSA.php',
+ 'Jose\\Component\\Signature\\JWS' => $vendorDir . '/web-token/jwt-signature/JWS.php',
+ 'Jose\\Component\\Signature\\JWSBuilder' => $vendorDir . '/web-token/jwt-signature/JWSBuilder.php',
+ 'Jose\\Component\\Signature\\JWSBuilderFactory' => $vendorDir . '/web-token/jwt-signature/JWSBuilderFactory.php',
+ 'Jose\\Component\\Signature\\JWSLoader' => $vendorDir . '/web-token/jwt-signature/JWSLoader.php',
+ 'Jose\\Component\\Signature\\JWSLoaderFactory' => $vendorDir . '/web-token/jwt-signature/JWSLoaderFactory.php',
+ 'Jose\\Component\\Signature\\JWSTokenSupport' => $vendorDir . '/web-token/jwt-signature/JWSTokenSupport.php',
+ 'Jose\\Component\\Signature\\JWSVerifier' => $vendorDir . '/web-token/jwt-signature/JWSVerifier.php',
+ 'Jose\\Component\\Signature\\JWSVerifierFactory' => $vendorDir . '/web-token/jwt-signature/JWSVerifierFactory.php',
+ 'Jose\\Component\\Signature\\Serializer\\CompactSerializer' => $vendorDir . '/web-token/jwt-signature/Serializer/CompactSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JSONFlattenedSerializer' => $vendorDir . '/web-token/jwt-signature/Serializer/JSONFlattenedSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JSONGeneralSerializer' => $vendorDir . '/web-token/jwt-signature/Serializer/JSONGeneralSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializer' => $vendorDir . '/web-token/jwt-signature/Serializer/JWSSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializerManager' => $vendorDir . '/web-token/jwt-signature/Serializer/JWSSerializerManager.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializerManagerFactory' => $vendorDir . '/web-token/jwt-signature/Serializer/JWSSerializerManagerFactory.php',
+ 'Jose\\Component\\Signature\\Serializer\\Serializer' => $vendorDir . '/web-token/jwt-signature/Serializer/Serializer.php',
+ 'Jose\\Component\\Signature\\Signature' => $vendorDir . '/web-token/jwt-signature/Signature.php',
+ 'League\\Uri\\Contracts\\AuthorityInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/AuthorityInterface.php',
+ 'League\\Uri\\Contracts\\DataPathInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/DataPathInterface.php',
+ 'League\\Uri\\Contracts\\DomainHostInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/DomainHostInterface.php',
+ 'League\\Uri\\Contracts\\FragmentInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/FragmentInterface.php',
+ 'League\\Uri\\Contracts\\HostInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/HostInterface.php',
+ 'League\\Uri\\Contracts\\IpHostInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/IpHostInterface.php',
+ 'League\\Uri\\Contracts\\PathInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/PathInterface.php',
+ 'League\\Uri\\Contracts\\PortInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/PortInterface.php',
+ 'League\\Uri\\Contracts\\QueryInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/QueryInterface.php',
+ 'League\\Uri\\Contracts\\SegmentedPathInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php',
+ 'League\\Uri\\Contracts\\UriComponentInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/UriComponentInterface.php',
+ 'League\\Uri\\Contracts\\UriException' => $vendorDir . '/league/uri-interfaces/src/Contracts/UriException.php',
+ 'League\\Uri\\Contracts\\UriInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/UriInterface.php',
+ 'League\\Uri\\Contracts\\UserInfoInterface' => $vendorDir . '/league/uri-interfaces/src/Contracts/UserInfoInterface.php',
+ 'League\\Uri\\Exceptions\\FileinfoSupportMissing' => $vendorDir . '/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php',
+ 'League\\Uri\\Exceptions\\IdnSupportMissing' => $vendorDir . '/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php',
+ 'League\\Uri\\Exceptions\\IdnaConversionFailed' => $vendorDir . '/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php',
+ 'League\\Uri\\Exceptions\\SyntaxError' => $vendorDir . '/league/uri-interfaces/src/Exceptions/SyntaxError.php',
+ 'League\\Uri\\Exceptions\\TemplateCanNotBeExpanded' => $vendorDir . '/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php',
+ 'League\\Uri\\Http' => $vendorDir . '/league/uri/src/Http.php',
+ 'League\\Uri\\HttpFactory' => $vendorDir . '/league/uri/src/HttpFactory.php',
+ 'League\\Uri\\Idna\\Idna' => $vendorDir . '/league/uri-interfaces/src/Idna/Idna.php',
+ 'League\\Uri\\Idna\\IdnaInfo' => $vendorDir . '/league/uri-interfaces/src/Idna/IdnaInfo.php',
+ 'League\\Uri\\Uri' => $vendorDir . '/league/uri/src/Uri.php',
+ 'League\\Uri\\UriInfo' => $vendorDir . '/league/uri/src/UriInfo.php',
+ 'League\\Uri\\UriResolver' => $vendorDir . '/league/uri/src/UriResolver.php',
+ 'League\\Uri\\UriString' => $vendorDir . '/league/uri/src/UriString.php',
+ 'League\\Uri\\UriTemplate' => $vendorDir . '/league/uri/src/UriTemplate.php',
+ 'League\\Uri\\UriTemplate\\Expression' => $vendorDir . '/league/uri/src/UriTemplate/Expression.php',
+ 'League\\Uri\\UriTemplate\\Template' => $vendorDir . '/league/uri/src/UriTemplate/Template.php',
+ 'League\\Uri\\UriTemplate\\VarSpecifier' => $vendorDir . '/league/uri/src/UriTemplate/VarSpecifier.php',
+ 'League\\Uri\\UriTemplate\\VariableBag' => $vendorDir . '/league/uri/src/UriTemplate/VariableBag.php',
+ 'Nyholm\\Psr7Server\\ServerRequestCreator' => $vendorDir . '/nyholm/psr7-server/src/ServerRequestCreator.php',
+ 'Nyholm\\Psr7Server\\ServerRequestCreatorInterface' => $vendorDir . '/nyholm/psr7-server/src/ServerRequestCreatorInterface.php',
+ 'Nyholm\\Psr7\\Factory\\HttplugFactory' => $vendorDir . '/nyholm/psr7/src/Factory/HttplugFactory.php',
+ 'Nyholm\\Psr7\\Factory\\Psr17Factory' => $vendorDir . '/nyholm/psr7/src/Factory/Psr17Factory.php',
+ 'Nyholm\\Psr7\\MessageTrait' => $vendorDir . '/nyholm/psr7/src/MessageTrait.php',
+ 'Nyholm\\Psr7\\Request' => $vendorDir . '/nyholm/psr7/src/Request.php',
+ 'Nyholm\\Psr7\\RequestTrait' => $vendorDir . '/nyholm/psr7/src/RequestTrait.php',
+ 'Nyholm\\Psr7\\Response' => $vendorDir . '/nyholm/psr7/src/Response.php',
+ 'Nyholm\\Psr7\\ServerRequest' => $vendorDir . '/nyholm/psr7/src/ServerRequest.php',
+ 'Nyholm\\Psr7\\Stream' => $vendorDir . '/nyholm/psr7/src/Stream.php',
+ 'Nyholm\\Psr7\\UploadedFile' => $vendorDir . '/nyholm/psr7/src/UploadedFile.php',
+ 'Nyholm\\Psr7\\Uri' => $vendorDir . '/nyholm/psr7/src/Uri.php',
+ 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+ 'Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php',
+ 'Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php',
+ 'Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php',
+ 'Psr\\Http\\Client\\RequestExceptionInterface' => $vendorDir . '/psr/http-client/src/RequestExceptionInterface.php',
+ 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
+ 'Ramsey\\Collection\\AbstractArray' => $vendorDir . '/ramsey/collection/src/AbstractArray.php',
+ 'Ramsey\\Collection\\AbstractCollection' => $vendorDir . '/ramsey/collection/src/AbstractCollection.php',
+ 'Ramsey\\Collection\\AbstractSet' => $vendorDir . '/ramsey/collection/src/AbstractSet.php',
+ 'Ramsey\\Collection\\ArrayInterface' => $vendorDir . '/ramsey/collection/src/ArrayInterface.php',
+ 'Ramsey\\Collection\\Collection' => $vendorDir . '/ramsey/collection/src/Collection.php',
+ 'Ramsey\\Collection\\CollectionInterface' => $vendorDir . '/ramsey/collection/src/CollectionInterface.php',
+ 'Ramsey\\Collection\\DoubleEndedQueue' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueue.php',
+ 'Ramsey\\Collection\\DoubleEndedQueueInterface' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueueInterface.php',
+ 'Ramsey\\Collection\\Exception\\CollectionMismatchException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionMismatchException.php',
+ 'Ramsey\\Collection\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidArgumentException.php',
+ 'Ramsey\\Collection\\Exception\\InvalidSortOrderException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidSortOrderException.php',
+ 'Ramsey\\Collection\\Exception\\NoSuchElementException' => $vendorDir . '/ramsey/collection/src/Exception/NoSuchElementException.php',
+ 'Ramsey\\Collection\\Exception\\OutOfBoundsException' => $vendorDir . '/ramsey/collection/src/Exception/OutOfBoundsException.php',
+ 'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/collection/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Collection\\Exception\\ValueExtractionException' => $vendorDir . '/ramsey/collection/src/Exception/ValueExtractionException.php',
+ 'Ramsey\\Collection\\GenericArray' => $vendorDir . '/ramsey/collection/src/GenericArray.php',
+ 'Ramsey\\Collection\\Map\\AbstractMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractMap.php',
+ 'Ramsey\\Collection\\Map\\AbstractTypedMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractTypedMap.php',
+ 'Ramsey\\Collection\\Map\\AssociativeArrayMap' => $vendorDir . '/ramsey/collection/src/Map/AssociativeArrayMap.php',
+ 'Ramsey\\Collection\\Map\\MapInterface' => $vendorDir . '/ramsey/collection/src/Map/MapInterface.php',
+ 'Ramsey\\Collection\\Map\\NamedParameterMap' => $vendorDir . '/ramsey/collection/src/Map/NamedParameterMap.php',
+ 'Ramsey\\Collection\\Map\\TypedMap' => $vendorDir . '/ramsey/collection/src/Map/TypedMap.php',
+ 'Ramsey\\Collection\\Map\\TypedMapInterface' => $vendorDir . '/ramsey/collection/src/Map/TypedMapInterface.php',
+ 'Ramsey\\Collection\\Queue' => $vendorDir . '/ramsey/collection/src/Queue.php',
+ 'Ramsey\\Collection\\QueueInterface' => $vendorDir . '/ramsey/collection/src/QueueInterface.php',
+ 'Ramsey\\Collection\\Set' => $vendorDir . '/ramsey/collection/src/Set.php',
+ 'Ramsey\\Collection\\Tool\\TypeTrait' => $vendorDir . '/ramsey/collection/src/Tool/TypeTrait.php',
+ 'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueExtractorTrait.php',
+ 'Ramsey\\Collection\\Tool\\ValueToStringTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueToStringTrait.php',
+ 'Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php',
+ 'Ramsey\\Uuid\\Builder\\BuilderCollection' => $vendorDir . '/ramsey/uuid/src/Builder/BuilderCollection.php',
+ 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\FallbackBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/FallbackBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => $vendorDir . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
+ 'Ramsey\\Uuid\\Codec\\CodecInterface' => $vendorDir . '/ramsey/uuid/src/Codec/CodecInterface.php',
+ 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => $vendorDir . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
+ 'Ramsey\\Uuid\\Codec\\StringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/StringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
+ 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
+ 'Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php',
+ 'Ramsey\\Uuid\\DeprecatedUuidInterface' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidInterface.php',
+ 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php',
+ 'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => $vendorDir . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php',
+ 'Ramsey\\Uuid\\Exception\\DateTimeException' => $vendorDir . '/ramsey/uuid/src/Exception/DateTimeException.php',
+ 'Ramsey\\Uuid\\Exception\\DceSecurityException' => $vendorDir . '/ramsey/uuid/src/Exception/DceSecurityException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidArgumentException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidBytesException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidBytesException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
+ 'Ramsey\\Uuid\\Exception\\NameException' => $vendorDir . '/ramsey/uuid/src/Exception/NameException.php',
+ 'Ramsey\\Uuid\\Exception\\NodeException' => $vendorDir . '/ramsey/uuid/src/Exception/NodeException.php',
+ 'Ramsey\\Uuid\\Exception\\RandomSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/RandomSourceException.php',
+ 'Ramsey\\Uuid\\Exception\\TimeSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/TimeSourceException.php',
+ 'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => $vendorDir . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => $vendorDir . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php',
+ 'Ramsey\\Uuid\\FeatureSet' => $vendorDir . '/ramsey/uuid/src/FeatureSet.php',
+ 'Ramsey\\Uuid\\Fields\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Fields/FieldsInterface.php',
+ 'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => $vendorDir . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php',
+ 'Ramsey\\Uuid\\Generator\\CombGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/CombGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Guid\\Fields' => $vendorDir . '/ramsey/uuid/src/Guid/Fields.php',
+ 'Ramsey\\Uuid\\Guid\\Guid' => $vendorDir . '/ramsey/uuid/src/Guid/Guid.php',
+ 'Ramsey\\Uuid\\Guid\\GuidBuilder' => $vendorDir . '/ramsey/uuid/src/Guid/GuidBuilder.php',
+ 'Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => $vendorDir . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php',
+ 'Ramsey\\Uuid\\Math\\BrickMathCalculator' => $vendorDir . '/ramsey/uuid/src/Math/BrickMathCalculator.php',
+ 'Ramsey\\Uuid\\Math\\CalculatorInterface' => $vendorDir . '/ramsey/uuid/src/Math/CalculatorInterface.php',
+ 'Ramsey\\Uuid\\Math\\RoundingMode' => $vendorDir . '/ramsey/uuid/src/Math/RoundingMode.php',
+ 'Ramsey\\Uuid\\Nonstandard\\Fields' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Fields.php',
+ 'Ramsey\\Uuid\\Nonstandard\\Uuid' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Uuid.php',
+ 'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php',
+ 'Ramsey\\Uuid\\Nonstandard\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidV6.php',
+ 'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php',
+ 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => $vendorDir . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
+ 'Ramsey\\Uuid\\Rfc4122\\Fields' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Fields.php',
+ 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php',
+ 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilTrait.php',
+ 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilUuid.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidInterface.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV1.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV2' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV2.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV3.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV4.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV5.php',
+ 'Ramsey\\Uuid\\Rfc4122\\Validator' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Validator.php',
+ 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VariantTrait.php',
+ 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VersionTrait.php',
+ 'Ramsey\\Uuid\\Type\\Decimal' => $vendorDir . '/ramsey/uuid/src/Type/Decimal.php',
+ 'Ramsey\\Uuid\\Type\\Hexadecimal' => $vendorDir . '/ramsey/uuid/src/Type/Hexadecimal.php',
+ 'Ramsey\\Uuid\\Type\\Integer' => $vendorDir . '/ramsey/uuid/src/Type/Integer.php',
+ 'Ramsey\\Uuid\\Type\\NumberInterface' => $vendorDir . '/ramsey/uuid/src/Type/NumberInterface.php',
+ 'Ramsey\\Uuid\\Type\\Time' => $vendorDir . '/ramsey/uuid/src/Type/Time.php',
+ 'Ramsey\\Uuid\\Type\\TypeInterface' => $vendorDir . '/ramsey/uuid/src/Type/TypeInterface.php',
+ 'Ramsey\\Uuid\\Uuid' => $vendorDir . '/ramsey/uuid/src/Uuid.php',
+ 'Ramsey\\Uuid\\UuidFactory' => $vendorDir . '/ramsey/uuid/src/UuidFactory.php',
+ 'Ramsey\\Uuid\\UuidFactoryInterface' => $vendorDir . '/ramsey/uuid/src/UuidFactoryInterface.php',
+ 'Ramsey\\Uuid\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/UuidInterface.php',
+ 'Ramsey\\Uuid\\Validator\\GenericValidator' => $vendorDir . '/ramsey/uuid/src/Validator/GenericValidator.php',
+ 'Ramsey\\Uuid\\Validator\\ValidatorInterface' => $vendorDir . '/ramsey/uuid/src/Validator/ValidatorInterface.php',
+ 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php',
+ 'Safe\\DateTime' => $vendorDir . '/thecodingmachine/safe/lib/DateTime.php',
+ 'Safe\\DateTimeImmutable' => $vendorDir . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
+ 'Safe\\Exceptions\\ApacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
+ 'Safe\\Exceptions\\ApcException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/ApcException.php',
+ 'Safe\\Exceptions\\ApcuException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
+ 'Safe\\Exceptions\\ArrayException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
+ 'Safe\\Exceptions\\Bzip2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
+ 'Safe\\Exceptions\\CalendarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
+ 'Safe\\Exceptions\\ClassobjException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
+ 'Safe\\Exceptions\\ComException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
+ 'Safe\\Exceptions\\CubridException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
+ 'Safe\\Exceptions\\CurlException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
+ 'Safe\\Exceptions\\DatetimeException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
+ 'Safe\\Exceptions\\DirException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
+ 'Safe\\Exceptions\\EioException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
+ 'Safe\\Exceptions\\ErrorfuncException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
+ 'Safe\\Exceptions\\ExecException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
+ 'Safe\\Exceptions\\FileinfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
+ 'Safe\\Exceptions\\FilesystemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
+ 'Safe\\Exceptions\\FilterException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
+ 'Safe\\Exceptions\\FpmException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
+ 'Safe\\Exceptions\\FtpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
+ 'Safe\\Exceptions\\FunchandException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
+ 'Safe\\Exceptions\\GmpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
+ 'Safe\\Exceptions\\GnupgException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
+ 'Safe\\Exceptions\\HashException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
+ 'Safe\\Exceptions\\IbaseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
+ 'Safe\\Exceptions\\IbmDb2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
+ 'Safe\\Exceptions\\IconvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
+ 'Safe\\Exceptions\\ImageException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
+ 'Safe\\Exceptions\\ImapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
+ 'Safe\\Exceptions\\InfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
+ 'Safe\\Exceptions\\IngresiiException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IngresiiException.php',
+ 'Safe\\Exceptions\\InotifyException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
+ 'Safe\\Exceptions\\JsonException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
+ 'Safe\\Exceptions\\LdapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
+ 'Safe\\Exceptions\\LibeventException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/LibeventException.php',
+ 'Safe\\Exceptions\\LibxmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
+ 'Safe\\Exceptions\\LzfException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
+ 'Safe\\Exceptions\\MailparseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
+ 'Safe\\Exceptions\\MbstringException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
+ 'Safe\\Exceptions\\MiscException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
+ 'Safe\\Exceptions\\MsqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MsqlException.php',
+ 'Safe\\Exceptions\\MssqlException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/MssqlException.php',
+ 'Safe\\Exceptions\\MysqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
+ 'Safe\\Exceptions\\MysqliException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqliException.php',
+ 'Safe\\Exceptions\\MysqlndMsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php',
+ 'Safe\\Exceptions\\MysqlndQcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php',
+ 'Safe\\Exceptions\\NetworkException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
+ 'Safe\\Exceptions\\Oci8Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
+ 'Safe\\Exceptions\\OpcacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
+ 'Safe\\Exceptions\\OpensslException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
+ 'Safe\\Exceptions\\OutcontrolException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
+ 'Safe\\Exceptions\\PasswordException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PasswordException.php',
+ 'Safe\\Exceptions\\PcntlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
+ 'Safe\\Exceptions\\PcreException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
+ 'Safe\\Exceptions\\PdfException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PdfException.php',
+ 'Safe\\Exceptions\\PgsqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
+ 'Safe\\Exceptions\\PosixException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
+ 'Safe\\Exceptions\\PsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
+ 'Safe\\Exceptions\\PspellException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
+ 'Safe\\Exceptions\\ReadlineException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
+ 'Safe\\Exceptions\\RpminfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
+ 'Safe\\Exceptions\\RrdException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
+ 'Safe\\Exceptions\\SafeExceptionInterface' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
+ 'Safe\\Exceptions\\SemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
+ 'Safe\\Exceptions\\SessionException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
+ 'Safe\\Exceptions\\ShmopException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
+ 'Safe\\Exceptions\\SimplexmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SimplexmlException.php',
+ 'Safe\\Exceptions\\SocketsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
+ 'Safe\\Exceptions\\SodiumException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
+ 'Safe\\Exceptions\\SolrException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
+ 'Safe\\Exceptions\\SplException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
+ 'Safe\\Exceptions\\SqlsrvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
+ 'Safe\\Exceptions\\SsdeepException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
+ 'Safe\\Exceptions\\Ssh2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
+ 'Safe\\Exceptions\\StatsException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/StatsException.php',
+ 'Safe\\Exceptions\\StreamException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
+ 'Safe\\Exceptions\\StringsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
+ 'Safe\\Exceptions\\SwooleException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
+ 'Safe\\Exceptions\\UodbcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
+ 'Safe\\Exceptions\\UopzException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
+ 'Safe\\Exceptions\\UrlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
+ 'Safe\\Exceptions\\VarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
+ 'Safe\\Exceptions\\XdiffException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
+ 'Safe\\Exceptions\\XmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
+ 'Safe\\Exceptions\\XmlrpcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
+ 'Safe\\Exceptions\\YamlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
+ 'Safe\\Exceptions\\YazException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
+ 'Safe\\Exceptions\\ZipException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
+ 'Safe\\Exceptions\\ZlibException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
+ 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
+ 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php',
+ 'Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php',
+ 'Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php',
+ 'Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php',
+ 'Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php',
+ 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php',
+ 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php',
+ 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php',
+ 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php',
+ 'Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php',
+ 'Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php',
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php',
+ 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php',
+ 'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php',
+ 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+ 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
+ 'Webauthn\\AttestationStatement\\AndroidKeyAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidKeyAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AndroidSafetyNetAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidSafetyNetAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AppleAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AppleAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AttestationObject' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObject.php',
+ 'Webauthn\\AttestationStatement\\AttestationObjectLoader' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObjectLoader.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatement' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatement.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatementSupportManager' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupportManager.php',
+ 'Webauthn\\AttestationStatement\\FidoU2FAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/FidoU2FAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\NoneAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/NoneAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\PackedAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/PackedAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\TPMAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/TPMAttestationStatementSupport.php',
+ 'Webauthn\\AttestedCredentialData' => $vendorDir . '/web-auth/webauthn-lib/src/AttestedCredentialData.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtension' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtension.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientInputs' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientInputs.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputs' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputs.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputsLoader' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputsLoader.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputChecker' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputChecker.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputCheckerHandler' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputCheckerHandler.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputError' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputError.php',
+ 'Webauthn\\AuthenticatorAssertionResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponse.php',
+ 'Webauthn\\AuthenticatorAssertionResponseValidator' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponseValidator.php',
+ 'Webauthn\\AuthenticatorAttestationResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponse.php',
+ 'Webauthn\\AuthenticatorAttestationResponseValidator' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponseValidator.php',
+ 'Webauthn\\AuthenticatorData' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorData.php',
+ 'Webauthn\\AuthenticatorResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorResponse.php',
+ 'Webauthn\\AuthenticatorSelectionCriteria' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorSelectionCriteria.php',
+ 'Webauthn\\CertificateChainChecker\\CertificateChainChecker' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateChainChecker/CertificateChainChecker.php',
+ 'Webauthn\\CertificateChainChecker\\OpenSSLCertificateChainChecker' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateChainChecker/OpenSSLCertificateChainChecker.php',
+ 'Webauthn\\CertificateToolbox' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateToolbox.php',
+ 'Webauthn\\CollectedClientData' => $vendorDir . '/web-auth/webauthn-lib/src/CollectedClientData.php',
+ 'Webauthn\\Counter\\CounterChecker' => $vendorDir . '/web-auth/webauthn-lib/src/Counter/CounterChecker.php',
+ 'Webauthn\\Counter\\ThrowExceptionIfInvalid' => $vendorDir . '/web-auth/webauthn-lib/src/Counter/ThrowExceptionIfInvalid.php',
+ 'Webauthn\\Credential' => $vendorDir . '/web-auth/webauthn-lib/src/Credential.php',
+ 'Webauthn\\MetadataService\\AbstractDescriptor' => $vendorDir . '/web-auth/metadata-service/src/AbstractDescriptor.php',
+ 'Webauthn\\MetadataService\\AuthenticatorStatus' => $vendorDir . '/web-auth/metadata-service/src/AuthenticatorStatus.php',
+ 'Webauthn\\MetadataService\\BiometricAccuracyDescriptor' => $vendorDir . '/web-auth/metadata-service/src/BiometricAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\BiometricStatusReport' => $vendorDir . '/web-auth/metadata-service/src/BiometricStatusReport.php',
+ 'Webauthn\\MetadataService\\CodeAccuracyDescriptor' => $vendorDir . '/web-auth/metadata-service/src/CodeAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\DisplayPNGCharacteristicsDescriptor' => $vendorDir . '/web-auth/metadata-service/src/DisplayPNGCharacteristicsDescriptor.php',
+ 'Webauthn\\MetadataService\\DistantSingleMetadata' => $vendorDir . '/web-auth/metadata-service/src/DistantSingleMetadata.php',
+ 'Webauthn\\MetadataService\\EcdaaTrustAnchor' => $vendorDir . '/web-auth/metadata-service/src/EcdaaTrustAnchor.php',
+ 'Webauthn\\MetadataService\\ExtensionDescriptor' => $vendorDir . '/web-auth/metadata-service/src/ExtensionDescriptor.php',
+ 'Webauthn\\MetadataService\\MetadataService' => $vendorDir . '/web-auth/metadata-service/src/MetadataService.php',
+ 'Webauthn\\MetadataService\\MetadataStatement' => $vendorDir . '/web-auth/metadata-service/src/MetadataStatement.php',
+ 'Webauthn\\MetadataService\\MetadataStatementFetcher' => $vendorDir . '/web-auth/metadata-service/src/MetadataStatementFetcher.php',
+ 'Webauthn\\MetadataService\\MetadataStatementRepository' => $vendorDir . '/web-auth/metadata-service/src/MetadataStatementRepository.php',
+ 'Webauthn\\MetadataService\\MetadataTOCPayload' => $vendorDir . '/web-auth/metadata-service/src/MetadataTOCPayload.php',
+ 'Webauthn\\MetadataService\\MetadataTOCPayloadEntry' => $vendorDir . '/web-auth/metadata-service/src/MetadataTOCPayloadEntry.php',
+ 'Webauthn\\MetadataService\\PatternAccuracyDescriptor' => $vendorDir . '/web-auth/metadata-service/src/PatternAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\RgbPaletteEntry' => $vendorDir . '/web-auth/metadata-service/src/RgbPaletteEntry.php',
+ 'Webauthn\\MetadataService\\RogueListEntry' => $vendorDir . '/web-auth/metadata-service/src/RogueListEntry.php',
+ 'Webauthn\\MetadataService\\SingleMetadata' => $vendorDir . '/web-auth/metadata-service/src/SingleMetadata.php',
+ 'Webauthn\\MetadataService\\StatusReport' => $vendorDir . '/web-auth/metadata-service/src/StatusReport.php',
+ 'Webauthn\\MetadataService\\Utils' => $vendorDir . '/web-auth/metadata-service/src/Utils.php',
+ 'Webauthn\\MetadataService\\VerificationMethodANDCombinations' => $vendorDir . '/web-auth/metadata-service/src/VerificationMethodANDCombinations.php',
+ 'Webauthn\\MetadataService\\VerificationMethodDescriptor' => $vendorDir . '/web-auth/metadata-service/src/VerificationMethodDescriptor.php',
+ 'Webauthn\\MetadataService\\Version' => $vendorDir . '/web-auth/metadata-service/src/Version.php',
+ 'Webauthn\\PublicKeyCredential' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredential.php',
+ 'Webauthn\\PublicKeyCredentialCreationOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialCreationOptions.php',
+ 'Webauthn\\PublicKeyCredentialDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptor.php',
+ 'Webauthn\\PublicKeyCredentialDescriptorCollection' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptorCollection.php',
+ 'Webauthn\\PublicKeyCredentialEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialEntity.php',
+ 'Webauthn\\PublicKeyCredentialLoader' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialLoader.php',
+ 'Webauthn\\PublicKeyCredentialOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialOptions.php',
+ 'Webauthn\\PublicKeyCredentialParameters' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialParameters.php',
+ 'Webauthn\\PublicKeyCredentialRequestOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialRequestOptions.php',
+ 'Webauthn\\PublicKeyCredentialRpEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialRpEntity.php',
+ 'Webauthn\\PublicKeyCredentialSource' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialSource.php',
+ 'Webauthn\\PublicKeyCredentialSourceRepository' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialSourceRepository.php',
+ 'Webauthn\\PublicKeyCredentialUserEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialUserEntity.php',
+ 'Webauthn\\Server' => $vendorDir . '/web-auth/webauthn-lib/src/Server.php',
+ 'Webauthn\\StringStream' => $vendorDir . '/web-auth/webauthn-lib/src/StringStream.php',
+ 'Webauthn\\TokenBinding\\IgnoreTokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/IgnoreTokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\SecTokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/SecTokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\TokenBinding' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBinding.php',
+ 'Webauthn\\TokenBinding\\TokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\TokenBindingNotSupportedHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingNotSupportedHandler.php',
+ 'Webauthn\\TrustPath\\CertificateTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/CertificateTrustPath.php',
+ 'Webauthn\\TrustPath\\EcdaaKeyIdTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/EcdaaKeyIdTrustPath.php',
+ 'Webauthn\\TrustPath\\EmptyTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/EmptyTrustPath.php',
+ 'Webauthn\\TrustPath\\TrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/TrustPath.php',
+ 'Webauthn\\TrustPath\\TrustPathLoader' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/TrustPathLoader.php',
+ 'Webauthn\\U2FPublicKey' => $vendorDir . '/web-auth/webauthn-lib/src/U2FPublicKey.php',
+ 'Webauthn\\Util\\CoseSignatureFixer' => $vendorDir . '/web-auth/webauthn-lib/src/Util/CoseSignatureFixer.php',
+);
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/autoload_files.php b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_files.php
new file mode 100644
index 00000000..5d68d9a9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_files.php
@@ -0,0 +1,103 @@
+ $vendorDir . '/beberlei/assert/lib/Assert/functions.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
+ '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
+ '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
+ 'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php',
+ '51fcf4e06c07cc00c920b44bcd900e7a' => $vendorDir . '/thecodingmachine/safe/deprecated/apc.php',
+ '47f619d9197b36cf5ab70738d7743fe2' => $vendorDir . '/thecodingmachine/safe/deprecated/libevent.php',
+ 'ea6bb8a12ef9b68f6ada99058e530760' => $vendorDir . '/thecodingmachine/safe/deprecated/mssql.php',
+ '9a29089eb3ce41a446744c68a00f118c' => $vendorDir . '/thecodingmachine/safe/deprecated/stats.php',
+ '72243e5536b63e298acb6476f01f1aff' => $vendorDir . '/thecodingmachine/safe/lib/special_cases.php',
+ '3f648889e687f31c52f949ba8a9d0873' => $vendorDir . '/thecodingmachine/safe/generated/apache.php',
+ 'eeb4581d958421a4244aaa4167c6a575' => $vendorDir . '/thecodingmachine/safe/generated/apcu.php',
+ '04cb0b3c1dac5b5ddb23c14e3d66dbe9' => $vendorDir . '/thecodingmachine/safe/generated/array.php',
+ '450b332a74a9a21e043c5e953485a791' => $vendorDir . '/thecodingmachine/safe/generated/bzip2.php',
+ '6e9b7954ecfd7cbb9ca239319d1acdb6' => $vendorDir . '/thecodingmachine/safe/generated/calendar.php',
+ '2c6d7e8bd2de9a272a9d4d43b0a4304a' => $vendorDir . '/thecodingmachine/safe/generated/classobj.php',
+ '0b8231c1ad0865447c988a4c16b4001f' => $vendorDir . '/thecodingmachine/safe/generated/com.php',
+ '7643a71fe1c3256058c8fee234cb86e5' => $vendorDir . '/thecodingmachine/safe/generated/cubrid.php',
+ '68e1365710575942efc1d55000032cee' => $vendorDir . '/thecodingmachine/safe/generated/curl.php',
+ '02fd26bca803106c5b942a7197c3ad8b' => $vendorDir . '/thecodingmachine/safe/generated/datetime.php',
+ 'f4817dcbd956cd221b1c31f6fbd5749c' => $vendorDir . '/thecodingmachine/safe/generated/dir.php',
+ '51c3f2d10ca61a70dbcea0e38d8e902d' => $vendorDir . '/thecodingmachine/safe/generated/eio.php',
+ '1d34f34327ca3e81535963016e3be2c3' => $vendorDir . '/thecodingmachine/safe/generated/errorfunc.php',
+ '4fd0ba2d3717b0424d474bebfdafa2b4' => $vendorDir . '/thecodingmachine/safe/generated/exec.php',
+ '98f4dae054bc7fb19c13be14935cbdd3' => $vendorDir . '/thecodingmachine/safe/generated/fileinfo.php',
+ '5530ae063ba88323eaf0a07904efdf85' => $vendorDir . '/thecodingmachine/safe/generated/filesystem.php',
+ '633f4f134975d70e97bddad83348e91a' => $vendorDir . '/thecodingmachine/safe/generated/filter.php',
+ 'fbd163fc68c5faf73d5ed4002ffd836d' => $vendorDir . '/thecodingmachine/safe/generated/fpm.php',
+ '21b511999d61411fab0692ff8795bbed' => $vendorDir . '/thecodingmachine/safe/generated/ftp.php',
+ '85fbd73fc92365cd90526b0ea03cae3a' => $vendorDir . '/thecodingmachine/safe/generated/funchand.php',
+ '51df9c146e0b7dcbdf358d8abd24dbdc' => $vendorDir . '/thecodingmachine/safe/generated/gmp.php',
+ '93bb7fe678d7dcfb1322f8e3475a48b0' => $vendorDir . '/thecodingmachine/safe/generated/gnupg.php',
+ 'c171ba99cf316379ff66468392bf4950' => $vendorDir . '/thecodingmachine/safe/generated/hash.php',
+ '5ab4aad4c28e468209fbfcceb2e5e6a5' => $vendorDir . '/thecodingmachine/safe/generated/ibase.php',
+ '4d57409c5e8e576b0c64c08d9d731cfb' => $vendorDir . '/thecodingmachine/safe/generated/ibmDb2.php',
+ 'eeb246d5403972a9d62106e4a4883496' => $vendorDir . '/thecodingmachine/safe/generated/iconv.php',
+ 'c28a05f498c01b810a714f7214b7a8da' => $vendorDir . '/thecodingmachine/safe/generated/image.php',
+ '8063cd92acdf00fd978b5599eb7cc142' => $vendorDir . '/thecodingmachine/safe/generated/imap.php',
+ '8bd26dbe768e9c9599edad7b198e5446' => $vendorDir . '/thecodingmachine/safe/generated/info.php',
+ '0c577fe603b029d4b65c84376b15dbd5' => $vendorDir . '/thecodingmachine/safe/generated/ingres-ii.php',
+ 'd4362910bde43c0f956b52527effd7d4' => $vendorDir . '/thecodingmachine/safe/generated/inotify.php',
+ '696ba49197d9b55f0428a12bb5a818e1' => $vendorDir . '/thecodingmachine/safe/generated/json.php',
+ '9818aaa99c8647c63f8ef62b7a368160' => $vendorDir . '/thecodingmachine/safe/generated/ldap.php',
+ 'bcf523ff2a195eb08e0fbb668ed784d0' => $vendorDir . '/thecodingmachine/safe/generated/libxml.php',
+ '68be68a9a8b95bb56cab6109ff03bc88' => $vendorDir . '/thecodingmachine/safe/generated/lzf.php',
+ 'bdca804bb0904ea9f53f328dfc0bb8a5' => $vendorDir . '/thecodingmachine/safe/generated/mailparse.php',
+ 'b0a3fcac3eaf55445796d6af26b89366' => $vendorDir . '/thecodingmachine/safe/generated/mbstring.php',
+ '98de16b8db03eb0cb4d318b4402215a6' => $vendorDir . '/thecodingmachine/safe/generated/misc.php',
+ 'c112440003b56e243b192c11fa9d836e' => $vendorDir . '/thecodingmachine/safe/generated/msql.php',
+ '7cefd81607cd21b8b3a15656eb6465f5' => $vendorDir . '/thecodingmachine/safe/generated/mysql.php',
+ 'aaf438b080089c6d0686679cd34aa72e' => $vendorDir . '/thecodingmachine/safe/generated/mysqli.php',
+ 'df0ef890e9afbf95f3924feb1c7a89f3' => $vendorDir . '/thecodingmachine/safe/generated/mysqlndMs.php',
+ 'db595fee5972867e45c5327010d78735' => $vendorDir . '/thecodingmachine/safe/generated/mysqlndQc.php',
+ 'cbac956836b72483dcff1ac39d5c0a0f' => $vendorDir . '/thecodingmachine/safe/generated/network.php',
+ '6c8f89dfbdc117d7871f572269363f25' => $vendorDir . '/thecodingmachine/safe/generated/oci8.php',
+ '169a669966a45c06bf55ed029122729b' => $vendorDir . '/thecodingmachine/safe/generated/opcache.php',
+ 'def61bf4fecd4d4bca7354919cd69302' => $vendorDir . '/thecodingmachine/safe/generated/openssl.php',
+ '26bb010649a6d32d4120181458aa6ef2' => $vendorDir . '/thecodingmachine/safe/generated/outcontrol.php',
+ '1212c201fe43c7492a085b2c71505e0f' => $vendorDir . '/thecodingmachine/safe/generated/password.php',
+ '002ebcb842e2c0d5b7f67fe64cc93158' => $vendorDir . '/thecodingmachine/safe/generated/pcntl.php',
+ '86df38612982dade72c7085ce7eca81f' => $vendorDir . '/thecodingmachine/safe/generated/pcre.php',
+ '1cacc3e65f82a473fbd5507c7ce4385d' => $vendorDir . '/thecodingmachine/safe/generated/pdf.php',
+ '1fc22f445c69ea8706e82fce301c0831' => $vendorDir . '/thecodingmachine/safe/generated/pgsql.php',
+ 'c70b42561584f7144bff38cd63c4eef3' => $vendorDir . '/thecodingmachine/safe/generated/posix.php',
+ '9923214639c32ca5173db03a177d3b63' => $vendorDir . '/thecodingmachine/safe/generated/ps.php',
+ '7e9c3f8eae2b5bf42205c4f1295cb7a7' => $vendorDir . '/thecodingmachine/safe/generated/pspell.php',
+ '91aa91f6245c349c2e2e88bd0025f199' => $vendorDir . '/thecodingmachine/safe/generated/readline.php',
+ 'd43773cacb9e5e8e897aa255e32007d1' => $vendorDir . '/thecodingmachine/safe/generated/rpminfo.php',
+ 'f053a3849e9e8383762b34b91db0320b' => $vendorDir . '/thecodingmachine/safe/generated/rrd.php',
+ '775b964f72f827a1bf87c65ab5b10800' => $vendorDir . '/thecodingmachine/safe/generated/sem.php',
+ '816428bd69c29ab5e1ed622af5dca0cd' => $vendorDir . '/thecodingmachine/safe/generated/session.php',
+ '5093e233bedbefaef0df262bfbab0a5c' => $vendorDir . '/thecodingmachine/safe/generated/shmop.php',
+ '01352920b0151f17e671266e44b52536' => $vendorDir . '/thecodingmachine/safe/generated/simplexml.php',
+ 'b080617b1d949683c2e37f8f01dc0e15' => $vendorDir . '/thecodingmachine/safe/generated/sockets.php',
+ '2708aa182ddcfe6ce27c96acaaa40f69' => $vendorDir . '/thecodingmachine/safe/generated/sodium.php',
+ 'f1b96cb260a5baeea9a7285cda82a1ec' => $vendorDir . '/thecodingmachine/safe/generated/solr.php',
+ '3fd8853757d0fe3557c179efb807afeb' => $vendorDir . '/thecodingmachine/safe/generated/spl.php',
+ '9312ce96a51c846913fcda5f186d58dd' => $vendorDir . '/thecodingmachine/safe/generated/sqlsrv.php',
+ 'd3eb383ad0b8b962b29dc4afd29d6715' => $vendorDir . '/thecodingmachine/safe/generated/ssdeep.php',
+ '42a09bc448f441a0b9f9367ea975c0bf' => $vendorDir . '/thecodingmachine/safe/generated/ssh2.php',
+ 'ef711077d356d1b33ca0b10b67b0be8f' => $vendorDir . '/thecodingmachine/safe/generated/stream.php',
+ '764b09f6df081cbb2807b97c6ace3866' => $vendorDir . '/thecodingmachine/safe/generated/strings.php',
+ 'ef241678769fee4a44aaa288f3b78aa1' => $vendorDir . '/thecodingmachine/safe/generated/swoole.php',
+ '0efc8f6778cba932b9e2a89e28de2452' => $vendorDir . '/thecodingmachine/safe/generated/uodbc.php',
+ 'd383d32907b98af53ee9208c62204fd0' => $vendorDir . '/thecodingmachine/safe/generated/uopz.php',
+ '2fd2e4060f7fe772660f002ce38f0b71' => $vendorDir . '/thecodingmachine/safe/generated/url.php',
+ '782249e03deebeaf57b9991ff5493aa0' => $vendorDir . '/thecodingmachine/safe/generated/var.php',
+ '344440cd1cd7200fdb4f12af0d3c587f' => $vendorDir . '/thecodingmachine/safe/generated/xdiff.php',
+ '3599f369219c658a5fb6c4fe66832f62' => $vendorDir . '/thecodingmachine/safe/generated/xml.php',
+ '7fcd313da9fae337051b091b3492c21b' => $vendorDir . '/thecodingmachine/safe/generated/xmlrpc.php',
+ 'd668c74cfa92d893b582356733d9a80e' => $vendorDir . '/thecodingmachine/safe/generated/yaml.php',
+ '4af1dca6db8c527c6eed27bff85ff0e5' => $vendorDir . '/thecodingmachine/safe/generated/yaz.php',
+ 'fe43ca06499ac37bc2dedd823af71eb5' => $vendorDir . '/thecodingmachine/safe/generated/zip.php',
+ '356736db98a6834f0a886b8d509b0ecd' => $vendorDir . '/thecodingmachine/safe/generated/zlib.php',
+);
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/autoload_namespaces.php b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_namespaces.php
new file mode 100644
index 00000000..15a2ff3a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+ array($vendorDir . '/web-auth/metadata-service/src'),
+ 'Webauthn\\' => array($vendorDir . '/web-auth/webauthn-lib/src'),
+ 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
+ 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
+ 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
+ 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
+ 'Safe\\' => array($vendorDir . '/thecodingmachine/safe/lib', $vendorDir . '/thecodingmachine/safe/deprecated', $vendorDir . '/thecodingmachine/safe/generated'),
+ 'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'),
+ 'Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),
+ 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
+ 'Nyholm\\Psr7\\' => array($vendorDir . '/nyholm/psr7/src'),
+ 'Nyholm\\Psr7Server\\' => array($vendorDir . '/nyholm/psr7-server/src'),
+ 'League\\Uri\\' => array($vendorDir . '/league/uri-interfaces/src', $vendorDir . '/league/uri/src'),
+ 'Jose\\Component\\Signature\\Algorithm\\' => array($vendorDir . '/web-token/jwt-signature-algorithm-ecdsa', $vendorDir . '/web-token/jwt-signature-algorithm-eddsa', $vendorDir . '/web-token/jwt-signature-algorithm-rsa'),
+ 'Jose\\Component\\Signature\\' => array($vendorDir . '/web-token/jwt-signature'),
+ 'Jose\\Component\\KeyManagement\\' => array($vendorDir . '/web-token/jwt-key-mgmt'),
+ 'Jose\\Component\\Core\\' => array($vendorDir . '/web-token/jwt-core'),
+ 'Http\\Message\\' => array($vendorDir . '/php-http/message-factory/src'),
+ 'FG\\' => array($vendorDir . '/fgrosse/phpasn1/lib'),
+ 'Cose\\' => array($vendorDir . '/web-auth/cose-lib/src'),
+ 'CBOR\\' => array($vendorDir . '/spomky-labs/cbor-php/src'),
+ 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'),
+ 'Base64Url\\' => array($vendorDir . '/spomky-labs/base64url/src'),
+ 'Assert\\' => array($vendorDir . '/beberlei/assert/lib/Assert'),
+);
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/autoload_real.php b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_real.php
new file mode 100644
index 00000000..ccec2823
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_real.php
@@ -0,0 +1,55 @@
+register(true);
+
+ $includeFiles = \Composer\Autoload\ComposerStaticInit8c7684b956de574bcb0eefe2be31e0ab::$files;
+ foreach ($includeFiles as $fileIdentifier => $file) {
+ composerRequire8c7684b956de574bcb0eefe2be31e0ab($fileIdentifier, $file);
+ }
+
+ return $loader;
+ }
+}
+
+/**
+ * @param string $fileIdentifier
+ * @param string $file
+ * @return void
+ */
+function composerRequire8c7684b956de574bcb0eefe2be31e0ab($fileIdentifier, $file)
+{
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+
+ require $file;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/autoload_static.php b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_static.php
new file mode 100644
index 00000000..b485ae14
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/autoload_static.php
@@ -0,0 +1,960 @@
+ __DIR__ . '/..' . '/beberlei/assert/lib/Assert/functions.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
+ '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
+ '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
+ 'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php',
+ '51fcf4e06c07cc00c920b44bcd900e7a' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/apc.php',
+ '47f619d9197b36cf5ab70738d7743fe2' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/libevent.php',
+ 'ea6bb8a12ef9b68f6ada99058e530760' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/mssql.php',
+ '9a29089eb3ce41a446744c68a00f118c' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/stats.php',
+ '72243e5536b63e298acb6476f01f1aff' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/special_cases.php',
+ '3f648889e687f31c52f949ba8a9d0873' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apache.php',
+ 'eeb4581d958421a4244aaa4167c6a575' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apcu.php',
+ '04cb0b3c1dac5b5ddb23c14e3d66dbe9' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/array.php',
+ '450b332a74a9a21e043c5e953485a791' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/bzip2.php',
+ '6e9b7954ecfd7cbb9ca239319d1acdb6' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/calendar.php',
+ '2c6d7e8bd2de9a272a9d4d43b0a4304a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/classobj.php',
+ '0b8231c1ad0865447c988a4c16b4001f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/com.php',
+ '7643a71fe1c3256058c8fee234cb86e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/cubrid.php',
+ '68e1365710575942efc1d55000032cee' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/curl.php',
+ '02fd26bca803106c5b942a7197c3ad8b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/datetime.php',
+ 'f4817dcbd956cd221b1c31f6fbd5749c' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/dir.php',
+ '51c3f2d10ca61a70dbcea0e38d8e902d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/eio.php',
+ '1d34f34327ca3e81535963016e3be2c3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/errorfunc.php',
+ '4fd0ba2d3717b0424d474bebfdafa2b4' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/exec.php',
+ '98f4dae054bc7fb19c13be14935cbdd3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/fileinfo.php',
+ '5530ae063ba88323eaf0a07904efdf85' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/filesystem.php',
+ '633f4f134975d70e97bddad83348e91a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/filter.php',
+ 'fbd163fc68c5faf73d5ed4002ffd836d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/fpm.php',
+ '21b511999d61411fab0692ff8795bbed' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ftp.php',
+ '85fbd73fc92365cd90526b0ea03cae3a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/funchand.php',
+ '51df9c146e0b7dcbdf358d8abd24dbdc' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gmp.php',
+ '93bb7fe678d7dcfb1322f8e3475a48b0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gnupg.php',
+ 'c171ba99cf316379ff66468392bf4950' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/hash.php',
+ '5ab4aad4c28e468209fbfcceb2e5e6a5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ibase.php',
+ '4d57409c5e8e576b0c64c08d9d731cfb' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ibmDb2.php',
+ 'eeb246d5403972a9d62106e4a4883496' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/iconv.php',
+ 'c28a05f498c01b810a714f7214b7a8da' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/image.php',
+ '8063cd92acdf00fd978b5599eb7cc142' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/imap.php',
+ '8bd26dbe768e9c9599edad7b198e5446' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/info.php',
+ '0c577fe603b029d4b65c84376b15dbd5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ingres-ii.php',
+ 'd4362910bde43c0f956b52527effd7d4' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/inotify.php',
+ '696ba49197d9b55f0428a12bb5a818e1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/json.php',
+ '9818aaa99c8647c63f8ef62b7a368160' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ldap.php',
+ 'bcf523ff2a195eb08e0fbb668ed784d0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/libxml.php',
+ '68be68a9a8b95bb56cab6109ff03bc88' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/lzf.php',
+ 'bdca804bb0904ea9f53f328dfc0bb8a5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mailparse.php',
+ 'b0a3fcac3eaf55445796d6af26b89366' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mbstring.php',
+ '98de16b8db03eb0cb4d318b4402215a6' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/misc.php',
+ 'c112440003b56e243b192c11fa9d836e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/msql.php',
+ '7cefd81607cd21b8b3a15656eb6465f5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysql.php',
+ 'aaf438b080089c6d0686679cd34aa72e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqli.php',
+ 'df0ef890e9afbf95f3924feb1c7a89f3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqlndMs.php',
+ 'db595fee5972867e45c5327010d78735' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqlndQc.php',
+ 'cbac956836b72483dcff1ac39d5c0a0f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/network.php',
+ '6c8f89dfbdc117d7871f572269363f25' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/oci8.php',
+ '169a669966a45c06bf55ed029122729b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/opcache.php',
+ 'def61bf4fecd4d4bca7354919cd69302' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/openssl.php',
+ '26bb010649a6d32d4120181458aa6ef2' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/outcontrol.php',
+ '1212c201fe43c7492a085b2c71505e0f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/password.php',
+ '002ebcb842e2c0d5b7f67fe64cc93158' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcntl.php',
+ '86df38612982dade72c7085ce7eca81f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcre.php',
+ '1cacc3e65f82a473fbd5507c7ce4385d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pdf.php',
+ '1fc22f445c69ea8706e82fce301c0831' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pgsql.php',
+ 'c70b42561584f7144bff38cd63c4eef3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/posix.php',
+ '9923214639c32ca5173db03a177d3b63' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ps.php',
+ '7e9c3f8eae2b5bf42205c4f1295cb7a7' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pspell.php',
+ '91aa91f6245c349c2e2e88bd0025f199' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/readline.php',
+ 'd43773cacb9e5e8e897aa255e32007d1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/rpminfo.php',
+ 'f053a3849e9e8383762b34b91db0320b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/rrd.php',
+ '775b964f72f827a1bf87c65ab5b10800' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sem.php',
+ '816428bd69c29ab5e1ed622af5dca0cd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/session.php',
+ '5093e233bedbefaef0df262bfbab0a5c' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/shmop.php',
+ '01352920b0151f17e671266e44b52536' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/simplexml.php',
+ 'b080617b1d949683c2e37f8f01dc0e15' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sockets.php',
+ '2708aa182ddcfe6ce27c96acaaa40f69' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sodium.php',
+ 'f1b96cb260a5baeea9a7285cda82a1ec' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/solr.php',
+ '3fd8853757d0fe3557c179efb807afeb' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/spl.php',
+ '9312ce96a51c846913fcda5f186d58dd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sqlsrv.php',
+ 'd3eb383ad0b8b962b29dc4afd29d6715' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ssdeep.php',
+ '42a09bc448f441a0b9f9367ea975c0bf' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ssh2.php',
+ 'ef711077d356d1b33ca0b10b67b0be8f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/stream.php',
+ '764b09f6df081cbb2807b97c6ace3866' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/strings.php',
+ 'ef241678769fee4a44aaa288f3b78aa1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/swoole.php',
+ '0efc8f6778cba932b9e2a89e28de2452' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/uodbc.php',
+ 'd383d32907b98af53ee9208c62204fd0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/uopz.php',
+ '2fd2e4060f7fe772660f002ce38f0b71' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/url.php',
+ '782249e03deebeaf57b9991ff5493aa0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/var.php',
+ '344440cd1cd7200fdb4f12af0d3c587f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xdiff.php',
+ '3599f369219c658a5fb6c4fe66832f62' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xml.php',
+ '7fcd313da9fae337051b091b3492c21b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xmlrpc.php',
+ 'd668c74cfa92d893b582356733d9a80e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaml.php',
+ '4af1dca6db8c527c6eed27bff85ff0e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaz.php',
+ 'fe43ca06499ac37bc2dedd823af71eb5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zip.php',
+ '356736db98a6834f0a886b8d509b0ecd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zlib.php',
+ );
+
+ public static $prefixLengthsPsr4 = array (
+ 'W' =>
+ array (
+ 'Webauthn\\MetadataService\\' => 25,
+ 'Webauthn\\' => 9,
+ ),
+ 'S' =>
+ array (
+ 'Symfony\\Polyfill\\Php81\\' => 23,
+ 'Symfony\\Polyfill\\Php80\\' => 23,
+ 'Symfony\\Polyfill\\Ctype\\' => 23,
+ 'Symfony\\Component\\Process\\' => 26,
+ 'Safe\\' => 5,
+ ),
+ 'R' =>
+ array (
+ 'Ramsey\\Uuid\\' => 12,
+ 'Ramsey\\Collection\\' => 18,
+ ),
+ 'P' =>
+ array (
+ 'Psr\\Log\\' => 8,
+ 'Psr\\Http\\Message\\' => 17,
+ 'Psr\\Http\\Client\\' => 16,
+ ),
+ 'N' =>
+ array (
+ 'Nyholm\\Psr7\\' => 12,
+ 'Nyholm\\Psr7Server\\' => 18,
+ ),
+ 'L' =>
+ array (
+ 'League\\Uri\\' => 11,
+ ),
+ 'J' =>
+ array (
+ 'Jose\\Component\\Signature\\Algorithm\\' => 35,
+ 'Jose\\Component\\Signature\\' => 25,
+ 'Jose\\Component\\KeyManagement\\' => 29,
+ 'Jose\\Component\\Core\\' => 20,
+ ),
+ 'H' =>
+ array (
+ 'Http\\Message\\' => 13,
+ ),
+ 'F' =>
+ array (
+ 'FG\\' => 3,
+ ),
+ 'C' =>
+ array (
+ 'Cose\\' => 5,
+ 'CBOR\\' => 5,
+ ),
+ 'B' =>
+ array (
+ 'Brick\\Math\\' => 11,
+ 'Base64Url\\' => 10,
+ ),
+ 'A' =>
+ array (
+ 'Assert\\' => 7,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'Webauthn\\MetadataService\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-auth/metadata-service/src',
+ ),
+ 'Webauthn\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-auth/webauthn-lib/src',
+ ),
+ 'Symfony\\Polyfill\\Php81\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php81',
+ ),
+ 'Symfony\\Polyfill\\Php80\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
+ ),
+ 'Symfony\\Polyfill\\Ctype\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
+ ),
+ 'Symfony\\Component\\Process\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/process',
+ ),
+ 'Safe\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/thecodingmachine/safe/lib',
+ 1 => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated',
+ 2 => __DIR__ . '/..' . '/thecodingmachine/safe/generated',
+ ),
+ 'Ramsey\\Uuid\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/ramsey/uuid/src',
+ ),
+ 'Ramsey\\Collection\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/ramsey/collection/src',
+ ),
+ 'Psr\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+ ),
+ 'Psr\\Http\\Message\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-message/src',
+ 1 => __DIR__ . '/..' . '/psr/http-factory/src',
+ ),
+ 'Psr\\Http\\Client\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-client/src',
+ ),
+ 'Nyholm\\Psr7\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/nyholm/psr7/src',
+ ),
+ 'Nyholm\\Psr7Server\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/nyholm/psr7-server/src',
+ ),
+ 'League\\Uri\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/uri-interfaces/src',
+ 1 => __DIR__ . '/..' . '/league/uri/src',
+ ),
+ 'Jose\\Component\\Signature\\Algorithm\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa',
+ 1 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-eddsa',
+ 2 => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa',
+ ),
+ 'Jose\\Component\\Signature\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-token/jwt-signature',
+ ),
+ 'Jose\\Component\\KeyManagement\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-token/jwt-key-mgmt',
+ ),
+ 'Jose\\Component\\Core\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-token/jwt-core',
+ ),
+ 'Http\\Message\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/php-http/message-factory/src',
+ ),
+ 'FG\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/fgrosse/phpasn1/lib',
+ ),
+ 'Cose\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/web-auth/cose-lib/src',
+ ),
+ 'CBOR\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/spomky-labs/cbor-php/src',
+ ),
+ 'Brick\\Math\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/brick/math/src',
+ ),
+ 'Base64Url\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/spomky-labs/base64url/src',
+ ),
+ 'Assert\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/beberlei/assert/lib/Assert',
+ ),
+ );
+
+ public static $classMap = array (
+ 'Assert\\Assert' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/Assert.php',
+ 'Assert\\Assertion' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/Assertion.php',
+ 'Assert\\AssertionChain' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/AssertionChain.php',
+ 'Assert\\AssertionFailedException' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/AssertionFailedException.php',
+ 'Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/InvalidArgumentException.php',
+ 'Assert\\LazyAssertion' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/LazyAssertion.php',
+ 'Assert\\LazyAssertionException' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/LazyAssertionException.php',
+ 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+ 'Base64Url\\Base64Url' => __DIR__ . '/..' . '/spomky-labs/base64url/src/Base64Url.php',
+ 'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php',
+ 'Brick\\Math\\BigInteger' => __DIR__ . '/..' . '/brick/math/src/BigInteger.php',
+ 'Brick\\Math\\BigNumber' => __DIR__ . '/..' . '/brick/math/src/BigNumber.php',
+ 'Brick\\Math\\BigRational' => __DIR__ . '/..' . '/brick/math/src/BigRational.php',
+ 'Brick\\Math\\Exception\\DivisionByZeroException' => __DIR__ . '/..' . '/brick/math/src/Exception/DivisionByZeroException.php',
+ 'Brick\\Math\\Exception\\IntegerOverflowException' => __DIR__ . '/..' . '/brick/math/src/Exception/IntegerOverflowException.php',
+ 'Brick\\Math\\Exception\\MathException' => __DIR__ . '/..' . '/brick/math/src/Exception/MathException.php',
+ 'Brick\\Math\\Exception\\NegativeNumberException' => __DIR__ . '/..' . '/brick/math/src/Exception/NegativeNumberException.php',
+ 'Brick\\Math\\Exception\\NumberFormatException' => __DIR__ . '/..' . '/brick/math/src/Exception/NumberFormatException.php',
+ 'Brick\\Math\\Exception\\RoundingNecessaryException' => __DIR__ . '/..' . '/brick/math/src/Exception/RoundingNecessaryException.php',
+ 'Brick\\Math\\Internal\\Calculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/BcMathCalculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/GmpCalculator.php',
+ 'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/NativeCalculator.php',
+ 'Brick\\Math\\RoundingMode' => __DIR__ . '/..' . '/brick/math/src/RoundingMode.php',
+ 'CBOR\\AbstractCBORObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/AbstractCBORObject.php',
+ 'CBOR\\ByteStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/ByteStringObject.php',
+ 'CBOR\\ByteStringWithChunkObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/ByteStringWithChunkObject.php',
+ 'CBOR\\CBORObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/CBORObject.php',
+ 'CBOR\\Decoder' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Decoder.php',
+ 'CBOR\\DecoderInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/DecoderInterface.php',
+ 'CBOR\\IndefiniteLengthByteStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthByteStringObject.php',
+ 'CBOR\\IndefiniteLengthListObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php',
+ 'CBOR\\IndefiniteLengthMapObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php',
+ 'CBOR\\IndefiniteLengthTextStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php',
+ 'CBOR\\InfiniteListObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/InfiniteListObject.php',
+ 'CBOR\\InfiniteMapObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/InfiniteMapObject.php',
+ 'CBOR\\LengthCalculator' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/LengthCalculator.php',
+ 'CBOR\\ListObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/ListObject.php',
+ 'CBOR\\MapItem' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/MapItem.php',
+ 'CBOR\\MapObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/MapObject.php',
+ 'CBOR\\NegativeIntegerObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/NegativeIntegerObject.php',
+ 'CBOR\\Normalizable' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Normalizable.php',
+ 'CBOR\\OtherObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject.php',
+ 'CBOR\\OtherObject\\BreakObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/BreakObject.php',
+ 'CBOR\\OtherObject\\DoublePrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/DoublePrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\FalseObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/FalseObject.php',
+ 'CBOR\\OtherObject\\GenericObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/GenericObject.php',
+ 'CBOR\\OtherObject\\HalfPrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\NullObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/NullObject.php',
+ 'CBOR\\OtherObject\\OtherObjectManager' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php',
+ 'CBOR\\OtherObject\\OtherObjectManagerInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php',
+ 'CBOR\\OtherObject\\SimpleObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/SimpleObject.php',
+ 'CBOR\\OtherObject\\SinglePrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php',
+ 'CBOR\\OtherObject\\TrueObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/TrueObject.php',
+ 'CBOR\\OtherObject\\UndefinedObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php',
+ 'CBOR\\SignedIntegerObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/SignedIntegerObject.php',
+ 'CBOR\\Stream' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Stream.php',
+ 'CBOR\\StringStream' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/StringStream.php',
+ 'CBOR\\Tag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag.php',
+ 'CBOR\\TagObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/TagObject.php',
+ 'CBOR\\Tag\\Base16EncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php',
+ 'CBOR\\Tag\\Base64EncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php',
+ 'CBOR\\Tag\\Base64Tag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64Tag.php',
+ 'CBOR\\Tag\\Base64UrlEncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php',
+ 'CBOR\\Tag\\Base64UrlTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php',
+ 'CBOR\\Tag\\BigFloatTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/BigFloatTag.php',
+ 'CBOR\\Tag\\CBOREncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php',
+ 'CBOR\\Tag\\CBORTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/CBORTag.php',
+ 'CBOR\\Tag\\DatetimeTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/DatetimeTag.php',
+ 'CBOR\\Tag\\DecimalFractionTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php',
+ 'CBOR\\Tag\\EpochTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/EpochTag.php',
+ 'CBOR\\Tag\\GenericTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/GenericTag.php',
+ 'CBOR\\Tag\\MimeTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/MimeTag.php',
+ 'CBOR\\Tag\\NegativeBigIntegerTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php',
+ 'CBOR\\Tag\\PositiveBigIntegerTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/PositiveBigIntegerTag.php',
+ 'CBOR\\Tag\\TagManager' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagManager.php',
+ 'CBOR\\Tag\\TagManagerInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php',
+ 'CBOR\\Tag\\TagObjectManager' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagObjectManager.php',
+ 'CBOR\\Tag\\TimestampTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TimestampTag.php',
+ 'CBOR\\Tag\\UnsignedBigIntegerTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php',
+ 'CBOR\\Tag\\UriTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/UriTag.php',
+ 'CBOR\\TextStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/TextStringObject.php',
+ 'CBOR\\TextStringWithChunkObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/TextStringWithChunkObject.php',
+ 'CBOR\\UnsignedIntegerObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/UnsignedIntegerObject.php',
+ 'CBOR\\Utils' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Utils.php',
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+ 'Cose\\Algorithm\\Algorithm' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Algorithm.php',
+ 'Cose\\Algorithm\\Mac\\HS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS256.php',
+ 'Cose\\Algorithm\\Mac\\HS256Truncated64' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS256Truncated64.php',
+ 'Cose\\Algorithm\\Mac\\HS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS384.php',
+ 'Cose\\Algorithm\\Mac\\HS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS512.php',
+ 'Cose\\Algorithm\\Mac\\Hmac' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/Hmac.php',
+ 'Cose\\Algorithm\\Mac\\Mac' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/Mac.php',
+ 'Cose\\Algorithm\\Manager' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Manager.php',
+ 'Cose\\Algorithm\\ManagerFactory' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/ManagerFactory.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ECDSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECDSA.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ECSignature' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECSignature.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES256K' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256K.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES384.php',
+ 'Cose\\Algorithm\\Signature\\ECDSA\\ES512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES512.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\ED256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/ED256.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\ED512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/ED512.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\Ed25519' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed25519.php',
+ 'Cose\\Algorithm\\Signature\\EdDSA\\EdDSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/EdDSA.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS256.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS384.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS512.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\PSSRSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PSSRSA.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS1' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS1.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS256.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS384.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS512.php',
+ 'Cose\\Algorithm\\Signature\\RSA\\RSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RSA.php',
+ 'Cose\\Algorithm\\Signature\\Signature' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/Signature.php',
+ 'Cose\\Algorithms' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithms.php',
+ 'Cose\\BigInteger' => __DIR__ . '/..' . '/web-auth/cose-lib/src/BigInteger.php',
+ 'Cose\\Hash' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Hash.php',
+ 'Cose\\Key\\Ec2Key' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/Ec2Key.php',
+ 'Cose\\Key\\Key' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/Key.php',
+ 'Cose\\Key\\OkpKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/OkpKey.php',
+ 'Cose\\Key\\RsaKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/RsaKey.php',
+ 'Cose\\Key\\SymmetricKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/SymmetricKey.php',
+ 'Cose\\Verifier' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Verifier.php',
+ 'FG\\ASN1\\ASNObject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/ASNObject.php',
+ 'FG\\ASN1\\AbstractString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/AbstractString.php',
+ 'FG\\ASN1\\AbstractTime' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/AbstractTime.php',
+ 'FG\\ASN1\\Base128' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Base128.php',
+ 'FG\\ASN1\\Composite\\AttributeTypeAndValue' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Composite/AttributeTypeAndValue.php',
+ 'FG\\ASN1\\Composite\\RDNString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Composite/RDNString.php',
+ 'FG\\ASN1\\Composite\\RelativeDistinguishedName' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Composite/RelativeDistinguishedName.php',
+ 'FG\\ASN1\\Construct' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Construct.php',
+ 'FG\\ASN1\\Exception\\NotImplementedException' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Exception/NotImplementedException.php',
+ 'FG\\ASN1\\Exception\\ParserException' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Exception/ParserException.php',
+ 'FG\\ASN1\\ExplicitlyTaggedObject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/ExplicitlyTaggedObject.php',
+ 'FG\\ASN1\\Identifier' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Identifier.php',
+ 'FG\\ASN1\\OID' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/OID.php',
+ 'FG\\ASN1\\Parsable' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Parsable.php',
+ 'FG\\ASN1\\TemplateParser' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/TemplateParser.php',
+ 'FG\\ASN1\\Universal\\BMPString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/BMPString.php',
+ 'FG\\ASN1\\Universal\\BitString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/BitString.php',
+ 'FG\\ASN1\\Universal\\Boolean' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/Boolean.php',
+ 'FG\\ASN1\\Universal\\CharacterString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/CharacterString.php',
+ 'FG\\ASN1\\Universal\\Enumerated' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/Enumerated.php',
+ 'FG\\ASN1\\Universal\\GeneralString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/GeneralString.php',
+ 'FG\\ASN1\\Universal\\GeneralizedTime' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/GeneralizedTime.php',
+ 'FG\\ASN1\\Universal\\GraphicString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/GraphicString.php',
+ 'FG\\ASN1\\Universal\\IA5String' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/IA5String.php',
+ 'FG\\ASN1\\Universal\\Integer' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/Integer.php',
+ 'FG\\ASN1\\Universal\\NullObject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/NullObject.php',
+ 'FG\\ASN1\\Universal\\NumericString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/NumericString.php',
+ 'FG\\ASN1\\Universal\\ObjectDescriptor' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/ObjectDescriptor.php',
+ 'FG\\ASN1\\Universal\\ObjectIdentifier' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/ObjectIdentifier.php',
+ 'FG\\ASN1\\Universal\\OctetString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/OctetString.php',
+ 'FG\\ASN1\\Universal\\PrintableString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/PrintableString.php',
+ 'FG\\ASN1\\Universal\\RelativeObjectIdentifier' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/RelativeObjectIdentifier.php',
+ 'FG\\ASN1\\Universal\\Sequence' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/Sequence.php',
+ 'FG\\ASN1\\Universal\\Set' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/Set.php',
+ 'FG\\ASN1\\Universal\\T61String' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/T61String.php',
+ 'FG\\ASN1\\Universal\\UTCTime' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/UTCTime.php',
+ 'FG\\ASN1\\Universal\\UTF8String' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/UTF8String.php',
+ 'FG\\ASN1\\Universal\\UniversalString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/UniversalString.php',
+ 'FG\\ASN1\\Universal\\VisibleString' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/Universal/VisibleString.php',
+ 'FG\\ASN1\\UnknownConstructedObject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/UnknownConstructedObject.php',
+ 'FG\\ASN1\\UnknownObject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/ASN1/UnknownObject.php',
+ 'FG\\Utility\\BigInteger' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/Utility/BigInteger.php',
+ 'FG\\Utility\\BigIntegerBcmath' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/Utility/BigIntegerBcmath.php',
+ 'FG\\Utility\\BigIntegerGmp' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/Utility/BigIntegerGmp.php',
+ 'FG\\X509\\AlgorithmIdentifier' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/AlgorithmIdentifier.php',
+ 'FG\\X509\\CSR\\Attributes' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/CSR/Attributes.php',
+ 'FG\\X509\\CSR\\CSR' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/CSR/CSR.php',
+ 'FG\\X509\\CertificateExtensions' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/CertificateExtensions.php',
+ 'FG\\X509\\CertificateSubject' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/CertificateSubject.php',
+ 'FG\\X509\\PrivateKey' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/PrivateKey.php',
+ 'FG\\X509\\PublicKey' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/PublicKey.php',
+ 'FG\\X509\\SAN\\DNSName' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/SAN/DNSName.php',
+ 'FG\\X509\\SAN\\IPAddress' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/SAN/IPAddress.php',
+ 'FG\\X509\\SAN\\SubjectAlternativeNames' => __DIR__ . '/..' . '/fgrosse/phpasn1/lib/X509/SAN/SubjectAlternativeNames.php',
+ 'Http\\Message\\MessageFactory' => __DIR__ . '/..' . '/php-http/message-factory/src/MessageFactory.php',
+ 'Http\\Message\\RequestFactory' => __DIR__ . '/..' . '/php-http/message-factory/src/RequestFactory.php',
+ 'Http\\Message\\ResponseFactory' => __DIR__ . '/..' . '/php-http/message-factory/src/ResponseFactory.php',
+ 'Http\\Message\\StreamFactory' => __DIR__ . '/..' . '/php-http/message-factory/src/StreamFactory.php',
+ 'Http\\Message\\UriFactory' => __DIR__ . '/..' . '/php-http/message-factory/src/UriFactory.php',
+ 'Jose\\Component\\Core\\Algorithm' => __DIR__ . '/..' . '/web-token/jwt-core/Algorithm.php',
+ 'Jose\\Component\\Core\\AlgorithmManager' => __DIR__ . '/..' . '/web-token/jwt-core/AlgorithmManager.php',
+ 'Jose\\Component\\Core\\AlgorithmManagerFactory' => __DIR__ . '/..' . '/web-token/jwt-core/AlgorithmManagerFactory.php',
+ 'Jose\\Component\\Core\\JWK' => __DIR__ . '/..' . '/web-token/jwt-core/JWK.php',
+ 'Jose\\Component\\Core\\JWKSet' => __DIR__ . '/..' . '/web-token/jwt-core/JWKSet.php',
+ 'Jose\\Component\\Core\\JWT' => __DIR__ . '/..' . '/web-token/jwt-core/JWT.php',
+ 'Jose\\Component\\Core\\Util\\BigInteger' => __DIR__ . '/..' . '/web-token/jwt-core/Util/BigInteger.php',
+ 'Jose\\Component\\Core\\Util\\ECKey' => __DIR__ . '/..' . '/web-token/jwt-core/Util/ECKey.php',
+ 'Jose\\Component\\Core\\Util\\ECSignature' => __DIR__ . '/..' . '/web-token/jwt-core/Util/ECSignature.php',
+ 'Jose\\Component\\Core\\Util\\Hash' => __DIR__ . '/..' . '/web-token/jwt-core/Util/Hash.php',
+ 'Jose\\Component\\Core\\Util\\JsonConverter' => __DIR__ . '/..' . '/web-token/jwt-core/Util/JsonConverter.php',
+ 'Jose\\Component\\Core\\Util\\KeyChecker' => __DIR__ . '/..' . '/web-token/jwt-core/Util/KeyChecker.php',
+ 'Jose\\Component\\Core\\Util\\RSAKey' => __DIR__ . '/..' . '/web-token/jwt-core/Util/RSAKey.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\AlgorithmAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/AlgorithmAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES256KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/ES256KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES384KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/ES384KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ES512KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/ES512KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS256KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/HS256KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS384KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/HS384KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\HS512KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/HS512KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/KeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyAnalyzerManager' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/KeyAnalyzerManager.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeyIdentifierAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/KeyIdentifierAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeysetAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/KeysetAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\KeysetAnalyzerManager' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/KeysetAnalyzerManager.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\Message' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/Message.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MessageBag' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/MessageBag.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MixedKeyTypes' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/MixedKeyTypes.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\MixedPublicAndPrivateKeys' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/MixedPublicAndPrivateKeys.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\NoneAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/NoneAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\OctAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/OctAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\RsaAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/RsaAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\UsageAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/UsageAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\Analyzer\\ZxcvbnKeyAnalyzer' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/Analyzer/ZxcvbnKeyAnalyzer.php',
+ 'Jose\\Component\\KeyManagement\\JKUFactory' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/JKUFactory.php',
+ 'Jose\\Component\\KeyManagement\\JWKFactory' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/JWKFactory.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\ECKey' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/KeyConverter/ECKey.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\KeyConverter' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/KeyConverter/KeyConverter.php',
+ 'Jose\\Component\\KeyManagement\\KeyConverter\\RSAKey' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/KeyConverter/RSAKey.php',
+ 'Jose\\Component\\KeyManagement\\UrlKeySetFactory' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/UrlKeySetFactory.php',
+ 'Jose\\Component\\KeyManagement\\X5UFactory' => __DIR__ . '/..' . '/web-token/jwt-key-mgmt/X5UFactory.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ECDSA' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/ECDSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES256' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/ES256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES384' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/ES384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\ES512' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-ecdsa/ES512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\EdDSA' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-eddsa/EdDSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\MacAlgorithm' => __DIR__ . '/..' . '/web-token/jwt-signature/Algorithm/MacAlgorithm.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS256' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/PS256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS384' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/PS384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\PS512' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/PS512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS256' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RS256.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS384' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RS384.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RS512' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RS512.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSA' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RSA.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSAPKCS1' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RSAPKCS1.php',
+ 'Jose\\Component\\Signature\\Algorithm\\RSAPSS' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/RSAPSS.php',
+ 'Jose\\Component\\Signature\\Algorithm\\SignatureAlgorithm' => __DIR__ . '/..' . '/web-token/jwt-signature/Algorithm/SignatureAlgorithm.php',
+ 'Jose\\Component\\Signature\\Algorithm\\Util\\RSA' => __DIR__ . '/..' . '/web-token/jwt-signature-algorithm-rsa/Util/RSA.php',
+ 'Jose\\Component\\Signature\\JWS' => __DIR__ . '/..' . '/web-token/jwt-signature/JWS.php',
+ 'Jose\\Component\\Signature\\JWSBuilder' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSBuilder.php',
+ 'Jose\\Component\\Signature\\JWSBuilderFactory' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSBuilderFactory.php',
+ 'Jose\\Component\\Signature\\JWSLoader' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSLoader.php',
+ 'Jose\\Component\\Signature\\JWSLoaderFactory' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSLoaderFactory.php',
+ 'Jose\\Component\\Signature\\JWSTokenSupport' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSTokenSupport.php',
+ 'Jose\\Component\\Signature\\JWSVerifier' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSVerifier.php',
+ 'Jose\\Component\\Signature\\JWSVerifierFactory' => __DIR__ . '/..' . '/web-token/jwt-signature/JWSVerifierFactory.php',
+ 'Jose\\Component\\Signature\\Serializer\\CompactSerializer' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/CompactSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JSONFlattenedSerializer' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/JSONFlattenedSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JSONGeneralSerializer' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/JSONGeneralSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializer' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/JWSSerializer.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializerManager' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/JWSSerializerManager.php',
+ 'Jose\\Component\\Signature\\Serializer\\JWSSerializerManagerFactory' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/JWSSerializerManagerFactory.php',
+ 'Jose\\Component\\Signature\\Serializer\\Serializer' => __DIR__ . '/..' . '/web-token/jwt-signature/Serializer/Serializer.php',
+ 'Jose\\Component\\Signature\\Signature' => __DIR__ . '/..' . '/web-token/jwt-signature/Signature.php',
+ 'League\\Uri\\Contracts\\AuthorityInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/AuthorityInterface.php',
+ 'League\\Uri\\Contracts\\DataPathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/DataPathInterface.php',
+ 'League\\Uri\\Contracts\\DomainHostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/DomainHostInterface.php',
+ 'League\\Uri\\Contracts\\FragmentInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/FragmentInterface.php',
+ 'League\\Uri\\Contracts\\HostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/HostInterface.php',
+ 'League\\Uri\\Contracts\\IpHostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/IpHostInterface.php',
+ 'League\\Uri\\Contracts\\PathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/PathInterface.php',
+ 'League\\Uri\\Contracts\\PortInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/PortInterface.php',
+ 'League\\Uri\\Contracts\\QueryInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/QueryInterface.php',
+ 'League\\Uri\\Contracts\\SegmentedPathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php',
+ 'League\\Uri\\Contracts\\UriComponentInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/UriComponentInterface.php',
+ 'League\\Uri\\Contracts\\UriException' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/UriException.php',
+ 'League\\Uri\\Contracts\\UriInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/UriInterface.php',
+ 'League\\Uri\\Contracts\\UserInfoInterface' => __DIR__ . '/..' . '/league/uri-interfaces/src/Contracts/UserInfoInterface.php',
+ 'League\\Uri\\Exceptions\\FileinfoSupportMissing' => __DIR__ . '/..' . '/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php',
+ 'League\\Uri\\Exceptions\\IdnSupportMissing' => __DIR__ . '/..' . '/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php',
+ 'League\\Uri\\Exceptions\\IdnaConversionFailed' => __DIR__ . '/..' . '/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php',
+ 'League\\Uri\\Exceptions\\SyntaxError' => __DIR__ . '/..' . '/league/uri-interfaces/src/Exceptions/SyntaxError.php',
+ 'League\\Uri\\Exceptions\\TemplateCanNotBeExpanded' => __DIR__ . '/..' . '/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php',
+ 'League\\Uri\\Http' => __DIR__ . '/..' . '/league/uri/src/Http.php',
+ 'League\\Uri\\HttpFactory' => __DIR__ . '/..' . '/league/uri/src/HttpFactory.php',
+ 'League\\Uri\\Idna\\Idna' => __DIR__ . '/..' . '/league/uri-interfaces/src/Idna/Idna.php',
+ 'League\\Uri\\Idna\\IdnaInfo' => __DIR__ . '/..' . '/league/uri-interfaces/src/Idna/IdnaInfo.php',
+ 'League\\Uri\\Uri' => __DIR__ . '/..' . '/league/uri/src/Uri.php',
+ 'League\\Uri\\UriInfo' => __DIR__ . '/..' . '/league/uri/src/UriInfo.php',
+ 'League\\Uri\\UriResolver' => __DIR__ . '/..' . '/league/uri/src/UriResolver.php',
+ 'League\\Uri\\UriString' => __DIR__ . '/..' . '/league/uri/src/UriString.php',
+ 'League\\Uri\\UriTemplate' => __DIR__ . '/..' . '/league/uri/src/UriTemplate.php',
+ 'League\\Uri\\UriTemplate\\Expression' => __DIR__ . '/..' . '/league/uri/src/UriTemplate/Expression.php',
+ 'League\\Uri\\UriTemplate\\Template' => __DIR__ . '/..' . '/league/uri/src/UriTemplate/Template.php',
+ 'League\\Uri\\UriTemplate\\VarSpecifier' => __DIR__ . '/..' . '/league/uri/src/UriTemplate/VarSpecifier.php',
+ 'League\\Uri\\UriTemplate\\VariableBag' => __DIR__ . '/..' . '/league/uri/src/UriTemplate/VariableBag.php',
+ 'Nyholm\\Psr7Server\\ServerRequestCreator' => __DIR__ . '/..' . '/nyholm/psr7-server/src/ServerRequestCreator.php',
+ 'Nyholm\\Psr7Server\\ServerRequestCreatorInterface' => __DIR__ . '/..' . '/nyholm/psr7-server/src/ServerRequestCreatorInterface.php',
+ 'Nyholm\\Psr7\\Factory\\HttplugFactory' => __DIR__ . '/..' . '/nyholm/psr7/src/Factory/HttplugFactory.php',
+ 'Nyholm\\Psr7\\Factory\\Psr17Factory' => __DIR__ . '/..' . '/nyholm/psr7/src/Factory/Psr17Factory.php',
+ 'Nyholm\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/nyholm/psr7/src/MessageTrait.php',
+ 'Nyholm\\Psr7\\Request' => __DIR__ . '/..' . '/nyholm/psr7/src/Request.php',
+ 'Nyholm\\Psr7\\RequestTrait' => __DIR__ . '/..' . '/nyholm/psr7/src/RequestTrait.php',
+ 'Nyholm\\Psr7\\Response' => __DIR__ . '/..' . '/nyholm/psr7/src/Response.php',
+ 'Nyholm\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/nyholm/psr7/src/ServerRequest.php',
+ 'Nyholm\\Psr7\\Stream' => __DIR__ . '/..' . '/nyholm/psr7/src/Stream.php',
+ 'Nyholm\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/nyholm/psr7/src/UploadedFile.php',
+ 'Nyholm\\Psr7\\Uri' => __DIR__ . '/..' . '/nyholm/psr7/src/Uri.php',
+ 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+ 'Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php',
+ 'Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php',
+ 'Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php',
+ 'Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/RequestExceptionInterface.php',
+ 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
+ 'Ramsey\\Collection\\AbstractArray' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractArray.php',
+ 'Ramsey\\Collection\\AbstractCollection' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractCollection.php',
+ 'Ramsey\\Collection\\AbstractSet' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractSet.php',
+ 'Ramsey\\Collection\\ArrayInterface' => __DIR__ . '/..' . '/ramsey/collection/src/ArrayInterface.php',
+ 'Ramsey\\Collection\\Collection' => __DIR__ . '/..' . '/ramsey/collection/src/Collection.php',
+ 'Ramsey\\Collection\\CollectionInterface' => __DIR__ . '/..' . '/ramsey/collection/src/CollectionInterface.php',
+ 'Ramsey\\Collection\\DoubleEndedQueue' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueue.php',
+ 'Ramsey\\Collection\\DoubleEndedQueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueueInterface.php',
+ 'Ramsey\\Collection\\Exception\\CollectionMismatchException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionMismatchException.php',
+ 'Ramsey\\Collection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidArgumentException.php',
+ 'Ramsey\\Collection\\Exception\\InvalidSortOrderException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidSortOrderException.php',
+ 'Ramsey\\Collection\\Exception\\NoSuchElementException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/NoSuchElementException.php',
+ 'Ramsey\\Collection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/OutOfBoundsException.php',
+ 'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Collection\\Exception\\ValueExtractionException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/ValueExtractionException.php',
+ 'Ramsey\\Collection\\GenericArray' => __DIR__ . '/..' . '/ramsey/collection/src/GenericArray.php',
+ 'Ramsey\\Collection\\Map\\AbstractMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractMap.php',
+ 'Ramsey\\Collection\\Map\\AbstractTypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractTypedMap.php',
+ 'Ramsey\\Collection\\Map\\AssociativeArrayMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AssociativeArrayMap.php',
+ 'Ramsey\\Collection\\Map\\MapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/MapInterface.php',
+ 'Ramsey\\Collection\\Map\\NamedParameterMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/NamedParameterMap.php',
+ 'Ramsey\\Collection\\Map\\TypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMap.php',
+ 'Ramsey\\Collection\\Map\\TypedMapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMapInterface.php',
+ 'Ramsey\\Collection\\Queue' => __DIR__ . '/..' . '/ramsey/collection/src/Queue.php',
+ 'Ramsey\\Collection\\QueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/QueueInterface.php',
+ 'Ramsey\\Collection\\Set' => __DIR__ . '/..' . '/ramsey/collection/src/Set.php',
+ 'Ramsey\\Collection\\Tool\\TypeTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/TypeTrait.php',
+ 'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueExtractorTrait.php',
+ 'Ramsey\\Collection\\Tool\\ValueToStringTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueToStringTrait.php',
+ 'Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php',
+ 'Ramsey\\Uuid\\Builder\\BuilderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/BuilderCollection.php',
+ 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\FallbackBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/FallbackBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
+ 'Ramsey\\Uuid\\Codec\\CodecInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/CodecInterface.php',
+ 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
+ 'Ramsey\\Uuid\\Codec\\StringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/StringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
+ 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
+ 'Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php',
+ 'Ramsey\\Uuid\\DeprecatedUuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidInterface.php',
+ 'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php',
+ 'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php',
+ 'Ramsey\\Uuid\\Exception\\DateTimeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DateTimeException.php',
+ 'Ramsey\\Uuid\\Exception\\DceSecurityException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DceSecurityException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidArgumentException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidBytesException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidBytesException.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
+ 'Ramsey\\Uuid\\Exception\\NameException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NameException.php',
+ 'Ramsey\\Uuid\\Exception\\NodeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NodeException.php',
+ 'Ramsey\\Uuid\\Exception\\RandomSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/RandomSourceException.php',
+ 'Ramsey\\Uuid\\Exception\\TimeSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/TimeSourceException.php',
+ 'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php',
+ 'Ramsey\\Uuid\\FeatureSet' => __DIR__ . '/..' . '/ramsey/uuid/src/FeatureSet.php',
+ 'Ramsey\\Uuid\\Fields\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/FieldsInterface.php',
+ 'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php',
+ 'Ramsey\\Uuid\\Generator\\CombGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/CombGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Guid\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Fields.php',
+ 'Ramsey\\Uuid\\Guid\\Guid' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Guid.php',
+ 'Ramsey\\Uuid\\Guid\\GuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/GuidBuilder.php',
+ 'Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => __DIR__ . '/..' . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php',
+ 'Ramsey\\Uuid\\Math\\BrickMathCalculator' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/BrickMathCalculator.php',
+ 'Ramsey\\Uuid\\Math\\CalculatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/CalculatorInterface.php',
+ 'Ramsey\\Uuid\\Math\\RoundingMode' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/RoundingMode.php',
+ 'Ramsey\\Uuid\\Nonstandard\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Fields.php',
+ 'Ramsey\\Uuid\\Nonstandard\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Uuid.php',
+ 'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php',
+ 'Ramsey\\Uuid\\Nonstandard\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidV6.php',
+ 'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php',
+ 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
+ 'Ramsey\\Uuid\\Rfc4122\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Fields.php',
+ 'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php',
+ 'Ramsey\\Uuid\\Rfc4122\\NilTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilTrait.php',
+ 'Ramsey\\Uuid\\Rfc4122\\NilUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilUuid.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidInterface.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV1' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV1.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV2' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV2.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV3' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV3.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV4' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV4.php',
+ 'Ramsey\\Uuid\\Rfc4122\\UuidV5' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV5.php',
+ 'Ramsey\\Uuid\\Rfc4122\\Validator' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Validator.php',
+ 'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VariantTrait.php',
+ 'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VersionTrait.php',
+ 'Ramsey\\Uuid\\Type\\Decimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Decimal.php',
+ 'Ramsey\\Uuid\\Type\\Hexadecimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Hexadecimal.php',
+ 'Ramsey\\Uuid\\Type\\Integer' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Integer.php',
+ 'Ramsey\\Uuid\\Type\\NumberInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/NumberInterface.php',
+ 'Ramsey\\Uuid\\Type\\Time' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Time.php',
+ 'Ramsey\\Uuid\\Type\\TypeInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/TypeInterface.php',
+ 'Ramsey\\Uuid\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Uuid.php',
+ 'Ramsey\\Uuid\\UuidFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactory.php',
+ 'Ramsey\\Uuid\\UuidFactoryInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactoryInterface.php',
+ 'Ramsey\\Uuid\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidInterface.php',
+ 'Ramsey\\Uuid\\Validator\\GenericValidator' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/GenericValidator.php',
+ 'Ramsey\\Uuid\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/ValidatorInterface.php',
+ 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php',
+ 'Safe\\DateTime' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTime.php',
+ 'Safe\\DateTimeImmutable' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
+ 'Safe\\Exceptions\\ApacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
+ 'Safe\\Exceptions\\ApcException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/ApcException.php',
+ 'Safe\\Exceptions\\ApcuException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
+ 'Safe\\Exceptions\\ArrayException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
+ 'Safe\\Exceptions\\Bzip2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
+ 'Safe\\Exceptions\\CalendarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
+ 'Safe\\Exceptions\\ClassobjException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
+ 'Safe\\Exceptions\\ComException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
+ 'Safe\\Exceptions\\CubridException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
+ 'Safe\\Exceptions\\CurlException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
+ 'Safe\\Exceptions\\DatetimeException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
+ 'Safe\\Exceptions\\DirException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
+ 'Safe\\Exceptions\\EioException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
+ 'Safe\\Exceptions\\ErrorfuncException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
+ 'Safe\\Exceptions\\ExecException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
+ 'Safe\\Exceptions\\FileinfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
+ 'Safe\\Exceptions\\FilesystemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
+ 'Safe\\Exceptions\\FilterException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
+ 'Safe\\Exceptions\\FpmException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
+ 'Safe\\Exceptions\\FtpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
+ 'Safe\\Exceptions\\FunchandException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
+ 'Safe\\Exceptions\\GmpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
+ 'Safe\\Exceptions\\GnupgException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
+ 'Safe\\Exceptions\\HashException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
+ 'Safe\\Exceptions\\IbaseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
+ 'Safe\\Exceptions\\IbmDb2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
+ 'Safe\\Exceptions\\IconvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
+ 'Safe\\Exceptions\\ImageException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
+ 'Safe\\Exceptions\\ImapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
+ 'Safe\\Exceptions\\InfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
+ 'Safe\\Exceptions\\IngresiiException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IngresiiException.php',
+ 'Safe\\Exceptions\\InotifyException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
+ 'Safe\\Exceptions\\JsonException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
+ 'Safe\\Exceptions\\LdapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
+ 'Safe\\Exceptions\\LibeventException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/LibeventException.php',
+ 'Safe\\Exceptions\\LibxmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
+ 'Safe\\Exceptions\\LzfException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
+ 'Safe\\Exceptions\\MailparseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
+ 'Safe\\Exceptions\\MbstringException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
+ 'Safe\\Exceptions\\MiscException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
+ 'Safe\\Exceptions\\MsqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MsqlException.php',
+ 'Safe\\Exceptions\\MssqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/MssqlException.php',
+ 'Safe\\Exceptions\\MysqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
+ 'Safe\\Exceptions\\MysqliException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqliException.php',
+ 'Safe\\Exceptions\\MysqlndMsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php',
+ 'Safe\\Exceptions\\MysqlndQcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php',
+ 'Safe\\Exceptions\\NetworkException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
+ 'Safe\\Exceptions\\Oci8Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
+ 'Safe\\Exceptions\\OpcacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
+ 'Safe\\Exceptions\\OpensslException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
+ 'Safe\\Exceptions\\OutcontrolException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
+ 'Safe\\Exceptions\\PasswordException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PasswordException.php',
+ 'Safe\\Exceptions\\PcntlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
+ 'Safe\\Exceptions\\PcreException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
+ 'Safe\\Exceptions\\PdfException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PdfException.php',
+ 'Safe\\Exceptions\\PgsqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
+ 'Safe\\Exceptions\\PosixException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
+ 'Safe\\Exceptions\\PsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
+ 'Safe\\Exceptions\\PspellException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
+ 'Safe\\Exceptions\\ReadlineException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
+ 'Safe\\Exceptions\\RpminfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
+ 'Safe\\Exceptions\\RrdException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
+ 'Safe\\Exceptions\\SafeExceptionInterface' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
+ 'Safe\\Exceptions\\SemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
+ 'Safe\\Exceptions\\SessionException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
+ 'Safe\\Exceptions\\ShmopException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
+ 'Safe\\Exceptions\\SimplexmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SimplexmlException.php',
+ 'Safe\\Exceptions\\SocketsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
+ 'Safe\\Exceptions\\SodiumException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
+ 'Safe\\Exceptions\\SolrException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
+ 'Safe\\Exceptions\\SplException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
+ 'Safe\\Exceptions\\SqlsrvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
+ 'Safe\\Exceptions\\SsdeepException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
+ 'Safe\\Exceptions\\Ssh2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
+ 'Safe\\Exceptions\\StatsException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/StatsException.php',
+ 'Safe\\Exceptions\\StreamException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
+ 'Safe\\Exceptions\\StringsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
+ 'Safe\\Exceptions\\SwooleException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
+ 'Safe\\Exceptions\\UodbcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
+ 'Safe\\Exceptions\\UopzException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
+ 'Safe\\Exceptions\\UrlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
+ 'Safe\\Exceptions\\VarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
+ 'Safe\\Exceptions\\XdiffException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
+ 'Safe\\Exceptions\\XmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
+ 'Safe\\Exceptions\\XmlrpcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
+ 'Safe\\Exceptions\\YamlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
+ 'Safe\\Exceptions\\YazException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
+ 'Safe\\Exceptions\\ZipException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
+ 'Safe\\Exceptions\\ZlibException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
+ 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
+ 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php',
+ 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php',
+ 'Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php',
+ 'Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php',
+ 'Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php',
+ 'Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php',
+ 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php',
+ 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php',
+ 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php',
+ 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php',
+ 'Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php',
+ 'Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php',
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php',
+ 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php',
+ 'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php',
+ 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+ 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
+ 'Webauthn\\AttestationStatement\\AndroidKeyAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidKeyAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AndroidSafetyNetAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidSafetyNetAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AppleAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AppleAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AttestationObject' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObject.php',
+ 'Webauthn\\AttestationStatement\\AttestationObjectLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObjectLoader.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatement' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatement.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\AttestationStatementSupportManager' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupportManager.php',
+ 'Webauthn\\AttestationStatement\\FidoU2FAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/FidoU2FAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\NoneAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/NoneAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\PackedAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/PackedAttestationStatementSupport.php',
+ 'Webauthn\\AttestationStatement\\TPMAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/TPMAttestationStatementSupport.php',
+ 'Webauthn\\AttestedCredentialData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestedCredentialData.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtension' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtension.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientInputs' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientInputs.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputs' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputs.php',
+ 'Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputsLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputsLoader.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputChecker.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputCheckerHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputCheckerHandler.php',
+ 'Webauthn\\AuthenticationExtensions\\ExtensionOutputError' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputError.php',
+ 'Webauthn\\AuthenticatorAssertionResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponse.php',
+ 'Webauthn\\AuthenticatorAssertionResponseValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponseValidator.php',
+ 'Webauthn\\AuthenticatorAttestationResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponse.php',
+ 'Webauthn\\AuthenticatorAttestationResponseValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponseValidator.php',
+ 'Webauthn\\AuthenticatorData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorData.php',
+ 'Webauthn\\AuthenticatorResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorResponse.php',
+ 'Webauthn\\AuthenticatorSelectionCriteria' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorSelectionCriteria.php',
+ 'Webauthn\\CertificateChainChecker\\CertificateChainChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateChainChecker/CertificateChainChecker.php',
+ 'Webauthn\\CertificateChainChecker\\OpenSSLCertificateChainChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateChainChecker/OpenSSLCertificateChainChecker.php',
+ 'Webauthn\\CertificateToolbox' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateToolbox.php',
+ 'Webauthn\\CollectedClientData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CollectedClientData.php',
+ 'Webauthn\\Counter\\CounterChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Counter/CounterChecker.php',
+ 'Webauthn\\Counter\\ThrowExceptionIfInvalid' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Counter/ThrowExceptionIfInvalid.php',
+ 'Webauthn\\Credential' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Credential.php',
+ 'Webauthn\\MetadataService\\AbstractDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/AbstractDescriptor.php',
+ 'Webauthn\\MetadataService\\AuthenticatorStatus' => __DIR__ . '/..' . '/web-auth/metadata-service/src/AuthenticatorStatus.php',
+ 'Webauthn\\MetadataService\\BiometricAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/BiometricAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\BiometricStatusReport' => __DIR__ . '/..' . '/web-auth/metadata-service/src/BiometricStatusReport.php',
+ 'Webauthn\\MetadataService\\CodeAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/CodeAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\DisplayPNGCharacteristicsDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/DisplayPNGCharacteristicsDescriptor.php',
+ 'Webauthn\\MetadataService\\DistantSingleMetadata' => __DIR__ . '/..' . '/web-auth/metadata-service/src/DistantSingleMetadata.php',
+ 'Webauthn\\MetadataService\\EcdaaTrustAnchor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/EcdaaTrustAnchor.php',
+ 'Webauthn\\MetadataService\\ExtensionDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/ExtensionDescriptor.php',
+ 'Webauthn\\MetadataService\\MetadataService' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataService.php',
+ 'Webauthn\\MetadataService\\MetadataStatement' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataStatement.php',
+ 'Webauthn\\MetadataService\\MetadataStatementFetcher' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataStatementFetcher.php',
+ 'Webauthn\\MetadataService\\MetadataStatementRepository' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataStatementRepository.php',
+ 'Webauthn\\MetadataService\\MetadataTOCPayload' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataTOCPayload.php',
+ 'Webauthn\\MetadataService\\MetadataTOCPayloadEntry' => __DIR__ . '/..' . '/web-auth/metadata-service/src/MetadataTOCPayloadEntry.php',
+ 'Webauthn\\MetadataService\\PatternAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/PatternAccuracyDescriptor.php',
+ 'Webauthn\\MetadataService\\RgbPaletteEntry' => __DIR__ . '/..' . '/web-auth/metadata-service/src/RgbPaletteEntry.php',
+ 'Webauthn\\MetadataService\\RogueListEntry' => __DIR__ . '/..' . '/web-auth/metadata-service/src/RogueListEntry.php',
+ 'Webauthn\\MetadataService\\SingleMetadata' => __DIR__ . '/..' . '/web-auth/metadata-service/src/SingleMetadata.php',
+ 'Webauthn\\MetadataService\\StatusReport' => __DIR__ . '/..' . '/web-auth/metadata-service/src/StatusReport.php',
+ 'Webauthn\\MetadataService\\Utils' => __DIR__ . '/..' . '/web-auth/metadata-service/src/Utils.php',
+ 'Webauthn\\MetadataService\\VerificationMethodANDCombinations' => __DIR__ . '/..' . '/web-auth/metadata-service/src/VerificationMethodANDCombinations.php',
+ 'Webauthn\\MetadataService\\VerificationMethodDescriptor' => __DIR__ . '/..' . '/web-auth/metadata-service/src/VerificationMethodDescriptor.php',
+ 'Webauthn\\MetadataService\\Version' => __DIR__ . '/..' . '/web-auth/metadata-service/src/Version.php',
+ 'Webauthn\\PublicKeyCredential' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredential.php',
+ 'Webauthn\\PublicKeyCredentialCreationOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialCreationOptions.php',
+ 'Webauthn\\PublicKeyCredentialDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptor.php',
+ 'Webauthn\\PublicKeyCredentialDescriptorCollection' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptorCollection.php',
+ 'Webauthn\\PublicKeyCredentialEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialEntity.php',
+ 'Webauthn\\PublicKeyCredentialLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialLoader.php',
+ 'Webauthn\\PublicKeyCredentialOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialOptions.php',
+ 'Webauthn\\PublicKeyCredentialParameters' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialParameters.php',
+ 'Webauthn\\PublicKeyCredentialRequestOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialRequestOptions.php',
+ 'Webauthn\\PublicKeyCredentialRpEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialRpEntity.php',
+ 'Webauthn\\PublicKeyCredentialSource' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialSource.php',
+ 'Webauthn\\PublicKeyCredentialSourceRepository' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialSourceRepository.php',
+ 'Webauthn\\PublicKeyCredentialUserEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialUserEntity.php',
+ 'Webauthn\\Server' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Server.php',
+ 'Webauthn\\StringStream' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/StringStream.php',
+ 'Webauthn\\TokenBinding\\IgnoreTokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/IgnoreTokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\SecTokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/SecTokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\TokenBinding' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBinding.php',
+ 'Webauthn\\TokenBinding\\TokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingHandler.php',
+ 'Webauthn\\TokenBinding\\TokenBindingNotSupportedHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingNotSupportedHandler.php',
+ 'Webauthn\\TrustPath\\CertificateTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/CertificateTrustPath.php',
+ 'Webauthn\\TrustPath\\EcdaaKeyIdTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/EcdaaKeyIdTrustPath.php',
+ 'Webauthn\\TrustPath\\EmptyTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/EmptyTrustPath.php',
+ 'Webauthn\\TrustPath\\TrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/TrustPath.php',
+ 'Webauthn\\TrustPath\\TrustPathLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/TrustPathLoader.php',
+ 'Webauthn\\U2FPublicKey' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/U2FPublicKey.php',
+ 'Webauthn\\Util\\CoseSignatureFixer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Util/CoseSignatureFixer.php',
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInit8c7684b956de574bcb0eefe2be31e0ab::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInit8c7684b956de574bcb0eefe2be31e0ab::$prefixDirsPsr4;
+ $loader->classMap = ComposerStaticInit8c7684b956de574bcb0eefe2be31e0ab::$classMap;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/installed.json b/wp-content/plugins/wp-webauthn/vendor/composer/installed.json
new file mode 100644
index 00000000..93d6831d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/installed.json
@@ -0,0 +1,2474 @@
+{
+ "packages": [
+ {
+ "name": "beberlei/assert",
+ "version": "v3.3.2",
+ "version_normalized": "3.3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/beberlei/assert.git",
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655",
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": "^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+ },
+ "time": "2021-12-16T21:41:27+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "lib/Assert/functions.php"
+ ],
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Collaborator"
+ }
+ ],
+ "description": "Thin assertion library for input validation in business models.",
+ "keywords": [
+ "assert",
+ "assertion",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/beberlei/assert/issues",
+ "source": "https://github.com/beberlei/assert/tree/v3.3.2"
+ },
+ "install-path": "../beberlei/assert"
+ },
+ {
+ "name": "brick/math",
+ "version": "0.9.3",
+ "version_normalized": "0.9.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae",
+ "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+ "vimeo/psalm": "4.9.2"
+ },
+ "time": "2021-08-15T20:50:18+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "support": {
+ "issues": "https://github.com/brick/math/issues",
+ "source": "https://github.com/brick/math/tree/0.9.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/BenMorel",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/brick/math",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../brick/math"
+ },
+ {
+ "name": "fgrosse/phpasn1",
+ "version": "v2.4.0",
+ "version_normalized": "2.4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fgrosse/PHPASN1.git",
+ "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/eef488991d53e58e60c9554b09b1201ca5ba9296",
+ "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "~2.0",
+ "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0"
+ },
+ "suggest": {
+ "ext-bcmath": "BCmath is the fallback extension for big integer calculations",
+ "ext-curl": "For loading OID information from the web if they have not bee defined statically",
+ "ext-gmp": "GMP is the preferred extension for big integer calculations",
+ "phpseclib/bcmath_compat": "BCmath polyfill for servers where neither GMP nor BCmath is available"
+ },
+ "time": "2021-12-11T12:41:06+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "FG\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Friedrich Große",
+ "email": "friedrich.grosse@gmail.com",
+ "homepage": "https://github.com/FGrosse",
+ "role": "Author"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/FGrosse/PHPASN1/contributors"
+ }
+ ],
+ "description": "A PHP Framework that allows you to encode and decode arbitrary ASN.1 structures using the ITU-T X.690 Encoding Rules.",
+ "homepage": "https://github.com/FGrosse/PHPASN1",
+ "keywords": [
+ "DER",
+ "asn.1",
+ "asn1",
+ "ber",
+ "binary",
+ "decoding",
+ "encoding",
+ "x.509",
+ "x.690",
+ "x509",
+ "x690"
+ ],
+ "support": {
+ "issues": "https://github.com/fgrosse/PHPASN1/issues",
+ "source": "https://github.com/fgrosse/PHPASN1/tree/v2.4.0"
+ },
+ "install-path": "../fgrosse/phpasn1"
+ },
+ {
+ "name": "league/uri",
+ "version": "6.5.0",
+ "version_normalized": "6.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/c68ca445abb04817d740ddd6d0b3551826ef0c5a",
+ "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "league/uri-interfaces": "^2.3",
+ "php": "^7.3 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19 || ^3.0",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-phpunit": "^0.12.22",
+ "phpstan/phpstan-strict-rules": "^0.12.11",
+ "phpunit/phpunit": "^8.0 || ^9.0",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "ext-intl": "Needed to improve host validation",
+ "league/uri-components": "Needed to easily manipulate URI objects",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "time": "2021-08-27T09:54:07+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "http://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri/issues",
+ "source": "https://github.com/thephpleague/uri/tree/6.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "install-path": "../league/uri"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "2.3.0",
+ "version_normalized": "2.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ },
+ "time": "2021-06-28T04:27:21+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interface for URI representation",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "keywords": [
+ "rfc3986",
+ "rfc3987",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/uri-interfaces/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "install-path": "../league/uri-interfaces"
+ },
+ {
+ "name": "nyholm/psr7",
+ "version": "1.5.0",
+ "version_normalized": "1.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Nyholm/psr7.git",
+ "reference": "1461e07a0f2a975a52082ca3b769ca912b816226"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Nyholm/psr7/zipball/1461e07a0f2a975a52082ca3b769ca912b816226",
+ "reference": "1461e07a0f2a975a52082ca3b769ca912b816226",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1",
+ "php-http/message-factory": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "php-http/psr7-integration-tests": "^1.0",
+ "phpunit/phpunit": "^7.5 || 8.5 || 9.4",
+ "symfony/error-handler": "^4.4"
+ },
+ "time": "2022-02-02T18:37:57+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "description": "A fast PHP7 implementation of PSR-7",
+ "homepage": "https://tnyholm.se",
+ "keywords": [
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/Nyholm/psr7/issues",
+ "source": "https://github.com/Nyholm/psr7/tree/1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "install-path": "../nyholm/psr7"
+ },
+ {
+ "name": "nyholm/psr7-server",
+ "version": "0.4.2",
+ "version_normalized": "0.4.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Nyholm/psr7-server.git",
+ "reference": "aab2962c970a1776447894e4fd3825a3d69dee61"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Nyholm/psr7-server/zipball/aab2962c970a1776447894e4fd3825a3d69dee61",
+ "reference": "aab2962c970a1776447894e4fd3825a3d69dee61",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "nyholm/nsa": "^1.1",
+ "nyholm/psr7": "^1.3",
+ "phpunit/phpunit": "^7.0"
+ },
+ "time": "2020-06-06T10:33:29+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7Server\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "description": "Helper classes to handle PSR-7 server requests",
+ "homepage": "http://tnyholm.se",
+ "keywords": [
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/Nyholm/psr7-server/issues",
+ "source": "https://github.com/Nyholm/psr7-server/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "install-path": "../nyholm/psr7-server"
+ },
+ {
+ "name": "php-http/message-factory",
+ "version": "v1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message-factory.git",
+ "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
+ "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "^1.0"
+ },
+ "time": "2015-12-19T14:08:53+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Factory interfaces for PSR-7 HTTP Message",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message-factory/issues",
+ "source": "https://github.com/php-http/message-factory/tree/master"
+ },
+ "install-path": "../php-http/message-factory"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "time": "2020-06-29T06:28:15+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/master"
+ },
+ "install-path": "../psr/http-client"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "time": "2019-04-30T12:38:16+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/master"
+ },
+ "install-path": "../psr/http-factory"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-08-06T14:39:51+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
+ "install-path": "../psr/http-message"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.4",
+ "version_normalized": "1.1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2021-05-03T11:20:27+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
+ },
+ "install-path": "../psr/log"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "1.2.2",
+ "version_normalized": "1.2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a",
+ "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.3 || ^8",
+ "symfony/polyfill-php81": "^1.23"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "ergebnis/composer-normalize": "^2.6",
+ "fakerphp/faker": "^1.5",
+ "hamcrest/hamcrest-php": "^2",
+ "jangregor/phpstan-prophecy": "^0.8",
+ "mockery/mockery": "^1.3",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1",
+ "phpstan/phpstan": "^0.12.32",
+ "phpstan/phpstan-mockery": "^0.12.5",
+ "phpstan/phpstan-phpunit": "^0.12.11",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "psy/psysh": "^0.10.4",
+ "slevomat/coding-standard": "^6.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.4"
+ },
+ "time": "2021-10-10T03:01:02+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/collection/issues",
+ "source": "https://github.com/ramsey/collection/tree/1.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../ramsey/collection"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.2.3",
+ "version_normalized": "4.2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df",
+ "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8 || ^0.9",
+ "ext-json": "*",
+ "php": "^7.2 || ^8.0",
+ "ramsey/collection": "^1.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php80": "^1.14"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.10",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "ergebnis/composer-normalize": "^2.15",
+ "mockery/mockery": "^1.3",
+ "moontoast/math": "^1.1",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^1.0",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-mockery": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "slevomat/coding-standard": "^7.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.9"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "time": "2021-09-25T23:10:38+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.x-dev"
+ },
+ "captainhook": {
+ "force-install": true
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/uuid/issues",
+ "source": "https://github.com/ramsey/uuid/tree/4.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../ramsey/uuid"
+ },
+ {
+ "name": "spomky-labs/base64url",
+ "version": "v2.0.4",
+ "version_normalized": "2.0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Spomky-Labs/base64url.git",
+ "reference": "7752ce931ec285da4ed1f4c5aa27e45e097be61d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Spomky-Labs/base64url/zipball/7752ce931ec285da4ed1f4c5aa27e45e097be61d",
+ "reference": "7752ce931ec285da4ed1f4c5aa27e45e097be61d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.11|^0.12",
+ "phpstan/phpstan-beberlei-assert": "^0.11|^0.12",
+ "phpstan/phpstan-deprecation-rules": "^0.11|^0.12",
+ "phpstan/phpstan-phpunit": "^0.11|^0.12",
+ "phpstan/phpstan-strict-rules": "^0.11|^0.12"
+ },
+ "time": "2020-11-03T09:10:25+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Base64Url\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky-Labs/base64url/contributors"
+ }
+ ],
+ "description": "Base 64 URL Safe Encoding/Decoding PHP Library",
+ "homepage": "https://github.com/Spomky-Labs/base64url",
+ "keywords": [
+ "base64",
+ "rfc4648",
+ "safe",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/Spomky-Labs/base64url/issues",
+ "source": "https://github.com/Spomky-Labs/base64url/tree/v2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spomky",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../spomky-labs/base64url"
+ },
+ {
+ "name": "spomky-labs/cbor-php",
+ "version": "v2.1.0",
+ "version_normalized": "2.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Spomky-Labs/cbor-php.git",
+ "reference": "28e2712cfc0b48fae661a48ffc6896d7abe83684"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/28e2712cfc0b48fae661a48ffc6896d7abe83684",
+ "reference": "28e2712cfc0b48fae661a48ffc6896d7abe83684",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8.15|^0.9.0",
+ "ext-mbstring": "*",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ekino/phpstan-banned-code": "^1.0",
+ "ext-json": "*",
+ "infection/infection": "^0.18|^0.25",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-beberlei-assert": "^1.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.12",
+ "roave/security-advisories": "dev-latest",
+ "symplify/easy-coding-standard": "^10.0"
+ },
+ "suggest": {
+ "ext-bcmath": "GMP or BCMath extensions will drastically improve the library performance. BCMath extension needed to handle the Big Float and Decimal Fraction Tags",
+ "ext-gmp": "GMP or BCMath extensions will drastically improve the library performance"
+ },
+ "time": "2021-12-13T12:46:26+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "CBOR\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/Spomky-Labs/cbor-php/contributors"
+ }
+ ],
+ "description": "CBOR Encoder/Decoder for PHP",
+ "keywords": [
+ "Concise Binary Object Representation",
+ "RFC7049",
+ "cbor"
+ ],
+ "support": {
+ "issues": "https://github.com/Spomky-Labs/cbor-php/issues",
+ "source": "https://github.com/Spomky-Labs/cbor-php/tree/v2.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spomky",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../spomky-labs/cbor-php"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.25.0",
+ "version_normalized": "1.25.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "30885182c981ab175d4d034db0f6f469898070ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
+ "reference": "30885182c981ab175d4d034db0f6f469898070ab",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "time": "2021-10-20T20:35:02+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../symfony/polyfill-ctype"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.25.0",
+ "version_normalized": "1.25.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "time": "2022-03-04T08:16:47+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../symfony/polyfill-php80"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.25.0",
+ "version_normalized": "1.25.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
+ "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "time": "2021-09-13T13:58:11+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../symfony/polyfill-php81"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v5.4.8",
+ "version_normalized": "5.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+ "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "time": "2022-04-08T05:07:18+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.4.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../symfony/process"
+ },
+ {
+ "name": "thecodingmachine/safe",
+ "version": "v1.3.3",
+ "version_normalized": "1.3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thecodingmachine/safe.git",
+ "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
+ "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12",
+ "squizlabs/php_codesniffer": "^3.2",
+ "thecodingmachine/phpstan-strict-rules": "^0.12"
+ },
+ "time": "2020-10-28T17:51:34+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "deprecated/apc.php",
+ "deprecated/libevent.php",
+ "deprecated/mssql.php",
+ "deprecated/stats.php",
+ "lib/special_cases.php",
+ "generated/apache.php",
+ "generated/apcu.php",
+ "generated/array.php",
+ "generated/bzip2.php",
+ "generated/calendar.php",
+ "generated/classobj.php",
+ "generated/com.php",
+ "generated/cubrid.php",
+ "generated/curl.php",
+ "generated/datetime.php",
+ "generated/dir.php",
+ "generated/eio.php",
+ "generated/errorfunc.php",
+ "generated/exec.php",
+ "generated/fileinfo.php",
+ "generated/filesystem.php",
+ "generated/filter.php",
+ "generated/fpm.php",
+ "generated/ftp.php",
+ "generated/funchand.php",
+ "generated/gmp.php",
+ "generated/gnupg.php",
+ "generated/hash.php",
+ "generated/ibase.php",
+ "generated/ibmDb2.php",
+ "generated/iconv.php",
+ "generated/image.php",
+ "generated/imap.php",
+ "generated/info.php",
+ "generated/ingres-ii.php",
+ "generated/inotify.php",
+ "generated/json.php",
+ "generated/ldap.php",
+ "generated/libxml.php",
+ "generated/lzf.php",
+ "generated/mailparse.php",
+ "generated/mbstring.php",
+ "generated/misc.php",
+ "generated/msql.php",
+ "generated/mysql.php",
+ "generated/mysqli.php",
+ "generated/mysqlndMs.php",
+ "generated/mysqlndQc.php",
+ "generated/network.php",
+ "generated/oci8.php",
+ "generated/opcache.php",
+ "generated/openssl.php",
+ "generated/outcontrol.php",
+ "generated/password.php",
+ "generated/pcntl.php",
+ "generated/pcre.php",
+ "generated/pdf.php",
+ "generated/pgsql.php",
+ "generated/posix.php",
+ "generated/ps.php",
+ "generated/pspell.php",
+ "generated/readline.php",
+ "generated/rpminfo.php",
+ "generated/rrd.php",
+ "generated/sem.php",
+ "generated/session.php",
+ "generated/shmop.php",
+ "generated/simplexml.php",
+ "generated/sockets.php",
+ "generated/sodium.php",
+ "generated/solr.php",
+ "generated/spl.php",
+ "generated/sqlsrv.php",
+ "generated/ssdeep.php",
+ "generated/ssh2.php",
+ "generated/stream.php",
+ "generated/strings.php",
+ "generated/swoole.php",
+ "generated/uodbc.php",
+ "generated/uopz.php",
+ "generated/url.php",
+ "generated/var.php",
+ "generated/xdiff.php",
+ "generated/xml.php",
+ "generated/xmlrpc.php",
+ "generated/yaml.php",
+ "generated/yaz.php",
+ "generated/zip.php",
+ "generated/zlib.php"
+ ],
+ "psr-4": {
+ "Safe\\": [
+ "lib/",
+ "deprecated/",
+ "generated/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHP core functions that throw exceptions instead of returning FALSE on error",
+ "support": {
+ "issues": "https://github.com/thecodingmachine/safe/issues",
+ "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3"
+ },
+ "install-path": "../thecodingmachine/safe"
+ },
+ {
+ "name": "web-auth/cose-lib",
+ "version": "v3.3.12",
+ "version_normalized": "3.3.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-auth/cose-lib.git",
+ "reference": "efa6ec2ba4e840bc1316a493973c9916028afeeb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/efa6ec2ba4e840bc1316a493973c9916028afeeb",
+ "reference": "efa6ec2ba4e840bc1316a493973c9916028afeeb",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "beberlei/assert": "^3.2",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "fgrosse/phpasn1": "^2.1",
+ "php": ">=7.2"
+ },
+ "time": "2021-12-04T12:13:35+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Cose\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-auth/cose/contributors"
+ }
+ ],
+ "description": "CBOR Object Signing and Encryption (COSE) For PHP",
+ "homepage": "https://github.com/web-auth",
+ "keywords": [
+ "COSE",
+ "RFC8152"
+ ],
+ "support": {
+ "source": "https://github.com/web-auth/cose-lib/tree/v3.3.12"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spomky",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-auth/cose-lib"
+ },
+ {
+ "name": "web-auth/metadata-service",
+ "version": "v3.3.12",
+ "version_normalized": "3.3.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-auth/webauthn-metadata-service.git",
+ "reference": "ef40d2b7b68c4964247d13fab52e2fa8dbd65246"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-auth/webauthn-metadata-service/zipball/ef40d2b7b68c4964247d13fab52e2fa8dbd65246",
+ "reference": "ef40d2b7b68c4964247d13fab52e2fa8dbd65246",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "beberlei/assert": "^3.2",
+ "ext-json": "*",
+ "league/uri": "^6.0",
+ "php": ">=7.2",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/log": "^1.1"
+ },
+ "suggest": {
+ "web-token/jwt-key-mgmt": "Mandatory for fetching Metadata Statement from distant sources",
+ "web-token/jwt-signature-algorithm-ecdsa": "Mandatory for fetching Metadata Statement from distant sources"
+ },
+ "time": "2021-11-21T11:14:31+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Webauthn\\MetadataService\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-auth/metadata-service/contributors"
+ }
+ ],
+ "description": "Metadata Service for FIDO2/Webauthn",
+ "homepage": "https://github.com/web-auth",
+ "keywords": [
+ "FIDO2",
+ "fido",
+ "webauthn"
+ ],
+ "support": {
+ "source": "https://github.com/web-auth/webauthn-metadata-service/tree/v3.3.12"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spomky",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-auth/metadata-service"
+ },
+ {
+ "name": "web-auth/webauthn-lib",
+ "version": "v3.3.12",
+ "version_normalized": "3.3.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-auth/webauthn-lib.git",
+ "reference": "5ef9b21c8e9f8a817e524ac93290d08a9f065b33"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/5ef9b21c8e9f8a817e524ac93290d08a9f065b33",
+ "reference": "5ef9b21c8e9f8a817e524ac93290d08a9f065b33",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "beberlei/assert": "^3.2",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "fgrosse/phpasn1": "^2.1",
+ "php": ">=7.2",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0",
+ "psr/log": "^1.1",
+ "ramsey/uuid": "^3.8|^4.0",
+ "spomky-labs/base64url": "^2.0",
+ "spomky-labs/cbor-php": "^1.0|^2.0",
+ "symfony/process": "^3.0|^4.0|^5.0",
+ "thecodingmachine/safe": "^1.1",
+ "web-auth/cose-lib": "self.version",
+ "web-auth/metadata-service": "self.version"
+ },
+ "suggest": {
+ "psr/log-implementation": "Recommended to receive logs from the library",
+ "web-token/jwt-key-mgmt": "Mandatory for the AndroidSafetyNet Attestation Statement support",
+ "web-token/jwt-signature-algorithm-ecdsa": "Recommended for the AndroidSafetyNet Attestation Statement support",
+ "web-token/jwt-signature-algorithm-eddsa": "Recommended for the AndroidSafetyNet Attestation Statement support",
+ "web-token/jwt-signature-algorithm-rsa": "Mandatory for the AndroidSafetyNet Attestation Statement support"
+ },
+ "time": "2022-02-18T07:13:44+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Webauthn\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-auth/webauthn-library/contributors"
+ }
+ ],
+ "description": "FIDO2/Webauthn Support For PHP",
+ "homepage": "https://github.com/web-auth",
+ "keywords": [
+ "FIDO2",
+ "fido",
+ "webauthn"
+ ],
+ "support": {
+ "source": "https://github.com/web-auth/webauthn-lib/tree/v3.3.12"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spomky",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-auth/webauthn-lib"
+ },
+ {
+ "name": "web-token/jwt-core",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-core.git",
+ "reference": "53beb6f6c1eec4fa93c1c3e5d9e5701e71fa1678"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-core/zipball/53beb6f6c1eec4fa93c1c3e5d9e5701e71fa1678",
+ "reference": "53beb6f6c1eec4fa93c1c3e5d9e5701e71fa1678",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8.17|^0.9",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "fgrosse/phpasn1": "^2.0",
+ "php": ">=7.2",
+ "spomky-labs/base64url": "^1.0|^2.0"
+ },
+ "conflict": {
+ "spomky-labs/jose": "*"
+ },
+ "time": "2021-03-17T14:55:52+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\Core\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-framework/contributors"
+ }
+ ],
+ "description": "Core component of the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-core/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-core"
+ },
+ {
+ "name": "web-token/jwt-key-mgmt",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-key-mgmt.git",
+ "reference": "0b116379515700d237b4e5de86879078ccb09d8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-key-mgmt/zipball/0b116379515700d237b4e5de86879078ccb09d8a",
+ "reference": "0b116379515700d237b4e5de86879078ccb09d8a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-openssl": "*",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "web-token/jwt-core": "^2.0"
+ },
+ "suggest": {
+ "ext-sodium": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys",
+ "php-http/httplug": "To enable JKU/X5U support.",
+ "php-http/message-factory": "To enable JKU/X5U support.",
+ "web-token/jwt-util-ecc": "To use EC key analyzers."
+ },
+ "time": "2021-03-17T14:55:52+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\KeyManagement\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-key-mgmt/contributors"
+ }
+ ],
+ "description": "Key Management component of the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-key-mgmt/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-key-mgmt"
+ },
+ {
+ "name": "web-token/jwt-signature",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-signature.git",
+ "reference": "015b59aaf3b6e8fb9f5bd1338845b7464c7d8103"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-signature/zipball/015b59aaf3b6e8fb9f5bd1338845b7464c7d8103",
+ "reference": "015b59aaf3b6e8fb9f5bd1338845b7464c7d8103",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "web-token/jwt-core": "^2.1"
+ },
+ "suggest": {
+ "web-token/jwt-signature-algorithm-ecdsa": "ECDSA Based Signature Algorithms",
+ "web-token/jwt-signature-algorithm-eddsa": "EdDSA Based Signature Algorithms",
+ "web-token/jwt-signature-algorithm-experimental": "Experimental Signature Algorithms",
+ "web-token/jwt-signature-algorithm-hmac": "HMAC Based Signature Algorithms",
+ "web-token/jwt-signature-algorithm-none": "None Signature Algorithm",
+ "web-token/jwt-signature-algorithm-rsa": "RSA Based Signature Algorithms"
+ },
+ "time": "2021-03-01T19:55:28+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\Signature\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-signature/contributors"
+ }
+ ],
+ "description": "Signature component of the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-signature/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-signature"
+ },
+ {
+ "name": "web-token/jwt-signature-algorithm-ecdsa",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-signature-algorithm-ecdsa.git",
+ "reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-ecdsa/zipball/44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
+ "reference": "44cbbb4374c51f1cf48b82ae761efbf24e1a8591",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-openssl": "*",
+ "web-token/jwt-signature": "^2.0"
+ },
+ "time": "2021-01-21T19:18:03+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\Signature\\Algorithm\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-framework/contributors"
+ }
+ ],
+ "description": "ECDSA Based Signature Algorithms the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-signature-algorithm-ecdsa/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-signature-algorithm-ecdsa"
+ },
+ {
+ "name": "web-token/jwt-signature-algorithm-eddsa",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-signature-algorithm-eddsa.git",
+ "reference": "b805ecca593c56e60e0463bd2cacc9b1341910f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-eddsa/zipball/b805ecca593c56e60e0463bd2cacc9b1341910f6",
+ "reference": "b805ecca593c56e60e0463bd2cacc9b1341910f6",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-sodium": "*",
+ "web-token/jwt-signature": "^2.1"
+ },
+ "time": "2021-01-21T19:18:03+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\Signature\\Algorithm\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-framework/contributors"
+ }
+ ],
+ "description": "EdDSA Signature Algorithm the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-signature-algorithm-eddsa/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-signature-algorithm-eddsa"
+ },
+ {
+ "name": "web-token/jwt-signature-algorithm-rsa",
+ "version": "v2.2.11",
+ "version_normalized": "2.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/web-token/jwt-signature-algorithm-rsa.git",
+ "reference": "513ad90eb5ef1886ff176727a769bda4618141b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/web-token/jwt-signature-algorithm-rsa/zipball/513ad90eb5ef1886ff176727a769bda4618141b0",
+ "reference": "513ad90eb5ef1886ff176727a769bda4618141b0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8.17|^0.9",
+ "ext-openssl": "*",
+ "web-token/jwt-signature": "^2.1"
+ },
+ "suggest": {
+ "ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance",
+ "ext-gmp": "GMP or BCMath is highly recommended to improve the library performance"
+ },
+ "time": "2021-01-21T19:18:03+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Jose\\Component\\Signature\\Algorithm\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/web-token/jwt-framework/contributors"
+ }
+ ],
+ "description": "RSA Based Signature Algorithms the JWT Framework.",
+ "homepage": "https://github.com/web-token",
+ "keywords": [
+ "JOSE",
+ "JWE",
+ "JWK",
+ "JWKSet",
+ "JWS",
+ "Jot",
+ "RFC7515",
+ "RFC7516",
+ "RFC7517",
+ "RFC7518",
+ "RFC7519",
+ "RFC7520",
+ "bundle",
+ "jwa",
+ "jwt",
+ "symfony"
+ ],
+ "support": {
+ "source": "https://github.com/web-token/jwt-signature-algorithm-rsa/tree/v2.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/FlorentMorselli",
+ "type": "patreon"
+ }
+ ],
+ "install-path": "../web-token/jwt-signature-algorithm-rsa"
+ }
+ ],
+ "dev": false,
+ "dev-package-names": []
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/composer/installed.php b/wp-content/plugins/wp-webauthn/vendor/composer/installed.php
new file mode 100644
index 00000000..6e728eaa
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/composer/installed.php
@@ -0,0 +1,311 @@
+ array(
+ 'pretty_version' => '1.2.8',
+ 'version' => '1.2.8.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../../',
+ 'aliases' => array(),
+ 'reference' => '7ee9e75e82e4c783157494b6ea3e4c29b9bc1d3f',
+ 'name' => '__root__',
+ 'dev' => false,
+ ),
+ 'versions' => array(
+ '__root__' => array(
+ 'pretty_version' => '1.2.8',
+ 'version' => '1.2.8.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../../',
+ 'aliases' => array(),
+ 'reference' => '7ee9e75e82e4c783157494b6ea3e4c29b9bc1d3f',
+ 'dev_requirement' => false,
+ ),
+ 'beberlei/assert' => array(
+ 'pretty_version' => 'v3.3.2',
+ 'version' => '3.3.2.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../beberlei/assert',
+ 'aliases' => array(),
+ 'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
+ 'dev_requirement' => false,
+ ),
+ 'brick/math' => array(
+ 'pretty_version' => '0.9.3',
+ 'version' => '0.9.3.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../brick/math',
+ 'aliases' => array(),
+ 'reference' => 'ca57d18f028f84f777b2168cd1911b0dee2343ae',
+ 'dev_requirement' => false,
+ ),
+ 'fgrosse/phpasn1' => array(
+ 'pretty_version' => 'v2.4.0',
+ 'version' => '2.4.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../fgrosse/phpasn1',
+ 'aliases' => array(),
+ 'reference' => 'eef488991d53e58e60c9554b09b1201ca5ba9296',
+ 'dev_requirement' => false,
+ ),
+ 'league/uri' => array(
+ 'pretty_version' => '6.5.0',
+ 'version' => '6.5.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../league/uri',
+ 'aliases' => array(),
+ 'reference' => 'c68ca445abb04817d740ddd6d0b3551826ef0c5a',
+ 'dev_requirement' => false,
+ ),
+ 'league/uri-interfaces' => array(
+ 'pretty_version' => '2.3.0',
+ 'version' => '2.3.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../league/uri-interfaces',
+ 'aliases' => array(),
+ 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
+ 'dev_requirement' => false,
+ ),
+ 'nyholm/psr7' => array(
+ 'pretty_version' => '1.5.0',
+ 'version' => '1.5.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../nyholm/psr7',
+ 'aliases' => array(),
+ 'reference' => '1461e07a0f2a975a52082ca3b769ca912b816226',
+ 'dev_requirement' => false,
+ ),
+ 'nyholm/psr7-server' => array(
+ 'pretty_version' => '0.4.2',
+ 'version' => '0.4.2.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../nyholm/psr7-server',
+ 'aliases' => array(),
+ 'reference' => 'aab2962c970a1776447894e4fd3825a3d69dee61',
+ 'dev_requirement' => false,
+ ),
+ 'php-http/message-factory' => array(
+ 'pretty_version' => 'v1.0.2',
+ 'version' => '1.0.2.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../php-http/message-factory',
+ 'aliases' => array(),
+ 'reference' => 'a478cb11f66a6ac48d8954216cfed9aa06a501a1',
+ 'dev_requirement' => false,
+ ),
+ 'psr/http-client' => array(
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/http-client',
+ 'aliases' => array(),
+ 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
+ 'dev_requirement' => false,
+ ),
+ 'psr/http-factory' => array(
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/http-factory',
+ 'aliases' => array(),
+ 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
+ 'dev_requirement' => false,
+ ),
+ 'psr/http-factory-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '1.0',
+ ),
+ ),
+ 'psr/http-message' => array(
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/http-message',
+ 'aliases' => array(),
+ 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
+ 'dev_requirement' => false,
+ ),
+ 'psr/http-message-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '1.0',
+ ),
+ ),
+ 'psr/log' => array(
+ 'pretty_version' => '1.1.4',
+ 'version' => '1.1.4.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/log',
+ 'aliases' => array(),
+ 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
+ 'dev_requirement' => false,
+ ),
+ 'ramsey/collection' => array(
+ 'pretty_version' => '1.2.2',
+ 'version' => '1.2.2.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../ramsey/collection',
+ 'aliases' => array(),
+ 'reference' => 'cccc74ee5e328031b15640b51056ee8d3bb66c0a',
+ 'dev_requirement' => false,
+ ),
+ 'ramsey/uuid' => array(
+ 'pretty_version' => '4.2.3',
+ 'version' => '4.2.3.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../ramsey/uuid',
+ 'aliases' => array(),
+ 'reference' => 'fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df',
+ 'dev_requirement' => false,
+ ),
+ 'rhumsaa/uuid' => array(
+ 'dev_requirement' => false,
+ 'replaced' => array(
+ 0 => '4.2.3',
+ ),
+ ),
+ 'spomky-labs/base64url' => array(
+ 'pretty_version' => 'v2.0.4',
+ 'version' => '2.0.4.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../spomky-labs/base64url',
+ 'aliases' => array(),
+ 'reference' => '7752ce931ec285da4ed1f4c5aa27e45e097be61d',
+ 'dev_requirement' => false,
+ ),
+ 'spomky-labs/cbor-php' => array(
+ 'pretty_version' => 'v2.1.0',
+ 'version' => '2.1.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../spomky-labs/cbor-php',
+ 'aliases' => array(),
+ 'reference' => '28e2712cfc0b48fae661a48ffc6896d7abe83684',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-ctype' => array(
+ 'pretty_version' => 'v1.25.0',
+ 'version' => '1.25.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
+ 'aliases' => array(),
+ 'reference' => '30885182c981ab175d4d034db0f6f469898070ab',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-php80' => array(
+ 'pretty_version' => 'v1.25.0',
+ 'version' => '1.25.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-php80',
+ 'aliases' => array(),
+ 'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-php81' => array(
+ 'pretty_version' => 'v1.25.0',
+ 'version' => '1.25.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-php81',
+ 'aliases' => array(),
+ 'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/process' => array(
+ 'pretty_version' => 'v5.4.8',
+ 'version' => '5.4.8.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/process',
+ 'aliases' => array(),
+ 'reference' => '597f3fff8e3e91836bb0bd38f5718b56ddbde2f3',
+ 'dev_requirement' => false,
+ ),
+ 'thecodingmachine/safe' => array(
+ 'pretty_version' => 'v1.3.3',
+ 'version' => '1.3.3.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../thecodingmachine/safe',
+ 'aliases' => array(),
+ 'reference' => 'a8ab0876305a4cdaef31b2350fcb9811b5608dbc',
+ 'dev_requirement' => false,
+ ),
+ 'web-auth/cose-lib' => array(
+ 'pretty_version' => 'v3.3.12',
+ 'version' => '3.3.12.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-auth/cose-lib',
+ 'aliases' => array(),
+ 'reference' => 'efa6ec2ba4e840bc1316a493973c9916028afeeb',
+ 'dev_requirement' => false,
+ ),
+ 'web-auth/metadata-service' => array(
+ 'pretty_version' => 'v3.3.12',
+ 'version' => '3.3.12.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-auth/metadata-service',
+ 'aliases' => array(),
+ 'reference' => 'ef40d2b7b68c4964247d13fab52e2fa8dbd65246',
+ 'dev_requirement' => false,
+ ),
+ 'web-auth/webauthn-lib' => array(
+ 'pretty_version' => 'v3.3.12',
+ 'version' => '3.3.12.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-auth/webauthn-lib',
+ 'aliases' => array(),
+ 'reference' => '5ef9b21c8e9f8a817e524ac93290d08a9f065b33',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-core' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-core',
+ 'aliases' => array(),
+ 'reference' => '53beb6f6c1eec4fa93c1c3e5d9e5701e71fa1678',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-key-mgmt' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-key-mgmt',
+ 'aliases' => array(),
+ 'reference' => '0b116379515700d237b4e5de86879078ccb09d8a',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-signature' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-signature',
+ 'aliases' => array(),
+ 'reference' => '015b59aaf3b6e8fb9f5bd1338845b7464c7d8103',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-signature-algorithm-ecdsa' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-signature-algorithm-ecdsa',
+ 'aliases' => array(),
+ 'reference' => '44cbbb4374c51f1cf48b82ae761efbf24e1a8591',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-signature-algorithm-eddsa' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-signature-algorithm-eddsa',
+ 'aliases' => array(),
+ 'reference' => 'b805ecca593c56e60e0463bd2cacc9b1341910f6',
+ 'dev_requirement' => false,
+ ),
+ 'web-token/jwt-signature-algorithm-rsa' => array(
+ 'pretty_version' => 'v2.2.11',
+ 'version' => '2.2.11.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../web-token/jwt-signature-algorithm-rsa',
+ 'aliases' => array(),
+ 'reference' => '513ad90eb5ef1886ff176727a769bda4618141b0',
+ 'dev_requirement' => false,
+ ),
+ ),
+);
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/.github/workflows/phpunit.yml b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/.github/workflows/phpunit.yml
new file mode 100644
index 00000000..556e105d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/.github/workflows/phpunit.yml
@@ -0,0 +1,35 @@
+name: PHPUnit
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+
+jobs:
+ phpunit:
+ name: PHPUnit
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ php:
+ - '7.1'
+ - '7.2'
+ - '7.3'
+ - '7.4'
+ - '8.0'
+ - '8.1'
+ steps:
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ coverage: none
+ extensions: gmp, bcmath
+ tools: composer
+ - uses: actions/checkout@v2
+ - name: Setup problem matchers
+ run: |
+ echo "::add-matcher::${{ runner.tool_cache }}/php.json"
+ echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
+ - run: composer install
+ - run: vendor/bin/phpunit
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/CHANGELOG.md
new file mode 100644
index 00000000..f7b4663c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/CHANGELOG.md
@@ -0,0 +1,55 @@
+#### v2.4.0 (2021-12)
+* Drop support for PHP 7.0 [#89](https://github.com/fgrosse/PHPASN1/pull/89)
+
+#### v2.3.1 (2021-12)
+* Add `#[\ReturnTypeWillChange]` attributes for PHP 8.1 compatibility [#87](https://github.com/fgrosse/PHPASN1/pull/87)
+
+#### v2.3.0 (2021-04)
+* Allow creating an unsigned CSR and adding the signature later [#82](https://github.com/fgrosse/PHPASN1/pull/82)
+
+#### v2.2.0 (2020-08)
+* support polyfills for bcmath and gmp, and add a composer.json
+ suggestion for the `phpseclib/bcmath_polyfill` for servers unable
+ to install PHP the gmp or bcmath extensions.
+
+#### v.2.1.1 & &v.2.0.2 (2018-12)
+* add stricter validation around some structures, highlighed
+ by wycheproof test suite
+
+#### v.2.1.0 (2018-03)
+* add support for `bcmath` extension (making `gmp` optional) [#68](https://github.com/fgrosse/PHPASN1/pull/68)
+
+#### v.2.0.1 & v.1.5.3 (2017-12)
+* add .gitattributes file to prevent examples and tests to be installed via composer when --prefer-dist was set
+
+#### v.2.0.0 (2017-08)
+* rename `FG\ASN1\Object` to `FG\ASN1\ASNObject` because `Object` is a special class name in the next major PHP release
+ - when you upgrade you have to adapt all corresponding `use` and `extends` statements as well as type hints and all
+ usages of `Object::fromBinary(…)`.
+* generally drop PHP 5.6 support
+
+#### v.1.5.2 (2016-10-29)
+* allow empty octet strings
+
+#### v.1.5.1 (2015-10-02)
+* add keywords to composer.json (this is a version on its own so the keywords are found on a stable version at packagist.org)
+
+#### v.1.5.0 (2015-10-30)
+* fix a bug that would prevent you from decoding context specific tags on multiple objects [#57](https://github.com/fgrosse/PHPASN1/issues/57)
+ - `ExplicitlyTaggedObject::__construct` does now accept multiple objects to be tagged with a single tag
+ - `ExplicitlyTaggedObject::getContent` will now always return an array (even if only one object is tagged)
+
+#### v.1.4.2 (2015-09-29)
+* fix a bug that would prevent you from decoding empty tagged objects [#57](https://github.com/fgrosse/PHPASN1/issues/57)
+
+#### v.1.4.1
+* improve exception messages and general error handling [#55](https ://github.com/fgrosse/PHPASN1/pull/55)
+
+#### v.1.4.0
+* **require PHP 5.6**
+* support big integers (closes #1 and #37)
+* enforce one code style via [styleci.io][9]
+* track code coverage via [coveralls.io][10]
+* replace obsolete `FG\ASN1\Exception\GeneralException` with `\Exception`
+* `Construct` (`Sequence`, `Set`) does now implement `ArrayAccess`, `Countable` and `Iterator` so its easier to use
+* add [`TemplateParser`][11]
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/LICENSE b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/LICENSE
new file mode 100644
index 00000000..1e17eb03
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012-2015 Friedrich Große
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/README.md b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/README.md
new file mode 100644
index 00000000..6a1a18bf
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/README.md
@@ -0,0 +1,167 @@
+PHPASN1
+=======
+
+[![Build Status](https://github.com/fgrosse/PHPASN1/actions/workflows/phpunit.yml/badge.svg)](https://github.com/fgrosse/PHPASN1/actions/workflows/phpunit.yml)
+[![PHP 7 ready](http://php7ready.timesplinter.ch/fgrosse/PHPASN1/badge.svg)](https://travis-ci.org/fgrosse/PHPASN1)
+[![Coverage Status](https://coveralls.io/repos/fgrosse/PHPASN1/badge.svg?branch=master&service=github)](https://coveralls.io/github/fgrosse/PHPASN1?branch=master)
+
+[![Latest Stable Version](https://poser.pugx.org/fgrosse/phpasn1/v/stable.png)](https://packagist.org/packages/fgrosse/phpasn1)
+[![Total Downloads](https://poser.pugx.org/fgrosse/phpasn1/downloads.png)](https://packagist.org/packages/fgrosse/phpasn1)
+[![Latest Unstable Version](https://poser.pugx.org/fgrosse/phpasn1/v/unstable.png)](https://packagist.org/packages/fgrosse/phpasn1)
+[![License](https://poser.pugx.org/fgrosse/phpasn1/license.png)](https://packagist.org/packages/fgrosse/phpasn1)
+
+A PHP Framework that allows you to encode and decode arbitrary [ASN.1][3] structures
+using the [ITU-T X.690 Encoding Rules][4].
+This encoding is very frequently used in [X.509 PKI environments][5] or the communication between heterogeneous computer systems.
+
+The API allows you to encode ASN.1 structures to create binary data such as certificate
+signing requests (CSR), X.509 certificates or certificate revocation lists (CRL).
+PHPASN1 can also read [BER encoded][6] binary data into separate PHP objects that can be manipulated by the user and reencoded afterwards.
+
+The **changelog** can now be found at [CHANGELOG.md](CHANGELOG.md).
+
+## Dependencies
+
+PHPASN1 requires at least `PHP 7.0` and either the `gmp` or `bcmath` extension.
+Support for older PHP versions (i.e. PHP 5.6) was dropped starting with `v2.0`.
+If you must use an outdated PHP version consider using [PHPASN v1.5][13].
+
+For the loading of object identifier names directly from the web [curl][7] is used.
+
+## Installation
+
+The preferred way to install this library is to rely on [Composer][2]:
+
+```bash
+$ composer require fgrosse/phpasn1
+```
+
+## Usage
+
+### Encoding ASN.1 Structures
+
+PHPASN1 offers you a class for each of the implemented ASN.1 universal types.
+The constructors should be pretty self explanatory so you should have no big trouble getting started.
+All data will be encoded using [DER encoding][8]
+
+```php
+use FG\ASN1\OID;
+use FG\ASN1\Universal\Integer;
+use FG\ASN1\Universal\Boolean;
+use FG\ASN1\Universal\Enumerated;
+use FG\ASN1\Universal\IA5String;
+use FG\ASN1\Universal\ObjectIdentifier;
+use FG\ASN1\Universal\PrintableString;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\Set;
+use FG\ASN1\Universal\NullObject;
+
+$integer = new Integer(123456);
+$boolean = new Boolean(true);
+$enum = new Enumerated(1);
+$ia5String = new IA5String('Hello world');
+
+$asnNull = new NullObject();
+$objectIdentifier1 = new ObjectIdentifier('1.2.250.1.16.9');
+$objectIdentifier2 = new ObjectIdentifier(OID::RSA_ENCRYPTION);
+$printableString = new PrintableString('Foo bar');
+
+$sequence = new Sequence($integer, $boolean, $enum, $ia5String);
+$set = new Set($sequence, $asnNull, $objectIdentifier1, $objectIdentifier2, $printableString);
+
+$myBinary = $sequence->getBinary();
+$myBinary .= $set->getBinary();
+
+echo base64_encode($myBinary);
+```
+
+
+### Decoding binary data
+
+Decoding BER encoded binary data is just as easy as encoding it:
+
+```php
+use FG\ASN1\ASNObject;
+
+$base64String = ...
+$binaryData = base64_decode($base64String);
+$asnObject = ASNObject::fromBinary($binaryData);
+
+
+// do stuff
+```
+
+If you already know exactly how your expected data should look like you can use the `FG\ASN1\TemplateParser`:
+
+```php
+use FG\ASN1\TemplateParser;
+
+// first define your template
+$template = [
+ Identifier::SEQUENCE => [
+ Identifier::SET => [
+ Identifier::OBJECT_IDENTIFIER,
+ Identifier::SEQUENCE => [
+ Identifier::INTEGER,
+ Identifier::BITSTRING,
+ ]
+ ]
+ ]
+];
+
+// if your binary data is not matching the template you provided this will throw an `\Exception`:
+$parser = new TemplateParser();
+$object = $parser->parseBinary($data, $template);
+
+// there is also a convenience function if you parse binary data from base64:
+$object = $parser->parseBase64($data, $template);
+```
+
+You can use this function to make sure your data has exactly the format you are expecting.
+
+### Navigating decoded data
+
+All constructed classes (i.e. `Sequence` and `Set`) can be navigated by array access or using an iterator.
+You can find examples
+[here](https://github.com/fgrosse/PHPASN1/blob/f6442cadda9d36f3518c737e32f28300a588b777/tests/ASN1/Universal/SequenceTest.php#L148-148),
+[here](https://github.com/fgrosse/PHPASN1/blob/f6442cadda9d36f3518c737e32f28300a588b777/tests/ASN1/Universal/SequenceTest.php#L121) and
+[here](https://github.com/fgrosse/PHPASN1/blob/f6442cadda9d36f3518c737e32f28300a588b777/tests/ASN1/TemplateParserTest.php#L45).
+
+
+### Give me more examples!
+
+To see some example usage of the API classes or some generated output check out the [examples](https://github.com/fgrosse/PHPASN1/tree/master/examples).
+
+
+### How do I contribute?
+
+If you found an issue or have a question submit a github issue with detailed information.
+
+In case you already know what caused the issue and feel in the mood to fix it, your code contributions are always welcome. Just fork the repository, implement your changes and make sure that you covered everything with tests.
+Afterwards submit a pull request via github and be a little patient :) I usually try to comment and/or merge as soon as possible.
+
+#### Mailing list
+
+New features or questions can be discussed in [this google group/mailing list][12].
+
+### Thanks
+
+To [all contributors][1] so far!
+
+## License
+
+This library is distributed under the [MIT License](LICENSE).
+
+[1]: https://github.com/fgrosse/PHPASN1/graphs/contributors
+[2]: https://getcomposer.org/
+[3]: http://www.itu.int/ITU-T/asn1/
+[4]: http://www.itu.int/ITU-T/recommendations/rec.aspx?rec=x.690
+[5]: http://en.wikipedia.org/wiki/X.509
+[6]: http://en.wikipedia.org/wiki/X.690#BER_encoding
+[7]: http://php.net/manual/en/book.curl.php
+[8]: http://en.wikipedia.org/wiki/X.690#DER_encoding
+[9]: https://styleci.io
+[10]: https://coveralls.io/github/fgrosse/PHPASN1
+[11]: https://github.com/fgrosse/PHPASN1/blob/master/tests/ASN1/TemplateParserTest.php#L16
+[12]: https://groups.google.com/d/forum/phpasn1
+[13]: https://packagist.org/packages/fgrosse/phpasn1#1.5.2
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/composer.json b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/composer.json
new file mode 100644
index 00000000..00f7d070
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/composer.json
@@ -0,0 +1,49 @@
+{
+ "name": "fgrosse/phpasn1",
+ "description": "A PHP Framework that allows you to encode and decode arbitrary ASN.1 structures using the ITU-T X.690 Encoding Rules.",
+ "type": "library",
+ "homepage": "https://github.com/FGrosse/PHPASN1",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Friedrich Große",
+ "email": "friedrich.grosse@gmail.com",
+ "homepage": "https://github.com/FGrosse",
+ "role": "Author"
+ },
+ {
+ "name": "All contributors",
+ "homepage": "https://github.com/FGrosse/PHPASN1/contributors"
+ }
+ ],
+ "keywords": [ "x690", "x.690", "x.509", "x509", "asn1", "asn.1", "ber", "der", "binary", "encoding", "decoding" ],
+
+ "require": {
+ "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0",
+ "php-coveralls/php-coveralls": "~2.0"
+ },
+ "suggest": {
+ "ext-gmp": "GMP is the preferred extension for big integer calculations",
+ "ext-bcmath": "BCmath is the fallback extension for big integer calculations",
+ "phpseclib/bcmath_compat": "BCmath polyfill for servers where neither GMP nor BCmath is available",
+ "ext-curl": "For loading OID information from the web if they have not bee defined statically"
+ },
+ "autoload": {
+ "psr-4": {
+ "FG\\": "lib/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "FG\\Test\\": "tests/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ASNObject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ASNObject.php
new file mode 100644
index 00000000..3b7f1621
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ASNObject.php
@@ -0,0 +1,355 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\Universal\BitString;
+use FG\ASN1\Universal\Boolean;
+use FG\ASN1\Universal\Enumerated;
+use FG\ASN1\Universal\GeneralizedTime;
+use FG\ASN1\Universal\Integer;
+use FG\ASN1\Universal\NullObject;
+use FG\ASN1\Universal\ObjectIdentifier;
+use FG\ASN1\Universal\RelativeObjectIdentifier;
+use FG\ASN1\Universal\OctetString;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\Set;
+use FG\ASN1\Universal\UTCTime;
+use FG\ASN1\Universal\IA5String;
+use FG\ASN1\Universal\PrintableString;
+use FG\ASN1\Universal\NumericString;
+use FG\ASN1\Universal\UTF8String;
+use FG\ASN1\Universal\UniversalString;
+use FG\ASN1\Universal\CharacterString;
+use FG\ASN1\Universal\GeneralString;
+use FG\ASN1\Universal\VisibleString;
+use FG\ASN1\Universal\GraphicString;
+use FG\ASN1\Universal\BMPString;
+use FG\ASN1\Universal\T61String;
+use FG\ASN1\Universal\ObjectDescriptor;
+use FG\Utility\BigInteger;
+use LogicException;
+
+/**
+ * Class ASNObject is the base class for all concrete ASN.1 objects.
+ */
+abstract class ASNObject implements Parsable
+{
+ private $contentLength;
+ private $nrOfLengthOctets;
+
+ /**
+ * Must return the number of octets of the content part.
+ *
+ * @return int
+ */
+ abstract protected function calculateContentLength();
+
+ /**
+ * Encode the object using DER encoding.
+ *
+ * @see http://en.wikipedia.org/wiki/X.690#DER_encoding
+ *
+ * @return string the binary representation of an objects value
+ */
+ abstract protected function getEncodedValue();
+
+ /**
+ * Return the content of this object in a non encoded form.
+ * This can be used to print the value in human readable form.
+ *
+ * @return mixed
+ */
+ abstract public function getContent();
+
+ /**
+ * Return the object type octet.
+ * This should use the class constants of Identifier.
+ *
+ * @see Identifier
+ *
+ * @return int
+ */
+ abstract public function getType();
+
+ /**
+ * Returns all identifier octets. If an inheriting class models a tag with
+ * the long form identifier format, it MUST reimplement this method to
+ * return all octets of the identifier.
+ *
+ * @throws LogicException If the identifier format is long form
+ *
+ * @return string Identifier as a set of octets
+ */
+ public function getIdentifier()
+ {
+ $firstOctet = $this->getType();
+
+ if (Identifier::isLongForm($firstOctet)) {
+ throw new LogicException(sprintf('Identifier of %s uses the long form and must therefor override "ASNObject::getIdentifier()".', get_class($this)));
+ }
+
+ return chr($firstOctet);
+ }
+
+ /**
+ * Encode this object using DER encoding.
+ *
+ * @return string the full binary representation of the complete object
+ */
+ public function getBinary()
+ {
+ $result = $this->getIdentifier();
+ $result .= $this->createLengthPart();
+ $result .= $this->getEncodedValue();
+
+ return $result;
+ }
+
+ private function createLengthPart()
+ {
+ $contentLength = $this->getContentLength();
+ $nrOfLengthOctets = $this->getNumberOfLengthOctets($contentLength);
+
+ if ($nrOfLengthOctets == 1) {
+ return chr($contentLength);
+ } else {
+ // the first length octet determines the number subsequent length octets
+ $lengthOctets = chr(0x80 | ($nrOfLengthOctets - 1));
+ for ($shiftLength = 8 * ($nrOfLengthOctets - 2); $shiftLength >= 0; $shiftLength -= 8) {
+ $lengthOctets .= chr($contentLength >> $shiftLength);
+ }
+
+ return $lengthOctets;
+ }
+ }
+
+ protected function getNumberOfLengthOctets($contentLength = null)
+ {
+ if (!isset($this->nrOfLengthOctets)) {
+ if ($contentLength == null) {
+ $contentLength = $this->getContentLength();
+ }
+
+ $this->nrOfLengthOctets = 1;
+ if ($contentLength > 127) {
+ do { // long form
+ $this->nrOfLengthOctets++;
+ $contentLength = $contentLength >> 8;
+ } while ($contentLength > 0);
+ }
+ }
+
+ return $this->nrOfLengthOctets;
+ }
+
+ protected function getContentLength()
+ {
+ if (!isset($this->contentLength)) {
+ $this->contentLength = $this->calculateContentLength();
+ }
+
+ return $this->contentLength;
+ }
+
+ protected function setContentLength($newContentLength)
+ {
+ $this->contentLength = $newContentLength;
+ $this->getNumberOfLengthOctets($newContentLength);
+ }
+
+ /**
+ * Returns the length of the whole object (including the identifier and length octets).
+ */
+ public function getObjectLength()
+ {
+ $nrOfIdentifierOctets = strlen($this->getIdentifier());
+ $contentLength = $this->getContentLength();
+ $nrOfLengthOctets = $this->getNumberOfLengthOctets($contentLength);
+
+ return $nrOfIdentifierOctets + $nrOfLengthOctets + $contentLength;
+ }
+
+ public function __toString()
+ {
+ return $this->getContent();
+ }
+
+ /**
+ * Returns the name of the ASN.1 Type of this object.
+ *
+ * @see Identifier::getName()
+ */
+ public function getTypeName()
+ {
+ return Identifier::getName($this->getType());
+ }
+
+ /**
+ * @param string $binaryData
+ * @param int $offsetIndex
+ *
+ * @throws ParserException
+ *
+ * @return \FG\ASN1\ASNObject
+ */
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ if (strlen($binaryData) <= $offsetIndex) {
+ throw new ParserException('Can not parse binary from data: Offset index larger than input size', $offsetIndex);
+ }
+
+ $identifierOctet = ord($binaryData[$offsetIndex]);
+ if (Identifier::isContextSpecificClass($identifierOctet) && Identifier::isConstructed($identifierOctet)) {
+ return ExplicitlyTaggedObject::fromBinary($binaryData, $offsetIndex);
+ }
+
+ switch ($identifierOctet) {
+ case Identifier::BITSTRING:
+ return BitString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::BOOLEAN:
+ return Boolean::fromBinary($binaryData, $offsetIndex);
+ case Identifier::ENUMERATED:
+ return Enumerated::fromBinary($binaryData, $offsetIndex);
+ case Identifier::INTEGER:
+ return Integer::fromBinary($binaryData, $offsetIndex);
+ case Identifier::NULL:
+ return NullObject::fromBinary($binaryData, $offsetIndex);
+ case Identifier::OBJECT_IDENTIFIER:
+ return ObjectIdentifier::fromBinary($binaryData, $offsetIndex);
+ case Identifier::RELATIVE_OID:
+ return RelativeObjectIdentifier::fromBinary($binaryData, $offsetIndex);
+ case Identifier::OCTETSTRING:
+ return OctetString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::SEQUENCE:
+ return Sequence::fromBinary($binaryData, $offsetIndex);
+ case Identifier::SET:
+ return Set::fromBinary($binaryData, $offsetIndex);
+ case Identifier::UTC_TIME:
+ return UTCTime::fromBinary($binaryData, $offsetIndex);
+ case Identifier::GENERALIZED_TIME:
+ return GeneralizedTime::fromBinary($binaryData, $offsetIndex);
+ case Identifier::IA5_STRING:
+ return IA5String::fromBinary($binaryData, $offsetIndex);
+ case Identifier::PRINTABLE_STRING:
+ return PrintableString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::NUMERIC_STRING:
+ return NumericString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::UTF8_STRING:
+ return UTF8String::fromBinary($binaryData, $offsetIndex);
+ case Identifier::UNIVERSAL_STRING:
+ return UniversalString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::CHARACTER_STRING:
+ return CharacterString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::GENERAL_STRING:
+ return GeneralString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::VISIBLE_STRING:
+ return VisibleString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::GRAPHIC_STRING:
+ return GraphicString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::BMP_STRING:
+ return BMPString::fromBinary($binaryData, $offsetIndex);
+ case Identifier::T61_STRING:
+ return T61String::fromBinary($binaryData, $offsetIndex);
+ case Identifier::OBJECT_DESCRIPTOR:
+ return ObjectDescriptor::fromBinary($binaryData, $offsetIndex);
+ default:
+ // At this point the identifier may be >1 byte.
+ if (Identifier::isConstructed($identifierOctet)) {
+ return new UnknownConstructedObject($binaryData, $offsetIndex);
+ } else {
+ $identifier = self::parseBinaryIdentifier($binaryData, $offsetIndex);
+ $lengthOfUnknownObject = self::parseContentLength($binaryData, $offsetIndex);
+ $offsetIndex += $lengthOfUnknownObject;
+
+ return new UnknownObject($identifier, $lengthOfUnknownObject);
+ }
+ }
+ }
+
+ protected static function parseIdentifier($identifierOctet, $expectedIdentifier, $offsetForExceptionHandling)
+ {
+ if (is_string($identifierOctet) || is_numeric($identifierOctet) == false) {
+ $identifierOctet = ord($identifierOctet);
+ }
+
+ if ($identifierOctet != $expectedIdentifier) {
+ $message = 'Can not create an '.Identifier::getName($expectedIdentifier).' from an '.Identifier::getName($identifierOctet);
+ throw new ParserException($message, $offsetForExceptionHandling);
+ }
+ }
+
+ protected static function parseBinaryIdentifier($binaryData, &$offsetIndex)
+ {
+ if (strlen($binaryData) <= $offsetIndex) {
+ throw new ParserException('Can not parse identifier from data: Offset index larger than input size', $offsetIndex);
+ }
+
+ $identifier = $binaryData[$offsetIndex++];
+
+ if (Identifier::isLongForm(ord($identifier)) == false) {
+ return $identifier;
+ }
+
+ while (true) {
+ if (strlen($binaryData) <= $offsetIndex) {
+ throw new ParserException('Can not parse identifier (long form) from data: Offset index larger than input size', $offsetIndex);
+ }
+ $nextOctet = $binaryData[$offsetIndex++];
+ $identifier .= $nextOctet;
+
+ if ((ord($nextOctet) & 0x80) === 0) {
+ // the most significant bit is 0 to we have reached the end of the identifier
+ break;
+ }
+ }
+
+ return $identifier;
+ }
+
+ protected static function parseContentLength(&$binaryData, &$offsetIndex, $minimumLength = 0)
+ {
+ if (strlen($binaryData) <= $offsetIndex) {
+ throw new ParserException('Can not parse content length from data: Offset index larger than input size', $offsetIndex);
+ }
+
+ $contentLength = ord($binaryData[$offsetIndex++]);
+ if (($contentLength & 0x80) != 0) {
+ // bit 8 is set -> this is the long form
+ $nrOfLengthOctets = $contentLength & 0x7F;
+ $contentLength = BigInteger::create(0x00);
+ for ($i = 0; $i < $nrOfLengthOctets; $i++) {
+ if (strlen($binaryData) <= $offsetIndex) {
+ throw new ParserException('Can not parse content length (long form) from data: Offset index larger than input size', $offsetIndex);
+ }
+ $contentLength = $contentLength->shiftLeft(8)->add(ord($binaryData[$offsetIndex++]));
+ }
+
+ if ($contentLength->compare(PHP_INT_MAX) > 0) {
+ throw new ParserException("Can not parse content length from data: length > maximum integer", $offsetIndex);
+ }
+
+ $contentLength = $contentLength->toInteger();
+ }
+
+ if ($contentLength < $minimumLength) {
+ throw new ParserException('A '.get_called_class()." should have a content length of at least {$minimumLength}. Extracted length was {$contentLength}", $offsetIndex);
+ }
+
+ $lenDataRemaining = strlen($binaryData) - $offsetIndex;
+
+ if ($lenDataRemaining < $contentLength) {
+ throw new ParserException("Content length {$contentLength} exceeds remaining data length {$lenDataRemaining}", $offsetIndex);
+ }
+
+ return $contentLength;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractString.php
new file mode 100644
index 00000000..7e0d7ddb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractString.php
@@ -0,0 +1,136 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use Exception;
+
+abstract class AbstractString extends ASNObject implements Parsable
+{
+ /** @var string */
+ protected $value;
+ private $checkStringForIllegalChars = true;
+ private $allowedCharacters = [];
+
+ /**
+ * The abstract base class for ASN.1 classes which represent some string of character.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ protected function allowCharacter($character)
+ {
+ $this->allowedCharacters[] = $character;
+ }
+
+ protected function allowCharacters(...$characters)
+ {
+ foreach ($characters as $character) {
+ $this->allowedCharacters[] = $character;
+ }
+ }
+
+ protected function allowNumbers()
+ {
+ foreach (range('0', '9') as $char) {
+ $this->allowedCharacters[] = (string) $char;
+ }
+ }
+
+ protected function allowAllLetters()
+ {
+ $this->allowSmallLetters();
+ $this->allowCapitalLetters();
+ }
+
+ protected function allowSmallLetters()
+ {
+ foreach (range('a', 'z') as $char) {
+ $this->allowedCharacters[] = $char;
+ }
+ }
+
+ protected function allowCapitalLetters()
+ {
+ foreach (range('A', 'Z') as $char) {
+ $this->allowedCharacters[] = $char;
+ }
+ }
+
+ protected function allowSpaces()
+ {
+ $this->allowedCharacters[] = ' ';
+ }
+
+ protected function allowAll()
+ {
+ $this->checkStringForIllegalChars = false;
+ }
+
+ protected function calculateContentLength()
+ {
+ return strlen($this->value);
+ }
+
+ protected function getEncodedValue()
+ {
+ if ($this->checkStringForIllegalChars) {
+ $this->checkString();
+ }
+
+ return $this->value;
+ }
+
+ protected function checkString()
+ {
+ $stringLength = $this->getContentLength();
+ for ($i = 0; $i < $stringLength; $i++) {
+ if (in_array($this->value[$i], $this->allowedCharacters) == false) {
+ $typeName = Identifier::getName($this->getType());
+ throw new Exception("Could not create a {$typeName} from the character sequence '{$this->value}'.");
+ }
+ }
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ $parsedObject = new static('');
+
+ self::parseIdentifier($binaryData[$offsetIndex], $parsedObject->getType(), $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+ $string = substr($binaryData, $offsetIndex, $contentLength);
+ $offsetIndex += $contentLength;
+
+ $parsedObject->value = $string;
+ $parsedObject->setContentLength($contentLength);
+ return $parsedObject;
+ }
+
+ public static function isValid($string)
+ {
+ $testObject = new static($string);
+ try {
+ $testObject->checkString();
+
+ return true;
+ } catch (Exception $exception) {
+ return false;
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractTime.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractTime.php
new file mode 100644
index 00000000..9fad5051
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/AbstractTime.php
@@ -0,0 +1,78 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use DateInterval;
+use DateTime;
+use DateTimeZone;
+use Exception;
+
+abstract class AbstractTime extends ASNObject
+{
+ /** @var DateTime */
+ protected $value;
+
+ public function __construct($dateTime = null, $dateTimeZone = 'UTC')
+ {
+ if ($dateTime == null || is_string($dateTime)) {
+ $timeZone = new DateTimeZone($dateTimeZone);
+ $dateTimeObject = new DateTime($dateTime, $timeZone);
+ if ($dateTimeObject == false) {
+ $errorMessage = $this->getLastDateTimeErrors();
+ $className = Identifier::getName($this->getType());
+ throw new Exception(sprintf("Could not create %s from date time string '%s': %s", $className, $dateTime, $errorMessage));
+ }
+ $dateTime = $dateTimeObject;
+ } elseif (!$dateTime instanceof DateTime) {
+ throw new Exception('Invalid first argument for some instance of AbstractTime constructor');
+ }
+
+ $this->value = $dateTime;
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ protected function getLastDateTimeErrors()
+ {
+ $messages = '';
+ $lastErrors = DateTime::getLastErrors();
+ foreach ($lastErrors['errors'] as $errorMessage) {
+ $messages .= "{$errorMessage}, ";
+ }
+
+ return substr($messages, 0, -2);
+ }
+
+ public function __toString()
+ {
+ return $this->value->format("Y-m-d\tH:i:s");
+ }
+
+ protected static function extractTimeZoneData(&$binaryData, &$offsetIndex, DateTime $dateTime)
+ {
+ $sign = $binaryData[$offsetIndex++];
+ $timeOffsetHours = intval(substr($binaryData, $offsetIndex, 2));
+ $timeOffsetMinutes = intval(substr($binaryData, $offsetIndex + 2, 2));
+ $offsetIndex += 4;
+
+ $interval = new DateInterval("PT{$timeOffsetHours}H{$timeOffsetMinutes}M");
+ if ($sign == '+') {
+ $dateTime->sub($interval);
+ } else {
+ $dateTime->add($interval);
+ }
+
+ return $dateTime;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Base128.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Base128.php
new file mode 100644
index 00000000..119ee7b9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Base128.php
@@ -0,0 +1,63 @@
+modulus(0x80)->toInteger());
+
+ $value = $value->shiftRight(7);
+ while ($value->compare(0) > 0) {
+ $octets .= chr(0x80 | $value->modulus(0x80)->toInteger());
+ $value = $value->shiftRight(7);
+ }
+
+ return strrev($octets);
+ }
+
+ /**
+ * @param string $octets
+ *
+ * @throws InvalidArgumentException if the given octets represent a malformed base-128 value or the decoded value would exceed the the maximum integer length
+ *
+ * @return int
+ */
+ public static function decode($octets)
+ {
+ $bitsPerOctet = 7;
+ $value = BigInteger::create(0);
+ $i = 0;
+
+ while (true) {
+ if (!isset($octets[$i])) {
+ throw new InvalidArgumentException(sprintf('Malformed base-128 encoded value (0x%s).', strtoupper(bin2hex($octets)) ?: '0'));
+ }
+
+ $octet = ord($octets[$i++]);
+
+ $l1 = $value->shiftLeft($bitsPerOctet);
+ $r1 = $octet & 0x7f;
+ $value = $l1->add($r1);
+
+ if (0 === ($octet & 0x80)) {
+ break;
+ }
+ }
+
+ return (string)$value;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/AttributeTypeAndValue.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/AttributeTypeAndValue.php
new file mode 100644
index 00000000..3f4027c2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/AttributeTypeAndValue.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Composite;
+
+use FG\ASN1\ASNObject;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\ObjectIdentifier;
+
+class AttributeTypeAndValue extends Sequence
+{
+ /**
+ * @param ObjectIdentifier|string $objIdentifier
+ * @param \FG\ASN1\ASNObject $value
+ */
+ public function __construct($objIdentifier, ASNObject $value)
+ {
+ if ($objIdentifier instanceof ObjectIdentifier == false) {
+ $objIdentifier = new ObjectIdentifier($objIdentifier);
+ }
+ parent::__construct($objIdentifier, $value);
+ }
+
+ public function __toString()
+ {
+ return $this->children[0].': '.$this->children[1];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RDNString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RDNString.php
new file mode 100644
index 00000000..e95e7acd
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RDNString.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Composite;
+
+use FG\ASN1\Universal\PrintableString;
+use FG\ASN1\Universal\IA5String;
+use FG\ASN1\Universal\UTF8String;
+
+class RDNString extends RelativeDistinguishedName
+{
+ /**
+ * @param string|\FG\ASN1\Universal\ObjectIdentifier $objectIdentifierString
+ * @param string|\FG\ASN1\ASNObject $value
+ */
+ public function __construct($objectIdentifierString, $value)
+ {
+ if (PrintableString::isValid($value)) {
+ $value = new PrintableString($value);
+ } else {
+ if (IA5String::isValid($value)) {
+ $value = new IA5String($value);
+ } else {
+ $value = new UTF8String($value);
+ }
+ }
+
+ parent::__construct($objectIdentifierString, $value);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RelativeDistinguishedName.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RelativeDistinguishedName.php
new file mode 100644
index 00000000..4185f41a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Composite/RelativeDistinguishedName.php
@@ -0,0 +1,50 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Composite;
+
+use FG\ASN1\Exception\NotImplementedException;
+use FG\ASN1\ASNObject;
+use FG\ASN1\Universal\Set;
+
+class RelativeDistinguishedName extends Set
+{
+ /**
+ * @param string|\FG\ASN1\Universal\ObjectIdentifier $objIdentifierString
+ * @param \FG\ASN1\ASNObject $value
+ */
+ public function __construct($objIdentifierString, ASNObject $value)
+ {
+ // TODO: This does only support one element in the RelativeDistinguishedName Set but it it is defined as follows:
+ // RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
+ parent::__construct(new AttributeTypeAndValue($objIdentifierString, $value));
+ }
+
+ public function getContent()
+ {
+ /** @var \FG\ASN1\ASNObject $firstObject */
+ $firstObject = $this->children[0];
+ return $firstObject->__toString();
+ }
+
+ /**
+ * At the current version this code can not work since the implementation of Construct requires
+ * the class to support a constructor without arguments.
+ *
+ * @deprecated this function is not yet implemented! Feel free to submit a pull request on github
+ * @param string $binaryData
+ * @param int $offsetIndex
+ * @throws NotImplementedException
+ */
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Construct.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Construct.php
new file mode 100644
index 00000000..cedf422e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Construct.php
@@ -0,0 +1,202 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use ArrayAccess;
+use ArrayIterator;
+use Countable;
+use FG\ASN1\Exception\ParserException;
+use Iterator;
+
+abstract class Construct extends ASNObject implements Countable, ArrayAccess, Iterator, Parsable
+{
+ /** @var \FG\ASN1\ASNObject[] */
+ protected $children;
+ private $iteratorPosition;
+
+ /**
+ * @param \FG\ASN1\ASNObject[] $children the variadic type hint is commented due to https://github.com/facebook/hhvm/issues/4858
+ */
+ public function __construct(/* HH_FIXME[4858]: variadic + strict */ ...$children)
+ {
+ $this->children = $children;
+ $this->iteratorPosition = 0;
+ }
+
+ public function getContent()
+ {
+ return $this->children;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function rewind()
+ {
+ $this->iteratorPosition = 0;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function current()
+ {
+ return $this->children[$this->iteratorPosition];
+ }
+
+ #[\ReturnTypeWillChange]
+ public function key()
+ {
+ return $this->iteratorPosition;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function next()
+ {
+ $this->iteratorPosition++;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function valid()
+ {
+ return isset($this->children[$this->iteratorPosition]);
+ }
+
+ #[\ReturnTypeWillChange]
+ public function offsetExists($offset)
+ {
+ return array_key_exists($offset, $this->children);
+ }
+
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->children[$offset];
+ }
+
+ #[\ReturnTypeWillChange]
+ public function offsetSet($offset, $value)
+ {
+ if ($offset === null) {
+ $offset = count($this->children);
+ }
+
+ $this->children[$offset] = $value;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function offsetUnset($offset)
+ {
+ unset($this->children[$offset]);
+ }
+
+ protected function calculateContentLength()
+ {
+ $length = 0;
+ foreach ($this->children as $component) {
+ $length += $component->getObjectLength();
+ }
+
+ return $length;
+ }
+
+ protected function getEncodedValue()
+ {
+ $result = '';
+ foreach ($this->children as $component) {
+ $result .= $component->getBinary();
+ }
+
+ return $result;
+ }
+
+ public function addChild(ASNObject $child)
+ {
+ $this->children[] = $child;
+ }
+
+ public function addChildren(array $children)
+ {
+ foreach ($children as $child) {
+ $this->addChild($child);
+ }
+ }
+
+ public function __toString()
+ {
+ $nrOfChildren = $this->getNumberOfChildren();
+ $childString = $nrOfChildren == 1 ? 'child' : 'children';
+
+ return "[{$nrOfChildren} {$childString}]";
+ }
+
+ public function getNumberOfChildren()
+ {
+ return count($this->children);
+ }
+
+ /**
+ * @return \FG\ASN1\ASNObject[]
+ */
+ public function getChildren()
+ {
+ return $this->children;
+ }
+
+ /**
+ * @return \FG\ASN1\ASNObject
+ */
+ public function getFirstChild()
+ {
+ return $this->children[0];
+ }
+
+ /**
+ * @param string $binaryData
+ * @param int $offsetIndex
+ *
+ * @throws Exception\ParserException
+ *
+ * @return Construct|static
+ */
+ #[\ReturnTypeWillChange]
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ $parsedObject = new static();
+ self::parseIdentifier($binaryData[$offsetIndex], $parsedObject->getType(), $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+ $startIndex = $offsetIndex;
+
+ $children = [];
+ $octetsToRead = $contentLength;
+ while ($octetsToRead > 0) {
+ $newChild = ASNObject::fromBinary($binaryData, $offsetIndex);
+ $octetsToRead -= $newChild->getObjectLength();
+ $children[] = $newChild;
+ }
+
+ if ($octetsToRead !== 0) {
+ throw new ParserException("Sequence length incorrect", $startIndex);
+ }
+
+ $parsedObject->addChildren($children);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+
+ #[\ReturnTypeWillChange]
+ public function count($mode = COUNT_NORMAL)
+ {
+ return count($this->children, $mode);
+ }
+
+ public function getIterator()
+ {
+ return new ArrayIterator($this->children);
+ }
+}
\ No newline at end of file
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/NotImplementedException.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/NotImplementedException.php
new file mode 100644
index 00000000..c9f8e82e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/NotImplementedException.php
@@ -0,0 +1,15 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Exception;
+
+class NotImplementedException extends \Exception
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/ParserException.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/ParserException.php
new file mode 100644
index 00000000..4bda4e87
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Exception/ParserException.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Exception;
+
+class ParserException extends \Exception
+{
+ private $errorMessage;
+ private $offset;
+
+ public function __construct($errorMessage, $offset)
+ {
+ $this->errorMessage = $errorMessage;
+ $this->offset = $offset;
+ parent::__construct("ASN.1 Parser Exception at offset {$this->offset}: {$this->errorMessage}");
+ }
+
+ public function getOffset()
+ {
+ return $this->offset;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ExplicitlyTaggedObject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ExplicitlyTaggedObject.php
new file mode 100644
index 00000000..b947a959
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/ExplicitlyTaggedObject.php
@@ -0,0 +1,131 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use FG\ASN1\Exception\ParserException;
+
+/**
+ * Class ExplicitlyTaggedObject decorate an inner object with an additional tag that gives information about
+ * its context specific meaning.
+ *
+ * Explanation taken from A Layman's Guide to a Subset of ASN.1, BER, and DER:
+ * >>> An RSA Laboratories Technical Note
+ * >>> Burton S. Kaliski Jr.
+ * >>> Revised November 1, 1993
+ *
+ * [...]
+ * Explicitly tagged types are derived from other types by adding an outer tag to the underlying type.
+ * In effect, explicitly tagged types are structured types consisting of one component, the underlying type.
+ * Explicit tagging is denoted by the ASN.1 keywords [class number] EXPLICIT (see Section 5.2).
+ * [...]
+ *
+ * @see http://luca.ntop.org/Teaching/Appunti/asn1.html
+ */
+class ExplicitlyTaggedObject extends ASNObject
+{
+ /** @var \FG\ASN1\ASNObject[] */
+ private $decoratedObjects;
+ private $tag;
+
+ /**
+ * @param int $tag
+ * @param \FG\ASN1\ASNObject $objects,...
+ */
+ public function __construct($tag, /* HH_FIXME[4858]: variadic + strict */ ...$objects)
+ {
+ $this->tag = $tag;
+ $this->decoratedObjects = $objects;
+ }
+
+ protected function calculateContentLength()
+ {
+ $length = 0;
+ foreach ($this->decoratedObjects as $object) {
+ $length += $object->getObjectLength();
+ }
+
+ return $length;
+ }
+
+ protected function getEncodedValue()
+ {
+ $encoded = '';
+ foreach ($this->decoratedObjects as $object) {
+ $encoded .= $object->getBinary();
+ }
+
+ return $encoded;
+ }
+
+ public function getContent()
+ {
+ return $this->decoratedObjects;
+ }
+
+ public function __toString()
+ {
+ switch ($length = count($this->decoratedObjects)) {
+ case 0:
+ return "Context specific empty object with tag [{$this->tag}]";
+ case 1:
+ $decoratedType = Identifier::getShortName($this->decoratedObjects[0]->getType());
+ return "Context specific $decoratedType with tag [{$this->tag}]";
+ default:
+ return "$length context specific objects with tag [{$this->tag}]";
+ }
+ }
+
+ public function getType()
+ {
+ return ord($this->getIdentifier());
+ }
+
+ public function getIdentifier()
+ {
+ $identifier = Identifier::create(Identifier::CLASS_CONTEXT_SPECIFIC, true, $this->tag);
+
+ return is_int($identifier) ? chr($identifier) : $identifier;
+ }
+
+ public function getTag()
+ {
+ return $this->tag;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ $identifier = self::parseBinaryIdentifier($binaryData, $offsetIndex);
+ $firstIdentifierOctet = ord($identifier);
+ assert(Identifier::isContextSpecificClass($firstIdentifierOctet), 'identifier octet should indicate context specific class');
+ assert(Identifier::isConstructed($firstIdentifierOctet), 'identifier octet should indicate constructed object');
+ $tag = Identifier::getTagNumber($identifier);
+
+ $totalContentLength = self::parseContentLength($binaryData, $offsetIndex);
+ $remainingContentLength = $totalContentLength;
+
+ $offsetIndexOfDecoratedObject = $offsetIndex;
+ $decoratedObjects = [];
+
+ while ($remainingContentLength > 0) {
+ $nextObject = ASNObject::fromBinary($binaryData, $offsetIndex);
+ $remainingContentLength -= $nextObject->getObjectLength();
+ $decoratedObjects[] = $nextObject;
+ }
+
+ if ($remainingContentLength != 0) {
+ throw new ParserException("Context-Specific explicitly tagged object [$tag] starting at offset $offsetIndexOfDecoratedObject specifies a length of $totalContentLength octets but $remainingContentLength remain after parsing the content", $offsetIndexOfDecoratedObject);
+ }
+
+ $parsedObject = new self($tag, ...$decoratedObjects);
+ $parsedObject->setContentLength($totalContentLength);
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Identifier.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Identifier.php
new file mode 100644
index 00000000..b21caa34
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Identifier.php
@@ -0,0 +1,339 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use Exception;
+
+/**
+ * The Identifier encodes the ASN.1 tag (class and number) of the type of a data value.
+ *
+ * Every identifier whose number is in the range 0 to 30 has the following structure:
+ *
+ * Bits: 8 7 6 5 4 3 2 1
+ * | Class | P/C | Tag number |
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * Bits 8 and 7 define the class of this type ( Universal, Application, Context-specific or Private).
+ * Bit 6 encoded whether this type is primitive or constructed
+ * The remaining bits 5 - 1 encode the tag number
+ */
+class Identifier
+{
+ const CLASS_UNIVERSAL = 0x00;
+ const CLASS_APPLICATION = 0x01;
+ const CLASS_CONTEXT_SPECIFIC = 0x02;
+ const CLASS_PRIVATE = 0x03;
+
+ const EOC = 0x00; // unsupported for now
+ const BOOLEAN = 0x01;
+ const INTEGER = 0x02;
+ const BITSTRING = 0x03;
+ const OCTETSTRING = 0x04;
+ const NULL = 0x05;
+ const OBJECT_IDENTIFIER = 0x06;
+ const OBJECT_DESCRIPTOR = 0x07;
+ const EXTERNAL = 0x08; // unsupported for now
+ const REAL = 0x09; // unsupported for now
+ const ENUMERATED = 0x0A;
+ const EMBEDDED_PDV = 0x0B; // unsupported for now
+ const UTF8_STRING = 0x0C;
+ const RELATIVE_OID = 0x0D;
+ // value 0x0E and 0x0F are reserved for future use
+
+ const SEQUENCE = 0x30;
+ const SET = 0x31;
+ const NUMERIC_STRING = 0x12;
+ const PRINTABLE_STRING = 0x13;
+ const T61_STRING = 0x14; // sometimes referred to as TeletextString
+ const VIDEOTEXT_STRING = 0x15;
+ const IA5_STRING = 0x16;
+ const UTC_TIME = 0x17;
+ const GENERALIZED_TIME = 0x18;
+ const GRAPHIC_STRING = 0x19;
+ const VISIBLE_STRING = 0x1A;
+ const GENERAL_STRING = 0x1B;
+ const UNIVERSAL_STRING = 0x1C;
+ const CHARACTER_STRING = 0x1D; // Unrestricted character type
+ const BMP_STRING = 0x1E;
+
+ const LONG_FORM = 0x1F;
+ const IS_CONSTRUCTED = 0x20;
+
+ /**
+ * Creates an identifier. Short form identifiers are returned as integers
+ * for BC, long form identifiers will be returned as a string of octets.
+ *
+ * @param int $class
+ * @param bool $isConstructed
+ * @param int $tagNumber
+ *
+ * @throws Exception if the given arguments are invalid
+ *
+ * @return int|string
+ */
+ public static function create($class, $isConstructed, $tagNumber)
+ {
+ if (!is_numeric($class) || $class < self::CLASS_UNIVERSAL || $class > self::CLASS_PRIVATE) {
+ throw new Exception(sprintf('Invalid class %d given', $class));
+ }
+
+ if (!is_bool($isConstructed)) {
+ throw new Exception("\$isConstructed must be a boolean value ($isConstructed given)");
+ }
+
+ $tagNumber = self::makeNumeric($tagNumber);
+ if ($tagNumber < 0) {
+ throw new Exception(sprintf('Invalid $tagNumber %d given. You can only use positive integers.', $tagNumber));
+ }
+
+ if ($tagNumber < self::LONG_FORM) {
+ return ($class << 6) | ($isConstructed << 5) | $tagNumber;
+ }
+
+ $firstOctet = ($class << 6) | ($isConstructed << 5) | self::LONG_FORM;
+
+ // Tag numbers formatted in long form are base-128 encoded. See X.609#8.1.2.4
+ return chr($firstOctet).Base128::encode($tagNumber);
+ }
+
+ public static function isConstructed($identifierOctet)
+ {
+ return ($identifierOctet & self::IS_CONSTRUCTED) === self::IS_CONSTRUCTED;
+ }
+
+ public static function isLongForm($identifierOctet)
+ {
+ return ($identifierOctet & self::LONG_FORM) === self::LONG_FORM;
+ }
+
+ /**
+ * Return the name of the mapped ASN.1 type with a preceding "ASN.1 ".
+ *
+ * Example: ASN.1 Octet String
+ *
+ * @see Identifier::getShortName()
+ *
+ * @param int|string $identifier
+ *
+ * @return string
+ */
+ public static function getName($identifier)
+ {
+ $identifierOctet = self::makeNumeric($identifier);
+
+ $typeName = static::getShortName($identifier);
+
+ if (($identifierOctet & self::LONG_FORM) < self::LONG_FORM) {
+ $typeName = "ASN.1 {$typeName}";
+ }
+
+ return $typeName;
+ }
+
+ /**
+ * Return the short version of the type name.
+ *
+ * If the given identifier octet can be mapped to a known universal type this will
+ * return its name. Else Identifier::getClassDescription() is used to retrieve
+ * information about the identifier.
+ *
+ * @see Identifier::getName()
+ * @see Identifier::getClassDescription()
+ *
+ * @param int|string $identifier
+ *
+ * @return string
+ */
+ public static function getShortName($identifier)
+ {
+ $identifierOctet = self::makeNumeric($identifier);
+
+ switch ($identifierOctet) {
+ case self::EOC:
+ return 'End-of-contents octet';
+ case self::BOOLEAN:
+ return 'Boolean';
+ case self::INTEGER:
+ return 'Integer';
+ case self::BITSTRING:
+ return 'Bit String';
+ case self::OCTETSTRING:
+ return 'Octet String';
+ case self::NULL:
+ return 'NULL';
+ case self::OBJECT_IDENTIFIER:
+ return 'Object Identifier';
+ case self::OBJECT_DESCRIPTOR:
+ return 'Object Descriptor';
+ case self::EXTERNAL:
+ return 'External Type';
+ case self::REAL:
+ return 'Real';
+ case self::ENUMERATED:
+ return 'Enumerated';
+ case self::EMBEDDED_PDV:
+ return 'Embedded PDV';
+ case self::UTF8_STRING:
+ return 'UTF8 String';
+ case self::RELATIVE_OID:
+ return 'Relative OID';
+ case self::SEQUENCE:
+ return 'Sequence';
+ case self::SET:
+ return 'Set';
+ case self::NUMERIC_STRING:
+ return 'Numeric String';
+ case self::PRINTABLE_STRING:
+ return 'Printable String';
+ case self::T61_STRING:
+ return 'T61 String';
+ case self::VIDEOTEXT_STRING:
+ return 'Videotext String';
+ case self::IA5_STRING:
+ return 'IA5 String';
+ case self::UTC_TIME:
+ return 'UTC Time';
+ case self::GENERALIZED_TIME:
+ return 'Generalized Time';
+ case self::GRAPHIC_STRING:
+ return 'Graphic String';
+ case self::VISIBLE_STRING:
+ return 'Visible String';
+ case self::GENERAL_STRING:
+ return 'General String';
+ case self::UNIVERSAL_STRING:
+ return 'Universal String';
+ case self::CHARACTER_STRING:
+ return 'Character String';
+ case self::BMP_STRING:
+ return 'BMP String';
+
+ case 0x0E:
+ return 'RESERVED (0x0E)';
+ case 0x0F:
+ return 'RESERVED (0x0F)';
+
+ case self::LONG_FORM:
+ default:
+ $classDescription = self::getClassDescription($identifier);
+
+ if (is_int($identifier)) {
+ $identifier = chr($identifier);
+ }
+
+ return "$classDescription (0x".strtoupper(bin2hex($identifier)).')';
+ }
+ }
+
+ /**
+ * Returns a textual description of the information encoded in a given identifier octet.
+ *
+ * The first three (most significant) bytes are evaluated to determine if this is a
+ * constructed or primitive type and if it is either universal, application, context-specific or
+ * private.
+ *
+ * Example:
+ * Constructed context-specific
+ * Primitive universal
+ *
+ * @param int|string $identifier
+ *
+ * @return string
+ */
+ public static function getClassDescription($identifier)
+ {
+ $identifierOctet = self::makeNumeric($identifier);
+
+ if (self::isConstructed($identifierOctet)) {
+ $classDescription = 'Constructed ';
+ } else {
+ $classDescription = 'Primitive ';
+ }
+ $classBits = $identifierOctet >> 6;
+ switch ($classBits) {
+ case self::CLASS_UNIVERSAL:
+ $classDescription .= 'universal';
+ break;
+ case self::CLASS_APPLICATION:
+ $classDescription .= 'application';
+ break;
+ case self::CLASS_CONTEXT_SPECIFIC:
+ $tagNumber = self::getTagNumber($identifier);
+ $classDescription = "[$tagNumber] Context-specific";
+ break;
+ case self::CLASS_PRIVATE:
+ $classDescription .= 'private';
+ break;
+
+ default:
+ return "INVALID IDENTIFIER OCTET: {$identifierOctet}";
+ }
+
+ return $classDescription;
+ }
+
+ /**
+ * @param int|string $identifier
+ *
+ * @return int
+ */
+ public static function getTagNumber($identifier)
+ {
+ $firstOctet = self::makeNumeric($identifier);
+ $tagNumber = $firstOctet & self::LONG_FORM;
+
+ if ($tagNumber < self::LONG_FORM) {
+ return $tagNumber;
+ }
+
+ if (is_numeric($identifier)) {
+ $identifier = chr($identifier);
+ }
+ return Base128::decode(substr($identifier, 1));
+ }
+
+ public static function isUniversalClass($identifier)
+ {
+ $identifier = self::makeNumeric($identifier);
+
+ return $identifier >> 6 == self::CLASS_UNIVERSAL;
+ }
+
+ public static function isApplicationClass($identifier)
+ {
+ $identifier = self::makeNumeric($identifier);
+
+ return $identifier >> 6 == self::CLASS_APPLICATION;
+ }
+
+ public static function isContextSpecificClass($identifier)
+ {
+ $identifier = self::makeNumeric($identifier);
+
+ return $identifier >> 6 == self::CLASS_CONTEXT_SPECIFIC;
+ }
+
+ public static function isPrivateClass($identifier)
+ {
+ $identifier = self::makeNumeric($identifier);
+
+ return $identifier >> 6 == self::CLASS_PRIVATE;
+ }
+
+ private static function makeNumeric($identifierOctet)
+ {
+ if (!is_numeric($identifierOctet)) {
+ return ord($identifierOctet);
+ } else {
+ return $identifierOctet;
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/OID.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/OID.php
new file mode 100644
index 00000000..7d331b0a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/OID.php
@@ -0,0 +1,199 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+class OID
+{
+ const RSA_ENCRYPTION = '1.2.840.113549.1.1.1';
+ const MD5_WITH_RSA_ENCRYPTION = '1.2.840.113549.1.1.4';
+ const SHA1_WITH_RSA_SIGNATURE = '1.2.840.113549.1.1.5';
+ const SHA256_WITH_RSA_SIGNATURE = '1.2.840.113549.1.1.11';
+ const PKCS9_EMAIL = '1.2.840.113549.1.9.1';
+ const PKCS9_UNSTRUCTURED_NAME = '1.2.840.113549.1.9.2';
+ const PKCS9_CONTENT_TYPE = '1.2.840.113549.1.9.3';
+ const PKCS9_MESSAGE_DIGEST = '1.2.840.113549.1.9.4';
+ const PKCS9_SIGNING_TIME = '1.2.840.113549.1.9.5';
+ const PKCS9_EXTENSION_REQUEST = '1.2.840.113549.1.9.14';
+
+ // certificate extension identifier
+ const CERT_EXT_SUBJECT_DIRECTORY_ATTR = '2.5.29.9';
+ const CERT_EXT_SUBJECT_KEY_IDENTIFIER = '2.5.29.14';
+ const CERT_EXT_KEY_USAGE = '2.5.29.15';
+ const CERT_EXT_PRIVATE_KEY_USAGE_PERIOD = '2.5.29.16';
+ const CERT_EXT_SUBJECT_ALT_NAME = '2.5.29.17';
+ const CERT_EXT_ISSUER_ALT_NAME = '2.5.29.18';
+ const CERT_EXT_BASIC_CONSTRAINTS = '2.5.29.19';
+ const CERT_EXT_CRL_NUMBER = '2.5.29.20';
+ const CERT_EXT_REASON_CODE = '2.5.29.21';
+ const CERT_EXT_INVALIDITY_DATE = '2.5.29.24';
+ const CERT_EXT_DELTA_CRL_INDICATOR = '2.5.29.27';
+ const CERT_EXT_ISSUING_DIST_POINT = '2.5.29.28';
+ const CERT_EXT_CERT_ISSUER = '2.5.29.29';
+ const CERT_EXT_NAME_CONSTRAINTS = '2.5.29.30';
+ const CERT_EXT_CRL_DISTRIBUTION_POINTS = '2.5.29.31';
+ const CERT_EXT_CERT_POLICIES = '2.5.29.32';
+ const CERT_EXT_AUTHORITY_KEY_IDENTIFIER = '2.5.29.35';
+ const CERT_EXT_EXTENDED_KEY_USAGE = '2.5.29.37';
+
+ // standard certificate files
+ const COMMON_NAME = '2.5.4.3';
+ const SURNAME = '2.5.4.4';
+ const SERIAL_NUMBER = '2.5.4.5';
+ const COUNTRY_NAME = '2.5.4.6';
+ const LOCALITY_NAME = '2.5.4.7';
+ const STATE_OR_PROVINCE_NAME = '2.5.4.8';
+ const STREET_ADDRESS = '2.5.4.9';
+ const ORGANIZATION_NAME = '2.5.4.10';
+ const OU_NAME = '2.5.4.11';
+ const TITLE = '2.5.4.12';
+ const DESCRIPTION = '2.5.4.13';
+ const POSTAL_ADDRESS = '2.5.4.16';
+ const POSTAL_CODE = '2.5.4.17';
+ const AUTHORITY_REVOCATION_LIST = '2.5.4.38';
+
+ const AUTHORITY_INFORMATION_ACCESS = '1.3.6.1.5.5.7.1.1';
+
+ /**
+ * Returns the name of the given object identifier.
+ *
+ * Some OIDs are saved as class constants in this class.
+ * If the wanted oidString is not among them, this method will
+ * query http://oid-info.com for the right name.
+ * This behavior can be suppressed by setting the second method parameter to false.
+ *
+ * @param string $oidString
+ * @param bool $loadFromWeb
+ *
+ * @see self::loadFromWeb($oidString)
+ *
+ * @return string
+ */
+ public static function getName($oidString, $loadFromWeb = true)
+ {
+ switch ($oidString) {
+ case self::RSA_ENCRYPTION:
+ return 'RSA Encryption';
+ case self::MD5_WITH_RSA_ENCRYPTION:
+ return 'MD5 with RSA Encryption';
+ case self::SHA1_WITH_RSA_SIGNATURE:
+ return 'SHA-1 with RSA Signature';
+
+ case self::PKCS9_EMAIL:
+ return 'PKCS #9 Email Address';
+ case self::PKCS9_UNSTRUCTURED_NAME:
+ return 'PKCS #9 Unstructured Name';
+ case self::PKCS9_CONTENT_TYPE:
+ return 'PKCS #9 Content Type';
+ case self::PKCS9_MESSAGE_DIGEST:
+ return 'PKCS #9 Message Digest';
+ case self::PKCS9_SIGNING_TIME:
+ return 'PKCS #9 Signing Time';
+
+ case self::COMMON_NAME:
+ return 'Common Name';
+ case self::SURNAME:
+ return 'Surname';
+ case self::SERIAL_NUMBER:
+ return 'Serial Number';
+ case self::COUNTRY_NAME:
+ return 'Country Name';
+ case self::LOCALITY_NAME:
+ return 'Locality Name';
+ case self::STATE_OR_PROVINCE_NAME:
+ return 'State or Province Name';
+ case self::STREET_ADDRESS:
+ return 'Street Address';
+ case self::ORGANIZATION_NAME:
+ return 'Organization Name';
+ case self::OU_NAME:
+ return 'Organization Unit Name';
+ case self::TITLE:
+ return 'Title';
+ case self::DESCRIPTION:
+ return 'Description';
+ case self::POSTAL_ADDRESS:
+ return 'Postal Address';
+ case self::POSTAL_CODE:
+ return 'Postal Code';
+ case self::AUTHORITY_REVOCATION_LIST:
+ return 'Authority Revocation List';
+
+ case self::CERT_EXT_SUBJECT_DIRECTORY_ATTR:
+ return 'Subject directory attributes';
+ case self::CERT_EXT_SUBJECT_KEY_IDENTIFIER:
+ return 'Subject key identifier';
+ case self::CERT_EXT_KEY_USAGE:
+ return 'Key usage certificate extension';
+ case self::CERT_EXT_PRIVATE_KEY_USAGE_PERIOD:
+ return 'Private key usage';
+ case self::CERT_EXT_SUBJECT_ALT_NAME:
+ return 'Subject alternative name (SAN)';
+ case self::CERT_EXT_ISSUER_ALT_NAME:
+ return 'Issuer alternative name';
+ case self::CERT_EXT_BASIC_CONSTRAINTS:
+ return 'Basic constraints';
+ case self::CERT_EXT_CRL_NUMBER:
+ return 'CRL number';
+ case self::CERT_EXT_REASON_CODE:
+ return 'Reason code';
+ case self::CERT_EXT_INVALIDITY_DATE:
+ return 'Invalidity code';
+ case self::CERT_EXT_DELTA_CRL_INDICATOR:
+ return 'Delta CRL indicator';
+ case self::CERT_EXT_ISSUING_DIST_POINT:
+ return 'Issuing distribution point';
+ case self::CERT_EXT_CERT_ISSUER:
+ return 'Certificate issuer';
+ case self::CERT_EXT_NAME_CONSTRAINTS:
+ return 'Name constraints';
+ case self::CERT_EXT_CRL_DISTRIBUTION_POINTS:
+ return 'CRL distribution points';
+ case self::CERT_EXT_CERT_POLICIES:
+ return 'Certificate policies ';
+ case self::CERT_EXT_AUTHORITY_KEY_IDENTIFIER:
+ return 'Authority key identifier';
+ case self::CERT_EXT_EXTENDED_KEY_USAGE:
+ return 'Extended key usage';
+ case self::AUTHORITY_INFORMATION_ACCESS:
+ return 'Certificate Authority Information Access (AIA)';
+
+ default:
+ if ($loadFromWeb) {
+ return self::loadFromWeb($oidString);
+ } else {
+ return $oidString;
+ }
+ }
+ }
+
+ public static function loadFromWeb($oidString)
+ {
+ $ch = curl_init("http://oid-info.com/get/{$oidString}");
+
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_HEADER, 0);
+
+ $contents = curl_exec($ch);
+ curl_close($ch);
+
+ // This pattern needs to be updated as soon as the website layout of oid-info.com changes
+ preg_match_all('#(.+)\(\d+\)#si', $contents, $oidName);
+
+ if (empty($oidName[1])) {
+ return "{$oidString} (unknown)";
+ }
+
+ $oidName = ucfirst(strtolower(preg_replace('/([A-Z][a-z])/', ' $1', $oidName[1][0])));
+ $oidName = str_replace('-', ' ', $oidName);
+
+ return "{$oidName} ({$oidString})";
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Parsable.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Parsable.php
new file mode 100644
index 00000000..fa66b558
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Parsable.php
@@ -0,0 +1,32 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use FG\ASN1\Exception\ParserException;
+
+/**
+ * The Parsable interface describes classes that can be parsed from their binary DER representation.
+ */
+interface Parsable
+{
+ /**
+ * Parse an instance of this class from its binary DER encoded representation.
+ *
+ * @param string $binaryData
+ * @param int $offsetIndex the offset at which parsing of the $binaryData is started. This parameter ill be modified
+ * to contain the offset index of the next object after this object has been parsed
+ *
+ * @throws ParserException if the given binary data is either invalid or not currently supported
+ *
+ * @return static
+ */
+ public static function fromBinary(&$binaryData, &$offsetIndex = null);
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/TemplateParser.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/TemplateParser.php
new file mode 100644
index 00000000..90a40b03
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/TemplateParser.php
@@ -0,0 +1,70 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+use Exception;
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\Universal\Sequence;
+
+class TemplateParser
+{
+ /**
+ * @param string $data
+ * @param array $template
+ * @return \FG\ASN1\ASNObject|Sequence
+ * @throws ParserException if there was an issue parsing
+ */
+ public function parseBase64($data, array $template)
+ {
+ // TODO test with invalid data
+ return $this->parseBinary(base64_decode($data), $template);
+ }
+
+ /**
+ * @param string $binary
+ * @param array $template
+ * @return \FG\ASN1\ASNObject|Sequence
+ * @throws ParserException if there was an issue parsing
+ */
+ public function parseBinary($binary, array $template)
+ {
+ $parsedObject = ASNObject::fromBinary($binary);
+
+ foreach ($template as $key => $value) {
+ $this->validate($parsedObject, $key, $value);
+ }
+
+ return $parsedObject;
+ }
+
+ private function validate(ASNObject $object, $key, $value)
+ {
+ if (is_array($value)) {
+ $this->assertTypeId($key, $object);
+
+ /* @var Construct $object */
+ foreach ($value as $key => $child) {
+ $this->validate($object->current(), $key, $child);
+ $object->next();
+ }
+ } else {
+ $this->assertTypeId($value, $object);
+ }
+ }
+
+ private function assertTypeId($expectedTypeId, ASNObject $object)
+ {
+ $actualType = $object->getType();
+ if ($expectedTypeId != $actualType) {
+ throw new Exception("Expected type ($expectedTypeId) does not match actual type ($actualType");
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BMPString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BMPString.php
new file mode 100644
index 00000000..83ec6a91
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BMPString.php
@@ -0,0 +1,41 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class BMPString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 BMP String.
+ *
+ * BMPString is a subtype of UniversalString that has its own
+ * unique tag and contains only the characters in the
+ * Basic Multilingual Plane (those corresponding to the first
+ * 64K-2 cells, less cells whose encoding is used to address
+ * characters outside the Basic Multilingual Plane) of ISO/IEC 10646-1.
+ *
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::BMP_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BitString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BitString.php
new file mode 100644
index 00000000..226695c5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/BitString.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use Exception;
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+
+class BitString extends OctetString implements Parsable
+{
+ private $nrOfUnusedBits;
+
+ /**
+ * Creates a new ASN.1 BitString object.
+ *
+ * @param string|int $value Either the hexadecimal value as a string (spaces are allowed - leading 0x is optional) or a numeric value
+ * @param int $nrOfUnusedBits the number of unused bits in the last octet [optional].
+ *
+ * @throws Exception if the second parameter is no positive numeric value
+ */
+ public function __construct($value, $nrOfUnusedBits = 0)
+ {
+ parent::__construct($value);
+
+ if (!is_numeric($nrOfUnusedBits) || $nrOfUnusedBits < 0) {
+ throw new Exception('BitString: second parameter needs to be a positive number (or zero)!');
+ }
+
+ $this->nrOfUnusedBits = $nrOfUnusedBits;
+ }
+
+ public function getType()
+ {
+ return Identifier::BITSTRING;
+ }
+
+ protected function calculateContentLength()
+ {
+ // add one to the length for the first octet which encodes the number of unused bits in the last octet
+ return parent::calculateContentLength() + 1;
+ }
+
+ protected function getEncodedValue()
+ {
+ // the first octet determines the number of unused bits
+ $nrOfUnusedBitsOctet = chr($this->nrOfUnusedBits);
+ $actualContent = parent::getEncodedValue();
+
+ return $nrOfUnusedBitsOctet.$actualContent;
+ }
+
+ public function getNumberOfUnusedBits()
+ {
+ return $this->nrOfUnusedBits;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::BITSTRING, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, 2);
+
+ $nrOfUnusedBits = ord($binaryData[$offsetIndex]);
+ $value = substr($binaryData, $offsetIndex + 1, $contentLength - 1);
+
+ if ($nrOfUnusedBits > 7 || // no less than 1 used, otherwise non-minimal
+ ($contentLength - 1) == 1 && $nrOfUnusedBits > 0 || // content length only 1, no
+ (ord($value[strlen($value)-1])&((1<<$nrOfUnusedBits)-1)) != 0 // unused bits set
+ ) {
+ throw new ParserException("Can not parse bit string with invalid padding", $offsetIndex);
+ }
+
+ $offsetIndex += $contentLength;
+
+ $parsedObject = new self(bin2hex($value), $nrOfUnusedBits);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Boolean.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Boolean.php
new file mode 100644
index 00000000..b73c99f1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Boolean.php
@@ -0,0 +1,75 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+class Boolean extends ASNObject implements Parsable
+{
+ private $value;
+
+ /**
+ * @param bool $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ public function getType()
+ {
+ return Identifier::BOOLEAN;
+ }
+
+ protected function calculateContentLength()
+ {
+ return 1;
+ }
+
+ protected function getEncodedValue()
+ {
+ if ($this->value == false) {
+ return chr(0x00);
+ } else {
+ return chr(0xFF);
+ }
+ }
+
+ public function getContent()
+ {
+ if ($this->value == true) {
+ return 'TRUE';
+ } else {
+ return 'FALSE';
+ }
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::BOOLEAN, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ if ($contentLength != 1) {
+ throw new ParserException("An ASN.1 Boolean should not have a length other than one. Extracted length was {$contentLength}", $offsetIndex);
+ }
+
+ $value = ord($binaryData[$offsetIndex++]);
+ $booleanValue = $value == 0xFF ? true : false;
+
+ $parsedObject = new self($booleanValue);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/CharacterString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/CharacterString.php
new file mode 100644
index 00000000..bfc170db
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/CharacterString.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class CharacterString extends AbstractString
+{
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::CHARACTER_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Enumerated.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Enumerated.php
new file mode 100644
index 00000000..06d04a3a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Enumerated.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\Identifier;
+
+class Enumerated extends Integer
+{
+ public function getType()
+ {
+ return Identifier::ENUMERATED;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralString.php
new file mode 100644
index 00000000..fb0346f0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralString.php
@@ -0,0 +1,34 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class GeneralString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 GeneralString.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::GENERAL_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralizedTime.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralizedTime.php
new file mode 100644
index 00000000..ca922097
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GeneralizedTime.php
@@ -0,0 +1,134 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractTime;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+/**
+ * This ASN.1 universal type contains date and time information according to ISO 8601.
+ *
+ * The type consists of values representing:
+ * a) a calendar date, as defined in ISO 8601; and
+ * b) a time of day, to any of the precisions defined in ISO 8601, except for the hours value 24 which shall not be used; and
+ * c) the local time differential factor as defined in ISO 8601.
+ *
+ * Decoding of this type will accept the Basic Encoding Rules (BER)
+ * The encoding will comply with the Distinguished Encoding Rules (DER).
+ */
+class GeneralizedTime extends AbstractTime implements Parsable
+{
+ private $microseconds;
+
+ public function __construct($dateTime = null, $dateTimeZone = 'UTC')
+ {
+ parent::__construct($dateTime, $dateTimeZone);
+ $this->microseconds = $this->value->format('u');
+ if ($this->containsFractionalSecondsElement()) {
+ // DER requires us to remove trailing zeros
+ $this->microseconds = preg_replace('/([1-9]+)0+$/', '$1', $this->microseconds);
+ }
+ }
+
+ public function getType()
+ {
+ return Identifier::GENERALIZED_TIME;
+ }
+
+ protected function calculateContentLength()
+ {
+ $contentSize = 15; // YYYYMMDDHHmmSSZ
+
+ if ($this->containsFractionalSecondsElement()) {
+ $contentSize += 1 + strlen($this->microseconds);
+ }
+
+ return $contentSize;
+ }
+
+ public function containsFractionalSecondsElement()
+ {
+ return intval($this->microseconds) > 0;
+ }
+
+ protected function getEncodedValue()
+ {
+ $encodedContent = $this->value->format('YmdHis');
+ if ($this->containsFractionalSecondsElement()) {
+ $encodedContent .= ".{$this->microseconds}";
+ }
+
+ return $encodedContent.'Z';
+ }
+
+ public function __toString()
+ {
+ if ($this->containsFractionalSecondsElement()) {
+ return $this->value->format("Y-m-d\tH:i:s.uP");
+ } else {
+ return $this->value->format("Y-m-d\tH:i:sP");
+ }
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::GENERALIZED_TIME, $offsetIndex++);
+ $lengthOfMinimumTimeString = 14; // YYYYMMDDHHmmSS
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, $lengthOfMinimumTimeString);
+ $maximumBytesToRead = $contentLength;
+
+ $format = 'YmdGis';
+ $content = substr($binaryData, $offsetIndex, $contentLength);
+ $dateTimeString = substr($content, 0, $lengthOfMinimumTimeString);
+ $offsetIndex += $lengthOfMinimumTimeString;
+ $maximumBytesToRead -= $lengthOfMinimumTimeString;
+
+ if ($contentLength == $lengthOfMinimumTimeString) {
+ $localTimeZone = new \DateTimeZone(date_default_timezone_get());
+ $dateTime = \DateTime::createFromFormat($format, $dateTimeString, $localTimeZone);
+ } else {
+ if ($binaryData[$offsetIndex] == '.') {
+ $maximumBytesToRead--; // account for the '.'
+ $nrOfFractionalSecondElements = 1; // account for the '.'
+
+ while ($maximumBytesToRead > 0
+ && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] != '+'
+ && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] != '-'
+ && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] != 'Z') {
+ $nrOfFractionalSecondElements++;
+ $maximumBytesToRead--;
+ }
+
+ $dateTimeString .= substr($binaryData, $offsetIndex, $nrOfFractionalSecondElements);
+ $offsetIndex += $nrOfFractionalSecondElements;
+ $format .= '.u';
+ }
+
+ $dateTime = \DateTime::createFromFormat($format, $dateTimeString, new \DateTimeZone('UTC'));
+
+ if ($maximumBytesToRead > 0) {
+ if ($binaryData[$offsetIndex] == '+'
+ || $binaryData[$offsetIndex] == '-') {
+ $dateTime = static::extractTimeZoneData($binaryData, $offsetIndex, $dateTime);
+ } elseif ($binaryData[$offsetIndex++] != 'Z') {
+ throw new ParserException('Invalid ISO 8601 Time String', $offsetIndex);
+ }
+ }
+ }
+
+ $parsedObject = new self($dateTime);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GraphicString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GraphicString.php
new file mode 100644
index 00000000..4a01d67b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/GraphicString.php
@@ -0,0 +1,34 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class GraphicString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 Graphic String.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::GRAPHIC_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/IA5String.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/IA5String.php
new file mode 100644
index 00000000..33a80679
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/IA5String.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+/**
+ * The International Alphabet No.5 (IA5) references the encoding of the ASCII characters.
+ *
+ * Each character in the data is encoded as 1 byte.
+ */
+class IA5String extends AbstractString
+{
+ public function __construct($string)
+ {
+ parent::__construct($string);
+ for ($i = 1; $i < 128; $i++) {
+ $this->allowCharacter(chr($i));
+ }
+ }
+
+ public function getType()
+ {
+ return Identifier::IA5_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Integer.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Integer.php
new file mode 100644
index 00000000..fe3806ba
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Integer.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use Exception;
+use FG\Utility\BigInteger;
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+
+class Integer extends ASNObject implements Parsable
+{
+ /** @var int */
+ private $value;
+
+ /**
+ * @param int $value
+ *
+ * @throws Exception if the value is not numeric
+ */
+ public function __construct($value)
+ {
+ if (is_numeric($value) == false) {
+ throw new Exception("Invalid VALUE [{$value}] for ASN1_INTEGER");
+ }
+ $this->value = $value;
+ }
+
+ public function getType()
+ {
+ return Identifier::INTEGER;
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ protected function calculateContentLength()
+ {
+ return strlen($this->getEncodedValue());
+ }
+
+ protected function getEncodedValue()
+ {
+ $value = BigInteger::create($this->value, 10);
+ $negative = $value->compare(0) < 0;
+ if ($negative) {
+ $value = $value->absoluteValue();
+ $limit = 0x80;
+ } else {
+ $limit = 0x7f;
+ }
+
+ $mod = 0xff+1;
+ $values = [];
+ while($value->compare($limit) > 0) {
+ $values[] = $value->modulus($mod)->toInteger();
+ $value = $value->shiftRight(8);
+ }
+
+ $values[] = $value->modulus($mod)->toInteger();
+ $numValues = count($values);
+
+ if ($negative) {
+ for ($i = 0; $i < $numValues; $i++) {
+ $values[$i] = 0xff - $values[$i];
+ }
+ for ($i = 0; $i < $numValues; $i++) {
+ $values[$i] += 1;
+ if ($values[$i] <= 0xff) {
+ break;
+ }
+ assert($i != $numValues - 1);
+ $values[$i] = 0;
+ }
+ if ($values[$numValues - 1] == 0x7f) {
+ $values[] = 0xff;
+ }
+ }
+ $values = array_reverse($values);
+ $r = pack("C*", ...$values);
+ return $r;
+ }
+
+ private static function ensureMinimalEncoding($binaryData, $offsetIndex)
+ {
+ // All the first nine bits cannot equal 0 or 1, which would
+ // be non-minimal encoding for positive and negative integers respectively
+ if ((ord($binaryData[$offsetIndex]) == 0x00 && (ord($binaryData[$offsetIndex+1]) & 0x80) == 0) ||
+ (ord($binaryData[$offsetIndex]) == 0xff && (ord($binaryData[$offsetIndex+1]) & 0x80) == 0x80)) {
+ throw new ParserException("Integer not minimally encoded", $offsetIndex);
+ }
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ $parsedObject = new static(0);
+ self::parseIdentifier($binaryData[$offsetIndex], $parsedObject->getType(), $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, 1);
+
+ if ($contentLength > 1) {
+ self::ensureMinimalEncoding($binaryData, $offsetIndex);
+ }
+ $isNegative = (ord($binaryData[$offsetIndex]) & 0x80) != 0x00;
+ $number = BigInteger::create(ord($binaryData[$offsetIndex++]) & 0x7F);
+
+ for ($i = 0; $i < $contentLength - 1; $i++) {
+ $number = $number->multiply(0x100)->add(ord($binaryData[$offsetIndex++]));
+ }
+
+ if ($isNegative) {
+ $number = $number->subtract(BigInteger::create(2)->toPower(8 * $contentLength - 1));
+ }
+
+ $parsedObject = new static((string)$number);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NullObject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NullObject.php
new file mode 100644
index 00000000..b5293e4b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NullObject.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+class NullObject extends ASNObject implements Parsable
+{
+ public function getType()
+ {
+ return Identifier::NULL;
+ }
+
+ protected function calculateContentLength()
+ {
+ return 0;
+ }
+
+ protected function getEncodedValue()
+ {
+ return null;
+ }
+
+ public function getContent()
+ {
+ return 'NULL';
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::NULL, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ if ($contentLength != 0) {
+ throw new ParserException("An ASN.1 Null should not have a length other than zero. Extracted length was {$contentLength}", $offsetIndex);
+ }
+
+ $parsedObject = new self();
+ $parsedObject->setContentLength(0);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NumericString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NumericString.php
new file mode 100644
index 00000000..13fb7c34
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/NumericString.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class NumericString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 NumericString.
+ *
+ * The following characters are permitted:
+ * Digits 0,1, ... 9
+ * SPACE (space)
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowNumbers();
+ $this->allowSpaces();
+ }
+
+ public function getType()
+ {
+ return Identifier::NUMERIC_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectDescriptor.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectDescriptor.php
new file mode 100644
index 00000000..1c5d3498
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectDescriptor.php
@@ -0,0 +1,26 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\Identifier;
+
+class ObjectDescriptor extends GraphicString
+{
+ public function __construct($objectDescription)
+ {
+ parent::__construct($objectDescription);
+ }
+
+ public function getType()
+ {
+ return Identifier::OBJECT_DESCRIPTOR;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectIdentifier.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectIdentifier.php
new file mode 100644
index 00000000..150ce9c4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/ObjectIdentifier.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use Exception;
+use FG\ASN1\Base128;
+use FG\ASN1\OID;
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+class ObjectIdentifier extends ASNObject implements Parsable
+{
+ protected $subIdentifiers;
+ protected $value;
+
+ public function __construct($value)
+ {
+ $this->subIdentifiers = explode('.', $value);
+ $nrOfSubIdentifiers = count($this->subIdentifiers);
+
+ for ($i = 0; $i < $nrOfSubIdentifiers; $i++) {
+ if (is_numeric($this->subIdentifiers[$i])) {
+ // enforce the integer type
+ $this->subIdentifiers[$i] = intval($this->subIdentifiers[$i]);
+ } else {
+ throw new Exception("[{$value}] is no valid object identifier (sub identifier ".($i + 1).' is not numeric)!');
+ }
+ }
+
+ // Merge the first to arcs of the OID registration tree (per ASN definition!)
+ if ($nrOfSubIdentifiers >= 2) {
+ $this->subIdentifiers[1] = ($this->subIdentifiers[0] * 40) + $this->subIdentifiers[1];
+ unset($this->subIdentifiers[0]);
+ }
+
+ $this->value = $value;
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ public function getType()
+ {
+ return Identifier::OBJECT_IDENTIFIER;
+ }
+
+ protected function calculateContentLength()
+ {
+ $length = 0;
+ foreach ($this->subIdentifiers as $subIdentifier) {
+ do {
+ $subIdentifier = $subIdentifier >> 7;
+ $length++;
+ } while ($subIdentifier > 0);
+ }
+
+ return $length;
+ }
+
+ protected function getEncodedValue()
+ {
+ $encodedValue = '';
+ foreach ($this->subIdentifiers as $subIdentifier) {
+ $encodedValue .= Base128::encode($subIdentifier);
+ }
+
+ return $encodedValue;
+ }
+
+ public function __toString()
+ {
+ return OID::getName($this->value);
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::OBJECT_IDENTIFIER, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, 1);
+
+ $firstOctet = ord($binaryData[$offsetIndex++]);
+ $oidString = floor($firstOctet / 40).'.'.($firstOctet % 40);
+ $oidString .= '.'.self::parseOid($binaryData, $offsetIndex, $contentLength - 1);
+
+ $parsedObject = new self($oidString);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+
+ /**
+ * Parses an object identifier except for the first octet, which is parsed
+ * differently. This way relative object identifiers can also be parsed
+ * using this.
+ *
+ * @param $binaryData
+ * @param $offsetIndex
+ * @param $octetsToRead
+ *
+ * @throws ParserException
+ *
+ * @return string
+ */
+ protected static function parseOid(&$binaryData, &$offsetIndex, $octetsToRead)
+ {
+ $oid = '';
+
+ while ($octetsToRead > 0) {
+ $octets = '';
+
+ do {
+ if (0 === $octetsToRead) {
+ throw new ParserException('Malformed ASN.1 Object Identifier', $offsetIndex - 1);
+ }
+
+ $octetsToRead--;
+ $octet = $binaryData[$offsetIndex++];
+ $octets .= $octet;
+ } while (ord($octet) & 0x80);
+
+ $oid .= sprintf('%d.', Base128::decode($octets));
+ }
+
+ // Remove trailing '.'
+ return substr($oid, 0, -1) ?: '';
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/OctetString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/OctetString.php
new file mode 100644
index 00000000..5d69ae7b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/OctetString.php
@@ -0,0 +1,91 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use Exception;
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+
+class OctetString extends ASNObject implements Parsable
+{
+ protected $value;
+
+ public function __construct($value)
+ {
+ if (is_string($value)) {
+ // remove gaps between hex digits
+ $value = preg_replace('/\s|0x/', '', $value);
+ } elseif (is_numeric($value)) {
+ $value = dechex($value);
+ } elseif ($value === null) {
+ return;
+ } else {
+ throw new Exception('OctetString: unrecognized input type!');
+ }
+
+ if (strlen($value) % 2 != 0) {
+ // transform values like 1F2 to 01F2
+ $value = '0'.$value;
+ }
+
+ $this->value = $value;
+ }
+
+ public function getType()
+ {
+ return Identifier::OCTETSTRING;
+ }
+
+ protected function calculateContentLength()
+ {
+ return strlen($this->value) / 2;
+ }
+
+ protected function getEncodedValue()
+ {
+ $value = $this->value;
+ $result = '';
+
+ //Actual content
+ while (strlen($value) >= 2) {
+ // get the hex value byte by byte from the string and and add it to binary result
+ $result .= chr(hexdec(substr($value, 0, 2)));
+ $value = substr($value, 2);
+ }
+
+ return $result;
+ }
+
+ public function getContent()
+ {
+ return strtoupper($this->value);
+ }
+
+ public function getBinaryContent()
+ {
+ return $this->getEncodedValue();
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::OCTETSTRING, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ $value = substr($binaryData, $offsetIndex, $contentLength);
+ $offsetIndex += $contentLength;
+
+ $parsedObject = new self(bin2hex($value));
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/PrintableString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/PrintableString.php
new file mode 100644
index 00000000..fe6d4bc0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/PrintableString.php
@@ -0,0 +1,53 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class PrintableString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 PrintableString.
+ *
+ * The ITU-T X.680 Table 8 permits the following characters:
+ * Latin capital letters A,B, ... Z
+ * Latin small letters a,b, ... z
+ * Digits 0,1, ... 9
+ * SPACE (space)
+ * APOSTROPHE '
+ * LEFT PARENTHESIS (
+ * RIGHT PARENTHESIS )
+ * PLUS SIGN +
+ * COMMA ,
+ * HYPHEN-MINUS -
+ * FULL STOP .
+ * SOLIDUS /
+ * COLON :
+ * EQUALS SIGN =
+ * QUESTION MARK ?
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowNumbers();
+ $this->allowAllLetters();
+ $this->allowSpaces();
+ $this->allowCharacters("'", '(', ')', '+', '-', '.', ',', '/', ':', '=', '?');
+ }
+
+ public function getType()
+ {
+ return Identifier::PRINTABLE_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/RelativeObjectIdentifier.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/RelativeObjectIdentifier.php
new file mode 100644
index 00000000..2aa9643a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/RelativeObjectIdentifier.php
@@ -0,0 +1,57 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use Exception;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+class RelativeObjectIdentifier extends ObjectIdentifier implements Parsable
+{
+ public function __construct($subIdentifiers)
+ {
+ $this->value = $subIdentifiers;
+ $this->subIdentifiers = explode('.', $subIdentifiers);
+ $nrOfSubIdentifiers = count($this->subIdentifiers);
+
+ for ($i = 0; $i < $nrOfSubIdentifiers; $i++) {
+ if (is_numeric($this->subIdentifiers[$i])) {
+ // enforce the integer type
+ $this->subIdentifiers[$i] = intval($this->subIdentifiers[$i]);
+ } else {
+ throw new Exception("[{$subIdentifiers}] is no valid object identifier (sub identifier ".($i + 1).' is not numeric)!');
+ }
+ }
+ }
+
+ public function getType()
+ {
+ return Identifier::RELATIVE_OID;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::RELATIVE_OID, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, 1);
+
+ try {
+ $oidString = self::parseOid($binaryData, $offsetIndex, $contentLength);
+ } catch (ParserException $e) {
+ throw new ParserException('Malformed ASN.1 Relative Object Identifier', $e->getOffset());
+ }
+
+ $parsedObject = new self($oidString);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Sequence.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Sequence.php
new file mode 100644
index 00000000..0397cf12
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Sequence.php
@@ -0,0 +1,23 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\Construct;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+
+class Sequence extends Construct implements Parsable
+{
+ public function getType()
+ {
+ return Identifier::SEQUENCE;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Set.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Set.php
new file mode 100644
index 00000000..6e6d346f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/Set.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\Identifier;
+
+class Set extends Sequence
+{
+ public function getType()
+ {
+ return Identifier::SET;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/T61String.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/T61String.php
new file mode 100644
index 00000000..56418645
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/T61String.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class T61String extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 T61 String.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @see http://en.wikipedia.org/wiki/ITU_T.61
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::T61_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTCTime.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTCTime.php
new file mode 100644
index 00000000..c4d303cb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTCTime.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractTime;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Exception\ParserException;
+
+/**
+ * This ASN.1 universal type contains the calendar date and time.
+ *
+ * The precision is one minute or one second and optionally a
+ * local time differential from coordinated universal time.
+ *
+ * Decoding of this type will accept the Basic Encoding Rules (BER)
+ * The encoding will comply with the Distinguished Encoding Rules (DER).
+ */
+class UTCTime extends AbstractTime implements Parsable
+{
+ public function getType()
+ {
+ return Identifier::UTC_TIME;
+ }
+
+ protected function calculateContentLength()
+ {
+ return 13; // Content is a string o the following format: YYMMDDhhmmssZ (13 octets)
+ }
+
+ protected function getEncodedValue()
+ {
+ return $this->value->format('ymdHis').'Z';
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::UTC_TIME, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex, 11);
+
+ $format = 'ymdGi';
+ $dateTimeString = substr($binaryData, $offsetIndex, 10);
+ $offsetIndex += 10;
+
+ // extract optional seconds part
+ if ($binaryData[$offsetIndex] != 'Z'
+ && $binaryData[$offsetIndex] != '+'
+ && $binaryData[$offsetIndex] != '-') {
+ $dateTimeString .= substr($binaryData, $offsetIndex, 2);
+ $offsetIndex += 2;
+ $format .= 's';
+ }
+
+ $dateTime = \DateTime::createFromFormat($format, $dateTimeString, new \DateTimeZone('UTC'));
+
+ // extract time zone settings
+ if ($binaryData[$offsetIndex] == '+'
+ || $binaryData[$offsetIndex] == '-') {
+ $dateTime = static::extractTimeZoneData($binaryData, $offsetIndex, $dateTime);
+ } elseif ($binaryData[$offsetIndex++] != 'Z') {
+ throw new ParserException('Invalid UTC String', $offsetIndex);
+ }
+
+ $parsedObject = new self($dateTime);
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTF8String.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTF8String.php
new file mode 100644
index 00000000..cba568d3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UTF8String.php
@@ -0,0 +1,34 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class UTF8String extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 Universal String.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::UTF8_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UniversalString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UniversalString.php
new file mode 100644
index 00000000..0c3fe1d0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/UniversalString.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class UniversalString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 Universal String.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @see http://en.wikipedia.org/wiki/Universal_Character_Set
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::UNIVERSAL_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/VisibleString.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/VisibleString.php
new file mode 100644
index 00000000..d9326d3f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/Universal/VisibleString.php
@@ -0,0 +1,34 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1\Universal;
+
+use FG\ASN1\AbstractString;
+use FG\ASN1\Identifier;
+
+class VisibleString extends AbstractString
+{
+ /**
+ * Creates a new ASN.1 Visible String.
+ * TODO The encodable characters of this type are not yet checked.
+ *
+ * @param string $string
+ */
+ public function __construct($string)
+ {
+ $this->value = $string;
+ $this->allowAll();
+ }
+
+ public function getType()
+ {
+ return Identifier::VISIBLE_STRING;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownConstructedObject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownConstructedObject.php
new file mode 100644
index 00000000..b19a07a1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownConstructedObject.php
@@ -0,0 +1,59 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+class UnknownConstructedObject extends Construct
+{
+ private $identifier;
+ private $contentLength;
+
+ /**
+ * @param string $binaryData
+ * @param int $offsetIndex
+ *
+ * @throws \FG\ASN1\Exception\ParserException
+ */
+ public function __construct($binaryData, &$offsetIndex)
+ {
+ $this->identifier = self::parseBinaryIdentifier($binaryData, $offsetIndex);
+ $this->contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ $children = [];
+ $octetsToRead = $this->contentLength;
+ while ($octetsToRead > 0) {
+ $newChild = ASNObject::fromBinary($binaryData, $offsetIndex);
+ $octetsToRead -= $newChild->getObjectLength();
+ $children[] = $newChild;
+ }
+
+ parent::__construct(...$children);
+ }
+
+ public function getType()
+ {
+ return ord($this->identifier);
+ }
+
+ public function getIdentifier()
+ {
+ return $this->identifier;
+ }
+
+ protected function calculateContentLength()
+ {
+ return $this->contentLength;
+ }
+
+ protected function getEncodedValue()
+ {
+ return '';
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownObject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownObject.php
new file mode 100644
index 00000000..4ac536a9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/ASN1/UnknownObject.php
@@ -0,0 +1,59 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\ASN1;
+
+class UnknownObject extends ASNObject
+{
+ /** @var string */
+ private $value;
+
+ private $identifier;
+
+ /**
+ * @param string|int $identifier Either the first identifier octet as int or all identifier bytes as a string
+ * @param int $contentLength
+ */
+ public function __construct($identifier, $contentLength)
+ {
+ if (is_int($identifier)) {
+ $identifier = chr($identifier);
+ }
+
+ $this->identifier = $identifier;
+ $this->value = "Unparsable Object ({$contentLength} bytes)";
+ $this->setContentLength($contentLength);
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ public function getType()
+ {
+ return ord($this->identifier[0]);
+ }
+
+ public function getIdentifier()
+ {
+ return $this->identifier;
+ }
+
+ protected function calculateContentLength()
+ {
+ return $this->getContentLength();
+ }
+
+ protected function getEncodedValue()
+ {
+ return '';
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigInteger.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigInteger.php
new file mode 100644
index 00000000..866162cc
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigInteger.php
@@ -0,0 +1,195 @@
+_fromInteger($val);
+ }
+ else {
+ // convert to string, if not already one
+ $val = (string)$val;
+
+ // validate string
+ if (!preg_match('/^-?[0-9]+$/', $val)) {
+ throw new \InvalidArgumentException('Expects a string representation of an integer.');
+ }
+ $ret->_fromString($val);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * BigInteger constructor.
+ * Prevent directly instantiating object, use BigInteger::create instead.
+ */
+ protected function __construct()
+ {
+
+ }
+
+ /**
+ * Subclasses must provide clone functionality.
+ * @return BigInteger
+ */
+ abstract public function __clone();
+
+ /**
+ * Assign the instance value from base 10 string.
+ * @param string $str
+ */
+ abstract protected function _fromString($str);
+
+ /**
+ * Assign the instance value from an integer type.
+ * @param int $integer
+ */
+ abstract protected function _fromInteger($integer);
+
+ /**
+ * Must provide string implementation that returns base 10 number.
+ * @return string
+ */
+ abstract public function __toString();
+
+ /* INFORMATIONAL FUNCTIONS */
+
+ /**
+ * Return integer, if possible. Throws an exception if the number can not be represented as a native integer.
+ * @return int
+ * @throws \OverflowException
+ */
+ abstract public function toInteger();
+
+ /**
+ * Is represented integer negative?
+ * @return bool
+ */
+ abstract public function isNegative();
+
+ /**
+ * Compare the integer with $number, returns a negative integer if $this is less than number, returns 0 if $this is
+ * equal to number and returns a positive integer if $this is greater than number.
+ * @param BigInteger|string|int $number
+ * @return int
+ */
+ abstract public function compare($number);
+
+ /* MODIFY */
+
+ /**
+ * Add another integer $b and returns the result.
+ * @param BigInteger|string|int $b
+ * @return BigInteger
+ */
+ abstract public function add($b);
+
+ /**
+ * Subtract $b from $this and returns the result.
+ * @param BigInteger|string|int $b
+ * @return BigInteger
+ */
+ abstract public function subtract($b);
+
+ /**
+ * Multiply value.
+ * @param BigInteger|string|int $b
+ * @return BigInteger
+ */
+ abstract public function multiply($b);
+
+ /**
+ * The value $this modulus $b.
+ * @param BigInteger|string|int $b
+ * @return BigInteger
+ */
+ abstract public function modulus($b);
+
+ /**
+ * Raise $this to the power of $b and returns the result.
+ * @param BigInteger|string|int $b
+ * @return BigInteger
+ */
+ abstract public function toPower($b);
+
+ /**
+ * Shift the value to the right by a set number of bits and returns the result.
+ * @param int $bits
+ * @return BigInteger
+ */
+ abstract public function shiftRight($bits = 8);
+
+ /**
+ * Shift the value to the left by a set number of bits and returns the result.
+ * @param int $bits
+ * @return BigInteger
+ */
+ abstract public function shiftLeft($bits = 8);
+
+ /**
+ * Returns the absolute value.
+ * @return BigInteger
+ */
+ abstract public function absoluteValue();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerBcmath.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerBcmath.php
new file mode 100644
index 00000000..25ad8916
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerBcmath.php
@@ -0,0 +1,133 @@
+_str = (string)$str;
+ }
+
+ protected function _fromInteger($integer)
+ {
+ $this->_str = (string)$integer;
+ }
+
+ public function __toString()
+ {
+ return $this->_str;
+ }
+
+ public function toInteger()
+ {
+ if ($this->compare(PHP_INT_MAX) > 0 || $this->compare(PHP_INT_MIN) < 0) {
+ throw new \OverflowException(sprintf('Can not represent %s as integer.', $this->_str));
+ }
+ return (int)$this->_str;
+ }
+
+ public function isNegative()
+ {
+ return bccomp($this->_str, '0', 0) < 0;
+ }
+
+ protected function _unwrap($number)
+ {
+ if ($number instanceof self) {
+ return $number->_str;
+ }
+ return $number;
+ }
+
+ public function compare($number)
+ {
+ return bccomp($this->_str, $this->_unwrap($number), 0);
+ }
+
+ public function add($b)
+ {
+ $ret = new self();
+ $ret->_str = bcadd($this->_str, $this->_unwrap($b), 0);
+ return $ret;
+ }
+
+ public function subtract($b)
+ {
+ $ret = new self();
+ $ret->_str = bcsub($this->_str, $this->_unwrap($b), 0);
+ return $ret;
+ }
+
+ public function multiply($b)
+ {
+ $ret = new self();
+ $ret->_str = bcmul($this->_str, $this->_unwrap($b), 0);
+ return $ret;
+ }
+
+ public function modulus($b)
+ {
+ $ret = new self();
+ if ($this->isNegative()) {
+ // bcmod handles negative numbers differently
+ $b = $this->_unwrap($b);
+ $ret->_str = bcsub($b, bcmod(bcsub('0', $this->_str, 0), $b), 0);
+ }
+ else {
+ $ret->_str = bcmod($this->_str, $this->_unwrap($b));
+ }
+ return $ret;
+ }
+
+ public function toPower($b)
+ {
+ $ret = new self();
+ $ret->_str = bcpow($this->_str, $this->_unwrap($b), 0);
+ return $ret;
+ }
+
+ public function shiftRight($bits = 8)
+ {
+ $ret = new self();
+ $ret->_str = bcdiv($this->_str, bcpow('2', $bits));
+ return $ret;
+ }
+
+ public function shiftLeft($bits = 8) {
+ $ret = new self();
+ $ret->_str = bcmul($this->_str, bcpow('2', $bits));
+ return $ret;
+ }
+
+ public function absoluteValue()
+ {
+ $ret = new self();
+ if (-1 === bccomp($this->_str, '0', 0)) {
+ $ret->_str = bcsub('0', $this->_str, 0);
+ }
+ else {
+ $ret->_str = $this->_str;
+ }
+ return $ret;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerGmp.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerGmp.php
new file mode 100644
index 00000000..0791226a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/Utility/BigIntegerGmp.php
@@ -0,0 +1,133 @@
+_rh = gmp_add($this->_rh, 0);
+ }
+
+ protected function _fromString($str)
+ {
+ $this->_rh = gmp_init($str, 10);
+ }
+
+ protected function _fromInteger($integer)
+ {
+ $this->_rh = gmp_init($integer, 10);
+ }
+
+ public function __toString()
+ {
+ return gmp_strval($this->_rh, 10);
+ }
+
+ public function toInteger()
+ {
+ if ($this->compare(PHP_INT_MAX) > 0 || $this->compare(PHP_INT_MIN) < 0) {
+ throw new \OverflowException(sprintf('Can not represent %s as integer.', $this));
+ }
+ return gmp_intval($this->_rh);
+ }
+
+ public function isNegative()
+ {
+ return gmp_sign($this->_rh) === -1;
+ }
+
+ protected function _unwrap($number)
+ {
+ if ($number instanceof self) {
+ return $number->_rh;
+ }
+ return $number;
+ }
+
+ public function compare($number)
+ {
+ return gmp_cmp($this->_rh, $this->_unwrap($number));
+ }
+
+ public function add($b)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_add($this->_rh, $this->_unwrap($b));
+ return $ret;
+ }
+
+ public function subtract($b)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_sub($this->_rh, $this->_unwrap($b));
+ return $ret;
+ }
+
+ public function multiply($b)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_mul($this->_rh, $this->_unwrap($b));
+ return $ret;
+ }
+
+ public function modulus($b)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_mod($this->_rh, $this->_unwrap($b));
+ return $ret;
+ }
+
+ public function toPower($b)
+ {
+ if ($b instanceof self) {
+ // gmp_pow accepts just an integer
+ if ($b->compare(PHP_INT_MAX) > 0) {
+ throw new \UnexpectedValueException('Unable to raise to power greater than PHP_INT_MAX.');
+ }
+ $b = gmp_intval($b->_rh);
+ }
+ $ret = new self();
+ $ret->_rh = gmp_pow($this->_rh, $b);
+ return $ret;
+ }
+
+ public function shiftRight($bits=8)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_div($this->_rh, gmp_pow(2, $bits));
+ return $ret;
+ }
+
+ public function shiftLeft($bits=8)
+ {
+ $ret = new self();
+ $ret->_rh = gmp_mul($this->_rh, gmp_pow(2, $bits));
+ return $ret;
+ }
+
+ public function absoluteValue()
+ {
+ $ret = new self();
+ $ret->_rh = gmp_abs($this->_rh);
+ return $ret;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/AlgorithmIdentifier.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/AlgorithmIdentifier.php
new file mode 100644
index 00000000..a06b56f7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/AlgorithmIdentifier.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509;
+
+use FG\ASN1\Universal\NullObject;
+use FG\ASN1\Composite\AttributeTypeAndValue;
+
+class AlgorithmIdentifier extends AttributeTypeAndValue
+{
+ public function __construct($objectIdentifierString)
+ {
+ parent::__construct($objectIdentifierString, new NullObject());
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/Attributes.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/Attributes.php
new file mode 100644
index 00000000..5a965e2f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/Attributes.php
@@ -0,0 +1,68 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509\CSR;
+
+use FG\ASN1\ASNObject;
+use FG\X509\CertificateExtensions;
+use FG\ASN1\OID;
+use FG\ASN1\Parsable;
+use FG\ASN1\Construct;
+use FG\ASN1\Identifier;
+use FG\ASN1\Universal\Set;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\ObjectIdentifier;
+
+class Attributes extends Construct implements Parsable
+{
+ public function getType()
+ {
+ return 0xA0;
+ }
+
+ public function addAttribute($objectIdentifier, Set $attribute)
+ {
+ if (is_string($objectIdentifier)) {
+ $objectIdentifier = new ObjectIdentifier($objectIdentifier);
+ }
+ $attributeSequence = new Sequence($objectIdentifier, $attribute);
+ $attributeSequence->getNumberOfLengthOctets(); // length and number of length octets is calculated
+ $this->addChild($attributeSequence);
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], 0xA0, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+ $octetsToRead = $contentLength;
+
+ $parsedObject = new self();
+ while ($octetsToRead > 0) {
+ $initialOffset = $offsetIndex; // used to calculate how much bits have been read
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::SEQUENCE, $offsetIndex++);
+ self::parseContentLength($binaryData, $offsetIndex);
+
+ $objectIdentifier = ObjectIdentifier::fromBinary($binaryData, $offsetIndex);
+ $oidString = $objectIdentifier->getContent();
+ if ($oidString == OID::PKCS9_EXTENSION_REQUEST) {
+ $attribute = CertificateExtensions::fromBinary($binaryData, $offsetIndex);
+ } else {
+ $attribute = ASNObject::fromBinary($binaryData, $offsetIndex);
+ }
+
+ $parsedObject->addAttribute($objectIdentifier, $attribute);
+ $octetsToRead -= ($offsetIndex - $initialOffset);
+ }
+
+ $parsedObject->setContentLength($contentLength);
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/CSR.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/CSR.php
new file mode 100644
index 00000000..8f2a3197
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CSR/CSR.php
@@ -0,0 +1,159 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509\CSR;
+
+use FG\ASN1\OID;
+use FG\ASN1\Universal\Integer;
+use FG\ASN1\Universal\BitString;
+use FG\ASN1\Universal\Sequence;
+use FG\X509\CertificateSubject;
+use FG\X509\AlgorithmIdentifier;
+use FG\X509\PublicKey;
+
+class CSR extends Sequence
+{
+ const CSR_VERSION_NR = 0;
+
+ protected $subject;
+ protected $publicKey;
+ protected $signature;
+ protected $signatureAlgorithm;
+
+ protected $startSequence;
+
+ /**
+ * @param string $commonName
+ * @param string $email
+ * @param string $organization
+ * @param string $locality
+ * @param string $state
+ * @param string $country
+ * @param string $organizationalUnit
+ * @param string $publicKey
+ * @param string $signature
+ * @param string $signatureAlgorithm
+ */
+ public function __construct($commonName, $email, $organization, $locality, $state, $country, $organizationalUnit, $publicKey, $signature = null, $signatureAlgorithm = OID::SHA1_WITH_RSA_SIGNATURE)
+ {
+ $this->subject = new CertificateSubject(
+ $commonName,
+ $email,
+ $organization,
+ $locality,
+ $state,
+ $country,
+ $organizationalUnit
+ );
+ $this->publicKey = $publicKey;
+ $this->signature = $signature;
+ $this->signatureAlgorithm = $signatureAlgorithm;
+
+ if (isset($signature)) {
+ $this->createCSRSequence();
+ }
+ }
+
+ protected function createCSRSequence()
+ {
+ $versionNr = new Integer(self::CSR_VERSION_NR);
+ $publicKey = new PublicKey($this->publicKey);
+ $signature = new BitString($this->signature);
+ $signatureAlgorithm = new AlgorithmIdentifier($this->signatureAlgorithm);
+
+ $certRequestInfo = new Sequence($versionNr, $this->subject, $publicKey);
+
+ // Clear the underlying Construct
+ $this->rewind();
+ $this->children = [];
+ $this->addChild($certRequestInfo);
+ $this->addChild($signatureAlgorithm);
+ $this->addChild($signature);
+ }
+
+ public function getSignatureSubject()
+ {
+ $versionNr = new Integer(self::CSR_VERSION_NR);
+ $publicKey = new PublicKey($this->publicKey);
+
+ $certRequestInfo = new Sequence($versionNr, $this->subject, $publicKey);
+ return $certRequestInfo->getBinary();
+ }
+
+ public function setSignature($signature, $signatureAlgorithm = OID::SHA1_WITH_RSA_SIGNATURE)
+ {
+ $this->signature = $signature;
+ $this->signatureAlgorithm = $signatureAlgorithm;
+
+ $this->createCSRSequence();
+ }
+
+ public function __toString()
+ {
+ $tmp = base64_encode($this->getBinary());
+
+ for ($i = 0; $i < strlen($tmp); $i++) {
+ if (($i + 2) % 65 == 0) {
+ $tmp = substr($tmp, 0, $i + 1)."\n".substr($tmp, $i + 1);
+ }
+ }
+
+ $result = '-----BEGIN CERTIFICATE REQUEST-----'.PHP_EOL;
+ $result .= $tmp.PHP_EOL;
+ $result .= '-----END CERTIFICATE REQUEST-----';
+
+ return $result;
+ }
+
+ public function getVersion()
+ {
+ return self::CSR_VERSION_NR;
+ }
+
+ public function getOrganizationName()
+ {
+ return $this->subject->getOrganization();
+ }
+
+ public function getLocalName()
+ {
+ return $this->subject->getLocality();
+ }
+
+ public function getState()
+ {
+ return $this->subject->getState();
+ }
+
+ public function getCountry()
+ {
+ return $this->subject->getCountry();
+ }
+
+ public function getOrganizationalUnit()
+ {
+ return $this->subject->getOrganizationalUnit();
+ }
+
+ public function getPublicKey()
+ {
+ return $this->publicKey;
+ }
+
+ public function getSignature()
+ {
+ return $this->signature;
+ }
+
+ public function getSignatureAlgorithm()
+ {
+ return $this->signatureAlgorithm;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateExtensions.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateExtensions.php
new file mode 100644
index 00000000..6ed1c6a7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateExtensions.php
@@ -0,0 +1,100 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509;
+
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\OID;
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Universal\OctetString;
+use FG\ASN1\Universal\Set;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\ObjectIdentifier;
+use FG\X509\SAN\SubjectAlternativeNames;
+
+class CertificateExtensions extends Set implements Parsable
+{
+ private $innerSequence;
+ private $extensions = [];
+
+ public function __construct()
+ {
+ $this->innerSequence = new Sequence();
+ parent::__construct($this->innerSequence);
+ }
+
+ public function addSubjectAlternativeNames(SubjectAlternativeNames $sans)
+ {
+ $this->addExtension(OID::CERT_EXT_SUBJECT_ALT_NAME, $sans);
+ }
+
+ private function addExtension($oidString, ASNObject $extension)
+ {
+ $sequence = new Sequence();
+ $sequence->addChild(new ObjectIdentifier($oidString));
+ $sequence->addChild($extension);
+
+ $this->innerSequence->addChild($sequence);
+ $this->extensions[] = $extension;
+ }
+
+ public function getContent()
+ {
+ return $this->extensions;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::SET, $offsetIndex++);
+ self::parseContentLength($binaryData, $offsetIndex);
+
+ $tmpOffset = $offsetIndex;
+ $extensions = Sequence::fromBinary($binaryData, $offsetIndex);
+ $tmpOffset += 1 + $extensions->getNumberOfLengthOctets();
+
+ $parsedObject = new self();
+ foreach ($extensions as $extension) {
+ if ($extension->getType() != Identifier::SEQUENCE) {
+ //FIXME wrong offset index
+ throw new ParserException('Could not parse Certificate Extensions: Expected ASN.1 Sequence but got '.$extension->getTypeName(), $offsetIndex);
+ }
+
+ $tmpOffset += 1 + $extension->getNumberOfLengthOctets();
+ $children = $extension->getChildren();
+ if (count($children) < 2) {
+ throw new ParserException('Could not parse Certificate Extensions: Needs at least two child elements per extension sequence (object identifier and octet string)', $tmpOffset);
+ }
+ /** @var \FG\ASN1\ASNObject $objectIdentifier */
+ $objectIdentifier = $children[0];
+
+ /** @var OctetString $octetString */
+ $octetString = $children[1];
+
+ if ($objectIdentifier->getType() != Identifier::OBJECT_IDENTIFIER) {
+ throw new ParserException('Could not parse Certificate Extensions: Expected ASN.1 Object Identifier but got '.$extension->getTypeName(), $tmpOffset);
+ }
+
+ $tmpOffset += $objectIdentifier->getObjectLength();
+
+ if ($objectIdentifier->getContent() == OID::CERT_EXT_SUBJECT_ALT_NAME) {
+ $sans = SubjectAlternativeNames::fromBinary($binaryData, $tmpOffset);
+ $parsedObject->addSubjectAlternativeNames($sans);
+ } else {
+ // can now only parse SANs. There might be more in the future
+ $tmpOffset += $octetString->getObjectLength();
+ }
+ }
+
+ $parsedObject->getBinary(); // Determine the number of content octets and object sizes once (just to let the equality unit tests pass :/ )
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateSubject.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateSubject.php
new file mode 100644
index 00000000..0a04d574
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/CertificateSubject.php
@@ -0,0 +1,108 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509;
+
+use FG\ASN1\Composite\RelativeDistinguishedName;
+use FG\ASN1\Identifier;
+use FG\ASN1\OID;
+use FG\ASN1\Parsable;
+use FG\ASN1\Composite\RDNString;
+use FG\ASN1\Universal\Sequence;
+
+class CertificateSubject extends Sequence implements Parsable
+{
+ private $commonName;
+ private $email;
+ private $organization;
+ private $locality;
+ private $state;
+ private $country;
+ private $organizationalUnit;
+
+ /**
+ * @param string $commonName
+ * @param string $email
+ * @param string $organization
+ * @param string $locality
+ * @param string $state
+ * @param string $country
+ * @param string $organizationalUnit
+ */
+ public function __construct($commonName, $email, $organization, $locality, $state, $country, $organizationalUnit)
+ {
+ parent::__construct(
+ new RDNString(OID::COUNTRY_NAME, $country),
+ new RDNString(OID::STATE_OR_PROVINCE_NAME, $state),
+ new RDNString(OID::LOCALITY_NAME, $locality),
+ new RDNString(OID::ORGANIZATION_NAME, $organization),
+ new RDNString(OID::OU_NAME, $organizationalUnit),
+ new RDNString(OID::COMMON_NAME, $commonName),
+ new RDNString(OID::PKCS9_EMAIL, $email)
+ );
+
+ $this->commonName = $commonName;
+ $this->email = $email;
+ $this->organization = $organization;
+ $this->locality = $locality;
+ $this->state = $state;
+ $this->country = $country;
+ $this->organizationalUnit = $organizationalUnit;
+ }
+
+ public function getCommonName()
+ {
+ return $this->commonName;
+ }
+
+ public function getEmail()
+ {
+ return $this->email;
+ }
+
+ public function getOrganization()
+ {
+ return $this->organization;
+ }
+
+ public function getLocality()
+ {
+ return $this->locality;
+ }
+
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ public function getCountry()
+ {
+ return $this->country;
+ }
+
+ public function getOrganizationalUnit()
+ {
+ return $this->organizationalUnit;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::SEQUENCE, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ $names = [];
+ $octetsToRead = $contentLength;
+ while ($octetsToRead > 0) {
+ $relativeDistinguishedName = RelativeDistinguishedName::fromBinary($binaryData, $offsetIndex);
+ $octetsToRead -= $relativeDistinguishedName->getObjectLength();
+ $names[] = $relativeDistinguishedName;
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PrivateKey.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PrivateKey.php
new file mode 100644
index 00000000..d57ad865
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PrivateKey.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509;
+
+use FG\ASN1\OID;
+use FG\ASN1\Universal\NullObject;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\BitString;
+use FG\ASN1\Universal\ObjectIdentifier;
+
+class PrivateKey extends Sequence
+{
+ /**
+ * @param string $hexKey
+ * @param \FG\ASN1\ASNObject|string $algorithmIdentifierString
+ */
+ public function __construct($hexKey, $algorithmIdentifierString = OID::RSA_ENCRYPTION)
+ {
+ parent::__construct(
+ new Sequence(
+ new ObjectIdentifier($algorithmIdentifierString),
+ new NullObject()
+ ),
+ new BitString($hexKey)
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PublicKey.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PublicKey.php
new file mode 100644
index 00000000..ab8b4514
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/PublicKey.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509;
+
+use FG\ASN1\OID;
+use FG\ASN1\Universal\NullObject;
+use FG\ASN1\Universal\Sequence;
+use FG\ASN1\Universal\BitString;
+use FG\ASN1\Universal\ObjectIdentifier;
+
+class PublicKey extends Sequence
+{
+ /**
+ * @param string $hexKey
+ * @param \FG\ASN1\ASNObject|string $algorithmIdentifierString
+ */
+ public function __construct($hexKey, $algorithmIdentifierString = OID::RSA_ENCRYPTION)
+ {
+ parent::__construct(
+ new Sequence(
+ new ObjectIdentifier($algorithmIdentifierString),
+ new NullObject()
+ ),
+ new BitString($hexKey)
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/DNSName.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/DNSName.php
new file mode 100644
index 00000000..502738b0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/DNSName.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509\SAN;
+
+use FG\ASN1\Universal\GeneralString;
+
+class DNSName extends GeneralString
+{
+ const IDENTIFIER = 0x82; // not sure yet why this is the identifier used in SAN extensions
+
+ public function __construct($dnsNameString)
+ {
+ parent::__construct($dnsNameString);
+ }
+
+ public function getType()
+ {
+ return self::IDENTIFIER;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/IPAddress.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/IPAddress.php
new file mode 100644
index 00000000..f55be95b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/IPAddress.php
@@ -0,0 +1,73 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509\SAN;
+
+use FG\ASN1\ASNObject;
+use FG\ASN1\Parsable;
+use FG\ASN1\Exception\ParserException;
+
+class IPAddress extends ASNObject implements Parsable
+{
+ const IDENTIFIER = 0x87; // not sure yet why this is the identifier used in SAN extensions
+
+ /** @var string */
+ private $value;
+
+ public function __construct($ipAddressString)
+ {
+ $this->value = $ipAddressString;
+ }
+
+ public function getType()
+ {
+ return self::IDENTIFIER;
+ }
+
+ public function getContent()
+ {
+ return $this->value;
+ }
+
+ protected function calculateContentLength()
+ {
+ return 4;
+ }
+
+ protected function getEncodedValue()
+ {
+ $ipParts = explode('.', $this->value);
+ $binary = chr($ipParts[0]);
+ $binary .= chr($ipParts[1]);
+ $binary .= chr($ipParts[2]);
+ $binary .= chr($ipParts[3]);
+
+ return $binary;
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], self::IDENTIFIER, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+ if ($contentLength != 4) {
+ throw new ParserException("A FG\\X509\SAN\IPAddress should have a content length of 4. Extracted length was {$contentLength}", $offsetIndex);
+ }
+
+ $ipAddressString = ord($binaryData[$offsetIndex++]).'.';
+ $ipAddressString .= ord($binaryData[$offsetIndex++]).'.';
+ $ipAddressString .= ord($binaryData[$offsetIndex++]).'.';
+ $ipAddressString .= ord($binaryData[$offsetIndex++]);
+
+ $parsedObject = new self($ipAddressString);
+ $parsedObject->getObjectLength();
+
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/SubjectAlternativeNames.php b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/SubjectAlternativeNames.php
new file mode 100644
index 00000000..271ddde7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/fgrosse/phpasn1/lib/X509/SAN/SubjectAlternativeNames.php
@@ -0,0 +1,96 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FG\X509\SAN;
+
+use FG\ASN1\Exception\ParserException;
+use FG\ASN1\ASNObject;
+use FG\ASN1\OID;
+use FG\ASN1\Parsable;
+use FG\ASN1\Identifier;
+use FG\ASN1\Universal\Sequence;
+
+/**
+ * See section 8.3.2.1 of ITU-T X.509.
+ */
+class SubjectAlternativeNames extends ASNObject implements Parsable
+{
+ private $alternativeNamesSequence;
+
+ public function __construct()
+ {
+ $this->alternativeNamesSequence = new Sequence();
+ }
+
+ protected function calculateContentLength()
+ {
+ return $this->alternativeNamesSequence->getObjectLength();
+ }
+
+ public function getType()
+ {
+ return Identifier::OCTETSTRING;
+ }
+
+ public function addDomainName(DNSName $domainName)
+ {
+ $this->alternativeNamesSequence->addChild($domainName);
+ }
+
+ public function addIP(IPAddress $ip)
+ {
+ $this->alternativeNamesSequence->addChild($ip);
+ }
+
+ public function getContent()
+ {
+ return $this->alternativeNamesSequence->getContent();
+ }
+
+ protected function getEncodedValue()
+ {
+ return $this->alternativeNamesSequence->getBinary();
+ }
+
+ public static function fromBinary(&$binaryData, &$offsetIndex = 0)
+ {
+ self::parseIdentifier($binaryData[$offsetIndex], Identifier::OCTETSTRING, $offsetIndex++);
+ $contentLength = self::parseContentLength($binaryData, $offsetIndex);
+
+ if ($contentLength < 2) {
+ throw new ParserException('Can not parse Subject Alternative Names: The Sequence within the octet string after the Object identifier '.OID::CERT_EXT_SUBJECT_ALT_NAME." is too short ({$contentLength} octets)", $offsetIndex);
+ }
+
+ $offsetOfSequence = $offsetIndex;
+ $sequence = Sequence::fromBinary($binaryData, $offsetIndex);
+ $offsetOfSequence += $sequence->getNumberOfLengthOctets() + 1;
+
+ if ($sequence->getObjectLength() != $contentLength) {
+ throw new ParserException('Can not parse Subject Alternative Names: The Sequence length does not match the length of the surrounding octet string', $offsetIndex);
+ }
+
+ $parsedObject = new self();
+ /** @var \FG\ASN1\ASNObject $object */
+ foreach ($sequence as $object) {
+ if ($object->getType() == DNSName::IDENTIFIER) {
+ $domainName = DNSName::fromBinary($binaryData, $offsetOfSequence);
+ $parsedObject->addDomainName($domainName);
+ } elseif ($object->getType() == IPAddress::IDENTIFIER) {
+ $ip = IPAddress::fromBinary($binaryData, $offsetOfSequence);
+ $parsedObject->addIP($ip);
+ } else {
+ throw new ParserException('Could not parse Subject Alternative Name: Only DNSName and IP SANs are currently supported', $offsetIndex);
+ }
+ }
+
+ $parsedObject->getBinary(); // Determine the number of content octets and object sizes once (just to let the equality unit tests pass :/ )
+ return $parsedObject;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/LICENSE b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/LICENSE
new file mode 100644
index 00000000..14c82cd5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 ignace nyamagana butera
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/composer.json b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/composer.json
new file mode 100644
index 00000000..fc34cfe3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/composer.json
@@ -0,0 +1,68 @@
+{
+ "name": "league/uri-interfaces",
+ "description" : "Common interface for URI representation",
+ "keywords": [
+ "url",
+ "uri",
+ "rfc3986",
+ "rfc3987"
+ ],
+ "license": "MIT",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "authors": [
+ {
+ "name" : "Ignace Nyamagana Butera",
+ "email" : "nyamsprod@gmail.com",
+ "homepage" : "https://nyamsprod.com"
+ }
+ ],
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nyamsprod"
+ }
+ ],
+ "require": {
+ "php" : "^7.2 || ^8.0",
+ "ext-json": "*"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "scripts": {
+ "phpunit": "phpunit --coverage-text",
+ "phpcs": "php-cs-fixer fix --dry-run --diff -vvv --allow-risky=yes --ansi",
+ "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi",
+ "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit 192M",
+ "test": [
+ "@phpunit",
+ "@phpstan",
+ "@phpcs:fix"
+ ]
+ },
+ "scripts-descriptions": {
+ "phpunit": "Runs package test suite",
+ "phpstan": "Runs complete codebase static analysis",
+ "phpcs": "Runs coding style testing",
+ "phpcs:fix": "Fix coding style issues",
+ "test": "Runs all tests"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php
new file mode 100644
index 00000000..ed6c2b8d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php
@@ -0,0 +1,87 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface AuthorityInterface extends UriComponentInterface
+{
+ /**
+ * Returns the host component of the authority.
+ */
+ public function getHost(): ?string;
+
+ /**
+ * Returns the port component of the authority.
+ */
+ public function getPort(): ?int;
+
+ /**
+ * Returns the user information component of the authority.
+ */
+ public function getUserInfo(): ?string;
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * A null value provided for the host is equivalent to removing the host
+ * information.
+ *
+ * @param ?string $host
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withHost(?string $host): self;
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param ?int $port
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPort(?int $port): self;
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; a null value for the user is equivalent to removing user
+ * information.
+ *
+ * @param ?string $user
+ * @param ?string $password
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withUserInfo(?string $user, ?string $password = null): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php
new file mode 100644
index 00000000..1e4f3856
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php
@@ -0,0 +1,92 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface DataPathInterface extends PathInterface
+{
+ /**
+ * Retrieve the data mime type associated to the URI.
+ *
+ * If no mimetype is present, this method MUST return the default mimetype 'text/plain'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-2
+ */
+ public function getMimeType(): string;
+
+ /**
+ * Retrieve the parameters associated with the Mime Type of the URI.
+ *
+ * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-2
+ */
+ public function getParameters(): string;
+
+ /**
+ * Retrieve the mediatype associated with the URI.
+ *
+ * If no mediatype is present, this method MUST return the default parameter 'text/plain;charset=US-ASCII'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-3
+ *
+ * @return string The URI scheme.
+ */
+ public function getMediaType(): string;
+
+ /**
+ * Retrieves the data string.
+ *
+ * Retrieves the data part of the path. If no data part is provided return
+ * a empty string
+ */
+ public function getData(): string;
+
+ /**
+ * Tells whether the data is binary safe encoded.
+ */
+ public function isBinaryData(): bool;
+
+ /**
+ * Save the data to a specific file.
+ */
+ public function save(string $path, string $mode = 'w'): \SplFileObject;
+
+ /**
+ * Returns an instance where the data part is base64 encoded.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance where the data part is base64 encoded
+ */
+ public function toBinary(): self;
+
+ /**
+ * Returns an instance where the data part is url encoded following RFC3986 rules.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance where the data part is url encoded
+ */
+ public function toAscii(): self;
+
+ /**
+ * Return an instance with the specified mediatype parameters.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified mediatype parameters.
+ *
+ * Users must provide encoded characters.
+ *
+ * An empty parameters value is equivalent to removing the parameter.
+ */
+ public function withParameters(string $parameters): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php
new file mode 100644
index 00000000..2490310f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php
@@ -0,0 +1,107 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+/**
+ * @extends \IteratorAggregate
+ */
+interface DomainHostInterface extends \Countable, HostInterface, \IteratorAggregate
+{
+ /**
+ * Returns the labels total number.
+ */
+ public function count(): int;
+
+ /**
+ * Iterate over the Domain labels.
+ *
+ * @return \Iterator
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Retrieves a single host label.
+ *
+ * If the label offset has not been set, returns the null value.
+ */
+ public function get(int $offset): ?string;
+
+ /**
+ * Returns the associated key for a specific label or all the keys.
+ *
+ * @param ?string $label
+ *
+ * @return int[]
+ */
+ public function keys(?string $label = null): array;
+
+ /**
+ * Tells whether the domain is absolute.
+ */
+ public function isAbsolute(): bool;
+
+ /**
+ * Prepends a label to the host.
+ */
+ public function prepend(string $label): self;
+
+ /**
+ * Appends a label to the host.
+ */
+ public function append(string $label): self;
+
+ /**
+ * Returns an instance with its Root label.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function withRootLabel(): self;
+
+ /**
+ * Returns an instance without its Root label.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function withoutRootLabel(): self;
+
+ /**
+ * Returns an instance with the modified label.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the new label
+ *
+ * If $key is non-negative, the added label will be the label at $key position from the start.
+ * If $key is negative, the added label will be the label at $key position from the end.
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withLabel(int $key, string $label): self;
+
+ /**
+ * Returns an instance without the specified label.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * If $key is non-negative, the removed label will be the label at $key position from the start.
+ * If $key is negative, the removed label will be the label at $key position from the end.
+ *
+ * @param int ...$keys
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withoutLabel(int ...$keys): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php
new file mode 100644
index 00000000..3d80f066
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface FragmentInterface extends UriComponentInterface
+{
+ /**
+ * Returns the decoded fragment.
+ */
+ public function decoded(): ?string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/HostInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/HostInterface.php
new file mode 100644
index 00000000..a8b8bb35
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/HostInterface.php
@@ -0,0 +1,51 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface HostInterface extends UriComponentInterface
+{
+ /**
+ * Returns the ascii representation.
+ */
+ public function toAscii(): ?string;
+
+ /**
+ * Returns the unicode representation.
+ */
+ public function toUnicode(): ?string;
+
+ /**
+ * Returns the IP version.
+ *
+ * If the host is a not an IP this method will return null
+ */
+ public function getIpVersion(): ?string;
+
+ /**
+ * Returns the IP component If the Host is an IP address.
+ *
+ * If the host is a not an IP this method will return null
+ */
+ public function getIp(): ?string;
+
+ /**
+ * Tells whether the host is a domain name.
+ */
+ public function isDomain(): bool;
+
+ /**
+ * Tells whether the host is an IP Address.
+ */
+ public function isIp(): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php
new file mode 100644
index 00000000..1e2242ab
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php
@@ -0,0 +1,48 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface IpHostInterface extends HostInterface
+{
+ /**
+ * Returns whether or not the host is an IPv4 address.
+ */
+ public function isIpv4(): bool;
+ /**
+ * Returns whether or not the host is an IPv6 address.
+ */
+ public function isIpv6(): bool;
+
+ /**
+ * Returns whether or not the host is an IPv6 address.
+ */
+ public function isIpFuture(): bool;
+
+ /**
+ * Returns whether or not the host has a ZoneIdentifier.
+ *
+ * @see http://tools.ietf.org/html/rfc6874#section-4
+ */
+ public function hasZoneIdentifier(): bool;
+
+ /**
+ * Returns an host without its zone identifier according to RFC6874.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance without the host zone identifier according to RFC6874
+ *
+ * @see http://tools.ietf.org/html/rfc6874#section-4
+ */
+ public function withoutZoneIdentifier(): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PathInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PathInterface.php
new file mode 100644
index 00000000..389c0ff0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PathInterface.php
@@ -0,0 +1,90 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+interface PathInterface extends UriComponentInterface
+{
+ /**
+ * Returns the decoded path.
+ */
+ public function decoded(): string;
+
+ /**
+ * Returns whether or not the path is absolute or relative.
+ */
+ public function isAbsolute(): bool;
+
+ /**
+ * Returns whether or not the path has a trailing delimiter.
+ */
+ public function hasTrailingSlash(): bool;
+
+ /**
+ * Returns an instance without dot segments.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component normalized by removing
+ * the dot segment.
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutDotSegments(): self;
+
+ /**
+ * Returns an instance with a leading slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component with a leading slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withLeadingSlash(): self;
+
+ /**
+ * Returns an instance without a leading slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component without a leading slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutLeadingSlash(): self;
+
+ /**
+ * Returns an instance with a trailing slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component with a trailing slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withTrailingSlash(): self;
+
+ /**
+ * Returns an instance without a trailing slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component without a trailing slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutTrailingSlash(): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PortInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PortInterface.php
new file mode 100644
index 00000000..7230c4ad
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/PortInterface.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface PortInterface extends UriComponentInterface
+{
+ /**
+ * Returns the integer representation of the Port.
+ */
+ public function toInt(): ?int;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php
new file mode 100644
index 00000000..f7081ea2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php
@@ -0,0 +1,227 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+/**
+ * @extends \IteratorAggregate
+ */
+interface QueryInterface extends \Countable, \IteratorAggregate, UriComponentInterface
+{
+ /**
+ * Returns the query separator.
+ */
+ public function getSeparator(): string;
+
+ /**
+ * Returns the number of key/value pairs present in the object.
+ */
+ public function count(): int;
+
+ /**
+ * Returns an iterator allowing to go through all key/value pairs contained in this object.
+ *
+ * The pair is represented as an array where the first value is the pair key
+ * and the second value the pair value.
+ *
+ * The key of each pair is a string
+ * The value of each pair is a scalar or the null value
+ *
+ * @return \Iterator
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Returns an iterator allowing to go through all key/value pairs contained in this object.
+ *
+ * The return type is as a Iterator where its offset is the pair key and its value the pair value.
+ *
+ * The key of each pair is a string
+ * The value of each pair is a scalar or the null value
+ *
+ * @return iterable
+ */
+ public function pairs(): iterable;
+
+ /**
+ * Tells whether a pair with a specific name exists.
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has
+ */
+ public function has(string $key): bool;
+
+ /**
+ * Returns the first value associated to the given pair name.
+ *
+ * If no value is found null is returned
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-get
+ */
+ public function get(string $key): ?string;
+
+ /**
+ * Returns all the values associated to the given pair name as an array or all
+ * the instance pairs.
+ *
+ * If no value is found an empty array is returned
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall
+ *
+ * @return array
+ */
+ public function getAll(string $key): array;
+
+ /**
+ * Returns the store PHP variables as elements of an array.
+ *
+ * The result is similar as PHP parse_str when used with its
+ * second argument with the difference that variable names are
+ * not mangled.
+ *
+ * If a key is submitted it will returns the value attached to it or null
+ *
+ * @see http://php.net/parse_str
+ * @see https://wiki.php.net/rfc/on_demand_name_mangling
+ *
+ * @param ?string $key
+ * @return mixed the collection of stored PHP variables or the empty array if no input is given,
+ * the single value of a stored PHP variable or null if the variable is not present in the collection
+ */
+ public function params(?string $key = null);
+
+ /**
+ * Returns the RFC1738 encoded query.
+ */
+ public function toRFC1738(): ?string;
+
+ /**
+ * Returns the RFC3986 encoded query.
+ *
+ * @see ::getContent
+ */
+ public function toRFC3986(): ?string;
+
+ /**
+ * Returns an instance with a different separator.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component with a different separator
+ */
+ public function withSeparator(string $separator): self;
+
+ /**
+ * Sorts the query string by offset, maintaining offset to data correlations.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort
+ */
+ public function sort(): self;
+
+ /**
+ * Returns an instance without duplicate key/value pair.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized by removing
+ * duplicate pairs whose key/value are the same.
+ */
+ public function withoutDuplicates(): self;
+
+ /**
+ * Returns an instance without empty key/value where the value is the null value.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized by removing
+ * empty pairs.
+ *
+ * A pair is considered empty if its value is equal to the null value
+ */
+ public function withoutEmptyPairs(): self;
+
+ /**
+ * Returns an instance where numeric indices associated to PHP's array like key are removed.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized so that numeric indexes
+ * are removed from the pair key value.
+ *
+ * ie.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar
+ */
+ public function withoutNumericIndices(): self;
+
+ /**
+ * Returns an instance with the a new key/value pair added to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * If the pair already exists the value will replace the existing value.
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set
+ *
+ * @param ?string $value
+ */
+ public function withPair(string $key, ?string $value): self;
+
+ /**
+ * Returns an instance with the new pairs set to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @see ::withPair
+ */
+ public function merge(string $query): self;
+
+ /**
+ * Returns an instance without the specified keys.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * @param string ...$keys
+ */
+ public function withoutPair(string ...$keys): self;
+
+ /**
+ * Returns a new instance with a specified key/value pair appended as a new pair.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @param ?string $value
+ */
+ public function appendTo(string $key, ?string $value): self;
+
+ /**
+ * Returns an instance with the new pairs appended to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * If the pair already exists the value will be added to it.
+ */
+ public function append(string $query): self;
+
+ /**
+ * Returns an instance without the specified params.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component without PHP's value.
+ * PHP's mangled is not taken into account.
+ *
+ * @param string ...$keys
+ */
+ public function withoutParam(string ...$keys): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php
new file mode 100644
index 00000000..53065fff
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php
@@ -0,0 +1,147 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+/**
+ * @extends \IteratorAggregate
+ */
+interface SegmentedPathInterface extends \Countable, \IteratorAggregate, PathInterface
+{
+ /**
+ * Returns the total number of segments in the path.
+ */
+ public function count(): int;
+
+ /**
+ * Iterate over the path segment.
+ *
+ * @return \Iterator
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Returns parent directory's path.
+ */
+ public function getDirname(): string;
+
+ /**
+ * Returns the path basename.
+ */
+ public function getBasename(): string;
+
+ /**
+ * Returns the basename extension.
+ */
+ public function getExtension(): string;
+
+ /**
+ * Retrieves a single path segment.
+ *
+ * If the segment offset has not been set, returns null.
+ */
+ public function get(int $offset): ?string;
+
+ /**
+ * Returns the associated key for a specific segment.
+ *
+ * If a value is specified only the keys associated with
+ * the given value will be returned
+ *
+ * @param ?string $segment
+ *
+ * @return int[]
+ */
+ public function keys(?string $segment = null): array;
+
+ /**
+ * Appends a segment to the path.
+ */
+ public function append(string $segment): self;
+
+ /**
+ * Prepends a segment to the path.
+ */
+ public function prepend(string $segment): self;
+
+ /**
+ * Returns an instance with the modified segment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the new segment
+ *
+ * If $key is non-negative, the added segment will be the segment at $key position from the start.
+ * If $key is negative, the added segment will be the segment at $key position from the end.
+ *
+ * @param ?string $segment
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withSegment(int $key, ?string $segment): self;
+
+ /**
+ * Returns an instance without the specified segment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * If $key is non-negative, the removed segment will be the segment at $key position from the start.
+ * If $key is negative, the removed segment will be the segment at $key position from the end.
+ *
+ * @param int ...$keys remaining keys to remove
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withoutSegment(int ...$keys): self;
+
+ /**
+ * Returns an instance without duplicate delimiters.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component normalized by removing
+ * multiple consecutive empty segment
+ */
+ public function withoutEmptySegments(): self;
+
+ /**
+ * Returns an instance with the specified parent directory's path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $path
+ */
+ public function withDirname(?string $path): self;
+
+ /**
+ * Returns an instance with the specified basename.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $basename
+ */
+ public function withBasename(?string $basename): self;
+
+ /**
+ * Returns an instance with the specified basename extension.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $extension
+ */
+ public function withExtension(?string $extension): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php
new file mode 100644
index 00000000..c7b39bb5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface UriComponentInterface extends \JsonSerializable
+{
+ /**
+ * Returns the instance content.
+ *
+ * If the instance is defined, the value returned MUST be encoded according to the
+ * selected encoding algorithm. In any case, the value MUST NOT double-encode any character
+ * depending on the selected encoding algorithm.
+ *
+ * To determine what characters to encode, please refer to RFC 3986, Sections 2 and 3.
+ * or RFC 3987 Section 3. By default the content is encoded according to RFC3986
+ *
+ * If the instance is not defined null is returned
+ */
+ public function getContent(): ?string;
+
+ /**
+ * Returns the instance string representation.
+ *
+ * If the instance is defined, the value returned MUST be percent-encoded,
+ * but MUST NOT double-encode any characters. To determine what characters
+ * to encode, please refer to RFC 3986, Sections 2 and 3.
+ *
+ * If the instance is not defined an empty string is returned
+ */
+ public function __toString(): string;
+
+ /**
+ * Returns the instance json representation.
+ *
+ * If the instance is defined, the value returned MUST be percent-encoded,
+ * but MUST NOT double-encode any characters. To determine what characters
+ * to encode, please refer to RFC 3986 or RFC 1738.
+ *
+ * If the instance is not defined null is returned
+ */
+ public function jsonSerialize(): ?string;
+
+ /**
+ * Returns the instance string representation with its optional URI delimiters.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode any
+ * characters. To determine what characters to encode, please refer to RFC 3986,
+ * Sections 2 and 3.
+ *
+ * If the instance is not defined an empty string is returned
+ */
+ public function getUriComponent(): string;
+
+ /**
+ * Returns an instance with the specified content.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified content.
+ *
+ * Users can provide both encoded and decoded content characters.
+ *
+ * A null value is equivalent to removing the component content.
+ *
+ *
+ * @param ?string $content
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withContent(?string $content): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriException.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriException.php
new file mode 100644
index 00000000..c0fec2a1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use Throwable;
+
+interface UriException extends Throwable
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriInterface.php
new file mode 100644
index 00000000..b6eb6a1f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UriInterface.php
@@ -0,0 +1,292 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface UriInterface extends \JsonSerializable
+{
+ /**
+ * Returns the string representation as a URI reference.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ */
+ public function __toString(): string;
+
+ /**
+ * Returns the string representation as a URI reference.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ * @see ::__toString
+ */
+ public function jsonSerialize(): string;
+
+ /**
+ * Retrieve the scheme component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.1.
+ *
+ * The trailing ":" character is not part of the scheme and MUST NOT be
+ * added.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ public function getScheme(): ?string;
+
+ /**
+ * Retrieve the authority component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * If the port component is not set or is the standard port for the current
+ * scheme, it SHOULD NOT be included.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2
+ */
+ public function getAuthority(): ?string;
+
+ /**
+ * Retrieve the user information component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * If a user is present in the URI, this will return that value;
+ * additionally, if the password is also present, it will be appended to the
+ * user value, with a colon (":") separating the values.
+ *
+ * The trailing "@" character is not part of the user information and MUST
+ * NOT be added.
+ */
+ public function getUserInfo(): ?string;
+
+ /**
+ * Retrieve the host component of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.2.2.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function getHost(): ?string;
+
+ /**
+ * Retrieve the port component of the URI.
+ *
+ * If a port is present, and it is non-standard for the current scheme,
+ * this method MUST return it as an integer. If the port is the standard port
+ * used with the current scheme, this method SHOULD return null.
+ *
+ * If no port is present, and no scheme is present, this method MUST return
+ * a null value.
+ *
+ * If no port is present, but a scheme is present, this method MAY return
+ * the standard port for that scheme, but SHOULD return null.
+ */
+ public function getPort(): ?int;
+
+ /**
+ * Retrieve the path component of the URI.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Normally, the empty path "" and absolute path "/" are considered equal as
+ * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+ * do this normalization because in contexts with a trimmed base path, e.g.
+ * the front controller, this difference becomes significant. It's the task
+ * of the user to handle both "" and "/".
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.3.
+ *
+ * As an example, if the value should include a slash ("/") not intended as
+ * delimiter between path segments, that value MUST be passed in encoded
+ * form (e.g., "%2F") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.3
+ */
+ public function getPath(): string;
+
+ /**
+ * Retrieve the query string of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The leading "?" character is not part of the query and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.4.
+ *
+ * As an example, if a value in a key/value pair of the query string should
+ * include an ampersand ("&") not intended as a delimiter between values,
+ * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.4
+ */
+ public function getQuery(): ?string;
+
+ /**
+ * Retrieve the fragment component of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The leading "#" character is not part of the fragment and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.5.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.5
+ */
+ public function getFragment(): ?string;
+
+ /**
+ * Return an instance with the specified scheme.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified scheme.
+ *
+ * A null value provided for the scheme is equivalent to removing the scheme
+ * information.
+ *
+ * @param ?string $scheme
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withScheme(?string $scheme): self;
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; a null value for the user is equivalent to removing user
+ * information.
+ *
+ * @param ?string $user
+ * @param ?string $password
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withUserInfo(?string $user, ?string $password = null): self;
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * A null value provided for the host is equivalent to removing the host
+ * information.
+ *
+ * @param ?string $host
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withHost(?string $host): self;
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param ?int $port
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPort(?int $port): self;
+
+ /**
+ * Return an instance with the specified path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified path.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Users can provide both encoded and decoded path characters.
+ * Implementations ensure the correct encoding as outlined in getPath().
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPath(string $path): self;
+
+ /**
+ * Return an instance with the specified query string.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified query string.
+ *
+ * Users can provide both encoded and decoded query characters.
+ * Implementations ensure the correct encoding as outlined in getQuery().
+ *
+ * A null value provided for the query is equivalent to removing the query
+ * information.
+ *
+ * @param ?string $query
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withQuery(?string $query): self;
+
+ /**
+ * Return an instance with the specified URI fragment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified URI fragment.
+ *
+ * Users can provide both encoded and decoded fragment characters.
+ * Implementations ensure the correct encoding as outlined in getFragment().
+ *
+ * A null value provided for the fragment is equivalent to removing the fragment
+ * information.
+ *
+ * @param ?string $fragment
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withFragment(?string $fragment): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php
new file mode 100644
index 00000000..6411f9b6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface UserInfoInterface extends UriComponentInterface
+{
+ /**
+ * Returns the user component part.
+ */
+ public function getUser(): ?string;
+
+ /**
+ * Returns the pass component part.
+ */
+ public function getPass(): ?string;
+
+ /**
+ * Returns an instance with the specified user and/or pass.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user.
+ *
+ * An empty user is equivalent to removing the user information.
+ *
+ * @param ?string $user
+ * @param ?string $pass
+ */
+ public function withUserInfo(?string $user, ?string $pass = null): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php
new file mode 100644
index 00000000..0105b2da
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class FileinfoSupportMissing extends \RuntimeException implements UriException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php
new file mode 100644
index 00000000..8ff3b538
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class IdnSupportMissing extends \RuntimeException implements UriException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php
new file mode 100644
index 00000000..80259f3b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php
@@ -0,0 +1,46 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Idna\IdnaInfo;
+
+final class IdnaConversionFailed extends SyntaxError
+{
+ /** @var IdnaInfo|null */
+ private $idnaInfo;
+
+ private function __construct(string $message, IdnaInfo $idnaInfo = null)
+ {
+ parent::__construct($message);
+ $this->idnaInfo = $idnaInfo;
+ }
+
+ public static function dueToIDNAError(string $domain, IdnaInfo $idnaInfo): self
+ {
+ return new self(
+ 'The host `'.$domain.'` is invalid : '.implode(', ', $idnaInfo->errorList()).' .',
+ $idnaInfo
+ );
+ }
+
+ public static function dueToInvalidHost(string $domain): self
+ {
+ return new self('The host `'.$domain.'` is not a valid IDN host');
+ }
+
+ public function idnaInfo(): ?IdnaInfo
+ {
+ return $this->idnaInfo;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php
new file mode 100644
index 00000000..1b5e4cbd
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class SyntaxError extends \InvalidArgumentException implements UriException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/Idna.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/Idna.php
new file mode 100644
index 00000000..59306874
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/Idna.php
@@ -0,0 +1,212 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Idna;
+
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use function defined;
+use function function_exists;
+use function idn_to_ascii;
+use function idn_to_utf8;
+use function rawurldecode;
+use const INTL_IDNA_VARIANT_UTS46;
+
+/**
+ * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html
+ */
+final class Idna
+{
+ private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/';
+ private const MAX_DOMAIN_LENGTH = 253;
+ private const MAX_LABEL_LENGTH = 63;
+
+ /**
+ * General registered name regular expression.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @see https://regex101.com/r/fptU8V/1
+ */
+ private const REGEXP_REGISTERED_NAME = '/
+ (?(DEFINE)
+ (?[a-z0-9_~\-]) # . is missing as it is used to separate labels
+ (?[!$&\'()*+,;=])
+ (?%[A-F0-9]{2})
+ (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*)
+ )
+ ^(?:(?®_name)\.)*(?®_name)\.?$
+ /ix';
+
+ /**
+ * IDNA options.
+ */
+ public const IDNA_DEFAULT = 0;
+ public const IDNA_ALLOW_UNASSIGNED = 1;
+ public const IDNA_USE_STD3_RULES = 2;
+ public const IDNA_CHECK_BIDI = 4;
+ public const IDNA_CHECK_CONTEXTJ = 8;
+ public const IDNA_NONTRANSITIONAL_TO_ASCII = 0x10;
+ public const IDNA_NONTRANSITIONAL_TO_UNICODE = 0x20;
+ public const IDNA_CHECK_CONTEXTO = 0x40;
+
+ /**
+ * IDNA errors.
+ */
+ public const ERROR_NONE = 0;
+ public const ERROR_EMPTY_LABEL = 1;
+ public const ERROR_LABEL_TOO_LONG = 2;
+ public const ERROR_DOMAIN_NAME_TOO_LONG = 4;
+ public const ERROR_LEADING_HYPHEN = 8;
+ public const ERROR_TRAILING_HYPHEN = 0x10;
+ public const ERROR_HYPHEN_3_4 = 0x20;
+ public const ERROR_LEADING_COMBINING_MARK = 0x40;
+ public const ERROR_DISALLOWED = 0x80;
+ public const ERROR_PUNYCODE = 0x100;
+ public const ERROR_LABEL_HAS_DOT = 0x200;
+ public const ERROR_INVALID_ACE_LABEL = 0x400;
+ public const ERROR_BIDI = 0x800;
+ public const ERROR_CONTEXTJ = 0x1000;
+ public const ERROR_CONTEXTO_PUNCTUATION = 0x2000;
+ public const ERROR_CONTEXTO_DIGITS = 0x4000;
+
+ /**
+ * IDNA default options.
+ */
+ public const IDNA2008_ASCII = self::IDNA_NONTRANSITIONAL_TO_ASCII
+ | self::IDNA_CHECK_BIDI
+ | self::IDNA_USE_STD3_RULES
+ | self::IDNA_CHECK_CONTEXTJ;
+ public const IDNA2008_UNICODE = self::IDNA_NONTRANSITIONAL_TO_UNICODE
+ | self::IDNA_CHECK_BIDI
+ | self::IDNA_USE_STD3_RULES
+ | self::IDNA_CHECK_CONTEXTJ;
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private static function supportsIdna(): void
+ {
+ static $idnSupport;
+ if (null === $idnSupport) {
+ $idnSupport = function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46');
+ }
+
+ if (!$idnSupport) {
+ throw new IdnSupportMissing('IDN host can not be processed. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.');
+ }
+ }
+
+ /**
+ * Converts the input to its IDNA ASCII form.
+ *
+ * This method returns the string converted to IDN ASCII form
+ *
+ * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm
+ */
+ public static function toAscii(string $domain, int $options): IdnaInfo
+ {
+ $domain = rawurldecode($domain);
+
+ if (1 === preg_match(self::REGEXP_IDNA_PATTERN, $domain)) {
+ self::supportsIdna();
+
+ /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo);
+ if ([] === $idnaInfo) {
+ return IdnaInfo::fromIntl([
+ 'result' => strtolower($domain),
+ 'isTransitionalDifferent' => false,
+ 'errors' => self::validateDomainAndLabelLength($domain),
+ ]);
+ }
+
+ /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ return IdnaInfo::fromIntl($idnaInfo);
+ }
+
+ $error = self::ERROR_NONE;
+ if (1 !== preg_match(self::REGEXP_REGISTERED_NAME, $domain)) {
+ $error |= self::ERROR_DISALLOWED;
+ }
+
+ return IdnaInfo::fromIntl([
+ 'result' => strtolower($domain),
+ 'isTransitionalDifferent' => false,
+ 'errors' => self::validateDomainAndLabelLength($domain) | $error,
+ ]);
+ }
+
+ /**
+ * Converts the input to its IDNA UNICODE form.
+ *
+ * This method returns the string converted to IDN UNICODE form
+ *
+ * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm
+ */
+ public static function toUnicode(string $domain, int $options): IdnaInfo
+ {
+ $domain = rawurldecode($domain);
+
+ if (false === stripos($domain, 'xn--')) {
+ return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => self::ERROR_NONE]);
+ }
+
+ self::supportsIdna();
+
+ /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo);
+ if ([] === $idnaInfo) {
+ throw IdnaConversionFailed::dueToInvalidHost($domain);
+ }
+
+ /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ return IdnaInfo::fromIntl($idnaInfo);
+ }
+
+ /**
+ * Adapted from https://github.com/TRowbotham/idna.
+ *
+ * @see https://github.com/TRowbotham/idna/blob/master/src/Idna.php#L236
+ */
+ private static function validateDomainAndLabelLength(string $domain): int
+ {
+ $error = self::ERROR_NONE;
+ $labels = explode('.', $domain);
+ $maxDomainSize = self::MAX_DOMAIN_LENGTH;
+ $length = count($labels);
+
+ // If the last label is empty and it is not the first label, then it is the root label.
+ // Increase the max size by 1, making it 254, to account for the root label's "."
+ // delimiter. This also means we don't need to check the last label's length for being too
+ // long.
+ if ($length > 1 && $labels[$length - 1] === '') {
+ ++$maxDomainSize;
+ array_pop($labels);
+ }
+
+ if (strlen($domain) > $maxDomainSize) {
+ $error |= self::ERROR_DOMAIN_NAME_TOO_LONG;
+ }
+
+ foreach ($labels as $label) {
+ if (strlen($label) > self::MAX_LABEL_LENGTH) {
+ $error |= self::ERROR_LABEL_TOO_LONG;
+
+ break;
+ }
+ }
+
+ return $error;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php
new file mode 100644
index 00000000..73610a28
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php
@@ -0,0 +1,113 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Idna;
+
+use function array_filter;
+use const ARRAY_FILTER_USE_KEY;
+
+/**
+ * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html
+ */
+final class IdnaInfo
+{
+ private const ERRORS = [
+ Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty',
+ Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes',
+ Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form',
+ Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")',
+ Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")',
+ Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions',
+ Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark',
+ Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters',
+ Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode',
+ Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop',
+ Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string',
+ Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)',
+ Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements',
+ Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits',
+ Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts',
+ ];
+
+ /** @var string */
+ private $result;
+
+ /** @var bool */
+ private $isTransitionalDifferent;
+
+ /** @var int */
+ private $errors;
+
+ /**
+ * @var array
+ */
+ private $errorList;
+
+ private function __construct(string $result, bool $isTransitionalDifferent, int $errors)
+ {
+ $this->result = $result;
+ $this->errors = $errors;
+ $this->isTransitionalDifferent = $isTransitionalDifferent;
+ $this->errorList = array_filter(
+ self::ERRORS,
+ function (int $error): bool {
+ return 0 !== ($error & $this->errors);
+ },
+ ARRAY_FILTER_USE_KEY
+ );
+ }
+
+ /**
+ * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos
+ */
+ public static function fromIntl(array $infos): self
+ {
+ return new self($infos['result'], $infos['isTransitionalDifferent'], $infos['errors']);
+ }
+
+ /**
+ * @param array{result:string, isTransitionalDifferent:bool, errors:int} $properties
+ */
+ public static function __set_state(array $properties): self
+ {
+ return self::fromIntl($properties);
+ }
+
+ public function result(): string
+ {
+ return $this->result;
+ }
+
+ public function isTransitionalDifferent(): bool
+ {
+ return $this->isTransitionalDifferent;
+ }
+
+ public function errors(): int
+ {
+ return $this->errors;
+ }
+
+ public function error(int $error): ?string
+ {
+ return $this->errorList[$error] ?? null;
+ }
+
+ /**
+ * @return array
+ */
+ public function errorList(): array
+ {
+ return $this->errorList;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/.php-cs-fixer.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/.php-cs-fixer.php
new file mode 100644
index 00000000..7304a712
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/.php-cs-fixer.php
@@ -0,0 +1,58 @@
+
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+EOF;
+
+$finder = PhpCsFixer\Finder::create()
+ ->in(__DIR__.'/src')
+ ->in(__DIR__.'/benchmark')
+;
+
+$config = new PhpCsFixer\Config();
+
+return $config
+ ->setRules([
+ '@PSR2' => true,
+ 'array_syntax' => ['syntax' => 'short'],
+ 'concat_space' => ['spacing' => 'none'],
+ 'header_comment' => [
+ 'comment_type' => 'PHPDoc',
+ 'header' => $header,
+ 'location' => 'after_open',
+ 'separate' => 'both',
+ ],
+ 'new_with_braces' => true,
+ 'no_blank_lines_after_phpdoc' => true,
+ 'no_empty_phpdoc' => true,
+ 'no_empty_comment' => true,
+ 'no_leading_import_slash' => true,
+ 'no_superfluous_phpdoc_tags' => true,
+ 'no_trailing_comma_in_singleline_array' => true,
+ 'no_unused_imports' => true,
+ 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'],
+ 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false],
+ 'phpdoc_align' => true,
+ 'phpdoc_no_empty_return' => true,
+ 'phpdoc_order' => true,
+ 'phpdoc_scalar' => true,
+ 'phpdoc_to_comment' => true,
+ 'phpdoc_summary' => true,
+ 'psr_autoloading' => true,
+ 'return_type_declaration' => ['space_before' => 'none'],
+ 'single_blank_line_before_namespace' => true,
+ 'single_quote' => true,
+ 'space_after_semicolon' => true,
+ 'ternary_operator_spaces' => true,
+ 'trailing_comma_in_multiline' => true,
+ 'trim_array_spaces' => true,
+ 'whitespace_after_comma_in_array' => true,
+ 'yoda_style' => true,
+ ])
+ ->setFinder($finder)
+;
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/LICENSE b/wp-content/plugins/wp-webauthn/vendor/league/uri/LICENSE
new file mode 100644
index 00000000..3b52528f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 ignace nyamagana butera
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/composer.json b/wp-content/plugins/wp-webauthn/vendor/league/uri/composer.json
new file mode 100644
index 00000000..a241129f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/composer.json
@@ -0,0 +1,104 @@
+{
+ "name": "league/uri",
+ "type": "library",
+ "description" : "URI manipulation library",
+ "keywords": [
+ "url",
+ "uri",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "psr-7",
+ "parse_url",
+ "http",
+ "https",
+ "ws",
+ "ftp",
+ "data-uri",
+ "file-uri",
+ "middleware",
+ "parse_str",
+ "query-string",
+ "querystring",
+ "hostname",
+ "uri-template"
+ ],
+ "license": "MIT",
+ "homepage": "http://uri.thephpleague.com",
+ "authors": [
+ {
+ "name" : "Ignace Nyamagana Butera",
+ "email" : "nyamsprod@gmail.com",
+ "homepage" : "https://nyamsprod.com"
+ }
+ ],
+ "support": {
+ "forum": "https://thephpleague.slack.com",
+ "docs": "https://uri.thephpleague.com",
+ "issues": "https://github.com/thephpleague/uri/issues"
+ },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nyamsprod"
+ }
+ ],
+ "require": {
+ "php": "^7.3 || ^8.0",
+ "ext-json": "*",
+ "psr/http-message": "^1.0",
+ "league/uri-interfaces": "^2.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19 || ^3.0",
+ "phpunit/phpunit" : "^8.0 || ^9.0",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-strict-rules": "^0.12.11",
+ "phpstan/phpstan-phpunit": "^0.12.22",
+ "psr/http-factory": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "LeagueTest\\Uri\\": "tests"
+ }
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "scripts": {
+ "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi",
+ "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi",
+ "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit=256M",
+ "phpunit": "phpunit --coverage-text",
+ "test": [
+ "@phpunit",
+ "@phpstan",
+ "@phpcs"
+ ]
+ },
+ "scripts-descriptions": {
+ "phpcs": "Runs coding style test suite",
+ "phpstan": "Runs complete codebase static analysis",
+ "phpunit": "Runs unit and functional testing",
+ "test": "Runs full test suite"
+ },
+ "suggest": {
+ "league/uri-components" : "Needed to easily manipulate URI objects",
+ "ext-intl" : "Needed to improve host validation",
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "config": {
+ "sort-packages": true
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php
new file mode 100644
index 00000000..5618154c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class TemplateCanNotBeExpanded extends \InvalidArgumentException implements UriException
+{
+ public static function dueToUnableToProcessValueListWithPrefix(string $variableName): self
+ {
+ return new self('The ":" modifier can not be applied on "'.$variableName.'" since it is a list of values.');
+ }
+
+ public static function dueToNestedListOfValue(string $variableName): self
+ {
+ return new self('The "'.$variableName.'" can not be a nested list.');
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Http.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Http.php
new file mode 100644
index 00000000..2bbd8a77
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Http.php
@@ -0,0 +1,335 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\SyntaxError;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function sprintf;
+
+final class Http implements Psr7UriInterface, \JsonSerializable
+{
+ /**
+ * @var UriInterface
+ */
+ private $uri;
+
+ /**
+ * New instance.
+ */
+ private function __construct(UriInterface $uri)
+ {
+ $this->validate($uri);
+ $this->uri = $uri;
+ }
+
+ /**
+ * Validate the submitted uri against PSR-7 UriInterface.
+ *
+ * @throws SyntaxError if the given URI does not follow PSR-7 UriInterface rules
+ */
+ private function validate(UriInterface $uri): void
+ {
+ $scheme = $uri->getScheme();
+ if (null === $scheme && '' === $uri->getHost()) {
+ throw new SyntaxError(sprintf('an URI without scheme can not contains a empty host string according to PSR-7: %s', (string) $uri));
+ }
+
+ $port = $uri->getPort();
+ if (null !== $port && ($port < 0 || $port > 65535)) {
+ throw new SyntaxError(sprintf('The URI port is outside the established TCP and UDP port ranges: %s', (string) $uri->getPort()));
+ }
+ }
+
+ /**
+ * Static method called by PHP's var export.
+ */
+ public static function __set_state(array $components): self
+ {
+ return new self($components['uri']);
+ }
+
+ /**
+ * Create a new instance from a string.
+ *
+ * @param string|mixed $uri
+ */
+ public static function createFromString($uri = ''): self
+ {
+ return new self(Uri::createFromString($uri));
+ }
+
+ /**
+ * Create a new instance from a hash of parse_url parts.
+ *
+ * @param array $components a hash representation of the URI similar
+ * to PHP parse_url function result
+ */
+ public static function createFromComponents(array $components): self
+ {
+ return new self(Uri::createFromComponents($components));
+ }
+
+ /**
+ * Create a new instance from the environment.
+ */
+ public static function createFromServer(array $server): self
+ {
+ return new self(Uri::createFromServer($server));
+ }
+
+ /**
+ * Create a new instance from a URI and a Base URI.
+ *
+ * The returned URI must be absolute.
+ *
+ * @param mixed $uri the input URI to create
+ * @param mixed $base_uri the base URI used for reference
+ */
+ public static function createFromBaseUri($uri, $base_uri = null): self
+ {
+ return new self(Uri::createFromBaseUri($uri, $base_uri));
+ }
+
+ /**
+ * Create a new instance from a URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri the input URI to create
+ */
+ public static function createFromUri($uri): self
+ {
+ if ($uri instanceof UriInterface) {
+ return new self($uri);
+ }
+
+ return new self(Uri::createFromUri($uri));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getScheme(): string
+ {
+ return (string) $this->uri->getScheme();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAuthority(): string
+ {
+ return (string) $this->uri->getAuthority();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getUserInfo(): string
+ {
+ return (string) $this->uri->getUserInfo();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getHost(): string
+ {
+ return (string) $this->uri->getHost();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPort(): ?int
+ {
+ return $this->uri->getPort();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPath(): string
+ {
+ return $this->uri->getPath();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getQuery(): string
+ {
+ return (string) $this->uri->getQuery();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getFragment(): string
+ {
+ return (string) $this->uri->getFragment();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withScheme($scheme): self
+ {
+ $scheme = $this->filterInput($scheme);
+ if ('' === $scheme) {
+ $scheme = null;
+ }
+
+ $uri = $this->uri->withScheme($scheme);
+ if ($uri->getScheme() === $this->uri->getScheme()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * Safely stringify input when possible.
+ *
+ * @param mixed $str the value to evaluate as a string
+ *
+ * @throws SyntaxError if the submitted data can not be converted to string
+ *
+ * @return string|mixed
+ */
+ private function filterInput($str)
+ {
+ if (is_scalar($str) || (is_object($str) && method_exists($str, '__toString'))) {
+ return (string) $str;
+ }
+
+ return $str;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withUserInfo($user, $password = null): self
+ {
+ $user = $this->filterInput($user);
+ if ('' === $user) {
+ $user = null;
+ }
+
+ $uri = $this->uri->withUserInfo($user, $password);
+ if ($uri->getUserInfo() === $this->uri->getUserInfo()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withHost($host): self
+ {
+ $host = $this->filterInput($host);
+ if ('' === $host) {
+ $host = null;
+ }
+
+ $uri = $this->uri->withHost($host);
+ if ($uri->getHost() === $this->uri->getHost()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPort($port): self
+ {
+ $uri = $this->uri->withPort($port);
+ if ($uri->getPort() === $this->uri->getPort()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPath($path): self
+ {
+ $uri = $this->uri->withPath($path);
+ if ($uri->getPath() === $this->uri->getPath()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withQuery($query): self
+ {
+ $query = $this->filterInput($query);
+ if ('' === $query) {
+ $query = null;
+ }
+
+ $uri = $this->uri->withQuery($query);
+ if ($uri->getQuery() === $this->uri->getQuery()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withFragment($fragment): self
+ {
+ $fragment = $this->filterInput($fragment);
+ if ('' === $fragment) {
+ $fragment = null;
+ }
+
+ $uri = $this->uri->withFragment($fragment);
+ if ($uri->getFragment() === $this->uri->getFragment()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __toString(): string
+ {
+ return $this->uri->__toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function jsonSerialize(): string
+ {
+ return $this->uri->__toString();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/HttpFactory.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/HttpFactory.php
new file mode 100644
index 00000000..fc3bcfab
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/HttpFactory.php
@@ -0,0 +1,25 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use Psr\Http\Message\UriFactoryInterface;
+use Psr\Http\Message\UriInterface;
+
+final class HttpFactory implements UriFactoryInterface
+{
+ public function createUri(string $uri = ''): UriInterface
+ {
+ return Http::createFromString($uri);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Uri.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Uri.php
new file mode 100644
index 00000000..89f9aa13
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/Uri.php
@@ -0,0 +1,1397 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\FileinfoSupportMissing;
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Idna\Idna;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use function array_filter;
+use function array_map;
+use function base64_decode;
+use function base64_encode;
+use function count;
+use function explode;
+use function file_get_contents;
+use function filter_var;
+use function implode;
+use function in_array;
+use function inet_pton;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function preg_match;
+use function preg_replace;
+use function preg_replace_callback;
+use function rawurlencode;
+use function sprintf;
+use function str_replace;
+use function strlen;
+use function strpos;
+use function strspn;
+use function strtolower;
+use function substr;
+use const FILEINFO_MIME;
+use const FILTER_FLAG_IPV4;
+use const FILTER_FLAG_IPV6;
+use const FILTER_NULL_ON_FAILURE;
+use const FILTER_VALIDATE_BOOLEAN;
+use const FILTER_VALIDATE_IP;
+
+final class Uri implements UriInterface
+{
+ /**
+ * RFC3986 invalid characters.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ *
+ * @var string
+ */
+ private const REGEXP_INVALID_CHARS = '/[\x00-\x1f\x7f]/';
+
+ /**
+ * RFC3986 Sub delimiter characters regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ *
+ * @var string
+ */
+ private const REGEXP_CHARS_SUBDELIM = "\!\$&'\(\)\*\+,;\=%";
+
+ /**
+ * RFC3986 unreserved characters regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.3
+ *
+ * @var string
+ */
+ private const REGEXP_CHARS_UNRESERVED = 'A-Za-z0-9_\-\.~';
+
+ /**
+ * RFC3986 schema regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ private const REGEXP_SCHEME = ',^[a-z]([-a-z0-9+.]+)?$,i';
+
+ /**
+ * RFC3986 host identified by a registered name regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_HOST_REGNAME = '/^(
+ (?[a-z0-9_~\-\.])|
+ (?[!$&\'()*+,;=])|
+ (?%[A-F0-9]{2})
+ )+$/x';
+
+ /**
+ * RFC3986 delimiters of the generic URI components regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ */
+ private const REGEXP_HOST_GEN_DELIMS = '/[:\/?#\[\]@ ]/'; // Also includes space.
+
+ /**
+ * RFC3986 IPvFuture regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_HOST_IPFUTURE = '/^
+ v(?[A-F0-9])+\.
+ (?:
+ (?[a-z0-9_~\-\.])|
+ (?[!$&\'()*+,;=:]) # also include the : character
+ )+
+ $/ix';
+
+ /**
+ * RFC3986 IPvFuture host and port component.
+ */
+ private const REGEXP_HOST_PORT = ',^(?(\[.*]|[^:])*)(:(?[^/?#]*))?$,x';
+
+ /**
+ * Significant 10 bits of IP to detect Zone ID regular expression pattern.
+ */
+ private const HOST_ADDRESS_BLOCK = "\xfe\x80";
+
+ /**
+ * Regular expression pattern to for file URI.
+ * contains the volume but not the volume separator.
+ * The volume separator may be URL-encoded (`|` as `%7C`) by ::formatPath(),
+ * so we account for that here.
+ */
+ private const REGEXP_FILE_PATH = ',^(?/)?(?[a-zA-Z])(?:[:|\|]|%7C)(?.*)?,';
+
+ /**
+ * Mimetype regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ */
+ private const REGEXP_MIMETYPE = ',^\w+/[-.\w]+(?:\+[-.\w]+)?$,';
+
+ /**
+ * Base64 content regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ */
+ private const REGEXP_BINARY = ',(;|^)base64$,';
+
+ /**
+ * Windows file path string regular expression pattern.
+ * contains both the volume and volume separator.
+ */
+ private const REGEXP_WINDOW_PATH = ',^(?[a-zA-Z][:|\|]),';
+
+
+ /**
+ * Supported schemes and corresponding default port.
+ *
+ * @var array
+ */
+ private const SCHEME_DEFAULT_PORT = [
+ 'data' => null,
+ 'file' => null,
+ 'ftp' => 21,
+ 'gopher' => 70,
+ 'http' => 80,
+ 'https' => 443,
+ 'ws' => 80,
+ 'wss' => 443,
+ ];
+
+ /**
+ * URI validation methods per scheme.
+ *
+ * @var array
+ */
+ private const SCHEME_VALIDATION_METHOD = [
+ 'data' => 'isUriWithSchemeAndPathOnly',
+ 'file' => 'isUriWithSchemeHostAndPathOnly',
+ 'ftp' => 'isNonEmptyHostUriWithoutFragmentAndQuery',
+ 'gopher' => 'isNonEmptyHostUriWithoutFragmentAndQuery',
+ 'http' => 'isNonEmptyHostUri',
+ 'https' => 'isNonEmptyHostUri',
+ 'ws' => 'isNonEmptyHostUriWithoutFragment',
+ 'wss' => 'isNonEmptyHostUriWithoutFragment',
+ ];
+
+ /**
+ * All ASCII letters sorted by typical frequency of occurrence.
+ *
+ * @var string
+ */
+ private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
+
+ /**
+ * URI scheme component.
+ *
+ * @var string|null
+ */
+ private $scheme;
+
+ /**
+ * URI user info part.
+ *
+ * @var string|null
+ */
+ private $user_info;
+
+ /**
+ * URI host component.
+ *
+ * @var string|null
+ */
+ private $host;
+
+ /**
+ * URI port component.
+ *
+ * @var int|null
+ */
+ private $port;
+
+ /**
+ * URI authority string representation.
+ *
+ * @var string|null
+ */
+ private $authority;
+
+ /**
+ * URI path component.
+ *
+ * @var string
+ */
+ private $path = '';
+
+ /**
+ * URI query component.
+ *
+ * @var string|null
+ */
+ private $query;
+
+ /**
+ * URI fragment component.
+ *
+ * @var string|null
+ */
+ private $fragment;
+
+ /**
+ * URI string representation.
+ *
+ * @var string|null
+ */
+ private $uri;
+
+ /**
+ * Create a new instance.
+ *
+ * @param ?string $scheme
+ * @param ?string $user
+ * @param ?string $pass
+ * @param ?string $host
+ * @param ?int $port
+ * @param ?string $query
+ * @param ?string $fragment
+ */
+ private function __construct(
+ ?string $scheme,
+ ?string $user,
+ ?string $pass,
+ ?string $host,
+ ?int $port,
+ string $path,
+ ?string $query,
+ ?string $fragment
+ ) {
+ $this->scheme = $this->formatScheme($scheme);
+ $this->user_info = $this->formatUserInfo($user, $pass);
+ $this->host = $this->formatHost($host);
+ $this->port = $this->formatPort($port);
+ $this->authority = $this->setAuthority();
+ $this->path = $this->formatPath($path);
+ $this->query = $this->formatQueryAndFragment($query);
+ $this->fragment = $this->formatQueryAndFragment($fragment);
+ $this->assertValidState();
+ }
+
+ /**
+ * Format the Scheme and Host component.
+ *
+ * @param ?string $scheme
+ *
+ * @throws SyntaxError if the scheme is invalid
+ */
+ private function formatScheme(?string $scheme): ?string
+ {
+ if (null === $scheme) {
+ return $scheme;
+ }
+
+ $formatted_scheme = strtolower($scheme);
+ if (1 === preg_match(self::REGEXP_SCHEME, $formatted_scheme)) {
+ return $formatted_scheme;
+ }
+
+ throw new SyntaxError(sprintf('The scheme `%s` is invalid.', $scheme));
+ }
+
+ /**
+ * Set the UserInfo component.
+ *
+ * @param ?string $user
+ * @param ?string $password
+ */
+ private function formatUserInfo(?string $user, ?string $password): ?string
+ {
+ if (null === $user) {
+ return $user;
+ }
+
+ static $user_pattern = '/(?:[^%'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/';
+ $user = preg_replace_callback($user_pattern, [Uri::class, 'urlEncodeMatch'], $user);
+ if (null === $password) {
+ return $user;
+ }
+
+ static $password_pattern = '/(?:[^%:'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/';
+
+ return $user.':'.preg_replace_callback($password_pattern, [Uri::class, 'urlEncodeMatch'], $password);
+ }
+
+ /**
+ * Returns the RFC3986 encoded string matched.
+ */
+ private static function urlEncodeMatch(array $matches): string
+ {
+ return rawurlencode($matches[0]);
+ }
+
+ /**
+ * Validate and Format the Host component.
+ *
+ * @param ?string $host
+ */
+ private function formatHost(?string $host): ?string
+ {
+ if (null === $host || '' === $host) {
+ return $host;
+ }
+
+ if ('[' !== $host[0]) {
+ return $this->formatRegisteredName($host);
+ }
+
+ return $this->formatIp($host);
+ }
+
+ /**
+ * Validate and format a registered name.
+ *
+ * The host is converted to its ascii representation if needed
+ *
+ * @throws IdnSupportMissing if the submitted host required missing or misconfigured IDN support
+ * @throws SyntaxError if the submitted host is not a valid registered name
+ */
+ private function formatRegisteredName(string $host): string
+ {
+ $formatted_host = rawurldecode($host);
+ if (1 === preg_match(self::REGEXP_HOST_REGNAME, $formatted_host)) {
+ return $formatted_host;
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, $formatted_host)) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : a registered name can not contain URI delimiters or spaces', $host));
+ }
+
+ $info = Idna::toAscii($host, Idna::IDNA2008_ASCII);
+ if (0 !== $info->errors()) {
+ throw IdnaConversionFailed::dueToIDNAError($host, $info);
+ }
+
+ return $info->result();
+ }
+
+ /**
+ * Validate and Format the IPv6/IPvfuture host.
+ *
+ * @throws SyntaxError if the submitted host is not a valid IP host
+ */
+ private function formatIp(string $host): string
+ {
+ $ip = substr($host, 1, -1);
+ if (false !== filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ return $host;
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_IPFUTURE, $ip, $matches) && !in_array($matches['version'], ['4', '6'], true)) {
+ return $host;
+ }
+
+ $pos = strpos($ip, '%');
+ if (false === $pos) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, rawurldecode(substr($ip, $pos)))) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ $ip = substr($ip, 0, $pos);
+ if (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ //Only the address block fe80::/10 can have a Zone ID attach to
+ //let's detect the link local significant 10 bits
+ if (0 === strpos((string) inet_pton($ip), self::HOST_ADDRESS_BLOCK)) {
+ return $host;
+ }
+
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ /**
+ * Format the Port component.
+ *
+ * @param null|mixed $port
+ *
+ * @throws SyntaxError
+ */
+ private function formatPort($port = null): ?int
+ {
+ if (null === $port || '' === $port) {
+ return null;
+ }
+
+ if (!is_int($port) && !(is_string($port) && 1 === preg_match('/^\d*$/', $port))) {
+ throw new SyntaxError(sprintf('The port `%s` is invalid', $port));
+ }
+
+ $port = (int) $port;
+ if (0 > $port) {
+ throw new SyntaxError(sprintf('The port `%s` is invalid', $port));
+ }
+
+ $defaultPort = self::SCHEME_DEFAULT_PORT[$this->scheme] ?? null;
+ if ($defaultPort === $port) {
+ return null;
+ }
+
+ return $port;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $components): self
+ {
+ $components['user'] = null;
+ $components['pass'] = null;
+ if (null !== $components['user_info']) {
+ [$components['user'], $components['pass']] = explode(':', $components['user_info'], 2) + [1 => null];
+ }
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a URI and a Base URI.
+ *
+ * The returned URI must be absolute.
+ *
+ * @param mixed $uri the input URI to create
+ * @param null|mixed $base_uri the base URI used for reference
+ */
+ public static function createFromBaseUri($uri, $base_uri = null): UriInterface
+ {
+ if (!$uri instanceof UriInterface) {
+ $uri = self::createFromString($uri);
+ }
+
+ if (null === $base_uri) {
+ if (null === $uri->getScheme()) {
+ throw new SyntaxError(sprintf('the URI `%s` must be absolute', (string) $uri));
+ }
+
+ if (null === $uri->getAuthority()) {
+ return $uri;
+ }
+
+ /** @var UriInterface $uri */
+ $uri = UriResolver::resolve($uri, $uri->withFragment(null)->withQuery(null)->withPath(''));
+
+ return $uri;
+ }
+
+ if (!$base_uri instanceof UriInterface) {
+ $base_uri = self::createFromString($base_uri);
+ }
+
+ if (null === $base_uri->getScheme()) {
+ throw new SyntaxError(sprintf('the base URI `%s` must be absolute', (string) $base_uri));
+ }
+
+ /** @var UriInterface $uri */
+ $uri = UriResolver::resolve($uri, $base_uri);
+
+ return $uri;
+ }
+
+ /**
+ * Create a new instance from a string.
+ *
+ * @param string|mixed $uri
+ */
+ public static function createFromString($uri = ''): self
+ {
+ $components = UriString::parse($uri);
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a hash of parse_url parts.
+ *
+ * Create an new instance from a hash representation of the URI similar
+ * to PHP parse_url function result
+ *
+ * @param array $components
+ */
+ public static function createFromComponents(array $components = []): self
+ {
+ $components += [
+ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null,
+ 'port' => null, 'path' => '', 'query' => null, 'fragment' => null,
+ ];
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a data file path.
+ *
+ * @param resource|null $context
+ *
+ * @throws FileinfoSupportMissing If ext/fileinfo is not installed
+ * @throws SyntaxError If the file does not exist or is not readable
+ */
+ public static function createFromDataPath(string $path, $context = null): self
+ {
+ static $finfo_support = null;
+ $finfo_support = $finfo_support ?? class_exists(\finfo::class);
+
+ // @codeCoverageIgnoreStart
+ if (!$finfo_support) {
+ throw new FileinfoSupportMissing(sprintf('Please install ext/fileinfo to use the %s() method.', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $file_args = [$path, false];
+ $mime_args = [$path, FILEINFO_MIME];
+ if (null !== $context) {
+ $file_args[] = $context;
+ $mime_args[] = $context;
+ }
+
+ $raw = @file_get_contents(...$file_args);
+ if (false === $raw) {
+ throw new SyntaxError(sprintf('The file `%s` does not exist or is not readable', $path));
+ }
+
+ $mimetype = (string) (new \finfo(FILEINFO_MIME))->file(...$mime_args);
+
+ return Uri::createFromComponents([
+ 'scheme' => 'data',
+ 'path' => str_replace(' ', '', $mimetype.';base64,'.base64_encode($raw)),
+ ]);
+ }
+
+ /**
+ * Create a new instance from a Unix path string.
+ */
+ public static function createFromUnixPath(string $uri = ''): self
+ {
+ $uri = implode('/', array_map('rawurlencode', explode('/', $uri)));
+ if ('/' !== ($uri[0] ?? '')) {
+ return Uri::createFromComponents(['path' => $uri]);
+ }
+
+ return Uri::createFromComponents(['path' => $uri, 'scheme' => 'file', 'host' => '']);
+ }
+
+ /**
+ * Create a new instance from a local Windows path string.
+ */
+ public static function createFromWindowsPath(string $uri = ''): self
+ {
+ $root = '';
+ if (1 === preg_match(self::REGEXP_WINDOW_PATH, $uri, $matches)) {
+ $root = substr($matches['root'], 0, -1).':';
+ $uri = substr($uri, strlen($root));
+ }
+ $uri = str_replace('\\', '/', $uri);
+ $uri = implode('/', array_map('rawurlencode', explode('/', $uri)));
+
+ //Local Windows absolute path
+ if ('' !== $root) {
+ return Uri::createFromComponents(['path' => '/'.$root.$uri, 'scheme' => 'file', 'host' => '']);
+ }
+
+ //UNC Windows Path
+ if ('//' !== substr($uri, 0, 2)) {
+ return Uri::createFromComponents(['path' => $uri]);
+ }
+
+ $parts = explode('/', substr($uri, 2), 2) + [1 => null];
+
+ return Uri::createFromComponents(['host' => $parts[0], 'path' => '/'.$parts[1], 'scheme' => 'file']);
+ }
+
+ /**
+ * Create a new instance from a URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri the input URI to create
+ */
+ public static function createFromUri($uri): self
+ {
+ if ($uri instanceof UriInterface) {
+ $user_info = $uri->getUserInfo();
+ $user = null;
+ $pass = null;
+ if (null !== $user_info) {
+ [$user, $pass] = explode(':', $user_info, 2) + [1 => null];
+ }
+
+ return new self(
+ $uri->getScheme(),
+ $user,
+ $pass,
+ $uri->getHost(),
+ $uri->getPort(),
+ $uri->getPath(),
+ $uri->getQuery(),
+ $uri->getFragment()
+ );
+ }
+
+ if (!$uri instanceof Psr7UriInterface) {
+ throw new \TypeError(sprintf('The object must implement the `%s` or the `%s`', Psr7UriInterface::class, UriInterface::class));
+ }
+
+ $scheme = $uri->getScheme();
+ if ('' === $scheme) {
+ $scheme = null;
+ }
+
+ $fragment = $uri->getFragment();
+ if ('' === $fragment) {
+ $fragment = null;
+ }
+
+ $query = $uri->getQuery();
+ if ('' === $query) {
+ $query = null;
+ }
+
+ $host = $uri->getHost();
+ if ('' === $host) {
+ $host = null;
+ }
+
+ $user_info = $uri->getUserInfo();
+ $user = null;
+ $pass = null;
+ if ('' !== $user_info) {
+ [$user, $pass] = explode(':', $user_info, 2) + [1 => null];
+ }
+
+ return new self(
+ $scheme,
+ $user,
+ $pass,
+ $host,
+ $uri->getPort(),
+ $uri->getPath(),
+ $query,
+ $fragment
+ );
+ }
+
+ /**
+ * Create a new instance from the environment.
+ */
+ public static function createFromServer(array $server): self
+ {
+ [$user, $pass] = self::fetchUserInfo($server);
+ [$host, $port] = self::fetchHostname($server);
+ [$path, $query] = self::fetchRequestUri($server);
+
+ return Uri::createFromComponents([
+ 'scheme' => self::fetchScheme($server),
+ 'user' => $user,
+ 'pass' => $pass,
+ 'host' => $host,
+ 'port' => $port,
+ 'path' => $path,
+ 'query' => $query,
+ ]);
+ }
+
+ /**
+ * Returns the environment scheme.
+ */
+ private static function fetchScheme(array $server): string
+ {
+ $server += ['HTTPS' => ''];
+ $res = filter_var($server['HTTPS'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
+
+ return false !== $res ? 'https' : 'http';
+ }
+
+ /**
+ * Returns the environment user info.
+ *
+ * @return array{0:?string, 1:?string}
+ */
+ private static function fetchUserInfo(array $server): array
+ {
+ $server += ['PHP_AUTH_USER' => null, 'PHP_AUTH_PW' => null, 'HTTP_AUTHORIZATION' => ''];
+ $user = $server['PHP_AUTH_USER'];
+ $pass = $server['PHP_AUTH_PW'];
+ if (0 === strpos(strtolower($server['HTTP_AUTHORIZATION']), 'basic')) {
+ $userinfo = base64_decode(substr($server['HTTP_AUTHORIZATION'], 6), true);
+ if (false === $userinfo) {
+ throw new SyntaxError('The user info could not be detected');
+ }
+ [$user, $pass] = explode(':', $userinfo, 2) + [1 => null];
+ }
+
+ if (null !== $user) {
+ $user = rawurlencode($user);
+ }
+
+ if (null !== $pass) {
+ $pass = rawurlencode($pass);
+ }
+
+ return [$user, $pass];
+ }
+
+ /**
+ * Returns the environment host.
+ *
+ * @throws SyntaxError If the host can not be detected
+ *
+ * @return array{0:?string, 1:?string}
+ */
+ private static function fetchHostname(array $server): array
+ {
+ $server += ['SERVER_PORT' => null];
+ if (null !== $server['SERVER_PORT']) {
+ $server['SERVER_PORT'] = (int) $server['SERVER_PORT'];
+ }
+
+ if (isset($server['HTTP_HOST']) && 1 === preg_match(self::REGEXP_HOST_PORT, $server['HTTP_HOST'], $matches)) {
+ return [
+ $matches['host'],
+ isset($matches['port']) ? (int) $matches['port'] : $server['SERVER_PORT'],
+ ];
+ }
+
+ if (!isset($server['SERVER_ADDR'])) {
+ throw new SyntaxError('The host could not be detected');
+ }
+
+ if (false === filter_var($server['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+ $server['SERVER_ADDR'] = '['.$server['SERVER_ADDR'].']';
+ }
+
+ return [$server['SERVER_ADDR'], $server['SERVER_PORT']];
+ }
+
+ /**
+ * Returns the environment path.
+ *
+ * @return array{0:?string, 1:?string}
+ */
+ private static function fetchRequestUri(array $server): array
+ {
+ $server += ['IIS_WasUrlRewritten' => null, 'UNENCODED_URL' => '', 'PHP_SELF' => '', 'QUERY_STRING' => null];
+ if ('1' === $server['IIS_WasUrlRewritten'] && '' !== $server['UNENCODED_URL']) {
+ /** @var array{0:?string, 1:?string} $retval */
+ $retval = explode('?', $server['UNENCODED_URL'], 2) + [1 => null];
+
+ return $retval;
+ }
+
+ if (isset($server['REQUEST_URI'])) {
+ [$path, ] = explode('?', $server['REQUEST_URI'], 2);
+ $query = ('' !== $server['QUERY_STRING']) ? $server['QUERY_STRING'] : null;
+
+ return [$path, $query];
+ }
+
+ return [$server['PHP_SELF'], $server['QUERY_STRING']];
+ }
+
+ /**
+ * Generate the URI authority part.
+ */
+ private function setAuthority(): ?string
+ {
+ $authority = null;
+ if (null !== $this->user_info) {
+ $authority = $this->user_info.'@';
+ }
+
+ if (null !== $this->host) {
+ $authority .= $this->host;
+ }
+
+ if (null !== $this->port) {
+ $authority .= ':'.$this->port;
+ }
+
+ return $authority;
+ }
+
+ /**
+ * Format the Path component.
+ */
+ private function formatPath(string $path): string
+ {
+ $path = $this->formatDataPath($path);
+
+ static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/}{]++|%(?![A-Fa-f0-9]{2}))/';
+
+ $path = (string) preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $path);
+
+ return $this->formatFilePath($path);
+ }
+
+ /**
+ * Filter the Path component.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ *
+ * @throws SyntaxError If the path is not compliant with RFC2397
+ */
+ private function formatDataPath(string $path): string
+ {
+ if ('data' !== $this->scheme) {
+ return $path;
+ }
+
+ if ('' == $path) {
+ return 'text/plain;charset=us-ascii,';
+ }
+
+ if (strlen($path) !== strspn($path, self::ASCII) || false === strpos($path, ',')) {
+ throw new SyntaxError(sprintf('The path `%s` is invalid according to RFC2937', $path));
+ }
+
+ $parts = explode(',', $path, 2) + [1 => null];
+ $mediatype = explode(';', (string) $parts[0], 2) + [1 => null];
+ $data = (string) $parts[1];
+ $mimetype = $mediatype[0];
+ if (null === $mimetype || '' === $mimetype) {
+ $mimetype = 'text/plain';
+ }
+
+ $parameters = $mediatype[1];
+ if (null === $parameters || '' === $parameters) {
+ $parameters = 'charset=us-ascii';
+ }
+
+ $this->assertValidPath($mimetype, $parameters, $data);
+
+ return $mimetype.';'.$parameters.','.$data;
+ }
+
+ /**
+ * Assert the path is a compliant with RFC2397.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ *
+ * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397
+ */
+ private function assertValidPath(string $mimetype, string $parameters, string $data): void
+ {
+ if (1 !== preg_match(self::REGEXP_MIMETYPE, $mimetype)) {
+ throw new SyntaxError(sprintf('The path mimetype `%s` is invalid', $mimetype));
+ }
+
+ $is_binary = 1 === preg_match(self::REGEXP_BINARY, $parameters, $matches);
+ if ($is_binary) {
+ $parameters = substr($parameters, 0, - strlen($matches[0]));
+ }
+
+ $res = array_filter(array_filter(explode(';', $parameters), [$this, 'validateParameter']));
+ if ([] !== $res) {
+ throw new SyntaxError(sprintf('The path paremeters `%s` is invalid', $parameters));
+ }
+
+ if (!$is_binary) {
+ return;
+ }
+
+ $res = base64_decode($data, true);
+ if (false === $res || $data !== base64_encode($res)) {
+ throw new SyntaxError(sprintf('The path data `%s` is invalid', $data));
+ }
+ }
+
+ /**
+ * Validate mediatype parameter.
+ */
+ private function validateParameter(string $parameter): bool
+ {
+ $properties = explode('=', $parameter);
+
+ return 2 != count($properties) || 'base64' === strtolower($properties[0]);
+ }
+
+ /**
+ * Format path component for file scheme.
+ */
+ private function formatFilePath(string $path): string
+ {
+ if ('file' !== $this->scheme) {
+ return $path;
+ }
+
+ $replace = static function (array $matches): string {
+ return $matches['delim'].$matches['volume'].':'.$matches['rest'];
+ };
+
+ return (string) preg_replace_callback(self::REGEXP_FILE_PATH, $replace, $path);
+ }
+
+ /**
+ * Format the Query or the Fragment component.
+ *
+ * Returns a array containing:
+ *
+ * - the formatted component (a string or null)
+ * - a boolean flag telling wether the delimiter is to be added to the component
+ * when building the URI string representation
+ *
+ *
+ * @param ?string $component
+ */
+ private function formatQueryAndFragment(?string $component): ?string
+ {
+ if (null === $component || '' === $component) {
+ return $component;
+ }
+
+ static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/';
+ return preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $component);
+ }
+
+ /**
+ * assert the URI internal state is valid.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3
+ * @link https://tools.ietf.org/html/rfc3986#section-3.3
+ *
+ * @throws SyntaxError if the URI is in an invalid state according to RFC3986
+ * @throws SyntaxError if the URI is in an invalid state according to scheme specific rules
+ */
+ private function assertValidState(): void
+ {
+ if (null !== $this->authority && ('' !== $this->path && '/' !== $this->path[0])) {
+ throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.');
+ }
+
+ if (null === $this->authority && 0 === strpos($this->path, '//')) {
+ throw new SyntaxError(sprintf('If there is no authority the path `%s` can not start with a `//`.', $this->path));
+ }
+
+ $pos = strpos($this->path, ':');
+ if (null === $this->authority
+ && null === $this->scheme
+ && false !== $pos
+ && false === strpos(substr($this->path, 0, $pos), '/')
+ ) {
+ throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.');
+ }
+
+ $validationMethod = self::SCHEME_VALIDATION_METHOD[$this->scheme] ?? null;
+ if (null === $validationMethod || true === $this->$validationMethod()) {
+ $this->uri = null;
+
+ return;
+ }
+
+ throw new SyntaxError(sprintf('The uri `%s` is invalid for the `%s` scheme.', (string) $this, $this->scheme));
+ }
+
+ /**
+ * URI validation for URI schemes which allows only scheme and path components.
+ */
+ private function isUriWithSchemeAndPathOnly(): bool
+ {
+ return null === $this->authority
+ && null === $this->query
+ && null === $this->fragment;
+ }
+
+ /**
+ * URI validation for URI schemes which allows only scheme, host and path components.
+ */
+ private function isUriWithSchemeHostAndPathOnly(): bool
+ {
+ return null === $this->user_info
+ && null === $this->port
+ && null === $this->query
+ && null === $this->fragment
+ && !('' != $this->scheme && null === $this->host);
+ }
+
+ /**
+ * URI validation for URI schemes which disallow the empty '' host.
+ */
+ private function isNonEmptyHostUri(): bool
+ {
+ return '' !== $this->host
+ && !(null !== $this->scheme && null === $this->host);
+ }
+
+ /**
+ * URI validation for URIs schemes which disallow the empty '' host
+ * and forbids the fragment component.
+ */
+ private function isNonEmptyHostUriWithoutFragment(): bool
+ {
+ return $this->isNonEmptyHostUri() && null === $this->fragment;
+ }
+
+ /**
+ * URI validation for URIs schemes which disallow the empty '' host
+ * and forbids fragment and query components.
+ */
+ private function isNonEmptyHostUriWithoutFragmentAndQuery(): bool
+ {
+ return $this->isNonEmptyHostUri() && null === $this->fragment && null === $this->query;
+ }
+
+ /**
+ * Generate the URI string representation from its components.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ *
+ * @param ?string $scheme
+ * @param ?string $authority
+ * @param ?string $query
+ * @param ?string $fragment
+ */
+ private function getUriString(
+ ?string $scheme,
+ ?string $authority,
+ string $path,
+ ?string $query,
+ ?string $fragment
+ ): string {
+ if (null !== $scheme) {
+ $scheme = $scheme.':';
+ }
+
+ if (null !== $authority) {
+ $authority = '//'.$authority;
+ }
+
+ if (null !== $query) {
+ $query = '?'.$query;
+ }
+
+ if (null !== $fragment) {
+ $fragment = '#'.$fragment;
+ }
+
+ return $scheme.$authority.$path.$query.$fragment;
+ }
+
+ public function toString(): string
+ {
+ $this->uri = $this->uri ?? $this->getUriString(
+ $this->scheme,
+ $this->authority,
+ $this->path,
+ $this->query,
+ $this->fragment
+ );
+
+ return $this->uri;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @return array{scheme:?string, user_info:?string, host:?string, port:?int, path:string, query:?string, fragment:?string}
+ */
+ public function __debugInfo(): array
+ {
+ return [
+ 'scheme' => $this->scheme,
+ 'user_info' => isset($this->user_info) ? preg_replace(',:(.*).?$,', ':***', $this->user_info) : null,
+ 'host' => $this->host,
+ 'port' => $this->port,
+ 'path' => $this->path,
+ 'query' => $this->query,
+ 'fragment' => $this->fragment,
+ ];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getScheme(): ?string
+ {
+ return $this->scheme;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAuthority(): ?string
+ {
+ return $this->authority;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getUserInfo(): ?string
+ {
+ return $this->user_info;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getHost(): ?string
+ {
+ return $this->host;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPort(): ?int
+ {
+ return $this->port;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPath(): string
+ {
+ return $this->path;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getQuery(): ?string
+ {
+ return $this->query;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getFragment(): ?string
+ {
+ return $this->fragment;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withScheme($scheme): UriInterface
+ {
+ $scheme = $this->formatScheme($this->filterString($scheme));
+ if ($scheme === $this->scheme) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->scheme = $scheme;
+ $clone->port = $clone->formatPort($clone->port);
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * Filter a string.
+ *
+ * @param mixed $str the value to evaluate as a string
+ *
+ * @throws SyntaxError if the submitted data can not be converted to string
+ */
+ private function filterString($str): ?string
+ {
+ if (null === $str) {
+ return $str;
+ }
+
+ if (is_object($str) && method_exists($str, '__toString')) {
+ $str = (string) $str;
+ }
+
+ if (!is_scalar($str)) {
+ throw new \TypeError(sprintf('The component must be a string, a scalar or a stringable object %s given.', gettype($str)));
+ }
+
+ $str = (string) $str;
+ if (1 !== preg_match(self::REGEXP_INVALID_CHARS, $str)) {
+ return $str;
+ }
+
+ throw new SyntaxError(sprintf('The component `%s` contains invalid characters.', $str));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withUserInfo($user, $password = null): UriInterface
+ {
+ $user_info = null;
+ $user = $this->filterString($user);
+ if (null !== $password) {
+ $password = $this->filterString($password);
+ }
+
+ if ('' !== $user) {
+ $user_info = $this->formatUserInfo($user, $password);
+ }
+
+ if ($user_info === $this->user_info) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->user_info = $user_info;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withHost($host): UriInterface
+ {
+ $host = $this->formatHost($this->filterString($host));
+ if ($host === $this->host) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->host = $host;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPort($port): UriInterface
+ {
+ $port = $this->formatPort($port);
+ if ($port === $this->port) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->port = $port;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPath($path): UriInterface
+ {
+ $path = $this->filterString($path);
+ if (null === $path) {
+ throw new \TypeError('A path must be a string NULL given.');
+ }
+
+ $path = $this->formatPath($path);
+ if ($path === $this->path) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->path = $path;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withQuery($query): UriInterface
+ {
+ $query = $this->formatQueryAndFragment($this->filterString($query));
+ if ($query === $this->query) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->query = $query;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withFragment($fragment): UriInterface
+ {
+ $fragment = $this->formatQueryAndFragment($this->filterString($fragment));
+ if ($fragment === $this->fragment) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->fragment = $fragment;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriInfo.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriInfo.php
new file mode 100644
index 00000000..5dd96e1a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriInfo.php
@@ -0,0 +1,205 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use function explode;
+use function implode;
+use function preg_replace_callback;
+use function rawurldecode;
+use function sprintf;
+
+final class UriInfo
+{
+ private const REGEXP_ENCODED_CHARS = ',%(2[D|E]|3[0-9]|4[1-9|A-F]|5[0-9|A|F]|6[1-9|A-F]|7[0-9|E]),i';
+
+ private const WHATWG_SPECIAL_SCHEMES = ['ftp', 'http', 'https', 'ws', 'wss'];
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private function __construct()
+ {
+ }
+
+ /**
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ private static function emptyComponentValue($uri): ?string
+ {
+ return $uri instanceof Psr7UriInterface ? '' : null;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * To be valid an URI MUST implement at least one of the following interface:
+ * - League\Uri\UriInterface
+ * - Psr\Http\Message\UriInterface
+ *
+ * @param mixed $uri the URI to validate
+ *
+ * @throws \TypeError if the URI object does not implements the supported interfaces.
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function filterUri($uri)
+ {
+ if ($uri instanceof Psr7UriInterface || $uri instanceof UriInterface) {
+ return $uri;
+ }
+
+ throw new \TypeError(sprintf('The uri must be a valid URI object received `%s`', is_object($uri) ? get_class($uri) : gettype($uri)));
+ }
+
+ /**
+ * Normalize an URI for comparison.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function normalize($uri)
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ $path = $uri->getPath();
+ if ('/' === ($path[0] ?? '') || '' !== $uri->getScheme().$uri->getAuthority()) {
+ $path = UriResolver::resolve($uri, $uri->withPath('')->withQuery($null))->getPath();
+ }
+
+ $query = $uri->getQuery();
+ $fragment = $uri->getFragment();
+ $fragmentOrig = $fragment;
+ $pairs = null === $query ? [] : explode('&', $query);
+ sort($pairs, SORT_REGULAR);
+
+ $replace = static function (array $matches): string {
+ return rawurldecode($matches[0]);
+ };
+
+ $retval = preg_replace_callback(self::REGEXP_ENCODED_CHARS, $replace, [$path, implode('&', $pairs), $fragment]);
+ if (null !== $retval) {
+ [$path, $query, $fragment] = $retval + ['', $null, $null];
+ }
+
+ if ($null !== $uri->getAuthority() && '' === $path) {
+ $path = '/';
+ }
+
+ return $uri
+ ->withHost(Uri::createFromComponents(['host' => $uri->getHost()])->getHost())
+ ->withPath($path)
+ ->withQuery([] === $pairs ? $null : $query)
+ ->withFragment($null === $fragmentOrig ? $fragmentOrig : $fragment);
+ }
+
+ /**
+ * Tell whether the URI represents an absolute URI.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isAbsolute($uri): bool
+ {
+ return self::emptyComponentValue($uri) !== self::filterUri($uri)->getScheme();
+ }
+
+ /**
+ * Tell whether the URI represents a network path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isNetworkPath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme() && $null !== $uri->getAuthority();
+ }
+
+ /**
+ * Tell whether the URI represents an absolute path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isAbsolutePath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme()
+ && $null === $uri->getAuthority()
+ && '/' === ($uri->getPath()[0] ?? '');
+ }
+
+ /**
+ * Tell whether the URI represents a relative path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isRelativePath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme()
+ && $null === $uri->getAuthority()
+ && '/' !== ($uri->getPath()[0] ?? '');
+ }
+
+ /**
+ * Tell whether both URI refers to the same document.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ public static function isSameDocument($uri, $base_uri): bool
+ {
+ $uri = self::normalize($uri);
+ $base_uri = self::normalize($base_uri);
+
+ return (string) $uri->withFragment($uri instanceof Psr7UriInterface ? '' : null)
+ === (string) $base_uri->withFragment($base_uri instanceof Psr7UriInterface ? '' : null);
+ }
+
+ /**
+ * Returns the URI origin property as defined by WHATWG URL living standard.
+ *
+ * {@see https://url.spec.whatwg.org/#origin}
+ *
+ * For URI without a special scheme the method returns null
+ * For URI with the file scheme the method will return null (as this is left to the implementation decision)
+ * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part)
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function getOrigin($uri): ?string
+ {
+ $scheme = self::filterUri($uri)->getScheme();
+ if ('blob' === $scheme) {
+ $uri = Uri::createFromString($uri->getPath());
+ $scheme = $uri->getScheme();
+ }
+
+ if (in_array($scheme, self::WHATWG_SPECIAL_SCHEMES, true)) {
+ $null = self::emptyComponentValue($uri);
+
+ return (string) $uri->withFragment($null)->withQuery($null)->withPath('')->withUserInfo($null, null);
+ }
+
+ return null;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriResolver.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriResolver.php
new file mode 100644
index 00000000..7c34dbef
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriResolver.php
@@ -0,0 +1,375 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use function array_pop;
+use function array_reduce;
+use function count;
+use function end;
+use function explode;
+use function gettype;
+use function implode;
+use function in_array;
+use function sprintf;
+use function str_repeat;
+use function strpos;
+use function substr;
+
+final class UriResolver
+{
+ /**
+ * @var array
+ */
+ const DOT_SEGMENTS = ['.' => 1, '..' => 1];
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private function __construct()
+ {
+ }
+
+ /**
+ * Resolve an URI against a base URI using RFC3986 rules.
+ *
+ * If the first argument is a UriInterface the method returns a UriInterface object
+ * If the first argument is a Psr7UriInterface the method returns a Psr7UriInterface object
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ public static function resolve($uri, $base_uri)
+ {
+ self::filterUri($uri);
+ self::filterUri($base_uri);
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+
+ if ($null !== $uri->getScheme()) {
+ return $uri
+ ->withPath(self::removeDotSegments($uri->getPath()));
+ }
+
+ if ($null !== $uri->getAuthority()) {
+ return $uri
+ ->withScheme($base_uri->getScheme())
+ ->withPath(self::removeDotSegments($uri->getPath()));
+ }
+
+ $user = $null;
+ $pass = null;
+ $userInfo = $base_uri->getUserInfo();
+ if (null !== $userInfo) {
+ [$user, $pass] = explode(':', $userInfo, 2) + [1 => null];
+ }
+
+ [$uri_path, $uri_query] = self::resolvePathAndQuery($uri, $base_uri);
+
+ return $uri
+ ->withPath(self::removeDotSegments($uri_path))
+ ->withQuery($uri_query)
+ ->withHost($base_uri->getHost())
+ ->withPort($base_uri->getPort())
+ ->withUserInfo((string) $user, $pass)
+ ->withScheme($base_uri->getScheme())
+ ;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * @param mixed $uri an URI object
+ *
+ * @throws \TypeError if the URI object does not implements the supported interfaces.
+ */
+ private static function filterUri($uri): void
+ {
+ if (!$uri instanceof UriInterface && !$uri instanceof Psr7UriInterface) {
+ throw new \TypeError(sprintf('The uri must be a valid URI object received `%s`', gettype($uri)));
+ }
+ }
+
+ /**
+ * Remove dot segments from the URI path.
+ */
+ private static function removeDotSegments(string $path): string
+ {
+ if (false === strpos($path, '.')) {
+ return $path;
+ }
+
+ $old_segments = explode('/', $path);
+ $new_path = implode('/', array_reduce($old_segments, [UriResolver::class, 'reducer'], []));
+ if (isset(self::DOT_SEGMENTS[end($old_segments)])) {
+ $new_path .= '/';
+ }
+
+ // @codeCoverageIgnoreStart
+ // added because some PSR-7 implementations do not respect RFC3986
+ if (0 === strpos($path, '/') && 0 !== strpos($new_path, '/')) {
+ return '/'.$new_path;
+ }
+ // @codeCoverageIgnoreEnd
+
+ return $new_path;
+ }
+
+ /**
+ * Remove dot segments.
+ *
+ * @return array
+ */
+ private static function reducer(array $carry, string $segment): array
+ {
+ if ('..' === $segment) {
+ array_pop($carry);
+
+ return $carry;
+ }
+
+ if (!isset(self::DOT_SEGMENTS[$segment])) {
+ $carry[] = $segment;
+ }
+
+ return $carry;
+ }
+
+ /**
+ * Resolve an URI path and query component.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return array{0:string, 1:string|null}
+ */
+ private static function resolvePathAndQuery($uri, $base_uri): array
+ {
+ $target_path = $uri->getPath();
+ $target_query = $uri->getQuery();
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+ $baseNull = $base_uri instanceof Psr7UriInterface ? '' : null;
+
+ if (0 === strpos($target_path, '/')) {
+ return [$target_path, $target_query];
+ }
+
+ if ('' === $target_path) {
+ if ($null === $target_query) {
+ $target_query = $base_uri->getQuery();
+ }
+
+ $target_path = $base_uri->getPath();
+ //@codeCoverageIgnoreStart
+ //because some PSR-7 Uri implementations allow this RFC3986 forbidden construction
+ if ($baseNull !== $base_uri->getAuthority() && 0 !== strpos($target_path, '/')) {
+ $target_path = '/'.$target_path;
+ }
+ //@codeCoverageIgnoreEnd
+
+ return [$target_path, $target_query];
+ }
+
+ $base_path = $base_uri->getPath();
+ if ($baseNull !== $base_uri->getAuthority() && '' === $base_path) {
+ $target_path = '/'.$target_path;
+ }
+
+ if ('' !== $base_path) {
+ $segments = explode('/', $base_path);
+ array_pop($segments);
+ if ([] !== $segments) {
+ $target_path = implode('/', $segments).'/'.$target_path;
+ }
+ }
+
+ return [$target_path, $target_query];
+ }
+
+ /**
+ * Relativize an URI according to a base URI.
+ *
+ * This method MUST retain the state of the submitted URI instance, and return
+ * an URI instance of the same type that contains the applied modifications.
+ *
+ * This method MUST be transparent when dealing with error and exceptions.
+ * It MUST not alter of silence them apart from validating its own parameters.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ public static function relativize($uri, $base_uri)
+ {
+ self::filterUri($uri);
+ self::filterUri($base_uri);
+ $uri = self::formatHost($uri);
+ $base_uri = self::formatHost($base_uri);
+ if (!self::isRelativizable($uri, $base_uri)) {
+ return $uri;
+ }
+
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+ $uri = $uri->withScheme($null)->withPort(null)->withUserInfo($null)->withHost($null);
+ $target_path = $uri->getPath();
+ if ($target_path !== $base_uri->getPath()) {
+ return $uri->withPath(self::relativizePath($target_path, $base_uri->getPath()));
+ }
+
+ if (self::componentEquals('getQuery', $uri, $base_uri)) {
+ return $uri->withPath('')->withQuery($null);
+ }
+
+ if ($null === $uri->getQuery()) {
+ return $uri->withPath(self::formatPathWithEmptyBaseQuery($target_path));
+ }
+
+ return $uri->withPath('');
+ }
+
+ /**
+ * Tells whether the component value from both URI object equals.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ private static function componentEquals(string $method, $uri, $base_uri): bool
+ {
+ return self::getComponent($method, $uri) === self::getComponent($method, $base_uri);
+ }
+
+ /**
+ * Returns the component value from the submitted URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ private static function getComponent(string $method, $uri): ?string
+ {
+ $component = $uri->$method();
+ if ($uri instanceof Psr7UriInterface && '' === $component) {
+ return null;
+ }
+
+ return $component;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * @param null|mixed $uri
+ *
+ * @throws \TypeError if the URI object does not implements the supported interfaces.
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function formatHost($uri)
+ {
+ if (!$uri instanceof Psr7UriInterface) {
+ return $uri;
+ }
+
+ $host = $uri->getHost();
+ if ('' === $host) {
+ return $uri;
+ }
+
+ return $uri->withHost((string) Uri::createFromComponents(['host' => $host])->getHost());
+ }
+
+ /**
+ * Tell whether the submitted URI object can be relativize.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ private static function isRelativizable($uri, $base_uri): bool
+ {
+ return !UriInfo::isRelativePath($uri)
+ && self::componentEquals('getScheme', $uri, $base_uri)
+ && self::componentEquals('getAuthority', $uri, $base_uri);
+ }
+
+ /**
+ * Relative the URI for a authority-less target URI.
+ */
+ private static function relativizePath(string $path, string $basepath): string
+ {
+ $base_segments = self::getSegments($basepath);
+ $target_segments = self::getSegments($path);
+ $target_basename = array_pop($target_segments);
+ array_pop($base_segments);
+ foreach ($base_segments as $offset => $segment) {
+ if (!isset($target_segments[$offset]) || $segment !== $target_segments[$offset]) {
+ break;
+ }
+ unset($base_segments[$offset], $target_segments[$offset]);
+ }
+ $target_segments[] = $target_basename;
+
+ return self::formatPath(
+ str_repeat('../', count($base_segments)).implode('/', $target_segments),
+ $basepath
+ );
+ }
+
+ /**
+ * returns the path segments.
+ *
+ * @return string[]
+ */
+ private static function getSegments(string $path): array
+ {
+ if ('' !== $path && '/' === $path[0]) {
+ $path = substr($path, 1);
+ }
+
+ return explode('/', $path);
+ }
+
+ /**
+ * Formatting the path to keep a valid URI.
+ */
+ private static function formatPath(string $path, string $basepath): string
+ {
+ if ('' === $path) {
+ return in_array($basepath, ['', '/'], true) ? $basepath : './';
+ }
+
+ if (false === ($colon_pos = strpos($path, ':'))) {
+ return $path;
+ }
+
+ $slash_pos = strpos($path, '/');
+ if (false === $slash_pos || $colon_pos < $slash_pos) {
+ return "./$path";
+ }
+
+ return $path;
+ }
+
+ /**
+ * Formatting the path to keep a resolvable URI.
+ */
+ private static function formatPathWithEmptyBaseQuery(string $path): string
+ {
+ $target_segments = self::getSegments($path);
+ /** @var string $basename */
+ $basename = end($target_segments);
+
+ return '' === $basename ? './' : $basename;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriString.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriString.php
new file mode 100644
index 00000000..5f865479
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriString.php
@@ -0,0 +1,466 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Idna\Idna;
+use function array_merge;
+use function explode;
+use function filter_var;
+use function gettype;
+use function inet_pton;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function preg_match;
+use function rawurldecode;
+use function sprintf;
+use function strpos;
+use function substr;
+use const FILTER_FLAG_IPV6;
+use const FILTER_VALIDATE_IP;
+
+/**
+ * A class to parse a URI string according to RFC3986.
+ *
+ * @link https://tools.ietf.org/html/rfc3986
+ * @package League\Uri
+ * @author Ignace Nyamagana Butera
+ * @since 6.0.0
+ */
+final class UriString
+{
+ /**
+ * Default URI component values.
+ */
+ private const URI_COMPONENTS = [
+ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null,
+ 'port' => null, 'path' => '', 'query' => null, 'fragment' => null,
+ ];
+
+ /**
+ * Simple URI which do not need any parsing.
+ */
+ private const URI_SCHORTCUTS = [
+ '' => [],
+ '#' => ['fragment' => ''],
+ '?' => ['query' => ''],
+ '?#' => ['query' => '', 'fragment' => ''],
+ '/' => ['path' => '/'],
+ '//' => ['host' => ''],
+ ];
+
+ /**
+ * Range of invalid characters in URI string.
+ */
+ private const REGEXP_INVALID_URI_CHARS = '/[\x00-\x1f\x7f]/';
+
+ /**
+ * RFC3986 regular expression URI splitter.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#appendix-B
+ */
+ private const REGEXP_URI_PARTS = ',^
+ (?(?[^:/?\#]+):)? # URI scheme component
+ (?//(?[^/?\#]*))? # URI authority part
+ (?[^?\#]*) # URI path component
+ (?\?(?[^\#]*))? # URI query component
+ (?\#(?.*))? # URI fragment component
+ ,x';
+
+ /**
+ * URI scheme regular expresssion.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ private const REGEXP_URI_SCHEME = '/^([a-z][a-z\d\+\.\-]*)?$/i';
+
+ /**
+ * IPvFuture regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_IP_FUTURE = '/^
+ v(?[A-F0-9])+\.
+ (?:
+ (?[a-z0-9_~\-\.])|
+ (?[!$&\'()*+,;=:]) # also include the : character
+ )+
+ $/ix';
+
+ /**
+ * General registered name regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_REGISTERED_NAME = '/(?(DEFINE)
+ (?[a-z0-9_~\-]) # . is missing as it is used to separate labels
+ (?[!$&\'()*+,;=])
+ (?%[A-F0-9]{2})
+ (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*)
+ )
+ ^(?:(?®_name)\.)*(?®_name)\.?$/ix';
+
+ /**
+ * Invalid characters in host regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_INVALID_HOST_CHARS = '/
+ [:\/?#\[\]@ ] # gen-delims characters as well as the space character
+ /ix';
+
+ /**
+ * Invalid path for URI without scheme and authority regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.3
+ */
+ private const REGEXP_INVALID_PATH = ',^(([^/]*):)(.*)?/,';
+
+ /**
+ * Host and Port splitter regular expression.
+ */
+ private const REGEXP_HOST_PORT = ',^(?\[.*\]|[^:]*)(:(?.*))?$,';
+
+ /**
+ * IDN Host detector regular expression.
+ */
+ private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/';
+
+ /**
+ * Only the address block fe80::/10 can have a Zone ID attach to
+ * let's detect the link local significant 10 bits.
+ */
+ private const ZONE_ID_ADDRESS_BLOCK = "\xfe\x80";
+
+ /**
+ * Generate an URI string representation from its parsed representation
+ * returned by League\Uri\parse() or PHP's parse_url.
+ *
+ * If you supply your own array, you are responsible for providing
+ * valid components without their URI delimiters.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ * @link https://tools.ietf.org/html/rfc3986#section-7.5
+ *
+ * @param array{
+ * scheme:?string,
+ * user:?string,
+ * pass:?string,
+ * host:?string,
+ * port:?int,
+ * path:string,
+ * query:?string,
+ * fragment:?string
+ * } $components
+ */
+ public static function build(array $components): string
+ {
+ $result = $components['path'] ?? '';
+ if (isset($components['query'])) {
+ $result .= '?'.$components['query'];
+ }
+
+ if (isset($components['fragment'])) {
+ $result .= '#'.$components['fragment'];
+ }
+
+ $scheme = null;
+ if (isset($components['scheme'])) {
+ $scheme = $components['scheme'].':';
+ }
+
+ if (!isset($components['host'])) {
+ return $scheme.$result;
+ }
+
+ $scheme .= '//';
+ $authority = $components['host'];
+ if (isset($components['port'])) {
+ $authority .= ':'.$components['port'];
+ }
+
+ if (!isset($components['user'])) {
+ return $scheme.$authority.$result;
+ }
+
+ $authority = '@'.$authority;
+ if (!isset($components['pass'])) {
+ return $scheme.$components['user'].$authority.$result;
+ }
+
+ return $scheme.$components['user'].':'.$components['pass'].$authority.$result;
+ }
+
+ /**
+ * Parse an URI string into its components.
+ *
+ * This method parses a URI and returns an associative array containing any
+ * of the various components of the URI that are present.
+ *
+ *
+ * $components = (new Parser())->parse('http://foo@test.example.com:42?query#');
+ * var_export($components);
+ * //will display
+ * array(
+ * 'scheme' => 'http', // the URI scheme component
+ * 'user' => 'foo', // the URI user component
+ * 'pass' => null, // the URI pass component
+ * 'host' => 'test.example.com', // the URI host component
+ * 'port' => 42, // the URI port component
+ * 'path' => '', // the URI path component
+ * 'query' => 'query', // the URI query component
+ * 'fragment' => '', // the URI fragment component
+ * );
+ *
+ *
+ * The returned array is similar to PHP's parse_url return value with the following
+ * differences:
+ *
+ *
+ * - All components are always present in the returned array
+ * - Empty and undefined component are treated differently. And empty component is
+ * set to the empty string while an undefined component is set to the `null` value.
+ * - The path component is never undefined
+ * - The method parses the URI following the RFC3986 rules but you are still
+ * required to validate the returned components against its related scheme specific rules.
+ *
+ *
+ * @link https://tools.ietf.org/html/rfc3986
+ *
+ * @param mixed $uri any scalar or stringable object
+ *
+ * @throws SyntaxError if the URI contains invalid characters
+ * @throws SyntaxError if the URI contains an invalid scheme
+ * @throws SyntaxError if the URI contains an invalid path
+ *
+ * @return array{
+ * scheme:?string,
+ * user:?string,
+ * pass:?string,
+ * host:?string,
+ * port:?int,
+ * path:string,
+ * query:?string,
+ * fragment:?string
+ * }
+ */
+ public static function parse($uri): array
+ {
+ if (is_object($uri) && method_exists($uri, '__toString')) {
+ $uri = (string) $uri;
+ }
+
+ if (!is_scalar($uri)) {
+ throw new \TypeError(sprintf('The uri must be a scalar or a stringable object `%s` given', gettype($uri)));
+ }
+
+ $uri = (string) $uri;
+
+ if (isset(self::URI_SCHORTCUTS[$uri])) {
+ /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */
+ $components = array_merge(self::URI_COMPONENTS, self::URI_SCHORTCUTS[$uri]);
+
+ return $components;
+ }
+
+ if (1 === preg_match(self::REGEXP_INVALID_URI_CHARS, $uri)) {
+ throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri));
+ }
+
+ //if the first character is a known URI delimiter parsing can be simplified
+ $first_char = $uri[0];
+
+ //The URI is made of the fragment only
+ if ('#' === $first_char) {
+ [, $fragment] = explode('#', $uri, 2);
+ $components = self::URI_COMPONENTS;
+ $components['fragment'] = $fragment;
+
+ return $components;
+ }
+
+ //The URI is made of the query and fragment
+ if ('?' === $first_char) {
+ [, $partial] = explode('?', $uri, 2);
+ [$query, $fragment] = explode('#', $partial, 2) + [1 => null];
+ $components = self::URI_COMPONENTS;
+ $components['query'] = $query;
+ $components['fragment'] = $fragment;
+
+ return $components;
+ }
+
+ //use RFC3986 URI regexp to split the URI
+ preg_match(self::REGEXP_URI_PARTS, $uri, $parts);
+ $parts += ['query' => '', 'fragment' => ''];
+
+ if (':' === $parts['scheme'] || 1 !== preg_match(self::REGEXP_URI_SCHEME, $parts['scontent'])) {
+ throw new SyntaxError(sprintf('The uri `%s` contains an invalid scheme', $uri));
+ }
+
+ if ('' === $parts['scheme'].$parts['authority'] && 1 === preg_match(self::REGEXP_INVALID_PATH, $parts['path'])) {
+ throw new SyntaxError(sprintf('The uri `%s` contains an invalid path.', $uri));
+ }
+
+ /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */
+ $components = array_merge(
+ self::URI_COMPONENTS,
+ '' === $parts['authority'] ? [] : self::parseAuthority($parts['acontent']),
+ [
+ 'path' => $parts['path'],
+ 'scheme' => '' === $parts['scheme'] ? null : $parts['scontent'],
+ 'query' => '' === $parts['query'] ? null : $parts['qcontent'],
+ 'fragment' => '' === $parts['fragment'] ? null : $parts['fcontent'],
+ ]
+ );
+
+ return $components;
+ }
+
+ /**
+ * Parses the URI authority part.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2
+ *
+ * @throws SyntaxError If the port component is invalid
+ *
+ * @return array{user:?string, pass:?string, host:?string, port:?int}
+ */
+ private static function parseAuthority(string $authority): array
+ {
+ $components = ['user' => null, 'pass' => null, 'host' => '', 'port' => null];
+ if ('' === $authority) {
+ return $components;
+ }
+
+ $parts = explode('@', $authority, 2);
+ if (isset($parts[1])) {
+ [$components['user'], $components['pass']] = explode(':', $parts[0], 2) + [1 => null];
+ }
+
+ preg_match(self::REGEXP_HOST_PORT, $parts[1] ?? $parts[0], $matches);
+ $matches += ['port' => ''];
+
+ $components['port'] = self::filterPort($matches['port']);
+ $components['host'] = self::filterHost($matches['host']);
+
+ return $components;
+ }
+
+ /**
+ * Filter and format the port component.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ */
+ private static function filterPort(string $port): ?int
+ {
+ if ('' === $port) {
+ return null;
+ }
+
+ if (1 === preg_match('/^\d*$/', $port)) {
+ return (int) $port;
+ }
+
+ throw new SyntaxError(sprintf('The port `%s` is invalid', $port));
+ }
+
+ /**
+ * Returns whether a hostname is valid.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ */
+ private static function filterHost(string $host): string
+ {
+ if ('' === $host) {
+ return $host;
+ }
+
+ if ('[' !== $host[0] || ']' !== substr($host, -1)) {
+ return self::filterRegisteredName($host);
+ }
+
+ if (!self::isIpHost(substr($host, 1, -1))) {
+ throw new SyntaxError(sprintf('Host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ return $host;
+ }
+
+ /**
+ * Returns whether the host is an IPv4 or a registered named.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ * @throws IdnSupportMissing if IDN support or ICU requirement are not available or met.
+ */
+ private static function filterRegisteredName(string $host): string
+ {
+ $formatted_host = rawurldecode($host);
+ if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formatted_host)) {
+ return $host;
+ }
+
+ //to test IDN host non-ascii characters must be present in the host
+ if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formatted_host)) {
+ throw new SyntaxError(sprintf('Host `%s` is invalid : the host is not a valid registered name', $host));
+ }
+
+ $info = Idna::toAscii($host, Idna::IDNA2008_ASCII);
+ if (0 !== $info->errors()) {
+ throw IdnaConversionFailed::dueToIDNAError($host, $info);
+ }
+
+ return $host;
+ }
+
+ /**
+ * Validates a IPv6/IPvfuture host.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @link https://tools.ietf.org/html/rfc6874#section-2
+ * @link https://tools.ietf.org/html/rfc6874#section-4
+ */
+ private static function isIpHost(string $ip_host): bool
+ {
+ if (false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ return true;
+ }
+
+ if (1 === preg_match(self::REGEXP_IP_FUTURE, $ip_host, $matches)) {
+ return !in_array($matches['version'], ['4', '6'], true);
+ }
+
+ $pos = strpos($ip_host, '%');
+ if (false === $pos || 1 === preg_match(
+ self::REGEXP_INVALID_HOST_CHARS,
+ rawurldecode(substr($ip_host, $pos))
+ )) {
+ return false;
+ }
+
+ $ip_host = substr($ip_host, 0, $pos);
+
+ return false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)
+ && 0 === strpos((string) inet_pton($ip_host), self::ZONE_ID_ADDRESS_BLOCK);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate.php
new file mode 100644
index 00000000..94bbef93
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate.php
@@ -0,0 +1,140 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriException;
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use League\Uri\UriTemplate\Template;
+use League\Uri\UriTemplate\VariableBag;
+
+/**
+ * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference.
+ *
+ * @link https://tools.ietf.org/html/rfc6570
+ * @package League\Uri
+ * @author Ignace Nyamagana Butera
+ * @since 6.1.0
+ *
+ * Based on GuzzleHttp\UriTemplate class in Guzzle v6.5.
+ * @link https://github.com/guzzle/guzzle/blob/6.5/src/UriTemplate.php
+ */
+final class UriTemplate
+{
+ /**
+ * @var Template
+ */
+ private $template;
+
+ /**
+ * @var VariableBag
+ */
+ private $defaultVariables;
+
+ /**
+ * @param object|string $template a string or an object with the __toString method
+ *
+ * @throws \TypeError if the template is not a string or an object with the __toString method
+ * @throws SyntaxError if the template syntax is invalid
+ * @throws TemplateCanNotBeExpanded if the template variables are invalid
+ */
+ public function __construct($template, array $defaultVariables = [])
+ {
+ $this->template = Template::createFromString($template);
+ $this->defaultVariables = $this->filterVariables($defaultVariables);
+ }
+
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['template']->toString(), $properties['defaultVariables']->all());
+ }
+
+ /**
+ * Filters out variables for the given template.
+ *
+ * @param array> $variables
+ */
+ private function filterVariables(array $variables): VariableBag
+ {
+ $output = new VariableBag();
+ foreach ($this->template->variableNames() as $name) {
+ if (isset($variables[$name])) {
+ $output->assign($name, $variables[$name]);
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * The template string.
+ */
+ public function getTemplate(): string
+ {
+ return $this->template->toString();
+ }
+
+ /**
+ * Returns the names of the variables in the template, in order.
+ *
+ * @return string[]
+ */
+ public function getVariableNames(): array
+ {
+ return $this->template->variableNames();
+ }
+
+ /**
+ * Returns the default values used to expand the template.
+ *
+ * The returned list only contains variables whose name is part of the current template.
+ *
+ * @return array
+ */
+ public function getDefaultVariables(): array
+ {
+ return $this->defaultVariables->all();
+ }
+
+ /**
+ * Returns a new instance with the updated default variables.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified default variables.
+ *
+ * If present, variables whose name is not part of the current template
+ * possible variable names are removed.
+ */
+ public function withDefaultVariables(array $defaultDefaultVariables): self
+ {
+ $clone = clone $this;
+ $clone->defaultVariables = $this->filterVariables($defaultDefaultVariables);
+
+ return $clone;
+ }
+
+ /**
+ * @throws TemplateCanNotBeExpanded if the variable contains nested array values
+ * @throws UriException if the resulting expansion can not be converted to a UriInterface instance
+ */
+ public function expand(array $variables = []): UriInterface
+ {
+ $uriString = $this->template->expand(
+ $this->filterVariables($variables)->replace($this->defaultVariables)
+ );
+
+ return Uri::createFromString($uriString);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Expression.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Expression.php
new file mode 100644
index 00000000..7a57b4a2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Expression.php
@@ -0,0 +1,353 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use function array_filter;
+use function array_keys;
+use function array_map;
+use function array_unique;
+use function explode;
+use function implode;
+use function preg_match;
+use function rawurlencode;
+use function str_replace;
+use function strpos;
+use function substr;
+
+final class Expression
+{
+ /**
+ * Expression regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.2
+ */
+ private const REGEXP_EXPRESSION = '/^\{
+ (?:
+ (?[\.\/;\?&\=,\!@\|\+#])?
+ (?[^\}]*)
+ )
+ \}$/x';
+
+ /**
+ * Reserved Operator characters.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.2
+ */
+ private const RESERVED_OPERATOR = '=,!@|';
+
+ /**
+ * Processing behavior according to the expression type operator.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#appendix-A
+ */
+ private const OPERATOR_HASH_LOOKUP = [
+ '' => ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '+' => ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],
+ '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],
+ '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],
+ ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],
+ '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],
+ '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true],
+ ];
+
+ /**
+ * @var string
+ */
+ private $operator;
+
+ /**
+ * @var string
+ */
+ private $joiner;
+
+ /**
+ * @var array
+ */
+ private $varSpecifiers;
+
+ /**
+ * @var array
+ */
+ private $variableNames;
+
+ /**
+ * @var string
+ */
+ private $expressionString;
+
+ private function __construct(string $operator, VarSpecifier ...$varSpecifiers)
+ {
+ $this->operator = $operator;
+ $this->varSpecifiers = $varSpecifiers;
+ $this->joiner = self::OPERATOR_HASH_LOOKUP[$operator]['joiner'];
+ $this->variableNames = $this->setVariableNames();
+ $this->expressionString = $this->setExpressionString();
+ }
+
+ /**
+ * @return array
+ */
+ private function setVariableNames(): array
+ {
+ $mapper = static function (VarSpecifier $varSpecifier): string {
+ return $varSpecifier->name();
+ };
+
+ return array_unique(array_map($mapper, $this->varSpecifiers));
+ }
+
+ private function setExpressionString(): string
+ {
+ $mapper = static function (VarSpecifier $variable): string {
+ return $variable->toString();
+ };
+
+ $varSpecifierString = implode(',', array_map($mapper, $this->varSpecifiers));
+
+ return '{'.$this->operator.$varSpecifierString.'}';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['operator'], ...$properties['varSpecifiers']);
+ }
+
+ /**
+ * @throws SyntaxError if the expression is invalid
+ * @throws SyntaxError if the operator used in the expression is invalid
+ * @throws SyntaxError if the variable specifiers is invalid
+ */
+ public static function createFromString(string $expression): self
+ {
+ if (1 !== preg_match(self::REGEXP_EXPRESSION, $expression, $parts)) {
+ throw new SyntaxError('The expression "'.$expression.'" is invalid.');
+ }
+
+ /** @var array{operator:string, variables:string} $parts */
+ $parts = $parts + ['operator' => ''];
+ if ('' !== $parts['operator'] && false !== strpos(self::RESERVED_OPERATOR, $parts['operator'])) {
+ throw new SyntaxError('The operator used in the expression "'.$expression.'" is reserved.');
+ }
+
+ $mapper = static function (string $varSpec): VarSpecifier {
+ return VarSpecifier::createFromString($varSpec);
+ };
+
+ return new Expression($parts['operator'], ...array_map($mapper, explode(',', $parts['variables'])));
+ }
+
+ /**
+ * Returns the expression string representation.
+ *
+ */
+ public function toString(): string
+ {
+ return $this->expressionString;
+ }
+
+ /**
+ * @return array
+ */
+ public function variableNames(): array
+ {
+ return $this->variableNames;
+ }
+
+ public function expand(VariableBag $variables): string
+ {
+ $parts = [];
+ foreach ($this->varSpecifiers as $varSpecifier) {
+ $parts[] = $this->replace($varSpecifier, $variables);
+ }
+
+ $nullFilter = static function ($value): bool {
+ return '' !== $value;
+ };
+
+ $expanded = implode($this->joiner, array_filter($parts, $nullFilter));
+ if ('' === $expanded) {
+ return $expanded;
+ }
+
+ $prefix = self::OPERATOR_HASH_LOOKUP[$this->operator]['prefix'];
+ if ('' === $prefix) {
+ return $expanded;
+ }
+
+ return $prefix.$expanded;
+ }
+
+ /**
+ * Replaces an expression with the given variables.
+ *
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ * @throws TemplateCanNotBeExpanded if the variables contains nested array values
+ */
+ private function replace(VarSpecifier $varSpec, VariableBag $variables): string
+ {
+ $value = $variables->fetch($varSpec->name());
+ if (null === $value) {
+ return '';
+ }
+
+ $useQuery = self::OPERATOR_HASH_LOOKUP[$this->operator]['query'];
+ [$expanded, $actualQuery] = $this->inject($value, $varSpec, $useQuery);
+ if (!$actualQuery) {
+ return $expanded;
+ }
+
+ if ('&' !== $this->joiner && '' === $expanded) {
+ return $varSpec->name();
+ }
+
+ return $varSpec->name().'='.$expanded;
+ }
+
+ /**
+ * @param string|array $value
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function inject($value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if (is_string($value)) {
+ return $this->replaceString($value, $varSpec, $useQuery);
+ }
+
+ return $this->replaceList($value, $varSpec, $useQuery);
+ }
+
+ /**
+ * Expands an expression using a string value.
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function replaceString(string $value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if (':' === $varSpec->modifier()) {
+ $value = substr($value, 0, $varSpec->position());
+ }
+
+ $expanded = rawurlencode($value);
+ if ('+' === $this->operator || '#' === $this->operator) {
+ return [$this->decodeReserved($expanded), $useQuery];
+ }
+
+ return [$expanded, $useQuery];
+ }
+
+ /**
+ * Expands an expression using a list of values.
+ *
+ * @param array $value
+ *
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function replaceList(array $value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if ([] === $value) {
+ return ['', false];
+ }
+
+ if (':' === $varSpec->modifier()) {
+ throw TemplateCanNotBeExpanded::dueToUnableToProcessValueListWithPrefix($varSpec->name());
+ }
+
+ $pairs = [];
+ $isAssoc = $this->isAssoc($value);
+ foreach ($value as $key => $var) {
+ if ($isAssoc) {
+ $key = rawurlencode((string) $key);
+ }
+
+ $var = rawurlencode($var);
+ if ('+' === $this->operator || '#' === $this->operator) {
+ $var = $this->decodeReserved($var);
+ }
+
+ if ('*' === $varSpec->modifier()) {
+ if ($isAssoc) {
+ $var = $key.'='.$var;
+ } elseif ($key > 0 && $useQuery) {
+ $var = $varSpec->name().'='.$var;
+ }
+ }
+
+ $pairs[$key] = $var;
+ }
+
+ if ('*' === $varSpec->modifier()) {
+ if ($isAssoc) {
+ // Don't prepend the value name when using the explode
+ // modifier with an associative array.
+ $useQuery = false;
+ }
+
+ return [implode($this->joiner, $pairs), $useQuery];
+ }
+
+ if ($isAssoc) {
+ // When an associative array is encountered and the
+ // explode modifier is not set, then the result must be
+ // a comma separated list of keys followed by their
+ // respective values.
+ foreach ($pairs as $offset => &$data) {
+ $data = $offset.','.$data;
+ }
+
+ unset($data);
+ }
+
+ return [implode(',', $pairs), $useQuery];
+ }
+
+ /**
+ * Determines if an array is associative.
+ *
+ * This makes the assumption that input arrays are sequences or hashes.
+ * This assumption is a trade-off for accuracy in favor of speed, but it
+ * should work in almost every case where input is supplied for a URI
+ * template.
+ */
+ private function isAssoc(array $array): bool
+ {
+ return [] !== $array && 0 !== array_keys($array)[0];
+ }
+
+ /**
+ * Removes percent encoding on reserved characters (used with + and # modifiers).
+ */
+ private function decodeReserved(string $str): string
+ {
+ static $delimiters = [
+ ':', '/', '?', '#', '[', ']', '@', '!', '$',
+ '&', '\'', '(', ')', '*', '+', ',', ';', '=',
+ ];
+
+ static $delimitersEncoded = [
+ '%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24',
+ '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D',
+ ];
+
+ return str_replace($delimitersEncoded, $delimiters, $str);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Template.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Template.php
new file mode 100644
index 00000000..e17b3c94
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/Template.php
@@ -0,0 +1,134 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use function array_merge;
+use function array_unique;
+use function gettype;
+use function is_object;
+use function is_string;
+use function method_exists;
+use function preg_match_all;
+use function preg_replace;
+use function sprintf;
+use function strpos;
+use const PREG_SET_ORDER;
+
+final class Template
+{
+ /**
+ * Expression regular expression pattern.
+ */
+ private const REGEXP_EXPRESSION_DETECTOR = '/\{[^\}]*\}/x';
+
+ /**
+ * @var string
+ */
+ private $template;
+
+ /**
+ * @var array
+ */
+ private $expressions = [];
+
+ /**
+ * @var array
+ */
+ private $variableNames;
+
+ private function __construct(string $template, Expression ...$expressions)
+ {
+ $this->template = $template;
+ $variableNames = [];
+ foreach ($expressions as $expression) {
+ $this->expressions[$expression->toString()] = $expression;
+ $variableNames[] = $expression->variableNames();
+ }
+ $this->variableNames = array_unique(array_merge([], ...$variableNames));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['template'], ...array_values($properties['expressions']));
+ }
+
+ /**
+ * @param object|string $template a string or an object with the __toString method
+ *
+ * @throws \TypeError if the template is not a string or an object with the __toString method
+ * @throws SyntaxError if the template contains invalid expressions
+ * @throws SyntaxError if the template contains invalid variable specification
+ */
+ public static function createFromString($template): self
+ {
+ if (is_object($template) && method_exists($template, '__toString')) {
+ $template = (string) $template;
+ }
+
+ if (!is_string($template)) {
+ throw new \TypeError(sprintf('The template must be a string or a stringable object %s given.', gettype($template)));
+ }
+
+ /** @var string $remainder */
+ $remainder = preg_replace(self::REGEXP_EXPRESSION_DETECTOR, '', $template);
+ if (false !== strpos($remainder, '{') || false !== strpos($remainder, '}')) {
+ throw new SyntaxError('The template "'.$template.'" contains invalid expressions.');
+ }
+
+ $names = [];
+ preg_match_all(self::REGEXP_EXPRESSION_DETECTOR, $template, $findings, PREG_SET_ORDER);
+ $arguments = [];
+ foreach ($findings as $finding) {
+ if (!isset($names[$finding[0]])) {
+ $arguments[] = Expression::createFromString($finding[0]);
+ $names[$finding[0]] = 1;
+ }
+ }
+
+ return new self($template, ...$arguments);
+ }
+
+ public function toString(): string
+ {
+ return $this->template;
+ }
+
+ /**
+ * @return array
+ */
+ public function variableNames(): array
+ {
+ return $this->variableNames;
+ }
+
+ /**
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ * @throws TemplateCanNotBeExpanded if the variables contains nested array values
+ */
+ public function expand(VariableBag $variables): string
+ {
+ $uriString = $this->template;
+ /** @var Expression $expression */
+ foreach ($this->expressions as $pattern => $expression) {
+ $uriString = str_replace($pattern, $expression->expand($variables), $uriString);
+ }
+
+ return $uriString;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VarSpecifier.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VarSpecifier.php
new file mode 100644
index 00000000..e66de073
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VarSpecifier.php
@@ -0,0 +1,107 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use function preg_match;
+
+final class VarSpecifier
+{
+ /**
+ * Variables specification regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.3
+ */
+ private const REGEXP_VARSPEC = '/^
+ (?(?:[A-z0-9_\.]|%[0-9a-fA-F]{2})+)
+ (?\:(?\d+)|\*)?
+ $/x';
+
+ /**
+ * @var string
+ */
+ private $name;
+
+ /**
+ * @var string
+ */
+ private $modifier;
+
+ /**
+ * @var int
+ */
+ private $position;
+
+ private function __construct(string $name, string $modifier, int $position)
+ {
+ $this->name = $name;
+ $this->modifier = $modifier;
+ $this->position = $position;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['name'], $properties['modifier'], $properties['position']);
+ }
+
+ public static function createFromString(string $specification): self
+ {
+ if (1 !== preg_match(self::REGEXP_VARSPEC, $specification, $parsed)) {
+ throw new SyntaxError('The variable specification "'.$specification.'" is invalid.');
+ }
+
+ $parsed += ['modifier' => '', 'position' => ''];
+ if ('' !== $parsed['position']) {
+ $parsed['position'] = (int) $parsed['position'];
+ $parsed['modifier'] = ':';
+ }
+
+ if ('' === $parsed['position']) {
+ $parsed['position'] = 0;
+ }
+
+ if (10000 <= $parsed['position']) {
+ throw new SyntaxError('The variable specification "'.$specification.'" is invalid the position modifier must be lower than 10000.');
+ }
+
+ return new self($parsed['name'], $parsed['modifier'], $parsed['position']);
+ }
+
+ public function toString(): string
+ {
+ if (0 < $this->position) {
+ return $this->name.$this->modifier.$this->position;
+ }
+
+ return $this->name.$this->modifier;
+ }
+
+ public function name(): string
+ {
+ return $this->name;
+ }
+
+ public function modifier(): string
+ {
+ return $this->modifier;
+ }
+
+ public function position(): int
+ {
+ return $this->position;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VariableBag.php b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VariableBag.php
new file mode 100644
index 00000000..cd4b0972
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/src/UriTemplate/VariableBag.php
@@ -0,0 +1,116 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use function gettype;
+use function is_array;
+use function is_bool;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function sprintf;
+
+final class VariableBag
+{
+ /**
+ * @var array>
+ */
+ private $variables = [];
+
+ /**
+ * @param iterable $variables
+ */
+ public function __construct(iterable $variables = [])
+ {
+ foreach ($variables as $name => $value) {
+ $this->assign($name, $value);
+ }
+ }
+
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['variables']);
+ }
+
+ /**
+ * @return array>
+ */
+ public function all(): array
+ {
+ return $this->variables;
+ }
+
+ /**
+ * Fetches the variable value if none found returns null.
+ *
+ * @return null|string|array
+ */
+ public function fetch(string $name)
+ {
+ return $this->variables[$name] ?? null;
+ }
+
+ /**
+ * @param string|array $value
+ */
+ public function assign(string $name, $value): void
+ {
+ $this->variables[$name] = $this->normalizeValue($value, $name, true);
+ }
+
+ /**
+ * @param mixed $value the value to be expanded
+ *
+ * @throws TemplateCanNotBeExpanded if the value contains nested list
+ *
+ * @return string|array
+ */
+ private function normalizeValue($value, string $name, bool $isNestedListAllowed)
+ {
+ if (is_bool($value)) {
+ return true === $value ? '1' : '0';
+ }
+
+ if (null === $value || is_scalar($value) || (is_object($value) && method_exists($value, '__toString'))) {
+ return (string) $value;
+ }
+
+ if (!is_array($value)) {
+ throw new \TypeError(sprintf('The variable '.$name.' must be NULL, a scalar or a stringable object `%s` given', gettype($value)));
+ }
+
+ if (!$isNestedListAllowed) {
+ throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name);
+ }
+
+ foreach ($value as &$var) {
+ $var = self::normalizeValue($var, $name, false);
+ }
+ unset($var);
+
+ return $value;
+ }
+
+ /**
+ * Replaces elements from passed variables into the current instance.
+ */
+ public function replace(VariableBag $variables): self
+ {
+ $instance = clone $this;
+ $instance->variables += $variables->variables;
+
+ return $instance;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/hello-world.txt b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/hello-world.txt
new file mode 100644
index 00000000..2fb8406f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/hello-world.txt
@@ -0,0 +1 @@
+Bonjour le monde!
\ No newline at end of file
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/john-doe.vcf b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/john-doe.vcf
new file mode 100644
index 00000000..1116636e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/john-doe.vcf
@@ -0,0 +1,25 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Doe;John;;;
+FN:John Doe
+ORG:Example.com Inc.;
+TITLE:Imaginary test person
+EMAIL;type=INTERNET;type=WORK;type=pref:johnDoe@example.org
+TEL;type=WORK;type=pref:+1 617 555 1212
+TEL;type=WORK:+1 (617) 555-1234
+TEL;type=CELL:+1 781 555 1212
+TEL;type=HOME:+1 202 555 1212
+item1.ADR;type=WORK:;;2 Enterprise Avenue;Worktown;NY;01111;USA
+item1.X-ABADR:us
+item2.ADR;type=HOME;type=pref:;;3 Acacia Avenue;Hoemtown;MA;02222;USA
+item2.X-ABADR:us
+NOTE:John Doe has a long and varied history\, being documented on more police files that anyone else. Reports of his death are alas numerous.
+item3.URL;type=pref:http\://www.example/com/doe
+item3.X-ABLabel:_$!!$_
+item4.URL:http\://www.example.com/Joe/foaf.df
+item4.X-ABLabel:FOAF
+item5.X-ABRELATEDNAMES;type=pref:Jane Doe
+item5.X-ABLabel:_$!!$_
+CATEGORIES:Work,Test group
+X-ABUID:5AD380FD-B2DE-4261-BA99-DE1D1DB52FBE\:ABPerson
+END:VCARD
diff --git a/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/red-nose.gif b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/red-nose.gif
new file mode 100644
index 00000000..283fdd3e
Binary files /dev/null and b/wp-content/plugins/wp-webauthn/vendor/league/uri/test_files/red-nose.gif differ
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/.github/FUNDING.yml b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/.github/FUNDING.yml
new file mode 100644
index 00000000..11255a01
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+github: [nyholm, Zegnat]
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/CHANGELOG.md
new file mode 100644
index 00000000..2e98d6ff
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/CHANGELOG.md
@@ -0,0 +1,54 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 0.4.2
+
+### Fixed
+
+- Support for numerical headers
+
+## 0.4.1
+
+### Fixed
+
+- Support for ´HTTP_X_FORWARDED_PROTO´
+
+## 0.4.0
+
+### Fixed
+
+- Support for Host-header with port-number
+
+## 0.3.0
+
+### Added
+
+- `ServerRequestCreator` is final
+
+### Fixed
+
+- Fallback to an empty Stream if UploadedFileFactory fails.
+
+## 0.2.0
+
+### Changed
+
+- Make sure we use psr/http-factory
+
+## 0.1.2
+
+### Added
+
+- `ServerRequestCreatorInterface`
+- `ServerRequestCreator::getHeadersFromServer`
+
+## 0.1.1
+
+### Added
+
+Better testing
+
+## 0.1.0
+
+First release
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/LICENSE b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/LICENSE
new file mode 100644
index 00000000..d91e7536
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/README.md b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/README.md
new file mode 100644
index 00000000..b3f5cb3a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/README.md
@@ -0,0 +1,38 @@
+# Helper class to create PSR-7 server request
+
+[![Latest Version](https://img.shields.io/github/release/Nyholm/psr7-server.svg?style=flat-square)](https://github.com/Nyholm/psr7-server/releases)
+[![Build Status](https://img.shields.io/travis/Nyholm/psr7-server/master.svg?style=flat-square)](https://travis-ci.org/Nyholm/psr7-server)
+[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/Nyholm/psr7-server.svg?style=flat-square)](https://scrutinizer-ci.com/g/Nyholm/psr7-server)
+[![Quality Score](https://img.shields.io/scrutinizer/g/Nyholm/psr7-server.svg?style=flat-square)](https://scrutinizer-ci.com/g/Nyholm/psr7-server)
+[![Total Downloads](https://poser.pugx.org/nyholm/psr7-server/downloads)](https://packagist.org/packages/nyholm/psr7-server)
+[![Monthly Downloads](https://poser.pugx.org/nyholm/psr7-server/d/monthly.png)](https://packagist.org/packages/nyholm/psr7-server)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+A helper class that can create ANY PSR-7 server request.
+
+## Installation
+
+```bash
+composer require nyholm/psr7-server
+```
+
+## Usage
+
+```php
+// Instanciate ANY PSR-17 factory implementations. Here is nyholm/psr7 as an example
+$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
+
+$creator = new \Nyholm\Psr7Server\ServerRequestCreator(
+ $psr17Factory, // ServerRequestFactory
+ $psr17Factory, // UriFactory
+ $psr17Factory, // UploadedFileFactory
+ $psr17Factory // StreamFactory
+);
+
+$serverRequest = $creator->fromGlobals();
+```
+
+## Other packages
+
+* [nyholm/psr7](https://github.com/Nyholm/psr7) - A super fast PSR-7 implementation.
+* [zendframework/zend-httphandlerrunner](https://github.com/zendframework/zend-httphandlerrunner) - To send/emit PSR-7 responses
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/composer.json b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/composer.json
new file mode 100644
index 00000000..732406da
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/composer.json
@@ -0,0 +1,41 @@
+{
+ "name": "nyholm/psr7-server",
+ "description": "Helper classes to handle PSR-7 server requests",
+ "license": "MIT",
+ "keywords": ["psr-7", "psr-17"],
+ "homepage": "http://tnyholm.se",
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "require": {
+ "php": "^7.1",
+ "psr/http-message": "^1.0",
+ "psr/http-factory": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0",
+ "nyholm/psr7": "^1.3",
+ "nyholm/nsa": "^1.1"
+ },
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7Server\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\Nyholm\\Psr7Server\\": "tests/"
+ }
+ },
+ "scripts": {
+ "test": "vendor/bin/phpunit",
+ "test-ci": "vendor/bin/phpunit --coverage-text --coverage-clover=build/coverage.xml"
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreator.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreator.php
new file mode 100644
index 00000000..efecc689
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreator.php
@@ -0,0 +1,282 @@
+
+ * @author Martijn van der Ven
+ */
+final class ServerRequestCreator implements ServerRequestCreatorInterface
+{
+ private $serverRequestFactory;
+
+ private $uriFactory;
+
+ private $uploadedFileFactory;
+
+ private $streamFactory;
+
+ public function __construct(
+ ServerRequestFactoryInterface $serverRequestFactory,
+ UriFactoryInterface $uriFactory,
+ UploadedFileFactoryInterface $uploadedFileFactory,
+ StreamFactoryInterface $streamFactory
+ ) {
+ $this->serverRequestFactory = $serverRequestFactory;
+ $this->uriFactory = $uriFactory;
+ $this->uploadedFileFactory = $uploadedFileFactory;
+ $this->streamFactory = $streamFactory;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fromGlobals(): ServerRequestInterface
+ {
+ $server = $_SERVER;
+ if (false === isset($server['REQUEST_METHOD'])) {
+ $server['REQUEST_METHOD'] = 'GET';
+ }
+
+ $headers = \function_exists('getallheaders') ? getallheaders() : static::getHeadersFromServer($_SERVER);
+
+ return $this->fromArrays($server, $headers, $_COOKIE, $_GET, $_POST, $_FILES, \fopen('php://input', 'r') ?: null);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fromArrays(array $server, array $headers = [], array $cookie = [], array $get = [], array $post = [], array $files = [], $body = null): ServerRequestInterface
+ {
+ $method = $this->getMethodFromEnv($server);
+ $uri = $this->getUriFromEnvWithHTTP($server);
+ $protocol = isset($server['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $server['SERVER_PROTOCOL']) : '1.1';
+
+ $serverRequest = $this->serverRequestFactory->createServerRequest($method, $uri, $server);
+ foreach ($headers as $name => $value) {
+ // Because PHP automatically casts array keys set with numeric strings to integers, we have to make sure
+ // that numeric headers will not be sent along as integers, as withAddedHeader can only accept strings.
+ if (\is_int($name)) {
+ $name = (string) $name;
+ }
+ $serverRequest = $serverRequest->withAddedHeader($name, $value);
+ }
+
+ $serverRequest = $serverRequest
+ ->withProtocolVersion($protocol)
+ ->withCookieParams($cookie)
+ ->withQueryParams($get)
+ ->withParsedBody($post)
+ ->withUploadedFiles($this->normalizeFiles($files));
+
+ if (null === $body) {
+ return $serverRequest;
+ }
+
+ if (\is_resource($body)) {
+ $body = $this->streamFactory->createStreamFromResource($body);
+ } elseif (\is_string($body)) {
+ $body = $this->streamFactory->createStream($body);
+ } elseif (!$body instanceof StreamInterface) {
+ throw new \InvalidArgumentException('The $body parameter to ServerRequestCreator::fromArrays must be string, resource or StreamInterface');
+ }
+
+ return $serverRequest->withBody($body);
+ }
+
+ /**
+ * Implementation from Zend\Diactoros\marshalHeadersFromSapi().
+ */
+ public static function getHeadersFromServer(array $server): array
+ {
+ $headers = [];
+ foreach ($server as $key => $value) {
+ // Apache prefixes environment variables with REDIRECT_
+ // if they are added by rewrite rules
+ if (0 === \strpos($key, 'REDIRECT_')) {
+ $key = \substr($key, 9);
+
+ // We will not overwrite existing variables with the
+ // prefixed versions, though
+ if (\array_key_exists($key, $server)) {
+ continue;
+ }
+ }
+
+ if ($value && 0 === \strpos($key, 'HTTP_')) {
+ $name = \strtr(\strtolower(\substr($key, 5)), '_', '-');
+ $headers[$name] = $value;
+
+ continue;
+ }
+
+ if ($value && 0 === \strpos($key, 'CONTENT_')) {
+ $name = 'content-'.\strtolower(\substr($key, 8));
+ $headers[$name] = $value;
+
+ continue;
+ }
+ }
+
+ return $headers;
+ }
+
+ private function getMethodFromEnv(array $environment): string
+ {
+ if (false === isset($environment['REQUEST_METHOD'])) {
+ throw new \InvalidArgumentException('Cannot determine HTTP method');
+ }
+
+ return $environment['REQUEST_METHOD'];
+ }
+
+ private function getUriFromEnvWithHTTP(array $environment): UriInterface
+ {
+ $uri = $this->createUriFromArray($environment);
+ if (empty($uri->getScheme())) {
+ $uri = $uri->withScheme('http');
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Return an UploadedFile instance array.
+ *
+ * @param array $files A array which respect $_FILES structure
+ *
+ * @return UploadedFileInterface[]
+ *
+ * @throws \InvalidArgumentException for unrecognized values
+ */
+ private function normalizeFiles(array $files): array
+ {
+ $normalized = [];
+
+ foreach ($files as $key => $value) {
+ if ($value instanceof UploadedFileInterface) {
+ $normalized[$key] = $value;
+ } elseif (\is_array($value) && isset($value['tmp_name'])) {
+ $normalized[$key] = $this->createUploadedFileFromSpec($value);
+ } elseif (\is_array($value)) {
+ $normalized[$key] = $this->normalizeFiles($value);
+ } else {
+ throw new \InvalidArgumentException('Invalid value in files specification');
+ }
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Create and return an UploadedFile instance from a $_FILES specification.
+ *
+ * If the specification represents an array of values, this method will
+ * delegate to normalizeNestedFileSpec() and return that return value.
+ *
+ * @param array $value $_FILES struct
+ *
+ * @return array|UploadedFileInterface
+ */
+ private function createUploadedFileFromSpec(array $value)
+ {
+ if (\is_array($value['tmp_name'])) {
+ return $this->normalizeNestedFileSpec($value);
+ }
+
+ try {
+ $stream = $this->streamFactory->createStreamFromFile($value['tmp_name']);
+ } catch (\RuntimeException $e) {
+ $stream = $this->streamFactory->createStream();
+ }
+
+ return $this->uploadedFileFactory->createUploadedFile(
+ $stream,
+ (int) $value['size'],
+ (int) $value['error'],
+ $value['name'],
+ $value['type']
+ );
+ }
+
+ /**
+ * Normalize an array of file specifications.
+ *
+ * Loops through all nested files and returns a normalized array of
+ * UploadedFileInterface instances.
+ *
+ * @return UploadedFileInterface[]
+ */
+ private function normalizeNestedFileSpec(array $files = []): array
+ {
+ $normalizedFiles = [];
+
+ foreach (\array_keys($files['tmp_name']) as $key) {
+ $spec = [
+ 'tmp_name' => $files['tmp_name'][$key],
+ 'size' => $files['size'][$key],
+ 'error' => $files['error'][$key],
+ 'name' => $files['name'][$key],
+ 'type' => $files['type'][$key],
+ ];
+ $normalizedFiles[$key] = $this->createUploadedFileFromSpec($spec);
+ }
+
+ return $normalizedFiles;
+ }
+
+ /**
+ * Create a new uri from server variable.
+ *
+ * @param array $server typically $_SERVER or similar structure
+ */
+ private function createUriFromArray(array $server): UriInterface
+ {
+ $uri = $this->uriFactory->createUri('');
+
+ if (isset($server['HTTP_X_FORWARDED_PROTO'])) {
+ $uri = $uri->withScheme($server['HTTP_X_FORWARDED_PROTO']);
+ } else {
+ if (isset($server['REQUEST_SCHEME'])) {
+ $uri = $uri->withScheme($server['REQUEST_SCHEME']);
+ } elseif (isset($server['HTTPS'])) {
+ $uri = $uri->withScheme('on' === $server['HTTPS'] ? 'https' : 'http');
+ }
+
+ if (isset($server['SERVER_PORT'])) {
+ $uri = $uri->withPort($server['SERVER_PORT']);
+ }
+ }
+
+ if (isset($server['HTTP_HOST'])) {
+ if (1 === \preg_match('/^(.+)\:(\d+)$/', $server['HTTP_HOST'], $matches)) {
+ $uri = $uri->withHost($matches[1])->withPort($matches[2]);
+ } else {
+ $uri = $uri->withHost($server['HTTP_HOST']);
+ }
+ } elseif (isset($server['SERVER_NAME'])) {
+ $uri = $uri->withHost($server['SERVER_NAME']);
+ }
+
+ if (isset($server['REQUEST_URI'])) {
+ $uri = $uri->withPath(\current(\explode('?', $server['REQUEST_URI'])));
+ }
+
+ if (isset($server['QUERY_STRING'])) {
+ $uri = $uri->withQuery($server['QUERY_STRING']);
+ }
+
+ return $uri;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreatorInterface.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreatorInterface.php
new file mode 100644
index 00000000..a5ab6889
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7-server/src/ServerRequestCreatorInterface.php
@@ -0,0 +1,56 @@
+
+ * @author Martijn van der Ven
+ */
+interface ServerRequestCreatorInterface
+{
+ /**
+ * Create a new server request from the current environment variables.
+ * Defaults to a GET request to minimise the risk of an \InvalidArgumentException.
+ * Includes the current request headers as supplied by the server through `getallheaders()`.
+ * If `getallheaders()` is unavailable on the current server it will fallback to its own `getHeadersFromServer()` method.
+ * Defaults to php://input for the request body.
+ *
+ * @throws \InvalidArgumentException if no valid method or URI can be determined
+ */
+ public function fromGlobals(): ServerRequestInterface;
+
+ /**
+ * Create a new server request from a set of arrays.
+ *
+ * @param array $server typically $_SERVER or similar structure
+ * @param array $headers typically the output of getallheaders() or similar structure
+ * @param array $cookie typically $_COOKIE or similar structure
+ * @param array $get typically $_GET or similar structure
+ * @param array $post typically $_POST or similar structure
+ * @param array $files typically $_FILES or similar structure
+ * @param StreamInterface|resource|string|null $body Typically stdIn
+ *
+ * @throws \InvalidArgumentException if no valid method or URI can be determined
+ */
+ public function fromArrays(
+ array $server,
+ array $headers = [],
+ array $cookie = [],
+ array $get = [],
+ array $post = [],
+ array $files = [],
+ $body = null
+ ): ServerRequestInterface;
+
+ /**
+ * Get parsed headers from ($_SERVER) array.
+ *
+ * @param array $server typically $_SERVER or similar structure
+ */
+ public static function getHeadersFromServer(array $server): array;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/CHANGELOG.md
new file mode 100644
index 00000000..78a633ca
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/CHANGELOG.md
@@ -0,0 +1,132 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.5.0
+
+### Added
+
+- Add explicit `@return mixed`
+- Add explicit return types to HttplugFactory
+
+### Fixed
+
+- Improve error handling with streams
+
+## 1.4.1
+
+### Fixed
+
+- `Psr17Factory::createStreamFromFile`, `UploadedFile::moveTo`, and
+ `UploadedFile::getStream` no longer throw `ValueError` in PHP 8.
+
+## 1.4.0
+
+### Removed
+
+The `final` keyword was replaced by `@final` annotation.
+
+## 1.3.2
+
+### Fixed
+
+- `Stream::read()` must not return boolean.
+- Improved exception message when using wrong HTTP status code.
+
+## 1.3.1
+
+### Fixed
+
+- Allow installation on PHP8
+
+## 1.3.0
+
+### Added
+
+- Make Stream::__toString() compatible with throwing exceptions on PHP 7.4.
+
+### Fixed
+
+- Support for UTF-8 hostnames
+- Support for numeric header names
+
+## 1.2.1
+
+### Changed
+
+- Added `.github` and `phpstan.neon.dist` to `.gitattributes`.
+
+## 1.2.0
+
+### Changed
+
+- Change minimal port number to 0 (unix socket)
+- Updated `Psr17Factory::createResponse` to respect the specification. If second
+ argument is not used, a standard reason phrase. If an empty string is passed,
+ then the reason phrase will be empty.
+
+### Fixed
+
+- Check for seekable on the stream resource.
+- Fixed the `Response::$reason` should never be null.
+
+## 1.1.0
+
+### Added
+
+- Improved performance
+- More tests for `UploadedFile` and `HttplugFactory`
+
+### Removed
+
+- Dead code
+
+## 1.0.1
+
+### Fixed
+
+- Handle `fopen` failing in createStreamFromFile according to PSR-7.
+- Reduce execution path to speed up performance.
+- Fixed typos.
+- Code style.
+
+## 1.0.0
+
+### Added
+
+- Support for final PSR-17 (HTTP factories). (`Psr17Factory`)
+- Support for numeric header values.
+- Support for empty header values.
+- All classes are final
+- `HttplugFactory` that implements factory interfaces from HTTPlug.
+
+### Changed
+
+- `ServerRequest` does not extend `Request`.
+
+### Removed
+
+- The HTTPlug discovery strategy was removed since it is included in php-http/discovery 1.4.
+- `UploadedFileFactory()` was removed in favor for `Psr17Factory`.
+- `ServerRequestFactory()` was removed in favor for `Psr17Factory`.
+- `StreamFactory`, `UriFactory`, abd `MessageFactory`. Use `HttplugFactory` instead.
+- `ServerRequestFactory::createServerRequestFromArray`, `ServerRequestFactory::createServerRequestFromArrays` and
+ `ServerRequestFactory::createServerRequestFromGlobals`. Please use the new `nyholm/psr7-server` instead.
+
+## 0.3.0
+
+### Added
+
+- Return types.
+- Many `InvalidArgumentException`s are thrown when you use invalid arguments.
+- Integration tests for `UploadedFile` and `ServerRequest`.
+
+### Changed
+
+- We dropped PHP7.0 support.
+- PSR-17 factories have been marked as internal. They do not fall under our BC promise until PSR-17 is accepted.
+- `UploadedFileFactory::createUploadedFile` does not accept a string file path.
+
+## 0.2.3
+
+No changelog before this release
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/LICENSE b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/LICENSE
new file mode 100644
index 00000000..d6c52312
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/README.md b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/README.md
new file mode 100644
index 00000000..9f929330
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/README.md
@@ -0,0 +1,110 @@
+# PSR-7 implementation
+
+[![Latest Version](https://img.shields.io/github/release/Nyholm/psr7.svg?style=flat-square)](https://github.com/Nyholm/psr7/releases)
+[![Build Status](https://img.shields.io/travis/Nyholm/psr7/master.svg?style=flat-square)](https://travis-ci.org/Nyholm/psr7)
+[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/Nyholm/psr7.svg?style=flat-square)](https://scrutinizer-ci.com/g/Nyholm/psr7)
+[![Quality Score](https://img.shields.io/scrutinizer/g/Nyholm/psr7.svg?style=flat-square)](https://scrutinizer-ci.com/g/Nyholm/psr7)
+[![Total Downloads](https://poser.pugx.org/nyholm/psr7/downloads)](https://packagist.org/packages/nyholm/psr7)
+[![Monthly Downloads](https://poser.pugx.org/nyholm/psr7/d/monthly.png)](https://packagist.org/packages/nyholm/psr7)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+
+A super lightweight PSR-7 implementation. Very strict and very fast.
+
+| Description | Guzzle | Laminas | Slim | Nyholm |
+| ---- | ------ | ---- | ---- | ------ |
+| Lines of code | 3.300 | 3.100 | 1.900 | 1.000 |
+| PSR-7* | 66% | 100% | 75% | 100% |
+| PSR-17 | No | Yes | Yes | Yes |
+| HTTPlug | No | No | No | Yes |
+| Performance (runs per second)** | 14.553 | 14.703 | 13.416 | 17.734 |
+
+\* Percent of completed tests in https://github.com/php-http/psr7-integration-tests
+
+\** Benchmark with 50.000 runs. See https://github.com/devanych/psr-http-benchmark (higher is better)
+
+## Installation
+
+```bash
+composer require nyholm/psr7
+```
+
+If you are using Symfony Flex then you get all message factories registered as services.
+
+## Usage
+
+The PSR-7 objects do not contain any other public methods than those defined in
+the [PSR-7 specification](https://www.php-fig.org/psr/psr-7/).
+
+### Create objects
+
+Use the PSR-17 factory to create requests, streams, URIs etc.
+
+```php
+$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
+$request = $psr17Factory->createRequest('GET', 'http://tnyholm.se');
+$stream = $psr17Factory->createStream('foobar');
+```
+
+### Sending a request
+
+With [HTTPlug](http://httplug.io/) or any other PSR-18 (HTTP client) you may send
+requests like:
+
+```bash
+composer require kriswallsmith/buzz
+```
+
+```php
+$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
+$psr18Client = new \Buzz\Client\Curl($psr17Factory);
+
+$request = $psr17Factory->createRequest('GET', 'http://tnyholm.se');
+$response = $psr18Client->sendRequest($request);
+```
+
+### Create server requests
+
+The [`nyholm/psr7-server`](https://github.com/Nyholm/psr7-server) package can be used
+to create server requests from PHP superglobals.
+
+```bash
+composer require nyholm/psr7-server
+```
+
+```php
+$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
+
+$creator = new \Nyholm\Psr7Server\ServerRequestCreator(
+ $psr17Factory, // ServerRequestFactory
+ $psr17Factory, // UriFactory
+ $psr17Factory, // UploadedFileFactory
+ $psr17Factory // StreamFactory
+);
+
+$serverRequest = $creator->fromGlobals();
+```
+
+### Emitting a response
+
+```bash
+composer require laminas/laminas-httphandlerrunner
+```
+
+```php
+$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
+
+$responseBody = $psr17Factory->createStream('Hello world');
+$response = $psr17Factory->createResponse(200)->withBody($responseBody);
+(new \Laminas\HttpHandlerRunner\Emitter\SapiEmitter())->emit($response);
+```
+
+## Our goal
+
+This package is currently maintained by [Tobias Nyholm](http://nyholm.se) and
+[Martijn van der Ven](https://vanderven.se/martijn/). They have decided that the
+goal of this library should be to provide a super strict implementation of
+[PSR-7](https://www.php-fig.org/psr/psr-7/) that is blazing fast.
+
+The package will never include any extra features nor helper methods. All our classes
+and functions exist because they are required to fulfill the PSR-7 specification.
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/composer.json b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/composer.json
new file mode 100644
index 00000000..fffdec0b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/composer.json
@@ -0,0 +1,48 @@
+{
+ "name": "nyholm/psr7",
+ "description": "A fast PHP7 implementation of PSR-7",
+ "license": "MIT",
+ "keywords": ["psr-7", "psr-17"],
+ "homepage": "https://tnyholm.se",
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0",
+ "php-http/message-factory": "^1.0",
+ "psr/http-factory": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || 8.5 || 9.4",
+ "php-http/psr7-integration-tests": "^1.0",
+ "http-interop/http-factory-tests": "^0.9",
+ "symfony/error-handler": "^4.4"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0",
+ "psr/http-factory-implementation": "1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\Nyholm\\Psr7\\": "tests/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/HttplugFactory.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/HttplugFactory.php
new file mode 100644
index 00000000..4cf8e27e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/HttplugFactory.php
@@ -0,0 +1,45 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class HttplugFactory implements MessageFactory, StreamFactory, UriFactory
+{
+ public function createRequest($method, $uri, array $headers = [], $body = null, $protocolVersion = '1.1'): RequestInterface
+ {
+ return new Request($method, $uri, $headers, $body, $protocolVersion);
+ }
+
+ public function createResponse($statusCode = 200, $reasonPhrase = null, array $headers = [], $body = null, $version = '1.1'): ResponseInterface
+ {
+ return new Response((int) $statusCode, $headers, $body, $version, $reasonPhrase);
+ }
+
+ public function createStream($body = null): StreamInterface
+ {
+ return Stream::create($body ?? '');
+ }
+
+ public function createUri($uri = ''): UriInterface
+ {
+ if ($uri instanceof UriInterface) {
+ return $uri;
+ }
+
+ return new Uri($uri);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/Psr17Factory.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/Psr17Factory.php
new file mode 100644
index 00000000..440bec34
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Factory/Psr17Factory.php
@@ -0,0 +1,78 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class Psr17Factory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface
+{
+ public function createRequest(string $method, $uri): RequestInterface
+ {
+ return new Request($method, $uri);
+ }
+
+ public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface
+ {
+ if (2 > \func_num_args()) {
+ // This will make the Response class to use a custom reasonPhrase
+ $reasonPhrase = null;
+ }
+
+ return new Response($code, [], null, '1.1', $reasonPhrase);
+ }
+
+ public function createStream(string $content = ''): StreamInterface
+ {
+ return Stream::create($content);
+ }
+
+ public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface
+ {
+ if ('' === $filename) {
+ throw new \RuntimeException('Path cannot be empty');
+ }
+
+ if (false === $resource = @\fopen($filename, $mode)) {
+ if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) {
+ throw new \InvalidArgumentException(\sprintf('The mode "%s" is invalid.', $mode));
+ }
+
+ throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $filename, \error_get_last()['message'] ?? ''));
+ }
+
+ return Stream::create($resource);
+ }
+
+ public function createStreamFromResource($resource): StreamInterface
+ {
+ return Stream::create($resource);
+ }
+
+ public function createUploadedFile(StreamInterface $stream, int $size = null, int $error = \UPLOAD_ERR_OK, string $clientFilename = null, string $clientMediaType = null): UploadedFileInterface
+ {
+ if (null === $size) {
+ $size = $stream->getSize();
+ }
+
+ return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType);
+ }
+
+ public function createUri(string $uri = ''): UriInterface
+ {
+ return new Uri($uri);
+ }
+
+ public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
+ {
+ return new ServerRequest($method, $uri, [], null, '1.1', $serverParams);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/MessageTrait.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/MessageTrait.php
new file mode 100644
index 00000000..595258bb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/MessageTrait.php
@@ -0,0 +1,207 @@
+
+ * @author Martijn van der Ven
+ *
+ * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise
+ */
+trait MessageTrait
+{
+ /** @var array Map of all registered headers, as original name => array of values */
+ private $headers = [];
+
+ /** @var array Map of lowercase header name => original name at registration */
+ private $headerNames = [];
+
+ /** @var string */
+ private $protocol = '1.1';
+
+ /** @var StreamInterface|null */
+ private $stream;
+
+ public function getProtocolVersion(): string
+ {
+ return $this->protocol;
+ }
+
+ public function withProtocolVersion($version): self
+ {
+ if ($this->protocol === $version) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->protocol = $version;
+
+ return $new;
+ }
+
+ public function getHeaders(): array
+ {
+ return $this->headers;
+ }
+
+ public function hasHeader($header): bool
+ {
+ return isset($this->headerNames[\strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]);
+ }
+
+ public function getHeader($header): array
+ {
+ $header = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
+ if (!isset($this->headerNames[$header])) {
+ return [];
+ }
+
+ $header = $this->headerNames[$header];
+
+ return $this->headers[$header];
+ }
+
+ public function getHeaderLine($header): string
+ {
+ return \implode(', ', $this->getHeader($header));
+ }
+
+ public function withHeader($header, $value): self
+ {
+ $value = $this->validateAndTrimHeader($header, $value);
+ $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
+
+ $new = clone $this;
+ if (isset($new->headerNames[$normalized])) {
+ unset($new->headers[$new->headerNames[$normalized]]);
+ }
+ $new->headerNames[$normalized] = $header;
+ $new->headers[$header] = $value;
+
+ return $new;
+ }
+
+ public function withAddedHeader($header, $value): self
+ {
+ if (!\is_string($header) || '' === $header) {
+ throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string.');
+ }
+
+ $new = clone $this;
+ $new->setHeaders([$header => $value]);
+
+ return $new;
+ }
+
+ public function withoutHeader($header): self
+ {
+ $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
+ if (!isset($this->headerNames[$normalized])) {
+ return $this;
+ }
+
+ $header = $this->headerNames[$normalized];
+ $new = clone $this;
+ unset($new->headers[$header], $new->headerNames[$normalized]);
+
+ return $new;
+ }
+
+ public function getBody(): StreamInterface
+ {
+ if (null === $this->stream) {
+ $this->stream = Stream::create('');
+ }
+
+ return $this->stream;
+ }
+
+ public function withBody(StreamInterface $body): self
+ {
+ if ($body === $this->stream) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->stream = $body;
+
+ return $new;
+ }
+
+ private function setHeaders(array $headers): void
+ {
+ foreach ($headers as $header => $value) {
+ if (\is_int($header)) {
+ // If a header name was set to a numeric string, PHP will cast the key to an int.
+ // We must cast it back to a string in order to comply with validation.
+ $header = (string) $header;
+ }
+ $value = $this->validateAndTrimHeader($header, $value);
+ $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
+ if (isset($this->headerNames[$normalized])) {
+ $header = $this->headerNames[$normalized];
+ $this->headers[$header] = \array_merge($this->headers[$header], $value);
+ } else {
+ $this->headerNames[$normalized] = $header;
+ $this->headers[$header] = $value;
+ }
+ }
+ }
+
+ /**
+ * Make sure the header complies with RFC 7230.
+ *
+ * Header names must be a non-empty string consisting of token characters.
+ *
+ * Header values must be strings consisting of visible characters with all optional
+ * leading and trailing whitespace stripped. This method will always strip such
+ * optional whitespace. Note that the method does not allow folding whitespace within
+ * the values as this was deprecated for almost all instances by the RFC.
+ *
+ * header-field = field-name ":" OWS field-value OWS
+ * field-name = 1*( "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^"
+ * / "_" / "`" / "|" / "~" / %x30-39 / ( %x41-5A / %x61-7A ) )
+ * OWS = *( SP / HTAB )
+ * field-value = *( ( %x21-7E / %x80-FF ) [ 1*( SP / HTAB ) ( %x21-7E / %x80-FF ) ] )
+ *
+ * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
+ */
+ private function validateAndTrimHeader($header, $values): array
+ {
+ if (!\is_string($header) || 1 !== \preg_match("@^[!#$%&'*+.^_`|~0-9A-Za-z-]+$@", $header)) {
+ throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string.');
+ }
+
+ if (!\is_array($values)) {
+ // This is simple, just one value.
+ if ((!\is_numeric($values) && !\is_string($values)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $values)) {
+ throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings.');
+ }
+
+ return [\trim((string) $values, " \t")];
+ }
+
+ if (empty($values)) {
+ throw new \InvalidArgumentException('Header values must be a string or an array of strings, empty array given.');
+ }
+
+ // Assert Non empty array
+ $returnValues = [];
+ foreach ($values as $v) {
+ if ((!\is_numeric($v) && !\is_string($v)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $v)) {
+ throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings.');
+ }
+
+ $returnValues[] = \trim((string) $v, " \t");
+ }
+
+ return $returnValues;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Request.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Request.php
new file mode 100644
index 00000000..d50744ee
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Request.php
@@ -0,0 +1,47 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class Request implements RequestInterface
+{
+ use MessageTrait;
+ use RequestTrait;
+
+ /**
+ * @param string $method HTTP method
+ * @param string|UriInterface $uri URI
+ * @param array $headers Request headers
+ * @param string|resource|StreamInterface|null $body Request body
+ * @param string $version Protocol version
+ */
+ public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1')
+ {
+ if (!($uri instanceof UriInterface)) {
+ $uri = new Uri($uri);
+ }
+
+ $this->method = $method;
+ $this->uri = $uri;
+ $this->setHeaders($headers);
+ $this->protocol = $version;
+
+ if (!$this->hasHeader('Host')) {
+ $this->updateHostFromUri();
+ }
+
+ // If we got no body, defer initialization of the stream until Request::getBody()
+ if ('' !== $body && null !== $body) {
+ $this->stream = Stream::create($body);
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/RequestTrait.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/RequestTrait.php
new file mode 100644
index 00000000..f39993a1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/RequestTrait.php
@@ -0,0 +1,113 @@
+
+ * @author Martijn van der Ven
+ *
+ * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise
+ */
+trait RequestTrait
+{
+ /** @var string */
+ private $method;
+
+ /** @var string|null */
+ private $requestTarget;
+
+ /** @var UriInterface|null */
+ private $uri;
+
+ public function getRequestTarget(): string
+ {
+ if (null !== $this->requestTarget) {
+ return $this->requestTarget;
+ }
+
+ if ('' === $target = $this->uri->getPath()) {
+ $target = '/';
+ }
+ if ('' !== $this->uri->getQuery()) {
+ $target .= '?' . $this->uri->getQuery();
+ }
+
+ return $target;
+ }
+
+ public function withRequestTarget($requestTarget): self
+ {
+ if (\preg_match('#\s#', $requestTarget)) {
+ throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace');
+ }
+
+ $new = clone $this;
+ $new->requestTarget = $requestTarget;
+
+ return $new;
+ }
+
+ public function getMethod(): string
+ {
+ return $this->method;
+ }
+
+ public function withMethod($method): self
+ {
+ if (!\is_string($method)) {
+ throw new \InvalidArgumentException('Method must be a string');
+ }
+
+ $new = clone $this;
+ $new->method = $method;
+
+ return $new;
+ }
+
+ public function getUri(): UriInterface
+ {
+ return $this->uri;
+ }
+
+ public function withUri(UriInterface $uri, $preserveHost = false): self
+ {
+ if ($uri === $this->uri) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->uri = $uri;
+
+ if (!$preserveHost || !$this->hasHeader('Host')) {
+ $new->updateHostFromUri();
+ }
+
+ return $new;
+ }
+
+ private function updateHostFromUri(): void
+ {
+ if ('' === $host = $this->uri->getHost()) {
+ return;
+ }
+
+ if (null !== ($port = $this->uri->getPort())) {
+ $host .= ':' . $port;
+ }
+
+ if (isset($this->headerNames['host'])) {
+ $header = $this->headerNames['host'];
+ } else {
+ $this->headerNames['host'] = $header = 'Host';
+ }
+
+ // Ensure Host is the first header.
+ // See: http://tools.ietf.org/html/rfc7230#section-5.4
+ $this->headers = [$header => [$host]] + $this->headers;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Response.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Response.php
new file mode 100644
index 00000000..9a26d2cb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Response.php
@@ -0,0 +1,90 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class Response implements ResponseInterface
+{
+ use MessageTrait;
+
+ /** @var array Map of standard HTTP status code/reason phrases */
+ private const PHRASES = [
+ 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing',
+ 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported',
+ 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect',
+ 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons',
+ 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required',
+ ];
+
+ /** @var string */
+ private $reasonPhrase = '';
+
+ /** @var int */
+ private $statusCode;
+
+ /**
+ * @param int $status Status code
+ * @param array $headers Response headers
+ * @param string|resource|StreamInterface|null $body Response body
+ * @param string $version Protocol version
+ * @param string|null $reason Reason phrase (when empty a default will be used based on the status code)
+ */
+ public function __construct(int $status = 200, array $headers = [], $body = null, string $version = '1.1', string $reason = null)
+ {
+ // If we got no body, defer initialization of the stream until Response::getBody()
+ if ('' !== $body && null !== $body) {
+ $this->stream = Stream::create($body);
+ }
+
+ $this->statusCode = $status;
+ $this->setHeaders($headers);
+ if (null === $reason && isset(self::PHRASES[$this->statusCode])) {
+ $this->reasonPhrase = self::PHRASES[$status];
+ } else {
+ $this->reasonPhrase = $reason ?? '';
+ }
+
+ $this->protocol = $version;
+ }
+
+ public function getStatusCode(): int
+ {
+ return $this->statusCode;
+ }
+
+ public function getReasonPhrase(): string
+ {
+ return $this->reasonPhrase;
+ }
+
+ public function withStatus($code, $reasonPhrase = ''): self
+ {
+ if (!\is_int($code) && !\is_string($code)) {
+ throw new \InvalidArgumentException('Status code has to be an integer');
+ }
+
+ $code = (int) $code;
+ if ($code < 100 || $code > 599) {
+ throw new \InvalidArgumentException(\sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code));
+ }
+
+ $new = clone $this;
+ $new->statusCode = $code;
+ if ((null === $reasonPhrase || '' === $reasonPhrase) && isset(self::PHRASES[$new->statusCode])) {
+ $reasonPhrase = self::PHRASES[$new->statusCode];
+ }
+ $new->reasonPhrase = $reasonPhrase;
+
+ return $new;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/ServerRequest.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/ServerRequest.php
new file mode 100644
index 00000000..bde46cd6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/ServerRequest.php
@@ -0,0 +1,167 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class ServerRequest implements ServerRequestInterface
+{
+ use MessageTrait;
+ use RequestTrait;
+
+ /** @var array */
+ private $attributes = [];
+
+ /** @var array */
+ private $cookieParams = [];
+
+ /** @var array|object|null */
+ private $parsedBody;
+
+ /** @var array */
+ private $queryParams = [];
+
+ /** @var array */
+ private $serverParams;
+
+ /** @var UploadedFileInterface[] */
+ private $uploadedFiles = [];
+
+ /**
+ * @param string $method HTTP method
+ * @param string|UriInterface $uri URI
+ * @param array $headers Request headers
+ * @param string|resource|StreamInterface|null $body Request body
+ * @param string $version Protocol version
+ * @param array $serverParams Typically the $_SERVER superglobal
+ */
+ public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = [])
+ {
+ $this->serverParams = $serverParams;
+
+ if (!($uri instanceof UriInterface)) {
+ $uri = new Uri($uri);
+ }
+
+ $this->method = $method;
+ $this->uri = $uri;
+ $this->setHeaders($headers);
+ $this->protocol = $version;
+
+ if (!$this->hasHeader('Host')) {
+ $this->updateHostFromUri();
+ }
+
+ // If we got no body, defer initialization of the stream until ServerRequest::getBody()
+ if ('' !== $body && null !== $body) {
+ $this->stream = Stream::create($body);
+ }
+ }
+
+ public function getServerParams(): array
+ {
+ return $this->serverParams;
+ }
+
+ public function getUploadedFiles(): array
+ {
+ return $this->uploadedFiles;
+ }
+
+ public function withUploadedFiles(array $uploadedFiles)
+ {
+ $new = clone $this;
+ $new->uploadedFiles = $uploadedFiles;
+
+ return $new;
+ }
+
+ public function getCookieParams(): array
+ {
+ return $this->cookieParams;
+ }
+
+ public function withCookieParams(array $cookies)
+ {
+ $new = clone $this;
+ $new->cookieParams = $cookies;
+
+ return $new;
+ }
+
+ public function getQueryParams(): array
+ {
+ return $this->queryParams;
+ }
+
+ public function withQueryParams(array $query)
+ {
+ $new = clone $this;
+ $new->queryParams = $query;
+
+ return $new;
+ }
+
+ public function getParsedBody()
+ {
+ return $this->parsedBody;
+ }
+
+ public function withParsedBody($data)
+ {
+ if (!\is_array($data) && !\is_object($data) && null !== $data) {
+ throw new \InvalidArgumentException('First parameter to withParsedBody MUST be object, array or null');
+ }
+
+ $new = clone $this;
+ $new->parsedBody = $data;
+
+ return $new;
+ }
+
+ public function getAttributes(): array
+ {
+ return $this->attributes;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getAttribute($attribute, $default = null)
+ {
+ if (false === \array_key_exists($attribute, $this->attributes)) {
+ return $default;
+ }
+
+ return $this->attributes[$attribute];
+ }
+
+ public function withAttribute($attribute, $value): self
+ {
+ $new = clone $this;
+ $new->attributes[$attribute] = $value;
+
+ return $new;
+ }
+
+ public function withoutAttribute($attribute): self
+ {
+ if (false === \array_key_exists($attribute, $this->attributes)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ unset($new->attributes[$attribute]);
+
+ return $new;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Stream.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Stream.php
new file mode 100644
index 00000000..71515e5c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Stream.php
@@ -0,0 +1,306 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class Stream implements StreamInterface
+{
+ /** @var resource|null A resource reference */
+ private $stream;
+
+ /** @var bool */
+ private $seekable;
+
+ /** @var bool */
+ private $readable;
+
+ /** @var bool */
+ private $writable;
+
+ /** @var array|mixed|void|bool|null */
+ private $uri;
+
+ /** @var int|null */
+ private $size;
+
+ /** @var array Hash of readable and writable stream types */
+ private const READ_WRITE_HASH = [
+ 'read' => [
+ 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
+ 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
+ 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
+ 'x+t' => true, 'c+t' => true, 'a+' => true,
+ ],
+ 'write' => [
+ 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
+ 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+ 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
+ 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true,
+ ],
+ ];
+
+ private function __construct()
+ {
+ }
+
+ /**
+ * Creates a new PSR-7 stream.
+ *
+ * @param string|resource|StreamInterface $body
+ *
+ * @throws \InvalidArgumentException
+ */
+ public static function create($body = ''): StreamInterface
+ {
+ if ($body instanceof StreamInterface) {
+ return $body;
+ }
+
+ if (\is_string($body)) {
+ $resource = \fopen('php://temp', 'rw+');
+ \fwrite($resource, $body);
+ $body = $resource;
+ }
+
+ if (\is_resource($body)) {
+ $new = new self();
+ $new->stream = $body;
+ $meta = \stream_get_meta_data($new->stream);
+ $new->seekable = $meta['seekable'] && 0 === \fseek($new->stream, 0, \SEEK_CUR);
+ $new->readable = isset(self::READ_WRITE_HASH['read'][$meta['mode']]);
+ $new->writable = isset(self::READ_WRITE_HASH['write'][$meta['mode']]);
+
+ return $new;
+ }
+
+ throw new \InvalidArgumentException('First argument to Stream::create() must be a string, resource or StreamInterface.');
+ }
+
+ /**
+ * Closes the stream when the destructed.
+ */
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ try {
+ if ($this->isSeekable()) {
+ $this->seek(0);
+ }
+
+ return $this->getContents();
+ } catch (\Throwable $e) {
+ if (\PHP_VERSION_ID >= 70400) {
+ throw $e;
+ }
+
+ if (\is_array($errorHandler = \set_error_handler('var_dump'))) {
+ $errorHandler = $errorHandler[0] ?? null;
+ }
+ \restore_error_handler();
+
+ if ($e instanceof \Error || $errorHandler instanceof SymfonyErrorHandler || $errorHandler instanceof SymfonyLegacyErrorHandler) {
+ return \trigger_error((string) $e, \E_USER_ERROR);
+ }
+
+ return '';
+ }
+ }
+
+ public function close(): void
+ {
+ if (isset($this->stream)) {
+ if (\is_resource($this->stream)) {
+ \fclose($this->stream);
+ }
+ $this->detach();
+ }
+ }
+
+ public function detach()
+ {
+ if (!isset($this->stream)) {
+ return null;
+ }
+
+ $result = $this->stream;
+ unset($this->stream);
+ $this->size = $this->uri = null;
+ $this->readable = $this->writable = $this->seekable = false;
+
+ return $result;
+ }
+
+ private function getUri()
+ {
+ if (false !== $this->uri) {
+ $this->uri = $this->getMetadata('uri') ?? false;
+ }
+
+ return $this->uri;
+ }
+
+ public function getSize(): ?int
+ {
+ if (null !== $this->size) {
+ return $this->size;
+ }
+
+ if (!isset($this->stream)) {
+ return null;
+ }
+
+ // Clear the stat cache if the stream has a URI
+ if ($uri = $this->getUri()) {
+ \clearstatcache(true, $uri);
+ }
+
+ $stats = \fstat($this->stream);
+ if (isset($stats['size'])) {
+ $this->size = $stats['size'];
+
+ return $this->size;
+ }
+
+ return null;
+ }
+
+ public function tell(): int
+ {
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ if (false === $result = @\ftell($this->stream)) {
+ throw new \RuntimeException('Unable to determine stream position: ' . (\error_get_last()['message'] ?? ''));
+ }
+
+ return $result;
+ }
+
+ public function eof(): bool
+ {
+ return !isset($this->stream) || \feof($this->stream);
+ }
+
+ public function isSeekable(): bool
+ {
+ return $this->seekable;
+ }
+
+ public function seek($offset, $whence = \SEEK_SET): void
+ {
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ if (!$this->seekable) {
+ throw new \RuntimeException('Stream is not seekable');
+ }
+
+ if (-1 === \fseek($this->stream, $offset, $whence)) {
+ throw new \RuntimeException('Unable to seek to stream position "' . $offset . '" with whence ' . \var_export($whence, true));
+ }
+ }
+
+ public function rewind(): void
+ {
+ $this->seek(0);
+ }
+
+ public function isWritable(): bool
+ {
+ return $this->writable;
+ }
+
+ public function write($string): int
+ {
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ if (!$this->writable) {
+ throw new \RuntimeException('Cannot write to a non-writable stream');
+ }
+
+ // We can't know the size after writing anything
+ $this->size = null;
+
+ if (false === $result = @\fwrite($this->stream, $string)) {
+ throw new \RuntimeException('Unable to write to stream: ' . (\error_get_last()['message'] ?? ''));
+ }
+
+ return $result;
+ }
+
+ public function isReadable(): bool
+ {
+ return $this->readable;
+ }
+
+ public function read($length): string
+ {
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ if (!$this->readable) {
+ throw new \RuntimeException('Cannot read from non-readable stream');
+ }
+
+ if (false === $result = @\fread($this->stream, $length)) {
+ throw new \RuntimeException('Unable to read from stream: ' . (\error_get_last()['message'] ?? ''));
+ }
+
+ return $result;
+ }
+
+ public function getContents(): string
+ {
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ if (false === $contents = @\stream_get_contents($this->stream)) {
+ throw new \RuntimeException('Unable to read stream contents: ' . (\error_get_last()['message'] ?? ''));
+ }
+
+ return $contents;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getMetadata($key = null)
+ {
+ if (!isset($this->stream)) {
+ return $key ? null : [];
+ }
+
+ $meta = \stream_get_meta_data($this->stream);
+
+ if (null === $key) {
+ return $meta;
+ }
+
+ return $meta[$key] ?? null;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/UploadedFile.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/UploadedFile.php
new file mode 100644
index 00000000..bf47b781
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/UploadedFile.php
@@ -0,0 +1,179 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class UploadedFile implements UploadedFileInterface
+{
+ /** @var array */
+ private const ERRORS = [
+ \UPLOAD_ERR_OK => 1,
+ \UPLOAD_ERR_INI_SIZE => 1,
+ \UPLOAD_ERR_FORM_SIZE => 1,
+ \UPLOAD_ERR_PARTIAL => 1,
+ \UPLOAD_ERR_NO_FILE => 1,
+ \UPLOAD_ERR_NO_TMP_DIR => 1,
+ \UPLOAD_ERR_CANT_WRITE => 1,
+ \UPLOAD_ERR_EXTENSION => 1,
+ ];
+
+ /** @var string */
+ private $clientFilename;
+
+ /** @var string */
+ private $clientMediaType;
+
+ /** @var int */
+ private $error;
+
+ /** @var string|null */
+ private $file;
+
+ /** @var bool */
+ private $moved = false;
+
+ /** @var int */
+ private $size;
+
+ /** @var StreamInterface|null */
+ private $stream;
+
+ /**
+ * @param StreamInterface|string|resource $streamOrFile
+ * @param int $size
+ * @param int $errorStatus
+ * @param string|null $clientFilename
+ * @param string|null $clientMediaType
+ */
+ public function __construct($streamOrFile, $size, $errorStatus, $clientFilename = null, $clientMediaType = null)
+ {
+ if (false === \is_int($errorStatus) || !isset(self::ERRORS[$errorStatus])) {
+ throw new \InvalidArgumentException('Upload file error status must be an integer value and one of the "UPLOAD_ERR_*" constants.');
+ }
+
+ if (false === \is_int($size)) {
+ throw new \InvalidArgumentException('Upload file size must be an integer');
+ }
+
+ if (null !== $clientFilename && !\is_string($clientFilename)) {
+ throw new \InvalidArgumentException('Upload file client filename must be a string or null');
+ }
+
+ if (null !== $clientMediaType && !\is_string($clientMediaType)) {
+ throw new \InvalidArgumentException('Upload file client media type must be a string or null');
+ }
+
+ $this->error = $errorStatus;
+ $this->size = $size;
+ $this->clientFilename = $clientFilename;
+ $this->clientMediaType = $clientMediaType;
+
+ if (\UPLOAD_ERR_OK === $this->error) {
+ // Depending on the value set file or stream variable.
+ if (\is_string($streamOrFile) && '' !== $streamOrFile) {
+ $this->file = $streamOrFile;
+ } elseif (\is_resource($streamOrFile)) {
+ $this->stream = Stream::create($streamOrFile);
+ } elseif ($streamOrFile instanceof StreamInterface) {
+ $this->stream = $streamOrFile;
+ } else {
+ throw new \InvalidArgumentException('Invalid stream or file provided for UploadedFile');
+ }
+ }
+ }
+
+ /**
+ * @throws \RuntimeException if is moved or not ok
+ */
+ private function validateActive(): void
+ {
+ if (\UPLOAD_ERR_OK !== $this->error) {
+ throw new \RuntimeException('Cannot retrieve stream due to upload error');
+ }
+
+ if ($this->moved) {
+ throw new \RuntimeException('Cannot retrieve stream after it has already been moved');
+ }
+ }
+
+ public function getStream(): StreamInterface
+ {
+ $this->validateActive();
+
+ if ($this->stream instanceof StreamInterface) {
+ return $this->stream;
+ }
+
+ if (false === $resource = @\fopen($this->file, 'r')) {
+ throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $this->file, \error_get_last()['message'] ?? ''));
+ }
+
+ return Stream::create($resource);
+ }
+
+ public function moveTo($targetPath): void
+ {
+ $this->validateActive();
+
+ if (!\is_string($targetPath) || '' === $targetPath) {
+ throw new \InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string');
+ }
+
+ if (null !== $this->file) {
+ $this->moved = 'cli' === \PHP_SAPI ? @\rename($this->file, $targetPath) : @\move_uploaded_file($this->file, $targetPath);
+
+ if (false === $this->moved) {
+ throw new \RuntimeException(\sprintf('Uploaded file could not be moved to "%s": %s', $targetPath, \error_get_last()['message'] ?? ''));
+ }
+ } else {
+ $stream = $this->getStream();
+ if ($stream->isSeekable()) {
+ $stream->rewind();
+ }
+
+ if (false === $resource = @\fopen($targetPath, 'w')) {
+ throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $targetPath, \error_get_last()['message'] ?? ''));
+ }
+
+ $dest = Stream::create($resource);
+
+ while (!$stream->eof()) {
+ if (!$dest->write($stream->read(1048576))) {
+ break;
+ }
+ }
+
+ $this->moved = true;
+ }
+ }
+
+ public function getSize(): int
+ {
+ return $this->size;
+ }
+
+ public function getError(): int
+ {
+ return $this->error;
+ }
+
+ public function getClientFilename(): ?string
+ {
+ return $this->clientFilename;
+ }
+
+ public function getClientMediaType(): ?string
+ {
+ return $this->clientMediaType;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Uri.php b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Uri.php
new file mode 100644
index 00000000..13fbf72e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/nyholm/psr7/src/Uri.php
@@ -0,0 +1,312 @@
+
+ * @author Martijn van der Ven
+ *
+ * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md
+ */
+class Uri implements UriInterface
+{
+ private const SCHEMES = ['http' => 80, 'https' => 443];
+
+ private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~';
+
+ private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
+
+ /** @var string Uri scheme. */
+ private $scheme = '';
+
+ /** @var string Uri user info. */
+ private $userInfo = '';
+
+ /** @var string Uri host. */
+ private $host = '';
+
+ /** @var int|null Uri port. */
+ private $port;
+
+ /** @var string Uri path. */
+ private $path = '';
+
+ /** @var string Uri query string. */
+ private $query = '';
+
+ /** @var string Uri fragment. */
+ private $fragment = '';
+
+ public function __construct(string $uri = '')
+ {
+ if ('' !== $uri) {
+ if (false === $parts = \parse_url($uri)) {
+ throw new \InvalidArgumentException(\sprintf('Unable to parse URI: "%s"', $uri));
+ }
+
+ // Apply parse_url parts to a URI.
+ $this->scheme = isset($parts['scheme']) ? \strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : '';
+ $this->userInfo = $parts['user'] ?? '';
+ $this->host = isset($parts['host']) ? \strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : '';
+ $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null;
+ $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : '';
+ $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : '';
+ $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : '';
+ if (isset($parts['pass'])) {
+ $this->userInfo .= ':' . $parts['pass'];
+ }
+ }
+ }
+
+ public function __toString(): string
+ {
+ return self::createUriString($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment);
+ }
+
+ public function getScheme(): string
+ {
+ return $this->scheme;
+ }
+
+ public function getAuthority(): string
+ {
+ if ('' === $this->host) {
+ return '';
+ }
+
+ $authority = $this->host;
+ if ('' !== $this->userInfo) {
+ $authority = $this->userInfo . '@' . $authority;
+ }
+
+ if (null !== $this->port) {
+ $authority .= ':' . $this->port;
+ }
+
+ return $authority;
+ }
+
+ public function getUserInfo(): string
+ {
+ return $this->userInfo;
+ }
+
+ public function getHost(): string
+ {
+ return $this->host;
+ }
+
+ public function getPort(): ?int
+ {
+ return $this->port;
+ }
+
+ public function getPath(): string
+ {
+ return $this->path;
+ }
+
+ public function getQuery(): string
+ {
+ return $this->query;
+ }
+
+ public function getFragment(): string
+ {
+ return $this->fragment;
+ }
+
+ public function withScheme($scheme): self
+ {
+ if (!\is_string($scheme)) {
+ throw new \InvalidArgumentException('Scheme must be a string');
+ }
+
+ if ($this->scheme === $scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->scheme = $scheme;
+ $new->port = $new->filterPort($new->port);
+
+ return $new;
+ }
+
+ public function withUserInfo($user, $password = null): self
+ {
+ $info = $user;
+ if (null !== $password && '' !== $password) {
+ $info .= ':' . $password;
+ }
+
+ if ($this->userInfo === $info) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->userInfo = $info;
+
+ return $new;
+ }
+
+ public function withHost($host): self
+ {
+ if (!\is_string($host)) {
+ throw new \InvalidArgumentException('Host must be a string');
+ }
+
+ if ($this->host === $host = \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->host = $host;
+
+ return $new;
+ }
+
+ public function withPort($port): self
+ {
+ if ($this->port === $port = $this->filterPort($port)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->port = $port;
+
+ return $new;
+ }
+
+ public function withPath($path): self
+ {
+ if ($this->path === $path = $this->filterPath($path)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->path = $path;
+
+ return $new;
+ }
+
+ public function withQuery($query): self
+ {
+ if ($this->query === $query = $this->filterQueryAndFragment($query)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->query = $query;
+
+ return $new;
+ }
+
+ public function withFragment($fragment): self
+ {
+ if ($this->fragment === $fragment = $this->filterQueryAndFragment($fragment)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->fragment = $fragment;
+
+ return $new;
+ }
+
+ /**
+ * Create a URI string from its various parts.
+ */
+ private static function createUriString(string $scheme, string $authority, string $path, string $query, string $fragment): string
+ {
+ $uri = '';
+ if ('' !== $scheme) {
+ $uri .= $scheme . ':';
+ }
+
+ if ('' !== $authority) {
+ $uri .= '//' . $authority;
+ }
+
+ if ('' !== $path) {
+ if ('/' !== $path[0]) {
+ if ('' !== $authority) {
+ // If the path is rootless and an authority is present, the path MUST be prefixed by "/"
+ $path = '/' . $path;
+ }
+ } elseif (isset($path[1]) && '/' === $path[1]) {
+ if ('' === $authority) {
+ // If the path is starting with more than one "/" and no authority is present, the
+ // starting slashes MUST be reduced to one.
+ $path = '/' . \ltrim($path, '/');
+ }
+ }
+
+ $uri .= $path;
+ }
+
+ if ('' !== $query) {
+ $uri .= '?' . $query;
+ }
+
+ if ('' !== $fragment) {
+ $uri .= '#' . $fragment;
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Is a given port non-standard for the current scheme?
+ */
+ private static function isNonStandardPort(string $scheme, int $port): bool
+ {
+ return !isset(self::SCHEMES[$scheme]) || $port !== self::SCHEMES[$scheme];
+ }
+
+ private function filterPort($port): ?int
+ {
+ if (null === $port) {
+ return null;
+ }
+
+ $port = (int) $port;
+ if (0 > $port || 0xffff < $port) {
+ throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port));
+ }
+
+ return self::isNonStandardPort($this->scheme, $port) ? $port : null;
+ }
+
+ private function filterPath($path): string
+ {
+ if (!\is_string($path)) {
+ throw new \InvalidArgumentException('Path must be a string');
+ }
+
+ return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path);
+ }
+
+ private function filterQueryAndFragment($str): string
+ {
+ if (!\is_string($str)) {
+ throw new \InvalidArgumentException('Query and fragment must be a string');
+ }
+
+ return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str);
+ }
+
+ private static function rawurlencodeMatchZero(array $match): string
+ {
+ return \rawurlencode($match[0]);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/CHANGELOG.md
new file mode 100644
index 00000000..4711924c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/CHANGELOG.md
@@ -0,0 +1,65 @@
+# Change Log
+
+
+## 1.0.2 - 2015-12-19
+
+### Added
+
+- Request and Response factory binding types to Puli
+
+
+## 1.0.1 - 2015-12-17
+
+### Added
+
+- Puli configuration and binding types
+
+
+## 1.0.0 - 2015-12-15
+
+### Added
+
+- Response Factory in order to be reused in Message and Server Message factories
+- Request Factory
+
+### Changed
+
+- Message Factory extends Request and Response factories
+
+
+## 1.0.0-RC1 - 2015-12-14
+
+### Added
+
+- CS check
+
+### Changed
+
+- RuntimeException is thrown when the StreamFactory cannot write to the underlying stream
+
+
+## 0.3.0 - 2015-11-16
+
+### Removed
+
+- Client Context Factory
+- Factory Awares and Templates
+
+
+## 0.2.0 - 2015-11-16
+
+### Changed
+
+- Reordered the parameters when creating a message to have the protocol last,
+as its the least likely to need to be changed.
+
+
+## 0.1.0 - 2015-06-01
+
+### Added
+
+- Initial release
+
+### Changed
+
+- Helpers are renamed to templates
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/LICENSE b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/LICENSE
new file mode 100644
index 00000000..8e2c4a0b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 PHP HTTP Team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/README.md b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/README.md
new file mode 100644
index 00000000..4654495a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/README.md
@@ -0,0 +1,36 @@
+# PSR-7 Message Factory
+
+[![Latest Version](https://img.shields.io/github/release/php-http/message-factory.svg?style=flat-square)](https://github.com/php-http/message-factory/releases)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+[![Total Downloads](https://img.shields.io/packagist/dt/php-http/message-factory.svg?style=flat-square)](https://packagist.org/packages/php-http/message-factory)
+
+**Factory interfaces for PSR-7 HTTP Message.**
+
+
+## Install
+
+Via Composer
+
+``` bash
+$ composer require php-http/message-factory
+```
+
+
+## Documentation
+
+Please see the [official documentation](http://php-http.readthedocs.org/en/latest/message-factory/).
+
+
+## Contributing
+
+Please see [CONTRIBUTING](CONTRIBUTING.md) and [CONDUCT](CONDUCT.md) for details.
+
+
+## Security
+
+If you discover any security related issues, please contact us at [security@php-http.org](mailto:security@php-http.org).
+
+
+## License
+
+The MIT License (MIT). Please see [License File](LICENSE) for more information.
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/composer.json b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/composer.json
new file mode 100644
index 00000000..7c72febe
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "php-http/message-factory",
+ "description": "Factory interfaces for PSR-7 HTTP Message",
+ "license": "MIT",
+ "keywords": ["http", "factory", "message", "stream", "uri"],
+ "homepage": "http://php-http.org",
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/puli.json b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/puli.json
new file mode 100644
index 00000000..08d37627
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/puli.json
@@ -0,0 +1,43 @@
+{
+ "version": "1.0",
+ "binding-types": {
+ "Http\\Message\\MessageFactory": {
+ "description": "PSR-7 Message Factory",
+ "parameters": {
+ "depends": {
+ "description": "Optional class dependency which can be checked by consumers"
+ }
+ }
+ },
+ "Http\\Message\\RequestFactory": {
+ "parameters": {
+ "depends": {
+ "description": "Optional class dependency which can be checked by consumers"
+ }
+ }
+ },
+ "Http\\Message\\ResponseFactory": {
+ "parameters": {
+ "depends": {
+ "description": "Optional class dependency which can be checked by consumers"
+ }
+ }
+ },
+ "Http\\Message\\StreamFactory": {
+ "description": "PSR-7 Stream Factory",
+ "parameters": {
+ "depends": {
+ "description": "Optional class dependency which can be checked by consumers"
+ }
+ }
+ },
+ "Http\\Message\\UriFactory": {
+ "description": "PSR-7 URI Factory",
+ "parameters": {
+ "depends": {
+ "description": "Optional class dependency which can be checked by consumers"
+ }
+ }
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/MessageFactory.php b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/MessageFactory.php
new file mode 100644
index 00000000..965aaa80
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/MessageFactory.php
@@ -0,0 +1,12 @@
+
+ */
+interface MessageFactory extends RequestFactory, ResponseFactory
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/RequestFactory.php b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/RequestFactory.php
new file mode 100644
index 00000000..624e82f3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/RequestFactory.php
@@ -0,0 +1,34 @@
+
+ */
+interface RequestFactory
+{
+ /**
+ * Creates a new PSR-7 request.
+ *
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param resource|string|StreamInterface|null $body
+ * @param string $protocolVersion
+ *
+ * @return RequestInterface
+ */
+ public function createRequest(
+ $method,
+ $uri,
+ array $headers = [],
+ $body = null,
+ $protocolVersion = '1.1'
+ );
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/ResponseFactory.php b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/ResponseFactory.php
new file mode 100644
index 00000000..2411ed3a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/ResponseFactory.php
@@ -0,0 +1,35 @@
+
+ */
+interface ResponseFactory
+{
+ /**
+ * Creates a new PSR-7 response.
+ *
+ * @param int $statusCode
+ * @param string|null $reasonPhrase
+ * @param array $headers
+ * @param resource|string|StreamInterface|null $body
+ * @param string $protocolVersion
+ *
+ * @return ResponseInterface
+ */
+ public function createResponse(
+ $statusCode = 200,
+ $reasonPhrase = null,
+ array $headers = [],
+ $body = null,
+ $protocolVersion = '1.1'
+ );
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/StreamFactory.php b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/StreamFactory.php
new file mode 100644
index 00000000..327a902f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/StreamFactory.php
@@ -0,0 +1,25 @@
+
+ */
+interface StreamFactory
+{
+ /**
+ * Creates a new PSR-7 stream.
+ *
+ * @param string|resource|StreamInterface|null $body
+ *
+ * @return StreamInterface
+ *
+ * @throws \InvalidArgumentException If the stream body is invalid.
+ * @throws \RuntimeException If creating the stream from $body fails.
+ */
+ public function createStream($body = null);
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/UriFactory.php b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/UriFactory.php
new file mode 100644
index 00000000..f05e6252
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/php-http/message-factory/src/UriFactory.php
@@ -0,0 +1,24 @@
+
+ */
+interface UriFactory
+{
+ /**
+ * Creates an PSR-7 URI.
+ *
+ * @param string|UriInterface $uri
+ *
+ * @return UriInterface
+ *
+ * @throws \InvalidArgumentException If the $uri argument can not be converted into a valid URI.
+ */
+ public function createUri($uri);
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-client/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/CHANGELOG.md
new file mode 100644
index 00000000..e2dc25f5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1
+
+Allow installation with PHP 8. No code changes.
+
+## 1.0.0
+
+First stable release. No changes since 0.3.0.
+
+## 0.3.0
+
+Added Interface suffix on exceptions
+
+## 0.2.0
+
+All exceptions are in `Psr\Http\Client` namespace
+
+## 0.1.0
+
+First release
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-client/LICENSE b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/LICENSE
new file mode 100644
index 00000000..cd5e0020
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2017 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-client/README.md b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/README.md
new file mode 100644
index 00000000..6876b840
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/README.md
@@ -0,0 +1,12 @@
+HTTP Client
+===========
+
+This repository holds all the common code related to [PSR-18 (HTTP Client)][psr-url].
+
+Note that this is not a HTTP Client implementation of its own. It is merely abstractions that describe the components of a HTTP Client.
+
+The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.
+
+[psr-url]: http://www.php-fig.org/psr/psr-18
+[package-url]: https://packagist.org/packages/psr/http-client
+[implementation-url]: https://packagist.org/providers/psr/http-client-implementation
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-client/composer.json b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/composer.json
new file mode 100644
index 00000000..c195f8ff
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "psr/http-client",
+ "description": "Common interface for HTTP clients",
+ "keywords": ["psr", "psr-18", "http", "http-client"],
+ "homepage": "https://github.com/php-fig/http-client",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-client/src/ClientExceptionInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/src/ClientExceptionInterface.php
new file mode 100644
index 00000000..aa0b9cf1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-client/src/ClientExceptionInterface.php
@@ -0,0 +1,10 @@
+=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-factory/src/RequestFactoryInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/http-factory/src/RequestFactoryInterface.php
new file mode 100644
index 00000000..cb39a08b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-factory/src/RequestFactoryInterface.php
@@ -0,0 +1,18 @@
+=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/MessageInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/MessageInterface.php
new file mode 100644
index 00000000..dd46e5ec
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/MessageInterface.php
@@ -0,0 +1,187 @@
+getHeaders() as $name => $values) {
+ * echo $name . ": " . implode(", ", $values);
+ * }
+ *
+ * // Emit headers iteratively:
+ * foreach ($message->getHeaders() as $name => $values) {
+ * foreach ($values as $value) {
+ * header(sprintf('%s: %s', $name, $value), false);
+ * }
+ * }
+ *
+ * While header names are not case-sensitive, getHeaders() will preserve the
+ * exact case in which headers were originally specified.
+ *
+ * @return string[][] Returns an associative array of the message's headers. Each
+ * key MUST be a header name, and each value MUST be an array of strings
+ * for that header.
+ */
+ public function getHeaders();
+
+ /**
+ * Checks if a header exists by the given case-insensitive name.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return bool Returns true if any header names match the given header
+ * name using a case-insensitive string comparison. Returns false if
+ * no matching header name is found in the message.
+ */
+ public function hasHeader($name);
+
+ /**
+ * Retrieves a message header value by the given case-insensitive name.
+ *
+ * This method returns an array of all the header values of the given
+ * case-insensitive header name.
+ *
+ * If the header does not appear in the message, this method MUST return an
+ * empty array.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string[] An array of string values as provided for the given
+ * header. If the header does not appear in the message, this method MUST
+ * return an empty array.
+ */
+ public function getHeader($name);
+
+ /**
+ * Retrieves a comma-separated string of the values for a single header.
+ *
+ * This method returns all of the header values of the given
+ * case-insensitive header name as a string concatenated together using
+ * a comma.
+ *
+ * NOTE: Not all header values may be appropriately represented using
+ * comma concatenation. For such headers, use getHeader() instead
+ * and supply your own delimiter when concatenating.
+ *
+ * If the header does not appear in the message, this method MUST return
+ * an empty string.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string A string of values as provided for the given header
+ * concatenated together using a comma. If the header does not appear in
+ * the message, this method MUST return an empty string.
+ */
+ public function getHeaderLine($name);
+
+ /**
+ * Return an instance with the provided value replacing the specified header.
+ *
+ * While header names are case-insensitive, the casing of the header will
+ * be preserved by this function, and returned from getHeaders().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new and/or updated header and value.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withHeader($name, $value);
+
+ /**
+ * Return an instance with the specified header appended with the given value.
+ *
+ * Existing values for the specified header will be maintained. The new
+ * value(s) will be appended to the existing list. If the header did not
+ * exist previously, it will be added.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new header and/or value.
+ *
+ * @param string $name Case-insensitive header field name to add.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withAddedHeader($name, $value);
+
+ /**
+ * Return an instance without the specified header.
+ *
+ * Header resolution MUST be done without case-sensitivity.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the named header.
+ *
+ * @param string $name Case-insensitive header field name to remove.
+ * @return static
+ */
+ public function withoutHeader($name);
+
+ /**
+ * Gets the body of the message.
+ *
+ * @return StreamInterface Returns the body as a stream.
+ */
+ public function getBody();
+
+ /**
+ * Return an instance with the specified message body.
+ *
+ * The body MUST be a StreamInterface object.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return a new instance that has the
+ * new body stream.
+ *
+ * @param StreamInterface $body Body.
+ * @return static
+ * @throws \InvalidArgumentException When the body is not valid.
+ */
+ public function withBody(StreamInterface $body);
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/RequestInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/RequestInterface.php
new file mode 100644
index 00000000..a96d4fd6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/RequestInterface.php
@@ -0,0 +1,129 @@
+getQuery()`
+ * or from the `QUERY_STRING` server param.
+ *
+ * @return array
+ */
+ public function getQueryParams();
+
+ /**
+ * Return an instance with the specified query string arguments.
+ *
+ * These values SHOULD remain immutable over the course of the incoming
+ * request. They MAY be injected during instantiation, such as from PHP's
+ * $_GET superglobal, or MAY be derived from some other value such as the
+ * URI. In cases where the arguments are parsed from the URI, the data
+ * MUST be compatible with what PHP's parse_str() would return for
+ * purposes of how duplicate query parameters are handled, and how nested
+ * sets are handled.
+ *
+ * Setting query string arguments MUST NOT change the URI stored by the
+ * request, nor the values in the server params.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated query string arguments.
+ *
+ * @param array $query Array of query string arguments, typically from
+ * $_GET.
+ * @return static
+ */
+ public function withQueryParams(array $query);
+
+ /**
+ * Retrieve normalized file upload data.
+ *
+ * This method returns upload metadata in a normalized tree, with each leaf
+ * an instance of Psr\Http\Message\UploadedFileInterface.
+ *
+ * These values MAY be prepared from $_FILES or the message body during
+ * instantiation, or MAY be injected via withUploadedFiles().
+ *
+ * @return array An array tree of UploadedFileInterface instances; an empty
+ * array MUST be returned if no data is present.
+ */
+ public function getUploadedFiles();
+
+ /**
+ * Create a new instance with the specified uploaded files.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+ * @return static
+ * @throws \InvalidArgumentException if an invalid structure is provided.
+ */
+ public function withUploadedFiles(array $uploadedFiles);
+
+ /**
+ * Retrieve any parameters provided in the request body.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, this method MUST
+ * return the contents of $_POST.
+ *
+ * Otherwise, this method may return any results of deserializing
+ * the request body content; as parsing returns structured content, the
+ * potential types MUST be arrays or objects only. A null value indicates
+ * the absence of body content.
+ *
+ * @return null|array|object The deserialized body parameters, if any.
+ * These will typically be an array or object.
+ */
+ public function getParsedBody();
+
+ /**
+ * Return an instance with the specified body parameters.
+ *
+ * These MAY be injected during instantiation.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, use this method
+ * ONLY to inject the contents of $_POST.
+ *
+ * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+ * deserializing the request body content. Deserialization/parsing returns
+ * structured data, and, as such, this method ONLY accepts arrays or objects,
+ * or a null value if nothing was available to parse.
+ *
+ * As an example, if content negotiation determines that the request data
+ * is a JSON payload, this method could be used to create a request
+ * instance with the deserialized parameters.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param null|array|object $data The deserialized body data. This will
+ * typically be in an array or object.
+ * @return static
+ * @throws \InvalidArgumentException if an unsupported argument type is
+ * provided.
+ */
+ public function withParsedBody($data);
+
+ /**
+ * Retrieve attributes derived from the request.
+ *
+ * The request "attributes" may be used to allow injection of any
+ * parameters derived from the request: e.g., the results of path
+ * match operations; the results of decrypting cookies; the results of
+ * deserializing non-form-encoded message bodies; etc. Attributes
+ * will be application and request specific, and CAN be mutable.
+ *
+ * @return array Attributes derived from the request.
+ */
+ public function getAttributes();
+
+ /**
+ * Retrieve a single derived request attribute.
+ *
+ * Retrieves a single derived request attribute as described in
+ * getAttributes(). If the attribute has not been previously set, returns
+ * the default value as provided.
+ *
+ * This method obviates the need for a hasAttribute() method, as it allows
+ * specifying a default value to return if the attribute is not found.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $default Default value to return if the attribute does not exist.
+ * @return mixed
+ */
+ public function getAttribute($name, $default = null);
+
+ /**
+ * Return an instance with the specified derived request attribute.
+ *
+ * This method allows setting a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $value The value of the attribute.
+ * @return static
+ */
+ public function withAttribute($name, $value);
+
+ /**
+ * Return an instance that removes the specified derived request attribute.
+ *
+ * This method allows removing a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @return static
+ */
+ public function withoutAttribute($name);
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/StreamInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/StreamInterface.php
new file mode 100644
index 00000000..f68f3912
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/http-message/src/StreamInterface.php
@@ -0,0 +1,158 @@
+
+ * [user-info@]host[:port]
+ *
+ *
+ * If the port component is not set or is the standard port for the current
+ * scheme, it SHOULD NOT be included.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2
+ * @return string The URI authority, in "[user-info@]host[:port]" format.
+ */
+ public function getAuthority();
+
+ /**
+ * Retrieve the user information component of the URI.
+ *
+ * If no user information is present, this method MUST return an empty
+ * string.
+ *
+ * If a user is present in the URI, this will return that value;
+ * additionally, if the password is also present, it will be appended to the
+ * user value, with a colon (":") separating the values.
+ *
+ * The trailing "@" character is not part of the user information and MUST
+ * NOT be added.
+ *
+ * @return string The URI user information, in "username[:password]" format.
+ */
+ public function getUserInfo();
+
+ /**
+ * Retrieve the host component of the URI.
+ *
+ * If no host is present, this method MUST return an empty string.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.2.2.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @return string The URI host.
+ */
+ public function getHost();
+
+ /**
+ * Retrieve the port component of the URI.
+ *
+ * If a port is present, and it is non-standard for the current scheme,
+ * this method MUST return it as an integer. If the port is the standard port
+ * used with the current scheme, this method SHOULD return null.
+ *
+ * If no port is present, and no scheme is present, this method MUST return
+ * a null value.
+ *
+ * If no port is present, but a scheme is present, this method MAY return
+ * the standard port for that scheme, but SHOULD return null.
+ *
+ * @return null|int The URI port.
+ */
+ public function getPort();
+
+ /**
+ * Retrieve the path component of the URI.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Normally, the empty path "" and absolute path "/" are considered equal as
+ * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+ * do this normalization because in contexts with a trimmed base path, e.g.
+ * the front controller, this difference becomes significant. It's the task
+ * of the user to handle both "" and "/".
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.3.
+ *
+ * As an example, if the value should include a slash ("/") not intended as
+ * delimiter between path segments, that value MUST be passed in encoded
+ * form (e.g., "%2F") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.3
+ * @return string The URI path.
+ */
+ public function getPath();
+
+ /**
+ * Retrieve the query string of the URI.
+ *
+ * If no query string is present, this method MUST return an empty string.
+ *
+ * The leading "?" character is not part of the query and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.4.
+ *
+ * As an example, if a value in a key/value pair of the query string should
+ * include an ampersand ("&") not intended as a delimiter between values,
+ * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.4
+ * @return string The URI query string.
+ */
+ public function getQuery();
+
+ /**
+ * Retrieve the fragment component of the URI.
+ *
+ * If no fragment is present, this method MUST return an empty string.
+ *
+ * The leading "#" character is not part of the fragment and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.5.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.5
+ * @return string The URI fragment.
+ */
+ public function getFragment();
+
+ /**
+ * Return an instance with the specified scheme.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified scheme.
+ *
+ * Implementations MUST support the schemes "http" and "https" case
+ * insensitively, and MAY accommodate other schemes if required.
+ *
+ * An empty scheme is equivalent to removing the scheme.
+ *
+ * @param string $scheme The scheme to use with the new instance.
+ * @return static A new instance with the specified scheme.
+ * @throws \InvalidArgumentException for invalid or unsupported schemes.
+ */
+ public function withScheme($scheme);
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; an empty string for the user is equivalent to removing user
+ * information.
+ *
+ * @param string $user The user name to use for authority.
+ * @param null|string $password The password associated with $user.
+ * @return static A new instance with the specified user information.
+ */
+ public function withUserInfo($user, $password = null);
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * An empty host value is equivalent to removing the host.
+ *
+ * @param string $host The hostname to use with the new instance.
+ * @return static A new instance with the specified host.
+ * @throws \InvalidArgumentException for invalid hostnames.
+ */
+ public function withHost($host);
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * Implementations MUST raise an exception for ports outside the
+ * established TCP and UDP port ranges.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param null|int $port The port to use with the new instance; a null value
+ * removes the port information.
+ * @return static A new instance with the specified port.
+ * @throws \InvalidArgumentException for invalid ports.
+ */
+ public function withPort($port);
+
+ /**
+ * Return an instance with the specified path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified path.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * If the path is intended to be domain-relative rather than path relative then
+ * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+ * are assumed to be relative to some base path known to the application or
+ * consumer.
+ *
+ * Users can provide both encoded and decoded path characters.
+ * Implementations ensure the correct encoding as outlined in getPath().
+ *
+ * @param string $path The path to use with the new instance.
+ * @return static A new instance with the specified path.
+ * @throws \InvalidArgumentException for invalid paths.
+ */
+ public function withPath($path);
+
+ /**
+ * Return an instance with the specified query string.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified query string.
+ *
+ * Users can provide both encoded and decoded query characters.
+ * Implementations ensure the correct encoding as outlined in getQuery().
+ *
+ * An empty query string value is equivalent to removing the query string.
+ *
+ * @param string $query The query string to use with the new instance.
+ * @return static A new instance with the specified query string.
+ * @throws \InvalidArgumentException for invalid query strings.
+ */
+ public function withQuery($query);
+
+ /**
+ * Return an instance with the specified URI fragment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified URI fragment.
+ *
+ * Users can provide both encoded and decoded fragment characters.
+ * Implementations ensure the correct encoding as outlined in getFragment().
+ *
+ * An empty fragment value is equivalent to removing the fragment.
+ *
+ * @param string $fragment The fragment to use with the new instance.
+ * @return static A new instance with the specified fragment.
+ */
+ public function withFragment($fragment);
+
+ /**
+ * Return the string representation as a URI reference.
+ *
+ * Depending on which components of the URI are present, the resulting
+ * string is either a full URI or relative reference according to RFC 3986,
+ * Section 4.1. The method concatenates the various components of the URI,
+ * using the appropriate delimiters:
+ *
+ * - If a scheme is present, it MUST be suffixed by ":".
+ * - If an authority is present, it MUST be prefixed by "//".
+ * - The path can be concatenated without delimiters. But there are two
+ * cases where the path has to be adjusted to make the URI reference
+ * valid as PHP does not allow to throw an exception in __toString():
+ * - If the path is rootless and an authority is present, the path MUST
+ * be prefixed by "/".
+ * - If the path is starting with more than one "/" and no authority is
+ * present, the starting slashes MUST be reduced to one.
+ * - If a query is present, it MUST be prefixed by "?".
+ * - If a fragment is present, it MUST be prefixed by "#".
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/LICENSE b/wp-content/plugins/wp-webauthn/vendor/psr/log/LICENSE
new file mode 100644
index 00000000..474c952b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/AbstractLogger.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/AbstractLogger.php
new file mode 100644
index 00000000..e02f9daf
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/AbstractLogger.php
@@ -0,0 +1,128 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param mixed[] $context
+ *
+ * @return void
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/InvalidArgumentException.php
new file mode 100644
index 00000000..67f852d1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/InvalidArgumentException.php
@@ -0,0 +1,7 @@
+logger = $logger;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/LoggerInterface.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/LoggerInterface.php
new file mode 100644
index 00000000..2206cfde
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/LoggerInterface.php
@@ -0,0 +1,125 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ *
+ * @throws \Psr\Log\InvalidArgumentException
+ */
+ abstract public function log($level, $message, array $context = array());
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/NullLogger.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/NullLogger.php
new file mode 100644
index 00000000..c8f7293b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/NullLogger.php
@@ -0,0 +1,30 @@
+logger) { }`
+ * blocks.
+ */
+class NullLogger extends AbstractLogger
+{
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ *
+ * @throws \Psr\Log\InvalidArgumentException
+ */
+ public function log($level, $message, array $context = array())
+ {
+ // noop
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/DummyTest.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/DummyTest.php
new file mode 100644
index 00000000..9638c110
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/DummyTest.php
@@ -0,0 +1,18 @@
+ ".
+ *
+ * Example ->error('Foo') would yield "error Foo".
+ *
+ * @return string[]
+ */
+ abstract public function getLogs();
+
+ public function testImplements()
+ {
+ $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
+ }
+
+ /**
+ * @dataProvider provideLevelsAndMessages
+ */
+ public function testLogsAtAllLevels($level, $message)
+ {
+ $logger = $this->getLogger();
+ $logger->{$level}($message, array('user' => 'Bob'));
+ $logger->log($level, $message, array('user' => 'Bob'));
+
+ $expected = array(
+ $level.' message of level '.$level.' with context: Bob',
+ $level.' message of level '.$level.' with context: Bob',
+ );
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function provideLevelsAndMessages()
+ {
+ return array(
+ LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
+ LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
+ LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
+ LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
+ LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
+ LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
+ LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
+ LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
+ );
+ }
+
+ /**
+ * @expectedException \Psr\Log\InvalidArgumentException
+ */
+ public function testThrowsOnInvalidLevel()
+ {
+ $logger = $this->getLogger();
+ $logger->log('invalid level', 'Foo');
+ }
+
+ public function testContextReplacement()
+ {
+ $logger = $this->getLogger();
+ $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
+
+ $expected = array('info {Message {nothing} Bob Bar a}');
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function testObjectCastToString()
+ {
+ if (method_exists($this, 'createPartialMock')) {
+ $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString'));
+ } else {
+ $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
+ }
+ $dummy->expects($this->once())
+ ->method('__toString')
+ ->will($this->returnValue('DUMMY'));
+
+ $this->getLogger()->warning($dummy);
+
+ $expected = array('warning DUMMY');
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function testContextCanContainAnything()
+ {
+ $closed = fopen('php://memory', 'r');
+ fclose($closed);
+
+ $context = array(
+ 'bool' => true,
+ 'null' => null,
+ 'string' => 'Foo',
+ 'int' => 0,
+ 'float' => 0.5,
+ 'nested' => array('with object' => new DummyTest),
+ 'object' => new \DateTime,
+ 'resource' => fopen('php://memory', 'r'),
+ 'closed' => $closed,
+ );
+
+ $this->getLogger()->warning('Crazy context data', $context);
+
+ $expected = array('warning Crazy context data');
+ $this->assertEquals($expected, $this->getLogs());
+ }
+
+ public function testContextExceptionKeyCanBeExceptionOrOtherValues()
+ {
+ $logger = $this->getLogger();
+ $logger->warning('Random message', array('exception' => 'oops'));
+ $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
+
+ $expected = array(
+ 'warning Random message',
+ 'critical Uncaught Exception!'
+ );
+ $this->assertEquals($expected, $this->getLogs());
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/TestLogger.php b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/TestLogger.php
new file mode 100644
index 00000000..1be32304
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/Psr/Log/Test/TestLogger.php
@@ -0,0 +1,147 @@
+ $level,
+ 'message' => $message,
+ 'context' => $context,
+ ];
+
+ $this->recordsByLevel[$record['level']][] = $record;
+ $this->records[] = $record;
+ }
+
+ public function hasRecords($level)
+ {
+ return isset($this->recordsByLevel[$level]);
+ }
+
+ public function hasRecord($record, $level)
+ {
+ if (is_string($record)) {
+ $record = ['message' => $record];
+ }
+ return $this->hasRecordThatPasses(function ($rec) use ($record) {
+ if ($rec['message'] !== $record['message']) {
+ return false;
+ }
+ if (isset($record['context']) && $rec['context'] !== $record['context']) {
+ return false;
+ }
+ return true;
+ }, $level);
+ }
+
+ public function hasRecordThatContains($message, $level)
+ {
+ return $this->hasRecordThatPasses(function ($rec) use ($message) {
+ return strpos($rec['message'], $message) !== false;
+ }, $level);
+ }
+
+ public function hasRecordThatMatches($regex, $level)
+ {
+ return $this->hasRecordThatPasses(function ($rec) use ($regex) {
+ return preg_match($regex, $rec['message']) > 0;
+ }, $level);
+ }
+
+ public function hasRecordThatPasses(callable $predicate, $level)
+ {
+ if (!isset($this->recordsByLevel[$level])) {
+ return false;
+ }
+ foreach ($this->recordsByLevel[$level] as $i => $rec) {
+ if (call_user_func($predicate, $rec, $i)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public function __call($method, $args)
+ {
+ if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
+ $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
+ $level = strtolower($matches[2]);
+ if (method_exists($this, $genericMethod)) {
+ $args[] = $level;
+ return call_user_func_array([$this, $genericMethod], $args);
+ }
+ }
+ throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
+ }
+
+ public function reset()
+ {
+ $this->records = [];
+ $this->recordsByLevel = [];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/README.md b/wp-content/plugins/wp-webauthn/vendor/psr/log/README.md
new file mode 100644
index 00000000..a9f20c43
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/README.md
@@ -0,0 +1,58 @@
+PSR Log
+=======
+
+This repository holds all interfaces/classes/traits related to
+[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).
+
+Note that this is not a logger of its own. It is merely an interface that
+describes a logger. See the specification for more details.
+
+Installation
+------------
+
+```bash
+composer require psr/log
+```
+
+Usage
+-----
+
+If you need a logger, you can use the interface like this:
+
+```php
+logger = $logger;
+ }
+
+ public function doSomething()
+ {
+ if ($this->logger) {
+ $this->logger->info('Doing work');
+ }
+
+ try {
+ $this->doSomethingElse();
+ } catch (Exception $exception) {
+ $this->logger->error('Oh no!', array('exception' => $exception));
+ }
+
+ // do something useful
+ }
+}
+```
+
+You can then pick one of the implementations of the interface to get a logger.
+
+If you want to implement the interface, you can require this package and
+implement `Psr\Log\LoggerInterface` in your code. Please read the
+[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+for details.
diff --git a/wp-content/plugins/wp-webauthn/vendor/psr/log/composer.json b/wp-content/plugins/wp-webauthn/vendor/psr/log/composer.json
new file mode 100644
index 00000000..ca056953
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/psr/log/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "psr/log",
+ "description": "Common interface for logging libraries",
+ "keywords": ["psr", "psr-3", "log"],
+ "homepage": "https://github.com/php-fig/log",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/LICENSE b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/LICENSE
new file mode 100644
index 00000000..ae15f590
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2021 Ben Ramsey
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/README.md b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/README.md
new file mode 100644
index 00000000..9124dd77
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/README.md
@@ -0,0 +1,82 @@
+ramsey/collection
+
+
+ A PHP library for representing and manipulating collections.
+
+
+
+
+## About
+
+ramsey/collection is a PHP library for representing and manipulating collections.
+
+Much inspiration for this library came from the [Java Collections Framework][java].
+
+This project adheres to a [code of conduct](CODE_OF_CONDUCT.md).
+By participating in this project and its community, you are expected to
+uphold this code.
+
+## Installation
+
+Install this package as a dependency using [Composer](https://getcomposer.org).
+
+``` bash
+composer require ramsey/collection
+```
+
+## Usage
+
+Examples of how to use this framework can be found in the
+[Wiki pages](https://github.com/ramsey/collection/wiki/Examples).
+
+## Contributing
+
+Contributions are welcome! Before contributing to this project, familiarize
+yourself with [CONTRIBUTING.md](CONTRIBUTING.md).
+
+To develop this project, you will need [PHP](https://www.php.net) 7.3 or greater
+and [Composer](https://getcomposer.org).
+
+After cloning this repository locally, execute the following commands:
+
+``` bash
+cd /path/to/repository
+composer install
+```
+
+Now, you are ready to develop!
+
+## Coordinated Disclosure
+
+Keeping user information safe and secure is a top priority, and we welcome the
+contribution of external security researchers. If you believe you've found a
+security issue in software that is maintained in this repository, please read
+[SECURITY.md][] for instructions on submitting a vulnerability report.
+
+## ramsey/collection for Enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of ramsey/collection and thousands of other packages are working
+with Tidelift to deliver commercial support and maintenance for the open source
+packages you use to build your applications. Save time, reduce risk, and improve
+code health, while paying the maintainers of the exact packages you use.
+[Learn more.](https://tidelift.com/subscription/pkg/packagist-ramsey-collection?utm_source=undefined&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+
+## Copyright and License
+
+The ramsey/collection library is copyright © [Ben Ramsey](https://benramsey.com)
+and licensed for use under the terms of the
+MIT License (MIT). Please see [LICENSE](LICENSE) for more information.
+
+
+[java]: http://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
+[security.md]: https://github.com/ramsey/collection/blob/master/SECURITY.md
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/SECURITY.md b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/SECURITY.md
new file mode 100644
index 00000000..b052f3b6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/SECURITY.md
@@ -0,0 +1,113 @@
+
+
+# Vulnerability Disclosure Policy
+
+Keeping user information safe and secure is a top priority, and we welcome the
+contribution of external security researchers.
+
+## Scope
+
+If you believe you've found a security issue in software that is maintained in
+this repository, we encourage you to notify us.
+
+| Version | In scope | Source code |
+| :-----: | :------: | :---------- |
+| latest | ✅ | https://github.com/ramsey/collection |
+
+## How to Submit a Report
+
+To submit a vulnerability report, please contact us at .
+Your submission will be reviewed and validated by a member of our team.
+
+## Safe Harbor
+
+We support safe harbor for security researchers who:
+
+* Make a good faith effort to avoid privacy violations, destruction of data, and
+ interruption or degradation of our services.
+* Only interact with accounts you own or with explicit permission of the account
+ holder. If you do encounter Personally Identifiable Information (PII) contact
+ us immediately, do not proceed with access, and immediately purge any local
+ information.
+* Provide us with a reasonable amount of time to resolve vulnerabilities prior
+ to any disclosure to the public or a third-party.
+
+We will consider activities conducted consistent with this policy to constitute
+"authorized" conduct and will not pursue civil action or initiate a complaint to
+law enforcement. We will help to the extent we can if legal action is initiated
+by a third party against you.
+
+Please submit a report to us before engaging in conduct that may be inconsistent
+with or unaddressed by this policy.
+
+## Preferences
+
+* Please provide detailed reports with reproducible steps and a clearly defined
+ impact.
+* Include the version number of the vulnerable package in your report
+* Social engineering (e.g. phishing, vishing, smishing) is prohibited.
+
+## Encryption Key for security@ramsey.dev
+
+For increased privacy when reporting sensitive issues, you may encrypt your
+messages using the following key:
+
+```
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBF+Z9gEBEACbT/pIx8RR0K18t8Z2rDnmEV44YdT7HNsMdq+D6SAlx8UUb6AU
+jGIbV9dgBgGNtOLU1pxloaJwL9bWIRbj+X/Qb2WNIP//Vz1Y40ox1dSpfCUrizXx
+kb4p58Xml0PsB8dg3b4RDUgKwGC37ne5xmDnigyJPbiB2XJ6Xc46oPCjh86XROTK
+wEBB2lY67ClBlSlvC2V9KmbTboRQkLdQDhOaUosMb99zRb0EWqDLaFkZVjY5HI7i
+0pTveE6dI12NfHhTwKjZ5pUiAZQGlKA6J1dMjY2unxHZkQj5MlMfrLSyJHZxccdJ
+xD94T6OTcTHt/XmMpI2AObpewZDdChDQmcYDZXGfAhFoJmbvXsmLMGXKgzKoZ/ls
+RmLsQhh7+/r8E+Pn5r+A6Hh4uAc14ApyEP0ckKeIXw1C6pepHM4E8TEXVr/IA6K/
+z6jlHORixIFX7iNOnfHh+qwOgZw40D6JnBfEzjFi+T2Cy+JzN2uy7I8UnecTMGo3
+5t6astPy6xcH6kZYzFTV7XERR6LIIVyLAiMFd8kF5MbJ8N5ElRFsFHPW+82N2HDX
+c60iSaTB85k6R6xd8JIKDiaKE4sSuw2wHFCKq33d/GamYezp1wO+bVUQg88efljC
+2JNFyD+vl30josqhw1HcmbE1TP3DlYeIL5jQOlxCMsgai6JtTfHFM/5MYwARAQAB
+tBNzZWN1cml0eUByYW1zZXkuZGV2iQJUBBMBCAA+FiEE4drPD+/ofZ570fAYq0bv
+vXQCywIFAl+Z9gECGwMFCQeGH4AFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ
+q0bvvXQCywIkEA//Qcwv8MtTCy01LHZd9c7VslwhNdXQDYymcTyjcYw8x7O22m4B
+3hXE6vqAplFhVxxkqXB2ef0tQuzxhPHNJgkCE4Wq4i+V6qGpaSVHQT2W6DN/NIhL
+vS8OdScc6zddmIbIkSrzVVAtjwehFNEIrX3DnbbbK+Iku7vsKT5EclOluIsjlYoX
+goW8IeReyDBqOe2H3hoCGw6EA0D/NYV2bJnfy53rXVIyarsXXeOLp7eNEH6Td7aW
+PVSrMZJe1t+knrEGnEdrXWzlg4lCJJCtemGv+pKBUomnyISXSdqyoRCCzvQjqyig
+2kRebUX8BXPW33p4OXPj9sIboUOjZwormWwqqbFMO+J4TiVCUoEoheI7emPFRcNN
+QtPJrjbY1++OznBc0GRpfeUkGoU1cbRl1bnepnFIZMTDLkrVW6I1Y4q8ZVwX3BkE
+N81ctFrRpHBlU36EdHvjPQmGtuiL77Qq3fWmMv7yTvK1wHJAXfEb0ZJWHZCbck3w
+l0CVq0Z+UUAOM8Rp1N0N8m92xtapav0qCFU9qzf2J5qX6GRmWv+d29wPgFHzDWBm
+nnrYYIA4wJLx00U6SMcVBSnNe91B+RfGY5XQhbWPjQQecOGCSDsxaFAq2MeOVJyZ
+bIjLYfG9GxoLKr5R7oLRJvZI4nKKBc1Kci/crZbdiSdQhSQGlDz88F1OHeCIdQQQ
+EQgAHRYhBOhdAxHd+lus86YQ57Atl5icjAcbBQJfmfdIAAoJELAtl5icjAcbFVcA
+/1LqB3ZjsnXDAvvAXZVjSPqofSlpMLeRQP6IM/A9Odq0AQCZrtZc1knOMGEcjppK
+Rk+sy/R0Mshy8TDuaZIRgh2Ux7kCDQRfmfYBARAAmchKzzVz7IaEq7PnZDb3szQs
+T/+E9F3m39yOpV4fEB1YzObonFakXNT7Gw2tZEx0eitUMqQ/13jjfu3UdzlKl2bR
+qA8LrSQRhB+PTC9A1XvwxCUYhhjGiLzJ9CZL6hBQB43qHOmE9XJPme90geLsF+gK
+u39Waj1SNWzwGg+Gy1Gl5f2AJoDTxznreCuFGj+Vfaczt/hlfgqpOdb9jsmdoE7t
+3DSWppA9dRHWwQSgE6J28rR4QySBcqyXS6IMykqaJn7Z26yNIaITLnHCZOSY8zhP
+ha7GFsN549EOCgECbrnPt9dmI2+hQE0RO0e7SOBNsIf5sz/i7urhwuj0CbOqhjc2
+X1AEVNFCVcb6HPi/AWefdFCRu0gaWQxn5g+9nkq5slEgvzCCiKYzaBIcr8qR6Hb4
+FaOPVPxO8vndRouq57Ws8XpAwbPttioFuCqF4u9K+tK/8e2/R8QgRYJsE3Cz/Fu8
++pZFpMnqbDEbK3DL3ss+1ed1sky+mDV8qXXeI33XW5hMFnk1JWshUjHNlQmE6ftC
+U0xSTMVUtwJhzH2zDp8lEdu7qi3EsNULOl68ozDr6soWAvCbHPeTdTOnFySGCleG
+/3TonsoZJs/sSPPJnxFQ1DtgQL6EbhIwa0ZwU4eKYVHZ9tjxuMX3teFzRvOrJjgs
++ywGlsIURtEckT5Y6nMAEQEAAYkCPAQYAQgAJhYhBOHazw/v6H2ee9HwGKtG7710
+AssCBQJfmfYBAhsMBQkHhh+AAAoJEKtG7710AssC8NcP/iDAcy1aZFvkA0EbZ85p
+i7/+ywtE/1wF4U4/9OuLcoskqGGnl1pJNPooMOSBCfreoTB8HimT0Fln0CoaOm4Q
+pScNq39JXmf4VxauqUJVARByP6zUfgYarqoaZNeuFF0S4AZJ2HhGzaQPjDz1uKVM
+PE6tQSgQkFzdZ9AtRA4vElTH6yRAgmepUsOihk0b0gUtVnwtRYZ8e0Qt3ie97a73
+DxLgAgedFRUbLRYiT0vNaYbainBsLWKpN/T8odwIg/smP0Khjp/ckV60cZTdBiPR
+szBTPJESMUTu0VPntc4gWwGsmhZJg/Tt/qP08XYo3VxNYBegyuWwNR66zDWvwvGH
+muMv5UchuDxp6Rt3JkIO4voMT1JSjWy9p8krkPEE4V6PxAagLjdZSkt92wVLiK5x
+y5gNrtPhU45YdRAKHr36OvJBJQ42CDaZ6nzrzghcIp9CZ7ANHrI+QLRM/csz+AGA
+szSp6S4mc1lnxxfbOhPPpebZPn0nIAXoZnnoVKdrxBVedPQHT59ZFvKTQ9Fs7gd3
+sYNuc7tJGFGC2CxBH4ANDpOQkc5q9JJ1HSGrXU3juxIiRgfA26Q22S9c71dXjElw
+Ri584QH+bL6kkYmm8xpKF6TVwhwu5xx/jBPrbWqFrtbvLNrnfPoapTihBfdIhkT6
+nmgawbBHA02D5xEqB5SU3WJu
+=eJNx
+-----END PGP PUBLIC KEY BLOCK-----
+```
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/composer.json b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/composer.json
new file mode 100644
index 00000000..98862ee4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/composer.json
@@ -0,0 +1,102 @@
+{
+ "name": "ramsey/collection",
+ "type": "library",
+ "description": "A PHP library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "require": {
+ "php": "^7.3 || ^8",
+ "symfony/polyfill-php81": "^1.23"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "ergebnis/composer-normalize": "^2.6",
+ "fakerphp/faker": "^1.5",
+ "hamcrest/hamcrest-php": "^2",
+ "jangregor/phpstan-prophecy": "^0.8",
+ "mockery/mockery": "^1.3",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1",
+ "phpstan/phpstan": "^0.12.32",
+ "phpstan/phpstan-mockery": "^0.12.5",
+ "phpstan/phpstan-phpunit": "^0.12.11",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "psy/psysh": "^0.10.4",
+ "slevomat/coding-standard": "^6.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.4"
+ },
+ "config": {
+ "sort-packages": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Ramsey\\Console\\": "resources/console/",
+ "Ramsey\\Collection\\Test\\": "tests/",
+ "Ramsey\\Test\\Generics\\": "tests/generics/"
+ },
+ "files": [
+ "vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php"
+ ]
+ },
+ "scripts": {
+ "post-autoload-dump": "captainhook install --ansi -f -s",
+ "dev:analyze": [
+ "@dev:analyze:phpstan",
+ "@dev:analyze:psalm"
+ ],
+ "dev:analyze:phpstan": "phpstan --memory-limit=1G analyse",
+ "dev:analyze:psalm": "psalm --diff --config=psalm.xml",
+ "dev:build:clean": "git clean -fX build/.",
+ "dev:build:clear-cache": "git clean -fX build/cache/.",
+ "dev:lint": "phpcs --cache=build/cache/phpcs.cache",
+ "dev:lint:fix": "./bin/lint-fix.sh",
+ "dev:repl": [
+ "echo ; echo 'Type ./bin/repl to start the REPL.'"
+ ],
+ "dev:test": "phpunit",
+ "dev:test:all": [
+ "@dev:lint",
+ "@dev:analyze",
+ "@dev:test"
+ ],
+ "dev:test:coverage:ci": "phpunit --coverage-clover build/logs/clover.xml",
+ "dev:test:coverage:html": "phpunit --coverage-html build/coverage",
+ "test": "@dev:test:all"
+ },
+ "scripts-descriptions": {
+ "dev:analyze": "Performs static analysis on the code base.",
+ "dev:analyze:phpstan": "Runs the PHPStan static analyzer.",
+ "dev:analyze:psalm": "Runs the Psalm static analyzer.",
+ "dev:build:clean": "Removes everything not under version control from the build directory.",
+ "dev:build:clear-cache": "Removes everything not under version control from build/cache/.",
+ "dev:lint": "Checks all source code for coding standards issues.",
+ "dev:lint:fix": "Checks source code for coding standards issues and fixes them, if possible.",
+ "dev:repl": "Note: Use ./bin/repl to run the REPL.",
+ "dev:test": "Runs the full unit test suite.",
+ "dev:test:all": "Runs linting, static analysis, and unit tests.",
+ "dev:test:coverage:ci": "Runs the unit test suite and generates a Clover coverage report.",
+ "dev:test:coverage:html": "Runs the unit tests suite and generates an HTML coverage report.",
+ "test": "Shortcut to run the full test suite."
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractArray.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractArray.php
new file mode 100644
index 00000000..d72dbe69
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractArray.php
@@ -0,0 +1,209 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use ArrayIterator;
+use Traversable;
+
+use function serialize;
+use function unserialize;
+
+/**
+ * This class provides a basic implementation of `ArrayInterface`, to minimize
+ * the effort required to implement this interface.
+ *
+ * @template T
+ * @implements ArrayInterface
+ */
+abstract class AbstractArray implements ArrayInterface
+{
+ /**
+ * The items of this array.
+ *
+ * @var array
+ */
+ protected $data = [];
+
+ /**
+ * Constructs a new array object.
+ *
+ * @param array $data The initial items to add to this array.
+ */
+ public function __construct(array $data = [])
+ {
+ // Invoke offsetSet() for each value added; in this way, sub-classes
+ // may provide additional logic about values added to the array object.
+ foreach ($data as $key => $value) {
+ $this[$key] = $value;
+ }
+ }
+
+ /**
+ * Returns an iterator for this array.
+ *
+ * @link http://php.net/manual/en/iteratoraggregate.getiterator.php IteratorAggregate::getIterator()
+ *
+ * @return Traversable
+ */
+ public function getIterator(): Traversable
+ {
+ return new ArrayIterator($this->data);
+ }
+
+ /**
+ * Returns `true` if the given offset exists in this array.
+ *
+ * @link http://php.net/manual/en/arrayaccess.offsetexists.php ArrayAccess::offsetExists()
+ *
+ * @param array-key $offset The offset to check.
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->data[$offset]);
+ }
+
+ /**
+ * Returns the value at the specified offset.
+ *
+ * @link http://php.net/manual/en/arrayaccess.offsetget.php ArrayAccess::offsetGet()
+ *
+ * @param array-key $offset The offset for which a value should be returned.
+ *
+ * @return T|null the value stored at the offset, or null if the offset
+ * does not exist.
+ *
+ * @psalm-suppress InvalidAttribute
+ */
+ #[\ReturnTypeWillChange] // phpcs:ignore
+ public function offsetGet($offset)
+ {
+ return $this->data[$offset] ?? null;
+ }
+
+ /**
+ * Sets the given value to the given offset in the array.
+ *
+ * @link http://php.net/manual/en/arrayaccess.offsetset.php ArrayAccess::offsetSet()
+ *
+ * @param array-key|null $offset The offset to set. If `null`, the value may be
+ * set at a numerically-indexed offset.
+ * @param T $value The value to set at the given offset.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ $this->data[] = $value;
+ } else {
+ $this->data[$offset] = $value;
+ }
+ }
+
+ /**
+ * Removes the given offset and its value from the array.
+ *
+ * @link http://php.net/manual/en/arrayaccess.offsetunset.php ArrayAccess::offsetUnset()
+ *
+ * @param array-key $offset The offset to remove from the array.
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->data[$offset]);
+ }
+
+ /**
+ * Returns a serialized string representation of this array object.
+ *
+ * @deprecated The Serializable interface will go away in PHP 9.
+ *
+ * @link http://php.net/manual/en/serializable.serialize.php Serializable::serialize()
+ *
+ * @return string a PHP serialized string.
+ */
+ public function serialize(): string
+ {
+ return serialize($this->data);
+ }
+
+ /**
+ * Returns data suitable for PHP serialization.
+ *
+ * @link https://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.serialize
+ * @link https://www.php.net/serialize
+ *
+ * @return array
+ */
+ public function __serialize(): array
+ {
+ return $this->data;
+ }
+
+ /**
+ * Converts a serialized string representation into an instance object.
+ *
+ * @deprecated The Serializable interface will go away in PHP 9.
+ *
+ * @link http://php.net/manual/en/serializable.unserialize.php Serializable::unserialize()
+ *
+ * @param string $serialized A PHP serialized string to unserialize.
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ */
+ public function unserialize($serialized): void
+ {
+ /** @var array $data */
+ $data = unserialize($serialized, ['allowed_classes' => false]);
+
+ $this->data = $data;
+ }
+
+ /**
+ * Adds unserialized data to the object.
+ *
+ * @param array $data
+ */
+ public function __unserialize(array $data): void
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * Returns the number of items in this array.
+ *
+ * @link http://php.net/manual/en/countable.count.php Countable::count()
+ */
+ public function count(): int
+ {
+ return count($this->data);
+ }
+
+ public function clear(): void
+ {
+ $this->data = [];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function toArray(): array
+ {
+ return $this->data;
+ }
+
+ public function isEmpty(): bool
+ {
+ return count($this->data) === 0;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractCollection.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractCollection.php
new file mode 100644
index 00000000..d2cd1151
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractCollection.php
@@ -0,0 +1,318 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use Closure;
+use Ramsey\Collection\Exception\CollectionMismatchException;
+use Ramsey\Collection\Exception\InvalidArgumentException;
+use Ramsey\Collection\Exception\InvalidSortOrderException;
+use Ramsey\Collection\Exception\OutOfBoundsException;
+use Ramsey\Collection\Tool\TypeTrait;
+use Ramsey\Collection\Tool\ValueExtractorTrait;
+use Ramsey\Collection\Tool\ValueToStringTrait;
+
+use function array_filter;
+use function array_map;
+use function array_merge;
+use function array_search;
+use function array_udiff;
+use function array_uintersect;
+use function current;
+use function end;
+use function in_array;
+use function is_int;
+use function reset;
+use function sprintf;
+use function unserialize;
+use function usort;
+
+/**
+ * This class provides a basic implementation of `CollectionInterface`, to
+ * minimize the effort required to implement this interface
+ *
+ * @template T
+ * @extends AbstractArray
+ * @implements CollectionInterface
+ */
+abstract class AbstractCollection extends AbstractArray implements CollectionInterface
+{
+ use TypeTrait;
+ use ValueToStringTrait;
+ use ValueExtractorTrait;
+
+ /**
+ * @inheritDoc
+ */
+ public function add($element): bool
+ {
+ $this[] = $element;
+
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function contains($element, bool $strict = true): bool
+ {
+ return in_array($element, $this->data, $strict);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($this->checkType($this->getType(), $value) === false) {
+ throw new InvalidArgumentException(
+ 'Value must be of type ' . $this->getType() . '; value is '
+ . $this->toolValueToString($value)
+ );
+ }
+
+ if ($offset === null) {
+ $this->data[] = $value;
+ } else {
+ $this->data[$offset] = $value;
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function remove($element): bool
+ {
+ if (($position = array_search($element, $this->data, true)) !== false) {
+ unset($this->data[$position]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function column(string $propertyOrMethod): array
+ {
+ $temp = [];
+
+ foreach ($this->data as $item) {
+ /** @var mixed $value */
+ $value = $this->extractValue($item, $propertyOrMethod);
+
+ /** @psalm-suppress MixedAssignment */
+ $temp[] = $value;
+ }
+
+ return $temp;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function first()
+ {
+ if ($this->isEmpty()) {
+ throw new OutOfBoundsException('Can\'t determine first item. Collection is empty');
+ }
+
+ reset($this->data);
+
+ /** @var T $first */
+ $first = current($this->data);
+
+ return $first;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function last()
+ {
+ if ($this->isEmpty()) {
+ throw new OutOfBoundsException('Can\'t determine last item. Collection is empty');
+ }
+
+ /** @var T $item */
+ $item = end($this->data);
+ reset($this->data);
+
+ return $item;
+ }
+
+ public function sort(string $propertyOrMethod, string $order = self::SORT_ASC): CollectionInterface
+ {
+ if (!in_array($order, [self::SORT_ASC, self::SORT_DESC], true)) {
+ throw new InvalidSortOrderException('Invalid sort order given: ' . $order);
+ }
+
+ $collection = clone $this;
+
+ usort(
+ $collection->data,
+ /**
+ * @param T $a
+ * @param T $b
+ */
+ function ($a, $b) use ($propertyOrMethod, $order): int {
+ /** @var mixed $aValue */
+ $aValue = $this->extractValue($a, $propertyOrMethod);
+
+ /** @var mixed $bValue */
+ $bValue = $this->extractValue($b, $propertyOrMethod);
+
+ return ($aValue <=> $bValue) * ($order === self::SORT_DESC ? -1 : 1);
+ }
+ );
+
+ return $collection;
+ }
+
+ public function filter(callable $callback): CollectionInterface
+ {
+ $collection = clone $this;
+ $collection->data = array_merge([], array_filter($collection->data, $callback));
+
+ return $collection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function where(string $propertyOrMethod, $value): CollectionInterface
+ {
+ return $this->filter(function ($item) use ($propertyOrMethod, $value) {
+ /** @var mixed $accessorValue */
+ $accessorValue = $this->extractValue($item, $propertyOrMethod);
+
+ return $accessorValue === $value;
+ });
+ }
+
+ public function map(callable $callback): CollectionInterface
+ {
+ return new Collection('mixed', array_map($callback, $this->data));
+ }
+
+ public function diff(CollectionInterface $other): CollectionInterface
+ {
+ $this->compareCollectionTypes($other);
+
+ $diffAtoB = array_udiff($this->data, $other->toArray(), $this->getComparator());
+ $diffBtoA = array_udiff($other->toArray(), $this->data, $this->getComparator());
+
+ /** @var array $diff */
+ $diff = array_merge($diffAtoB, $diffBtoA);
+
+ $collection = clone $this;
+ $collection->data = $diff;
+
+ return $collection;
+ }
+
+ public function intersect(CollectionInterface $other): CollectionInterface
+ {
+ $this->compareCollectionTypes($other);
+
+ /** @var array $intersect */
+ $intersect = array_uintersect($this->data, $other->toArray(), $this->getComparator());
+
+ $collection = clone $this;
+ $collection->data = $intersect;
+
+ return $collection;
+ }
+
+ public function merge(CollectionInterface ...$collections): CollectionInterface
+ {
+ $mergedCollection = clone $this;
+
+ foreach ($collections as $index => $collection) {
+ if (!$collection instanceof static) {
+ throw new CollectionMismatchException(
+ sprintf('Collection with index %d must be of type %s', $index, static::class)
+ );
+ }
+
+ // When using generics (Collection.php, Set.php, etc),
+ // we also need to make sure that the internal types match each other
+ if ($collection->getType() !== $this->getType()) {
+ throw new CollectionMismatchException(
+ sprintf('Collection items in collection with index %d must be of type %s', $index, $this->getType())
+ );
+ }
+
+ foreach ($collection as $key => $value) {
+ if (is_int($key)) {
+ $mergedCollection[] = $value;
+ } else {
+ $mergedCollection[$key] = $value;
+ }
+ }
+ }
+
+ return $mergedCollection;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function unserialize($serialized): void
+ {
+ /** @var array $data */
+ $data = unserialize($serialized, ['allowed_classes' => [$this->getType()]]);
+
+ $this->data = $data;
+ }
+
+ /**
+ * @param CollectionInterface $other
+ */
+ private function compareCollectionTypes(CollectionInterface $other): void
+ {
+ if (!$other instanceof static) {
+ throw new CollectionMismatchException('Collection must be of type ' . static::class);
+ }
+
+ // When using generics (Collection.php, Set.php, etc),
+ // we also need to make sure that the internal types match each other
+ if ($other->getType() !== $this->getType()) {
+ throw new CollectionMismatchException('Collection items must be of type ' . $this->getType());
+ }
+ }
+
+ private function getComparator(): Closure
+ {
+ return /**
+ * @param T $a
+ * @param T $b
+ */
+ function ($a, $b): int {
+ // If the two values are object, we convert them to unique scalars.
+ // If the collection contains mixed values (unlikely) where some are objects
+ // and some are not, we leave them as they are.
+ // The comparator should still work and the result of $a < $b should
+ // be consistent but unpredictable since not documented.
+ if (is_object($a) && is_object($b)) {
+ $a = spl_object_id($a);
+ $b = spl_object_id($b);
+ }
+
+ return $a === $b ? 0 : ($a < $b ? 1 : -1);
+ };
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractSet.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractSet.php
new file mode 100644
index 00000000..1126ccb0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/AbstractSet.php
@@ -0,0 +1,50 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+/**
+ * This class contains the basic implementation of a collection that does not
+ * allow duplicated values (a set), to minimize the effort required to implement
+ * this specific type of collection.
+ *
+ * @template T
+ * @extends AbstractCollection
+ */
+abstract class AbstractSet extends AbstractCollection
+{
+ /**
+ * @inheritDoc
+ */
+ public function add($element): bool
+ {
+ if ($this->contains($element)) {
+ return false;
+ }
+
+ return parent::add($element);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($this->contains($value)) {
+ return;
+ }
+
+ parent::offsetSet($offset, $value);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/ArrayInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/ArrayInterface.php
new file mode 100644
index 00000000..27af6102
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/ArrayInterface.php
@@ -0,0 +1,51 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use ArrayAccess;
+use Countable;
+use IteratorAggregate;
+use Serializable;
+
+/**
+ * `ArrayInterface` provides traversable array functionality to data types.
+ *
+ * @template T
+ * @extends ArrayAccess
+ * @extends IteratorAggregate
+ */
+interface ArrayInterface extends
+ ArrayAccess,
+ Countable,
+ IteratorAggregate,
+ Serializable
+{
+ /**
+ * Removes all items from this array.
+ */
+ public function clear(): void;
+
+ /**
+ * Returns a native PHP array representation of this array object.
+ *
+ * @return array
+ */
+ public function toArray(): array;
+
+ /**
+ * Returns `true` if this array is empty.
+ */
+ public function isEmpty(): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Collection.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Collection.php
new file mode 100644
index 00000000..1299c12c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Collection.php
@@ -0,0 +1,106 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+/**
+ * A collection represents a group of objects.
+ *
+ * Each object in the collection is of a specific, defined type.
+ *
+ * This is a direct implementation of `CollectionInterface`, provided for
+ * the sake of convenience.
+ *
+ * Example usage:
+ *
+ * ``` php
+ * $collection = new \Ramsey\Collection\Collection('My\\Foo');
+ * $collection->add(new \My\Foo());
+ * $collection->add(new \My\Foo());
+ *
+ * foreach ($collection as $foo) {
+ * // Do something with $foo
+ * }
+ * ```
+ *
+ * It is preferable to subclass `AbstractCollection` to create your own typed
+ * collections. For example:
+ *
+ * ``` php
+ * namespace My\Foo;
+ *
+ * class FooCollection extends \Ramsey\Collection\AbstractCollection
+ * {
+ * public function getType()
+ * {
+ * return 'My\\Foo';
+ * }
+ * }
+ * ```
+ *
+ * And then use it similarly to the earlier example:
+ *
+ * ``` php
+ * $fooCollection = new \My\Foo\FooCollection();
+ * $fooCollection->add(new \My\Foo());
+ * $fooCollection->add(new \My\Foo());
+ *
+ * foreach ($fooCollection as $foo) {
+ * // Do something with $foo
+ * }
+ * ```
+ *
+ * The benefit with this approach is that you may do type-checking on the
+ * collection object:
+ *
+ * ``` php
+ * if ($collection instanceof \My\Foo\FooCollection) {
+ * // the collection is a collection of My\Foo objects
+ * }
+ * ```
+ *
+ * @template T
+ * @extends AbstractCollection
+ */
+class Collection extends AbstractCollection
+{
+ /**
+ * The type of elements stored in this collection.
+ *
+ * A collection's type is immutable once it is set. For this reason, this
+ * property is set private.
+ *
+ * @var string
+ */
+ private $collectionType;
+
+ /**
+ * Constructs a collection object of the specified type, optionally with the
+ * specified data.
+ *
+ * @param string $collectionType The type (FQCN) associated with this
+ * collection.
+ * @param array $data The initial items to store in the collection.
+ */
+ public function __construct(string $collectionType, array $data = [])
+ {
+ $this->collectionType = $collectionType;
+ parent::__construct($data);
+ }
+
+ public function getType(): string
+ {
+ return $this->collectionType;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/CollectionInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/CollectionInterface.php
new file mode 100644
index 00000000..aa86feb0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/CollectionInterface.php
@@ -0,0 +1,205 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+/**
+ * A collection represents a group of objects, known as its elements.
+ *
+ * Some collections allow duplicate elements and others do not. Some are ordered
+ * and others unordered.
+ *
+ * @template T
+ * @extends ArrayInterface
+ */
+interface CollectionInterface extends ArrayInterface
+{
+ /**
+ * Ascending sort type.
+ */
+ public const SORT_ASC = 'asc';
+
+ /**
+ * Descending sort type.
+ */
+ public const SORT_DESC = 'desc';
+
+ /**
+ * Ensures that this collection contains the specified element (optional
+ * operation).
+ *
+ * Returns `true` if this collection changed as a result of the call.
+ * (Returns `false` if this collection does not permit duplicates and
+ * already contains the specified element.)
+ *
+ * Collections that support this operation may place limitations on what
+ * elements may be added to this collection. In particular, some
+ * collections will refuse to add `null` elements, and others will impose
+ * restrictions on the type of elements that may be added. Collection
+ * classes should clearly specify in their documentation any restrictions
+ * on what elements may be added.
+ *
+ * If a collection refuses to add a particular element for any reason other
+ * than that it already contains the element, it must throw an exception
+ * (rather than returning `false`). This preserves the invariant that a
+ * collection always contains the specified element after this call returns.
+ *
+ * @param T $element The element to add to the collection.
+ *
+ * @return bool `true` if this collection changed as a result of the call.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function add($element): bool;
+
+ /**
+ * Returns `true` if this collection contains the specified element.
+ *
+ * @param T $element The element to check whether the collection contains.
+ * @param bool $strict Whether to perform a strict type check on the value.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function contains($element, bool $strict = true): bool;
+
+ /**
+ * Returns the type associated with this collection.
+ */
+ public function getType(): string;
+
+ /**
+ * Removes a single instance of the specified element from this collection,
+ * if it is present.
+ *
+ * @param T $element The element to remove from the collection.
+ *
+ * @return bool `true` if an element was removed as a result of this call.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function remove($element): bool;
+
+ /**
+ * Returns the values from the given property or method.
+ *
+ * @param string $propertyOrMethod The property or method name to filter by.
+ *
+ * @return list
+ */
+ public function column(string $propertyOrMethod): array;
+
+ /**
+ * Returns the first item of the collection.
+ *
+ * @return T
+ */
+ public function first();
+
+ /**
+ * Returns the last item of the collection.
+ *
+ * @return T
+ */
+ public function last();
+
+ /**
+ * Sort the collection by a property or method with the given sort order.
+ *
+ * This will always leave the original collection untouched and will return
+ * a new one.
+ *
+ * @param string $propertyOrMethod The property or method to sort by.
+ * @param string $order The sort order for the resulting collection (one of
+ * this interface's `SORT_*` constants).
+ *
+ * @return CollectionInterface
+ */
+ public function sort(string $propertyOrMethod, string $order = self::SORT_ASC): self;
+
+ /**
+ * Filter out items of the collection which don't match the criteria of
+ * given callback.
+ *
+ * This will always leave the original collection untouched and will return
+ * a new one.
+ *
+ * See the {@link http://php.net/manual/en/function.array-filter.php PHP array_filter() documentation}
+ * for examples of how the `$callback` parameter works.
+ *
+ * @param callable(T):bool $callback A callable to use for filtering elements.
+ *
+ * @return CollectionInterface
+ */
+ public function filter(callable $callback): self;
+
+ /**
+ * Create a new collection where items match the criteria of given callback.
+ *
+ * This will always leave the original collection untouched and will return
+ * a new one.
+ *
+ * @param string $propertyOrMethod The property or method to evaluate.
+ * @param mixed $value The value to match.
+ *
+ * @return CollectionInterface
+ */
+ public function where(string $propertyOrMethod, $value): self;
+
+ /**
+ * Apply a given callback method on each item of the collection.
+ *
+ * This will always leave the original collection untouched. The new
+ * collection is created by mapping the callback to each item of the
+ * original collection.
+ *
+ * See the {@link http://php.net/manual/en/function.array-map.php PHP array_map() documentation}
+ * for examples of how the `$callback` parameter works.
+ *
+ * @param callable(T):TCallbackReturn $callback A callable to apply to each
+ * item of the collection.
+ *
+ * @return CollectionInterface
+ *
+ * @template TCallbackReturn
+ */
+ public function map(callable $callback): self;
+
+ /**
+ * Create a new collection with divergent items between current and given
+ * collection.
+ *
+ * @param CollectionInterface $other The collection to check for divergent
+ * items.
+ *
+ * @return CollectionInterface
+ */
+ public function diff(CollectionInterface $other): self;
+
+ /**
+ * Create a new collection with intersecting item between current and given
+ * collection.
+ *
+ * @param CollectionInterface $other The collection to check for
+ * intersecting items.
+ *
+ * @return CollectionInterface
+ */
+ public function intersect(CollectionInterface $other): self;
+
+ /**
+ * Merge current items and items of given collections into a new one.
+ *
+ * @param CollectionInterface ...$collections The collections to merge.
+ *
+ * @return CollectionInterface
+ */
+ public function merge(CollectionInterface ...$collections): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueue.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueue.php
new file mode 100644
index 00000000..c9c59502
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueue.php
@@ -0,0 +1,187 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use Ramsey\Collection\Exception\InvalidArgumentException;
+use Ramsey\Collection\Exception\NoSuchElementException;
+
+/**
+ * This class provides a basic implementation of `DoubleEndedQueueInterface`, to
+ * minimize the effort required to implement this interface.
+ *
+ * @template T
+ * @extends Queue
+ * @implements DoubleEndedQueueInterface
+ */
+class DoubleEndedQueue extends Queue implements DoubleEndedQueueInterface
+{
+ /**
+ * Index of the last element in the queue.
+ *
+ * @var int
+ */
+ private $tail = -1;
+
+ /**
+ * @inheritDoc
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($this->checkType($this->getType(), $value) === false) {
+ throw new InvalidArgumentException(
+ 'Value must be of type ' . $this->getType() . '; value is '
+ . $this->toolValueToString($value)
+ );
+ }
+
+ $this->tail++;
+
+ $this->data[$this->tail] = $value;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function addFirst($element): bool
+ {
+ if ($this->checkType($this->getType(), $element) === false) {
+ throw new InvalidArgumentException(
+ 'Value must be of type ' . $this->getType() . '; value is '
+ . $this->toolValueToString($element)
+ );
+ }
+
+ $this->index--;
+
+ $this->data[$this->index] = $element;
+
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function addLast($element): bool
+ {
+ return $this->add($element);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offerFirst($element): bool
+ {
+ try {
+ return $this->addFirst($element);
+ } catch (InvalidArgumentException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offerLast($element): bool
+ {
+ return $this->offer($element);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function removeFirst()
+ {
+ return $this->remove();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function removeLast()
+ {
+ $tail = $this->pollLast();
+
+ if ($tail === null) {
+ throw new NoSuchElementException('Can\'t return element from Queue. Queue is empty.');
+ }
+
+ return $tail;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function pollFirst()
+ {
+ return $this->poll();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function pollLast()
+ {
+ if ($this->count() === 0) {
+ return null;
+ }
+
+ $tail = $this[$this->tail];
+
+ unset($this[$this->tail]);
+ $this->tail--;
+
+ return $tail;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function firstElement()
+ {
+ return $this->element();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function lastElement()
+ {
+ if ($this->count() === 0) {
+ throw new NoSuchElementException('Can\'t return element from Queue. Queue is empty.');
+ }
+
+ return $this->data[$this->tail];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function peekFirst()
+ {
+ return $this->peek();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function peekLast()
+ {
+ if ($this->count() === 0) {
+ return null;
+ }
+
+ return $this->data[$this->tail];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueueInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueueInterface.php
new file mode 100644
index 00000000..d7df5346
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/DoubleEndedQueueInterface.php
@@ -0,0 +1,316 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use Ramsey\Collection\Exception\NoSuchElementException;
+
+/**
+ * A linear collection that supports element insertion and removal at both ends.
+ *
+ * Most `DoubleEndedQueueInterface` implementations place no fixed limits on the
+ * number of elements they may contain, but this interface supports
+ * capacity-restricted double-ended queues as well as those with no fixed size
+ * limit.
+ *
+ * This interface defines methods to access the elements at both ends of the
+ * double-ended queue. Methods are provided to insert, remove, and examine the
+ * element. Each of these methods exists in two forms: one throws an exception
+ * if the operation fails, the other returns a special value (either `null` or
+ * `false`, depending on the operation). The latter form of the insert operation
+ * is designed specifically for use with capacity-restricted implementations; in
+ * most implementations, insert operations cannot fail.
+ *
+ * The twelve methods described above are summarized in the following table:
+ *
+ *
+ * Summary of DoubleEndedQueueInterface methods
+ *
+ *
+ *
+ * First Element (Head)
+ * Last Element (Tail)
+ *
+ *
+ *
+ * Throws exception
+ * Special value
+ * Throws exception
+ * Special value
+ *
+ *
+ *
+ *
+ * Insert
+ * addFirst()
+ * offerFirst()
+ * addLast()
+ * offerLast()
+ *
+ *
+ * Remove
+ * removeFirst()
+ * pollFirst()
+ * removeLast()
+ * pollLast()
+ *
+ *
+ * Examine
+ * firstElement()
+ * peekFirst()
+ * lastElement()
+ * peekLast()
+ *
+ *
+ *
+ *
+ * This interface extends the `QueueInterface`. When a double-ended queue is
+ * used as a queue, FIFO (first-in-first-out) behavior results. Elements are
+ * added at the end of the double-ended queue and removed from the beginning.
+ * The methods inherited from the `QueueInterface` are precisely equivalent to
+ * `DoubleEndedQueueInterface` methods as indicated in the following table:
+ *
+ *
+ * Comparison of QueueInterface and DoubleEndedQueueInterface methods
+ *
+ *
+ * QueueInterface Method
+ * DoubleEndedQueueInterface Method
+ *
+ *
+ *
+ *
+ * add()
+ * addLast()
+ *
+ *
+ * offer()
+ * offerLast()
+ *
+ *
+ * remove()
+ * removeFirst()
+ *
+ *
+ * poll()
+ * pollFirst()
+ *
+ *
+ * element()
+ * firstElement()
+ *
+ *
+ * peek()
+ * peekFirst()
+ *
+ *
+ *
+ *
+ * Double-ended queues can also be used as LIFO (last-in-first-out) stacks. When
+ * a double-ended queue is used as a stack, elements are pushed and popped from
+ * the beginning of the double-ended queue. Stack concepts are precisely
+ * equivalent to `DoubleEndedQueueInterface` methods as indicated in the table
+ * below:
+ *
+ *
+ * Comparison of stack concepts and DoubleEndedQueueInterface methods
+ *
+ *
+ * Stack concept
+ * DoubleEndedQueueInterface Method
+ *
+ *
+ *
+ *
+ * push
+ * addFirst()
+ *
+ *
+ * pop
+ * removeFirst()
+ *
+ *
+ * peek
+ * peekFirst()
+ *
+ *
+ *
+ *
+ * Note that the `peek()` method works equally well when a double-ended queue is
+ * used as a queue or a stack; in either case, elements are drawn from the
+ * beginning of the double-ended queue.
+ *
+ * While `DoubleEndedQueueInterface` implementations are not strictly required
+ * to prohibit the insertion of `null` elements, they are strongly encouraged to
+ * do so. Users of any `DoubleEndedQueueInterface` implementations that do allow
+ * `null` elements are strongly encouraged *not* to take advantage of the
+ * ability to insert nulls. This is so because `null` is used as a special
+ * return value by various methods to indicated that the double-ended queue is
+ * empty.
+ *
+ * @template T
+ * @extends QueueInterface
+ */
+interface DoubleEndedQueueInterface extends QueueInterface
+{
+ /**
+ * Inserts the specified element at the front of this queue if it is
+ * possible to do so immediately without violating capacity restrictions.
+ *
+ * When using a capacity-restricted double-ended queue, it is generally
+ * preferable to use the `offerFirst()` method.
+ *
+ * @param T $element The element to add to the front of this queue.
+ *
+ * @return bool `true` if this queue changed as a result of the call.
+ *
+ * @throws \RuntimeException if a queue refuses to add a particular element
+ * for any reason other than that it already contains the element.
+ * Implementations should use a more-specific exception that extends
+ * `\RuntimeException`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function addFirst($element): bool;
+
+ /**
+ * Inserts the specified element at the end of this queue if it is possible
+ * to do so immediately without violating capacity restrictions.
+ *
+ * When using a capacity-restricted double-ended queue, it is generally
+ * preferable to use the `offerLast()` method.
+ *
+ * This method is equivalent to `add()`.
+ *
+ * @param T $element The element to add to the end of this queue.
+ *
+ * @return bool `true` if this queue changed as a result of the call.
+ *
+ * @throws \RuntimeException if a queue refuses to add a particular element
+ * for any reason other than that it already contains the element.
+ * Implementations should use a more-specific exception that extends
+ * `\RuntimeException`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function addLast($element): bool;
+
+ /**
+ * Inserts the specified element at the front of this queue if it is
+ * possible to do so immediately without violating capacity restrictions.
+ *
+ * When using a capacity-restricted queue, this method is generally
+ * preferable to `addFirst()`, which can fail to insert an element only by
+ * throwing an exception.
+ *
+ * @param T $element The element to add to the front of this queue.
+ *
+ * @return bool `true` if the element was added to this queue, else `false`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function offerFirst($element): bool;
+
+ /**
+ * Inserts the specified element at the end of this queue if it is possible
+ * to do so immediately without violating capacity restrictions.
+ *
+ * When using a capacity-restricted queue, this method is generally
+ * preferable to `addLast()` which can fail to insert an element only by
+ * throwing an exception.
+ *
+ * @param T $element The element to add to the end of this queue.
+ *
+ * @return bool `true` if the element was added to this queue, else `false`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function offerLast($element): bool;
+
+ /**
+ * Retrieves and removes the head of this queue.
+ *
+ * This method differs from `pollFirst()` only in that it throws an
+ * exception if this queue is empty.
+ *
+ * @return T the first element in this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function removeFirst();
+
+ /**
+ * Retrieves and removes the tail of this queue.
+ *
+ * This method differs from `pollLast()` only in that it throws an exception
+ * if this queue is empty.
+ *
+ * @return T the last element in this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function removeLast();
+
+ /**
+ * Retrieves and removes the head of this queue, or returns `null` if this
+ * queue is empty.
+ *
+ * @return T|null the head of this queue, or `null` if this queue is empty.
+ */
+ public function pollFirst();
+
+ /**
+ * Retrieves and removes the tail of this queue, or returns `null` if this
+ * queue is empty.
+ *
+ * @return T|null the tail of this queue, or `null` if this queue is empty.
+ */
+ public function pollLast();
+
+ /**
+ * Retrieves, but does not remove, the head of this queue.
+ *
+ * This method differs from `peekFirst()` only in that it throws an
+ * exception if this queue is empty.
+ *
+ * @return T the head of this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function firstElement();
+
+ /**
+ * Retrieves, but does not remove, the tail of this queue.
+ *
+ * This method differs from `peekLast()` only in that it throws an exception
+ * if this queue is empty.
+ *
+ * @return T the tail of this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function lastElement();
+
+ /**
+ * Retrieves, but does not remove, the head of this queue, or returns `null`
+ * if this queue is empty.
+ *
+ * @return T|null the head of this queue, or `null` if this queue is empty.
+ */
+ public function peekFirst();
+
+ /**
+ * Retrieves, but does not remove, the tail of this queue, or returns `null`
+ * if this queue is empty.
+ *
+ * @return T|null the tail of this queue, or `null` if this queue is empty.
+ */
+ public function peekLast();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/CollectionMismatchException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/CollectionMismatchException.php
new file mode 100644
index 00000000..d4b335f4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/CollectionMismatchException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown when attempting to operate on collections of differing types.
+ */
+class CollectionMismatchException extends \RuntimeException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidArgumentException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidArgumentException.php
new file mode 100644
index 00000000..dcc3eac6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidArgumentException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown to indicate an argument is not of the expected type.
+ */
+class InvalidArgumentException extends \InvalidArgumentException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidSortOrderException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidSortOrderException.php
new file mode 100644
index 00000000..9337ccc6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/InvalidSortOrderException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown when attempting to use a sort order that is not recognized.
+ */
+class InvalidSortOrderException extends \RuntimeException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/NoSuchElementException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/NoSuchElementException.php
new file mode 100644
index 00000000..9debe8f6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/NoSuchElementException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown when attempting to access an element that does not exist.
+ */
+class NoSuchElementException extends \RuntimeException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/OutOfBoundsException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/OutOfBoundsException.php
new file mode 100644
index 00000000..4e9d16fa
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/OutOfBoundsException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown when attempting to access an element out of the range of the collection.
+ */
+class OutOfBoundsException extends \OutOfBoundsException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/UnsupportedOperationException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/UnsupportedOperationException.php
new file mode 100644
index 00000000..8f45e583
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/UnsupportedOperationException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown to indicate that the requested operation is not supported.
+ */
+class UnsupportedOperationException extends \RuntimeException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/ValueExtractionException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/ValueExtractionException.php
new file mode 100644
index 00000000..f6c6cb4e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Exception/ValueExtractionException.php
@@ -0,0 +1,22 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Exception;
+
+/**
+ * Thrown when attempting to extract a value for a method or property that does not exist.
+ */
+class ValueExtractionException extends \RuntimeException
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/GenericArray.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/GenericArray.php
new file mode 100644
index 00000000..2b079aa5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/GenericArray.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+/**
+ * `GenericArray` represents a standard array object.
+ *
+ * @extends AbstractArray
+ */
+class GenericArray extends AbstractArray
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractMap.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractMap.php
new file mode 100644
index 00000000..ae9f2fe6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractMap.php
@@ -0,0 +1,162 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+use Ramsey\Collection\AbstractArray;
+use Ramsey\Collection\Exception\InvalidArgumentException;
+
+use function array_key_exists;
+use function array_keys;
+use function in_array;
+
+/**
+ * This class provides a basic implementation of `MapInterface`, to minimize the
+ * effort required to implement this interface.
+ *
+ * @template T
+ * @extends AbstractArray
+ * @implements MapInterface
+ */
+abstract class AbstractMap extends AbstractArray implements MapInterface
+{
+ /**
+ * @inheritDoc
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ throw new InvalidArgumentException(
+ 'Map elements are key/value pairs; a key must be provided for '
+ . 'value ' . var_export($value, true)
+ );
+ }
+
+ $this->data[$offset] = $value;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function containsKey($key): bool
+ {
+ return array_key_exists($key, $this->data);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function containsValue($value): bool
+ {
+ return in_array($value, $this->data, true);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function keys(): array
+ {
+ return array_keys($this->data);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function get($key, $defaultValue = null)
+ {
+ if (!$this->containsKey($key)) {
+ return $defaultValue;
+ }
+
+ return $this[$key];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function put($key, $value)
+ {
+ $previousValue = $this->get($key);
+ $this[$key] = $value;
+
+ return $previousValue;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function putIfAbsent($key, $value)
+ {
+ $currentValue = $this->get($key);
+
+ if ($currentValue === null) {
+ $this[$key] = $value;
+ }
+
+ return $currentValue;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function remove($key)
+ {
+ $previousValue = $this->get($key);
+ unset($this[$key]);
+
+ return $previousValue;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function removeIf($key, $value): bool
+ {
+ if ($this->get($key) === $value) {
+ unset($this[$key]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function replace($key, $value)
+ {
+ $currentValue = $this->get($key);
+
+ if ($this->containsKey($key)) {
+ $this[$key] = $value;
+ }
+
+ return $currentValue;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function replaceIf($key, $oldValue, $newValue): bool
+ {
+ if ($this->get($key) === $oldValue) {
+ $this[$key] = $newValue;
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractTypedMap.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractTypedMap.php
new file mode 100644
index 00000000..551d2e6c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AbstractTypedMap.php
@@ -0,0 +1,69 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+use Ramsey\Collection\Exception\InvalidArgumentException;
+use Ramsey\Collection\Tool\TypeTrait;
+use Ramsey\Collection\Tool\ValueToStringTrait;
+
+/**
+ * This class provides a basic implementation of `TypedMapInterface`, to
+ * minimize the effort required to implement this interface.
+ *
+ * @template K
+ * @template T
+ * @extends AbstractMap
+ * @implements TypedMapInterface
+ */
+abstract class AbstractTypedMap extends AbstractMap implements TypedMapInterface
+{
+ use TypeTrait;
+ use ValueToStringTrait;
+
+ /**
+ * @param K|null $offset
+ * @param T $value
+ *
+ * @inheritDoc
+ *
+ * @psalm-suppress MoreSpecificImplementedParamType
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ throw new InvalidArgumentException(
+ 'Map elements are key/value pairs; a key must be provided for '
+ . 'value ' . var_export($value, true)
+ );
+ }
+
+ if ($this->checkType($this->getKeyType(), $offset) === false) {
+ throw new InvalidArgumentException(
+ 'Key must be of type ' . $this->getKeyType() . '; key is '
+ . $this->toolValueToString($offset)
+ );
+ }
+
+ if ($this->checkType($this->getValueType(), $value) === false) {
+ throw new InvalidArgumentException(
+ 'Value must be of type ' . $this->getValueType() . '; value is '
+ . $this->toolValueToString($value)
+ );
+ }
+
+ /** @psalm-suppress MixedArgumentTypeCoercion */
+ parent::offsetSet($offset, $value);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AssociativeArrayMap.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AssociativeArrayMap.php
new file mode 100644
index 00000000..79a314d9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/AssociativeArrayMap.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+/**
+ * `AssociativeArrayMap` represents a standard associative array object.
+ *
+ * @template T
+ * @extends AbstractMap
+ */
+class AssociativeArrayMap extends AbstractMap
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/MapInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/MapInterface.php
new file mode 100644
index 00000000..6ed0b296
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/MapInterface.php
@@ -0,0 +1,149 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+use Ramsey\Collection\ArrayInterface;
+
+/**
+ * An object that maps keys to values.
+ *
+ * A map cannot contain duplicate keys; each key can map to at most one value.
+ *
+ * @template T
+ * @extends ArrayInterface
+ */
+interface MapInterface extends ArrayInterface
+{
+ /**
+ * Returns `true` if this map contains a mapping for the specified key.
+ *
+ * @param array-key $key The key to check in the map.
+ */
+ public function containsKey($key): bool;
+
+ /**
+ * Returns `true` if this map maps one or more keys to the specified value.
+ *
+ * This performs a strict type check on the value.
+ *
+ * @param T $value The value to check in the map.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function containsValue($value): bool;
+
+ /**
+ * Return an array of the keys contained in this map.
+ *
+ * @return list
+ */
+ public function keys(): array;
+
+ /**
+ * Returns the value to which the specified key is mapped, `null` if this
+ * map contains no mapping for the key, or (optionally) `$defaultValue` if
+ * this map contains no mapping for the key.
+ *
+ * @param array-key $key The key to return from the map.
+ * @param T|null $defaultValue The default value to use if `$key` is not found.
+ *
+ * @return T|null the value or `null` if the key could not be found.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function get($key, $defaultValue = null);
+
+ /**
+ * Associates the specified value with the specified key in this map.
+ *
+ * If the map previously contained a mapping for the key, the old value is
+ * replaced by the specified value.
+ *
+ * @param array-key $key The key to put or replace in the map.
+ * @param T $value The value to store at `$key`.
+ *
+ * @return T|null the previous value associated with key, or `null` if
+ * there was no mapping for `$key`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function put($key, $value);
+
+ /**
+ * Associates the specified value with the specified key in this map only if
+ * it is not already set.
+ *
+ * If there is already a value associated with `$key`, this returns that
+ * value without replacing it.
+ *
+ * @param array-key $key The key to put in the map.
+ * @param T $value The value to store at `$key`.
+ *
+ * @return T|null the previous value associated with key, or `null` if
+ * there was no mapping for `$key`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function putIfAbsent($key, $value);
+
+ /**
+ * Removes the mapping for a key from this map if it is present.
+ *
+ * @param array-key $key The key to remove from the map.
+ *
+ * @return T|null the previous value associated with key, or `null` if
+ * there was no mapping for `$key`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function remove($key);
+
+ /**
+ * Removes the entry for the specified key only if it is currently mapped to
+ * the specified value.
+ *
+ * This performs a strict type check on the value.
+ *
+ * @param array-key $key The key to remove from the map.
+ * @param T $value The value to match.
+ *
+ * @return bool true if the value was removed.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function removeIf($key, $value): bool;
+
+ /**
+ * Replaces the entry for the specified key only if it is currently mapped
+ * to some value.
+ *
+ * @param array-key $key The key to replace.
+ * @param T $value The value to set at `$key`.
+ *
+ * @return T|null the previous value associated with key, or `null` if
+ * there was no mapping for `$key`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function replace($key, $value);
+
+ /**
+ * Replaces the entry for the specified key only if currently mapped to the
+ * specified value.
+ *
+ * This performs a strict type check on the value.
+ *
+ * @param array-key $key The key to remove from the map.
+ * @param T $oldValue The value to match.
+ * @param T $newValue The value to use as a replacement.
+ *
+ * @return bool true if the value was replaced.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function replaceIf($key, $oldValue, $newValue): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/NamedParameterMap.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/NamedParameterMap.php
new file mode 100644
index 00000000..9926ddd8
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/NamedParameterMap.php
@@ -0,0 +1,120 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+use Ramsey\Collection\Exception\InvalidArgumentException;
+use Ramsey\Collection\Tool\TypeTrait;
+use Ramsey\Collection\Tool\ValueToStringTrait;
+
+use function array_combine;
+use function array_key_exists;
+use function is_int;
+
+/**
+ * `NamedParameterMap` represents a mapping of values to a set of named keys
+ * that may optionally be typed
+ *
+ * @extends AbstractMap
+ */
+class NamedParameterMap extends AbstractMap
+{
+ use TypeTrait;
+ use ValueToStringTrait;
+
+ /**
+ * Named parameters defined for this map.
+ *
+ * @var array
+ */
+ protected $namedParameters;
+
+ /**
+ * Constructs a new `NamedParameterMap`.
+ *
+ * @param array $namedParameters The named parameters defined for this map.
+ * @param array $data An initial set of data to set on this map.
+ */
+ public function __construct(array $namedParameters, array $data = [])
+ {
+ $this->namedParameters = $this->filterNamedParameters($namedParameters);
+ parent::__construct($data);
+ }
+
+ /**
+ * Returns named parameters set for this `NamedParameterMap`.
+ *
+ * @return array
+ */
+ public function getNamedParameters(): array
+ {
+ return $this->namedParameters;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ throw new InvalidArgumentException(
+ 'Map elements are key/value pairs; a key must be provided for '
+ . 'value ' . var_export($value, true)
+ );
+ }
+
+ if (!array_key_exists($offset, $this->namedParameters)) {
+ throw new InvalidArgumentException(
+ 'Attempting to set value for unconfigured parameter \''
+ . $offset . '\''
+ );
+ }
+
+ if ($this->checkType($this->namedParameters[$offset], $value) === false) {
+ throw new InvalidArgumentException(
+ 'Value for \'' . $offset . '\' must be of type '
+ . $this->namedParameters[$offset] . '; value is '
+ . $this->toolValueToString($value)
+ );
+ }
+
+ $this->data[$offset] = $value;
+ }
+
+ /**
+ * Given an array of named parameters, constructs a proper mapping of
+ * named parameters to types.
+ *
+ * @param array $namedParameters The named parameters to filter.
+ *
+ * @return array
+ */
+ protected function filterNamedParameters(array $namedParameters): array
+ {
+ $names = [];
+ $types = [];
+
+ foreach ($namedParameters as $key => $value) {
+ if (is_int($key)) {
+ $names[] = $value;
+ $types[] = 'mixed';
+ } else {
+ $names[] = $key;
+ $types[] = $value;
+ }
+ }
+
+ return array_combine($names, $types) ?: [];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMap.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMap.php
new file mode 100644
index 00000000..2e796377
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMap.php
@@ -0,0 +1,137 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+use Ramsey\Collection\Tool\TypeTrait;
+
+/**
+ * A `TypedMap` represents a map of elements where key and value are typed.
+ *
+ * Each element is identified by a key with defined type and a value of defined
+ * type. The keys of the map must be unique. The values on the map can be=
+ * repeated but each with its own different key.
+ *
+ * The most common case is to use a string type key, but it's not limited to
+ * this type of keys.
+ *
+ * This is a direct implementation of `TypedMapInterface`, provided for the sake
+ * of convenience.
+ *
+ * Example usage:
+ *
+ * ```php
+ * $map = new TypedMap('string', Foo::class);
+ * $map['x'] = new Foo();
+ * foreach ($map as $key => $value) {
+ * // do something with $key, it will be a Foo::class
+ * }
+ *
+ * // this will throw an exception since key must be string
+ * $map[10] = new Foo();
+ *
+ * // this will throw an exception since value must be a Foo
+ * $map['bar'] = 'bar';
+ *
+ * // initialize map with contents
+ * $map = new TypedMap('string', Foo::class, [
+ * new Foo(), new Foo(), new Foo()
+ * ]);
+ * ```
+ *
+ * It is preferable to subclass `AbstractTypedMap` to create your own typed map
+ * implementation:
+ *
+ * ```php
+ * class FooTypedMap extends AbstractTypedMap
+ * {
+ * public function getKeyType()
+ * {
+ * return 'int';
+ * }
+ *
+ * public function getValueType()
+ * {
+ * return Foo::class;
+ * }
+ * }
+ * ```
+ *
+ * … but you also may use the `TypedMap` class:
+ *
+ * ```php
+ * class FooTypedMap extends TypedMap
+ * {
+ * public function __constructor(array $data = [])
+ * {
+ * parent::__construct('int', Foo::class, $data);
+ * }
+ * }
+ * ```
+ *
+ * @template K
+ * @template T
+ * @extends AbstractTypedMap
+ */
+class TypedMap extends AbstractTypedMap
+{
+ use TypeTrait;
+
+ /**
+ * The data type of keys stored in this collection.
+ *
+ * A map key's type is immutable once it is set. For this reason, this
+ * property is set private.
+ *
+ * @var string data type of the map key.
+ */
+ private $keyType;
+
+ /**
+ * The data type of values stored in this collection.
+ *
+ * A map value's type is immutable once it is set. For this reason, this
+ * property is set private.
+ *
+ * @var string data type of the map value.
+ */
+ private $valueType;
+
+ /**
+ * Constructs a map object of the specified key and value types,
+ * optionally with the specified data.
+ *
+ * @param string $keyType The data type of the map's keys.
+ * @param string $valueType The data type of the map's values.
+ * @param array $data The initial data to set for this map.
+ */
+ public function __construct(string $keyType, string $valueType, array $data = [])
+ {
+ $this->keyType = $keyType;
+ $this->valueType = $valueType;
+
+ /** @psalm-suppress MixedArgumentTypeCoercion */
+ parent::__construct($data);
+ }
+
+ public function getKeyType(): string
+ {
+ return $this->keyType;
+ }
+
+ public function getValueType(): string
+ {
+ return $this->valueType;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMapInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMapInterface.php
new file mode 100644
index 00000000..0308109c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Map/TypedMapInterface.php
@@ -0,0 +1,35 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Map;
+
+/**
+ * A `TypedMapInterface` represents a map of elements where key and value are
+ * typed.
+ *
+ * @template T
+ * @extends MapInterface
+ */
+interface TypedMapInterface extends MapInterface
+{
+ /**
+ * Return the type used on the key.
+ */
+ public function getKeyType(): string;
+
+ /**
+ * Return the type forced on the values.
+ */
+ public function getValueType(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Queue.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Queue.php
new file mode 100644
index 00000000..93e032b4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Queue.php
@@ -0,0 +1,169 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use Ramsey\Collection\Exception\InvalidArgumentException;
+use Ramsey\Collection\Exception\NoSuchElementException;
+use Ramsey\Collection\Tool\TypeTrait;
+use Ramsey\Collection\Tool\ValueToStringTrait;
+
+/**
+ * This class provides a basic implementation of `QueueInterface`, to minimize
+ * the effort required to implement this interface.
+ *
+ * @template T
+ * @extends AbstractArray
+ * @implements QueueInterface
+ */
+class Queue extends AbstractArray implements QueueInterface
+{
+ use TypeTrait;
+ use ValueToStringTrait;
+
+ /**
+ * The type of elements stored in this queue.
+ *
+ * A queue's type is immutable once it is set. For this reason, this
+ * property is set private.
+ *
+ * @var string
+ */
+ private $queueType;
+
+ /**
+ * The index of the head of the queue.
+ *
+ * @var int
+ */
+ protected $index = 0;
+
+ /**
+ * Constructs a queue object of the specified type, optionally with the
+ * specified data.
+ *
+ * @param string $queueType The type (FQCN) associated with this queue.
+ * @param array $data The initial items to store in the collection.
+ */
+ public function __construct(string $queueType, array $data = [])
+ {
+ $this->queueType = $queueType;
+ parent::__construct($data);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Since arbitrary offsets may not be manipulated in a queue, this method
+ * serves only to fulfill the `ArrayAccess` interface requirements. It is
+ * invoked by other operations when adding values to the queue.
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if ($this->checkType($this->getType(), $value) === false) {
+ throw new InvalidArgumentException(
+ 'Value must be of type ' . $this->getType() . '; value is '
+ . $this->toolValueToString($value)
+ );
+ }
+
+ $this->data[] = $value;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function add($element): bool
+ {
+ $this[] = $element;
+
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function element()
+ {
+ $element = $this->peek();
+
+ if ($element === null) {
+ throw new NoSuchElementException(
+ 'Can\'t return element from Queue. Queue is empty.'
+ );
+ }
+
+ return $element;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function offer($element): bool
+ {
+ try {
+ return $this->add($element);
+ } catch (InvalidArgumentException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function peek()
+ {
+ if ($this->count() === 0) {
+ return null;
+ }
+
+ return $this[$this->index];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function poll()
+ {
+ if ($this->count() === 0) {
+ return null;
+ }
+
+ $head = $this[$this->index];
+
+ unset($this[$this->index]);
+ $this->index++;
+
+ return $head;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function remove()
+ {
+ $head = $this->poll();
+
+ if ($head === null) {
+ throw new NoSuchElementException('Can\'t return element from Queue. Queue is empty.');
+ }
+
+ return $head;
+ }
+
+ public function getType(): string
+ {
+ return $this->queueType;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/QueueInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/QueueInterface.php
new file mode 100644
index 00000000..8c7383df
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/QueueInterface.php
@@ -0,0 +1,203 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+use Ramsey\Collection\Exception\NoSuchElementException;
+
+/**
+ * A queue is a collection in which the entities in the collection are kept in
+ * order.
+ *
+ * The principal operations on the queue are the addition of entities to the end
+ * (tail), also known as *enqueue*, and removal of entities from the front
+ * (head), also known as *dequeue*. This makes the queue a first-in-first-out
+ * (FIFO) data structure.
+ *
+ * Besides basic array operations, queues provide additional insertion,
+ * extraction, and inspection operations. Each of these methods exists in two
+ * forms: one throws an exception if the operation fails, the other returns a
+ * special value (either `null` or `false`, depending on the operation). The
+ * latter form of the insert operation is designed specifically for use with
+ * capacity-restricted `QueueInterface` implementations; in most
+ * implementations, insert operations cannot fail.
+ *
+ *
+ * Summary of QueueInterface methods
+ *
+ *
+ *
+ * Throws exception
+ * Returns special value
+ *
+ *
+ *
+ *
+ * Insert
+ * add()
+ * offer()
+ *
+ *
+ * Remove
+ * remove()
+ * poll()
+ *
+ *
+ * Examine
+ * element()
+ * peek()
+ *
+ *
+ *
+ *
+ * Queues typically, but do not necessarily, order elements in a FIFO
+ * (first-in-first-out) manner. Among the exceptions are priority queues, which
+ * order elements according to a supplied comparator, or the elements' natural
+ * ordering, and LIFO queues (or stacks) which order the elements LIFO
+ * (last-in-first-out). Whatever the ordering used, the head of the queue is
+ * that element which would be removed by a call to remove() or poll(). In a
+ * FIFO queue, all new elements are inserted at the tail of the queue. Other
+ * kinds of queues may use different placement rules. Every `QueueInterface`
+ * implementation must specify its ordering properties.
+ *
+ * The `offer()` method inserts an element if possible, otherwise returning
+ * `false`. This differs from the `add()` method, which can fail to add an
+ * element only by throwing an unchecked exception. The `offer()` method is
+ * designed for use when failure is a normal, rather than exceptional
+ * occurrence, for example, in fixed-capacity (or "bounded") queues.
+ *
+ * The `remove()` and `poll()` methods remove and return the head of the queue.
+ * Exactly which element is removed from the queue is a function of the queue's
+ * ordering policy, which differs from implementation to implementation. The
+ * `remove()` and `poll()` methods differ only in their behavior when the queue
+ * is empty: the `remove()` method throws an exception, while the `poll()`
+ * method returns `null`.
+ *
+ * The `element()` and `peek()` methods return, but do not remove, the head of
+ * the queue.
+ *
+ * `QueueInterface` implementations generally do not allow insertion of `null`
+ * elements, although some implementations do not prohibit insertion of `null`.
+ * Even in the implementations that permit it, `null` should not be inserted
+ * into a queue, as `null` is also used as a special return value by the
+ * `poll()` method to indicate that the queue contains no elements.
+ *
+ * @template T
+ * @extends ArrayInterface
+ */
+interface QueueInterface extends ArrayInterface
+{
+ /**
+ * Ensures that this queue contains the specified element (optional
+ * operation).
+ *
+ * Returns `true` if this queue changed as a result of the call. (Returns
+ * `false` if this queue does not permit duplicates and already contains the
+ * specified element.)
+ *
+ * Queues that support this operation may place limitations on what elements
+ * may be added to this queue. In particular, some queues will refuse to add
+ * `null` elements, and others will impose restrictions on the type of
+ * elements that may be added. Queue classes should clearly specify in their
+ * documentation any restrictions on what elements may be added.
+ *
+ * If a queue refuses to add a particular element for any reason other than
+ * that it already contains the element, it must throw an exception (rather
+ * than returning `false`). This preserves the invariant that a queue always
+ * contains the specified element after this call returns.
+ *
+ * @see self::offer()
+ *
+ * @param T $element The element to add to this queue.
+ *
+ * @return bool `true` if this queue changed as a result of the call.
+ *
+ * @throws \RuntimeException if a queue refuses to add a particular element
+ * for any reason other than that it already contains the element.
+ * Implementations should use a more-specific exception that extends
+ * `\RuntimeException`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function add($element): bool;
+
+ /**
+ * Retrieves, but does not remove, the head of this queue.
+ *
+ * This method differs from `peek()` only in that it throws an exception if
+ * this queue is empty.
+ *
+ * @see self::peek()
+ *
+ * @return T the head of this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function element();
+
+ /**
+ * Inserts the specified element into this queue if it is possible to do so
+ * immediately without violating capacity restrictions.
+ *
+ * When using a capacity-restricted queue, this method is generally
+ * preferable to `add()`, which can fail to insert an element only by
+ * throwing an exception.
+ *
+ * @see self::add()
+ *
+ * @param T $element The element to add to this queue.
+ *
+ * @return bool `true` if the element was added to this queue, else `false`.
+ */
+ // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ public function offer($element): bool;
+
+ /**
+ * Retrieves, but does not remove, the head of this queue, or returns `null`
+ * if this queue is empty.
+ *
+ * @see self::element()
+ *
+ * @return T|null the head of this queue, or `null` if this queue is empty.
+ */
+ public function peek();
+
+ /**
+ * Retrieves and removes the head of this queue, or returns `null`
+ * if this queue is empty.
+ *
+ * @see self::remove()
+ *
+ * @return T|null the head of this queue, or `null` if this queue is empty.
+ */
+ public function poll();
+
+ /**
+ * Retrieves and removes the head of this queue.
+ *
+ * This method differs from `poll()` only in that it throws an exception if
+ * this queue is empty.
+ *
+ * @see self::poll()
+ *
+ * @return T the head of this queue.
+ *
+ * @throws NoSuchElementException if this queue is empty.
+ */
+ public function remove();
+
+ /**
+ * Returns the type associated with this queue.
+ */
+ public function getType(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Set.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Set.php
new file mode 100644
index 00000000..6932f247
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Set.php
@@ -0,0 +1,69 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection;
+
+/**
+ * A set is a collection that contains no duplicate elements.
+ *
+ * Great care must be exercised if mutable objects are used as set elements.
+ * The behavior of a set is not specified if the value of an object is changed
+ * in a manner that affects equals comparisons while the object is an element in
+ * the set.
+ *
+ * Example usage:
+ *
+ * ``` php
+ * $foo = new \My\Foo();
+ * $set = new Set(\My\Foo::class);
+ *
+ * $set->add($foo); // returns TRUE, the element don't exists
+ * $set->add($foo); // returns FALSE, the element already exists
+ *
+ * $bar = new \My\Foo();
+ * $set->add($bar); // returns TRUE, $bar !== $foo
+ * ```
+ *
+ * @template T
+ * @extends AbstractSet
+ */
+class Set extends AbstractSet
+{
+ /**
+ * The type of elements stored in this set
+ *
+ * A set's type is immutable. For this reason, this property is private.
+ *
+ * @var string
+ */
+ private $setType;
+
+ /**
+ * Constructs a set object of the specified type, optionally with the
+ * specified data.
+ *
+ * @param string $setType The type (FQCN) associated with this set.
+ * @param array $data The initial items to store in the set.
+ */
+ public function __construct(string $setType, array $data = [])
+ {
+ $this->setType = $setType;
+ parent::__construct($data);
+ }
+
+ public function getType(): string
+ {
+ return $this->setType;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/TypeTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/TypeTrait.php
new file mode 100644
index 00000000..8214e965
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/TypeTrait.php
@@ -0,0 +1,73 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Tool;
+
+use function is_array;
+use function is_bool;
+use function is_callable;
+use function is_float;
+use function is_int;
+use function is_numeric;
+use function is_object;
+use function is_resource;
+use function is_scalar;
+use function is_string;
+
+/**
+ * Provides functionality to check values for specific types.
+ */
+trait TypeTrait
+{
+ /**
+ * Returns `true` if value is of the specified type.
+ *
+ * @param string $type The type to check the value against.
+ * @param mixed $value The value to check.
+ */
+ protected function checkType(string $type, $value): bool
+ {
+ switch ($type) {
+ case 'array':
+ return is_array($value);
+ case 'bool':
+ case 'boolean':
+ return is_bool($value);
+ case 'callable':
+ return is_callable($value);
+ case 'float':
+ case 'double':
+ return is_float($value);
+ case 'int':
+ case 'integer':
+ return is_int($value);
+ case 'null':
+ return $value === null;
+ case 'numeric':
+ return is_numeric($value);
+ case 'object':
+ return is_object($value);
+ case 'resource':
+ return is_resource($value);
+ case 'scalar':
+ return is_scalar($value);
+ case 'string':
+ return is_string($value);
+ case 'mixed':
+ return true;
+ default:
+ return $value instanceof $type;
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueExtractorTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueExtractorTrait.php
new file mode 100644
index 00000000..f9be1be2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueExtractorTrait.php
@@ -0,0 +1,58 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Tool;
+
+use Ramsey\Collection\Exception\ValueExtractionException;
+
+use function get_class;
+use function method_exists;
+use function property_exists;
+use function sprintf;
+
+/**
+ * Provides functionality to extract the value of a property or method from an object.
+ */
+trait ValueExtractorTrait
+{
+ /**
+ * Extracts the value of the given property or method from the object.
+ *
+ * @param mixed $object The object to extract the value from.
+ * @param string $propertyOrMethod The property or method for which the
+ * value should be extracted.
+ *
+ * @return mixed the value extracted from the specified property or method.
+ *
+ * @throws ValueExtractionException if the method or property is not defined.
+ */
+ protected function extractValue($object, string $propertyOrMethod)
+ {
+ if (!is_object($object)) {
+ throw new ValueExtractionException('Unable to extract a value from a non-object');
+ }
+
+ if (property_exists($object, $propertyOrMethod)) {
+ return $object->$propertyOrMethod;
+ }
+
+ if (method_exists($object, $propertyOrMethod)) {
+ return $object->{$propertyOrMethod}();
+ }
+
+ throw new ValueExtractionException(
+ sprintf('Method or property "%s" not defined in %s', $propertyOrMethod, get_class($object))
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueToStringTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueToStringTrait.php
new file mode 100644
index 00000000..721ade00
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/collection/src/Tool/ValueToStringTrait.php
@@ -0,0 +1,94 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Collection\Tool;
+
+use DateTimeInterface;
+
+use function get_class;
+use function get_resource_type;
+use function is_array;
+use function is_bool;
+use function is_callable;
+use function is_resource;
+use function is_scalar;
+
+/**
+ * Provides functionality to express a value as string
+ */
+trait ValueToStringTrait
+{
+ /**
+ * Returns a string representation of the value.
+ *
+ * - null value: `'NULL'`
+ * - boolean: `'TRUE'`, `'FALSE'`
+ * - array: `'Array'`
+ * - scalar: converted-value
+ * - resource: `'(type resource #number)'`
+ * - object with `__toString()`: result of `__toString()`
+ * - object DateTime: ISO 8601 date
+ * - object: `'(className Object)'`
+ * - anonymous function: same as object
+ *
+ * @param mixed $value the value to return as a string.
+ */
+ protected function toolValueToString($value): string
+ {
+ // null
+ if ($value === null) {
+ return 'NULL';
+ }
+
+ // boolean constants
+ if (is_bool($value)) {
+ return $value ? 'TRUE' : 'FALSE';
+ }
+
+ // array
+ if (is_array($value)) {
+ return 'Array';
+ }
+
+ // scalar types (integer, float, string)
+ if (is_scalar($value)) {
+ return (string) $value;
+ }
+
+ // resource
+ if (is_resource($value)) {
+ return '(' . get_resource_type($value) . ' resource #' . (int) $value . ')';
+ }
+
+ // If we don't know what it is, use var_export().
+ if (!is_object($value)) {
+ return '(' . var_export($value, true) . ')';
+ }
+
+ // From here, $value should be an object.
+
+ // __toString() is implemented
+ if (is_callable([$value, '__toString'])) {
+ return (string) $value->__toString();
+ }
+
+ // object of type \DateTime
+ if ($value instanceof DateTimeInterface) {
+ return $value->format('c');
+ }
+
+ // unknown type
+ return '(' . get_class($value) . ' Object)';
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/LICENSE b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/LICENSE
new file mode 100644
index 00000000..5e06cf43
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012-2021 Ben Ramsey
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/README.md b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/README.md
new file mode 100644
index 00000000..97e81a50
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/README.md
@@ -0,0 +1,83 @@
+ramsey/uuid
+
+
+ A PHP library for generating and working with UUIDs.
+
+
+
+
+ramsey/uuid is a PHP library for generating and working with universally unique
+identifiers (UUIDs).
+
+This project adheres to a [code of conduct](CODE_OF_CONDUCT.md).
+By participating in this project and its community, you are expected to
+uphold this code.
+
+Much inspiration for this library came from the [Java][javauuid] and
+[Python][pyuuid] UUID libraries.
+
+## Installation
+
+The preferred method of installation is via [Composer][]. Run the following
+command to install the package and add it as a requirement to your project's
+`composer.json`:
+
+```bash
+composer require ramsey/uuid
+```
+
+## Upgrading to Version 4
+
+See the documentation for a thorough upgrade guide:
+
+* [Upgrading ramsey/uuid Version 3 to 4](https://uuid.ramsey.dev/en/latest/upgrading/3-to-4.html)
+
+## Documentation
+
+Please see for documentation, tips, examples, and
+frequently asked questions.
+
+## Contributing
+
+Contributions are welcome! To contribute, please familiarize yourself with
+[CONTRIBUTING.md](CONTRIBUTING.md).
+
+## Coordinated Disclosure
+
+Keeping user information safe and secure is a top priority, and we welcome the
+contribution of external security researchers. If you believe you've found a
+security issue in software that is maintained in this repository, please read
+[SECURITY.md][] for instructions on submitting a vulnerability report.
+
+## ramsey/uuid for Enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of ramsey/uuid and thousands of other packages are working with
+Tidelift to deliver commercial support and maintenance for the open source
+packages you use to build your applications. Save time, reduce risk, and improve
+code health, while paying the maintainers of the exact packages you use.
+[Learn more.](https://tidelift.com/subscription/pkg/packagist-ramsey-uuid?utm_source=undefined&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+
+## Copyright and License
+
+The ramsey/uuid library is copyright © [Ben Ramsey](https://benramsey.com/) and
+licensed for use under the MIT License (MIT). Please see [LICENSE][] for more
+information.
+
+[rfc4122]: http://tools.ietf.org/html/rfc4122
+[conduct]: https://github.com/ramsey/uuid/blob/main/CODE_OF_CONDUCT.md
+[javauuid]: http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html
+[pyuuid]: http://docs.python.org/3/library/uuid.html
+[composer]: http://getcomposer.org/
+[contributing.md]: https://github.com/ramsey/uuid/blob/main/CONTRIBUTING.md
+[security.md]: https://github.com/ramsey/uuid/blob/main/SECURITY.md
+[license]: https://github.com/ramsey/uuid/blob/main/LICENSE
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/composer.json b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/composer.json
new file mode 100644
index 00000000..3f3b5ac4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/composer.json
@@ -0,0 +1,107 @@
+{
+ "name": "ramsey/uuid",
+ "type": "library",
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "keywords": [
+ "uuid",
+ "identifier",
+ "guid"
+ ],
+ "license": "MIT",
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "ext-json": "*",
+ "brick/math": "^0.8 || ^0.9",
+ "ramsey/collection": "^1.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php80": "^1.14"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.10",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "ergebnis/composer-normalize": "^2.15",
+ "mockery/mockery": "^1.3",
+ "moontoast/math": "^1.1",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^1.0",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-mockery": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "slevomat/coding-standard": "^7.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.9"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "config": {
+ "sort-packages": true
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.x-dev"
+ },
+ "captainhook": {
+ "force-install": true
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Ramsey\\Uuid\\Benchmark\\": "tests/benchmark/",
+ "Ramsey\\Uuid\\StaticAnalysis\\": "tests/static-analysis/",
+ "Ramsey\\Uuid\\Test\\": "tests/"
+ }
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "scripts": {
+ "analyze": [
+ "@phpstan",
+ "@psalm"
+ ],
+ "build:clean": "git clean -fX build/",
+ "lint": "parallel-lint src tests",
+ "lint:paths": "parallel-lint",
+ "phpbench": "phpbench run",
+ "phpcbf": "phpcbf -vpw --cache=build/cache/phpcs.cache",
+ "phpcs": "phpcs --cache=build/cache/phpcs.cache",
+ "phpstan": [
+ "phpstan analyse --no-progress",
+ "phpstan analyse -c phpstan-tests.neon --no-progress"
+ ],
+ "phpunit": "phpunit --verbose --colors=always",
+ "phpunit-coverage": "phpunit --verbose --colors=always --coverage-html build/coverage",
+ "psalm": "psalm --show-info=false --config=psalm.xml",
+ "test": [
+ "@lint",
+ "@phpbench",
+ "@phpcs",
+ "@phpstan",
+ "@psalm",
+ "@phpunit"
+ ]
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/BinaryUtils.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/BinaryUtils.php
new file mode 100644
index 00000000..fb8ba9ad
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/BinaryUtils.php
@@ -0,0 +1,63 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+/**
+ * Provides binary math utilities
+ */
+class BinaryUtils
+{
+ /**
+ * Applies the RFC 4122 variant field to the 16-bit clock sequence
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ *
+ * @param int $clockSeq The 16-bit clock sequence value before the RFC 4122
+ * variant is applied
+ *
+ * @return int The 16-bit clock sequence multiplexed with the UUID variant
+ *
+ * @psalm-pure
+ */
+ public static function applyVariant(int $clockSeq): int
+ {
+ $clockSeq = $clockSeq & 0x3fff;
+ $clockSeq |= 0x8000;
+
+ return $clockSeq;
+ }
+
+ /**
+ * Applies the RFC 4122 version number to the 16-bit `time_hi_and_version` field
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ *
+ * @param int $timeHi The value of the 16-bit `time_hi_and_version` field
+ * before the RFC 4122 version is applied
+ * @param int $version The RFC 4122 version to apply to the `time_hi` field
+ *
+ * @return int The 16-bit time_hi field of the timestamp multiplexed with
+ * the UUID version number
+ *
+ * @psalm-pure
+ */
+ public static function applyVersion(int $timeHi, int $version): int
+ {
+ $timeHi = $timeHi & 0x0fff;
+ $timeHi |= $version << 12;
+
+ return $timeHi;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/BuilderCollection.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/BuilderCollection.php
new file mode 100644
index 00000000..89fa1e3c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/BuilderCollection.php
@@ -0,0 +1,80 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Builder;
+
+use Ramsey\Collection\AbstractCollection;
+use Ramsey\Uuid\Converter\Number\GenericNumberConverter;
+use Ramsey\Uuid\Converter\Time\GenericTimeConverter;
+use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
+use Ramsey\Uuid\Guid\GuidBuilder;
+use Ramsey\Uuid\Math\BrickMathCalculator;
+use Ramsey\Uuid\Nonstandard\UuidBuilder as NonstandardUuidBuilder;
+use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;
+use Traversable;
+
+/**
+ * A collection of UuidBuilderInterface objects
+ *
+ * @extends AbstractCollection
+ */
+class BuilderCollection extends AbstractCollection
+{
+ public function getType(): string
+ {
+ return UuidBuilderInterface::class;
+ }
+
+ /**
+ * @psalm-mutation-free
+ * @psalm-suppress ImpureMethodCall
+ * @psalm-suppress InvalidTemplateParam
+ */
+ public function getIterator(): Traversable
+ {
+ return parent::getIterator();
+ }
+
+ /**
+ * Re-constructs the object from its serialized form
+ *
+ * @param string $serialized The serialized PHP string to unserialize into
+ * a UuidInterface instance
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress RedundantConditionGivenDocblockType
+ */
+ public function unserialize($serialized): void
+ {
+ /** @var array $data */
+ $data = unserialize($serialized, [
+ 'allowed_classes' => [
+ BrickMathCalculator::class,
+ GenericNumberConverter::class,
+ GenericTimeConverter::class,
+ GuidBuilder::class,
+ NonstandardUuidBuilder::class,
+ PhpTimeConverter::class,
+ Rfc4122UuidBuilder::class,
+ ],
+ ]);
+
+ $this->data = array_filter(
+ $data,
+ function ($unserialized): bool {
+ return $unserialized instanceof UuidBuilderInterface;
+ }
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php
new file mode 100644
index 00000000..7c4a6f83
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php
@@ -0,0 +1,26 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Builder;
+
+use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;
+
+/**
+ * @deprecated Transition to {@see Rfc4122UuidBuilder}.
+ *
+ * @psalm-immutable
+ */
+class DefaultUuidBuilder extends Rfc4122UuidBuilder
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php
new file mode 100644
index 00000000..23931e41
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php
@@ -0,0 +1,76 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Builder;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\Time\DegradedTimeConverter;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\DegradedUuid;
+use Ramsey\Uuid\Rfc4122\Fields as Rfc4122Fields;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * @deprecated DegradedUuid instances are no longer necessary to support 32-bit
+ * systems. Transition to {@see DefaultUuidBuilder}.
+ *
+ * @psalm-immutable
+ */
+class DegradedUuidBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @param NumberConverterInterface $numberConverter The number converter to
+ * use when constructing the DegradedUuid
+ * @param TimeConverterInterface|null $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to Unix timestamps
+ */
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ ?TimeConverterInterface $timeConverter = null
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter ?: new DegradedTimeConverter();
+ }
+
+ /**
+ * Builds and returns a DegradedUuid
+ *
+ * @param CodecInterface $codec The codec to use for building this DegradedUuid instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return DegradedUuid The DegradedUuidBuild returns an instance of Ramsey\Uuid\DegradedUuid
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ return new DegradedUuid(
+ new Rfc4122Fields($bytes),
+ $this->numberConverter,
+ $codec,
+ $this->timeConverter
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php
new file mode 100644
index 00000000..470d2f75
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/FallbackBuilder.php
@@ -0,0 +1,74 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Builder;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Exception\BuilderNotFoundException;
+use Ramsey\Uuid\Exception\UnableToBuildUuidException;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * FallbackBuilder builds a UUID by stepping through a list of UUID builders
+ * until a UUID can be constructed without exceptions
+ *
+ * @psalm-immutable
+ */
+class FallbackBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var BuilderCollection
+ */
+ private $builders;
+
+ /**
+ * @param BuilderCollection $builders An array of UUID builders
+ */
+ public function __construct(BuilderCollection $builders)
+ {
+ $this->builders = $builders;
+ }
+
+ /**
+ * Builds and returns a UuidInterface instance using the first builder that
+ * succeeds
+ *
+ * @param CodecInterface $codec The codec to use for building this instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return UuidInterface an instance of a UUID object
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ $lastBuilderException = null;
+
+ foreach ($this->builders as $builder) {
+ try {
+ return $builder->build($codec, $bytes);
+ } catch (UnableToBuildUuidException $exception) {
+ $lastBuilderException = $exception;
+
+ continue;
+ }
+ }
+
+ throw new BuilderNotFoundException(
+ 'Could not find a suitable builder for the provided codec and fields',
+ 0,
+ $lastBuilderException
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.php
new file mode 100644
index 00000000..8e58b2b4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.php
@@ -0,0 +1,39 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Builder;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * A UUID builder builds instances of UuidInterface
+ *
+ * @psalm-immutable
+ */
+interface UuidBuilderInterface
+{
+ /**
+ * Builds and returns a UuidInterface
+ *
+ * @param CodecInterface $codec The codec to use for building this UuidInterface instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return UuidInterface Implementations may choose to return more specific
+ * instances of UUIDs that implement UuidInterface
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/CodecInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/CodecInterface.php
new file mode 100644
index 00000000..85f8a7e9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/CodecInterface.php
@@ -0,0 +1,71 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * A codec encodes and decodes a UUID according to defined rules
+ *
+ * @psalm-immutable
+ */
+interface CodecInterface
+{
+ /**
+ * Returns a hexadecimal string representation of a UuidInterface
+ *
+ * @param UuidInterface $uuid The UUID for which to create a hexadecimal
+ * string representation
+ *
+ * @return string Hexadecimal string representation of a UUID
+ *
+ * @psalm-return non-empty-string
+ */
+ public function encode(UuidInterface $uuid): string;
+
+ /**
+ * Returns a binary string representation of a UuidInterface
+ *
+ * @param UuidInterface $uuid The UUID for which to create a binary string
+ * representation
+ *
+ * @return string Binary string representation of a UUID
+ *
+ * @psalm-return non-empty-string
+ */
+ public function encodeBinary(UuidInterface $uuid): string;
+
+ /**
+ * Returns a UuidInterface derived from a hexadecimal string representation
+ *
+ * @param string $encodedUuid The hexadecimal string representation to
+ * convert into a UuidInterface instance
+ *
+ * @return UuidInterface An instance of a UUID decoded from a hexadecimal
+ * string representation
+ */
+ public function decode(string $encodedUuid): UuidInterface;
+
+ /**
+ * Returns a UuidInterface derived from a binary string representation
+ *
+ * @param string $bytes The binary string representation to convert into a
+ * UuidInterface instance
+ *
+ * @return UuidInterface An instance of a UUID decoded from a binary string
+ * representation
+ */
+ public function decodeBytes(string $bytes): UuidInterface;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php
new file mode 100644
index 00000000..f11e9d50
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/GuidStringCodec.php
@@ -0,0 +1,55 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+use Ramsey\Uuid\Guid\Guid;
+use Ramsey\Uuid\UuidInterface;
+
+use function bin2hex;
+use function substr;
+
+/**
+ * GuidStringCodec encodes and decodes globally unique identifiers (GUID)
+ *
+ * @see Guid
+ *
+ * @psalm-immutable
+ */
+class GuidStringCodec extends StringCodec
+{
+ public function decode(string $encodedUuid): UuidInterface
+ {
+ $bytes = $this->getBytes($encodedUuid);
+
+ return $this->getBuilder()->build($this, $this->swapBytes($bytes));
+ }
+
+ public function decodeBytes(string $bytes): UuidInterface
+ {
+ // Specifically call parent::decode to preserve correct byte order
+ return parent::decode(bin2hex($bytes));
+ }
+
+ /**
+ * Swaps bytes according to the GUID rules
+ */
+ private function swapBytes(string $bytes): string
+ {
+ return $bytes[3] . $bytes[2] . $bytes[1] . $bytes[0]
+ . $bytes[5] . $bytes[4]
+ . $bytes[7] . $bytes[6]
+ . substr($bytes, 8);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php
new file mode 100644
index 00000000..0798ebc4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php
@@ -0,0 +1,113 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Exception\UnsupportedOperationException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\UuidInterface;
+
+use function strlen;
+use function substr;
+
+/**
+ * OrderedTimeCodec encodes and decodes a UUID, optimizing the byte order for
+ * more efficient storage
+ *
+ * For binary representations of version 1 UUID, this codec may be used to
+ * reorganize the time fields, making the UUID closer to sequential when storing
+ * the bytes. According to Percona, this optimization can improve database
+ * INSERTs and SELECTs using the UUID column as a key.
+ *
+ * The string representation of the UUID will remain unchanged. Only the binary
+ * representation is reordered.
+ *
+ * **PLEASE NOTE:** Binary representations of UUIDs encoded with this codec must
+ * be decoded with this codec. Decoding using another codec can result in
+ * malformed UUIDs.
+ *
+ * @link https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/ Storing UUID Values in MySQL
+ *
+ * @psalm-immutable
+ */
+class OrderedTimeCodec extends StringCodec
+{
+ /**
+ * Returns a binary string representation of a UUID, with the timestamp
+ * fields rearranged for optimized storage
+ *
+ * @inheritDoc
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function encodeBinary(UuidInterface $uuid): string
+ {
+ if (
+ !($uuid->getFields() instanceof Rfc4122FieldsInterface)
+ || $uuid->getFields()->getVersion() !== Uuid::UUID_TYPE_TIME
+ ) {
+ throw new InvalidArgumentException(
+ 'Expected RFC 4122 version 1 (time-based) UUID'
+ );
+ }
+
+ $bytes = $uuid->getFields()->getBytes();
+
+ /** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
+ return $bytes[6] . $bytes[7]
+ . $bytes[4] . $bytes[5]
+ . $bytes[0] . $bytes[1] . $bytes[2] . $bytes[3]
+ . substr($bytes, 8);
+ }
+
+ /**
+ * Returns a UuidInterface derived from an ordered-time binary string
+ * representation
+ *
+ * @throws InvalidArgumentException if $bytes is an invalid length
+ *
+ * @inheritDoc
+ */
+ public function decodeBytes(string $bytes): UuidInterface
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ '$bytes string should contain 16 characters.'
+ );
+ }
+
+ // Rearrange the bytes to their original order.
+ $rearrangedBytes = $bytes[4] . $bytes[5] . $bytes[6] . $bytes[7]
+ . $bytes[2] . $bytes[3]
+ . $bytes[0] . $bytes[1]
+ . substr($bytes, 8);
+
+ $uuid = parent::decodeBytes($rearrangedBytes);
+
+ if (
+ !($uuid->getFields() instanceof Rfc4122FieldsInterface)
+ || $uuid->getFields()->getVersion() !== Uuid::UUID_TYPE_TIME
+ ) {
+ throw new UnsupportedOperationException(
+ 'Attempting to decode a non-time-based UUID using '
+ . 'OrderedTimeCodec'
+ );
+ }
+
+ return $uuid;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/StringCodec.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/StringCodec.php
new file mode 100644
index 00000000..58c9f580
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/StringCodec.php
@@ -0,0 +1,138 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Exception\InvalidUuidStringException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface;
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\UuidInterface;
+
+use function hex2bin;
+use function implode;
+use function str_replace;
+use function strlen;
+use function substr;
+
+/**
+ * StringCodec encodes and decodes RFC 4122 UUIDs
+ *
+ * @link http://tools.ietf.org/html/rfc4122
+ *
+ * @psalm-immutable
+ */
+class StringCodec implements CodecInterface
+{
+ /**
+ * @var UuidBuilderInterface
+ */
+ private $builder;
+
+ /**
+ * Constructs a StringCodec
+ *
+ * @param UuidBuilderInterface $builder The builder to use when encoding UUIDs
+ */
+ public function __construct(UuidBuilderInterface $builder)
+ {
+ $this->builder = $builder;
+ }
+
+ public function encode(UuidInterface $uuid): string
+ {
+ /** @var FieldsInterface $fields */
+ $fields = $uuid->getFields();
+
+ return $fields->getTimeLow()->toString()
+ . '-'
+ . $fields->getTimeMid()->toString()
+ . '-'
+ . $fields->getTimeHiAndVersion()->toString()
+ . '-'
+ . $fields->getClockSeqHiAndReserved()->toString()
+ . $fields->getClockSeqLow()->toString()
+ . '-'
+ . $fields->getNode()->toString();
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function encodeBinary(UuidInterface $uuid): string
+ {
+ /** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
+ return $uuid->getFields()->getBytes();
+ }
+
+ /**
+ * @throws InvalidUuidStringException
+ *
+ * @inheritDoc
+ */
+ public function decode(string $encodedUuid): UuidInterface
+ {
+ return $this->builder->build($this, $this->getBytes($encodedUuid));
+ }
+
+ public function decodeBytes(string $bytes): UuidInterface
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ '$bytes string should contain 16 characters.'
+ );
+ }
+
+ return $this->builder->build($this, $bytes);
+ }
+
+ /**
+ * Returns the UUID builder
+ */
+ protected function getBuilder(): UuidBuilderInterface
+ {
+ return $this->builder;
+ }
+
+ /**
+ * Returns a byte string of the UUID
+ */
+ protected function getBytes(string $encodedUuid): string
+ {
+ $parsedUuid = str_replace(
+ ['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}', '-'],
+ '',
+ $encodedUuid
+ );
+
+ $components = [
+ substr($parsedUuid, 0, 8),
+ substr($parsedUuid, 8, 4),
+ substr($parsedUuid, 12, 4),
+ substr($parsedUuid, 16, 4),
+ substr($parsedUuid, 20),
+ ];
+
+ if (!Uuid::isValid(implode('-', $components))) {
+ throw new InvalidUuidStringException(
+ 'Invalid UUID string: ' . $encodedUuid
+ );
+ }
+
+ return (string) hex2bin($parsedUuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php
new file mode 100644
index 00000000..0e0042d0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php
@@ -0,0 +1,113 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+use Ramsey\Uuid\Exception\InvalidUuidStringException;
+use Ramsey\Uuid\UuidInterface;
+
+use function bin2hex;
+use function sprintf;
+use function substr;
+use function substr_replace;
+
+/**
+ * TimestampFirstCombCodec encodes and decodes COMBs, with the timestamp as the
+ * first 48 bits
+ *
+ * In contrast with the TimestampLastCombCodec, the TimestampFirstCombCodec
+ * adds the timestamp to the first 48 bits of the COMB. To generate a
+ * timestamp-first COMB, set the TimestampFirstCombCodec as the codec, along
+ * with the CombGenerator as the random generator.
+ *
+ * ``` php
+ * $factory = new UuidFactory();
+ *
+ * $factory->setCodec(new TimestampFirstCombCodec($factory->getUuidBuilder()));
+ *
+ * $factory->setRandomGenerator(new CombGenerator(
+ * $factory->getRandomGenerator(),
+ * $factory->getNumberConverter()
+ * ));
+ *
+ * $timestampFirstComb = $factory->uuid4();
+ * ```
+ *
+ * @link https://www.informit.com/articles/printerfriendly/25862 The Cost of GUIDs as Primary Keys
+ *
+ * @psalm-immutable
+ */
+class TimestampFirstCombCodec extends StringCodec
+{
+ /**
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function encode(UuidInterface $uuid): string
+ {
+ $bytes = $this->swapBytes($uuid->getFields()->getBytes());
+
+ return sprintf(
+ '%08s-%04s-%04s-%04s-%012s',
+ bin2hex(substr($bytes, 0, 4)),
+ bin2hex(substr($bytes, 4, 2)),
+ bin2hex(substr($bytes, 6, 2)),
+ bin2hex(substr($bytes, 8, 2)),
+ bin2hex(substr($bytes, 10))
+ );
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function encodeBinary(UuidInterface $uuid): string
+ {
+ /** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
+ return $this->swapBytes($uuid->getFields()->getBytes());
+ }
+
+ /**
+ * @throws InvalidUuidStringException
+ *
+ * @inheritDoc
+ */
+ public function decode(string $encodedUuid): UuidInterface
+ {
+ $bytes = $this->getBytes($encodedUuid);
+
+ return $this->getBuilder()->build($this, $this->swapBytes($bytes));
+ }
+
+ public function decodeBytes(string $bytes): UuidInterface
+ {
+ return $this->getBuilder()->build($this, $this->swapBytes($bytes));
+ }
+
+ /**
+ * Swaps bytes according to the timestamp-first COMB rules
+ */
+ private function swapBytes(string $bytes): string
+ {
+ $first48Bits = substr($bytes, 0, 6);
+ $last48Bits = substr($bytes, -6);
+
+ $bytes = substr_replace($bytes, $last48Bits, 0, 6);
+ $bytes = substr_replace($bytes, $first48Bits, -6);
+
+ return $bytes;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.php
new file mode 100644
index 00000000..4856deae
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.php
@@ -0,0 +1,51 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Codec;
+
+/**
+ * TimestampLastCombCodec encodes and decodes COMBs, with the timestamp as the
+ * last 48 bits
+ *
+ * The CombGenerator when used with the StringCodec (and, by proxy, the
+ * TimestampLastCombCodec) adds the timestamp to the last 48 bits of the COMB.
+ * The TimestampLastCombCodec is provided for the sake of consistency. In
+ * practice, it is identical to the standard StringCodec but, it may be used
+ * with the CombGenerator for additional context when reading code.
+ *
+ * Consider the following code. By default, the codec used by UuidFactory is the
+ * StringCodec, but here, we explicitly set the TimestampLastCombCodec. It is
+ * redundant, but it is clear that we intend this COMB to be generated with the
+ * timestamp appearing at the end.
+ *
+ * ``` php
+ * $factory = new UuidFactory();
+ *
+ * $factory->setCodec(new TimestampLastCombCodec($factory->getUuidBuilder()));
+ *
+ * $factory->setRandomGenerator(new CombGenerator(
+ * $factory->getRandomGenerator(),
+ * $factory->getNumberConverter()
+ * ));
+ *
+ * $timestampLastComb = $factory->uuid4();
+ * ```
+ *
+ * @link https://www.informit.com/articles/printerfriendly/25862 The Cost of GUIDs as Primary Keys
+ *
+ * @psalm-immutable
+ */
+class TimestampLastCombCodec extends StringCodec
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php
new file mode 100644
index 00000000..fef63fd0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.php
@@ -0,0 +1,57 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Number;
+
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Math\BrickMathCalculator;
+
+/**
+ * Previously used to integrate moontoast/math as a bignum arithmetic library,
+ * BigNumberConverter is deprecated in favor of GenericNumberConverter
+ *
+ * @deprecated Transition to {@see GenericNumberConverter}.
+ *
+ * @psalm-immutable
+ */
+class BigNumberConverter implements NumberConverterInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $converter;
+
+ public function __construct()
+ {
+ $this->converter = new GenericNumberConverter(new BrickMathCalculator());
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ */
+ public function fromHex(string $hex): string
+ {
+ return $this->converter->fromHex($hex);
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ */
+ public function toHex(string $number): string
+ {
+ return $this->converter->toHex($number);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php
new file mode 100644
index 00000000..c9cfa686
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Number;
+
+/**
+ * @deprecated DegradedNumberConverter is no longer necessary for converting
+ * numbers on 32-bit systems. Transition to {@see GenericNumberConverter}.
+ *
+ * @psalm-immutable
+ */
+class DegradedNumberConverter extends BigNumberConverter
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php
new file mode 100644
index 00000000..501eac0f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php
@@ -0,0 +1,63 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Number;
+
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Math\CalculatorInterface;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+
+/**
+ * GenericNumberConverter uses the provided calculator to convert decimal
+ * numbers to and from hexadecimal values
+ *
+ * @psalm-immutable
+ */
+class GenericNumberConverter implements NumberConverterInterface
+{
+ /**
+ * @var CalculatorInterface
+ */
+ private $calculator;
+
+ public function __construct(CalculatorInterface $calculator)
+ {
+ $this->calculator = $calculator;
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ * @psalm-return numeric-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function fromHex(string $hex): string
+ {
+ return $this->calculator->fromBase($hex, 16)->toString();
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function toHex(string $number): string
+ {
+ /** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
+ return $this->calculator->toBase(new IntegerObject($number), 16);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php
new file mode 100644
index 00000000..b33ec31f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php
@@ -0,0 +1,57 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter;
+
+/**
+ * A number converter converts UUIDs from hexadecimal characters into
+ * representations of integers and vice versa
+ *
+ * @psalm-immutable
+ */
+interface NumberConverterInterface
+{
+ /**
+ * Converts a hexadecimal number into an string integer representation of
+ * the number
+ *
+ * The integer representation returned is a string representation of the
+ * integer, to accommodate unsigned integers greater than PHP_INT_MAX.
+ *
+ * @param string $hex The hexadecimal string representation to convert
+ *
+ * @return string String representation of an integer
+ *
+ * @psalm-return numeric-string
+ *
+ * @psalm-pure
+ */
+ public function fromHex(string $hex): string;
+
+ /**
+ * Converts a string integer representation into a hexadecimal string
+ * representation of the number
+ *
+ * @param string $number A string integer representation to convert; this
+ * must be a numeric string to accommodate unsigned integers greater
+ * than PHP_INT_MAX.
+ *
+ * @return string Hexadecimal string
+ *
+ * @psalm-return non-empty-string
+ *
+ * @psalm-pure
+ */
+ public function toHex(string $number): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php
new file mode 100644
index 00000000..7390dad8
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php
@@ -0,0 +1,51 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Time;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Math\BrickMathCalculator;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Time;
+
+/**
+ * Previously used to integrate moontoast/math as a bignum arithmetic library,
+ * BigNumberTimeConverter is deprecated in favor of GenericTimeConverter
+ *
+ * @deprecated Transition to {@see GenericTimeConverter}.
+ *
+ * @psalm-immutable
+ */
+class BigNumberTimeConverter implements TimeConverterInterface
+{
+ /**
+ * @var TimeConverterInterface
+ */
+ private $converter;
+
+ public function __construct()
+ {
+ $this->converter = new GenericTimeConverter(new BrickMathCalculator());
+ }
+
+ public function calculateTime(string $seconds, string $microseconds): Hexadecimal
+ {
+ return $this->converter->calculateTime($seconds, $microseconds);
+ }
+
+ public function convertTime(Hexadecimal $uuidTimestamp): Time
+ {
+ return $this->converter->convertTime($uuidTimestamp);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php
new file mode 100644
index 00000000..cdc28752
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Time;
+
+/**
+ * @deprecated DegradedTimeConverter is no longer necessary for converting
+ * time on 32-bit systems. Transition to {@see GenericTimeConverter}.
+ *
+ * @psalm-immutable
+ */
+class DegradedTimeConverter extends BigNumberTimeConverter
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php
new file mode 100644
index 00000000..a8aa64b7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php
@@ -0,0 +1,124 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Time;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Math\CalculatorInterface;
+use Ramsey\Uuid\Math\RoundingMode;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\Time;
+
+use function explode;
+use function str_pad;
+
+use const STR_PAD_LEFT;
+
+/**
+ * GenericTimeConverter uses the provided calculator to calculate and convert
+ * time values
+ *
+ * @psalm-immutable
+ */
+class GenericTimeConverter implements TimeConverterInterface
+{
+ /**
+ * The number of 100-nanosecond intervals from the Gregorian calendar epoch
+ * to the Unix epoch.
+ */
+ private const GREGORIAN_TO_UNIX_INTERVALS = '122192928000000000';
+
+ /**
+ * The number of 100-nanosecond intervals in one second.
+ */
+ private const SECOND_INTERVALS = '10000000';
+
+ /**
+ * The number of 100-nanosecond intervals in one microsecond.
+ */
+ private const MICROSECOND_INTERVALS = '10';
+
+ /**
+ * @var CalculatorInterface
+ */
+ private $calculator;
+
+ public function __construct(CalculatorInterface $calculator)
+ {
+ $this->calculator = $calculator;
+ }
+
+ public function calculateTime(string $seconds, string $microseconds): Hexadecimal
+ {
+ $timestamp = new Time($seconds, $microseconds);
+
+ // Convert the seconds into a count of 100-nanosecond intervals.
+ $sec = $this->calculator->multiply(
+ $timestamp->getSeconds(),
+ new IntegerObject(self::SECOND_INTERVALS)
+ );
+
+ // Convert the microseconds into a count of 100-nanosecond intervals.
+ $usec = $this->calculator->multiply(
+ $timestamp->getMicroseconds(),
+ new IntegerObject(self::MICROSECOND_INTERVALS)
+ );
+
+ // Combine the seconds and microseconds intervals and add the count of
+ // 100-nanosecond intervals from the Gregorian calendar epoch to the
+ // Unix epoch. This gives us the correct count of 100-nanosecond
+ // intervals since the Gregorian calendar epoch for the given seconds
+ // and microseconds.
+ /** @var IntegerObject $uuidTime */
+ $uuidTime = $this->calculator->add(
+ $sec,
+ $usec,
+ new IntegerObject(self::GREGORIAN_TO_UNIX_INTERVALS)
+ );
+
+ $uuidTimeHex = str_pad(
+ $this->calculator->toHexadecimal($uuidTime)->toString(),
+ 16,
+ '0',
+ STR_PAD_LEFT
+ );
+
+ return new Hexadecimal($uuidTimeHex);
+ }
+
+ public function convertTime(Hexadecimal $uuidTimestamp): Time
+ {
+ // From the total, subtract the number of 100-nanosecond intervals from
+ // the Gregorian calendar epoch to the Unix epoch. This gives us the
+ // number of 100-nanosecond intervals from the Unix epoch, which also
+ // includes the microtime.
+ $epochNanoseconds = $this->calculator->subtract(
+ $this->calculator->toInteger($uuidTimestamp),
+ new IntegerObject(self::GREGORIAN_TO_UNIX_INTERVALS)
+ );
+
+ // Convert the 100-nanosecond intervals into seconds and microseconds.
+ $unixTimestamp = $this->calculator->divide(
+ RoundingMode::HALF_UP,
+ 6,
+ $epochNanoseconds,
+ new IntegerObject(self::SECOND_INTERVALS)
+ );
+
+ $split = explode('.', (string) $unixTimestamp, 2);
+
+ return new Time($split[0], $split[1] ?? 0);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php
new file mode 100644
index 00000000..538d2f2f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php
@@ -0,0 +1,183 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter\Time;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Math\BrickMathCalculator;
+use Ramsey\Uuid\Math\CalculatorInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\Time;
+
+use function count;
+use function dechex;
+use function explode;
+use function is_float;
+use function is_int;
+use function str_pad;
+use function strlen;
+use function substr;
+
+use const STR_PAD_LEFT;
+use const STR_PAD_RIGHT;
+
+/**
+ * PhpTimeConverter uses built-in PHP functions and standard math operations
+ * available to the PHP programming language to provide facilities for
+ * converting parts of time into representations that may be used in UUIDs
+ *
+ * @psalm-immutable
+ */
+class PhpTimeConverter implements TimeConverterInterface
+{
+ /**
+ * The number of 100-nanosecond intervals from the Gregorian calendar epoch
+ * to the Unix epoch.
+ */
+ private const GREGORIAN_TO_UNIX_INTERVALS = 0x01b21dd213814000;
+
+ /**
+ * The number of 100-nanosecond intervals in one second.
+ */
+ private const SECOND_INTERVALS = 10000000;
+
+ /**
+ * The number of 100-nanosecond intervals in one microsecond.
+ */
+ private const MICROSECOND_INTERVALS = 10;
+
+ /**
+ * @var CalculatorInterface
+ */
+ private $calculator;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $fallbackConverter;
+
+ /**
+ * @var int
+ */
+ private $phpPrecision;
+
+ public function __construct(
+ ?CalculatorInterface $calculator = null,
+ ?TimeConverterInterface $fallbackConverter = null
+ ) {
+ if ($calculator === null) {
+ $calculator = new BrickMathCalculator();
+ }
+
+ if ($fallbackConverter === null) {
+ $fallbackConverter = new GenericTimeConverter($calculator);
+ }
+
+ $this->calculator = $calculator;
+ $this->fallbackConverter = $fallbackConverter;
+ $this->phpPrecision = (int) ini_get('precision');
+ }
+
+ public function calculateTime(string $seconds, string $microseconds): Hexadecimal
+ {
+ $seconds = new IntegerObject($seconds);
+ $microseconds = new IntegerObject($microseconds);
+
+ // Calculate the count of 100-nanosecond intervals since the Gregorian
+ // calendar epoch for the given seconds and microseconds.
+ $uuidTime = ((int) $seconds->toString() * self::SECOND_INTERVALS)
+ + ((int) $microseconds->toString() * self::MICROSECOND_INTERVALS)
+ + self::GREGORIAN_TO_UNIX_INTERVALS;
+
+ // Check to see whether we've overflowed the max/min integer size.
+ // If so, we will default to a different time converter.
+ /** @psalm-suppress RedundantCondition */
+ if (!is_int($uuidTime)) {
+ return $this->fallbackConverter->calculateTime(
+ $seconds->toString(),
+ $microseconds->toString()
+ );
+ }
+
+ return new Hexadecimal(str_pad(dechex($uuidTime), 16, '0', STR_PAD_LEFT));
+ }
+
+ public function convertTime(Hexadecimal $uuidTimestamp): Time
+ {
+ $timestamp = $this->calculator->toInteger($uuidTimestamp);
+
+ // Convert the 100-nanosecond intervals into seconds and microseconds.
+ $splitTime = $this->splitTime(
+ ((int) $timestamp->toString() - self::GREGORIAN_TO_UNIX_INTERVALS)
+ / self::SECOND_INTERVALS
+ );
+
+ if (count($splitTime) === 0) {
+ return $this->fallbackConverter->convertTime($uuidTimestamp);
+ }
+
+ return new Time($splitTime['sec'], $splitTime['usec']);
+ }
+
+ /**
+ * @param int|float $time The time to split into seconds and microseconds
+ *
+ * @return string[]
+ */
+ private function splitTime($time): array
+ {
+ $split = explode('.', (string) $time, 2);
+
+ // If the $time value is a float but $split only has 1 element, then the
+ // float math was rounded up to the next second, so we want to return
+ // an empty array to allow use of the fallback converter.
+ if (is_float($time) && count($split) === 1) {
+ return [];
+ }
+
+ if (count($split) === 1) {
+ return [
+ 'sec' => $split[0],
+ 'usec' => '0',
+ ];
+ }
+
+ // If the microseconds are less than six characters AND the length of
+ // the number is greater than or equal to the PHP precision, then it's
+ // possible that we lost some precision for the microseconds. Return an
+ // empty array, so that we can choose to use the fallback converter.
+ if (strlen($split[1]) < 6 && strlen((string) $time) >= $this->phpPrecision) {
+ return [];
+ }
+
+ $microseconds = $split[1];
+
+ // Ensure the microseconds are no longer than 6 digits. If they are,
+ // truncate the number to the first 6 digits and round up, if needed.
+ if (strlen($microseconds) > 6) {
+ $roundingDigit = (int) substr($microseconds, 6, 1);
+ $microseconds = (int) substr($microseconds, 0, 6);
+
+ if ($roundingDigit >= 5) {
+ $microseconds++;
+ }
+ }
+
+ return [
+ 'sec' => $split[0],
+ 'usec' => str_pad((string) $microseconds, 6, '0', STR_PAD_RIGHT),
+ ];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/TimeConverterInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/TimeConverterInterface.php
new file mode 100644
index 00000000..1e848070
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Converter/TimeConverterInterface.php
@@ -0,0 +1,58 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Converter;
+
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Time;
+
+/**
+ * A time converter converts timestamps into representations that may be used
+ * in UUIDs
+ *
+ * @psalm-immutable
+ */
+interface TimeConverterInterface
+{
+ /**
+ * Uses the provided seconds and micro-seconds to calculate the count of
+ * 100-nanosecond intervals since UTC 00:00:00.00, 15 October 1582, for
+ * RFC 4122 variant UUIDs
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.2.2 RFC 4122, § 4.2.2: Generation Details
+ *
+ * @param string $seconds A string representation of the number of seconds
+ * since the Unix epoch for the time to calculate
+ * @param string $microseconds A string representation of the micro-seconds
+ * associated with the time to calculate
+ *
+ * @return Hexadecimal The full UUID timestamp as a Hexadecimal value
+ *
+ * @psalm-pure
+ */
+ public function calculateTime(string $seconds, string $microseconds): Hexadecimal;
+
+ /**
+ * Converts a timestamp extracted from a UUID to a Unix timestamp
+ *
+ * @param Hexadecimal $uuidTimestamp A hexadecimal representation of a UUID
+ * timestamp; a UUID timestamp is a count of 100-nanosecond intervals
+ * since UTC 00:00:00.00, 15 October 1582.
+ *
+ * @return Time An instance of {@see Time}
+ *
+ * @psalm-pure
+ */
+ public function convertTime(Hexadecimal $uuidTimestamp): Time;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DegradedUuid.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DegradedUuid.php
new file mode 100644
index 00000000..9166042c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DegradedUuid.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+/**
+ * @deprecated DegradedUuid is no longer necessary to represent UUIDs on 32-bit
+ * systems. Transition typehints to {@see UuidInterface}.
+ *
+ * @psalm-immutable
+ */
+class DegradedUuid extends Uuid
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php
new file mode 100644
index 00000000..ed6d9dec
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidInterface.php
@@ -0,0 +1,147 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use DateTimeInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+
+/**
+ * This interface encapsulates deprecated methods for ramsey/uuid; this
+ * interface and its methods will be removed in ramsey/uuid 5.0.0.
+ *
+ * @psalm-immutable
+ */
+interface DeprecatedUuidInterface
+{
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no alternative
+ * recommendation, so plan accordingly.
+ */
+ public function getNumberConverter(): NumberConverterInterface;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance.
+ *
+ * @return string[]
+ */
+ public function getFieldsHex(): array;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqHiAndReserved()}.
+ */
+ public function getClockSeqHiAndReservedHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeqLow()}.
+ */
+ public function getClockSeqLowHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getClockSeq()}.
+ */
+ public function getClockSequenceHex(): string;
+
+ /**
+ * @deprecated In ramsey/uuid version 5.0.0, this will be removed from the
+ * interface. It is available at {@see UuidV1::getDateTime()}.
+ */
+ public function getDateTime(): DateTimeInterface;
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getLeastSignificantBitsHex(): string;
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getMostSignificantBitsHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getNode()}.
+ */
+ public function getNodeHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeHiAndVersion()}.
+ */
+ public function getTimeHiAndVersionHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeLow()}.
+ */
+ public function getTimeLowHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimeMid()}.
+ */
+ public function getTimeMidHex(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getTimestamp()}.
+ */
+ public function getTimestampHex(): string;
+
+ /**
+ * @deprecated In ramsey/uuid version 5.0.0, this will be removed from this
+ * interface. It has moved to {@see \Ramsey\Uuid\Rfc4122\UuidInterface::getUrn()}.
+ */
+ public function getUrn(): string;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVariant()}.
+ */
+ public function getVariant(): ?int;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVersion()}.
+ */
+ public function getVersion(): ?int;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php
new file mode 100644
index 00000000..34282952
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php
@@ -0,0 +1,370 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use DateTimeImmutable;
+use DateTimeInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\DateTimeException;
+use Ramsey\Uuid\Exception\UnsupportedOperationException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Throwable;
+
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * This trait encapsulates deprecated methods for ramsey/uuid; this trait and
+ * its methods will be removed in ramsey/uuid 5.0.0.
+ *
+ * @psalm-immutable
+ */
+trait DeprecatedUuidMethodsTrait
+{
+ /**
+ * @var Rfc4122FieldsInterface
+ */
+ protected $fields;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ protected $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ protected $timeConverter;
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getClockSeqHiAndReserved(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getClockSeqHiAndReserved()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}.
+ */
+ public function getClockSeqHiAndReservedHex(): string
+ {
+ return $this->fields->getClockSeqHiAndReserved()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getClockSeqLow(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getClockSeqLow()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()}.
+ */
+ public function getClockSeqLowHex(): string
+ {
+ return $this->fields->getClockSeqLow()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getClockSequence(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getClockSeq()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()}.
+ */
+ public function getClockSequenceHex(): string
+ {
+ return $this->fields->getClockSeq()->toString();
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no alternative
+ * recommendation, so plan accordingly.
+ */
+ public function getNumberConverter(): NumberConverterInterface
+ {
+ return $this->numberConverter;
+ }
+
+ /**
+ * @deprecated In ramsey/uuid version 5.0.0, this will be removed.
+ * It is available at {@see UuidV1::getDateTime()}.
+ *
+ * @return DateTimeImmutable An immutable instance of DateTimeInterface
+ *
+ * @throws UnsupportedOperationException if UUID is not time-based
+ * @throws DateTimeException if DateTime throws an exception/error
+ */
+ public function getDateTime(): DateTimeInterface
+ {
+ if ($this->fields->getVersion() !== 1) {
+ throw new UnsupportedOperationException('Not a time-based UUID');
+ }
+
+ $time = $this->timeConverter->convertTime($this->fields->getTimestamp());
+
+ try {
+ return new DateTimeImmutable(
+ '@'
+ . $time->getSeconds()->toString()
+ . '.'
+ . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
+ );
+ } catch (Throwable $e) {
+ throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance.
+ *
+ * @return string[]
+ */
+ public function getFieldsHex(): array
+ {
+ return [
+ 'time_low' => $this->fields->getTimeLow()->toString(),
+ 'time_mid' => $this->fields->getTimeMid()->toString(),
+ 'time_hi_and_version' => $this->fields->getTimeHiAndVersion()->toString(),
+ 'clock_seq_hi_and_reserved' => $this->fields->getClockSeqHiAndReserved()->toString(),
+ 'clock_seq_low' => $this->fields->getClockSeqLow()->toString(),
+ 'node' => $this->fields->getNode()->toString(),
+ ];
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getLeastSignificantBits(): string
+ {
+ $leastSignificantHex = substr($this->getHex()->toString(), 16);
+
+ return $this->numberConverter->fromHex($leastSignificantHex);
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getLeastSignificantBitsHex(): string
+ {
+ return substr($this->getHex()->toString(), 16);
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getMostSignificantBits(): string
+ {
+ $mostSignificantHex = substr($this->getHex()->toString(), 0, 16);
+
+ return $this->numberConverter->fromHex($mostSignificantHex);
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ */
+ public function getMostSignificantBitsHex(): string
+ {
+ return substr($this->getHex()->toString(), 0, 16);
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getNode()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getNode(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getNode()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getNode()}.
+ */
+ public function getNodeHex(): string
+ {
+ return $this->fields->getNode()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getTimeHiAndVersion(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getTimeHiAndVersion()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()}.
+ */
+ public function getTimeHiAndVersionHex(): string
+ {
+ return $this->fields->getTimeHiAndVersion()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getTimeLow(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getTimeLow()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()}.
+ */
+ public function getTimeLowHex(): string
+ {
+ return $this->fields->getTimeLow()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getTimeMid(): string
+ {
+ return $this->numberConverter->fromHex($this->fields->getTimeMid()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()}.
+ */
+ public function getTimeMidHex(): string
+ {
+ return $this->fields->getTimeMid()->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ */
+ public function getTimestamp(): string
+ {
+ if ($this->fields->getVersion() !== 1) {
+ throw new UnsupportedOperationException('Not a time-based UUID');
+ }
+
+ return $this->numberConverter->fromHex($this->fields->getTimestamp()->toString());
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()}.
+ */
+ public function getTimestampHex(): string
+ {
+ if ($this->fields->getVersion() !== 1) {
+ throw new UnsupportedOperationException('Not a time-based UUID');
+ }
+
+ return $this->fields->getTimestamp()->toString();
+ }
+
+ /**
+ * @deprecated This has moved to {@see Rfc4122FieldsInterface::getUrn()} and
+ * is available on {@see \Ramsey\Uuid\Rfc4122\UuidV1},
+ * {@see \Ramsey\Uuid\Rfc4122\UuidV3}, {@see \Ramsey\Uuid\Rfc4122\UuidV4},
+ * and {@see \Ramsey\Uuid\Rfc4122\UuidV5}.
+ */
+ public function getUrn(): string
+ {
+ return 'urn:uuid:' . $this->toString();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVariant()}.
+ */
+ public function getVariant(): ?int
+ {
+ return $this->fields->getVariant();
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface} instance, you may call
+ * {@see \Ramsey\Uuid\Rfc4122\FieldsInterface::getVersion()}.
+ */
+ public function getVersion(): ?int
+ {
+ return $this->fields->getVersion();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.php
new file mode 100644
index 00000000..220ffedb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that no suitable builder could be found
+ */
+class BuilderNotFoundException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DateTimeException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DateTimeException.php
new file mode 100644
index 00000000..5f0e658b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DateTimeException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that the PHP DateTime extension encountered an exception/error
+ */
+class DateTimeException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DceSecurityException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DceSecurityException.php
new file mode 100644
index 00000000..e6d80013
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/DceSecurityException.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate an exception occurred while dealing with DCE Security
+ * (version 2) UUIDs
+ */
+class DceSecurityException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidArgumentException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidArgumentException.php
new file mode 100644
index 00000000..2a1fa3ac
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidArgumentException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use InvalidArgumentException as PhpInvalidArgumentException;
+
+/**
+ * Thrown to indicate that the argument received is not valid
+ */
+class InvalidArgumentException extends PhpInvalidArgumentException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidBytesException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidBytesException.php
new file mode 100644
index 00000000..1c94f659
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidBytesException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that the bytes being operated on are invalid in some way
+ */
+class InvalidBytesException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.php
new file mode 100644
index 00000000..6d975816
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+/**
+ * Thrown to indicate that the string received is not a valid UUID
+ *
+ * The InvalidArgumentException that this extends is the ramsey/uuid version
+ * of this exception. It exists in the same namespace as this class.
+ */
+class InvalidUuidStringException extends InvalidArgumentException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NameException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NameException.php
new file mode 100644
index 00000000..fd96a1fa
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NameException.php
@@ -0,0 +1,25 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that an error occurred while attempting to hash a
+ * namespace and name
+ */
+class NameException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NodeException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NodeException.php
new file mode 100644
index 00000000..0dbdd50b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/NodeException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that attempting to fetch or create a node ID encountered an error
+ */
+class NodeException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/RandomSourceException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/RandomSourceException.php
new file mode 100644
index 00000000..a44dd34a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/RandomSourceException.php
@@ -0,0 +1,27 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that the source of random data encountered an error
+ *
+ * This exception is used mostly to indicate that random_bytes() or random_int()
+ * threw an exception. However, it may be used for other sources of random data.
+ */
+class RandomSourceException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/TimeSourceException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/TimeSourceException.php
new file mode 100644
index 00000000..fc9cf36b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/TimeSourceException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate that the source of time encountered an error
+ */
+class TimeSourceException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.php
new file mode 100644
index 00000000..5ba26d8d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use RuntimeException as PhpRuntimeException;
+
+/**
+ * Thrown to indicate a builder is unable to build a UUID
+ */
+class UnableToBuildUuidException extends PhpRuntimeException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnsupportedOperationException.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnsupportedOperationException.php
new file mode 100644
index 00000000..e1b3eda1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UnsupportedOperationException.php
@@ -0,0 +1,24 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use LogicException as PhpLogicException;
+
+/**
+ * Thrown to indicate that the requested operation is not supported
+ */
+class UnsupportedOperationException extends PhpLogicException implements UuidExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UuidExceptionInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UuidExceptionInterface.php
new file mode 100644
index 00000000..a2f1c103
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Exception/UuidExceptionInterface.php
@@ -0,0 +1,21 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Exception;
+
+use Throwable;
+
+interface UuidExceptionInterface extends Throwable
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/FeatureSet.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/FeatureSet.php
new file mode 100644
index 00000000..a8ab2fdb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/FeatureSet.php
@@ -0,0 +1,449 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use Ramsey\Uuid\Builder\BuilderCollection;
+use Ramsey\Uuid\Builder\FallbackBuilder;
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Codec\GuidStringCodec;
+use Ramsey\Uuid\Codec\StringCodec;
+use Ramsey\Uuid\Converter\Number\GenericNumberConverter;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\Time\GenericTimeConverter;
+use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Generator\DceSecurityGenerator;
+use Ramsey\Uuid\Generator\DceSecurityGeneratorInterface;
+use Ramsey\Uuid\Generator\NameGeneratorFactory;
+use Ramsey\Uuid\Generator\NameGeneratorInterface;
+use Ramsey\Uuid\Generator\PeclUuidNameGenerator;
+use Ramsey\Uuid\Generator\PeclUuidRandomGenerator;
+use Ramsey\Uuid\Generator\PeclUuidTimeGenerator;
+use Ramsey\Uuid\Generator\RandomGeneratorFactory;
+use Ramsey\Uuid\Generator\RandomGeneratorInterface;
+use Ramsey\Uuid\Generator\TimeGeneratorFactory;
+use Ramsey\Uuid\Generator\TimeGeneratorInterface;
+use Ramsey\Uuid\Guid\GuidBuilder;
+use Ramsey\Uuid\Math\BrickMathCalculator;
+use Ramsey\Uuid\Math\CalculatorInterface;
+use Ramsey\Uuid\Nonstandard\UuidBuilder as NonstandardUuidBuilder;
+use Ramsey\Uuid\Provider\Dce\SystemDceSecurityProvider;
+use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
+use Ramsey\Uuid\Provider\Node\FallbackNodeProvider;
+use Ramsey\Uuid\Provider\Node\NodeProviderCollection;
+use Ramsey\Uuid\Provider\Node\RandomNodeProvider;
+use Ramsey\Uuid\Provider\Node\SystemNodeProvider;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Provider\Time\SystemTimeProvider;
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;
+use Ramsey\Uuid\Validator\GenericValidator;
+use Ramsey\Uuid\Validator\ValidatorInterface;
+
+use const PHP_INT_SIZE;
+
+/**
+ * FeatureSet detects and exposes available features in the current environment
+ *
+ * A feature set is used by UuidFactory to determine the available features and
+ * capabilities of the environment.
+ */
+class FeatureSet
+{
+ /**
+ * @var bool
+ */
+ private $disableBigNumber = false;
+
+ /**
+ * @var bool
+ */
+ private $disable64Bit = false;
+
+ /**
+ * @var bool
+ */
+ private $ignoreSystemNode = false;
+
+ /**
+ * @var bool
+ */
+ private $enablePecl = false;
+
+ /**
+ * @var UuidBuilderInterface
+ */
+ private $builder;
+
+ /**
+ * @var CodecInterface
+ */
+ private $codec;
+
+ /**
+ * @var DceSecurityGeneratorInterface
+ */
+ private $dceSecurityGenerator;
+
+ /**
+ * @var NameGeneratorInterface
+ */
+ private $nameGenerator;
+
+ /**
+ * @var NodeProviderInterface
+ */
+ private $nodeProvider;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @var RandomGeneratorInterface
+ */
+ private $randomGenerator;
+
+ /**
+ * @var TimeGeneratorInterface
+ */
+ private $timeGenerator;
+
+ /**
+ * @var TimeProviderInterface
+ */
+ private $timeProvider;
+
+ /**
+ * @var ValidatorInterface
+ */
+ private $validator;
+
+ /**
+ * @var CalculatorInterface
+ */
+ private $calculator;
+
+ /**
+ * @param bool $useGuids True build UUIDs using the GuidStringCodec
+ * @param bool $force32Bit True to force the use of 32-bit functionality
+ * (primarily for testing purposes)
+ * @param bool $forceNoBigNumber True to disable the use of moontoast/math
+ * (primarily for testing purposes)
+ * @param bool $ignoreSystemNode True to disable attempts to check for the
+ * system node ID (primarily for testing purposes)
+ * @param bool $enablePecl True to enable the use of the PeclUuidTimeGenerator
+ * to generate version 1 UUIDs
+ */
+ public function __construct(
+ bool $useGuids = false,
+ bool $force32Bit = false,
+ bool $forceNoBigNumber = false,
+ bool $ignoreSystemNode = false,
+ bool $enablePecl = false
+ ) {
+ $this->disableBigNumber = $forceNoBigNumber;
+ $this->disable64Bit = $force32Bit;
+ $this->ignoreSystemNode = $ignoreSystemNode;
+ $this->enablePecl = $enablePecl;
+
+ $this->setCalculator(new BrickMathCalculator());
+ $this->builder = $this->buildUuidBuilder($useGuids);
+ $this->codec = $this->buildCodec($useGuids);
+ $this->nodeProvider = $this->buildNodeProvider();
+ $this->nameGenerator = $this->buildNameGenerator();
+ $this->randomGenerator = $this->buildRandomGenerator();
+ $this->setTimeProvider(new SystemTimeProvider());
+ $this->setDceSecurityProvider(new SystemDceSecurityProvider());
+ $this->validator = new GenericValidator();
+ }
+
+ /**
+ * Returns the builder configured for this environment
+ */
+ public function getBuilder(): UuidBuilderInterface
+ {
+ return $this->builder;
+ }
+
+ /**
+ * Returns the calculator configured for this environment
+ */
+ public function getCalculator(): CalculatorInterface
+ {
+ return $this->calculator;
+ }
+
+ /**
+ * Returns the codec configured for this environment
+ */
+ public function getCodec(): CodecInterface
+ {
+ return $this->codec;
+ }
+
+ /**
+ * Returns the DCE Security generator configured for this environment
+ */
+ public function getDceSecurityGenerator(): DceSecurityGeneratorInterface
+ {
+ return $this->dceSecurityGenerator;
+ }
+
+ /**
+ * Returns the name generator configured for this environment
+ */
+ public function getNameGenerator(): NameGeneratorInterface
+ {
+ return $this->nameGenerator;
+ }
+
+ /**
+ * Returns the node provider configured for this environment
+ */
+ public function getNodeProvider(): NodeProviderInterface
+ {
+ return $this->nodeProvider;
+ }
+
+ /**
+ * Returns the number converter configured for this environment
+ */
+ public function getNumberConverter(): NumberConverterInterface
+ {
+ return $this->numberConverter;
+ }
+
+ /**
+ * Returns the random generator configured for this environment
+ */
+ public function getRandomGenerator(): RandomGeneratorInterface
+ {
+ return $this->randomGenerator;
+ }
+
+ /**
+ * Returns the time converter configured for this environment
+ */
+ public function getTimeConverter(): TimeConverterInterface
+ {
+ return $this->timeConverter;
+ }
+
+ /**
+ * Returns the time generator configured for this environment
+ */
+ public function getTimeGenerator(): TimeGeneratorInterface
+ {
+ return $this->timeGenerator;
+ }
+
+ /**
+ * Returns the validator configured for this environment
+ */
+ public function getValidator(): ValidatorInterface
+ {
+ return $this->validator;
+ }
+
+ /**
+ * Sets the calculator to use in this environment
+ */
+ public function setCalculator(CalculatorInterface $calculator): void
+ {
+ $this->calculator = $calculator;
+ $this->numberConverter = $this->buildNumberConverter($calculator);
+ $this->timeConverter = $this->buildTimeConverter($calculator);
+
+ /** @psalm-suppress RedundantPropertyInitializationCheck */
+ if (isset($this->timeProvider)) {
+ $this->timeGenerator = $this->buildTimeGenerator($this->timeProvider);
+ }
+ }
+
+ /**
+ * Sets the DCE Security provider to use in this environment
+ */
+ public function setDceSecurityProvider(DceSecurityProviderInterface $dceSecurityProvider): void
+ {
+ $this->dceSecurityGenerator = $this->buildDceSecurityGenerator($dceSecurityProvider);
+ }
+
+ /**
+ * Sets the node provider to use in this environment
+ */
+ public function setNodeProvider(NodeProviderInterface $nodeProvider): void
+ {
+ $this->nodeProvider = $nodeProvider;
+ $this->timeGenerator = $this->buildTimeGenerator($this->timeProvider);
+ }
+
+ /**
+ * Sets the time provider to use in this environment
+ */
+ public function setTimeProvider(TimeProviderInterface $timeProvider): void
+ {
+ $this->timeProvider = $timeProvider;
+ $this->timeGenerator = $this->buildTimeGenerator($timeProvider);
+ }
+
+ /**
+ * Set the validator to use in this environment
+ */
+ public function setValidator(ValidatorInterface $validator): void
+ {
+ $this->validator = $validator;
+ }
+
+ /**
+ * Returns a codec configured for this environment
+ *
+ * @param bool $useGuids Whether to build UUIDs using the GuidStringCodec
+ */
+ private function buildCodec(bool $useGuids = false): CodecInterface
+ {
+ if ($useGuids) {
+ return new GuidStringCodec($this->builder);
+ }
+
+ return new StringCodec($this->builder);
+ }
+
+ /**
+ * Returns a DCE Security generator configured for this environment
+ */
+ private function buildDceSecurityGenerator(
+ DceSecurityProviderInterface $dceSecurityProvider
+ ): DceSecurityGeneratorInterface {
+ return new DceSecurityGenerator(
+ $this->numberConverter,
+ $this->timeGenerator,
+ $dceSecurityProvider
+ );
+ }
+
+ /**
+ * Returns a node provider configured for this environment
+ */
+ private function buildNodeProvider(): NodeProviderInterface
+ {
+ if ($this->ignoreSystemNode) {
+ return new RandomNodeProvider();
+ }
+
+ return new FallbackNodeProvider(new NodeProviderCollection([
+ new SystemNodeProvider(),
+ new RandomNodeProvider(),
+ ]));
+ }
+
+ /**
+ * Returns a number converter configured for this environment
+ */
+ private function buildNumberConverter(CalculatorInterface $calculator): NumberConverterInterface
+ {
+ return new GenericNumberConverter($calculator);
+ }
+
+ /**
+ * Returns a random generator configured for this environment
+ */
+ private function buildRandomGenerator(): RandomGeneratorInterface
+ {
+ if ($this->enablePecl) {
+ return new PeclUuidRandomGenerator();
+ }
+
+ return (new RandomGeneratorFactory())->getGenerator();
+ }
+
+ /**
+ * Returns a time generator configured for this environment
+ *
+ * @param TimeProviderInterface $timeProvider The time provider to use with
+ * the time generator
+ */
+ private function buildTimeGenerator(TimeProviderInterface $timeProvider): TimeGeneratorInterface
+ {
+ if ($this->enablePecl) {
+ return new PeclUuidTimeGenerator();
+ }
+
+ return (new TimeGeneratorFactory(
+ $this->nodeProvider,
+ $this->timeConverter,
+ $timeProvider
+ ))->getGenerator();
+ }
+
+ /**
+ * Returns a name generator configured for this environment
+ */
+ private function buildNameGenerator(): NameGeneratorInterface
+ {
+ if ($this->enablePecl) {
+ return new PeclUuidNameGenerator();
+ }
+
+ return (new NameGeneratorFactory())->getGenerator();
+ }
+
+ /**
+ * Returns a time converter configured for this environment
+ */
+ private function buildTimeConverter(CalculatorInterface $calculator): TimeConverterInterface
+ {
+ $genericConverter = new GenericTimeConverter($calculator);
+
+ if ($this->is64BitSystem()) {
+ return new PhpTimeConverter($calculator, $genericConverter);
+ }
+
+ return $genericConverter;
+ }
+
+ /**
+ * Returns a UUID builder configured for this environment
+ *
+ * @param bool $useGuids Whether to build UUIDs using the GuidStringCodec
+ */
+ private function buildUuidBuilder(bool $useGuids = false): UuidBuilderInterface
+ {
+ if ($useGuids) {
+ return new GuidBuilder($this->numberConverter, $this->timeConverter);
+ }
+
+ /** @psalm-suppress ImpureArgument */
+ return new FallbackBuilder(new BuilderCollection([
+ new Rfc4122UuidBuilder($this->numberConverter, $this->timeConverter),
+ new NonstandardUuidBuilder($this->numberConverter, $this->timeConverter),
+ ]));
+ }
+
+ /**
+ * Returns true if the PHP build is 64-bit
+ */
+ private function is64BitSystem(): bool
+ {
+ return PHP_INT_SIZE === 8 && !$this->disable64Bit;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/FieldsInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/FieldsInterface.php
new file mode 100644
index 00000000..f1b7a290
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/FieldsInterface.php
@@ -0,0 +1,32 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Fields;
+
+use Serializable;
+
+/**
+ * UUIDs are comprised of unsigned integers, the bytes of which are separated
+ * into fields and arranged in a particular layout defined by the specification
+ * for the variant
+ *
+ * @psalm-immutable
+ */
+interface FieldsInterface extends Serializable
+{
+ /**
+ * Returns the bytes that comprise the fields
+ */
+ public function getBytes(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php
new file mode 100644
index 00000000..16e6525d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.php
@@ -0,0 +1,86 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Fields;
+
+use ValueError;
+
+use function base64_decode;
+use function sprintf;
+use function strlen;
+
+/**
+ * Provides common serialization functionality to fields
+ *
+ * @psalm-immutable
+ */
+trait SerializableFieldsTrait
+{
+ /**
+ * @param string $bytes The bytes that comprise the fields
+ */
+ abstract public function __construct(string $bytes);
+
+ /**
+ * Returns the bytes that comprise the fields
+ */
+ abstract public function getBytes(): string;
+
+ /**
+ * Returns a string representation of object
+ */
+ public function serialize(): string
+ {
+ return $this->getBytes();
+ }
+
+ /**
+ * @return array{bytes: string}
+ */
+ public function __serialize(): array
+ {
+ return ['bytes' => $this->getBytes()];
+ }
+
+ /**
+ * Constructs the object from a serialized string representation
+ *
+ * @param string $serialized The serialized string representation of the object
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress UnusedMethodCall
+ */
+ public function unserialize($serialized): void
+ {
+ if (strlen($serialized) === 16) {
+ $this->__construct($serialized);
+ } else {
+ $this->__construct(base64_decode($serialized));
+ }
+ }
+
+ /**
+ * @param array{bytes: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['bytes'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['bytes']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/CombGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/CombGenerator.php
new file mode 100644
index 00000000..49b09381
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/CombGenerator.php
@@ -0,0 +1,127 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+
+use function bin2hex;
+use function explode;
+use function hex2bin;
+use function microtime;
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * CombGenerator generates COMBs (combined UUID/timestamp)
+ *
+ * The CombGenerator, when used with the StringCodec (and, by proxy, the
+ * TimestampLastCombCodec) or the TimestampFirstCombCodec, combines the current
+ * timestamp with a UUID (hence the name "COMB"). The timestamp either appears
+ * as the first or last 48 bits of the COMB, depending on the codec used.
+ *
+ * By default, COMBs will have the timestamp set as the last 48 bits of the
+ * identifier.
+ *
+ * ``` php
+ * $factory = new UuidFactory();
+ *
+ * $factory->setRandomGenerator(new CombGenerator(
+ * $factory->getRandomGenerator(),
+ * $factory->getNumberConverter()
+ * ));
+ *
+ * $comb = $factory->uuid4();
+ * ```
+ *
+ * To generate a COMB with the timestamp as the first 48 bits, set the
+ * TimestampFirstCombCodec as the codec.
+ *
+ * ``` php
+ * $factory->setCodec(new TimestampFirstCombCodec($factory->getUuidBuilder()));
+ * ```
+ *
+ * @link https://www.informit.com/articles/printerfriendly/25862 The Cost of GUIDs as Primary Keys
+ */
+class CombGenerator implements RandomGeneratorInterface
+{
+ public const TIMESTAMP_BYTES = 6;
+
+ /**
+ * @var RandomGeneratorInterface
+ */
+ private $randomGenerator;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ private $converter;
+
+ public function __construct(
+ RandomGeneratorInterface $generator,
+ NumberConverterInterface $numberConverter
+ ) {
+ $this->converter = $numberConverter;
+ $this->randomGenerator = $generator;
+ }
+
+ /**
+ * @throws InvalidArgumentException if $length is not a positive integer
+ * greater than or equal to CombGenerator::TIMESTAMP_BYTES
+ *
+ * @inheritDoc
+ */
+ public function generate(int $length): string
+ {
+ if ($length < self::TIMESTAMP_BYTES || $length < 0) {
+ throw new InvalidArgumentException(
+ 'Length must be a positive integer greater than or equal to ' . self::TIMESTAMP_BYTES
+ );
+ }
+
+ $hash = '';
+ if (self::TIMESTAMP_BYTES > 0 && $length > self::TIMESTAMP_BYTES) {
+ $hash = $this->randomGenerator->generate($length - self::TIMESTAMP_BYTES);
+ }
+
+ $lsbTime = str_pad(
+ $this->converter->toHex($this->timestamp()),
+ self::TIMESTAMP_BYTES * 2,
+ '0',
+ STR_PAD_LEFT
+ );
+
+ return (string) hex2bin(
+ str_pad(
+ bin2hex($hash),
+ $length - self::TIMESTAMP_BYTES,
+ '0'
+ )
+ . $lsbTime
+ );
+ }
+
+ /**
+ * Returns current timestamp a string integer, precise to 0.00001 seconds
+ */
+ private function timestamp(): string
+ {
+ $time = explode(' ', microtime(false));
+
+ return $time[1] . substr($time[0], 2, 5);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php
new file mode 100644
index 00000000..aca8c5db
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php
@@ -0,0 +1,160 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Exception\DceSecurityException;
+use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Uuid;
+
+use function hex2bin;
+use function in_array;
+use function pack;
+use function str_pad;
+use function strlen;
+use function substr_replace;
+
+use const STR_PAD_LEFT;
+
+/**
+ * DceSecurityGenerator generates strings of binary data based on a local
+ * domain, local identifier, node ID, clock sequence, and the current time
+ */
+class DceSecurityGenerator implements DceSecurityGeneratorInterface
+{
+ private const DOMAINS = [
+ Uuid::DCE_DOMAIN_PERSON,
+ Uuid::DCE_DOMAIN_GROUP,
+ Uuid::DCE_DOMAIN_ORG,
+ ];
+
+ /**
+ * Upper bounds for the clock sequence in DCE Security UUIDs.
+ */
+ private const CLOCK_SEQ_HIGH = 63;
+
+ /**
+ * Lower bounds for the clock sequence in DCE Security UUIDs.
+ */
+ private const CLOCK_SEQ_LOW = 0;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeGeneratorInterface
+ */
+ private $timeGenerator;
+
+ /**
+ * @var DceSecurityProviderInterface
+ */
+ private $dceSecurityProvider;
+
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ TimeGeneratorInterface $timeGenerator,
+ DceSecurityProviderInterface $dceSecurityProvider
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeGenerator = $timeGenerator;
+ $this->dceSecurityProvider = $dceSecurityProvider;
+ }
+
+ public function generate(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): string {
+ if (!in_array($localDomain, self::DOMAINS)) {
+ throw new DceSecurityException(
+ 'Local domain must be a valid DCE Security domain'
+ );
+ }
+
+ if ($localIdentifier && $localIdentifier->isNegative()) {
+ throw new DceSecurityException(
+ 'Local identifier out of bounds; it must be a value between 0 and 4294967295'
+ );
+ }
+
+ if ($clockSeq > self::CLOCK_SEQ_HIGH || $clockSeq < self::CLOCK_SEQ_LOW) {
+ throw new DceSecurityException(
+ 'Clock sequence out of bounds; it must be a value between 0 and 63'
+ );
+ }
+
+ switch ($localDomain) {
+ case Uuid::DCE_DOMAIN_ORG:
+ if ($localIdentifier === null) {
+ throw new DceSecurityException(
+ 'A local identifier must be provided for the org domain'
+ );
+ }
+
+ break;
+ case Uuid::DCE_DOMAIN_PERSON:
+ if ($localIdentifier === null) {
+ $localIdentifier = $this->dceSecurityProvider->getUid();
+ }
+
+ break;
+ case Uuid::DCE_DOMAIN_GROUP:
+ default:
+ if ($localIdentifier === null) {
+ $localIdentifier = $this->dceSecurityProvider->getGid();
+ }
+
+ break;
+ }
+
+ $identifierHex = $this->numberConverter->toHex($localIdentifier->toString());
+
+ // The maximum value for the local identifier is 0xffffffff, or
+ // 4294967295. This is 8 hexadecimal digits, so if the length of
+ // hexadecimal digits is greater than 8, we know the value is greater
+ // than 0xffffffff.
+ if (strlen($identifierHex) > 8) {
+ throw new DceSecurityException(
+ 'Local identifier out of bounds; it must be a value between 0 and 4294967295'
+ );
+ }
+
+ $domainByte = pack('n', $localDomain)[1];
+ $identifierBytes = (string) hex2bin(str_pad($identifierHex, 8, '0', STR_PAD_LEFT));
+
+ if ($node instanceof Hexadecimal) {
+ $node = $node->toString();
+ }
+
+ // Shift the clock sequence 8 bits to the left, so it matches 0x3f00.
+ if ($clockSeq !== null) {
+ $clockSeq = $clockSeq << 8;
+ }
+
+ $bytes = $this->timeGenerator->generate($node, $clockSeq);
+
+ // Replace bytes in the time-based UUID with DCE Security values.
+ $bytes = substr_replace($bytes, $identifierBytes, 0, 4);
+ $bytes = substr_replace($bytes, $domainByte, 9, 1);
+
+ return $bytes;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php
new file mode 100644
index 00000000..faa29a53
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php
@@ -0,0 +1,53 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Rfc4122\UuidV2;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+
+/**
+ * A DCE Security generator generates strings of binary data based on a local
+ * domain, local identifier, node ID, clock sequence, and the current time
+ *
+ * @see UuidV2
+ */
+interface DceSecurityGeneratorInterface
+{
+ /**
+ * Generate a binary string from a local domain, local identifier, node ID,
+ * clock sequence, and current time
+ *
+ * @param int $localDomain The local domain to use when generating bytes,
+ * according to DCE Security
+ * @param IntegerObject|null $localIdentifier The local identifier for the
+ * given domain; this may be a UID or GID on POSIX systems, if the local
+ * domain is person or group, or it may be a site-defined identifier
+ * if the local domain is org
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return string A binary string
+ */
+ public function generate(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.php
new file mode 100644
index 00000000..7303e9fa
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.php
@@ -0,0 +1,48 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Exception\NameException;
+use Ramsey\Uuid\UuidInterface;
+use ValueError;
+
+use function hash;
+
+/**
+ * DefaultNameGenerator generates strings of binary data based on a namespace,
+ * name, and hashing algorithm
+ */
+class DefaultNameGenerator implements NameGeneratorInterface
+{
+ /** @psalm-pure */
+ public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string
+ {
+ try {
+ /** @var string|bool $bytes */
+ $bytes = @hash($hashAlgorithm, $ns->getBytes() . $name, true);
+ } catch (ValueError $e) {
+ $bytes = false; // keep same behavior than PHP 7
+ }
+
+ if ($bytes === false) {
+ throw new NameException(sprintf(
+ 'Unable to hash namespace and name with algorithm \'%s\'',
+ $hashAlgorithm
+ ));
+ }
+
+ return (string) $bytes;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php
new file mode 100644
index 00000000..d245c7bc
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php
@@ -0,0 +1,147 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Exception\RandomSourceException;
+use Ramsey\Uuid\Exception\TimeSourceException;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Throwable;
+
+use function ctype_xdigit;
+use function dechex;
+use function hex2bin;
+use function is_int;
+use function pack;
+use function sprintf;
+use function str_pad;
+use function strlen;
+
+use const STR_PAD_LEFT;
+
+/**
+ * DefaultTimeGenerator generates strings of binary data based on a node ID,
+ * clock sequence, and the current time
+ */
+class DefaultTimeGenerator implements TimeGeneratorInterface
+{
+ /**
+ * @var NodeProviderInterface
+ */
+ private $nodeProvider;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @var TimeProviderInterface
+ */
+ private $timeProvider;
+
+ public function __construct(
+ NodeProviderInterface $nodeProvider,
+ TimeConverterInterface $timeConverter,
+ TimeProviderInterface $timeProvider
+ ) {
+ $this->nodeProvider = $nodeProvider;
+ $this->timeConverter = $timeConverter;
+ $this->timeProvider = $timeProvider;
+ }
+
+ /**
+ * @throws InvalidArgumentException if the parameters contain invalid values
+ * @throws RandomSourceException if random_int() throws an exception/error
+ *
+ * @inheritDoc
+ */
+ public function generate($node = null, ?int $clockSeq = null): string
+ {
+ if ($node instanceof Hexadecimal) {
+ $node = $node->toString();
+ }
+
+ $node = $this->getValidNode($node);
+
+ if ($clockSeq === null) {
+ try {
+ // This does not use "stable storage"; see RFC 4122, Section 4.2.1.1.
+ $clockSeq = random_int(0, 0x3fff);
+ } catch (Throwable $exception) {
+ throw new RandomSourceException(
+ $exception->getMessage(),
+ (int) $exception->getCode(),
+ $exception
+ );
+ }
+ }
+
+ $time = $this->timeProvider->getTime();
+
+ $uuidTime = $this->timeConverter->calculateTime(
+ $time->getSeconds()->toString(),
+ $time->getMicroseconds()->toString()
+ );
+
+ $timeHex = str_pad($uuidTime->toString(), 16, '0', STR_PAD_LEFT);
+
+ if (strlen($timeHex) !== 16) {
+ throw new TimeSourceException(sprintf(
+ 'The generated time of \'%s\' is larger than expected',
+ $timeHex
+ ));
+ }
+
+ $timeBytes = (string) hex2bin($timeHex);
+
+ return $timeBytes[4] . $timeBytes[5] . $timeBytes[6] . $timeBytes[7]
+ . $timeBytes[2] . $timeBytes[3]
+ . $timeBytes[0] . $timeBytes[1]
+ . pack('n*', $clockSeq)
+ . $node;
+ }
+
+ /**
+ * Uses the node provider given when constructing this instance to get
+ * the node ID (usually a MAC address)
+ *
+ * @param string|int|null $node A node value that may be used to override the node provider
+ *
+ * @return string 6-byte binary string representation of the node
+ *
+ * @throws InvalidArgumentException
+ */
+ private function getValidNode($node): string
+ {
+ if ($node === null) {
+ $node = $this->nodeProvider->getNode();
+ }
+
+ // Convert the node to hex, if it is still an integer.
+ if (is_int($node)) {
+ $node = dechex($node);
+ }
+
+ if (!ctype_xdigit((string) $node) || strlen((string) $node) > 12) {
+ throw new InvalidArgumentException('Invalid node value');
+ }
+
+ return (string) hex2bin(str_pad((string) $node, 12, '0', STR_PAD_LEFT));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.php
new file mode 100644
index 00000000..6f08e291
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.php
@@ -0,0 +1,30 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+/**
+ * NameGeneratorFactory retrieves a default name generator, based on the
+ * environment
+ */
+class NameGeneratorFactory
+{
+ /**
+ * Returns a default name generator, based on the current environment
+ */
+ public function getGenerator(): NameGeneratorInterface
+ {
+ return new DefaultNameGenerator();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php
new file mode 100644
index 00000000..cc43dd02
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php
@@ -0,0 +1,38 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * A name generator generates strings of binary data created by hashing together
+ * a namespace with a name, according to a hashing algorithm
+ */
+interface NameGeneratorInterface
+{
+ /**
+ * Generate a binary string from a namespace and name hashed together with
+ * the specified hashing algorithm
+ *
+ * @param UuidInterface $ns The namespace
+ * @param string $name The name to use for creating a UUID
+ * @param string $hashAlgorithm The hashing algorithm to use
+ *
+ * @return string A binary string
+ *
+ * @psalm-pure
+ */
+ public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php
new file mode 100644
index 00000000..3780c5c6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php
@@ -0,0 +1,54 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Exception\NameException;
+use Ramsey\Uuid\UuidInterface;
+
+use function sprintf;
+use function uuid_generate_md5;
+use function uuid_generate_sha1;
+use function uuid_parse;
+
+/**
+ * PeclUuidNameGenerator generates strings of binary data from a namespace and a
+ * name, using ext-uuid
+ *
+ * @link https://pecl.php.net/package/uuid ext-uuid
+ */
+class PeclUuidNameGenerator implements NameGeneratorInterface
+{
+ /** @psalm-pure */
+ public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string
+ {
+ switch ($hashAlgorithm) {
+ case 'md5':
+ $uuid = uuid_generate_md5($ns->toString(), $name);
+
+ break;
+ case 'sha1':
+ $uuid = uuid_generate_sha1($ns->toString(), $name);
+
+ break;
+ default:
+ throw new NameException(sprintf(
+ 'Unable to hash namespace and name with algorithm \'%s\'',
+ $hashAlgorithm
+ ));
+ }
+
+ return uuid_parse($uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php
new file mode 100644
index 00000000..07c47d26
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php
@@ -0,0 +1,35 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use function uuid_create;
+use function uuid_parse;
+
+use const UUID_TYPE_RANDOM;
+
+/**
+ * PeclUuidRandomGenerator generates strings of random binary data using ext-uuid
+ *
+ * @link https://pecl.php.net/package/uuid ext-uuid
+ */
+class PeclUuidRandomGenerator implements RandomGeneratorInterface
+{
+ public function generate(int $length): string
+ {
+ $uuid = uuid_create(UUID_TYPE_RANDOM);
+
+ return uuid_parse($uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php
new file mode 100644
index 00000000..e01f44e5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php
@@ -0,0 +1,39 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use function uuid_create;
+use function uuid_parse;
+
+use const UUID_TYPE_TIME;
+
+/**
+ * PeclUuidTimeGenerator generates strings of binary data for time-base UUIDs,
+ * using ext-uuid
+ *
+ * @link https://pecl.php.net/package/uuid ext-uuid
+ */
+class PeclUuidTimeGenerator implements TimeGeneratorInterface
+{
+ /**
+ * @inheritDoc
+ */
+ public function generate($node = null, ?int $clockSeq = null): string
+ {
+ $uuid = uuid_create(UUID_TYPE_TIME);
+
+ return uuid_parse($uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.php
new file mode 100644
index 00000000..12edb96a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.php
@@ -0,0 +1,45 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Exception\RandomSourceException;
+use Throwable;
+
+/**
+ * RandomBytesGenerator generates strings of random binary data using the
+ * built-in `random_bytes()` PHP function
+ *
+ * @link http://php.net/random_bytes random_bytes()
+ */
+class RandomBytesGenerator implements RandomGeneratorInterface
+{
+ /**
+ * @throws RandomSourceException if random_bytes() throws an exception/error
+ *
+ * @inheritDoc
+ */
+ public function generate(int $length): string
+ {
+ try {
+ return random_bytes($length);
+ } catch (Throwable $exception) {
+ throw new RandomSourceException(
+ $exception->getMessage(),
+ (int) $exception->getCode(),
+ $exception
+ );
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.php
new file mode 100644
index 00000000..b723ac29
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.php
@@ -0,0 +1,30 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+/**
+ * RandomGeneratorFactory retrieves a default random generator, based on the
+ * environment
+ */
+class RandomGeneratorFactory
+{
+ /**
+ * Returns a default random generator, based on the current environment
+ */
+ public function getGenerator(): RandomGeneratorInterface
+ {
+ return new RandomBytesGenerator();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php
new file mode 100644
index 00000000..5c83cb4d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php
@@ -0,0 +1,30 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+/**
+ * A random generator generates strings of random binary data
+ */
+interface RandomGeneratorInterface
+{
+ /**
+ * Generates a string of randomized binary data
+ *
+ * @param int $length The number of bytes of random binary data to generate
+ *
+ * @return string A binary string
+ */
+ public function generate(int $length): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php
new file mode 100644
index 00000000..24ed5692
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php
@@ -0,0 +1,55 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use RandomLib\Factory;
+use RandomLib\Generator;
+
+/**
+ * RandomLibAdapter generates strings of random binary data using the
+ * paragonie/random-lib library
+ *
+ * @link https://packagist.org/packages/paragonie/random-lib paragonie/random-lib
+ */
+class RandomLibAdapter implements RandomGeneratorInterface
+{
+ /**
+ * @var Generator
+ */
+ private $generator;
+
+ /**
+ * Constructs a RandomLibAdapter
+ *
+ * By default, if no Generator is passed in, this creates a high-strength
+ * generator to use when generating random binary data.
+ *
+ * @param Generator|null $generator The generator to use when generating binary data
+ */
+ public function __construct(?Generator $generator = null)
+ {
+ if ($generator === null) {
+ $factory = new Factory();
+ $generator = $factory->getHighStrengthGenerator();
+ }
+
+ $this->generator = $generator;
+ }
+
+ public function generate(int $length): string
+ {
+ return $this->generator->generate($length);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php
new file mode 100644
index 00000000..3d55fc4d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.php
@@ -0,0 +1,63 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+
+/**
+ * TimeGeneratorFactory retrieves a default time generator, based on the
+ * environment
+ */
+class TimeGeneratorFactory
+{
+ /**
+ * @var NodeProviderInterface
+ */
+ private $nodeProvider;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @var TimeProviderInterface
+ */
+ private $timeProvider;
+
+ public function __construct(
+ NodeProviderInterface $nodeProvider,
+ TimeConverterInterface $timeConverter,
+ TimeProviderInterface $timeProvider
+ ) {
+ $this->nodeProvider = $nodeProvider;
+ $this->timeConverter = $timeConverter;
+ $this->timeProvider = $timeProvider;
+ }
+
+ /**
+ * Returns a default time generator, based on the current environment
+ */
+ public function getGenerator(): TimeGeneratorInterface
+ {
+ return new DefaultTimeGenerator(
+ $this->nodeProvider,
+ $this->timeConverter,
+ $this->timeProvider
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php
new file mode 100644
index 00000000..18f21c4b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php
@@ -0,0 +1,38 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Generator;
+
+use Ramsey\Uuid\Type\Hexadecimal;
+
+/**
+ * A time generator generates strings of binary data based on a node ID,
+ * clock sequence, and the current time
+ */
+interface TimeGeneratorInterface
+{
+ /**
+ * Generate a binary string from a node ID, clock sequence, and current time
+ *
+ * @param Hexadecimal|int|string|null $node A 48-bit number representing the
+ * hardware address; this number may be represented as an integer or a
+ * hexadecimal string
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return string A binary string
+ */
+ public function generate($node = null, ?int $clockSeq = null): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Fields.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Fields.php
new file mode 100644
index 00000000..d8a1a2b1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Fields.php
@@ -0,0 +1,194 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Guid;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Fields\SerializableFieldsTrait;
+use Ramsey\Uuid\Rfc4122\FieldsInterface;
+use Ramsey\Uuid\Rfc4122\NilTrait;
+use Ramsey\Uuid\Rfc4122\VariantTrait;
+use Ramsey\Uuid\Rfc4122\VersionTrait;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Uuid;
+
+use function bin2hex;
+use function dechex;
+use function hexdec;
+use function pack;
+use function sprintf;
+use function str_pad;
+use function strlen;
+use function substr;
+use function unpack;
+
+use const STR_PAD_LEFT;
+
+/**
+ * GUIDs are comprised of a set of named fields, according to RFC 4122
+ *
+ * @see Guid
+ *
+ * @psalm-immutable
+ */
+final class Fields implements FieldsInterface
+{
+ use NilTrait;
+ use SerializableFieldsTrait;
+ use VariantTrait;
+ use VersionTrait;
+
+ /**
+ * @var string
+ */
+ private $bytes;
+
+ /**
+ * @param string $bytes A 16-byte binary string representation of a UUID
+ *
+ * @throws InvalidArgumentException if the byte string is not exactly 16 bytes
+ * @throws InvalidArgumentException if the byte string does not represent a GUID
+ * @throws InvalidArgumentException if the byte string does not contain a valid version
+ */
+ public function __construct(string $bytes)
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ 'The byte string must be 16 bytes long; '
+ . 'received ' . strlen($bytes) . ' bytes'
+ );
+ }
+
+ $this->bytes = $bytes;
+
+ if (!$this->isCorrectVariant()) {
+ throw new InvalidArgumentException(
+ 'The byte string received does not conform to the RFC '
+ . '4122 or Microsoft Corporation variants'
+ );
+ }
+
+ if (!$this->isCorrectVersion()) {
+ throw new InvalidArgumentException(
+ 'The byte string received does not contain a valid version'
+ );
+ }
+ }
+
+ public function getBytes(): string
+ {
+ return $this->bytes;
+ }
+
+ public function getTimeLow(): Hexadecimal
+ {
+ // Swap the bytes from little endian to network byte order.
+ /** @var array $hex */
+ $hex = unpack(
+ 'H*',
+ pack(
+ 'v*',
+ hexdec(bin2hex(substr($this->bytes, 2, 2))),
+ hexdec(bin2hex(substr($this->bytes, 0, 2)))
+ )
+ );
+
+ return new Hexadecimal((string) ($hex[1] ?? ''));
+ }
+
+ public function getTimeMid(): Hexadecimal
+ {
+ // Swap the bytes from little endian to network byte order.
+ /** @var array $hex */
+ $hex = unpack(
+ 'H*',
+ pack(
+ 'v',
+ hexdec(bin2hex(substr($this->bytes, 4, 2)))
+ )
+ );
+
+ return new Hexadecimal((string) ($hex[1] ?? ''));
+ }
+
+ public function getTimeHiAndVersion(): Hexadecimal
+ {
+ // Swap the bytes from little endian to network byte order.
+ /** @var array $hex */
+ $hex = unpack(
+ 'H*',
+ pack(
+ 'v',
+ hexdec(bin2hex(substr($this->bytes, 6, 2)))
+ )
+ );
+
+ return new Hexadecimal((string) ($hex[1] ?? ''));
+ }
+
+ public function getTimestamp(): Hexadecimal
+ {
+ return new Hexadecimal(sprintf(
+ '%03x%04s%08s',
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
+ $this->getTimeMid()->toString(),
+ $this->getTimeLow()->toString()
+ ));
+ }
+
+ public function getClockSeq(): Hexadecimal
+ {
+ $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
+
+ return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
+ }
+
+ public function getClockSeqHiAndReserved(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
+ }
+
+ public function getClockSeqLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
+ }
+
+ public function getVersion(): ?int
+ {
+ if ($this->isNil()) {
+ return null;
+ }
+
+ /** @var array $parts */
+ $parts = unpack('n*', $this->bytes);
+
+ return ((int) $parts[4] >> 4) & 0x00f;
+ }
+
+ private function isCorrectVariant(): bool
+ {
+ if ($this->isNil()) {
+ return true;
+ }
+
+ $variant = $this->getVariant();
+
+ return $variant === Uuid::RFC_4122 || $variant === Uuid::RESERVED_MICROSOFT;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Guid.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Guid.php
new file mode 100644
index 00000000..b3ed096a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/Guid.php
@@ -0,0 +1,61 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Guid;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Uuid;
+
+/**
+ * Guid represents a UUID with "native" (little-endian) byte order
+ *
+ * From Wikipedia:
+ *
+ * > The first three fields are unsigned 32- and 16-bit integers and are subject
+ * > to swapping, while the last two fields consist of uninterpreted bytes, not
+ * > subject to swapping. This byte swapping applies even for versions 3, 4, and
+ * > 5, where the canonical fields do not correspond to the content of the UUID.
+ *
+ * The first three fields of a GUID are encoded in little-endian byte order,
+ * while the last three fields are in network (big-endian) byte order. This is
+ * according to the history of the Microsoft definition of a GUID.
+ *
+ * According to the .NET Guid.ToByteArray method documentation:
+ *
+ * > Note that the order of bytes in the returned byte array is different from
+ * > the string representation of a Guid value. The order of the beginning
+ * > four-byte group and the next two two-byte groups is reversed, whereas the
+ * > order of the last two-byte group and the closing six-byte group is the
+ * > same.
+ *
+ * @link https://en.wikipedia.org/wiki/Universally_unique_identifier#Variants UUID Variants on Wikipedia
+ * @link https://docs.microsoft.com/en-us/windows/win32/api/guiddef/ns-guiddef-guid Windows GUID structure
+ * @link https://docs.microsoft.com/en-us/dotnet/api/system.guid .NET Guid Struct
+ * @link https://docs.microsoft.com/en-us/dotnet/api/system.guid.tobytearray .NET Guid.ToByteArray Method
+ *
+ * @psalm-immutable
+ */
+final class Guid extends Uuid
+{
+ public function __construct(
+ Fields $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/GuidBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/GuidBuilder.php
new file mode 100644
index 00000000..758dd6b7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Guid/GuidBuilder.php
@@ -0,0 +1,89 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Guid;
+
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\UnableToBuildUuidException;
+use Ramsey\Uuid\UuidInterface;
+use Throwable;
+
+/**
+ * GuidBuilder builds instances of Guid
+ *
+ * @see Guid
+ *
+ * @psalm-immutable
+ */
+class GuidBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @param NumberConverterInterface $numberConverter The number converter to
+ * use when constructing the Guid
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to Unix timestamps
+ */
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ TimeConverterInterface $timeConverter
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter;
+ }
+
+ /**
+ * Builds and returns a Guid
+ *
+ * @param CodecInterface $codec The codec to use for building this Guid instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return Guid The GuidBuilder returns an instance of Ramsey\Uuid\Guid\Guid
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ try {
+ return new Guid(
+ $this->buildFields($bytes),
+ $this->numberConverter,
+ $codec,
+ $this->timeConverter
+ );
+ } catch (Throwable $e) {
+ throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Proxy method to allow injecting a mock, for testing
+ */
+ protected function buildFields(string $bytes): Fields
+ {
+ return new Fields($bytes);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php
new file mode 100644
index 00000000..8ba75796
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php
@@ -0,0 +1,575 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Lazy;
+
+use DateTimeInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Exception\UnsupportedOperationException;
+use Ramsey\Uuid\Fields\FieldsInterface;
+use Ramsey\Uuid\Nonstandard\UuidV6;
+use Ramsey\Uuid\Rfc4122\UuidV1;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\UuidFactory;
+use Ramsey\Uuid\UuidInterface;
+use ValueError;
+
+use function assert;
+use function bin2hex;
+use function hex2bin;
+use function sprintf;
+use function str_replace;
+use function substr;
+
+/**
+ * Lazy version of a UUID: its format has not been determined yet, so it is mostly only usable for string/bytes
+ * conversion. This object optimizes instantiation, serialization and string conversion time, at the cost of
+ * increased overhead for more advanced UUID operations.
+ *
+ * @internal this type is used internally for performance reasons, and is not supposed to be directly referenced
+ * in consumer libraries.
+ *
+ * @psalm-immutable
+ *
+ * Note: the {@see FieldsInterface} does not declare methods that deprecated API
+ * relies upon: the API has been ported from the {@see \Ramsey\Uuid\Uuid} definition,
+ * and is deprecated anyway.
+ * Note: the deprecated API from {@see \Ramsey\Uuid\Uuid} is in use here (on purpose): it will be removed
+ * once the deprecated API is gone from this class too.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ */
+final class LazyUuidFromString implements UuidInterface
+{
+ public const VALID_REGEX = '/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/ms';
+ /**
+ * @var string
+ * @psalm-var non-empty-string
+ */
+ private $uuid;
+ /** @var UuidInterface|null */
+ private $unwrapped;
+
+ /** @psalm-param non-empty-string $uuid */
+ public function __construct(string $uuid)
+ {
+ $this->uuid = $uuid;
+ }
+
+ /** @psalm-pure */
+ public static function fromBytes(string $bytes): self
+ {
+ $base16Uuid = bin2hex($bytes);
+
+ return new self(
+ substr($base16Uuid, 0, 8)
+ . '-'
+ . substr($base16Uuid, 8, 4)
+ . '-'
+ . substr($base16Uuid, 12, 4)
+ . '-'
+ . substr($base16Uuid, 16, 4)
+ . '-'
+ . substr($base16Uuid, 20, 12)
+ );
+ }
+
+ public function serialize(): string
+ {
+ return $this->uuid;
+ }
+
+ /**
+ * @return array{string: string}
+ *
+ * @psalm-return array{string: non-empty-string}
+ */
+ public function __serialize(): array
+ {
+ return ['string' => $this->uuid];
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param string $serialized
+ *
+ * @psalm-param non-empty-string $serialized
+ */
+ public function unserialize($serialized): void
+ {
+ $this->uuid = $serialized;
+ }
+
+ /**
+ * @param array{string: string} $data
+ *
+ * @psalm-param array{string: non-empty-string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['string'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['string']);
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getNumberConverter(): NumberConverterInterface
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getNumberConverter();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @psalm-suppress DeprecatedMethod
+ */
+ public function getFieldsHex(): array
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getFieldsHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getClockSeqHiAndReservedHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getClockSeqHiAndReservedHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getClockSeqLowHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getClockSeqLowHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getClockSequenceHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getClockSequenceHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getDateTime(): DateTimeInterface
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getDateTime();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getLeastSignificantBitsHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getLeastSignificantBitsHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getMostSignificantBitsHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getMostSignificantBitsHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getNodeHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getNodeHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getTimeHiAndVersionHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getTimeHiAndVersionHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getTimeLowHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getTimeLowHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getTimeMidHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getTimeMidHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getTimestampHex(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getTimestampHex();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getUrn(): string
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getUrn();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getVariant(): ?int
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getVariant();
+ }
+
+ /** @psalm-suppress DeprecatedMethod */
+ public function getVersion(): ?int
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getVersion();
+ }
+
+ public function compareTo(UuidInterface $other): int
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->compareTo($other);
+ }
+
+ public function equals(?object $other): bool
+ {
+ if (! $other instanceof UuidInterface) {
+ return false;
+ }
+
+ return $this->uuid === $other->toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @psalm-suppress MoreSpecificReturnType
+ * @psalm-suppress LessSpecificReturnStatement we know that {@see self::$uuid} is a non-empty string, so
+ * we know that {@see hex2bin} will retrieve a non-empty string too.
+ */
+ public function getBytes(): string
+ {
+ /** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
+ return (string) hex2bin(str_replace('-', '', $this->uuid));
+ }
+
+ public function getFields(): FieldsInterface
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getFields();
+ }
+
+ public function getHex(): Hexadecimal
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getHex();
+ }
+
+ public function getInteger(): IntegerObject
+ {
+ return ($this->unwrapped ?? $this->unwrap())
+ ->getInteger();
+ }
+
+ public function toString(): string
+ {
+ return $this->uuid;
+ }
+
+ public function __toString(): string
+ {
+ return $this->uuid;
+ }
+
+ public function jsonSerialize(): string
+ {
+ return $this->uuid;
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getClockSeqHiAndReserved(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getClockSeqHiAndReserved()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getClockSeqLow(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getClockSeqLow()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getClockSequence(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getClockSeq()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getLeastSignificantBits(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(substr($instance->getHex()->toString(), 16));
+ }
+
+ /**
+ * @deprecated This method will be removed in 5.0.0. There is no direct
+ * alternative, but the same information may be obtained by splitting
+ * in half the value returned by {@see UuidInterface::getHex()}.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getMostSignificantBits(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(substr($instance->getHex()->toString(), 0, 16));
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getNode()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getNode(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getNode()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getTimeHiAndVersion(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getTimeHiAndVersion()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getTimeLow(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getTimeLow()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getTimeMid(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ return $instance->getNumberConverter()
+ ->fromHex(
+ $instance->getFields()
+ ->getTimeMid()
+ ->toString()
+ );
+ }
+
+ /**
+ * @deprecated Use {@see UuidInterface::getFields()} to get a
+ * {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
+ * instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()}
+ * and use the arbitrary-precision math library of your choice to
+ * convert it to a string integer.
+ *
+ * @psalm-suppress UndefinedInterfaceMethod
+ * @psalm-suppress DeprecatedMethod
+ * @psalm-suppress MixedArgument
+ * @psalm-suppress MixedMethodCall
+ */
+ public function getTimestamp(): string
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+ $fields = $instance->getFields();
+
+ if ($fields->getVersion() !== 1) {
+ throw new UnsupportedOperationException('Not a time-based UUID');
+ }
+
+ return $instance->getNumberConverter()
+ ->fromHex($fields->getTimestamp()->toString());
+ }
+
+ public function toUuidV1(): UuidV1
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ if ($instance instanceof UuidV1) {
+ return $instance;
+ }
+
+ assert($instance instanceof UuidV6);
+
+ return $instance->toUuidV1();
+ }
+
+ public function toUuidV6(): UuidV6
+ {
+ $instance = ($this->unwrapped ?? $this->unwrap());
+
+ assert($instance instanceof UuidV6);
+
+ return $instance;
+ }
+
+ /**
+ * @psalm-suppress ImpureMethodCall the retrieval of the factory is a clear violation of purity here: this is a
+ * known pitfall of the design of this library, where a value object contains
+ * a mutable reference to a factory. We use a fixed factory here, so the violation
+ * will not have real-world effects, as this object is only instantiated with the
+ * default factory settings/features.
+ * @psalm-suppress InaccessibleProperty property {@see $unwrapped} is used as a cache: we don't expose it to the
+ * outside world, so we should be fine here.
+ */
+ private function unwrap(): UuidInterface
+ {
+ return $this->unwrapped = (new UuidFactory())
+ ->fromString($this->uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/BrickMathCalculator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/BrickMathCalculator.php
new file mode 100644
index 00000000..f2d86788
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/BrickMathCalculator.php
@@ -0,0 +1,144 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Math;
+
+use Brick\Math\BigDecimal;
+use Brick\Math\BigInteger;
+use Brick\Math\Exception\MathException;
+use Brick\Math\RoundingMode as BrickMathRounding;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Type\Decimal;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\NumberInterface;
+
+/**
+ * A calculator using the brick/math library for arbitrary-precision arithmetic
+ *
+ * @psalm-immutable
+ */
+final class BrickMathCalculator implements CalculatorInterface
+{
+ private const ROUNDING_MODE_MAP = [
+ RoundingMode::UNNECESSARY => BrickMathRounding::UNNECESSARY,
+ RoundingMode::UP => BrickMathRounding::UP,
+ RoundingMode::DOWN => BrickMathRounding::DOWN,
+ RoundingMode::CEILING => BrickMathRounding::CEILING,
+ RoundingMode::FLOOR => BrickMathRounding::FLOOR,
+ RoundingMode::HALF_UP => BrickMathRounding::HALF_UP,
+ RoundingMode::HALF_DOWN => BrickMathRounding::HALF_DOWN,
+ RoundingMode::HALF_CEILING => BrickMathRounding::HALF_CEILING,
+ RoundingMode::HALF_FLOOR => BrickMathRounding::HALF_FLOOR,
+ RoundingMode::HALF_EVEN => BrickMathRounding::HALF_EVEN,
+ ];
+
+ public function add(NumberInterface $augend, NumberInterface ...$addends): NumberInterface
+ {
+ $sum = BigInteger::of($augend->toString());
+
+ foreach ($addends as $addend) {
+ $sum = $sum->plus($addend->toString());
+ }
+
+ return new IntegerObject((string) $sum);
+ }
+
+ public function subtract(NumberInterface $minuend, NumberInterface ...$subtrahends): NumberInterface
+ {
+ $difference = BigInteger::of($minuend->toString());
+
+ foreach ($subtrahends as $subtrahend) {
+ $difference = $difference->minus($subtrahend->toString());
+ }
+
+ return new IntegerObject((string) $difference);
+ }
+
+ public function multiply(NumberInterface $multiplicand, NumberInterface ...$multipliers): NumberInterface
+ {
+ $product = BigInteger::of($multiplicand->toString());
+
+ foreach ($multipliers as $multiplier) {
+ $product = $product->multipliedBy($multiplier->toString());
+ }
+
+ return new IntegerObject((string) $product);
+ }
+
+ public function divide(
+ int $roundingMode,
+ int $scale,
+ NumberInterface $dividend,
+ NumberInterface ...$divisors
+ ): NumberInterface {
+ $brickRounding = $this->getBrickRoundingMode($roundingMode);
+
+ $quotient = BigDecimal::of($dividend->toString());
+
+ foreach ($divisors as $divisor) {
+ $quotient = $quotient->dividedBy($divisor->toString(), $scale, $brickRounding);
+ }
+
+ if ($scale === 0) {
+ return new IntegerObject((string) $quotient->toBigInteger());
+ }
+
+ return new Decimal((string) $quotient);
+ }
+
+ public function fromBase(string $value, int $base): IntegerObject
+ {
+ try {
+ return new IntegerObject((string) BigInteger::fromBase($value, $base));
+ } catch (MathException | \InvalidArgumentException $exception) {
+ throw new InvalidArgumentException(
+ $exception->getMessage(),
+ (int) $exception->getCode(),
+ $exception
+ );
+ }
+ }
+
+ public function toBase(IntegerObject $value, int $base): string
+ {
+ try {
+ return BigInteger::of($value->toString())->toBase($base);
+ } catch (MathException | \InvalidArgumentException $exception) {
+ throw new InvalidArgumentException(
+ $exception->getMessage(),
+ (int) $exception->getCode(),
+ $exception
+ );
+ }
+ }
+
+ public function toHexadecimal(IntegerObject $value): Hexadecimal
+ {
+ return new Hexadecimal($this->toBase($value, 16));
+ }
+
+ public function toInteger(Hexadecimal $value): IntegerObject
+ {
+ return $this->fromBase($value->toString(), 16);
+ }
+
+ /**
+ * Maps ramsey/uuid rounding modes to those used by brick/math
+ */
+ private function getBrickRoundingMode(int $roundingMode): int
+ {
+ return self::ROUNDING_MODE_MAP[$roundingMode] ?? 0;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/CalculatorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/CalculatorInterface.php
new file mode 100644
index 00000000..f03645d0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/CalculatorInterface.php
@@ -0,0 +1,106 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Math;
+
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\NumberInterface;
+
+/**
+ * A calculator performs arithmetic operations on numbers
+ *
+ * @psalm-immutable
+ */
+interface CalculatorInterface
+{
+ /**
+ * Returns the sum of all the provided parameters
+ *
+ * @param NumberInterface $augend The first addend (the integer being added to)
+ * @param NumberInterface ...$addends The additional integers to a add to the augend
+ *
+ * @return NumberInterface The sum of all the parameters
+ */
+ public function add(NumberInterface $augend, NumberInterface ...$addends): NumberInterface;
+
+ /**
+ * Returns the difference of all the provided parameters
+ *
+ * @param NumberInterface $minuend The integer being subtracted from
+ * @param NumberInterface ...$subtrahends The integers to subtract from the minuend
+ *
+ * @return NumberInterface The difference after subtracting all parameters
+ */
+ public function subtract(NumberInterface $minuend, NumberInterface ...$subtrahends): NumberInterface;
+
+ /**
+ * Returns the product of all the provided parameters
+ *
+ * @param NumberInterface $multiplicand The integer to be multiplied
+ * @param NumberInterface ...$multipliers The factors by which to multiply the multiplicand
+ *
+ * @return NumberInterface The product of multiplying all the provided parameters
+ */
+ public function multiply(NumberInterface $multiplicand, NumberInterface ...$multipliers): NumberInterface;
+
+ /**
+ * Returns the quotient of the provided parameters divided left-to-right
+ *
+ * @param int $roundingMode The RoundingMode constant to use for this operation
+ * @param int $scale The scale to use for this operation
+ * @param NumberInterface $dividend The integer to be divided
+ * @param NumberInterface ...$divisors The integers to divide $dividend by, in
+ * the order in which the division operations should take place
+ * (left-to-right)
+ *
+ * @return NumberInterface The quotient of dividing the provided parameters left-to-right
+ */
+ public function divide(
+ int $roundingMode,
+ int $scale,
+ NumberInterface $dividend,
+ NumberInterface ...$divisors
+ ): NumberInterface;
+
+ /**
+ * Converts a value from an arbitrary base to a base-10 integer value
+ *
+ * @param string $value The value to convert
+ * @param int $base The base to convert from (i.e., 2, 16, 32, etc.)
+ *
+ * @return IntegerObject The base-10 integer value of the converted value
+ */
+ public function fromBase(string $value, int $base): IntegerObject;
+
+ /**
+ * Converts a base-10 integer value to an arbitrary base
+ *
+ * @param IntegerObject $value The integer value to convert
+ * @param int $base The base to convert to (i.e., 2, 16, 32, etc.)
+ *
+ * @return string The value represented in the specified base
+ */
+ public function toBase(IntegerObject $value, int $base): string;
+
+ /**
+ * Converts an Integer instance to a Hexadecimal instance
+ */
+ public function toHexadecimal(IntegerObject $value): Hexadecimal;
+
+ /**
+ * Converts a Hexadecimal instance to an Integer instance
+ */
+ public function toInteger(Hexadecimal $value): IntegerObject;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/RoundingMode.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/RoundingMode.php
new file mode 100644
index 00000000..e710270d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Math/RoundingMode.php
@@ -0,0 +1,146 @@
+= 0.5; otherwise, behaves
+ * as for DOWN. Note that this is the rounding mode commonly taught at
+ * school.
+ */
+ public const HALF_UP = 5;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant,
+ * in which case round down.
+ *
+ * Behaves as for UP if the discarded fraction is > 0.5; otherwise, behaves
+ * as for DOWN.
+ */
+ public const HALF_DOWN = 6;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant,
+ * in which case round towards positive infinity.
+ *
+ * If the result is positive, behaves as for HALF_UP; if negative, behaves
+ * as for HALF_DOWN.
+ */
+ public const HALF_CEILING = 7;
+
+ /**
+ * Rounds towards "nearest neighbor" unless both neighbors are equidistant,
+ * in which case round towards negative infinity.
+ *
+ * If the result is positive, behaves as for HALF_DOWN; if negative, behaves
+ * as for HALF_UP.
+ */
+ public const HALF_FLOOR = 8;
+
+ /**
+ * Rounds towards the "nearest neighbor" unless both neighbors are
+ * equidistant, in which case rounds towards the even neighbor.
+ *
+ * Behaves as for HALF_UP if the digit to the left of the discarded fraction
+ * is odd; behaves as for HALF_DOWN if it's even.
+ *
+ * Note that this is the rounding mode that statistically minimizes
+ * cumulative error when applied repeatedly over a sequence of calculations.
+ * It is sometimes known as "Banker's rounding", and is chiefly used in the
+ * USA.
+ */
+ public const HALF_EVEN = 9;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Fields.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Fields.php
new file mode 100644
index 00000000..927bc6a2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Fields.php
@@ -0,0 +1,133 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Fields\SerializableFieldsTrait;
+use Ramsey\Uuid\Rfc4122\FieldsInterface;
+use Ramsey\Uuid\Rfc4122\VariantTrait;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+use function bin2hex;
+use function dechex;
+use function hexdec;
+use function sprintf;
+use function str_pad;
+use function strlen;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Nonstandard UUID fields do not conform to the RFC 4122 standard
+ *
+ * Since some systems may create nonstandard UUIDs, this implements the
+ * Rfc4122\FieldsInterface, so that functionality of a nonstandard UUID is not
+ * degraded, in the event these UUIDs are expected to contain RFC 4122 fields.
+ *
+ * Internally, this class represents the fields together as a 16-byte binary
+ * string.
+ *
+ * @psalm-immutable
+ */
+final class Fields implements FieldsInterface
+{
+ use SerializableFieldsTrait;
+ use VariantTrait;
+
+ /**
+ * @var string
+ */
+ private $bytes;
+
+ /**
+ * @param string $bytes A 16-byte binary string representation of a UUID
+ *
+ * @throws InvalidArgumentException if the byte string is not exactly 16 bytes
+ */
+ public function __construct(string $bytes)
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ 'The byte string must be 16 bytes long; '
+ . 'received ' . strlen($bytes) . ' bytes'
+ );
+ }
+
+ $this->bytes = $bytes;
+ }
+
+ public function getBytes(): string
+ {
+ return $this->bytes;
+ }
+
+ public function getClockSeq(): Hexadecimal
+ {
+ $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
+
+ return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
+ }
+
+ public function getClockSeqHiAndReserved(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
+ }
+
+ public function getClockSeqLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
+ }
+
+ public function getTimeHiAndVersion(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 6, 2)));
+ }
+
+ public function getTimeLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 0, 4)));
+ }
+
+ public function getTimeMid(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 4, 2)));
+ }
+
+ public function getTimestamp(): Hexadecimal
+ {
+ return new Hexadecimal(sprintf(
+ '%03x%04s%08s',
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
+ $this->getTimeMid()->toString(),
+ $this->getTimeLow()->toString()
+ ));
+ }
+
+ public function getVersion(): ?int
+ {
+ return null;
+ }
+
+ public function isNil(): bool
+ {
+ return false;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Uuid.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Uuid.php
new file mode 100644
index 00000000..715f8255
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/Uuid.php
@@ -0,0 +1,37 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Uuid as BaseUuid;
+
+/**
+ * Nonstandard\Uuid is a UUID that doesn't conform to RFC 4122
+ *
+ * @psalm-immutable
+ */
+final class Uuid extends BaseUuid
+{
+ public function __construct(
+ Fields $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php
new file mode 100644
index 00000000..0c892773
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php
@@ -0,0 +1,88 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\UnableToBuildUuidException;
+use Ramsey\Uuid\UuidInterface;
+use Throwable;
+
+/**
+ * Nonstandard\UuidBuilder builds instances of Nonstandard\Uuid
+ *
+ * @psalm-immutable
+ */
+class UuidBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @param NumberConverterInterface $numberConverter The number converter to
+ * use when constructing the Nonstandard\Uuid
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to Unix timestamps
+ */
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ TimeConverterInterface $timeConverter
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter;
+ }
+
+ /**
+ * Builds and returns a Nonstandard\Uuid
+ *
+ * @param CodecInterface $codec The codec to use for building this instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return Uuid The Nonstandard\UuidBuilder returns an instance of
+ * Nonstandard\Uuid
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ try {
+ return new Uuid(
+ $this->buildFields($bytes),
+ $this->numberConverter,
+ $codec,
+ $this->timeConverter
+ );
+ } catch (Throwable $e) {
+ throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Proxy method to allow injecting a mock, for testing
+ */
+ protected function buildFields(string $bytes): Fields
+ {
+ return new Fields($bytes);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php
new file mode 100644
index 00000000..05586b3e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php
@@ -0,0 +1,133 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use DateTimeImmutable;
+use DateTimeInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\DateTimeException;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Lazy\LazyUuidFromString;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Rfc4122\UuidInterface;
+use Ramsey\Uuid\Rfc4122\UuidV1;
+use Ramsey\Uuid\Uuid;
+use Throwable;
+
+use function hex2bin;
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Ordered-time, or version 6, UUIDs include timestamp, clock sequence, and node
+ * values that are combined into a 128-bit unsigned integer
+ *
+ * @link https://github.com/uuid6/uuid6-ietf-draft UUID version 6 IETF draft
+ * @link http://gh.peabody.io/uuidv6/ "Version 6" UUIDs
+ *
+ * @psalm-immutable
+ */
+final class UuidV6 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 6 (time-based) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_PEABODY) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV6 must represent a '
+ . 'version 6 (ordered-time) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+
+ /**
+ * Returns a DateTimeInterface object representing the timestamp associated
+ * with the UUID
+ *
+ * @return DateTimeImmutable A PHP DateTimeImmutable instance representing
+ * the timestamp of a version 6 UUID
+ */
+ public function getDateTime(): DateTimeInterface
+ {
+ $time = $this->timeConverter->convertTime($this->fields->getTimestamp());
+
+ try {
+ return new DateTimeImmutable(
+ '@'
+ . $time->getSeconds()->toString()
+ . '.'
+ . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
+ );
+ } catch (Throwable $e) {
+ throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Converts this UUID into an instance of a version 1 UUID
+ */
+ public function toUuidV1(): UuidV1
+ {
+ $hex = $this->getHex()->toString();
+ $hex = substr($hex, 7, 5)
+ . substr($hex, 13, 3)
+ . substr($hex, 3, 4)
+ . '1' . substr($hex, 0, 3)
+ . substr($hex, 16);
+
+ /** @var LazyUuidFromString $uuid */
+ $uuid = Uuid::fromBytes((string) hex2bin($hex));
+
+ return $uuid->toUuidV1();
+ }
+
+ /**
+ * Converts a version 1 UUID into an instance of a version 6 UUID
+ */
+ public static function fromUuidV1(UuidV1 $uuidV1): UuidV6
+ {
+ $hex = $uuidV1->getHex()->toString();
+ $hex = substr($hex, 13, 3)
+ . substr($hex, 8, 4)
+ . substr($hex, 0, 5)
+ . '6' . substr($hex, 5, 3)
+ . substr($hex, 16);
+
+ /** @var LazyUuidFromString $uuid */
+ $uuid = Uuid::fromBytes((string) hex2bin($hex));
+
+ return $uuid->toUuidV6();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php
new file mode 100644
index 00000000..6d6240b7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php
@@ -0,0 +1,234 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Dce;
+
+use Ramsey\Uuid\Exception\DceSecurityException;
+use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+
+use function escapeshellarg;
+use function preg_split;
+use function str_getcsv;
+use function strpos;
+use function strrpos;
+use function strtolower;
+use function strtoupper;
+use function substr;
+use function trim;
+
+use const PREG_SPLIT_NO_EMPTY;
+
+/**
+ * SystemDceSecurityProvider retrieves the user or group identifiers from the system
+ */
+class SystemDceSecurityProvider implements DceSecurityProviderInterface
+{
+ /**
+ * @throws DceSecurityException if unable to get a user identifier
+ *
+ * @inheritDoc
+ */
+ public function getUid(): IntegerObject
+ {
+ static $uid = null;
+
+ if ($uid instanceof IntegerObject) {
+ return $uid;
+ }
+
+ if ($uid === null) {
+ $uid = $this->getSystemUid();
+ }
+
+ if ($uid === '') {
+ throw new DceSecurityException(
+ 'Unable to get a user identifier using the system DCE '
+ . 'Security provider; please provide a custom identifier or '
+ . 'use a different provider'
+ );
+ }
+
+ $uid = new IntegerObject($uid);
+
+ return $uid;
+ }
+
+ /**
+ * @throws DceSecurityException if unable to get a group identifier
+ *
+ * @inheritDoc
+ */
+ public function getGid(): IntegerObject
+ {
+ static $gid = null;
+
+ if ($gid instanceof IntegerObject) {
+ return $gid;
+ }
+
+ if ($gid === null) {
+ $gid = $this->getSystemGid();
+ }
+
+ if ($gid === '') {
+ throw new DceSecurityException(
+ 'Unable to get a group identifier using the system DCE '
+ . 'Security provider; please provide a custom identifier or '
+ . 'use a different provider'
+ );
+ }
+
+ $gid = new IntegerObject($gid);
+
+ return $gid;
+ }
+
+ /**
+ * Returns the UID from the system
+ */
+ private function getSystemUid(): string
+ {
+ if (!$this->hasShellExec()) {
+ return '';
+ }
+
+ switch ($this->getOs()) {
+ case 'WIN':
+ return $this->getWindowsUid();
+ case 'DAR':
+ case 'FRE':
+ case 'LIN':
+ default:
+ return trim((string) shell_exec('id -u'));
+ }
+ }
+
+ /**
+ * Returns the GID from the system
+ */
+ private function getSystemGid(): string
+ {
+ if (!$this->hasShellExec()) {
+ return '';
+ }
+
+ switch ($this->getOs()) {
+ case 'WIN':
+ return $this->getWindowsGid();
+ case 'DAR':
+ case 'FRE':
+ case 'LIN':
+ default:
+ return trim((string) shell_exec('id -g'));
+ }
+ }
+
+ /**
+ * Returns true if shell_exec() is available for use
+ */
+ private function hasShellExec(): bool
+ {
+ $disabledFunctions = strtolower((string) ini_get('disable_functions'));
+
+ return strpos($disabledFunctions, 'shell_exec') === false;
+ }
+
+ /**
+ * Returns the PHP_OS string
+ */
+ private function getOs(): string
+ {
+ return strtoupper(substr(constant('PHP_OS'), 0, 3));
+ }
+
+ /**
+ * Returns the user identifier for a user on a Windows system
+ *
+ * Windows does not have the same concept as an effective POSIX UID for the
+ * running script. Instead, each user is uniquely identified by an SID
+ * (security identifier). The SID includes three 32-bit unsigned integers
+ * that make up a unique domain identifier, followed by an RID (relative
+ * identifier) that we will use as the UID. The primary caveat is that this
+ * UID may not be unique to the system, since it is, instead, unique to the
+ * domain.
+ *
+ * @link https://www.lifewire.com/what-is-an-sid-number-2626005 What Is an SID Number?
+ * @link https://bit.ly/30vE7NM Well-known SID Structures
+ * @link https://bit.ly/2FWcYKJ Well-known security identifiers in Windows operating systems
+ * @link https://www.windows-commandline.com/get-sid-of-user/ Get SID of user
+ */
+ private function getWindowsUid(): string
+ {
+ $response = shell_exec('whoami /user /fo csv /nh');
+
+ if ($response === null) {
+ return '';
+ }
+
+ $sid = str_getcsv(trim((string) $response))[1] ?? '';
+
+ if (($lastHyphen = strrpos($sid, '-')) === false) {
+ return '';
+ }
+
+ return trim(substr($sid, $lastHyphen + 1));
+ }
+
+ /**
+ * Returns a group identifier for a user on a Windows system
+ *
+ * Since Windows does not have the same concept as an effective POSIX GID
+ * for the running script, we will get the local group memberships for the
+ * user running the script. Then, we will get the SID (security identifier)
+ * for the first group that appears in that list. Finally, we will return
+ * the RID (relative identifier) for the group and use that as the GID.
+ *
+ * @link https://www.windows-commandline.com/list-of-user-groups-command-line/ List of user groups command line
+ */
+ private function getWindowsGid(): string
+ {
+ $response = shell_exec('net user %username% | findstr /b /i "Local Group Memberships"');
+
+ if ($response === null) {
+ return '';
+ }
+
+ /** @var string[] $userGroups */
+ $userGroups = preg_split('/\s{2,}/', (string) $response, -1, PREG_SPLIT_NO_EMPTY);
+
+ $firstGroup = trim($userGroups[1] ?? '', "* \t\n\r\0\x0B");
+
+ if ($firstGroup === '') {
+ return '';
+ }
+
+ $response = shell_exec('wmic group get name,sid | findstr /b /i ' . escapeshellarg($firstGroup));
+
+ if ($response === null) {
+ return '';
+ }
+
+ /** @var string[] $userGroup */
+ $userGroup = preg_split('/\s{2,}/', (string) $response, -1, PREG_SPLIT_NO_EMPTY);
+
+ $sid = $userGroup[1] ?? '';
+
+ if (($lastHyphen = strrpos($sid, '-')) === false) {
+ return '';
+ }
+
+ return trim((string) substr($sid, $lastHyphen + 1));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php
new file mode 100644
index 00000000..8325da69
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php
@@ -0,0 +1,41 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider;
+
+use Ramsey\Uuid\Rfc4122\UuidV2;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+
+/**
+ * A DCE provider provides access to local domain identifiers for version 2,
+ * DCE Security, UUIDs
+ *
+ * @see UuidV2
+ */
+interface DceSecurityProviderInterface
+{
+ /**
+ * Returns a user identifier for the system
+ *
+ * @link https://en.wikipedia.org/wiki/User_identifier User identifier
+ */
+ public function getUid(): IntegerObject;
+
+ /**
+ * Returns a group identifier for the system
+ *
+ * @link https://en.wikipedia.org/wiki/Group_identifier Group identifier
+ */
+ public function getGid(): IntegerObject;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php
new file mode 100644
index 00000000..cad01045
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php
@@ -0,0 +1,60 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Node;
+
+use Ramsey\Uuid\Exception\NodeException;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+/**
+ * FallbackNodeProvider retrieves the system node ID by stepping through a list
+ * of providers until a node ID can be obtained
+ */
+class FallbackNodeProvider implements NodeProviderInterface
+{
+ /**
+ * @var NodeProviderCollection
+ */
+ private $nodeProviders;
+
+ /**
+ * @param NodeProviderCollection $providers Array of node providers
+ */
+ public function __construct(NodeProviderCollection $providers)
+ {
+ $this->nodeProviders = $providers;
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ $lastProviderException = null;
+
+ foreach ($this->nodeProviders as $provider) {
+ try {
+ return $provider->getNode();
+ } catch (NodeException $exception) {
+ $lastProviderException = $exception;
+
+ continue;
+ }
+ }
+
+ throw new NodeException(
+ 'Unable to find a suitable node provider',
+ 0,
+ $lastProviderException
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php
new file mode 100644
index 00000000..536cb603
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php
@@ -0,0 +1,61 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Node;
+
+use Ramsey\Collection\AbstractCollection;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+/**
+ * A collection of NodeProviderInterface objects
+ *
+ * @extends AbstractCollection
+ */
+class NodeProviderCollection extends AbstractCollection
+{
+ public function getType(): string
+ {
+ return NodeProviderInterface::class;
+ }
+
+ /**
+ * Re-constructs the object from its serialized form
+ *
+ * @param string $serialized The serialized PHP string to unserialize into
+ * a UuidInterface instance
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress RedundantConditionGivenDocblockType
+ */
+ public function unserialize($serialized): void
+ {
+ /** @var array $data */
+ $data = unserialize($serialized, [
+ 'allowed_classes' => [
+ Hexadecimal::class,
+ RandomNodeProvider::class,
+ StaticNodeProvider::class,
+ SystemNodeProvider::class,
+ ],
+ ]);
+
+ $this->data = array_filter(
+ $data,
+ function ($unserialized): bool {
+ return $unserialized instanceof NodeProviderInterface;
+ }
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php
new file mode 100644
index 00000000..76141361
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php
@@ -0,0 +1,69 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Node;
+
+use Ramsey\Uuid\Exception\RandomSourceException;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Throwable;
+
+use function bin2hex;
+use function dechex;
+use function hex2bin;
+use function hexdec;
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * RandomNodeProvider generates a random node ID
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.5 RFC 4122, § 4.5: Node IDs that Do Not Identify the Host
+ */
+class RandomNodeProvider implements NodeProviderInterface
+{
+ public function getNode(): Hexadecimal
+ {
+ try {
+ $nodeBytes = random_bytes(6);
+ } catch (Throwable $exception) {
+ throw new RandomSourceException(
+ $exception->getMessage(),
+ (int) $exception->getCode(),
+ $exception
+ );
+ }
+
+ // Split the node bytes for math on 32-bit systems.
+ $nodeMsb = substr($nodeBytes, 0, 3);
+ $nodeLsb = substr($nodeBytes, 3);
+
+ // Set the multicast bit; see RFC 4122, section 4.5.
+ $nodeMsb = hex2bin(
+ str_pad(
+ dechex(hexdec(bin2hex($nodeMsb)) | 0x010000),
+ 6,
+ '0',
+ STR_PAD_LEFT
+ )
+ );
+
+ // Recombine the node bytes.
+ $node = $nodeMsb . $nodeLsb;
+
+ return new Hexadecimal(str_pad(bin2hex($node), 12, '0', STR_PAD_LEFT));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php
new file mode 100644
index 00000000..51f1b02e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php
@@ -0,0 +1,76 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Node;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+use function dechex;
+use function hexdec;
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * StaticNodeProvider provides a static node value with the multicast bit set
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.5 RFC 4122, § 4.5: Node IDs that Do Not Identify the Host
+ */
+class StaticNodeProvider implements NodeProviderInterface
+{
+ /**
+ * @var Hexadecimal
+ */
+ private $node;
+
+ /**
+ * @param Hexadecimal $node The static node value to use
+ */
+ public function __construct(Hexadecimal $node)
+ {
+ if (strlen($node->toString()) > 12) {
+ throw new InvalidArgumentException(
+ 'Static node value cannot be greater than 12 hexadecimal characters'
+ );
+ }
+
+ $this->node = $this->setMulticastBit($node);
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ return $this->node;
+ }
+
+ /**
+ * Set the multicast bit for the static node value
+ */
+ private function setMulticastBit(Hexadecimal $node): Hexadecimal
+ {
+ $nodeHex = str_pad($node->toString(), 12, '0', STR_PAD_LEFT);
+ $firstOctet = substr($nodeHex, 0, 2);
+
+ $firstOctet = str_pad(
+ dechex(hexdec($firstOctet) | 0x01),
+ 2,
+ '0',
+ STR_PAD_LEFT
+ );
+
+ return new Hexadecimal($firstOctet . substr($nodeHex, 2));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
new file mode 100644
index 00000000..d512f22a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
@@ -0,0 +1,173 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Node;
+
+use Ramsey\Uuid\Exception\NodeException;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+use function array_filter;
+use function array_map;
+use function array_walk;
+use function count;
+use function ob_get_clean;
+use function ob_start;
+use function preg_match;
+use function preg_match_all;
+use function reset;
+use function str_replace;
+use function strpos;
+use function strtolower;
+use function strtoupper;
+use function substr;
+
+use const GLOB_NOSORT;
+use const PREG_PATTERN_ORDER;
+
+/**
+ * SystemNodeProvider retrieves the system node ID, if possible
+ *
+ * The system node ID, or host ID, is often the same as the MAC address for a
+ * network interface on the host.
+ */
+class SystemNodeProvider implements NodeProviderInterface
+{
+ /**
+ * Pattern to match nodes in ifconfig and ipconfig output.
+ */
+ private const IFCONFIG_PATTERN = '/[^:]([0-9a-f]{2}([:-])[0-9a-f]{2}(\2[0-9a-f]{2}){4})[^:]/i';
+
+ /**
+ * Pattern to match nodes in sysfs stream output.
+ */
+ private const SYSFS_PATTERN = '/^([0-9a-f]{2}:){5}[0-9a-f]{2}$/i';
+
+ public function getNode(): Hexadecimal
+ {
+ $node = $this->getNodeFromSystem();
+
+ if ($node === '') {
+ throw new NodeException(
+ 'Unable to fetch a node for this system'
+ );
+ }
+
+ return new Hexadecimal($node);
+ }
+
+ /**
+ * Returns the system node, if it can find it
+ */
+ protected function getNodeFromSystem(): string
+ {
+ static $node = null;
+
+ if ($node !== null) {
+ return (string) $node;
+ }
+
+ // First, try a Linux-specific approach.
+ $node = $this->getSysfs();
+
+ if ($node === '') {
+ // Search ifconfig output for MAC addresses & return the first one.
+ $node = $this->getIfconfig();
+ }
+
+ $node = str_replace([':', '-'], '', $node);
+
+ return $node;
+ }
+
+ /**
+ * Returns the network interface configuration for the system
+ *
+ * @codeCoverageIgnore
+ */
+ protected function getIfconfig(): string
+ {
+ $disabledFunctions = strtolower((string) ini_get('disable_functions'));
+
+ if (strpos($disabledFunctions, 'passthru') !== false) {
+ return '';
+ }
+
+ ob_start();
+ switch (strtoupper(substr(constant('PHP_OS'), 0, 3))) {
+ case 'WIN':
+ passthru('ipconfig /all 2>&1');
+
+ break;
+ case 'DAR':
+ passthru('ifconfig 2>&1');
+
+ break;
+ case 'FRE':
+ passthru('netstat -i -f link 2>&1');
+
+ break;
+ case 'LIN':
+ default:
+ passthru('netstat -ie 2>&1');
+
+ break;
+ }
+
+ $ifconfig = (string) ob_get_clean();
+
+ $node = '';
+ if (preg_match_all(self::IFCONFIG_PATTERN, $ifconfig, $matches, PREG_PATTERN_ORDER)) {
+ $node = $matches[1][0] ?? '';
+ }
+
+ return $node;
+ }
+
+ /**
+ * Returns MAC address from the first system interface via the sysfs interface
+ */
+ protected function getSysfs(): string
+ {
+ $mac = '';
+
+ if (strtoupper(constant('PHP_OS')) === 'LINUX') {
+ $addressPaths = glob('/sys/class/net/*/address', GLOB_NOSORT);
+
+ if ($addressPaths === false || count($addressPaths) === 0) {
+ return '';
+ }
+
+ $macs = [];
+
+ array_walk($addressPaths, function (string $addressPath) use (&$macs): void {
+ if (is_readable($addressPath)) {
+ $macs[] = file_get_contents($addressPath);
+ }
+ });
+
+ $macs = array_map('trim', $macs);
+
+ // Remove invalid entries.
+ $macs = array_filter($macs, function (string $address) {
+ return $address !== '00:00:00:00:00:00'
+ && preg_match(self::SYSFS_PATTERN, $address);
+ });
+
+ $mac = reset($macs);
+ }
+
+ return (string) $mac;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php
new file mode 100644
index 00000000..d536b455
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php
@@ -0,0 +1,30 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider;
+
+use Ramsey\Uuid\Type\Hexadecimal;
+
+/**
+ * A node provider retrieves or generates a node ID
+ */
+interface NodeProviderInterface
+{
+ /**
+ * Returns a node ID
+ *
+ * @return Hexadecimal The node ID as a hexadecimal string
+ */
+ public function getNode(): Hexadecimal;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php
new file mode 100644
index 00000000..b8bfd721
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php
@@ -0,0 +1,63 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Time;
+
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\Time;
+
+/**
+ * FixedTimeProvider uses an known time to provide the time
+ *
+ * This provider allows the use of a previously-generated, or known, time
+ * when generating time-based UUIDs.
+ */
+class FixedTimeProvider implements TimeProviderInterface
+{
+ /**
+ * @var Time
+ */
+ private $fixedTime;
+
+ public function __construct(Time $time)
+ {
+ $this->fixedTime = $time;
+ }
+
+ /**
+ * Sets the `usec` component of the time
+ *
+ * @param int|string|IntegerObject $value The `usec` value to set
+ */
+ public function setUsec($value): void
+ {
+ $this->fixedTime = new Time($this->fixedTime->getSeconds(), $value);
+ }
+
+ /**
+ * Sets the `sec` component of the time
+ *
+ * @param int|string|IntegerObject $value The `sec` value to set
+ */
+ public function setSec($value): void
+ {
+ $this->fixedTime = new Time($value, $this->fixedTime->getMicroseconds());
+ }
+
+ public function getTime(): Time
+ {
+ return $this->fixedTime;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php
new file mode 100644
index 00000000..3a1e09cb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php
@@ -0,0 +1,33 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider\Time;
+
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+use Ramsey\Uuid\Type\Time;
+
+use function gettimeofday;
+
+/**
+ * SystemTimeProvider retrieves the current time using built-in PHP functions
+ */
+class SystemTimeProvider implements TimeProviderInterface
+{
+ public function getTime(): Time
+ {
+ $time = gettimeofday();
+
+ return new Time($time['sec'], $time['usec']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/TimeProviderInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/TimeProviderInterface.php
new file mode 100644
index 00000000..43588e0b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Provider/TimeProviderInterface.php
@@ -0,0 +1,28 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Provider;
+
+use Ramsey\Uuid\Type\Time;
+
+/**
+ * A time provider retrieves the current time
+ */
+interface TimeProviderInterface
+{
+ /**
+ * Returns a time object
+ */
+ public function getTime(): Time;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Fields.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Fields.php
new file mode 100644
index 00000000..2ccc20bb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Fields.php
@@ -0,0 +1,194 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Fields\SerializableFieldsTrait;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Uuid;
+
+use function bin2hex;
+use function dechex;
+use function hexdec;
+use function sprintf;
+use function str_pad;
+use function strlen;
+use function substr;
+use function unpack;
+
+use const STR_PAD_LEFT;
+
+/**
+ * RFC 4122 variant UUIDs are comprised of a set of named fields
+ *
+ * Internally, this class represents the fields together as a 16-byte binary
+ * string.
+ *
+ * @psalm-immutable
+ */
+final class Fields implements FieldsInterface
+{
+ use NilTrait;
+ use SerializableFieldsTrait;
+ use VariantTrait;
+ use VersionTrait;
+
+ /**
+ * @var string
+ */
+ private $bytes;
+
+ /**
+ * @param string $bytes A 16-byte binary string representation of a UUID
+ *
+ * @throws InvalidArgumentException if the byte string is not exactly 16 bytes
+ * @throws InvalidArgumentException if the byte string does not represent an RFC 4122 UUID
+ * @throws InvalidArgumentException if the byte string does not contain a valid version
+ */
+ public function __construct(string $bytes)
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ 'The byte string must be 16 bytes long; '
+ . 'received ' . strlen($bytes) . ' bytes'
+ );
+ }
+
+ $this->bytes = $bytes;
+
+ if (!$this->isCorrectVariant()) {
+ throw new InvalidArgumentException(
+ 'The byte string received does not conform to the RFC 4122 variant'
+ );
+ }
+
+ if (!$this->isCorrectVersion()) {
+ throw new InvalidArgumentException(
+ 'The byte string received does not contain a valid RFC 4122 version'
+ );
+ }
+ }
+
+ public function getBytes(): string
+ {
+ return $this->bytes;
+ }
+
+ public function getClockSeq(): Hexadecimal
+ {
+ $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
+
+ return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
+ }
+
+ public function getClockSeqHiAndReserved(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
+ }
+
+ public function getClockSeqLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
+ }
+
+ public function getTimeHiAndVersion(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 6, 2)));
+ }
+
+ public function getTimeLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 0, 4)));
+ }
+
+ public function getTimeMid(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 4, 2)));
+ }
+
+ /**
+ * Returns the full 60-bit timestamp, without the version
+ *
+ * For version 2 UUIDs, the time_low field is the local identifier and
+ * should not be returned as part of the time. For this reason, we set the
+ * bottom 32 bits of the timestamp to 0's. As a result, there is some loss
+ * of fidelity of the timestamp, for version 2 UUIDs. The timestamp can be
+ * off by a range of 0 to 429.4967295 seconds (or 7 minutes, 9 seconds, and
+ * 496730 microseconds).
+ *
+ * For version 6 UUIDs, the timestamp order is reversed from the typical RFC
+ * 4122 order (the time bits are in the correct bit order, so that it is
+ * monotonically increasing). In returning the timestamp value, we put the
+ * bits in the order: time_low + time_mid + time_hi.
+ */
+ public function getTimestamp(): Hexadecimal
+ {
+ switch ($this->getVersion()) {
+ case Uuid::UUID_TYPE_DCE_SECURITY:
+ $timestamp = sprintf(
+ '%03x%04s%08s',
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
+ $this->getTimeMid()->toString(),
+ ''
+ );
+
+ break;
+ case Uuid::UUID_TYPE_PEABODY:
+ $timestamp = sprintf(
+ '%08s%04s%03x',
+ $this->getTimeLow()->toString(),
+ $this->getTimeMid()->toString(),
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff
+ );
+
+ break;
+ default:
+ $timestamp = sprintf(
+ '%03x%04s%08s',
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
+ $this->getTimeMid()->toString(),
+ $this->getTimeLow()->toString()
+ );
+ }
+
+ return new Hexadecimal($timestamp);
+ }
+
+ public function getVersion(): ?int
+ {
+ if ($this->isNil()) {
+ return null;
+ }
+
+ /** @var array $parts */
+ $parts = unpack('n*', $this->bytes);
+
+ return (int) $parts[4] >> 12;
+ }
+
+ private function isCorrectVariant(): bool
+ {
+ if ($this->isNil()) {
+ return true;
+ }
+
+ return $this->getVariant() === Uuid::RFC_4122;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php
new file mode 100644
index 00000000..a303525d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.php
@@ -0,0 +1,126 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Fields\FieldsInterface as BaseFieldsInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+/**
+ * RFC 4122 defines fields for a specific variant of UUID
+ *
+ * The fields of an RFC 4122 variant UUID are:
+ *
+ * * **time_low**: The low field of the timestamp, an unsigned 32-bit integer
+ * * **time_mid**: The middle field of the timestamp, an unsigned 16-bit integer
+ * * **time_hi_and_version**: The high field of the timestamp multiplexed with
+ * the version number, an unsigned 16-bit integer
+ * * **clock_seq_hi_and_reserved**: The high field of the clock sequence
+ * multiplexed with the variant, an unsigned 8-bit integer
+ * * **clock_seq_low**: The low field of the clock sequence, an unsigned
+ * 8-bit integer
+ * * **node**: The spatially unique node identifier, an unsigned 48-bit
+ * integer
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1 RFC 4122, § 4.1: Format
+ *
+ * @psalm-immutable
+ */
+interface FieldsInterface extends BaseFieldsInterface
+{
+ /**
+ * Returns the full 16-bit clock sequence, with the variant bits (two most
+ * significant bits) masked out
+ */
+ public function getClockSeq(): Hexadecimal;
+
+ /**
+ * Returns the high field of the clock sequence multiplexed with the variant
+ */
+ public function getClockSeqHiAndReserved(): Hexadecimal;
+
+ /**
+ * Returns the low field of the clock sequence
+ */
+ public function getClockSeqLow(): Hexadecimal;
+
+ /**
+ * Returns the node field
+ */
+ public function getNode(): Hexadecimal;
+
+ /**
+ * Returns the high field of the timestamp multiplexed with the version
+ */
+ public function getTimeHiAndVersion(): Hexadecimal;
+
+ /**
+ * Returns the low field of the timestamp
+ */
+ public function getTimeLow(): Hexadecimal;
+
+ /**
+ * Returns the middle field of the timestamp
+ */
+ public function getTimeMid(): Hexadecimal;
+
+ /**
+ * Returns the full 60-bit timestamp, without the version
+ */
+ public function getTimestamp(): Hexadecimal;
+
+ /**
+ * Returns the variant
+ *
+ * The variant number describes the layout of the UUID. The variant
+ * number has the following meaning:
+ *
+ * - 0 - Reserved for NCS backward compatibility
+ * - 2 - The RFC 4122 variant
+ * - 6 - Reserved, Microsoft Corporation backward compatibility
+ * - 7 - Reserved for future definition
+ *
+ * For RFC 4122 variant UUIDs, this value should always be the integer `2`.
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ */
+ public function getVariant(): int;
+
+ /**
+ * Returns the version
+ *
+ * The version number describes how the UUID was generated and has the
+ * following meaning:
+ *
+ * 1. Time-based UUID
+ * 2. DCE security UUID
+ * 3. Name-based UUID hashed with MD5
+ * 4. Randomly generated UUID
+ * 5. Name-based UUID hashed with SHA-1
+ *
+ * This returns `null` if the UUID is not an RFC 4122 variant, since version
+ * is only meaningful for this variant.
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public function getVersion(): ?int;
+
+ /**
+ * Returns true if these fields represent a nil UUID
+ *
+ * The nil UUID is special form of UUID that is specified to have all 128
+ * bits set to zero.
+ */
+ public function isNil(): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilTrait.php
new file mode 100644
index 00000000..9a9774d8
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilTrait.php
@@ -0,0 +1,41 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+/**
+ * Provides common functionality for nil UUIDs
+ *
+ * The nil UUID is special form of UUID that is specified to have all 128 bits
+ * set to zero.
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.7 RFC 4122, § 4.1.7: Nil UUID
+ *
+ * @psalm-immutable
+ */
+trait NilTrait
+{
+ /**
+ * Returns the bytes that comprise the fields
+ */
+ abstract public function getBytes(): string;
+
+ /**
+ * Returns true if the byte string represents a nil UUID
+ */
+ public function isNil(): bool
+ {
+ return $this->getBytes() === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilUuid.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilUuid.php
new file mode 100644
index 00000000..c49b9945
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/NilUuid.php
@@ -0,0 +1,27 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Uuid;
+
+/**
+ * The nil UUID is special form of UUID that is specified to have all 128 bits
+ * set to zero
+ *
+ * @psalm-immutable
+ */
+final class NilUuid extends Uuid implements UuidInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php
new file mode 100644
index 00000000..736931af
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php
@@ -0,0 +1,111 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\UnableToBuildUuidException;
+use Ramsey\Uuid\Exception\UnsupportedOperationException;
+use Ramsey\Uuid\Nonstandard\UuidV6;
+use Ramsey\Uuid\Rfc4122\UuidInterface as Rfc4122UuidInterface;
+use Ramsey\Uuid\UuidInterface;
+use Throwable;
+
+/**
+ * UuidBuilder builds instances of RFC 4122 UUIDs
+ *
+ * @psalm-immutable
+ */
+class UuidBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * Constructs the DefaultUuidBuilder
+ *
+ * @param NumberConverterInterface $numberConverter The number converter to
+ * use when constructing the Uuid
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to Unix timestamps
+ */
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ TimeConverterInterface $timeConverter
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter;
+ }
+
+ /**
+ * Builds and returns a Uuid
+ *
+ * @param CodecInterface $codec The codec to use for building this Uuid instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return Rfc4122UuidInterface UuidBuilder returns instances of Rfc4122UuidInterface
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ try {
+ $fields = $this->buildFields($bytes);
+
+ if ($fields->isNil()) {
+ return new NilUuid($fields, $this->numberConverter, $codec, $this->timeConverter);
+ }
+
+ switch ($fields->getVersion()) {
+ case 1:
+ return new UuidV1($fields, $this->numberConverter, $codec, $this->timeConverter);
+ case 2:
+ return new UuidV2($fields, $this->numberConverter, $codec, $this->timeConverter);
+ case 3:
+ return new UuidV3($fields, $this->numberConverter, $codec, $this->timeConverter);
+ case 4:
+ return new UuidV4($fields, $this->numberConverter, $codec, $this->timeConverter);
+ case 5:
+ return new UuidV5($fields, $this->numberConverter, $codec, $this->timeConverter);
+ case 6:
+ return new UuidV6($fields, $this->numberConverter, $codec, $this->timeConverter);
+ }
+
+ throw new UnsupportedOperationException(
+ 'The UUID version in the given fields is not supported '
+ . 'by this UUID builder'
+ );
+ } catch (Throwable $e) {
+ throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Proxy method to allow injecting a mock, for testing
+ */
+ protected function buildFields(string $bytes): FieldsInterface
+ {
+ return new Fields($bytes);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php
new file mode 100644
index 00000000..3e4d9fae
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php
@@ -0,0 +1,36 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\UuidInterface as BaseUuidInterface;
+
+/**
+ * Also known as a Leach-Salz variant UUID, an RFC 4122 variant UUID is a
+ * universally unique identifier defined by RFC 4122
+ *
+ * @link https://tools.ietf.org/html/rfc4122 RFC 4122
+ *
+ * @psalm-immutable
+ */
+interface UuidInterface extends BaseUuidInterface
+{
+ /**
+ * Returns the string standard representation of the UUID as a URN
+ *
+ * @link http://en.wikipedia.org/wiki/Uniform_Resource_Name Uniform Resource Name
+ * @link https://tools.ietf.org/html/rfc4122#section-3 RFC 4122, § 3: Namespace Registration Template
+ */
+ public function getUrn(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php
new file mode 100644
index 00000000..764e42f8
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV1.php
@@ -0,0 +1,92 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use DateTimeImmutable;
+use DateTimeInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\DateTimeException;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Uuid;
+use Throwable;
+
+use function str_pad;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Time-based, or version 1, UUIDs include timestamp, clock sequence, and node
+ * values that are combined into a 128-bit unsigned integer
+ *
+ * @psalm-immutable
+ */
+final class UuidV1 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 1 (time-based) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_TIME) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV1 must represent a '
+ . 'version 1 (time-based) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+
+ /**
+ * Returns a DateTimeInterface object representing the timestamp associated
+ * with the UUID
+ *
+ * The timestamp value is only meaningful in a time-based UUID, which
+ * has version type 1.
+ *
+ * @return DateTimeImmutable A PHP DateTimeImmutable instance representing
+ * the timestamp of a version 1 UUID
+ */
+ public function getDateTime(): DateTimeInterface
+ {
+ $time = $this->timeConverter->convertTime($this->fields->getTimestamp());
+
+ try {
+ return new DateTimeImmutable(
+ '@'
+ . $time->getSeconds()->toString()
+ . '.'
+ . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
+ );
+ } catch (Throwable $e) {
+ throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php
new file mode 100644
index 00000000..74906f05
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV2.php
@@ -0,0 +1,143 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use DateTimeImmutable;
+use DateTimeInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\DateTimeException;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Uuid;
+use Throwable;
+
+use function hexdec;
+use function str_pad;
+
+use const STR_PAD_LEFT;
+
+/**
+ * DCE Security version, or version 2, UUIDs include local domain identifier,
+ * local ID for the specified domain, and node values that are combined into a
+ * 128-bit unsigned integer
+ *
+ * @link https://publications.opengroup.org/c311 DCE 1.1: Authentication and Security Services
+ * @link https://publications.opengroup.org/c706 DCE 1.1: Remote Procedure Call
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01 DCE 1.1: Auth & Sec, §5.2.1.1
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap11.htm#tagcjh_14_05_01_01 DCE 1.1: Auth & Sec, §11.5.1.1
+ * @link https://pubs.opengroup.org/onlinepubs/9629399/apdxa.htm DCE 1.1: RPC, Appendix A
+ * @link https://github.com/google/uuid Go package for UUIDs (includes DCE implementation)
+ *
+ * @psalm-immutable
+ */
+final class UuidV2 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 2 (DCE Security) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_DCE_SECURITY) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV2 must represent a '
+ . 'version 2 (DCE Security) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+
+ /**
+ * Returns a DateTimeInterface object representing the timestamp associated
+ * with the UUID
+ *
+ * It is important to note that a version 2 UUID suffers from some loss of
+ * fidelity of the timestamp, due to replacing the time_low field with the
+ * local identifier. When constructing the timestamp value for date
+ * purposes, we replace the local identifier bits with zeros. As a result,
+ * the timestamp can be off by a range of 0 to 429.4967295 seconds (or 7
+ * minutes, 9 seconds, and 496730 microseconds).
+ *
+ * Astute observers might note this value directly corresponds to 2^32 - 1,
+ * or 0xffffffff. The local identifier is 32-bits, and we have set each of
+ * these bits to 0, so the maximum range of timestamp drift is 0x00000000
+ * to 0xffffffff (counted in 100-nanosecond intervals).
+ *
+ * @return DateTimeImmutable A PHP DateTimeImmutable instance representing
+ * the timestamp of a version 2 UUID
+ */
+ public function getDateTime(): DateTimeInterface
+ {
+ $time = $this->timeConverter->convertTime($this->fields->getTimestamp());
+
+ try {
+ return new DateTimeImmutable(
+ '@'
+ . $time->getSeconds()->toString()
+ . '.'
+ . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
+ );
+ } catch (Throwable $e) {
+ throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Returns the local domain used to create this version 2 UUID
+ */
+ public function getLocalDomain(): int
+ {
+ /** @var Rfc4122FieldsInterface $fields */
+ $fields = $this->getFields();
+
+ return (int) hexdec($fields->getClockSeqLow()->toString());
+ }
+
+ /**
+ * Returns the string name of the local domain
+ */
+ public function getLocalDomainName(): string
+ {
+ return Uuid::DCE_DOMAIN_NAMES[$this->getLocalDomain()];
+ }
+
+ /**
+ * Returns the local identifier for the domain used to create this version 2 UUID
+ */
+ public function getLocalIdentifier(): IntegerObject
+ {
+ /** @var Rfc4122FieldsInterface $fields */
+ $fields = $this->getFields();
+
+ return new IntegerObject(
+ $this->numberConverter->fromHex($fields->getTimeLow()->toString())
+ );
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV3.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV3.php
new file mode 100644
index 00000000..deaa54eb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV3.php
@@ -0,0 +1,58 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Uuid;
+
+/**
+ * Version 3 UUIDs are named-based, using combination of a namespace and name
+ * that are hashed into a 128-bit unsigned integer using MD5
+ *
+ * @psalm-immutable
+ */
+final class UuidV3 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 3 (name-based, MD5-hashed) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_HASH_MD5) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV3 must represent a '
+ . 'version 3 (name-based, MD5-hashed) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV4.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV4.php
new file mode 100644
index 00000000..2e572462
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV4.php
@@ -0,0 +1,58 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Uuid;
+
+/**
+ * Random, or version 4, UUIDs are randomly or pseudo-randomly generated 128-bit
+ * integers
+ *
+ * @psalm-immutable
+ */
+final class UuidV4 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 4 (random) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_RANDOM) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV4 must represent a '
+ . 'version 4 (random) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV5.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV5.php
new file mode 100644
index 00000000..2ef6ab3f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/UuidV5.php
@@ -0,0 +1,58 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Uuid;
+
+/**
+ * Version 5 UUIDs are named-based, using combination of a namespace and name
+ * that are hashed into a 128-bit unsigned integer using SHA1
+ *
+ * @psalm-immutable
+ */
+final class UuidV5 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 5 (name-based, SHA1-hashed) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_HASH_SHA1) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV5 must represent a '
+ . 'version 5 (named-based, SHA1-hashed) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Validator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Validator.php
new file mode 100644
index 00000000..ed43c982
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/Validator.php
@@ -0,0 +1,49 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\Validator\ValidatorInterface;
+
+use function preg_match;
+use function str_replace;
+
+/**
+ * Rfc4122\Validator validates strings as UUIDs of the RFC 4122 variant
+ *
+ * @psalm-immutable
+ */
+final class Validator implements ValidatorInterface
+{
+ private const VALID_PATTERN = '\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-'
+ . '[1-5]{1}[0-9A-Fa-f]{3}-[ABab89]{1}[0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}\z';
+
+ /**
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function getPattern(): string
+ {
+ return self::VALID_PATTERN;
+ }
+
+ public function validate(string $uuid): bool
+ {
+ $uuid = str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}'], '', $uuid);
+
+ return $uuid === Uuid::NIL || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php
new file mode 100644
index 00000000..4c981658
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php
@@ -0,0 +1,90 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+use Ramsey\Uuid\Exception\InvalidBytesException;
+use Ramsey\Uuid\Uuid;
+
+use function decbin;
+use function str_pad;
+use function strlen;
+use function strpos;
+use function substr;
+use function unpack;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Provides common functionality for handling the variant, as defined by RFC 4122
+ *
+ * @psalm-immutable
+ */
+trait VariantTrait
+{
+ /**
+ * Returns the bytes that comprise the fields
+ */
+ abstract public function getBytes(): string;
+
+ /**
+ * Returns the variant identifier, according to RFC 4122, for the given bytes
+ *
+ * The following values may be returned:
+ *
+ * - `0` -- Reserved, NCS backward compatibility.
+ * - `2` -- The variant specified in RFC 4122.
+ * - `6` -- Reserved, Microsoft Corporation backward compatibility.
+ * - `7` -- Reserved for future definition.
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ *
+ * @return int The variant identifier, according to RFC 4122
+ */
+ public function getVariant(): int
+ {
+ if (strlen($this->getBytes()) !== 16) {
+ throw new InvalidBytesException('Invalid number of bytes');
+ }
+
+ /** @var array $parts */
+ $parts = unpack('n*', $this->getBytes());
+
+ // $parts[5] is a 16-bit, unsigned integer containing the variant bits
+ // of the UUID. We convert this integer into a string containing a
+ // binary representation, padded to 16 characters. We analyze the first
+ // three characters (three most-significant bits) to determine the
+ // variant.
+ $binary = str_pad(
+ decbin((int) $parts[5]),
+ 16,
+ '0',
+ STR_PAD_LEFT
+ );
+
+ $msb = substr($binary, 0, 3);
+
+ if ($msb === '111') {
+ $variant = Uuid::RESERVED_FUTURE;
+ } elseif ($msb === '110') {
+ $variant = Uuid::RESERVED_MICROSOFT;
+ } elseif (strpos($msb, '10') === 0) {
+ $variant = Uuid::RFC_4122;
+ } else {
+ $variant = Uuid::RESERVED_NCS;
+ }
+
+ return $variant;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php
new file mode 100644
index 00000000..cee55fbe
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php
@@ -0,0 +1,57 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Rfc4122;
+
+/**
+ * Provides common functionality for handling the version, as defined by RFC 4122
+ *
+ * @psalm-immutable
+ */
+trait VersionTrait
+{
+ /**
+ * Returns the version
+ */
+ abstract public function getVersion(): ?int;
+
+ /**
+ * Returns true if these fields represent a nil UUID
+ */
+ abstract public function isNil(): bool;
+
+ /**
+ * Returns true if the version matches one of those defined by RFC 4122
+ *
+ * @return bool True if the UUID version is valid, false otherwise
+ */
+ private function isCorrectVersion(): bool
+ {
+ if ($this->isNil()) {
+ return true;
+ }
+
+ switch ($this->getVersion()) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Decimal.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Decimal.php
new file mode 100644
index 00000000..10f93845
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Decimal.php
@@ -0,0 +1,137 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use ValueError;
+
+use function is_numeric;
+use function sprintf;
+
+/**
+ * A value object representing a decimal
+ *
+ * This class exists for type-safety purposes, to ensure that decimals
+ * returned from ramsey/uuid methods as strings are truly decimals and not some
+ * other kind of string.
+ *
+ * To support values as true decimals and not as floats or doubles, we store the
+ * decimals as strings.
+ *
+ * @psalm-immutable
+ */
+final class Decimal implements NumberInterface
+{
+ /**
+ * @var string
+ */
+ private $value;
+
+ /**
+ * @var bool
+ */
+ private $isNegative = false;
+
+ /**
+ * @param mixed $value The decimal value to store
+ */
+ public function __construct($value)
+ {
+ $value = (string) $value;
+
+ if (!is_numeric($value)) {
+ throw new InvalidArgumentException(
+ 'Value must be a signed decimal or a string containing only '
+ . 'digits 0-9 and, optionally, a decimal point or sign (+ or -)'
+ );
+ }
+
+ // Remove the leading +-symbol.
+ if (strpos($value, '+') === 0) {
+ $value = substr($value, 1);
+ }
+
+ // For cases like `-0` or `-0.0000`, convert the value to `0`.
+ if (abs((float) $value) === 0.0) {
+ $value = '0';
+ }
+
+ if (strpos($value, '-') === 0) {
+ $this->isNegative = true;
+ }
+
+ $this->value = $value;
+ }
+
+ public function isNegative(): bool
+ {
+ return $this->isNegative;
+ }
+
+ public function toString(): string
+ {
+ return $this->value;
+ }
+
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ public function serialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * @return array{string: string}
+ */
+ public function __serialize(): array
+ {
+ return ['string' => $this->toString()];
+ }
+
+ /**
+ * Constructs the object from a serialized string representation
+ *
+ * @param string $serialized The serialized string representation of the object
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress UnusedMethodCall
+ */
+ public function unserialize($serialized): void
+ {
+ $this->__construct($serialized);
+ }
+
+ /**
+ * @param array{string: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['string'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['string']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Hexadecimal.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Hexadecimal.php
new file mode 100644
index 00000000..88adc2e7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Hexadecimal.php
@@ -0,0 +1,116 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use ValueError;
+
+use function ctype_xdigit;
+use function sprintf;
+use function strpos;
+use function strtolower;
+use function substr;
+
+/**
+ * A value object representing a hexadecimal number
+ *
+ * This class exists for type-safety purposes, to ensure that hexadecimal numbers
+ * returned from ramsey/uuid methods as strings are truly hexadecimal and not some
+ * other kind of string.
+ *
+ * @psalm-immutable
+ */
+final class Hexadecimal implements TypeInterface
+{
+ /**
+ * @var string
+ */
+ private $value;
+
+ /**
+ * @param string $value The hexadecimal value to store
+ */
+ public function __construct(string $value)
+ {
+ $value = strtolower($value);
+
+ if (strpos($value, '0x') === 0) {
+ $value = substr($value, 2);
+ }
+
+ if (!ctype_xdigit($value)) {
+ throw new InvalidArgumentException(
+ 'Value must be a hexadecimal number'
+ );
+ }
+
+ $this->value = $value;
+ }
+
+ public function toString(): string
+ {
+ return $this->value;
+ }
+
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ public function serialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * @return array{string: string}
+ */
+ public function __serialize(): array
+ {
+ return ['string' => $this->toString()];
+ }
+
+ /**
+ * Constructs the object from a serialized string representation
+ *
+ * @param string $serialized The serialized string representation of the object
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress UnusedMethodCall
+ */
+ public function unserialize($serialized): void
+ {
+ $this->__construct($serialized);
+ }
+
+ /**
+ * @param array{string: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['string'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['string']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Integer.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Integer.php
new file mode 100644
index 00000000..7690f6cd
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Integer.php
@@ -0,0 +1,153 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use ValueError;
+
+use function ctype_digit;
+use function ltrim;
+use function sprintf;
+use function strpos;
+use function substr;
+
+/**
+ * A value object representing an integer
+ *
+ * This class exists for type-safety purposes, to ensure that integers
+ * returned from ramsey/uuid methods as strings are truly integers and not some
+ * other kind of string.
+ *
+ * To support large integers beyond PHP_INT_MAX and PHP_INT_MIN on both 64-bit
+ * and 32-bit systems, we store the integers as strings.
+ *
+ * @psalm-immutable
+ */
+final class Integer implements NumberInterface
+{
+ /**
+ * @psalm-var numeric-string
+ */
+ private $value;
+
+ /**
+ * @var bool
+ */
+ private $isNegative = false;
+
+ /**
+ * @param mixed $value The integer value to store
+ */
+ public function __construct($value)
+ {
+ $value = (string) $value;
+ $sign = '+';
+
+ // If the value contains a sign, remove it for ctype_digit() check.
+ if (strpos($value, '-') === 0 || strpos($value, '+') === 0) {
+ $sign = substr($value, 0, 1);
+ $value = substr($value, 1);
+ }
+
+ if (!ctype_digit($value)) {
+ throw new InvalidArgumentException(
+ 'Value must be a signed integer or a string containing only '
+ . 'digits 0-9 and, optionally, a sign (+ or -)'
+ );
+ }
+
+ // Trim any leading zeros.
+ $value = ltrim($value, '0');
+
+ // Set to zero if the string is empty after trimming zeros.
+ if ($value === '') {
+ $value = '0';
+ }
+
+ // Add the negative sign back to the value.
+ if ($sign === '-' && $value !== '0') {
+ $value = $sign . $value;
+ $this->isNegative = true;
+ }
+
+ /** @psalm-var numeric-string $numericValue */
+ $numericValue = $value;
+
+ $this->value = $numericValue;
+ }
+
+ public function isNegative(): bool
+ {
+ return $this->isNegative;
+ }
+
+ /**
+ * @psalm-return numeric-string
+ */
+ public function toString(): string
+ {
+ return $this->value;
+ }
+
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ public function serialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * @return array{string: string}
+ */
+ public function __serialize(): array
+ {
+ return ['string' => $this->toString()];
+ }
+
+ /**
+ * Constructs the object from a serialized string representation
+ *
+ * @param string $serialized The serialized string representation of the object
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress UnusedMethodCall
+ */
+ public function unserialize($serialized): void
+ {
+ $this->__construct($serialized);
+ }
+
+ /**
+ * @param array{string: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['string'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['string']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/NumberInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/NumberInterface.php
new file mode 100644
index 00000000..bf4ae9db
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/NumberInterface.php
@@ -0,0 +1,28 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+/**
+ * NumberInterface ensures consistency in numeric values returned by ramsey/uuid
+ *
+ * @psalm-immutable
+ */
+interface NumberInterface extends TypeInterface
+{
+ /**
+ * Returns true if this number is less than zero
+ */
+ public function isNegative(): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Time.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Time.php
new file mode 100644
index 00000000..dd1b8bc2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/Time.php
@@ -0,0 +1,139 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+use Ramsey\Uuid\Exception\UnsupportedOperationException;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use ValueError;
+use stdClass;
+
+use function json_decode;
+use function json_encode;
+use function sprintf;
+
+/**
+ * A value object representing a timestamp
+ *
+ * This class exists for type-safety purposes, to ensure that timestamps used
+ * by ramsey/uuid are truly timestamp integers and not some other kind of string
+ * or integer.
+ *
+ * @psalm-immutable
+ */
+final class Time implements TypeInterface
+{
+ /**
+ * @var IntegerObject
+ */
+ private $seconds;
+
+ /**
+ * @var IntegerObject
+ */
+ private $microseconds;
+
+ /**
+ * @param mixed $seconds
+ * @param mixed $microseconds
+ */
+ public function __construct($seconds, $microseconds = 0)
+ {
+ $this->seconds = new IntegerObject($seconds);
+ $this->microseconds = new IntegerObject($microseconds);
+ }
+
+ public function getSeconds(): IntegerObject
+ {
+ return $this->seconds;
+ }
+
+ public function getMicroseconds(): IntegerObject
+ {
+ return $this->microseconds;
+ }
+
+ public function toString(): string
+ {
+ return $this->seconds->toString() . '.' . $this->microseconds->toString();
+ }
+
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * @return string[]
+ */
+ public function jsonSerialize(): array
+ {
+ return [
+ 'seconds' => $this->getSeconds()->toString(),
+ 'microseconds' => $this->getMicroseconds()->toString(),
+ ];
+ }
+
+ public function serialize(): string
+ {
+ return (string) json_encode($this);
+ }
+
+ /**
+ * @return array{seconds: string, microseconds: string}
+ */
+ public function __serialize(): array
+ {
+ return [
+ 'seconds' => $this->getSeconds()->toString(),
+ 'microseconds' => $this->getMicroseconds()->toString(),
+ ];
+ }
+
+ /**
+ * Constructs the object from a serialized string representation
+ *
+ * @param string $serialized The serialized string representation of the object
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ * @psalm-suppress UnusedMethodCall
+ */
+ public function unserialize($serialized): void
+ {
+ /** @var stdClass $time */
+ $time = json_decode($serialized);
+
+ if (!isset($time->seconds) || !isset($time->microseconds)) {
+ throw new UnsupportedOperationException(
+ 'Attempted to unserialize an invalid value'
+ );
+ }
+
+ $this->__construct($time->seconds, $time->microseconds);
+ }
+
+ /**
+ * @param array{seconds: string, microseconds: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['seconds']) || !isset($data['microseconds'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->__construct($data['seconds'], $data['microseconds']);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/TypeInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/TypeInterface.php
new file mode 100644
index 00000000..da2d8b20
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Type/TypeInterface.php
@@ -0,0 +1,30 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Type;
+
+use JsonSerializable;
+use Serializable;
+
+/**
+ * TypeInterface ensures consistency in typed values returned by ramsey/uuid
+ *
+ * @psalm-immutable
+ */
+interface TypeInterface extends JsonSerializable, Serializable
+{
+ public function toString(): string;
+
+ public function __toString(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Uuid.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Uuid.php
new file mode 100644
index 00000000..945480ba
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Uuid.php
@@ -0,0 +1,664 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use DateTimeInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Fields\FieldsInterface;
+use Ramsey\Uuid\Lazy\LazyUuidFromString;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use ValueError;
+
+use function assert;
+use function bin2hex;
+use function preg_match;
+use function sprintf;
+use function str_replace;
+use function strcmp;
+use function strlen;
+use function strtolower;
+use function substr;
+
+/**
+ * Uuid provides constants and static methods for working with and generating UUIDs
+ *
+ * @psalm-immutable
+ */
+class Uuid implements UuidInterface
+{
+ use DeprecatedUuidMethodsTrait;
+
+ /**
+ * When this namespace is specified, the name string is a fully-qualified
+ * domain name
+ *
+ * @link http://tools.ietf.org/html/rfc4122#appendix-C RFC 4122, Appendix C: Some Name Space IDs
+ */
+ public const NAMESPACE_DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
+
+ /**
+ * When this namespace is specified, the name string is a URL
+ *
+ * @link http://tools.ietf.org/html/rfc4122#appendix-C RFC 4122, Appendix C: Some Name Space IDs
+ */
+ public const NAMESPACE_URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
+
+ /**
+ * When this namespace is specified, the name string is an ISO OID
+ *
+ * @link http://tools.ietf.org/html/rfc4122#appendix-C RFC 4122, Appendix C: Some Name Space IDs
+ */
+ public const NAMESPACE_OID = '6ba7b812-9dad-11d1-80b4-00c04fd430c8';
+
+ /**
+ * When this namespace is specified, the name string is an X.500 DN in DER
+ * or a text output format
+ *
+ * @link http://tools.ietf.org/html/rfc4122#appendix-C RFC 4122, Appendix C: Some Name Space IDs
+ */
+ public const NAMESPACE_X500 = '6ba7b814-9dad-11d1-80b4-00c04fd430c8';
+
+ /**
+ * The nil UUID is a special form of UUID that is specified to have all 128
+ * bits set to zero
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.7 RFC 4122, § 4.1.7: Nil UUID
+ */
+ public const NIL = '00000000-0000-0000-0000-000000000000';
+
+ /**
+ * Variant: reserved, NCS backward compatibility
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ */
+ public const RESERVED_NCS = 0;
+
+ /**
+ * Variant: the UUID layout specified in RFC 4122
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ */
+ public const RFC_4122 = 2;
+
+ /**
+ * Variant: reserved, Microsoft Corporation backward compatibility
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ */
+ public const RESERVED_MICROSOFT = 6;
+
+ /**
+ * Variant: reserved for future definition
+ *
+ * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
+ */
+ public const RESERVED_FUTURE = 7;
+
+ /**
+ * @deprecated Use {@see ValidatorInterface::getPattern()} instead.
+ */
+ public const VALID_PATTERN = '^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$';
+
+ /**
+ * Version 1 (time-based) UUID
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public const UUID_TYPE_TIME = 1;
+
+ /**
+ * Version 2 (DCE Security) UUID
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public const UUID_TYPE_DCE_SECURITY = 2;
+
+ /**
+ * @deprecated Use {@see Uuid::UUID_TYPE_DCE_SECURITY} instead.
+ */
+ public const UUID_TYPE_IDENTIFIER = 2;
+
+ /**
+ * Version 3 (name-based and hashed with MD5) UUID
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public const UUID_TYPE_HASH_MD5 = 3;
+
+ /**
+ * Version 4 (random) UUID
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public const UUID_TYPE_RANDOM = 4;
+
+ /**
+ * Version 5 (name-based and hashed with SHA1) UUID
+ *
+ * @link https://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
+ */
+ public const UUID_TYPE_HASH_SHA1 = 5;
+
+ /**
+ * Version 6 (ordered-time) UUID
+ *
+ * This is named `UUID_TYPE_PEABODY`, since the specification is still in
+ * draft form, and the primary author/editor's name is Brad Peabody.
+ *
+ * @link https://github.com/uuid6/uuid6-ietf-draft UUID version 6 IETF draft
+ * @link http://gh.peabody.io/uuidv6/ "Version 6" UUIDs
+ */
+ public const UUID_TYPE_PEABODY = 6;
+
+ /**
+ * DCE Security principal domain
+ *
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap11.htm#tagcjh_14_05_01_01 DCE 1.1, §11.5.1.1
+ */
+ public const DCE_DOMAIN_PERSON = 0;
+
+ /**
+ * DCE Security group domain
+ *
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap11.htm#tagcjh_14_05_01_01 DCE 1.1, §11.5.1.1
+ */
+ public const DCE_DOMAIN_GROUP = 1;
+
+ /**
+ * DCE Security organization domain
+ *
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap11.htm#tagcjh_14_05_01_01 DCE 1.1, §11.5.1.1
+ */
+ public const DCE_DOMAIN_ORG = 2;
+
+ /**
+ * DCE Security domain string names
+ *
+ * @link https://pubs.opengroup.org/onlinepubs/9696989899/chap11.htm#tagcjh_14_05_01_01 DCE 1.1, §11.5.1.1
+ */
+ public const DCE_DOMAIN_NAMES = [
+ self::DCE_DOMAIN_PERSON => 'person',
+ self::DCE_DOMAIN_GROUP => 'group',
+ self::DCE_DOMAIN_ORG => 'org',
+ ];
+
+ /**
+ * @var UuidFactoryInterface|null
+ */
+ private static $factory = null;
+
+ /**
+ * @var bool flag to detect if the UUID factory was replaced internally, which disables all optimizations
+ * for the default/happy path internal scenarios
+ */
+ private static $factoryReplaced = false;
+
+ /**
+ * @var CodecInterface
+ */
+ protected $codec;
+
+ /**
+ * The fields that make up this UUID
+ *
+ * @var Rfc4122FieldsInterface
+ */
+ protected $fields;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ protected $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ protected $timeConverter;
+
+ /**
+ * Creates a universally unique identifier (UUID) from an array of fields
+ *
+ * Unless you're making advanced use of this library to generate identifiers
+ * that deviate from RFC 4122, you probably do not want to instantiate a
+ * UUID directly. Use the static methods, instead:
+ *
+ * ```
+ * use Ramsey\Uuid\Uuid;
+ *
+ * $timeBasedUuid = Uuid::uuid1();
+ * $namespaceMd5Uuid = Uuid::uuid3(Uuid::NAMESPACE_URL, 'http://php.net/');
+ * $randomUuid = Uuid::uuid4();
+ * $namespaceSha1Uuid = Uuid::uuid5(Uuid::NAMESPACE_URL, 'http://php.net/');
+ * ```
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ $this->fields = $fields;
+ $this->codec = $codec;
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * Converts the UUID to a string for JSON serialization
+ */
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * Converts the UUID to a string for PHP serialization
+ */
+ public function serialize(): string
+ {
+ return $this->getFields()->getBytes();
+ }
+
+ /**
+ * @return array{bytes: string}
+ */
+ public function __serialize(): array
+ {
+ return ['bytes' => $this->serialize()];
+ }
+
+ /**
+ * Re-constructs the object from its serialized form
+ *
+ * @param string $serialized The serialized PHP string to unserialize into
+ * a UuidInterface instance
+ *
+ * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
+ */
+ public function unserialize($serialized): void
+ {
+ if (strlen($serialized) === 16) {
+ /** @var Uuid $uuid */
+ $uuid = self::getFactory()->fromBytes($serialized);
+ } else {
+ /** @var Uuid $uuid */
+ $uuid = self::getFactory()->fromString($serialized);
+ }
+
+ $this->codec = $uuid->codec;
+ $this->numberConverter = $uuid->numberConverter;
+ $this->fields = $uuid->fields;
+ $this->timeConverter = $uuid->timeConverter;
+ }
+
+ /**
+ * @param array{bytes: string} $data
+ */
+ public function __unserialize(array $data): void
+ {
+ // @codeCoverageIgnoreStart
+ if (!isset($data['bytes'])) {
+ throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $this->unserialize($data['bytes']);
+ }
+
+ public function compareTo(UuidInterface $other): int
+ {
+ $compare = strcmp($this->toString(), $other->toString());
+
+ if ($compare < 0) {
+ return -1;
+ }
+
+ if ($compare > 0) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ public function equals(?object $other): bool
+ {
+ if (!$other instanceof UuidInterface) {
+ return false;
+ }
+
+ return $this->compareTo($other) === 0;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function getBytes(): string
+ {
+ return $this->codec->encodeBinary($this);
+ }
+
+ public function getFields(): FieldsInterface
+ {
+ return $this->fields;
+ }
+
+ public function getHex(): Hexadecimal
+ {
+ return new Hexadecimal(str_replace('-', '', $this->toString()));
+ }
+
+ public function getInteger(): IntegerObject
+ {
+ return new IntegerObject($this->numberConverter->fromHex($this->getHex()->toString()));
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function toString(): string
+ {
+ return $this->codec->encode($this);
+ }
+
+ /**
+ * Returns the factory used to create UUIDs
+ */
+ public static function getFactory(): UuidFactoryInterface
+ {
+ if (self::$factory === null) {
+ self::$factory = new UuidFactory();
+ }
+
+ return self::$factory;
+ }
+
+ /**
+ * Sets the factory used to create UUIDs
+ *
+ * @param UuidFactoryInterface $factory A factory that will be used by this
+ * class to create UUIDs
+ */
+ public static function setFactory(UuidFactoryInterface $factory): void
+ {
+ // Note: non-strict equality is intentional here. If the factory is configured differently, every assumption
+ // around purity is broken, and we have to internally decide everything differently.
+ // phpcs:ignore SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedNotEqualOperator
+ self::$factoryReplaced = ($factory != new UuidFactory());
+
+ self::$factory = $factory;
+ }
+
+ /**
+ * Creates a UUID from a byte string
+ *
+ * @param string $bytes A binary string
+ *
+ * @return UuidInterface A UuidInterface instance created from a binary
+ * string representation
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ *
+ * @psalm-suppress ImpureStaticProperty we know that the factory being replaced can lead to massive
+ * havoc across all consumers: that should never happen, and
+ * is generally to be discouraged. Until the factory is kept
+ * un-replaced, this method is effectively pure.
+ */
+ public static function fromBytes(string $bytes): UuidInterface
+ {
+ if (! self::$factoryReplaced && strlen($bytes) === 16) {
+ $base16Uuid = bin2hex($bytes);
+
+ // Note: we are calling `fromString` internally because we don't know if the given `$bytes` is a valid UUID
+ return self::fromString(
+ substr($base16Uuid, 0, 8)
+ . '-'
+ . substr($base16Uuid, 8, 4)
+ . '-'
+ . substr($base16Uuid, 12, 4)
+ . '-'
+ . substr($base16Uuid, 16, 4)
+ . '-'
+ . substr($base16Uuid, 20, 12)
+ );
+ }
+
+ return self::getFactory()->fromBytes($bytes);
+ }
+
+ /**
+ * Creates a UUID from the string standard representation
+ *
+ * @param string $uuid A hexadecimal string
+ *
+ * @return UuidInterface A UuidInterface instance created from a hexadecimal
+ * string representation
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ *
+ * @psalm-suppress ImpureStaticProperty we know that the factory being replaced can lead to massive
+ * havoc across all consumers: that should never happen, and
+ * is generally to be discouraged. Until the factory is kept
+ * un-replaced, this method is effectively pure.
+ */
+ public static function fromString(string $uuid): UuidInterface
+ {
+ if (! self::$factoryReplaced && preg_match(LazyUuidFromString::VALID_REGEX, $uuid) === 1) {
+ assert($uuid !== '');
+
+ return new LazyUuidFromString(strtolower($uuid));
+ }
+
+ return self::getFactory()->fromString($uuid);
+ }
+
+ /**
+ * Creates a UUID from a DateTimeInterface instance
+ *
+ * @param DateTimeInterface $dateTime The date and time
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 1 UUID created from a DateTimeInterface instance
+ */
+ public static function fromDateTime(
+ DateTimeInterface $dateTime,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface {
+ return self::getFactory()->fromDateTime($dateTime, $node, $clockSeq);
+ }
+
+ /**
+ * Creates a UUID from a 128-bit integer string
+ *
+ * @param string $integer String representation of 128-bit integer
+ *
+ * @return UuidInterface A UuidInterface instance created from the string
+ * representation of a 128-bit integer
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ */
+ public static function fromInteger(string $integer): UuidInterface
+ {
+ return self::getFactory()->fromInteger($integer);
+ }
+
+ /**
+ * Returns true if the provided string is a valid UUID
+ *
+ * @param string $uuid A string to validate as a UUID
+ *
+ * @return bool True if the string is a valid UUID, false otherwise
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ */
+ public static function isValid(string $uuid): bool
+ {
+ return self::getFactory()->getValidator()->validate($uuid);
+ }
+
+ /**
+ * Returns a version 1 (time-based) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|int|string|null $node A 48-bit number representing the
+ * hardware address; this number may be represented as an integer or a
+ * hexadecimal string
+ * @param int $clockSeq A 14-bit number used to help avoid duplicates that
+ * could arise when the clock is set backwards in time or if the node ID
+ * changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 1 UUID
+ */
+ public static function uuid1($node = null, ?int $clockSeq = null): UuidInterface
+ {
+ return self::getFactory()->uuid1($node, $clockSeq);
+ }
+
+ /**
+ * Returns a version 2 (DCE Security) UUID from a local domain, local
+ * identifier, host ID, clock sequence, and the current time
+ *
+ * @param int $localDomain The local domain to use when generating bytes,
+ * according to DCE Security
+ * @param IntegerObject|null $localIdentifier The local identifier for the
+ * given domain; this may be a UID or GID on POSIX systems, if the local
+ * domain is person or group, or it may be a site-defined identifier
+ * if the local domain is org
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes (in a version 2 UUID, the lower 8 bits of this number
+ * are replaced with the domain).
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 2 UUID
+ */
+ public static function uuid2(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface {
+ return self::getFactory()->uuid2($localDomain, $localIdentifier, $node, $clockSeq);
+ }
+
+ /**
+ * Returns a version 3 (name-based) UUID based on the MD5 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ * @param string $name The name to use for creating a UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 3 UUID
+ *
+ * @psalm-suppress ImpureMethodCall we know that the factory being replaced can lead to massive
+ * havoc across all consumers: that should never happen, and
+ * is generally to be discouraged. Until the factory is kept
+ * un-replaced, this method is effectively pure.
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ */
+ public static function uuid3($ns, string $name): UuidInterface
+ {
+ return self::getFactory()->uuid3($ns, $name);
+ }
+
+ /**
+ * Returns a version 4 (random) UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 4 UUID
+ */
+ public static function uuid4(): UuidInterface
+ {
+ return self::getFactory()->uuid4();
+ }
+
+ /**
+ * Returns a version 5 (name-based) UUID based on the SHA-1 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ * @param string $name The name to use for creating a UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 5 UUID
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ *
+ * @psalm-suppress ImpureMethodCall we know that the factory being replaced can lead to massive
+ * havoc across all consumers: that should never happen, and
+ * is generally to be discouraged. Until the factory is kept
+ * un-replaced, this method is effectively pure.
+ */
+ public static function uuid5($ns, string $name): UuidInterface
+ {
+ return self::getFactory()->uuid5($ns, $name);
+ }
+
+ /**
+ * Returns a version 6 (ordered-time) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int $clockSeq A 14-bit number used to help avoid duplicates that
+ * could arise when the clock is set backwards in time or if the node ID
+ * changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 6 UUID
+ */
+ public static function uuid6(
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface {
+ return self::getFactory()->uuid6($node, $clockSeq);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactory.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactory.php
new file mode 100644
index 00000000..6f2cea06
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactory.php
@@ -0,0 +1,493 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use DateTimeInterface;
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Generator\DceSecurityGeneratorInterface;
+use Ramsey\Uuid\Generator\DefaultTimeGenerator;
+use Ramsey\Uuid\Generator\NameGeneratorInterface;
+use Ramsey\Uuid\Generator\RandomGeneratorInterface;
+use Ramsey\Uuid\Generator\TimeGeneratorInterface;
+use Ramsey\Uuid\Lazy\LazyUuidFromString;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Provider\Time\FixedTimeProvider;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Type\Time;
+use Ramsey\Uuid\Validator\ValidatorInterface;
+
+use function bin2hex;
+use function hex2bin;
+use function pack;
+use function str_pad;
+use function strtolower;
+use function substr;
+use function substr_replace;
+use function unpack;
+
+use const STR_PAD_LEFT;
+
+class UuidFactory implements UuidFactoryInterface
+{
+ /**
+ * @var CodecInterface
+ */
+ private $codec;
+
+ /**
+ * @var DceSecurityGeneratorInterface
+ */
+ private $dceSecurityGenerator;
+
+ /**
+ * @var NameGeneratorInterface
+ */
+ private $nameGenerator;
+
+ /**
+ * @var NodeProviderInterface
+ */
+ private $nodeProvider;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var RandomGeneratorInterface
+ */
+ private $randomGenerator;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @var TimeGeneratorInterface
+ */
+ private $timeGenerator;
+
+ /**
+ * @var UuidBuilderInterface
+ */
+ private $uuidBuilder;
+
+ /**
+ * @var ValidatorInterface
+ */
+ private $validator;
+
+ /** @var bool whether the feature set was provided from outside, or we can operate under "default" assumptions */
+ private $isDefaultFeatureSet;
+
+ /**
+ * @param FeatureSet $features A set of available features in the current environment
+ */
+ public function __construct(?FeatureSet $features = null)
+ {
+ $this->isDefaultFeatureSet = $features === null;
+
+ $features = $features ?: new FeatureSet();
+
+ $this->codec = $features->getCodec();
+ $this->dceSecurityGenerator = $features->getDceSecurityGenerator();
+ $this->nameGenerator = $features->getNameGenerator();
+ $this->nodeProvider = $features->getNodeProvider();
+ $this->numberConverter = $features->getNumberConverter();
+ $this->randomGenerator = $features->getRandomGenerator();
+ $this->timeConverter = $features->getTimeConverter();
+ $this->timeGenerator = $features->getTimeGenerator();
+ $this->uuidBuilder = $features->getBuilder();
+ $this->validator = $features->getValidator();
+ }
+
+ /**
+ * Returns the codec used by this factory
+ */
+ public function getCodec(): CodecInterface
+ {
+ return $this->codec;
+ }
+
+ /**
+ * Sets the codec to use for this factory
+ *
+ * @param CodecInterface $codec A UUID encoder-decoder
+ */
+ public function setCodec(CodecInterface $codec): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->codec = $codec;
+ }
+
+ /**
+ * Returns the name generator used by this factory
+ */
+ public function getNameGenerator(): NameGeneratorInterface
+ {
+ return $this->nameGenerator;
+ }
+
+ /**
+ * Sets the name generator to use for this factory
+ *
+ * @param NameGeneratorInterface $nameGenerator A generator to generate
+ * binary data, based on a namespace and name
+ */
+ public function setNameGenerator(NameGeneratorInterface $nameGenerator): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->nameGenerator = $nameGenerator;
+ }
+
+ /**
+ * Returns the node provider used by this factory
+ */
+ public function getNodeProvider(): NodeProviderInterface
+ {
+ return $this->nodeProvider;
+ }
+
+ /**
+ * Returns the random generator used by this factory
+ */
+ public function getRandomGenerator(): RandomGeneratorInterface
+ {
+ return $this->randomGenerator;
+ }
+
+ /**
+ * Returns the time generator used by this factory
+ */
+ public function getTimeGenerator(): TimeGeneratorInterface
+ {
+ return $this->timeGenerator;
+ }
+
+ /**
+ * Sets the time generator to use for this factory
+ *
+ * @param TimeGeneratorInterface $generator A generator to generate binary
+ * data, based on the time
+ */
+ public function setTimeGenerator(TimeGeneratorInterface $generator): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->timeGenerator = $generator;
+ }
+
+ /**
+ * Returns the DCE Security generator used by this factory
+ */
+ public function getDceSecurityGenerator(): DceSecurityGeneratorInterface
+ {
+ return $this->dceSecurityGenerator;
+ }
+
+ /**
+ * Sets the DCE Security generator to use for this factory
+ *
+ * @param DceSecurityGeneratorInterface $generator A generator to generate
+ * binary data, based on a local domain and local identifier
+ */
+ public function setDceSecurityGenerator(DceSecurityGeneratorInterface $generator): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->dceSecurityGenerator = $generator;
+ }
+
+ /**
+ * Returns the number converter used by this factory
+ */
+ public function getNumberConverter(): NumberConverterInterface
+ {
+ return $this->numberConverter;
+ }
+
+ /**
+ * Sets the random generator to use for this factory
+ *
+ * @param RandomGeneratorInterface $generator A generator to generate binary
+ * data, based on some random input
+ */
+ public function setRandomGenerator(RandomGeneratorInterface $generator): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->randomGenerator = $generator;
+ }
+
+ /**
+ * Sets the number converter to use for this factory
+ *
+ * @param NumberConverterInterface $converter A converter to use for working
+ * with large integers (i.e. integers greater than PHP_INT_MAX)
+ */
+ public function setNumberConverter(NumberConverterInterface $converter): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->numberConverter = $converter;
+ }
+
+ /**
+ * Returns the UUID builder used by this factory
+ */
+ public function getUuidBuilder(): UuidBuilderInterface
+ {
+ return $this->uuidBuilder;
+ }
+
+ /**
+ * Sets the UUID builder to use for this factory
+ *
+ * @param UuidBuilderInterface $builder A builder for constructing instances
+ * of UuidInterface
+ */
+ public function setUuidBuilder(UuidBuilderInterface $builder): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->uuidBuilder = $builder;
+ }
+
+ /**
+ * @psalm-mutation-free
+ */
+ public function getValidator(): ValidatorInterface
+ {
+ return $this->validator;
+ }
+
+ /**
+ * Sets the validator to use for this factory
+ *
+ * @param ValidatorInterface $validator A validator to use for validating
+ * whether a string is a valid UUID
+ */
+ public function setValidator(ValidatorInterface $validator): void
+ {
+ $this->isDefaultFeatureSet = false;
+
+ $this->validator = $validator;
+ }
+
+ /**
+ * @psalm-pure
+ */
+ public function fromBytes(string $bytes): UuidInterface
+ {
+ return $this->codec->decodeBytes($bytes);
+ }
+
+ /**
+ * @psalm-pure
+ */
+ public function fromString(string $uuid): UuidInterface
+ {
+ $uuid = strtolower($uuid);
+
+ return $this->codec->decode($uuid);
+ }
+
+ /**
+ * @psalm-pure
+ */
+ public function fromInteger(string $integer): UuidInterface
+ {
+ $hex = $this->numberConverter->toHex($integer);
+ $hex = str_pad($hex, 32, '0', STR_PAD_LEFT);
+
+ return $this->fromString($hex);
+ }
+
+ public function fromDateTime(
+ DateTimeInterface $dateTime,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface {
+ $timeProvider = new FixedTimeProvider(
+ new Time($dateTime->format('U'), $dateTime->format('u'))
+ );
+
+ $timeGenerator = new DefaultTimeGenerator(
+ $this->nodeProvider,
+ $this->timeConverter,
+ $timeProvider
+ );
+
+ $nodeHex = $node ? $node->toString() : null;
+
+ $bytes = $timeGenerator->generate($nodeHex, $clockSeq);
+
+ return $this->uuidFromBytesAndVersion($bytes, 1);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function uuid1($node = null, ?int $clockSeq = null): UuidInterface
+ {
+ $bytes = $this->timeGenerator->generate($node, $clockSeq);
+
+ return $this->uuidFromBytesAndVersion($bytes, 1);
+ }
+
+ public function uuid2(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface {
+ $bytes = $this->dceSecurityGenerator->generate(
+ $localDomain,
+ $localIdentifier,
+ $node,
+ $clockSeq
+ );
+
+ return $this->uuidFromBytesAndVersion($bytes, 2);
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ */
+ public function uuid3($ns, string $name): UuidInterface
+ {
+ return $this->uuidFromNsAndName($ns, $name, 3, 'md5');
+ }
+
+ public function uuid4(): UuidInterface
+ {
+ $bytes = $this->randomGenerator->generate(16);
+
+ return $this->uuidFromBytesAndVersion($bytes, 4);
+ }
+
+ /**
+ * @inheritDoc
+ * @psalm-pure
+ */
+ public function uuid5($ns, string $name): UuidInterface
+ {
+ return $this->uuidFromNsAndName($ns, $name, 5, 'sha1');
+ }
+
+ public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface
+ {
+ $nodeHex = $node ? $node->toString() : null;
+ $bytes = $this->timeGenerator->generate($nodeHex, $clockSeq);
+
+ // Rearrange the bytes, according to the UUID version 6 specification.
+ $v6 = $bytes[6] . $bytes[7] . $bytes[4] . $bytes[5]
+ . $bytes[0] . $bytes[1] . $bytes[2] . $bytes[3];
+ $v6 = bin2hex($v6);
+
+ // Drop the first four bits, while adding an empty four bits for the
+ // version field. This allows us to reconstruct the correct time from
+ // the bytes of this UUID.
+ $v6Bytes = hex2bin(substr($v6, 1, 12) . '0' . substr($v6, -3));
+ $v6Bytes .= substr($bytes, 8);
+
+ return $this->uuidFromBytesAndVersion($v6Bytes, 6);
+ }
+
+ /**
+ * Returns a Uuid created from the provided byte string
+ *
+ * Uses the configured builder and codec and the provided byte string to
+ * construct a Uuid object.
+ *
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return UuidInterface An instance of UuidInterface, created from the
+ * provided bytes
+ *
+ * @psalm-pure
+ */
+ public function uuid(string $bytes): UuidInterface
+ {
+ return $this->uuidBuilder->build($this->codec, $bytes);
+ }
+
+ /**
+ * Returns a version 3 or 5 namespaced Uuid
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ * @param string $name The name to hash together with the namespace
+ * @param int $version The version of UUID to create (3 or 5)
+ * @param string $hashAlgorithm The hashing algorithm to use when hashing
+ * together the namespace and name
+ *
+ * @return UuidInterface An instance of UuidInterface, created by hashing
+ * together the provided namespace and name
+ *
+ * @psalm-pure
+ */
+ private function uuidFromNsAndName($ns, string $name, int $version, string $hashAlgorithm): UuidInterface
+ {
+ if (!($ns instanceof UuidInterface)) {
+ $ns = $this->fromString($ns);
+ }
+
+ $bytes = $this->nameGenerator->generate($ns, $name, $hashAlgorithm);
+
+ return $this->uuidFromBytesAndVersion(substr($bytes, 0, 16), $version);
+ }
+
+ /**
+ * Returns an RFC 4122 variant Uuid, created from the provided bytes and version
+ *
+ * @param string $bytes The byte string to convert to a UUID
+ * @param int $version The RFC 4122 version to apply to the UUID
+ *
+ * @return UuidInterface An instance of UuidInterface, created from the
+ * byte string and version
+ *
+ * @psalm-pure
+ */
+ private function uuidFromBytesAndVersion(string $bytes, int $version): UuidInterface
+ {
+ /** @var array $unpackedTime */
+ $unpackedTime = unpack('n*', substr($bytes, 6, 2));
+ $timeHi = (int) $unpackedTime[1];
+ $timeHiAndVersion = pack('n*', BinaryUtils::applyVersion($timeHi, $version));
+
+ /** @var array $unpackedClockSeq */
+ $unpackedClockSeq = unpack('n*', substr($bytes, 8, 2));
+ $clockSeqHi = (int) $unpackedClockSeq[1];
+ $clockSeqHiAndReserved = pack('n*', BinaryUtils::applyVariant($clockSeqHi));
+
+ $bytes = substr_replace($bytes, $timeHiAndVersion, 6, 2);
+ $bytes = substr_replace($bytes, $clockSeqHiAndReserved, 8, 2);
+
+ if ($this->isDefaultFeatureSet) {
+ return LazyUuidFromString::fromBytes($bytes);
+ }
+
+ return $this->uuid($bytes);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactoryInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactoryInterface.php
new file mode 100644
index 00000000..468cc637
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidFactoryInterface.php
@@ -0,0 +1,182 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use DateTimeInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Ramsey\Uuid\Validator\ValidatorInterface;
+
+/**
+ * UuidFactoryInterface defines common functionality all `UuidFactory` instances
+ * must implement
+ */
+interface UuidFactoryInterface
+{
+ /**
+ * Returns the validator to use for the factory
+ *
+ * @psalm-mutation-free
+ */
+ public function getValidator(): ValidatorInterface;
+
+ /**
+ * Returns a version 1 (time-based) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|int|string|null $node A 48-bit number representing the
+ * hardware address; this number may be represented as an integer or a
+ * hexadecimal string
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 1 UUID
+ */
+ public function uuid1($node = null, ?int $clockSeq = null): UuidInterface;
+
+ /**
+ * Returns a version 2 (DCE Security) UUID from a local domain, local
+ * identifier, host ID, clock sequence, and the current time
+ *
+ * @param int $localDomain The local domain to use when generating bytes,
+ * according to DCE Security
+ * @param IntegerObject|null $localIdentifier The local identifier for the
+ * given domain; this may be a UID or GID on POSIX systems, if the local
+ * domain is person or group, or it may be a site-defined identifier
+ * if the local domain is org
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 2 UUID
+ */
+ public function uuid2(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface;
+
+ /**
+ * Returns a version 3 (name-based) UUID based on the MD5 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ * @param string $name The name to use for creating a UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 3 UUID
+ *
+ * @psalm-pure
+ */
+ public function uuid3($ns, string $name): UuidInterface;
+
+ /**
+ * Returns a version 4 (random) UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 4 UUID
+ */
+ public function uuid4(): UuidInterface;
+
+ /**
+ * Returns a version 5 (name-based) UUID based on the SHA-1 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ * @param string $name The name to use for creating a UUID
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 5 UUID
+ *
+ * @psalm-pure
+ */
+ public function uuid5($ns, string $name): UuidInterface;
+
+ /**
+ * Returns a version 6 (ordered-time) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 6 UUID
+ */
+ public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface;
+
+ /**
+ * Creates a UUID from a byte string
+ *
+ * @param string $bytes A binary string
+ *
+ * @return UuidInterface A UuidInterface instance created from a binary
+ * string representation
+ *
+ * @psalm-pure
+ */
+ public function fromBytes(string $bytes): UuidInterface;
+
+ /**
+ * Creates a UUID from the string standard representation
+ *
+ * @param string $uuid A hexadecimal string
+ *
+ * @return UuidInterface A UuidInterface instance created from a hexadecimal
+ * string representation
+ *
+ * @psalm-pure
+ */
+ public function fromString(string $uuid): UuidInterface;
+
+ /**
+ * Creates a UUID from a 128-bit integer string
+ *
+ * @param string $integer String representation of 128-bit integer
+ *
+ * @return UuidInterface A UuidInterface instance created from the string
+ * representation of a 128-bit integer
+ *
+ * @psalm-pure
+ */
+ public function fromInteger(string $integer): UuidInterface;
+
+ /**
+ * Creates a UUID from a DateTimeInterface instance
+ *
+ * @param DateTimeInterface $dateTime The date and time
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return UuidInterface A UuidInterface instance that represents a
+ * version 1 UUID created from a DateTimeInterface instance
+ */
+ public function fromDateTime(
+ DateTimeInterface $dateTime,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+ ): UuidInterface;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidInterface.php
new file mode 100644
index 00000000..f22eb0f9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/UuidInterface.php
@@ -0,0 +1,99 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use JsonSerializable;
+use Ramsey\Uuid\Fields\FieldsInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+use Serializable;
+
+/**
+ * A UUID is a universally unique identifier adhering to an agreed-upon
+ * representation format and standard for generation
+ *
+ * @psalm-immutable
+ */
+interface UuidInterface extends
+ DeprecatedUuidInterface,
+ JsonSerializable,
+ Serializable
+{
+ /**
+ * Returns -1, 0, or 1 if the UUID is less than, equal to, or greater than
+ * the other UUID
+ *
+ * The first of two UUIDs is greater than the second if the most
+ * significant field in which the UUIDs differ is greater for the first
+ * UUID.
+ *
+ * * Q. What's the value of being able to sort UUIDs?
+ * * A. Use them as keys in a B-Tree or similar mapping.
+ *
+ * @param UuidInterface $other The UUID to compare
+ *
+ * @return int -1, 0, or 1 if the UUID is less than, equal to, or greater than $other
+ */
+ public function compareTo(UuidInterface $other): int;
+
+ /**
+ * Returns true if the UUID is equal to the provided object
+ *
+ * The result is true if and only if the argument is not null, is a UUID
+ * object, has the same variant, and contains the same value, bit for bit,
+ * as the UUID.
+ *
+ * @param object|null $other An object to test for equality with this UUID
+ *
+ * @return bool True if the other object is equal to this UUID
+ */
+ public function equals(?object $other): bool;
+
+ /**
+ * Returns the binary string representation of the UUID
+ *
+ * @psalm-return non-empty-string
+ */
+ public function getBytes(): string;
+
+ /**
+ * Returns the fields that comprise this UUID
+ */
+ public function getFields(): FieldsInterface;
+
+ /**
+ * Returns the hexadecimal representation of the UUID
+ */
+ public function getHex(): Hexadecimal;
+
+ /**
+ * Returns the integer representation of the UUID
+ */
+ public function getInteger(): IntegerObject;
+
+ /**
+ * Returns the string standard representation of the UUID
+ *
+ * @psalm-return non-empty-string
+ */
+ public function toString(): string;
+
+ /**
+ * Casts the UUID to the string standard representation
+ *
+ * @psalm-return non-empty-string
+ */
+ public function __toString(): string;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/GenericValidator.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/GenericValidator.php
new file mode 100644
index 00000000..fd609551
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/GenericValidator.php
@@ -0,0 +1,50 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Validator;
+
+use Ramsey\Uuid\Uuid;
+
+use function preg_match;
+use function str_replace;
+
+/**
+ * GenericValidator validates strings as UUIDs of any variant
+ *
+ * @psalm-immutable
+ */
+final class GenericValidator implements ValidatorInterface
+{
+ /**
+ * Regular expression pattern for matching a UUID of any variant.
+ */
+ private const VALID_PATTERN = '\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\z';
+
+ /**
+ * @psalm-return non-empty-string
+ * @psalm-suppress MoreSpecificReturnType we know that the retrieved `string` is never empty
+ * @psalm-suppress LessSpecificReturnStatement we know that the retrieved `string` is never empty
+ */
+ public function getPattern(): string
+ {
+ return self::VALID_PATTERN;
+ }
+
+ public function validate(string $uuid): bool
+ {
+ $uuid = str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}'], '', $uuid);
+
+ return $uuid === Uuid::NIL || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/ValidatorInterface.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/ValidatorInterface.php
new file mode 100644
index 00000000..3d4bd6f2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/Validator/ValidatorInterface.php
@@ -0,0 +1,41 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Validator;
+
+/**
+ * A validator validates a string as a proper UUID
+ *
+ * @psalm-immutable
+ */
+interface ValidatorInterface
+{
+ /**
+ * Returns the regular expression pattern used by this validator
+ *
+ * @return string The regular expression pattern this validator uses
+ *
+ * @psalm-return non-empty-string
+ */
+ public function getPattern(): string;
+
+ /**
+ * Returns true if the provided string represents a UUID
+ *
+ * @param string $uuid The string to validate as a UUID
+ *
+ * @return bool True if the string is a valid UUID, false otherwise
+ */
+ public function validate(string $uuid): bool;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/functions.php b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/functions.php
new file mode 100644
index 00000000..f5df1488
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/ramsey/uuid/src/functions.php
@@ -0,0 +1,123 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * phpcs:disable Squiz.Functions.GlobalFunction
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid;
+
+use Ramsey\Uuid\Type\Hexadecimal;
+use Ramsey\Uuid\Type\Integer as IntegerObject;
+
+/**
+ * Returns a version 1 (time-based) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|int|string|null $node A 48-bit number representing the
+ * hardware address; this number may be represented as an integer or a
+ * hexadecimal string
+ * @param int $clockSeq A 14-bit number used to help avoid duplicates that
+ * could arise when the clock is set backwards in time or if the node ID
+ * changes
+ *
+ * @return non-empty-string Version 1 UUID as a string
+ */
+function v1($node = null, ?int $clockSeq = null): string
+{
+ return Uuid::uuid1($node, $clockSeq)->toString();
+}
+
+/**
+ * Returns a version 2 (DCE Security) UUID from a local domain, local
+ * identifier, host ID, clock sequence, and the current time
+ *
+ * @param int $localDomain The local domain to use when generating bytes,
+ * according to DCE Security
+ * @param IntegerObject|null $localIdentifier The local identifier for the
+ * given domain; this may be a UID or GID on POSIX systems, if the local
+ * domain is person or group, or it may be a site-defined identifier
+ * if the local domain is org
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int|null $clockSeq A 14-bit number used to help avoid duplicates
+ * that could arise when the clock is set backwards in time or if the
+ * node ID changes
+ *
+ * @return non-empty-string Version 2 UUID as a string
+ */
+function v2(
+ int $localDomain,
+ ?IntegerObject $localIdentifier = null,
+ ?Hexadecimal $node = null,
+ ?int $clockSeq = null
+): string {
+ return Uuid::uuid2($localDomain, $localIdentifier, $node, $clockSeq)->toString();
+}
+
+/**
+ * Returns a version 3 (name-based) UUID based on the MD5 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ *
+ * @return non-empty-string Version 3 UUID as a string
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ */
+function v3($ns, string $name): string
+{
+ return Uuid::uuid3($ns, $name)->toString();
+}
+
+/**
+ * Returns a version 4 (random) UUID
+ *
+ * @return non-empty-string Version 4 UUID as a string
+ */
+function v4(): string
+{
+ return Uuid::uuid4()->toString();
+}
+
+/**
+ * Returns a version 5 (name-based) UUID based on the SHA-1 hash of a
+ * namespace ID and a name
+ *
+ * @param string|UuidInterface $ns The namespace (must be a valid UUID)
+ *
+ * @return non-empty-string Version 5 UUID as a string
+ *
+ * @psalm-pure note: changing the internal factory is an edge case not covered by purity invariants,
+ * but under constant factory setups, this method operates in functionally pure manners
+ */
+function v5($ns, string $name): string
+{
+ return Uuid::uuid5($ns, $name)->toString();
+}
+
+/**
+ * Returns a version 6 (ordered-time) UUID from a host ID, sequence number,
+ * and the current time
+ *
+ * @param Hexadecimal|null $node A 48-bit number representing the hardware
+ * address
+ * @param int $clockSeq A 14-bit number used to help avoid duplicates that
+ * could arise when the clock is set backwards in time or if the node ID
+ * changes
+ *
+ * @return non-empty-string Version 6 UUID as a string
+ */
+function v6(?Hexadecimal $node = null, ?int $clockSeq = null): string
+{
+ return Uuid::uuid6($node, $clockSeq)->toString();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/.github/FUNDING.yml b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/.github/FUNDING.yml
new file mode 100644
index 00000000..726574c1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/.github/FUNDING.yml
@@ -0,0 +1,2 @@
+github: Spomky
+patreon: FlorentMorselli
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/LICENSE b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/LICENSE
new file mode 100644
index 00000000..506ff485
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2018 Spomky-Labs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/composer.json b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/composer.json
new file mode 100644
index 00000000..1f3941b9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/composer.json
@@ -0,0 +1,35 @@
+{
+ "name": "spomky-labs/base64url",
+ "description": "Base 64 URL Safe Encoding/Decoding PHP Library",
+ "type": "library",
+ "license": "MIT",
+ "keywords": ["Base64", "URL", "Safe", "RFC4648"],
+ "homepage": "https://github.com/Spomky-Labs/base64url",
+ "authors": [
+ {
+ "name": "Florent Morselli",
+ "homepage": "https://github.com/Spomky-Labs/base64url/contributors"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "Base64Url\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Base64Url\\Test\\": "tests/"
+ }
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.11|^0.12",
+ "phpstan/phpstan-beberlei-assert": "^0.11|^0.12",
+ "phpstan/phpstan-deprecation-rules": "^0.11|^0.12",
+ "phpstan/phpstan-phpunit": "^0.11|^0.12",
+ "phpstan/phpstan-strict-rules": "^0.11|^0.12"
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/src/Base64Url.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/src/Base64Url.php
new file mode 100644
index 00000000..260215ae
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/base64url/src/Base64Url.php
@@ -0,0 +1,56 @@
+=7.3",
+ "brick/math": "^0.8.15|^0.9.0",
+ "ext-mbstring": "*"
+ },
+ "require-dev": {
+ "ext-json": "*",
+ "ekino/phpstan-banned-code": "^1.0",
+ "infection/infection": "^0.18|^0.25",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-beberlei-assert": "^1.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.12",
+ "roave/security-advisories": "dev-latest",
+ "symplify/easy-coding-standard": "^10.0"
+ },
+ "config": {
+ "sort-packages": true
+ },
+ "suggest": {
+ "ext-gmp": "GMP or BCMath extensions will drastically improve the library performance",
+ "ext-bcmath": "GMP or BCMath extensions will drastically improve the library performance. BCMath extension needed to handle the Big Float and Decimal Fraction Tags"
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/AbstractCBORObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/AbstractCBORObject.php
new file mode 100644
index 00000000..a14d2626
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/AbstractCBORObject.php
@@ -0,0 +1,50 @@
+majorType = $majorType;
+ $this->additionalInformation = $additionalInformation;
+ }
+
+ public function __toString(): string
+ {
+ return chr($this->majorType << 5 | $this->additionalInformation);
+ }
+
+ public function getMajorType(): int
+ {
+ return $this->majorType;
+ }
+
+ public function getAdditionalInformation(): int
+ {
+ return $this->additionalInformation;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringObject.php
new file mode 100644
index 00000000..450f7ee2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringObject.php
@@ -0,0 +1,76 @@
+length = $length;
+ $this->value = $data;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->length !== null) {
+ $result .= $this->length;
+ }
+
+ return $result . $this->value;
+ }
+
+ public static function create(string $data): self
+ {
+ return new self($data);
+ }
+
+ public function getValue(): string
+ {
+ return $this->value;
+ }
+
+ public function getLength(): int
+ {
+ return mb_strlen($this->value, '8bit');
+ }
+
+ public function normalize(): string
+ {
+ return $this->value;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ return $this->value;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringWithChunkObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringWithChunkObject.php
new file mode 100644
index 00000000..d173e2f7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ByteStringWithChunkObject.php
@@ -0,0 +1,21 @@
+tagManager = $tagManager ?? $this->generateTagManager();
+ $this->otherObjectManager = $otherTypeManager ?? $this->generateOtherObjectManager();
+ }
+
+ public static function create(
+ ?TagManagerInterface $tagManager = null,
+ ?OtherObjectManagerInterface $otherObjectManager = null
+ ): self {
+ return new self($tagManager, $otherObjectManager);
+ }
+
+ public function withTagManager(TagManagerInterface $tagManager): self
+ {
+ $this->tagManager = $tagManager;
+
+ return $this;
+ }
+
+ public function withOtherObjectManager(OtherObjectManagerInterface $otherObjectManager): self
+ {
+ $this->otherObjectManager = $otherObjectManager;
+
+ return $this;
+ }
+
+ public function decode(Stream $stream): CBORObject
+ {
+ return $this->process($stream, false);
+ }
+
+ private function process(Stream $stream, bool $breakable): CBORObject
+ {
+ $ib = ord($stream->read(1));
+ $mt = $ib >> 5;
+ $ai = $ib & 0b00011111;
+ $val = null;
+ switch ($ai) {
+ case CBORObject::LENGTH_1_BYTE: //24
+ case CBORObject::LENGTH_2_BYTES: //25
+ case CBORObject::LENGTH_4_BYTES: //26
+ case CBORObject::LENGTH_8_BYTES: //27
+ $val = $stream->read(2 ** ($ai & 0b00000111));
+ break;
+ case CBORObject::FUTURE_USE_1: //28
+ case CBORObject::FUTURE_USE_2: //29
+ case CBORObject::FUTURE_USE_3: //30
+ throw new InvalidArgumentException(sprintf(
+ 'Cannot parse the data. Found invalid Additional Information "%s" (%d).',
+ str_pad(decbin($ai), 8, '0', STR_PAD_LEFT),
+ $ai
+ ));
+ case CBORObject::LENGTH_INDEFINITE: //31
+ return $this->processInfinite($stream, $mt, $breakable);
+ }
+
+ return $this->processFinite($stream, $mt, $ai, $val);
+ }
+
+ private function processFinite(Stream $stream, int $mt, int $ai, ?string $val): CBORObject
+ {
+ switch ($mt) {
+ case CBORObject::MAJOR_TYPE_UNSIGNED_INTEGER: //0
+ return UnsignedIntegerObject::createObjectForValue($ai, $val);
+ case CBORObject::MAJOR_TYPE_NEGATIVE_INTEGER: //1
+ return NegativeIntegerObject::createObjectForValue($ai, $val);
+ case CBORObject::MAJOR_TYPE_BYTE_STRING: //2
+ $length = $val === null ? $ai : Utils::binToInt($val);
+
+ return ByteStringObject::create($stream->read($length));
+ case CBORObject::MAJOR_TYPE_TEXT_STRING: //3
+ $length = $val === null ? $ai : Utils::binToInt($val);
+
+ return TextStringObject::create($stream->read($length));
+ case CBORObject::MAJOR_TYPE_LIST: //4
+ $object = ListObject::create();
+ $nbItems = $val === null ? $ai : Utils::binToInt($val);
+ for ($i = 0; $i < $nbItems; ++$i) {
+ $object->add($this->process($stream, false));
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_MAP: //5
+ $object = MapObject::create();
+ $nbItems = $val === null ? $ai : Utils::binToInt($val);
+ for ($i = 0; $i < $nbItems; ++$i) {
+ $object->add($this->process($stream, false), $this->process($stream, false));
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_TAG: //6
+ return $this->tagManager->createObjectForValue($ai, $val, $this->process($stream, false));
+ case CBORObject::MAJOR_TYPE_OTHER_TYPE: //7
+ return $this->otherObjectManager->createObjectForValue($ai, $val);
+ default:
+ throw new RuntimeException(sprintf(
+ 'Unsupported major type "%s" (%d).',
+ str_pad(decbin($mt), 5, '0', STR_PAD_LEFT),
+ $mt
+ )); // Should never append
+ }
+ }
+
+ private function processInfinite(Stream $stream, int $mt, bool $breakable): CBORObject
+ {
+ switch ($mt) {
+ case CBORObject::MAJOR_TYPE_BYTE_STRING: //2
+ $object = IndefiniteLengthByteStringObject::create();
+ while (! ($it = $this->process($stream, true)) instanceof BreakObject) {
+ if (! $it instanceof ByteStringObject) {
+ throw new RuntimeException(
+ 'Unable to parse the data. Infinite Byte String object can only get Byte String objects.'
+ );
+ }
+ $object->add($it);
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_TEXT_STRING: //3
+ $object = IndefiniteLengthTextStringObject::create();
+ while (! ($it = $this->process($stream, true)) instanceof BreakObject) {
+ if (! $it instanceof TextStringObject) {
+ throw new RuntimeException(
+ 'Unable to parse the data. Infinite Text String object can only get Text String objects.'
+ );
+ }
+ $object->add($it);
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_LIST: //4
+ $object = IndefiniteLengthListObject::create();
+ $it = $this->process($stream, true);
+ while (! $it instanceof BreakObject) {
+ $object->add($it);
+ $it = $this->process($stream, true);
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_MAP: //5
+ $object = IndefiniteLengthMapObject::create();
+ while (! ($it = $this->process($stream, true)) instanceof BreakObject) {
+ $object->add($it, $this->process($stream, false));
+ }
+
+ return $object;
+ case CBORObject::MAJOR_TYPE_OTHER_TYPE: //7
+ if (! $breakable) {
+ throw new InvalidArgumentException('Cannot parse the data. No enclosing indefinite.');
+ }
+
+ return BreakObject::create();
+ case CBORObject::MAJOR_TYPE_UNSIGNED_INTEGER: //0
+ case CBORObject::MAJOR_TYPE_NEGATIVE_INTEGER: //1
+ case CBORObject::MAJOR_TYPE_TAG: //6
+ default:
+ throw new InvalidArgumentException(sprintf(
+ 'Cannot parse the data. Found infinite length for Major Type "%s" (%d).',
+ str_pad(decbin($mt), 5, '0', STR_PAD_LEFT),
+ $mt
+ ));
+ }
+ }
+
+ private function generateTagManager(): TagManagerInterface
+ {
+ return TagManager::create()
+ ->add(DatetimeTag::class)
+ ->add(TimestampTag::class)
+
+ ->add(UnsignedBigIntegerTag::class)
+ ->add(NegativeBigIntegerTag::class)
+
+ ->add(DecimalFractionTag::class)
+ ->add(BigFloatTag::class)
+
+ ->add(Base64UrlEncodingTag::class)
+ ->add(Base64EncodingTag::class)
+ ->add(Base16EncodingTag::class)
+ ->add(CBOREncodingTag::class)
+
+ ->add(UriTag::class)
+ ->add(Base64UrlTag::class)
+ ->add(Base64Tag::class)
+ ->add(MimeTag::class)
+
+ ->add(CBORTag::class)
+ ;
+ }
+
+ private function generateOtherObjectManager(): OtherObjectManagerInterface
+ {
+ return OtherObjectManager::create()
+ ->add(BreakObject::class)
+ ->add(SimpleObject::class)
+ ->add(FalseObject::class)
+ ->add(TrueObject::class)
+ ->add(NullObject::class)
+ ->add(UndefinedObject::class)
+ ->add(HalfPrecisionFloatObject::class)
+ ->add(SinglePrecisionFloatObject::class)
+ ->add(DoublePrecisionFloatObject::class)
+ ;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/DecoderInterface.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/DecoderInterface.php
new file mode 100644
index 00000000..3d7b1924
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/DecoderInterface.php
@@ -0,0 +1,19 @@
+chunks as $chunk) {
+ $result .= $chunk->__toString();
+ }
+
+ return $result . "\xFF";
+ }
+
+ public static function create(): self
+ {
+ return new self();
+ }
+
+ public function add(ByteStringObject $chunk): self
+ {
+ $this->chunks[] = $chunk;
+
+ return $this;
+ }
+
+ public function append(string $chunk): self
+ {
+ $this->add(ByteStringObject::create($chunk));
+
+ return $this;
+ }
+
+ public function getValue(): string
+ {
+ $result = '';
+ foreach ($this->chunks as $chunk) {
+ $result .= $chunk->getValue();
+ }
+
+ return $result;
+ }
+
+ public function getLength(): int
+ {
+ $length = 0;
+ foreach ($this->chunks as $chunk) {
+ $length += $chunk->getLength();
+ }
+
+ return $length;
+ }
+
+ public function normalize(): string
+ {
+ $result = '';
+ foreach ($this->chunks as $chunk) {
+ $result .= $chunk->normalize();
+ }
+
+ return $result;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ $result = '';
+ foreach ($this->chunks as $chunk) {
+ $result .= $chunk->getNormalizedData($ignoreTags);
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php
new file mode 100644
index 00000000..2bf44fb4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php
@@ -0,0 +1,167 @@
+
+ * @phpstan-implements IteratorAggregate
+ * @final
+ */
+class IndefiniteLengthListObject extends AbstractCBORObject implements Countable, IteratorAggregate, Normalizable, ArrayAccess
+{
+ private const MAJOR_TYPE = self::MAJOR_TYPE_LIST;
+
+ private const ADDITIONAL_INFORMATION = self::LENGTH_INDEFINITE;
+
+ /**
+ * @var CBORObject[]
+ */
+ private $data = [];
+
+ public function __construct()
+ {
+ parent::__construct(self::MAJOR_TYPE, self::ADDITIONAL_INFORMATION);
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ foreach ($this->data as $object) {
+ $result .= (string) $object;
+ }
+
+ return $result . "\xFF";
+ }
+
+ public static function create(): self
+ {
+ return new self();
+ }
+
+ /**
+ * @return mixed[]
+ */
+ public function normalize(): array
+ {
+ return array_map(static function (CBORObject $object) {
+ return $object instanceof Normalizable ? $object->normalize() : $object;
+ }, $this->data);
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ *
+ * @return mixed[]
+ */
+ public function getNormalizedData(bool $ignoreTags = false): array
+ {
+ return array_map(static function (CBORObject $object) use ($ignoreTags) {
+ return $object->getNormalizedData($ignoreTags);
+ }, $this->data);
+ }
+
+ public function add(CBORObject $item): self
+ {
+ $this->data[] = $item;
+
+ return $this;
+ }
+
+ public function has(int $index): bool
+ {
+ return array_key_exists($index, $this->data);
+ }
+
+ public function remove(int $index): self
+ {
+ if (! $this->has($index)) {
+ return $this;
+ }
+ unset($this->data[$index]);
+ $this->data = array_values($this->data);
+
+ return $this;
+ }
+
+ public function get(int $index): CBORObject
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ return $this->data[$index];
+ }
+
+ public function set(int $index, CBORObject $object): self
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ $this->data[$index] = $object;
+
+ return $this;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. No replacement
+ */
+ public function count(): int
+ {
+ return count($this->data);
+ }
+
+ /**
+ * @return Iterator
+ */
+ public function getIterator(): Iterator
+ {
+ return new ArrayIterator($this->data);
+ }
+
+ public function offsetExists($offset): bool
+ {
+ return $this->has($offset);
+ }
+
+ public function offsetGet($offset): CBORObject
+ {
+ return $this->get($offset);
+ }
+
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ $this->add($value);
+
+ return;
+ }
+
+ $this->set($offset, $value);
+ }
+
+ public function offsetUnset($offset): void
+ {
+ $this->remove($offset);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php
new file mode 100644
index 00000000..7bc7a1c1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php
@@ -0,0 +1,201 @@
+
+ * @phpstan-implements IteratorAggregate
+ * @final
+ */
+class IndefiniteLengthMapObject extends AbstractCBORObject implements Countable, IteratorAggregate, Normalizable, ArrayAccess
+{
+ private const MAJOR_TYPE = self::MAJOR_TYPE_MAP;
+
+ private const ADDITIONAL_INFORMATION = self::LENGTH_INDEFINITE;
+
+ /**
+ * @var MapItem[]
+ */
+ private $data = [];
+
+ public function __construct()
+ {
+ parent::__construct(self::MAJOR_TYPE, self::ADDITIONAL_INFORMATION);
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ foreach ($this->data as $object) {
+ $result .= (string) $object->getKey();
+ $result .= (string) $object->getValue();
+ }
+
+ return $result . "\xFF";
+ }
+
+ public static function create(): self
+ {
+ return new self();
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please use "add" instead
+ */
+ public function append(CBORObject $key, CBORObject $value): self
+ {
+ return $this->add($key, $value);
+ }
+
+ public function add(CBORObject $key, CBORObject $value): self
+ {
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+ $this->data[$key->normalize()] = MapItem::create($key, $value);
+
+ return $this;
+ }
+
+ /**
+ * @param int|string $key
+ */
+ public function has($key): bool
+ {
+ return array_key_exists($key, $this->data);
+ }
+
+ /**
+ * @param int|string $index
+ */
+ public function remove($index): self
+ {
+ if (! $this->has($index)) {
+ return $this;
+ }
+ unset($this->data[$index]);
+ $this->data = array_values($this->data);
+
+ return $this;
+ }
+
+ /**
+ * @param int|string $index
+ */
+ public function get($index): CBORObject
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ return $this->data[$index]->getValue();
+ }
+
+ public function set(MapItem $object): self
+ {
+ $key = $object->getKey();
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+
+ $this->data[$key->normalize()] = $object;
+
+ return $this;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. No replacement
+ */
+ public function count(): int
+ {
+ return count($this->data);
+ }
+
+ /**
+ * @return Iterator
+ */
+ public function getIterator(): Iterator
+ {
+ return new ArrayIterator($this->data);
+ }
+
+ /**
+ * @return mixed[]
+ */
+ public function normalize(): array
+ {
+ return array_reduce($this->data, static function (array $carry, MapItem $item): array {
+ $key = $item->getKey();
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+ $valueObject = $item->getValue();
+ $carry[$key->normalize()] = $valueObject instanceof Normalizable ? $valueObject->normalize() : $valueObject;
+
+ return $carry;
+ }, []);
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ *
+ * @return mixed[]
+ */
+ public function getNormalizedData(bool $ignoreTags = false): array
+ {
+ return array_reduce($this->data, static function (array $carry, MapItem $item) use ($ignoreTags): array {
+ $key = $item->getKey();
+ $valueObject = $item->getValue();
+ $carry[$key->getNormalizedData($ignoreTags)] = $valueObject->getNormalizedData($ignoreTags);
+
+ return $carry;
+ }, []);
+ }
+
+ public function offsetExists($offset): bool
+ {
+ return $this->has($offset);
+ }
+
+ public function offsetGet($offset): CBORObject
+ {
+ return $this->get($offset);
+ }
+
+ public function offsetSet($offset, $value): void
+ {
+ if (! $offset instanceof CBORObject) {
+ throw new InvalidArgumentException('Invalid key');
+ }
+ if (! $value instanceof CBORObject) {
+ throw new InvalidArgumentException('Invalid value');
+ }
+
+ $this->set(MapItem::create($offset, $value));
+ }
+
+ public function offsetUnset($offset): void
+ {
+ $this->remove($offset);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php
new file mode 100644
index 00000000..108528e2
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php
@@ -0,0 +1,106 @@
+data as $object) {
+ $result .= (string) $object;
+ }
+
+ return $result . "\xFF";
+ }
+
+ public static function create(): self
+ {
+ return new self();
+ }
+
+ public function add(TextStringObject $chunk): self
+ {
+ $this->data[] = $chunk;
+
+ return $this;
+ }
+
+ public function append(string $chunk): self
+ {
+ $this->add(TextStringObject::create($chunk));
+
+ return $this;
+ }
+
+ public function getValue(): string
+ {
+ $result = '';
+ foreach ($this->data as $object) {
+ $result .= $object->getValue();
+ }
+
+ return $result;
+ }
+
+ public function getLength(): int
+ {
+ $length = 0;
+ foreach ($this->data as $object) {
+ $length += $object->getLength();
+ }
+
+ return $length;
+ }
+
+ public function normalize(): string
+ {
+ $result = '';
+ foreach ($this->data as $object) {
+ $result .= $object->normalize();
+ }
+
+ return $result;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ $result = '';
+ foreach ($this->data as $object) {
+ $result .= $object->getNormalizedData($ignoreTags);
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/InfiniteListObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/InfiniteListObject.php
new file mode 100644
index 00000000..526d74cc
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/InfiniteListObject.php
@@ -0,0 +1,21 @@
+ $data
+ *
+ * @return array{int, null|string}
+ */
+ public static function getLengthOfArray(array $data): array
+ {
+ $length = count($data);
+
+ return self::computeLength($length);
+ }
+
+ /**
+ * @return array{int, null|string}
+ */
+ private static function computeLength(int $length): array
+ {
+ switch (true) {
+ case $length <= 23:
+ return [$length, null];
+ case $length <= 0xFF:
+ return [CBORObject::LENGTH_1_BYTE, chr($length)];
+ case $length <= 0xFFFF:
+ return [CBORObject::LENGTH_2_BYTES, self::hex2bin(dechex($length))];
+ case $length <= 0xFFFFFFFF:
+ return [CBORObject::LENGTH_4_BYTES, self::hex2bin(dechex($length))];
+ case BigInteger::of($length)->isLessThanOrEqualTo(BigInteger::fromBase('FFFFFFFFFFFFFFFF', 16)):
+ return [CBORObject::LENGTH_8_BYTES, self::hex2bin(dechex($length))];
+ default:
+ return [CBORObject::LENGTH_INDEFINITE, null];
+ }
+ }
+
+ private static function hex2bin(string $data): string
+ {
+ $data = str_pad($data, (int) (2 ** ceil(log(mb_strlen($data, '8bit'), 2))), '0', STR_PAD_LEFT);
+ $result = hex2bin($data);
+ if ($result === false) {
+ throw new InvalidArgumentException('Unable to convert the data');
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ListObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ListObject.php
new file mode 100644
index 00000000..f3a32133
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/ListObject.php
@@ -0,0 +1,187 @@
+
+ * @phpstan-implements IteratorAggregate
+ */
+class ListObject extends AbstractCBORObject implements Countable, IteratorAggregate, Normalizable, ArrayAccess
+{
+ private const MAJOR_TYPE = self::MAJOR_TYPE_LIST;
+
+ /**
+ * @var CBORObject[]
+ */
+ private $data;
+
+ /**
+ * @var string|null
+ */
+ private $length;
+
+ /**
+ * @param CBORObject[] $data
+ */
+ public function __construct(array $data = [])
+ {
+ [$additionalInformation, $length] = LengthCalculator::getLengthOfArray($data);
+ array_map(static function ($item): void {
+ if (! $item instanceof CBORObject) {
+ throw new InvalidArgumentException('The list must contain only CBORObject objects.');
+ }
+ }, $data);
+
+ parent::__construct(self::MAJOR_TYPE, $additionalInformation);
+ $this->data = array_values($data);
+ $this->length = $length;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->length !== null) {
+ $result .= $this->length;
+ }
+ foreach ($this->data as $object) {
+ $result .= (string) $object;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param CBORObject[] $data
+ */
+ public static function create(array $data = []): self
+ {
+ return new self($data);
+ }
+
+ public function add(CBORObject $object): self
+ {
+ $this->data[] = $object;
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ public function has(int $index): bool
+ {
+ return array_key_exists($index, $this->data);
+ }
+
+ public function remove(int $index): self
+ {
+ if (! $this->has($index)) {
+ return $this;
+ }
+ unset($this->data[$index]);
+ $this->data = array_values($this->data);
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ public function get(int $index): CBORObject
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ return $this->data[$index];
+ }
+
+ public function set(int $index, CBORObject $object): self
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ $this->data[$index] = $object;
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ public function normalize(): array
+ {
+ return array_map(static function (CBORObject $object) {
+ return $object instanceof Normalizable ? $object->normalize() : $object;
+ }, $this->data);
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ *
+ * @return array
+ */
+ public function getNormalizedData(bool $ignoreTags = false): array
+ {
+ return array_map(static function (CBORObject $object) use ($ignoreTags) {
+ return $object->getNormalizedData($ignoreTags);
+ }, $this->data);
+ }
+
+ public function count(): int
+ {
+ return count($this->data);
+ }
+
+ /**
+ * @return Iterator
+ */
+ public function getIterator(): Iterator
+ {
+ return new ArrayIterator($this->data);
+ }
+
+ public function offsetExists($offset): bool
+ {
+ return $this->has($offset);
+ }
+
+ public function offsetGet($offset): CBORObject
+ {
+ return $this->get($offset);
+ }
+
+ public function offsetSet($offset, $value): void
+ {
+ if ($offset === null) {
+ $this->add($value);
+
+ return;
+ }
+
+ $this->set($offset, $value);
+ }
+
+ public function offsetUnset($offset): void
+ {
+ $this->remove($offset);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapItem.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapItem.php
new file mode 100644
index 00000000..39578a6e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapItem.php
@@ -0,0 +1,48 @@
+key = $key;
+ $this->value = $value;
+ }
+
+ public static function create(CBORObject $key, CBORObject $value): self
+ {
+ return new self($key, $value);
+ }
+
+ public function getKey(): CBORObject
+ {
+ return $this->key;
+ }
+
+ public function getValue(): CBORObject
+ {
+ return $this->value;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapObject.php
new file mode 100644
index 00000000..9c71332e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/MapObject.php
@@ -0,0 +1,217 @@
+
+ * @phpstan-implements IteratorAggregate
+ */
+final class MapObject extends AbstractCBORObject implements Countable, IteratorAggregate, Normalizable, ArrayAccess
+{
+ private const MAJOR_TYPE = self::MAJOR_TYPE_MAP;
+
+ /**
+ * @var MapItem[]
+ */
+ private $data;
+
+ /**
+ * @var string|null
+ */
+ private $length;
+
+ /**
+ * @param MapItem[] $data
+ */
+ public function __construct(array $data = [])
+ {
+ [$additionalInformation, $length] = LengthCalculator::getLengthOfArray($data);
+ array_map(static function ($item): void {
+ if (! $item instanceof MapItem) {
+ throw new InvalidArgumentException('The list must contain only MapItem objects.');
+ }
+ }, $data);
+
+ parent::__construct(self::MAJOR_TYPE, $additionalInformation);
+ $this->data = $data;
+ $this->length = $length;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->length !== null) {
+ $result .= $this->length;
+ }
+ foreach ($this->data as $object) {
+ $result .= $object->getKey()
+ ->__toString()
+ ;
+ $result .= $object->getValue()
+ ->__toString()
+ ;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param MapItem[] $data
+ */
+ public static function create(array $data = []): self
+ {
+ return new self($data);
+ }
+
+ public function add(CBORObject $key, CBORObject $value): self
+ {
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+ $this->data[$key->normalize()] = MapItem::create($key, $value);
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ /**
+ * @param int|string $key
+ */
+ public function has($key): bool
+ {
+ return array_key_exists($key, $this->data);
+ }
+
+ /**
+ * @param int|string $index
+ */
+ public function remove($index): self
+ {
+ if (! $this->has($index)) {
+ return $this;
+ }
+ unset($this->data[$index]);
+ $this->data = array_values($this->data);
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ /**
+ * @param int|string $index
+ */
+ public function get($index): CBORObject
+ {
+ if (! $this->has($index)) {
+ throw new InvalidArgumentException('Index not found.');
+ }
+
+ return $this->data[$index]->getValue();
+ }
+
+ public function set(MapItem $object): self
+ {
+ $key = $object->getKey();
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+
+ $this->data[$key->normalize()] = $object;
+ [$this->additionalInformation, $this->length] = LengthCalculator::getLengthOfArray($this->data);
+
+ return $this;
+ }
+
+ public function count(): int
+ {
+ return count($this->data);
+ }
+
+ /**
+ * @return Iterator
+ */
+ public function getIterator(): Iterator
+ {
+ return new ArrayIterator($this->data);
+ }
+
+ /**
+ * @return array
+ */
+ public function normalize(): array
+ {
+ return array_reduce($this->data, static function (array $carry, MapItem $item): array {
+ $key = $item->getKey();
+ if (! $key instanceof Normalizable) {
+ throw new InvalidArgumentException('Invalid key. Shall be normalizable');
+ }
+ $valueObject = $item->getValue();
+ $carry[$key->normalize()] = $valueObject instanceof Normalizable ? $valueObject->normalize() : $valueObject;
+
+ return $carry;
+ }, []);
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ *
+ * @return array
+ */
+ public function getNormalizedData(bool $ignoreTags = false): array
+ {
+ return array_reduce($this->data, static function (array $carry, MapItem $item) use ($ignoreTags): array {
+ $key = $item->getKey();
+ $valueObject = $item->getValue();
+ $carry[$key->getNormalizedData($ignoreTags)] = $valueObject->getNormalizedData($ignoreTags);
+
+ return $carry;
+ }, []);
+ }
+
+ public function offsetExists($offset): bool
+ {
+ return $this->has($offset);
+ }
+
+ public function offsetGet($offset): CBORObject
+ {
+ return $this->get($offset);
+ }
+
+ public function offsetSet($offset, $value): void
+ {
+ if (! $offset instanceof CBORObject) {
+ throw new InvalidArgumentException('Invalid key');
+ }
+ if (! $value instanceof CBORObject) {
+ throw new InvalidArgumentException('Invalid value');
+ }
+
+ $this->set(MapItem::create($offset, $value));
+ }
+
+ public function offsetUnset($offset): void
+ {
+ $this->remove($offset);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/NegativeIntegerObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/NegativeIntegerObject.php
new file mode 100644
index 00000000..ad1bbe1e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/NegativeIntegerObject.php
@@ -0,0 +1,136 @@
+data = $data;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->data !== null) {
+ $result .= $this->data;
+ }
+
+ return $result;
+ }
+
+ public static function createObjectForValue(int $additionalInformation, ?string $data): self
+ {
+ return new self($additionalInformation, $data);
+ }
+
+ public static function create(int $value): self
+ {
+ return self::createFromString((string) $value);
+ }
+
+ public static function createFromString(string $value): self
+ {
+ $integer = BigInteger::of($value);
+
+ return self::createBigInteger($integer);
+ }
+
+ public function getValue(): string
+ {
+ if ($this->data === null) {
+ return (string) (-1 - $this->additionalInformation);
+ }
+
+ $result = Utils::binToBigInteger($this->data);
+ $minusOne = BigInteger::of(-1);
+
+ return $minusOne->minus($result)
+ ->toBase(10)
+ ;
+ }
+
+ public function normalize(): string
+ {
+ return $this->getValue();
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ return $this->getValue();
+ }
+
+ private static function createBigInteger(BigInteger $integer): self
+ {
+ if ($integer->isGreaterThanOrEqualTo(BigInteger::zero())) {
+ throw new InvalidArgumentException('The value must be a negative integer.');
+ }
+
+ $minusOne = BigInteger::of(-1);
+ $computed_value = $minusOne->minus($integer);
+
+ switch (true) {
+ case $computed_value->isLessThan(BigInteger::of(24)):
+ $ai = $computed_value->toInt();
+ $data = null;
+ break;
+ case $computed_value->isLessThan(BigInteger::fromBase('FF', 16)):
+ $ai = 24;
+ $data = self::hex2bin(str_pad($computed_value->toBase(16), 2, '0', STR_PAD_LEFT));
+ break;
+ case $computed_value->isLessThan(BigInteger::fromBase('FFFF', 16)):
+ $ai = 25;
+ $data = self::hex2bin(str_pad($computed_value->toBase(16), 4, '0', STR_PAD_LEFT));
+ break;
+ case $computed_value->isLessThan(BigInteger::fromBase('FFFFFFFF', 16)):
+ $ai = 26;
+ $data = self::hex2bin(str_pad($computed_value->toBase(16), 8, '0', STR_PAD_LEFT));
+ break;
+ default:
+ throw new InvalidArgumentException(
+ 'Out of range. Please use NegativeBigIntegerTag tag with ByteStringObject object instead.'
+ );
+ }
+
+ return new self($ai, $data);
+ }
+
+ private static function hex2bin(string $data): string
+ {
+ $result = hex2bin($data);
+ if ($result === false) {
+ throw new InvalidArgumentException('Unable to convert the data');
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Normalizable.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Normalizable.php
new file mode 100644
index 00000000..3b776621
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Normalizable.php
@@ -0,0 +1,22 @@
+data = $data;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->data !== null) {
+ $result .= $this->data;
+ }
+
+ return $result;
+ }
+
+ public function getContent(): ?string
+ {
+ return $this->data;
+ }
+
+ /**
+ * @return int[]
+ */
+ abstract public static function supportedAdditionalInformation(): array;
+
+ abstract public static function createFromLoadedData(int $additionalInformation, ?string $data): self;
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/BreakObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/BreakObject.php
new file mode 100644
index 00000000..339f11b3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/BreakObject.php
@@ -0,0 +1,47 @@
+normalize();
+ }
+
+ /**
+ * @return float|int
+ */
+ public function normalize()
+ {
+ $exponent = $this->getExponent();
+ $mantissa = $this->getMantissa();
+ $sign = $this->getSign();
+
+ if ($exponent === 0) {
+ $val = $mantissa * 2 ** (-(1022 + 52));
+ } elseif ($exponent !== 0b11111111111) {
+ $val = ($mantissa + (1 << 52)) * 2 ** ($exponent - (1023 + 52));
+ } else {
+ $val = $mantissa === 0 ? INF : NAN;
+ }
+
+ return $sign * $val;
+ }
+
+ public function getExponent(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->shiftedRight(52)->and(Utils::hexToBigInteger('7ff'))->toInt();
+ }
+
+ public function getMantissa(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('fffffffffffff'))->toInt();
+ }
+
+ public function getSign(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+ $sign = Utils::binToBigInteger($data)->shiftedRight(63);
+
+ return $sign->isEqualTo(BigInteger::one()) ? -1 : 1;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/FalseObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/FalseObject.php
new file mode 100644
index 00000000..c3ce42ab
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/FalseObject.php
@@ -0,0 +1,53 @@
+normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/GenericObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/GenericObject.php
new file mode 100644
index 00000000..fb9fccc4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/GenericObject.php
@@ -0,0 +1,43 @@
+data;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php
new file mode 100644
index 00000000..1f05c5bb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php
@@ -0,0 +1,97 @@
+normalize();
+ }
+
+ /**
+ * @return float|int
+ */
+ public function normalize()
+ {
+ $exponent = $this->getExponent();
+ $mantissa = $this->getMantissa();
+ $sign = $this->getSign();
+
+ if ($exponent === 0) {
+ $val = $mantissa * 2 ** (-24);
+ } elseif ($exponent !== 0b11111) {
+ $val = ($mantissa + (1 << 10)) * 2 ** ($exponent - 25);
+ } else {
+ $val = $mantissa === 0 ? INF : NAN;
+ }
+
+ return $sign * $val;
+ }
+
+ public function getExponent(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->shiftedRight(10)->and(Utils::hexToBigInteger('1f'))->toInt();
+ }
+
+ public function getMantissa(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('3ff'))->toInt();
+ }
+
+ public function getSign(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+ $sign = Utils::binToBigInteger($data)->shiftedRight(15);
+
+ return $sign->isEqualTo(BigInteger::one()) ? -1 : 1;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/NullObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/NullObject.php
new file mode 100644
index 00000000..a960acf4
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/NullObject.php
@@ -0,0 +1,53 @@
+normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php
new file mode 100644
index 00000000..88edcd19
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php
@@ -0,0 +1,59 @@
+classes[$ai] = $class;
+ }
+
+ return $this;
+ }
+
+ public function getClassForValue(int $value): string
+ {
+ return array_key_exists($value, $this->classes) ? $this->classes[$value] : GenericObject::class;
+ }
+
+ public function createObjectForValue(int $value, ?string $data): OtherObject
+ {
+ /** @var OtherObject $class */
+ $class = $this->getClassForValue($value);
+
+ return $class::createFromLoadedData($value, $data);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php
new file mode 100644
index 00000000..6c0336de
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php
@@ -0,0 +1,21 @@
+data === null) {
+ return $this->getAdditionalInformation();
+ }
+
+ return Utils::binToInt($this->data);
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): int
+ {
+ return $this->normalize();
+ }
+
+ public static function create(int $value): self
+ {
+ switch (true) {
+ case $value < 32:
+ return new self($value, null);
+ case $value < 256:
+ return new self(24, chr($value));
+ default:
+ throw new InvalidArgumentException('The value is not a valid simple value.');
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php
new file mode 100644
index 00000000..3c3af613
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php
@@ -0,0 +1,96 @@
+normalize();
+ }
+
+ /**
+ * @return float|int
+ */
+ public function normalize()
+ {
+ $exponent = $this->getExponent();
+ $mantissa = $this->getMantissa();
+ $sign = $this->getSign();
+
+ if ($exponent === 0) {
+ $val = $mantissa * 2 ** (-(126 + 23));
+ } elseif ($exponent !== 0b11111111) {
+ $val = ($mantissa + (1 << 23)) * 2 ** ($exponent - (127 + 23));
+ } else {
+ $val = $mantissa === 0 ? INF : NAN;
+ }
+
+ return $sign * $val;
+ }
+
+ public function getExponent(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->shiftedRight(23)->and(Utils::hexToBigInteger('ff'))->toInt();
+ }
+
+ public function getMantissa(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+
+ return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('7fffff'))->toInt();
+ }
+
+ public function getSign(): int
+ {
+ $data = $this->data;
+ Utils::assertString($data, 'Invalid data');
+ $sign = Utils::binToBigInteger($data)->shiftedRight(31);
+
+ return $sign->isEqualTo(BigInteger::one()) ? -1 : 1;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/TrueObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/TrueObject.php
new file mode 100644
index 00000000..d348a1ba
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/TrueObject.php
@@ -0,0 +1,53 @@
+normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php
new file mode 100644
index 00000000..0b4bf899
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php
@@ -0,0 +1,49 @@
+resource = $resource;
+ }
+
+ public static function create(string $data): self
+ {
+ return new self($data);
+ }
+
+ public function read(int $length): string
+ {
+ if ($length === 0) {
+ return '';
+ }
+
+ $alreadyRead = 0;
+ $data = '';
+ while ($alreadyRead < $length) {
+ $left = $length - $alreadyRead;
+ $sizeToRead = $left < 1024 && $left > 0 ? $left : 1024;
+ $newData = fread($this->resource, $sizeToRead);
+ $alreadyRead += $sizeToRead;
+
+ if ($newData === false) {
+ throw new RuntimeException('Unable to read the memory');
+ }
+ if (mb_strlen($newData, '8bit') < $sizeToRead) {
+ throw new InvalidArgumentException(sprintf(
+ 'Out of range. Expected: %d, read: %d.',
+ $length,
+ mb_strlen($data, '8bit')
+ ));
+ }
+ $data .= $newData;
+ }
+
+ if (mb_strlen($data, '8bit') !== $length) {
+ throw new InvalidArgumentException(sprintf(
+ 'Out of range. Expected: %d, read: %d.',
+ $length,
+ mb_strlen($data, '8bit')
+ ));
+ }
+
+ return $data;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag.php
new file mode 100644
index 00000000..9d7171a9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag.php
@@ -0,0 +1,99 @@
+data = $data;
+ $this->object = $object;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->data !== null) {
+ $result .= $this->data;
+ }
+
+ return $result . $this->object;
+ }
+
+ public function getData(): ?string
+ {
+ return $this->data;
+ }
+
+ abstract public static function getTagId(): int;
+
+ abstract public static function createFromLoadedData(
+ int $additionalInformation,
+ ?string $data,
+ CBORObject $object
+ ): self;
+
+ public function getValue(): CBORObject
+ {
+ return $this->object;
+ }
+
+ /**
+ * @return array{int, null|string}
+ */
+ protected static function determineComponents(int $tag): array
+ {
+ switch (true) {
+ case $tag < 0:
+ throw new InvalidArgumentException('The value must be a positive integer.');
+ case $tag < 24:
+ return [$tag, null];
+ case $tag < 0xFF:
+ return [24, self::hex2bin(dechex($tag))];
+ case $tag < 0xFFFF:
+ return [25, self::hex2bin(dechex($tag))];
+ case $tag < 0xFFFFFFFF:
+ return [26, self::hex2bin(dechex($tag))];
+ default:
+ throw new InvalidArgumentException(
+ 'Out of range. Please use PositiveBigIntegerTag tag with ByteStringObject object instead.'
+ );
+ }
+ }
+
+ private static function hex2bin(string $data): string
+ {
+ $result = hex2bin($data);
+ if ($result === false) {
+ throw new InvalidArgumentException('Unable to convert the data');
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php
new file mode 100644
index 00000000..1130358d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php
@@ -0,0 +1,57 @@
+object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ByteStringObject && ! $this->object instanceof IndefiniteLengthByteStringObject && ! $this->object instanceof TextStringObject && ! $this->object instanceof IndefiniteLengthTextStringObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return bin2hex($this->object->getNormalizedData($ignoreTags));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php
new file mode 100644
index 00000000..6f8bb60e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php
@@ -0,0 +1,63 @@
+object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ByteStringObject && ! $this->object instanceof IndefiniteLengthByteStringObject && ! $this->object instanceof TextStringObject && ! $this->object instanceof IndefiniteLengthTextStringObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ $result = base64_decode($this->object->getNormalizedData($ignoreTags), true);
+ if ($result === false) {
+ throw new InvalidArgumentException('Unable to decode the data');
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64Tag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64Tag.php
new file mode 100644
index 00000000..b6693270
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64Tag.php
@@ -0,0 +1,57 @@
+object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php
new file mode 100644
index 00000000..4dbaaf82
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php
@@ -0,0 +1,58 @@
+object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ByteStringObject && ! $this->object instanceof IndefiniteLengthByteStringObject && ! $this->object instanceof TextStringObject && ! $this->object instanceof IndefiniteLengthTextStringObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return Utils::decode($this->object->getNormalizedData($ignoreTags));
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php
new file mode 100644
index 00000000..1d7d27f6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php
@@ -0,0 +1,57 @@
+object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/BigFloatTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/BigFloatTag.php
new file mode 100644
index 00000000..c6a33b24
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/BigFloatTag.php
@@ -0,0 +1,108 @@
+get(0);
+ if (! $e instanceof UnsignedIntegerObject && ! $e instanceof NegativeIntegerObject) {
+ throw new InvalidArgumentException('The exponent must be a Signed Integer or an Unsigned Integer object.');
+ }
+ $m = $object->get(1);
+ if (! $m instanceof UnsignedIntegerObject && ! $m instanceof NegativeIntegerObject && ! $m instanceof NegativeBigIntegerTag && ! $m instanceof UnsignedBigIntegerTag) {
+ throw new InvalidArgumentException(
+ 'The mantissa must be a Positive or Negative Signed Integer or an Unsigned Integer object.'
+ );
+ }
+
+ parent::__construct($additionalInformation, $data, $object);
+ }
+
+ public static function getTagId(): int
+ {
+ return self::TAG_BIG_FLOAT;
+ }
+
+ public static function createFromLoadedData(int $additionalInformation, ?string $data, CBORObject $object): Tag
+ {
+ return new self($additionalInformation, $data, $object);
+ }
+
+ public static function create(CBORObject $object): Tag
+ {
+ [$ai, $data] = self::determineComponents(self::TAG_BIG_FLOAT);
+
+ return new self($ai, $data, $object);
+ }
+
+ public static function createFromExponentAndMantissa(CBORObject $e, CBORObject $m): Tag
+ {
+ $object = ListObject::create()
+ ->add($e)
+ ->add($m)
+ ;
+
+ return self::create($object);
+ }
+
+ public function normalize()
+ {
+ /** @var ListObject $object */
+ $object = $this->object;
+ /** @var UnsignedIntegerObject|NegativeIntegerObject $e */
+ $e = $object->get(0);
+ /** @var UnsignedIntegerObject|NegativeIntegerObject|NegativeBigIntegerTag|UnsignedBigIntegerTag $m */
+ $m = $object->get(1);
+
+ return rtrim(bcmul($m->normalize(), bcpow('2', $e->normalize(), 100), 100), '0');
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ListObject || count($this->object) !== 2) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return $this->normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php
new file mode 100644
index 00000000..612a6d31
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php
@@ -0,0 +1,57 @@
+object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBORTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBORTag.php
new file mode 100644
index 00000000..fbb8581f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/CBORTag.php
@@ -0,0 +1,54 @@
+object instanceof Normalizable ? $this->object->normalize() : $this->object;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DatetimeTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DatetimeTag.php
new file mode 100644
index 00000000..ac078374
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DatetimeTag.php
@@ -0,0 +1,84 @@
+object;
+ $result = DateTimeImmutable::createFromFormat(DATE_RFC3339, $object->normalize());
+ if ($result !== false) {
+ return $result;
+ }
+
+ $formatted = DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s.uP', $object->normalize());
+ if ($formatted === false) {
+ throw new InvalidArgumentException('Invalid data. Cannot be converted into a datetime object');
+ }
+
+ return $formatted;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return $this->normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php
new file mode 100644
index 00000000..76b5c6a7
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php
@@ -0,0 +1,114 @@
+get(0);
+ if (! $e instanceof UnsignedIntegerObject && ! $e instanceof NegativeIntegerObject) {
+ throw new InvalidArgumentException('The exponent must be a Signed Integer or an Unsigned Integer object.');
+ }
+ $m = $object->get(1);
+ if (! $m instanceof UnsignedIntegerObject && ! $m instanceof NegativeIntegerObject && ! $m instanceof NegativeBigIntegerTag && ! $m instanceof UnsignedBigIntegerTag) {
+ throw new InvalidArgumentException(
+ 'The mantissa must be a Positive or Negative Signed Integer or an Unsigned Integer object.'
+ );
+ }
+
+ parent::__construct(self::TAG_DECIMAL_FRACTION, null, $object);
+ }
+
+ public static function create(CBORObject $object): self
+ {
+ return new self($object);
+ }
+
+ public static function getTagId(): int
+ {
+ return self::TAG_DECIMAL_FRACTION;
+ }
+
+ public static function createFromLoadedData(int $additionalInformation, ?string $data, CBORObject $object): Tag
+ {
+ return new self($object);
+ }
+
+ public static function createFromExponentAndMantissa(CBORObject $e, CBORObject $m): Tag
+ {
+ $object = ListObject::create()
+ ->add($e)
+ ->add($m)
+ ;
+
+ return self::create($object);
+ }
+
+ public function normalize()
+ {
+ /** @var ListObject $object */
+ $object = $this->object;
+ /** @var UnsignedIntegerObject|NegativeIntegerObject $e */
+ $e = $object->get(0);
+ /** @var UnsignedIntegerObject|NegativeIntegerObject|NegativeBigIntegerTag|UnsignedBigIntegerTag $m */
+ $m = $object->get(1);
+
+ return rtrim(bcmul($m->normalize(), bcpow('10', $e->normalize(), 100), 100), '0');
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ListObject || count($this->object) !== 2) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+ $e = $this->object->get(0);
+ $m = $this->object->get(1);
+
+ if (! $e instanceof UnsignedIntegerObject && ! $e instanceof NegativeIntegerObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+ if (! $m instanceof UnsignedIntegerObject && ! $m instanceof NegativeIntegerObject && ! $m instanceof NegativeBigIntegerTag && ! $m instanceof UnsignedBigIntegerTag) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return $this->normalize();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/EpochTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/EpochTag.php
new file mode 100644
index 00000000..aa00c73f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/EpochTag.php
@@ -0,0 +1,21 @@
+object;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/MimeTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/MimeTag.php
new file mode 100644
index 00000000..bf5d2bb1
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/MimeTag.php
@@ -0,0 +1,66 @@
+object;
+
+ return $object->normalize();
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php
new file mode 100644
index 00000000..15726366
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php
@@ -0,0 +1,83 @@
+object;
+ $integer = BigInteger::fromBase(bin2hex($object->getValue()), 16);
+ $minusOne = BigInteger::of(-1);
+
+ return $minusOne->minus($integer)
+ ->toBase(10)
+ ;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ByteStringObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+ $integer = BigInteger::fromBase(bin2hex($this->object->getValue()), 16);
+ $minusOne = BigInteger::of(-1);
+
+ return $minusOne->minus($integer)
+ ->toBase(10)
+ ;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/PositiveBigIntegerTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/PositiveBigIntegerTag.php
new file mode 100644
index 00000000..0a35896c
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/PositiveBigIntegerTag.php
@@ -0,0 +1,21 @@
+classes[$class::getTagId()] = $class;
+
+ return $this;
+ }
+
+ public function getClassForValue(int $value): string
+ {
+ return array_key_exists($value, $this->classes) ? $this->classes[$value] : GenericTag::class;
+ }
+
+ public function createObjectForValue(int $additionalInformation, ?string $data, CBORObject $object): Tag
+ {
+ $value = $additionalInformation;
+ if ($additionalInformation >= 24) {
+ Utils::assertString($data, 'Invalid data');
+ $value = Utils::binToInt($data);
+ }
+ /** @var Tag $class */
+ $class = $this->getClassForValue($value);
+
+ return $class::createFromLoadedData($additionalInformation, $data, $object);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php
new file mode 100644
index 00000000..37e38620
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php
@@ -0,0 +1,22 @@
+object;
+
+ switch (true) {
+ case $object instanceof UnsignedIntegerObject:
+ case $object instanceof NegativeIntegerObject:
+ $formatted = DateTimeImmutable::createFromFormat('U', $object->normalize());
+
+ break;
+ case $object instanceof HalfPrecisionFloatObject:
+ case $object instanceof SinglePrecisionFloatObject:
+ case $object instanceof DoublePrecisionFloatObject:
+ $value = (string) $object->normalize();
+ $parts = explode('.', $value);
+ if (isset($parts[1])) {
+ if (mb_strlen($parts[1], '8bit') > 6) {
+ $parts[1] = mb_substr($parts[1], 0, 6, '8bit');
+ } else {
+ $parts[1] = str_pad($parts[1], 6, '0', STR_PAD_RIGHT);
+ }
+ }
+ $formatted = DateTimeImmutable::createFromFormat('U.u', implode('.', $parts));
+
+ break;
+ default:
+ throw new InvalidArgumentException('Unable to normalize the object');
+ }
+
+ if ($formatted === false) {
+ throw new InvalidArgumentException('Invalid data. Cannot be converted into a datetime object');
+ }
+
+ return $formatted;
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+ switch (true) {
+ case $this->object instanceof UnsignedIntegerObject:
+ case $this->object instanceof NegativeIntegerObject:
+ case $this->object instanceof HalfPrecisionFloatObject:
+ case $this->object instanceof SinglePrecisionFloatObject:
+ case $this->object instanceof DoublePrecisionFloatObject:
+ return $this->normalize();
+ default:
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php
new file mode 100644
index 00000000..37e5bd7b
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php
@@ -0,0 +1,78 @@
+object;
+
+ return Utils::hexToString($object->normalize());
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ if ($ignoreTags) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ if (! $this->object instanceof ByteStringObject) {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+
+ return Utils::hexToString($this->object->getValue());
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UriTag.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UriTag.php
new file mode 100644
index 00000000..c14f1732
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Tag/UriTag.php
@@ -0,0 +1,66 @@
+object;
+
+ return $object->normalize();
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false)
+ {
+ return $this->object->getNormalizedData($ignoreTags);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TagObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TagObject.php
new file mode 100644
index 00000000..0ccb5c80
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TagObject.php
@@ -0,0 +1,21 @@
+data = $data;
+ $this->length = $length;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->length !== null) {
+ $result .= $this->length;
+ }
+
+ return $result . $this->data;
+ }
+
+ public static function create(string $data): self
+ {
+ return new self($data);
+ }
+
+ public function getValue(): string
+ {
+ return $this->data;
+ }
+
+ public function getLength(): int
+ {
+ return mb_strlen($this->data, 'utf8');
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ return $this->data;
+ }
+
+ public function normalize()
+ {
+ return $this->data;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TextStringWithChunkObject.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TextStringWithChunkObject.php
new file mode 100644
index 00000000..0cb6b960
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/TextStringWithChunkObject.php
@@ -0,0 +1,21 @@
+data = $data;
+ }
+
+ public function __toString(): string
+ {
+ $result = parent::__toString();
+ if ($this->data !== null) {
+ $result .= $this->data;
+ }
+
+ return $result;
+ }
+
+ public static function createObjectForValue(int $additionalInformation, ?string $data): self
+ {
+ return new self($additionalInformation, $data);
+ }
+
+ public static function create(int $value): self
+ {
+ return self::createFromString((string) $value);
+ }
+
+ public static function createFromHex(string $value): self
+ {
+ $integer = BigInteger::fromBase($value, 16);
+
+ return self::createBigInteger($integer);
+ }
+
+ public static function createFromString(string $value): self
+ {
+ $integer = BigInteger::of($value);
+
+ return self::createBigInteger($integer);
+ }
+
+ public function getMajorType(): int
+ {
+ return self::MAJOR_TYPE;
+ }
+
+ public function getValue(): string
+ {
+ if ($this->data === null) {
+ return (string) $this->additionalInformation;
+ }
+
+ $integer = BigInteger::fromBase(bin2hex($this->data), 16);
+
+ return $integer->toBase(10);
+ }
+
+ public function normalize(): string
+ {
+ return $this->getValue();
+ }
+
+ /**
+ * @deprecated The method will be removed on v3.0. Please rely on the CBOR\Normalizable interface
+ */
+ public function getNormalizedData(bool $ignoreTags = false): string
+ {
+ return $this->getValue();
+ }
+
+ private static function createBigInteger(BigInteger $integer): self
+ {
+ if ($integer->isLessThan(BigInteger::zero())) {
+ throw new InvalidArgumentException('The value must be a positive integer.');
+ }
+
+ switch (true) {
+ case $integer->isLessThan(BigInteger::of(24)):
+ $ai = $integer->toInt();
+ $data = null;
+ break;
+ case $integer->isLessThan(BigInteger::fromBase('FF', 16)):
+ $ai = 24;
+ $data = self::hex2bin(str_pad($integer->toBase(16), 2, '0', STR_PAD_LEFT));
+ break;
+ case $integer->isLessThan(BigInteger::fromBase('FFFF', 16)):
+ $ai = 25;
+ $data = self::hex2bin(str_pad($integer->toBase(16), 4, '0', STR_PAD_LEFT));
+ break;
+ case $integer->isLessThan(BigInteger::fromBase('FFFFFFFF', 16)):
+ $ai = 26;
+ $data = self::hex2bin(str_pad($integer->toBase(16), 8, '0', STR_PAD_LEFT));
+ break;
+ default:
+ throw new InvalidArgumentException(
+ 'Out of range. Please use PositiveBigIntegerTag tag with ByteStringObject object instead.'
+ );
+ }
+
+ return new self($ai, $data);
+ }
+
+ private static function hex2bin(string $data): string
+ {
+ $result = hex2bin($data);
+ if ($result === false) {
+ throw new InvalidArgumentException('Unable to convert the data');
+ }
+
+ return $result;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Utils.php b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Utils.php
new file mode 100644
index 00000000..b671ed6e
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/spomky-labs/cbor-php/src/Utils.php
@@ -0,0 +1,69 @@
+toInt();
+ }
+
+ public static function binToBigInteger(string $value): BigInteger
+ {
+ return self::hexToBigInteger(bin2hex($value));
+ }
+
+ public static function hexToInt(string $value): int
+ {
+ return self::hexToBigInteger($value)->toInt();
+ }
+
+ public static function hexToBigInteger(string $value): BigInteger
+ {
+ return BigInteger::fromBase($value, 16);
+ }
+
+ public static function hexToString(string $value): string
+ {
+ return BigInteger::fromBase(bin2hex($value), 16)->toBase(10);
+ }
+
+ public static function decode(string $data): string
+ {
+ $decoded = base64_decode(strtr($data, '-_', '+/'), true);
+ if ($decoded === false) {
+ throw new InvalidArgumentException('Invalid data provided');
+ }
+
+ return $decoded;
+ }
+
+ /**
+ * @param mixed|null $data
+ */
+ public static function assertString($data, ?string $message = null): void
+ {
+ if (! is_string($data)) {
+ throw new InvalidArgumentException($message ?? '');
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/Ctype.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/Ctype.php
new file mode 100644
index 00000000..ba75a2c9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/Ctype.php
@@ -0,0 +1,232 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Ctype;
+
+/**
+ * Ctype implementation through regex.
+ *
+ * @internal
+ *
+ * @author Gert de Pagter
+ */
+final class Ctype
+{
+ /**
+ * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
+ *
+ * @see https://php.net/ctype-alnum
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_alnum($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is a letter, FALSE otherwise.
+ *
+ * @see https://php.net/ctype-alpha
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_alpha($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
+ *
+ * @see https://php.net/ctype-cntrl
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_cntrl($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
+ *
+ * @see https://php.net/ctype-digit
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_digit($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
+ *
+ * @see https://php.net/ctype-graph
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_graph($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is a lowercase letter.
+ *
+ * @see https://php.net/ctype-lower
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_lower($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
+ *
+ * @see https://php.net/ctype-print
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_print($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
+ *
+ * @see https://php.net/ctype-punct
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_punct($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
+ *
+ * @see https://php.net/ctype-space
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_space($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is an uppercase letter.
+ *
+ * @see https://php.net/ctype-upper
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_upper($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
+ }
+
+ /**
+ * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
+ *
+ * @see https://php.net/ctype-xdigit
+ *
+ * @param mixed $text
+ *
+ * @return bool
+ */
+ public static function ctype_xdigit($text)
+ {
+ $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
+
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
+ }
+
+ /**
+ * Converts integers to their char versions according to normal ctype behaviour, if needed.
+ *
+ * If an integer between -128 and 255 inclusive is provided,
+ * it is interpreted as the ASCII value of a single character
+ * (negative values have 256 added in order to allow characters in the Extended ASCII range).
+ * Any other integer is interpreted as a string containing the decimal digits of the integer.
+ *
+ * @param mixed $int
+ * @param string $function
+ *
+ * @return mixed
+ */
+ private static function convert_int_to_char_for_ctype($int, $function)
+ {
+ if (!\is_int($int)) {
+ return $int;
+ }
+
+ if ($int < -128 || $int > 255) {
+ return (string) $int;
+ }
+
+ if (\PHP_VERSION_ID >= 80100) {
+ @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED);
+ }
+
+ if ($int < 0) {
+ $int += 256;
+ }
+
+ return \chr($int);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/LICENSE b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/LICENSE
new file mode 100644
index 00000000..3f853aaf
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018-2019 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/README.md b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/README.md
new file mode 100644
index 00000000..8add1ab0
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/README.md
@@ -0,0 +1,12 @@
+Symfony Polyfill / Ctype
+========================
+
+This component provides `ctype_*` functions to users who run php versions without the ctype extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap.php
new file mode 100644
index 00000000..d54524b3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap.php
@@ -0,0 +1,50 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Ctype as p;
+
+if (\PHP_VERSION_ID >= 80000) {
+ return require __DIR__.'/bootstrap80.php';
+}
+
+if (!function_exists('ctype_alnum')) {
+ function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
+}
+if (!function_exists('ctype_alpha')) {
+ function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
+}
+if (!function_exists('ctype_cntrl')) {
+ function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
+}
+if (!function_exists('ctype_digit')) {
+ function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
+}
+if (!function_exists('ctype_graph')) {
+ function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
+}
+if (!function_exists('ctype_lower')) {
+ function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
+}
+if (!function_exists('ctype_print')) {
+ function ctype_print($text) { return p\Ctype::ctype_print($text); }
+}
+if (!function_exists('ctype_punct')) {
+ function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
+}
+if (!function_exists('ctype_space')) {
+ function ctype_space($text) { return p\Ctype::ctype_space($text); }
+}
+if (!function_exists('ctype_upper')) {
+ function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
+}
+if (!function_exists('ctype_xdigit')) {
+ function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap80.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap80.php
new file mode 100644
index 00000000..ab2f8611
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/bootstrap80.php
@@ -0,0 +1,46 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Ctype as p;
+
+if (!function_exists('ctype_alnum')) {
+ function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); }
+}
+if (!function_exists('ctype_alpha')) {
+ function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); }
+}
+if (!function_exists('ctype_cntrl')) {
+ function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); }
+}
+if (!function_exists('ctype_digit')) {
+ function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); }
+}
+if (!function_exists('ctype_graph')) {
+ function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); }
+}
+if (!function_exists('ctype_lower')) {
+ function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); }
+}
+if (!function_exists('ctype_print')) {
+ function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); }
+}
+if (!function_exists('ctype_punct')) {
+ function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); }
+}
+if (!function_exists('ctype_space')) {
+ function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); }
+}
+if (!function_exists('ctype_upper')) {
+ function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); }
+}
+if (!function_exists('ctype_xdigit')) {
+ function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/composer.json b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/composer.json
new file mode 100644
index 00000000..ccb8e570
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-ctype/composer.json
@@ -0,0 +1,41 @@
+{
+ "name": "symfony/polyfill-ctype",
+ "type": "library",
+ "description": "Symfony polyfill for ctype functions",
+ "keywords": ["polyfill", "compatibility", "portable", "ctype"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
+ "files": [ "bootstrap.php" ]
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/LICENSE b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/LICENSE
new file mode 100644
index 00000000..5593b1d8
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2020 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Php80.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Php80.php
new file mode 100644
index 00000000..362dd1a9
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Php80.php
@@ -0,0 +1,115 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php80;
+
+/**
+ * @author Ion Bazan
+ * @author Nico Oelgart
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+final class Php80
+{
+ public static function fdiv(float $dividend, float $divisor): float
+ {
+ return @($dividend / $divisor);
+ }
+
+ public static function get_debug_type($value): string
+ {
+ switch (true) {
+ case null === $value: return 'null';
+ case \is_bool($value): return 'bool';
+ case \is_string($value): return 'string';
+ case \is_array($value): return 'array';
+ case \is_int($value): return 'int';
+ case \is_float($value): return 'float';
+ case \is_object($value): break;
+ case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class';
+ default:
+ if (null === $type = @get_resource_type($value)) {
+ return 'unknown';
+ }
+
+ if ('Unknown' === $type) {
+ $type = 'closed';
+ }
+
+ return "resource ($type)";
+ }
+
+ $class = \get_class($value);
+
+ if (false === strpos($class, '@')) {
+ return $class;
+ }
+
+ return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous';
+ }
+
+ public static function get_resource_id($res): int
+ {
+ if (!\is_resource($res) && null === @get_resource_type($res)) {
+ throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res)));
+ }
+
+ return (int) $res;
+ }
+
+ public static function preg_last_error_msg(): string
+ {
+ switch (preg_last_error()) {
+ case \PREG_INTERNAL_ERROR:
+ return 'Internal error';
+ case \PREG_BAD_UTF8_ERROR:
+ return 'Malformed UTF-8 characters, possibly incorrectly encoded';
+ case \PREG_BAD_UTF8_OFFSET_ERROR:
+ return 'The offset did not correspond to the beginning of a valid UTF-8 code point';
+ case \PREG_BACKTRACK_LIMIT_ERROR:
+ return 'Backtrack limit exhausted';
+ case \PREG_RECURSION_LIMIT_ERROR:
+ return 'Recursion limit exhausted';
+ case \PREG_JIT_STACKLIMIT_ERROR:
+ return 'JIT stack limit exhausted';
+ case \PREG_NO_ERROR:
+ return 'No error';
+ default:
+ return 'Unknown error';
+ }
+ }
+
+ public static function str_contains(string $haystack, string $needle): bool
+ {
+ return '' === $needle || false !== strpos($haystack, $needle);
+ }
+
+ public static function str_starts_with(string $haystack, string $needle): bool
+ {
+ return 0 === strncmp($haystack, $needle, \strlen($needle));
+ }
+
+ public static function str_ends_with(string $haystack, string $needle): bool
+ {
+ if ('' === $needle || $needle === $haystack) {
+ return true;
+ }
+
+ if ('' === $haystack) {
+ return false;
+ }
+
+ $needleLength = \strlen($needle);
+
+ return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/PhpToken.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/PhpToken.php
new file mode 100644
index 00000000..fe6e6910
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/PhpToken.php
@@ -0,0 +1,103 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php80;
+
+/**
+ * @author Fedonyuk Anton
+ *
+ * @internal
+ */
+class PhpToken implements \Stringable
+{
+ /**
+ * @var int
+ */
+ public $id;
+
+ /**
+ * @var string
+ */
+ public $text;
+
+ /**
+ * @var int
+ */
+ public $line;
+
+ /**
+ * @var int
+ */
+ public $pos;
+
+ public function __construct(int $id, string $text, int $line = -1, int $position = -1)
+ {
+ $this->id = $id;
+ $this->text = $text;
+ $this->line = $line;
+ $this->pos = $position;
+ }
+
+ public function getTokenName(): ?string
+ {
+ if ('UNKNOWN' === $name = token_name($this->id)) {
+ $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text;
+ }
+
+ return $name;
+ }
+
+ /**
+ * @param int|string|array $kind
+ */
+ public function is($kind): bool
+ {
+ foreach ((array) $kind as $value) {
+ if (\in_array($value, [$this->id, $this->text], true)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function isIgnorable(): bool
+ {
+ return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true);
+ }
+
+ public function __toString(): string
+ {
+ return (string) $this->text;
+ }
+
+ /**
+ * @return static[]
+ */
+ public static function tokenize(string $code, int $flags = 0): array
+ {
+ $line = 1;
+ $position = 0;
+ $tokens = token_get_all($code, $flags);
+ foreach ($tokens as $index => $token) {
+ if (\is_string($token)) {
+ $id = \ord($token);
+ $text = $token;
+ } else {
+ [$id, $text, $line] = $token;
+ }
+ $tokens[$index] = new static($id, $text, $line, $position);
+ $position += \strlen($text);
+ }
+
+ return $tokens;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/README.md b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/README.md
new file mode 100644
index 00000000..10b8ee49
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/README.md
@@ -0,0 +1,24 @@
+Symfony Polyfill / Php80
+========================
+
+This component provides features added to PHP 8.0 core:
+
+- `Stringable` interface
+- [`fdiv`](https://php.net/fdiv)
+- `ValueError` class
+- `UnhandledMatchError` class
+- `FILTER_VALIDATE_BOOL` constant
+- [`get_debug_type`](https://php.net/get_debug_type)
+- [`preg_last_error_msg`](https://php.net/preg_last_error_msg)
+- [`str_contains`](https://php.net/str_contains)
+- [`str_starts_with`](https://php.net/str_starts_with)
+- [`str_ends_with`](https://php.net/str_ends_with)
+- [`get_resource_id`](https://php.net/get_resource_id)
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php
new file mode 100644
index 00000000..7ea6d277
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php
@@ -0,0 +1,22 @@
+flags = $flags;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php
new file mode 100644
index 00000000..72f10812
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php
@@ -0,0 +1,7 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php80 as p;
+
+if (\PHP_VERSION_ID >= 80000) {
+ return;
+}
+
+if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) {
+ define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN);
+}
+
+if (!function_exists('fdiv')) {
+ function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); }
+}
+if (!function_exists('preg_last_error_msg')) {
+ function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); }
+}
+if (!function_exists('str_contains')) {
+ function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); }
+}
+if (!function_exists('str_starts_with')) {
+ function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); }
+}
+if (!function_exists('str_ends_with')) {
+ function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); }
+}
+if (!function_exists('get_debug_type')) {
+ function get_debug_type($value): string { return p\Php80::get_debug_type($value); }
+}
+if (!function_exists('get_resource_id')) {
+ function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/composer.json b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/composer.json
new file mode 100644
index 00000000..5fe679db
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php80/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "symfony/polyfill-php80",
+ "type": "library",
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.1"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Php80\\": "" },
+ "files": [ "bootstrap.php" ],
+ "classmap": [ "Resources/stubs" ]
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/LICENSE b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/LICENSE
new file mode 100644
index 00000000..efb17f98
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2021 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Php81.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Php81.php
new file mode 100644
index 00000000..f0507b76
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Php81.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php81;
+
+/**
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+final class Php81
+{
+ public static function array_is_list(array $array): bool
+ {
+ if ([] === $array || $array === array_values($array)) {
+ return true;
+ }
+
+ $nextKey = -1;
+
+ foreach ($array as $k => $v) {
+ if ($k !== ++$nextKey) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/README.md b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/README.md
new file mode 100644
index 00000000..5ef61be6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/README.md
@@ -0,0 +1,16 @@
+Symfony Polyfill / Php81
+========================
+
+This component provides features added to PHP 8.1 core:
+
+- [`array_is_list`](https://php.net/array_is_list)
+- [`MYSQLI_REFRESH_REPLICA`](https://www.php.net/manual/en/mysqli.constants.php#constantmysqli-refresh-replica) constant
+- [`ReturnTypeWillChange`](https://wiki.php.net/rfc/internal_method_return_types)
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php
new file mode 100644
index 00000000..f4cad34f
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php
@@ -0,0 +1,11 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php81 as p;
+
+if (\PHP_VERSION_ID >= 80100) {
+ return;
+}
+
+if (defined('MYSQLI_REFRESH_SLAVE') && !defined('MYSQLI_REFRESH_REPLICA')) {
+ define('MYSQLI_REFRESH_REPLICA', 64);
+}
+
+if (!function_exists('array_is_list')) {
+ function array_is_list(array $array): bool { return p\Php81::array_is_list($array); }
+}
+
+if (!function_exists('enum_exists')) {
+ function enum_exists(string $enum, bool $autoload = true): bool { return $autoload && class_exists($enum) && false; }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/composer.json b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/composer.json
new file mode 100644
index 00000000..c39ccf47
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/polyfill-php81/composer.json
@@ -0,0 +1,36 @@
+{
+ "name": "symfony/polyfill-php81",
+ "type": "library",
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.1"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Php81\\": "" },
+ "files": [ "bootstrap.php" ],
+ "classmap": [ "Resources/stubs" ]
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/CHANGELOG.md b/wp-content/plugins/wp-webauthn/vendor/symfony/process/CHANGELOG.md
new file mode 100644
index 00000000..31b9ee6a
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/CHANGELOG.md
@@ -0,0 +1,116 @@
+CHANGELOG
+=========
+
+5.2.0
+-----
+
+ * added `Process::setOptions()` to set `Process` specific options
+ * added option `create_new_console` to allow a subprocess to continue
+ to run after the main script exited, both on Linux and on Windows
+
+5.1.0
+-----
+
+ * added `Process::getStartTime()` to retrieve the start time of the process as float
+
+5.0.0
+-----
+
+ * removed `Process::inheritEnvironmentVariables()`
+ * removed `PhpProcess::setPhpBinary()`
+ * `Process` must be instantiated with a command array, use `Process::fromShellCommandline()` when the command should be parsed by the shell
+ * removed `Process::setCommandLine()`
+
+4.4.0
+-----
+
+ * deprecated `Process::inheritEnvironmentVariables()`: env variables are always inherited.
+ * added `Process::getLastOutputTime()` method
+
+4.2.0
+-----
+
+ * added the `Process::fromShellCommandline()` to run commands in a shell wrapper
+ * deprecated passing a command as string when creating a `Process` instance
+ * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods
+ * added the `Process::waitUntil()` method to wait for the process only for a
+ specific output, then continue the normal execution of your application
+
+4.1.0
+-----
+
+ * added the `Process::isTtySupported()` method that allows to check for TTY support
+ * made `PhpExecutableFinder` look for the `PHP_BINARY` env var when searching the php binary
+ * added the `ProcessSignaledException` class to properly catch signaled process errors
+
+4.0.0
+-----
+
+ * environment variables will always be inherited
+ * added a second `array $env = []` argument to the `start()`, `run()`,
+ `mustRun()`, and `restart()` methods of the `Process` class
+ * added a second `array $env = []` argument to the `start()` method of the
+ `PhpProcess` class
+ * the `ProcessUtils::escapeArgument()` method has been removed
+ * the `areEnvironmentVariablesInherited()`, `getOptions()`, and `setOptions()`
+ methods of the `Process` class have been removed
+ * support for passing `proc_open()` options has been removed
+ * removed the `ProcessBuilder` class, use the `Process` class instead
+ * removed the `getEnhanceWindowsCompatibility()` and `setEnhanceWindowsCompatibility()` methods of the `Process` class
+ * passing a not existing working directory to the constructor of the `Symfony\Component\Process\Process` class is not
+ supported anymore
+
+3.4.0
+-----
+
+ * deprecated the ProcessBuilder class
+ * deprecated calling `Process::start()` without setting a valid working directory beforehand (via `setWorkingDirectory()` or constructor)
+
+3.3.0
+-----
+
+ * added command line arrays in the `Process` class
+ * added `$env` argument to `Process::start()`, `run()`, `mustRun()` and `restart()` methods
+ * deprecated the `ProcessUtils::escapeArgument()` method
+ * deprecated not inheriting environment variables
+ * deprecated configuring `proc_open()` options
+ * deprecated configuring enhanced Windows compatibility
+ * deprecated configuring enhanced sigchild compatibility
+
+2.5.0
+-----
+
+ * added support for PTY mode
+ * added the convenience method "mustRun"
+ * deprecation: Process::setStdin() is deprecated in favor of Process::setInput()
+ * deprecation: Process::getStdin() is deprecated in favor of Process::getInput()
+ * deprecation: Process::setInput() and ProcessBuilder::setInput() do not accept non-scalar types
+
+2.4.0
+-----
+
+ * added the ability to define an idle timeout
+
+2.3.0
+-----
+
+ * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows
+ * added Process::signal()
+ * added Process::getPid()
+ * added support for a TTY mode
+
+2.2.0
+-----
+
+ * added ProcessBuilder::setArguments() to reset the arguments on a builder
+ * added a way to retrieve the standard and error output incrementally
+ * added Process:restart()
+
+2.1.0
+-----
+
+ * added support for non-blocking processes (start(), wait(), isRunning(), stop())
+ * enhanced Windows compatibility
+ * added Process::getExitCodeText() that returns a string representation for
+ the exit code returned by the process
+ * added ProcessBuilder
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ExceptionInterface.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ExceptionInterface.php
new file mode 100644
index 00000000..bd4a6040
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+/**
+ * Marker Interface for the Process Component.
+ *
+ * @author Johannes M. Schmitt
+ */
+interface ExceptionInterface extends \Throwable
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/InvalidArgumentException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/InvalidArgumentException.php
new file mode 100644
index 00000000..926ee211
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/InvalidArgumentException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+/**
+ * InvalidArgumentException for the Process Component.
+ *
+ * @author Romain Neutron
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/LogicException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/LogicException.php
new file mode 100644
index 00000000..be3d490d
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/LogicException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+/**
+ * LogicException for the Process Component.
+ *
+ * @author Romain Neutron
+ */
+class LogicException extends \LogicException implements ExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessFailedException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessFailedException.php
new file mode 100644
index 00000000..328acfde
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessFailedException.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+use Symfony\Component\Process\Process;
+
+/**
+ * Exception for failed processes.
+ *
+ * @author Johannes M. Schmitt
+ */
+class ProcessFailedException extends RuntimeException
+{
+ private $process;
+
+ public function __construct(Process $process)
+ {
+ if ($process->isSuccessful()) {
+ throw new InvalidArgumentException('Expected a failed process, but the given process was successful.');
+ }
+
+ $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s",
+ $process->getCommandLine(),
+ $process->getExitCode(),
+ $process->getExitCodeText(),
+ $process->getWorkingDirectory()
+ );
+
+ if (!$process->isOutputDisabled()) {
+ $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s",
+ $process->getOutput(),
+ $process->getErrorOutput()
+ );
+ }
+
+ parent::__construct($error);
+
+ $this->process = $process;
+ }
+
+ public function getProcess()
+ {
+ return $this->process;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessSignaledException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessSignaledException.php
new file mode 100644
index 00000000..d4d32275
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessSignaledException.php
@@ -0,0 +1,41 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+use Symfony\Component\Process\Process;
+
+/**
+ * Exception that is thrown when a process has been signaled.
+ *
+ * @author Sullivan Senechal
+ */
+final class ProcessSignaledException extends RuntimeException
+{
+ private $process;
+
+ public function __construct(Process $process)
+ {
+ $this->process = $process;
+
+ parent::__construct(sprintf('The process has been signaled with signal "%s".', $process->getTermSignal()));
+ }
+
+ public function getProcess(): Process
+ {
+ return $this->process;
+ }
+
+ public function getSignal(): int
+ {
+ return $this->getProcess()->getTermSignal();
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessTimedOutException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessTimedOutException.php
new file mode 100644
index 00000000..94391a45
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/ProcessTimedOutException.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+use Symfony\Component\Process\Process;
+
+/**
+ * Exception that is thrown when a process times out.
+ *
+ * @author Johannes M. Schmitt
+ */
+class ProcessTimedOutException extends RuntimeException
+{
+ public const TYPE_GENERAL = 1;
+ public const TYPE_IDLE = 2;
+
+ private $process;
+ private $timeoutType;
+
+ public function __construct(Process $process, int $timeoutType)
+ {
+ $this->process = $process;
+ $this->timeoutType = $timeoutType;
+
+ parent::__construct(sprintf(
+ 'The process "%s" exceeded the timeout of %s seconds.',
+ $process->getCommandLine(),
+ $this->getExceededTimeout()
+ ));
+ }
+
+ public function getProcess()
+ {
+ return $this->process;
+ }
+
+ public function isGeneralTimeout()
+ {
+ return self::TYPE_GENERAL === $this->timeoutType;
+ }
+
+ public function isIdleTimeout()
+ {
+ return self::TYPE_IDLE === $this->timeoutType;
+ }
+
+ public function getExceededTimeout()
+ {
+ switch ($this->timeoutType) {
+ case self::TYPE_GENERAL:
+ return $this->process->getTimeout();
+
+ case self::TYPE_IDLE:
+ return $this->process->getIdleTimeout();
+
+ default:
+ throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType));
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/RuntimeException.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/RuntimeException.php
new file mode 100644
index 00000000..adead253
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Exception/RuntimeException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Exception;
+
+/**
+ * RuntimeException for the Process Component.
+ *
+ * @author Johannes M. Schmitt
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/ExecutableFinder.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/ExecutableFinder.php
new file mode 100644
index 00000000..5914b4cd
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/ExecutableFinder.php
@@ -0,0 +1,86 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+/**
+ * Generic executable finder.
+ *
+ * @author Fabien Potencier
+ * @author Johannes M. Schmitt
+ */
+class ExecutableFinder
+{
+ private $suffixes = ['.exe', '.bat', '.cmd', '.com'];
+
+ /**
+ * Replaces default suffixes of executable.
+ */
+ public function setSuffixes(array $suffixes)
+ {
+ $this->suffixes = $suffixes;
+ }
+
+ /**
+ * Adds new possible suffix to check for executable.
+ */
+ public function addSuffix(string $suffix)
+ {
+ $this->suffixes[] = $suffix;
+ }
+
+ /**
+ * Finds an executable by name.
+ *
+ * @param string $name The executable name (without the extension)
+ * @param string|null $default The default to return if no executable is found
+ * @param array $extraDirs Additional dirs to check into
+ *
+ * @return string|null
+ */
+ public function find(string $name, string $default = null, array $extraDirs = [])
+ {
+ if (ini_get('open_basedir')) {
+ $searchPath = array_merge(explode(\PATH_SEPARATOR, ini_get('open_basedir')), $extraDirs);
+ $dirs = [];
+ foreach ($searchPath as $path) {
+ // Silencing against https://bugs.php.net/69240
+ if (@is_dir($path)) {
+ $dirs[] = $path;
+ } else {
+ if (basename($path) == $name && @is_executable($path)) {
+ return $path;
+ }
+ }
+ }
+ } else {
+ $dirs = array_merge(
+ explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
+ $extraDirs
+ );
+ }
+
+ $suffixes = [''];
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $pathExt = getenv('PATHEXT');
+ $suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes);
+ }
+ foreach ($suffixes as $suffix) {
+ foreach ($dirs as $dir) {
+ if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) {
+ return $file;
+ }
+ }
+ }
+
+ return $default;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/InputStream.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/InputStream.php
new file mode 100644
index 00000000..240665f3
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/InputStream.php
@@ -0,0 +1,96 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+use Symfony\Component\Process\Exception\RuntimeException;
+
+/**
+ * Provides a way to continuously write to the input of a Process until the InputStream is closed.
+ *
+ * @author Nicolas Grekas
+ *
+ * @implements \IteratorAggregate
+ */
+class InputStream implements \IteratorAggregate
+{
+ /** @var callable|null */
+ private $onEmpty = null;
+ private $input = [];
+ private $open = true;
+
+ /**
+ * Sets a callback that is called when the write buffer becomes empty.
+ */
+ public function onEmpty(callable $onEmpty = null)
+ {
+ $this->onEmpty = $onEmpty;
+ }
+
+ /**
+ * Appends an input to the write buffer.
+ *
+ * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar,
+ * stream resource or \Traversable
+ */
+ public function write($input)
+ {
+ if (null === $input) {
+ return;
+ }
+ if ($this->isClosed()) {
+ throw new RuntimeException(sprintf('"%s" is closed.', static::class));
+ }
+ $this->input[] = ProcessUtils::validateInput(__METHOD__, $input);
+ }
+
+ /**
+ * Closes the write buffer.
+ */
+ public function close()
+ {
+ $this->open = false;
+ }
+
+ /**
+ * Tells whether the write buffer is closed or not.
+ */
+ public function isClosed()
+ {
+ return !$this->open;
+ }
+
+ /**
+ * @return \Traversable
+ */
+ #[\ReturnTypeWillChange]
+ public function getIterator()
+ {
+ $this->open = true;
+
+ while ($this->open || $this->input) {
+ if (!$this->input) {
+ yield '';
+ continue;
+ }
+ $current = array_shift($this->input);
+
+ if ($current instanceof \Iterator) {
+ yield from $current;
+ } else {
+ yield $current;
+ }
+ if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) {
+ $this->write($onEmpty($this));
+ }
+ }
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/LICENSE b/wp-content/plugins/wp-webauthn/vendor/symfony/process/LICENSE
new file mode 100644
index 00000000..88bf75bb
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2022 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpExecutableFinder.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpExecutableFinder.php
new file mode 100644
index 00000000..998808b6
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpExecutableFinder.php
@@ -0,0 +1,103 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+/**
+ * An executable finder specifically designed for the PHP executable.
+ *
+ * @author Fabien Potencier
+ * @author Johannes M. Schmitt
+ */
+class PhpExecutableFinder
+{
+ private $executableFinder;
+
+ public function __construct()
+ {
+ $this->executableFinder = new ExecutableFinder();
+ }
+
+ /**
+ * Finds The PHP executable.
+ *
+ * @return string|false
+ */
+ public function find(bool $includeArgs = true)
+ {
+ if ($php = getenv('PHP_BINARY')) {
+ if (!is_executable($php)) {
+ $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v';
+ if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) {
+ if (!is_executable($php)) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ if (@is_dir($php)) {
+ return false;
+ }
+
+ return $php;
+ }
+
+ $args = $this->findArguments();
+ $args = $includeArgs && $args ? ' '.implode(' ', $args) : '';
+
+ // PHP_BINARY return the current sapi executable
+ if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) {
+ return \PHP_BINARY.$args;
+ }
+
+ if ($php = getenv('PHP_PATH')) {
+ if (!@is_executable($php) || @is_dir($php)) {
+ return false;
+ }
+
+ return $php;
+ }
+
+ if ($php = getenv('PHP_PEAR_PHP_BIN')) {
+ if (@is_executable($php) && !@is_dir($php)) {
+ return $php;
+ }
+ }
+
+ if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) {
+ return $php;
+ }
+
+ $dirs = [\PHP_BINDIR];
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $dirs[] = 'C:\xampp\php\\';
+ }
+
+ return $this->executableFinder->find('php', false, $dirs);
+ }
+
+ /**
+ * Finds the PHP executable arguments.
+ *
+ * @return array
+ */
+ public function findArguments()
+ {
+ $arguments = [];
+ if ('phpdbg' === \PHP_SAPI) {
+ $arguments[] = '-qrr';
+ }
+
+ return $arguments;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpProcess.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpProcess.php
new file mode 100644
index 00000000..2bc338e5
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/PhpProcess.php
@@ -0,0 +1,72 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+use Symfony\Component\Process\Exception\LogicException;
+use Symfony\Component\Process\Exception\RuntimeException;
+
+/**
+ * PhpProcess runs a PHP script in an independent process.
+ *
+ * $p = new PhpProcess('');
+ * $p->run();
+ * print $p->getOutput()."\n";
+ *
+ * @author Fabien Potencier
+ */
+class PhpProcess extends Process
+{
+ /**
+ * @param string $script The PHP script to run (as a string)
+ * @param string|null $cwd The working directory or null to use the working dir of the current PHP process
+ * @param array|null $env The environment variables or null to use the same environment as the current PHP process
+ * @param int $timeout The timeout in seconds
+ * @param array|null $php Path to the PHP binary to use with any additional arguments
+ */
+ public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null)
+ {
+ if (null === $php) {
+ $executableFinder = new PhpExecutableFinder();
+ $php = $executableFinder->find(false);
+ $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments());
+ }
+ if ('phpdbg' === \PHP_SAPI) {
+ $file = tempnam(sys_get_temp_dir(), 'dbg');
+ file_put_contents($file, $script);
+ register_shutdown_function('unlink', $file);
+ $php[] = $file;
+ $script = null;
+ }
+
+ parent::__construct($php, $cwd, $env, $script, $timeout);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60)
+ {
+ throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function start(callable $callback = null, array $env = [])
+ {
+ if (null === $this->getCommandLine()) {
+ throw new RuntimeException('Unable to find the PHP executable.');
+ }
+
+ parent::start($callback, $env);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/AbstractPipes.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/AbstractPipes.php
new file mode 100644
index 00000000..01051005
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/AbstractPipes.php
@@ -0,0 +1,180 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Pipes;
+
+use Symfony\Component\Process\Exception\InvalidArgumentException;
+
+/**
+ * @author Romain Neutron
+ *
+ * @internal
+ */
+abstract class AbstractPipes implements PipesInterface
+{
+ public $pipes = [];
+
+ private $inputBuffer = '';
+ private $input;
+ private $blocked = true;
+ private $lastError;
+
+ /**
+ * @param resource|string|int|float|bool|\Iterator|null $input
+ */
+ public function __construct($input)
+ {
+ if (\is_resource($input) || $input instanceof \Iterator) {
+ $this->input = $input;
+ } elseif (\is_string($input)) {
+ $this->inputBuffer = $input;
+ } else {
+ $this->inputBuffer = (string) $input;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function close()
+ {
+ foreach ($this->pipes as $pipe) {
+ if (\is_resource($pipe)) {
+ fclose($pipe);
+ }
+ }
+ $this->pipes = [];
+ }
+
+ /**
+ * Returns true if a system call has been interrupted.
+ */
+ protected function hasSystemCallBeenInterrupted(): bool
+ {
+ $lastError = $this->lastError;
+ $this->lastError = null;
+
+ // stream_select returns false when the `select` system call is interrupted by an incoming signal
+ return null !== $lastError && false !== stripos($lastError, 'interrupted system call');
+ }
+
+ /**
+ * Unblocks streams.
+ */
+ protected function unblock()
+ {
+ if (!$this->blocked) {
+ return;
+ }
+
+ foreach ($this->pipes as $pipe) {
+ stream_set_blocking($pipe, 0);
+ }
+ if (\is_resource($this->input)) {
+ stream_set_blocking($this->input, 0);
+ }
+
+ $this->blocked = false;
+ }
+
+ /**
+ * Writes input to stdin.
+ *
+ * @throws InvalidArgumentException When an input iterator yields a non supported value
+ */
+ protected function write(): ?array
+ {
+ if (!isset($this->pipes[0])) {
+ return null;
+ }
+ $input = $this->input;
+
+ if ($input instanceof \Iterator) {
+ if (!$input->valid()) {
+ $input = null;
+ } elseif (\is_resource($input = $input->current())) {
+ stream_set_blocking($input, 0);
+ } elseif (!isset($this->inputBuffer[0])) {
+ if (!\is_string($input)) {
+ if (!is_scalar($input)) {
+ throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input)));
+ }
+ $input = (string) $input;
+ }
+ $this->inputBuffer = $input;
+ $this->input->next();
+ $input = null;
+ } else {
+ $input = null;
+ }
+ }
+
+ $r = $e = [];
+ $w = [$this->pipes[0]];
+
+ // let's have a look if something changed in streams
+ if (false === @stream_select($r, $w, $e, 0, 0)) {
+ return null;
+ }
+
+ foreach ($w as $stdin) {
+ if (isset($this->inputBuffer[0])) {
+ $written = fwrite($stdin, $this->inputBuffer);
+ $this->inputBuffer = substr($this->inputBuffer, $written);
+ if (isset($this->inputBuffer[0])) {
+ return [$this->pipes[0]];
+ }
+ }
+
+ if ($input) {
+ while (true) {
+ $data = fread($input, self::CHUNK_SIZE);
+ if (!isset($data[0])) {
+ break;
+ }
+ $written = fwrite($stdin, $data);
+ $data = substr($data, $written);
+ if (isset($data[0])) {
+ $this->inputBuffer = $data;
+
+ return [$this->pipes[0]];
+ }
+ }
+ if (feof($input)) {
+ if ($this->input instanceof \Iterator) {
+ $this->input->next();
+ } else {
+ $this->input = null;
+ }
+ }
+ }
+ }
+
+ // no input to read on resource, buffer is empty
+ if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) {
+ $this->input = null;
+ fclose($this->pipes[0]);
+ unset($this->pipes[0]);
+ } elseif (!$w) {
+ return [$this->pipes[0]];
+ }
+
+ return null;
+ }
+
+ /**
+ * @internal
+ */
+ public function handleError(int $type, string $msg)
+ {
+ $this->lastError = $msg;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/PipesInterface.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/PipesInterface.php
new file mode 100644
index 00000000..50eb5c47
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/PipesInterface.php
@@ -0,0 +1,61 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Pipes;
+
+/**
+ * PipesInterface manages descriptors and pipes for the use of proc_open.
+ *
+ * @author Romain Neutron
+ *
+ * @internal
+ */
+interface PipesInterface
+{
+ public const CHUNK_SIZE = 16384;
+
+ /**
+ * Returns an array of descriptors for the use of proc_open.
+ */
+ public function getDescriptors(): array;
+
+ /**
+ * Returns an array of filenames indexed by their related stream in case these pipes use temporary files.
+ *
+ * @return string[]
+ */
+ public function getFiles(): array;
+
+ /**
+ * Reads data in file handles and pipes.
+ *
+ * @param bool $blocking Whether to use blocking calls or not
+ * @param bool $close Whether to close pipes if they've reached EOF
+ *
+ * @return string[] An array of read data indexed by their fd
+ */
+ public function readAndWrite(bool $blocking, bool $close = false): array;
+
+ /**
+ * Returns if the current state has open file handles or pipes.
+ */
+ public function areOpen(): bool;
+
+ /**
+ * Returns if pipes are able to read output.
+ */
+ public function haveReadSupport(): bool;
+
+ /**
+ * Closes file handles and pipes.
+ */
+ public function close();
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/UnixPipes.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/UnixPipes.php
new file mode 100644
index 00000000..5a0e9d47
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/UnixPipes.php
@@ -0,0 +1,163 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Pipes;
+
+use Symfony\Component\Process\Process;
+
+/**
+ * UnixPipes implementation uses unix pipes as handles.
+ *
+ * @author Romain Neutron
+ *
+ * @internal
+ */
+class UnixPipes extends AbstractPipes
+{
+ private $ttyMode;
+ private $ptyMode;
+ private $haveReadSupport;
+
+ public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport)
+ {
+ $this->ttyMode = $ttyMode;
+ $this->ptyMode = $ptyMode;
+ $this->haveReadSupport = $haveReadSupport;
+
+ parent::__construct($input);
+ }
+
+ public function __sleep(): array
+ {
+ throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+ }
+
+ public function __wakeup()
+ {
+ throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+ }
+
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescriptors(): array
+ {
+ if (!$this->haveReadSupport) {
+ $nullstream = fopen('/dev/null', 'c');
+
+ return [
+ ['pipe', 'r'],
+ $nullstream,
+ $nullstream,
+ ];
+ }
+
+ if ($this->ttyMode) {
+ return [
+ ['file', '/dev/tty', 'r'],
+ ['file', '/dev/tty', 'w'],
+ ['file', '/dev/tty', 'w'],
+ ];
+ }
+
+ if ($this->ptyMode && Process::isPtySupported()) {
+ return [
+ ['pty'],
+ ['pty'],
+ ['pty'],
+ ];
+ }
+
+ return [
+ ['pipe', 'r'],
+ ['pipe', 'w'], // stdout
+ ['pipe', 'w'], // stderr
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFiles(): array
+ {
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function readAndWrite(bool $blocking, bool $close = false): array
+ {
+ $this->unblock();
+ $w = $this->write();
+
+ $read = $e = [];
+ $r = $this->pipes;
+ unset($r[0]);
+
+ // let's have a look if something changed in streams
+ set_error_handler([$this, 'handleError']);
+ if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) {
+ restore_error_handler();
+ // if a system call has been interrupted, forget about it, let's try again
+ // otherwise, an error occurred, let's reset pipes
+ if (!$this->hasSystemCallBeenInterrupted()) {
+ $this->pipes = [];
+ }
+
+ return $read;
+ }
+ restore_error_handler();
+
+ foreach ($r as $pipe) {
+ // prior PHP 5.4 the array passed to stream_select is modified and
+ // lose key association, we have to find back the key
+ $read[$type = array_search($pipe, $this->pipes, true)] = '';
+
+ do {
+ $data = @fread($pipe, self::CHUNK_SIZE);
+ $read[$type] .= $data;
+ } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1])));
+
+ if (!isset($read[$type][0])) {
+ unset($read[$type]);
+ }
+
+ if ($close && feof($pipe)) {
+ fclose($pipe);
+ unset($this->pipes[$type]);
+ }
+ }
+
+ return $read;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function haveReadSupport(): bool
+ {
+ return $this->haveReadSupport;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function areOpen(): bool
+ {
+ return (bool) $this->pipes;
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/WindowsPipes.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/WindowsPipes.php
new file mode 100644
index 00000000..bca84f57
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Pipes/WindowsPipes.php
@@ -0,0 +1,204 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process\Pipes;
+
+use Symfony\Component\Process\Exception\RuntimeException;
+use Symfony\Component\Process\Process;
+
+/**
+ * WindowsPipes implementation uses temporary files as handles.
+ *
+ * @see https://bugs.php.net/51800
+ * @see https://bugs.php.net/65650
+ *
+ * @author Romain Neutron
+ *
+ * @internal
+ */
+class WindowsPipes extends AbstractPipes
+{
+ private $files = [];
+ private $fileHandles = [];
+ private $lockHandles = [];
+ private $readBytes = [
+ Process::STDOUT => 0,
+ Process::STDERR => 0,
+ ];
+ private $haveReadSupport;
+
+ public function __construct($input, bool $haveReadSupport)
+ {
+ $this->haveReadSupport = $haveReadSupport;
+
+ if ($this->haveReadSupport) {
+ // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big.
+ // Workaround for this problem is to use temporary files instead of pipes on Windows platform.
+ //
+ // @see https://bugs.php.net/51800
+ $pipes = [
+ Process::STDOUT => Process::OUT,
+ Process::STDERR => Process::ERR,
+ ];
+ $tmpDir = sys_get_temp_dir();
+ $lastError = 'unknown reason';
+ set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; });
+ for ($i = 0;; ++$i) {
+ foreach ($pipes as $pipe => $name) {
+ $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name);
+
+ if (!$h = fopen($file.'.lock', 'w')) {
+ if (file_exists($file.'.lock')) {
+ continue 2;
+ }
+ restore_error_handler();
+ throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError);
+ }
+ if (!flock($h, \LOCK_EX | \LOCK_NB)) {
+ continue 2;
+ }
+ if (isset($this->lockHandles[$pipe])) {
+ flock($this->lockHandles[$pipe], \LOCK_UN);
+ fclose($this->lockHandles[$pipe]);
+ }
+ $this->lockHandles[$pipe] = $h;
+
+ if (!($h = fopen($file, 'w')) || !fclose($h) || !$h = fopen($file, 'r')) {
+ flock($this->lockHandles[$pipe], \LOCK_UN);
+ fclose($this->lockHandles[$pipe]);
+ unset($this->lockHandles[$pipe]);
+ continue 2;
+ }
+ $this->fileHandles[$pipe] = $h;
+ $this->files[$pipe] = $file;
+ }
+ break;
+ }
+ restore_error_handler();
+ }
+
+ parent::__construct($input);
+ }
+
+ public function __sleep(): array
+ {
+ throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+ }
+
+ public function __wakeup()
+ {
+ throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+ }
+
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDescriptors(): array
+ {
+ if (!$this->haveReadSupport) {
+ $nullstream = fopen('NUL', 'c');
+
+ return [
+ ['pipe', 'r'],
+ $nullstream,
+ $nullstream,
+ ];
+ }
+
+ // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800)
+ // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650
+ // So we redirect output within the commandline and pass the nul device to the process
+ return [
+ ['pipe', 'r'],
+ ['file', 'NUL', 'w'],
+ ['file', 'NUL', 'w'],
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFiles(): array
+ {
+ return $this->files;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function readAndWrite(bool $blocking, bool $close = false): array
+ {
+ $this->unblock();
+ $w = $this->write();
+ $read = $r = $e = [];
+
+ if ($blocking) {
+ if ($w) {
+ @stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6);
+ } elseif ($this->fileHandles) {
+ usleep(Process::TIMEOUT_PRECISION * 1E6);
+ }
+ }
+ foreach ($this->fileHandles as $type => $fileHandle) {
+ $data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]);
+
+ if (isset($data[0])) {
+ $this->readBytes[$type] += \strlen($data);
+ $read[$type] = $data;
+ }
+ if ($close) {
+ ftruncate($fileHandle, 0);
+ fclose($fileHandle);
+ flock($this->lockHandles[$type], \LOCK_UN);
+ fclose($this->lockHandles[$type]);
+ unset($this->fileHandles[$type], $this->lockHandles[$type]);
+ }
+ }
+
+ return $read;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function haveReadSupport(): bool
+ {
+ return $this->haveReadSupport;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function areOpen(): bool
+ {
+ return $this->pipes && $this->fileHandles;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function close()
+ {
+ parent::close();
+ foreach ($this->fileHandles as $type => $handle) {
+ ftruncate($handle, 0);
+ fclose($handle);
+ flock($this->lockHandles[$type], \LOCK_UN);
+ fclose($this->lockHandles[$type]);
+ }
+ $this->fileHandles = $this->lockHandles = [];
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/Process.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Process.php
new file mode 100644
index 00000000..14e17774
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/Process.php
@@ -0,0 +1,1652 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+use Symfony\Component\Process\Exception\InvalidArgumentException;
+use Symfony\Component\Process\Exception\LogicException;
+use Symfony\Component\Process\Exception\ProcessFailedException;
+use Symfony\Component\Process\Exception\ProcessSignaledException;
+use Symfony\Component\Process\Exception\ProcessTimedOutException;
+use Symfony\Component\Process\Exception\RuntimeException;
+use Symfony\Component\Process\Pipes\PipesInterface;
+use Symfony\Component\Process\Pipes\UnixPipes;
+use Symfony\Component\Process\Pipes\WindowsPipes;
+
+/**
+ * Process is a thin wrapper around proc_* functions to easily
+ * start independent PHP processes.
+ *
+ * @author Fabien Potencier
+ * @author Romain Neutron
+ *
+ * @implements \IteratorAggregate
+ */
+class Process implements \IteratorAggregate
+{
+ public const ERR = 'err';
+ public const OUT = 'out';
+
+ public const STATUS_READY = 'ready';
+ public const STATUS_STARTED = 'started';
+ public const STATUS_TERMINATED = 'terminated';
+
+ public const STDIN = 0;
+ public const STDOUT = 1;
+ public const STDERR = 2;
+
+ // Timeout Precision in seconds.
+ public const TIMEOUT_PRECISION = 0.2;
+
+ public const ITER_NON_BLOCKING = 1; // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking
+ public const ITER_KEEP_OUTPUT = 2; // By default, outputs are cleared while iterating, use this flag to keep them in memory
+ public const ITER_SKIP_OUT = 4; // Use this flag to skip STDOUT while iterating
+ public const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating
+
+ private $callback;
+ private $hasCallback = false;
+ private $commandline;
+ private $cwd;
+ private $env = [];
+ private $input;
+ private $starttime;
+ private $lastOutputTime;
+ private $timeout;
+ private $idleTimeout;
+ private $exitcode;
+ private $fallbackStatus = [];
+ private $processInformation;
+ private $outputDisabled = false;
+ private $stdout;
+ private $stderr;
+ private $process;
+ private $status = self::STATUS_READY;
+ private $incrementalOutputOffset = 0;
+ private $incrementalErrorOutputOffset = 0;
+ private $tty = false;
+ private $pty;
+ private $options = ['suppress_errors' => true, 'bypass_shell' => true];
+
+ private $useFileHandles = false;
+ /** @var PipesInterface */
+ private $processPipes;
+
+ private $latestSignal;
+
+ private static $sigchild;
+
+ /**
+ * Exit codes translation table.
+ *
+ * User-defined errors must use exit codes in the 64-113 range.
+ */
+ public static $exitCodes = [
+ 0 => 'OK',
+ 1 => 'General error',
+ 2 => 'Misuse of shell builtins',
+
+ 126 => 'Invoked command cannot execute',
+ 127 => 'Command not found',
+ 128 => 'Invalid exit argument',
+
+ // signals
+ 129 => 'Hangup',
+ 130 => 'Interrupt',
+ 131 => 'Quit and dump core',
+ 132 => 'Illegal instruction',
+ 133 => 'Trace/breakpoint trap',
+ 134 => 'Process aborted',
+ 135 => 'Bus error: "access to undefined portion of memory object"',
+ 136 => 'Floating point exception: "erroneous arithmetic operation"',
+ 137 => 'Kill (terminate immediately)',
+ 138 => 'User-defined 1',
+ 139 => 'Segmentation violation',
+ 140 => 'User-defined 2',
+ 141 => 'Write to pipe with no one reading',
+ 142 => 'Signal raised by alarm',
+ 143 => 'Termination (request to terminate)',
+ // 144 - not defined
+ 145 => 'Child process terminated, stopped (or continued*)',
+ 146 => 'Continue if stopped',
+ 147 => 'Stop executing temporarily',
+ 148 => 'Terminal stop signal',
+ 149 => 'Background process attempting to read from tty ("in")',
+ 150 => 'Background process attempting to write to tty ("out")',
+ 151 => 'Urgent data available on socket',
+ 152 => 'CPU time limit exceeded',
+ 153 => 'File size limit exceeded',
+ 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"',
+ 155 => 'Profiling timer expired',
+ // 156 - not defined
+ 157 => 'Pollable event',
+ // 158 - not defined
+ 159 => 'Bad syscall',
+ ];
+
+ /**
+ * @param array $command The command to run and its arguments listed as separate entries
+ * @param string|null $cwd The working directory or null to use the working dir of the current PHP process
+ * @param array|null $env The environment variables or null to use the same environment as the current PHP process
+ * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input
+ * @param int|float|null $timeout The timeout in seconds or null to disable
+ *
+ * @throws LogicException When proc_open is not installed
+ */
+ public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60)
+ {
+ if (!\function_exists('proc_open')) {
+ throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.');
+ }
+
+ $this->commandline = $command;
+ $this->cwd = $cwd;
+
+ // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started
+ // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected
+ // @see : https://bugs.php.net/51800
+ // @see : https://bugs.php.net/50524
+ if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) {
+ $this->cwd = getcwd();
+ }
+ if (null !== $env) {
+ $this->setEnv($env);
+ }
+
+ $this->setInput($input);
+ $this->setTimeout($timeout);
+ $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR;
+ $this->pty = false;
+ }
+
+ /**
+ * Creates a Process instance as a command-line to be run in a shell wrapper.
+ *
+ * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.)
+ * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the
+ * shell wrapper and not to your commands.
+ *
+ * In order to inject dynamic values into command-lines, we strongly recommend using placeholders.
+ * This will save escaping values, which is not portable nor secure anyway:
+ *
+ * $process = Process::fromShellCommandline('my_command "${:MY_VAR}"');
+ * $process->run(null, ['MY_VAR' => $theValue]);
+ *
+ * @param string $command The command line to pass to the shell of the OS
+ * @param string|null $cwd The working directory or null to use the working dir of the current PHP process
+ * @param array|null $env The environment variables or null to use the same environment as the current PHP process
+ * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input
+ * @param int|float|null $timeout The timeout in seconds or null to disable
+ *
+ * @return static
+ *
+ * @throws LogicException When proc_open is not installed
+ */
+ public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60)
+ {
+ $process = new static([], $cwd, $env, $input, $timeout);
+ $process->commandline = $command;
+
+ return $process;
+ }
+
+ /**
+ * @return array
+ */
+ public function __sleep()
+ {
+ throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+ }
+
+ public function __wakeup()
+ {
+ throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+ }
+
+ public function __destruct()
+ {
+ if ($this->options['create_new_console'] ?? false) {
+ $this->processPipes->close();
+ } else {
+ $this->stop(0);
+ }
+ }
+
+ public function __clone()
+ {
+ $this->resetProcessData();
+ }
+
+ /**
+ * Runs the process.
+ *
+ * The callback receives the type of output (out or err) and
+ * some bytes from the output in real-time. It allows to have feedback
+ * from the independent process during execution.
+ *
+ * The STDOUT and STDERR are also available after the process is finished
+ * via the getOutput() and getErrorOutput() methods.
+ *
+ * @param callable|null $callback A PHP callback to run whenever there is some
+ * output available on STDOUT or STDERR
+ *
+ * @return int The exit status code
+ *
+ * @throws RuntimeException When process can't be launched
+ * @throws RuntimeException When process is already running
+ * @throws ProcessTimedOutException When process timed out
+ * @throws ProcessSignaledException When process stopped after receiving signal
+ * @throws LogicException In case a callback is provided and output has been disabled
+ *
+ * @final
+ */
+ public function run(callable $callback = null, array $env = []): int
+ {
+ $this->start($callback, $env);
+
+ return $this->wait();
+ }
+
+ /**
+ * Runs the process.
+ *
+ * This is identical to run() except that an exception is thrown if the process
+ * exits with a non-zero exit code.
+ *
+ * @return $this
+ *
+ * @throws ProcessFailedException if the process didn't terminate successfully
+ *
+ * @final
+ */
+ public function mustRun(callable $callback = null, array $env = []): self
+ {
+ if (0 !== $this->run($callback, $env)) {
+ throw new ProcessFailedException($this);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Starts the process and returns after writing the input to STDIN.
+ *
+ * This method blocks until all STDIN data is sent to the process then it
+ * returns while the process runs in the background.
+ *
+ * The termination of the process can be awaited with wait().
+ *
+ * The callback receives the type of output (out or err) and some bytes from
+ * the output in real-time while writing the standard input to the process.
+ * It allows to have feedback from the independent process during execution.
+ *
+ * @param callable|null $callback A PHP callback to run whenever there is some
+ * output available on STDOUT or STDERR
+ *
+ * @throws RuntimeException When process can't be launched
+ * @throws RuntimeException When process is already running
+ * @throws LogicException In case a callback is provided and output has been disabled
+ */
+ public function start(callable $callback = null, array $env = [])
+ {
+ if ($this->isRunning()) {
+ throw new RuntimeException('Process is already running.');
+ }
+
+ $this->resetProcessData();
+ $this->starttime = $this->lastOutputTime = microtime(true);
+ $this->callback = $this->buildCallback($callback);
+ $this->hasCallback = null !== $callback;
+ $descriptors = $this->getDescriptors();
+
+ if ($this->env) {
+ $env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->env, $env, 'strcasecmp') : $this->env;
+ }
+
+ $env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->getDefaultEnv(), $env, 'strcasecmp') : $this->getDefaultEnv();
+
+ if (\is_array($commandline = $this->commandline)) {
+ $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline));
+
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ // exec is mandatory to deal with sending a signal to the process
+ $commandline = 'exec '.$commandline;
+ }
+ } else {
+ $commandline = $this->replacePlaceholders($commandline, $env);
+ }
+
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $commandline = $this->prepareWindowsCommandLine($commandline, $env);
+ } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) {
+ // last exit code is output on the fourth pipe and caught to work around --enable-sigchild
+ $descriptors[3] = ['pipe', 'w'];
+
+ // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input
+ $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;';
+ $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code';
+
+ // Workaround for the bug, when PTS functionality is enabled.
+ // @see : https://bugs.php.net/69442
+ $ptsWorkaround = fopen(__FILE__, 'r');
+ }
+
+ $envPairs = [];
+ foreach ($env as $k => $v) {
+ if (false !== $v && false === \in_array($k, ['argc', 'argv', 'ARGC', 'ARGV'], true)) {
+ $envPairs[] = $k.'='.$v;
+ }
+ }
+
+ if (!is_dir($this->cwd)) {
+ throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd));
+ }
+
+ $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options);
+
+ if (!\is_resource($this->process)) {
+ throw new RuntimeException('Unable to launch a new process.');
+ }
+ $this->status = self::STATUS_STARTED;
+
+ if (isset($descriptors[3])) {
+ $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]);
+ }
+
+ if ($this->tty) {
+ return;
+ }
+
+ $this->updateStatus(false);
+ $this->checkTimeout();
+ }
+
+ /**
+ * Restarts the process.
+ *
+ * Be warned that the process is cloned before being started.
+ *
+ * @param callable|null $callback A PHP callback to run whenever there is some
+ * output available on STDOUT or STDERR
+ *
+ * @return static
+ *
+ * @throws RuntimeException When process can't be launched
+ * @throws RuntimeException When process is already running
+ *
+ * @see start()
+ *
+ * @final
+ */
+ public function restart(callable $callback = null, array $env = []): self
+ {
+ if ($this->isRunning()) {
+ throw new RuntimeException('Process is already running.');
+ }
+
+ $process = clone $this;
+ $process->start($callback, $env);
+
+ return $process;
+ }
+
+ /**
+ * Waits for the process to terminate.
+ *
+ * The callback receives the type of output (out or err) and some bytes
+ * from the output in real-time while writing the standard input to the process.
+ * It allows to have feedback from the independent process during execution.
+ *
+ * @param callable|null $callback A valid PHP callback
+ *
+ * @return int The exitcode of the process
+ *
+ * @throws ProcessTimedOutException When process timed out
+ * @throws ProcessSignaledException When process stopped after receiving signal
+ * @throws LogicException When process is not yet started
+ */
+ public function wait(callable $callback = null)
+ {
+ $this->requireProcessIsStarted(__FUNCTION__);
+
+ $this->updateStatus(false);
+
+ if (null !== $callback) {
+ if (!$this->processPipes->haveReadSupport()) {
+ $this->stop(0);
+ throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".');
+ }
+ $this->callback = $this->buildCallback($callback);
+ }
+
+ do {
+ $this->checkTimeout();
+ $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
+ $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
+ } while ($running);
+
+ while ($this->isRunning()) {
+ $this->checkTimeout();
+ usleep(1000);
+ }
+
+ if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) {
+ throw new ProcessSignaledException($this);
+ }
+
+ return $this->exitcode;
+ }
+
+ /**
+ * Waits until the callback returns true.
+ *
+ * The callback receives the type of output (out or err) and some bytes
+ * from the output in real-time while writing the standard input to the process.
+ * It allows to have feedback from the independent process during execution.
+ *
+ * @throws RuntimeException When process timed out
+ * @throws LogicException When process is not yet started
+ * @throws ProcessTimedOutException In case the timeout was reached
+ */
+ public function waitUntil(callable $callback): bool
+ {
+ $this->requireProcessIsStarted(__FUNCTION__);
+ $this->updateStatus(false);
+
+ if (!$this->processPipes->haveReadSupport()) {
+ $this->stop(0);
+ throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".');
+ }
+ $callback = $this->buildCallback($callback);
+
+ $ready = false;
+ while (true) {
+ $this->checkTimeout();
+ $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
+ $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
+
+ foreach ($output as $type => $data) {
+ if (3 !== $type) {
+ $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready;
+ } elseif (!isset($this->fallbackStatus['signaled'])) {
+ $this->fallbackStatus['exitcode'] = (int) $data;
+ }
+ }
+ if ($ready) {
+ return true;
+ }
+ if (!$running) {
+ return false;
+ }
+
+ usleep(1000);
+ }
+ }
+
+ /**
+ * Returns the Pid (process identifier), if applicable.
+ *
+ * @return int|null The process id if running, null otherwise
+ */
+ public function getPid()
+ {
+ return $this->isRunning() ? $this->processInformation['pid'] : null;
+ }
+
+ /**
+ * Sends a POSIX signal to the process.
+ *
+ * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants)
+ *
+ * @return $this
+ *
+ * @throws LogicException In case the process is not running
+ * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed
+ * @throws RuntimeException In case of failure
+ */
+ public function signal(int $signal)
+ {
+ $this->doSignal($signal, true);
+
+ return $this;
+ }
+
+ /**
+ * Disables fetching output and error output from the underlying process.
+ *
+ * @return $this
+ *
+ * @throws RuntimeException In case the process is already running
+ * @throws LogicException if an idle timeout is set
+ */
+ public function disableOutput()
+ {
+ if ($this->isRunning()) {
+ throw new RuntimeException('Disabling output while the process is running is not possible.');
+ }
+ if (null !== $this->idleTimeout) {
+ throw new LogicException('Output cannot be disabled while an idle timeout is set.');
+ }
+
+ $this->outputDisabled = true;
+
+ return $this;
+ }
+
+ /**
+ * Enables fetching output and error output from the underlying process.
+ *
+ * @return $this
+ *
+ * @throws RuntimeException In case the process is already running
+ */
+ public function enableOutput()
+ {
+ if ($this->isRunning()) {
+ throw new RuntimeException('Enabling output while the process is running is not possible.');
+ }
+
+ $this->outputDisabled = false;
+
+ return $this;
+ }
+
+ /**
+ * Returns true in case the output is disabled, false otherwise.
+ *
+ * @return bool
+ */
+ public function isOutputDisabled()
+ {
+ return $this->outputDisabled;
+ }
+
+ /**
+ * Returns the current output of the process (STDOUT).
+ *
+ * @return string
+ *
+ * @throws LogicException in case the output has been disabled
+ * @throws LogicException In case the process is not started
+ */
+ public function getOutput()
+ {
+ $this->readPipesForOutput(__FUNCTION__);
+
+ if (false === $ret = stream_get_contents($this->stdout, -1, 0)) {
+ return '';
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns the output incrementally.
+ *
+ * In comparison with the getOutput method which always return the whole
+ * output, this one returns the new output since the last call.
+ *
+ * @return string
+ *
+ * @throws LogicException in case the output has been disabled
+ * @throws LogicException In case the process is not started
+ */
+ public function getIncrementalOutput()
+ {
+ $this->readPipesForOutput(__FUNCTION__);
+
+ $latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset);
+ $this->incrementalOutputOffset = ftell($this->stdout);
+
+ if (false === $latest) {
+ return '';
+ }
+
+ return $latest;
+ }
+
+ /**
+ * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR).
+ *
+ * @param int $flags A bit field of Process::ITER_* flags
+ *
+ * @throws LogicException in case the output has been disabled
+ * @throws LogicException In case the process is not started
+ *
+ * @return \Generator
+ */
+ #[\ReturnTypeWillChange]
+ public function getIterator(int $flags = 0)
+ {
+ $this->readPipesForOutput(__FUNCTION__, false);
+
+ $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags);
+ $blocking = !(self::ITER_NON_BLOCKING & $flags);
+ $yieldOut = !(self::ITER_SKIP_OUT & $flags);
+ $yieldErr = !(self::ITER_SKIP_ERR & $flags);
+
+ while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) {
+ if ($yieldOut) {
+ $out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset);
+
+ if (isset($out[0])) {
+ if ($clearOutput) {
+ $this->clearOutput();
+ } else {
+ $this->incrementalOutputOffset = ftell($this->stdout);
+ }
+
+ yield self::OUT => $out;
+ }
+ }
+
+ if ($yieldErr) {
+ $err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset);
+
+ if (isset($err[0])) {
+ if ($clearOutput) {
+ $this->clearErrorOutput();
+ } else {
+ $this->incrementalErrorOutputOffset = ftell($this->stderr);
+ }
+
+ yield self::ERR => $err;
+ }
+ }
+
+ if (!$blocking && !isset($out[0]) && !isset($err[0])) {
+ yield self::OUT => '';
+ }
+
+ $this->checkTimeout();
+ $this->readPipesForOutput(__FUNCTION__, $blocking);
+ }
+ }
+
+ /**
+ * Clears the process output.
+ *
+ * @return $this
+ */
+ public function clearOutput()
+ {
+ ftruncate($this->stdout, 0);
+ fseek($this->stdout, 0);
+ $this->incrementalOutputOffset = 0;
+
+ return $this;
+ }
+
+ /**
+ * Returns the current error output of the process (STDERR).
+ *
+ * @return string
+ *
+ * @throws LogicException in case the output has been disabled
+ * @throws LogicException In case the process is not started
+ */
+ public function getErrorOutput()
+ {
+ $this->readPipesForOutput(__FUNCTION__);
+
+ if (false === $ret = stream_get_contents($this->stderr, -1, 0)) {
+ return '';
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns the errorOutput incrementally.
+ *
+ * In comparison with the getErrorOutput method which always return the
+ * whole error output, this one returns the new error output since the last
+ * call.
+ *
+ * @return string
+ *
+ * @throws LogicException in case the output has been disabled
+ * @throws LogicException In case the process is not started
+ */
+ public function getIncrementalErrorOutput()
+ {
+ $this->readPipesForOutput(__FUNCTION__);
+
+ $latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset);
+ $this->incrementalErrorOutputOffset = ftell($this->stderr);
+
+ if (false === $latest) {
+ return '';
+ }
+
+ return $latest;
+ }
+
+ /**
+ * Clears the process output.
+ *
+ * @return $this
+ */
+ public function clearErrorOutput()
+ {
+ ftruncate($this->stderr, 0);
+ fseek($this->stderr, 0);
+ $this->incrementalErrorOutputOffset = 0;
+
+ return $this;
+ }
+
+ /**
+ * Returns the exit code returned by the process.
+ *
+ * @return int|null The exit status code, null if the Process is not terminated
+ */
+ public function getExitCode()
+ {
+ $this->updateStatus(false);
+
+ return $this->exitcode;
+ }
+
+ /**
+ * Returns a string representation for the exit code returned by the process.
+ *
+ * This method relies on the Unix exit code status standardization
+ * and might not be relevant for other operating systems.
+ *
+ * @return string|null A string representation for the exit status code, null if the Process is not terminated
+ *
+ * @see http://tldp.org/LDP/abs/html/exitcodes.html
+ * @see http://en.wikipedia.org/wiki/Unix_signal
+ */
+ public function getExitCodeText()
+ {
+ if (null === $exitcode = $this->getExitCode()) {
+ return null;
+ }
+
+ return self::$exitCodes[$exitcode] ?? 'Unknown error';
+ }
+
+ /**
+ * Checks if the process ended successfully.
+ *
+ * @return bool
+ */
+ public function isSuccessful()
+ {
+ return 0 === $this->getExitCode();
+ }
+
+ /**
+ * Returns true if the child process has been terminated by an uncaught signal.
+ *
+ * It always returns false on Windows.
+ *
+ * @return bool
+ *
+ * @throws LogicException In case the process is not terminated
+ */
+ public function hasBeenSignaled()
+ {
+ $this->requireProcessIsTerminated(__FUNCTION__);
+
+ return $this->processInformation['signaled'];
+ }
+
+ /**
+ * Returns the number of the signal that caused the child process to terminate its execution.
+ *
+ * It is only meaningful if hasBeenSignaled() returns true.
+ *
+ * @return int
+ *
+ * @throws RuntimeException In case --enable-sigchild is activated
+ * @throws LogicException In case the process is not terminated
+ */
+ public function getTermSignal()
+ {
+ $this->requireProcessIsTerminated(__FUNCTION__);
+
+ if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) {
+ throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal cannot be retrieved.');
+ }
+
+ return $this->processInformation['termsig'];
+ }
+
+ /**
+ * Returns true if the child process has been stopped by a signal.
+ *
+ * It always returns false on Windows.
+ *
+ * @return bool
+ *
+ * @throws LogicException In case the process is not terminated
+ */
+ public function hasBeenStopped()
+ {
+ $this->requireProcessIsTerminated(__FUNCTION__);
+
+ return $this->processInformation['stopped'];
+ }
+
+ /**
+ * Returns the number of the signal that caused the child process to stop its execution.
+ *
+ * It is only meaningful if hasBeenStopped() returns true.
+ *
+ * @return int
+ *
+ * @throws LogicException In case the process is not terminated
+ */
+ public function getStopSignal()
+ {
+ $this->requireProcessIsTerminated(__FUNCTION__);
+
+ return $this->processInformation['stopsig'];
+ }
+
+ /**
+ * Checks if the process is currently running.
+ *
+ * @return bool
+ */
+ public function isRunning()
+ {
+ if (self::STATUS_STARTED !== $this->status) {
+ return false;
+ }
+
+ $this->updateStatus(false);
+
+ return $this->processInformation['running'];
+ }
+
+ /**
+ * Checks if the process has been started with no regard to the current state.
+ *
+ * @return bool
+ */
+ public function isStarted()
+ {
+ return self::STATUS_READY != $this->status;
+ }
+
+ /**
+ * Checks if the process is terminated.
+ *
+ * @return bool
+ */
+ public function isTerminated()
+ {
+ $this->updateStatus(false);
+
+ return self::STATUS_TERMINATED == $this->status;
+ }
+
+ /**
+ * Gets the process status.
+ *
+ * The status is one of: ready, started, terminated.
+ *
+ * @return string
+ */
+ public function getStatus()
+ {
+ $this->updateStatus(false);
+
+ return $this->status;
+ }
+
+ /**
+ * Stops the process.
+ *
+ * @param int|float $timeout The timeout in seconds
+ * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9)
+ *
+ * @return int|null The exit-code of the process or null if it's not running
+ */
+ public function stop(float $timeout = 10, int $signal = null)
+ {
+ $timeoutMicro = microtime(true) + $timeout;
+ if ($this->isRunning()) {
+ // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here
+ $this->doSignal(15, false);
+ do {
+ usleep(1000);
+ } while ($this->isRunning() && microtime(true) < $timeoutMicro);
+
+ if ($this->isRunning()) {
+ // Avoid exception here: process is supposed to be running, but it might have stopped just
+ // after this line. In any case, let's silently discard the error, we cannot do anything.
+ $this->doSignal($signal ?: 9, false);
+ }
+ }
+
+ if ($this->isRunning()) {
+ if (isset($this->fallbackStatus['pid'])) {
+ unset($this->fallbackStatus['pid']);
+
+ return $this->stop(0, $signal);
+ }
+ $this->close();
+ }
+
+ return $this->exitcode;
+ }
+
+ /**
+ * Adds a line to the STDOUT stream.
+ *
+ * @internal
+ */
+ public function addOutput(string $line)
+ {
+ $this->lastOutputTime = microtime(true);
+
+ fseek($this->stdout, 0, \SEEK_END);
+ fwrite($this->stdout, $line);
+ fseek($this->stdout, $this->incrementalOutputOffset);
+ }
+
+ /**
+ * Adds a line to the STDERR stream.
+ *
+ * @internal
+ */
+ public function addErrorOutput(string $line)
+ {
+ $this->lastOutputTime = microtime(true);
+
+ fseek($this->stderr, 0, \SEEK_END);
+ fwrite($this->stderr, $line);
+ fseek($this->stderr, $this->incrementalErrorOutputOffset);
+ }
+
+ /**
+ * Gets the last output time in seconds.
+ */
+ public function getLastOutputTime(): ?float
+ {
+ return $this->lastOutputTime;
+ }
+
+ /**
+ * Gets the command line to be executed.
+ *
+ * @return string
+ */
+ public function getCommandLine()
+ {
+ return \is_array($this->commandline) ? implode(' ', array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline;
+ }
+
+ /**
+ * Gets the process timeout in seconds (max. runtime).
+ *
+ * @return float|null
+ */
+ public function getTimeout()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * Gets the process idle timeout in seconds (max. time since last output).
+ *
+ * @return float|null
+ */
+ public function getIdleTimeout()
+ {
+ return $this->idleTimeout;
+ }
+
+ /**
+ * Sets the process timeout (max. runtime) in seconds.
+ *
+ * To disable the timeout, set this value to null.
+ *
+ * @return $this
+ *
+ * @throws InvalidArgumentException if the timeout is negative
+ */
+ public function setTimeout(?float $timeout)
+ {
+ $this->timeout = $this->validateTimeout($timeout);
+
+ return $this;
+ }
+
+ /**
+ * Sets the process idle timeout (max. time since last output) in seconds.
+ *
+ * To disable the timeout, set this value to null.
+ *
+ * @return $this
+ *
+ * @throws LogicException if the output is disabled
+ * @throws InvalidArgumentException if the timeout is negative
+ */
+ public function setIdleTimeout(?float $timeout)
+ {
+ if (null !== $timeout && $this->outputDisabled) {
+ throw new LogicException('Idle timeout cannot be set while the output is disabled.');
+ }
+
+ $this->idleTimeout = $this->validateTimeout($timeout);
+
+ return $this;
+ }
+
+ /**
+ * Enables or disables the TTY mode.
+ *
+ * @return $this
+ *
+ * @throws RuntimeException In case the TTY mode is not supported
+ */
+ public function setTty(bool $tty)
+ {
+ if ('\\' === \DIRECTORY_SEPARATOR && $tty) {
+ throw new RuntimeException('TTY mode is not supported on Windows platform.');
+ }
+
+ if ($tty && !self::isTtySupported()) {
+ throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.');
+ }
+
+ $this->tty = $tty;
+
+ return $this;
+ }
+
+ /**
+ * Checks if the TTY mode is enabled.
+ *
+ * @return bool
+ */
+ public function isTty()
+ {
+ return $this->tty;
+ }
+
+ /**
+ * Sets PTY mode.
+ *
+ * @return $this
+ */
+ public function setPty(bool $bool)
+ {
+ $this->pty = $bool;
+
+ return $this;
+ }
+
+ /**
+ * Returns PTY state.
+ *
+ * @return bool
+ */
+ public function isPty()
+ {
+ return $this->pty;
+ }
+
+ /**
+ * Gets the working directory.
+ *
+ * @return string|null
+ */
+ public function getWorkingDirectory()
+ {
+ if (null === $this->cwd) {
+ // getcwd() will return false if any one of the parent directories does not have
+ // the readable or search mode set, even if the current directory does
+ return getcwd() ?: null;
+ }
+
+ return $this->cwd;
+ }
+
+ /**
+ * Sets the current working directory.
+ *
+ * @return $this
+ */
+ public function setWorkingDirectory(string $cwd)
+ {
+ $this->cwd = $cwd;
+
+ return $this;
+ }
+
+ /**
+ * Gets the environment variables.
+ *
+ * @return array
+ */
+ public function getEnv()
+ {
+ return $this->env;
+ }
+
+ /**
+ * Sets the environment variables.
+ *
+ * @param array $env The new environment variables
+ *
+ * @return $this
+ */
+ public function setEnv(array $env)
+ {
+ $this->env = $env;
+
+ return $this;
+ }
+
+ /**
+ * Gets the Process input.
+ *
+ * @return resource|string|\Iterator|null
+ */
+ public function getInput()
+ {
+ return $this->input;
+ }
+
+ /**
+ * Sets the input.
+ *
+ * This content will be passed to the underlying process standard input.
+ *
+ * @param string|int|float|bool|resource|\Traversable|null $input The content
+ *
+ * @return $this
+ *
+ * @throws LogicException In case the process is running
+ */
+ public function setInput($input)
+ {
+ if ($this->isRunning()) {
+ throw new LogicException('Input cannot be set while the process is running.');
+ }
+
+ $this->input = ProcessUtils::validateInput(__METHOD__, $input);
+
+ return $this;
+ }
+
+ /**
+ * Performs a check between the timeout definition and the time the process started.
+ *
+ * In case you run a background process (with the start method), you should
+ * trigger this method regularly to ensure the process timeout
+ *
+ * @throws ProcessTimedOutException In case the timeout was reached
+ */
+ public function checkTimeout()
+ {
+ if (self::STATUS_STARTED !== $this->status) {
+ return;
+ }
+
+ if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) {
+ $this->stop(0);
+
+ throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL);
+ }
+
+ if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) {
+ $this->stop(0);
+
+ throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE);
+ }
+ }
+
+ /**
+ * @throws LogicException in case process is not started
+ */
+ public function getStartTime(): float
+ {
+ if (!$this->isStarted()) {
+ throw new LogicException('Start time is only available after process start.');
+ }
+
+ return $this->starttime;
+ }
+
+ /**
+ * Defines options to pass to the underlying proc_open().
+ *
+ * @see https://php.net/proc_open for the options supported by PHP.
+ *
+ * Enabling the "create_new_console" option allows a subprocess to continue
+ * to run after the main process exited, on both Windows and *nix
+ */
+ public function setOptions(array $options)
+ {
+ if ($this->isRunning()) {
+ throw new RuntimeException('Setting options while the process is running is not possible.');
+ }
+
+ $defaultOptions = $this->options;
+ $existingOptions = ['blocking_pipes', 'create_process_group', 'create_new_console'];
+
+ foreach ($options as $key => $value) {
+ if (!\in_array($key, $existingOptions)) {
+ $this->options = $defaultOptions;
+ throw new LogicException(sprintf('Invalid option "%s" passed to "%s()". Supported options are "%s".', $key, __METHOD__, implode('", "', $existingOptions)));
+ }
+ $this->options[$key] = $value;
+ }
+ }
+
+ /**
+ * Returns whether TTY is supported on the current operating system.
+ */
+ public static function isTtySupported(): bool
+ {
+ static $isTtySupported;
+
+ if (null === $isTtySupported) {
+ $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes);
+ }
+
+ return $isTtySupported;
+ }
+
+ /**
+ * Returns whether PTY is supported on the current operating system.
+ *
+ * @return bool
+ */
+ public static function isPtySupported()
+ {
+ static $result;
+
+ if (null !== $result) {
+ return $result;
+ }
+
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ return $result = false;
+ }
+
+ return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes);
+ }
+
+ /**
+ * Creates the descriptors needed by the proc_open.
+ */
+ private function getDescriptors(): array
+ {
+ if ($this->input instanceof \Iterator) {
+ $this->input->rewind();
+ }
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback);
+ } else {
+ $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback);
+ }
+
+ return $this->processPipes->getDescriptors();
+ }
+
+ /**
+ * Builds up the callback used by wait().
+ *
+ * The callbacks adds all occurred output to the specific buffer and calls
+ * the user callback (if present) with the received output.
+ *
+ * @param callable|null $callback The user defined PHP callback
+ *
+ * @return \Closure
+ */
+ protected function buildCallback(callable $callback = null)
+ {
+ if ($this->outputDisabled) {
+ return function ($type, $data) use ($callback): bool {
+ return null !== $callback && $callback($type, $data);
+ };
+ }
+
+ $out = self::OUT;
+
+ return function ($type, $data) use ($callback, $out): bool {
+ if ($out == $type) {
+ $this->addOutput($data);
+ } else {
+ $this->addErrorOutput($data);
+ }
+
+ return null !== $callback && $callback($type, $data);
+ };
+ }
+
+ /**
+ * Updates the status of the process, reads pipes.
+ *
+ * @param bool $blocking Whether to use a blocking read call
+ */
+ protected function updateStatus(bool $blocking)
+ {
+ if (self::STATUS_STARTED !== $this->status) {
+ return;
+ }
+
+ $this->processInformation = proc_get_status($this->process);
+ $running = $this->processInformation['running'];
+
+ $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running);
+
+ if ($this->fallbackStatus && $this->isSigchildEnabled()) {
+ $this->processInformation = $this->fallbackStatus + $this->processInformation;
+ }
+
+ if (!$running) {
+ $this->close();
+ }
+ }
+
+ /**
+ * Returns whether PHP has been compiled with the '--enable-sigchild' option or not.
+ *
+ * @return bool
+ */
+ protected function isSigchildEnabled()
+ {
+ if (null !== self::$sigchild) {
+ return self::$sigchild;
+ }
+
+ if (!\function_exists('phpinfo')) {
+ return self::$sigchild = false;
+ }
+
+ ob_start();
+ phpinfo(\INFO_GENERAL);
+
+ return self::$sigchild = str_contains(ob_get_clean(), '--enable-sigchild');
+ }
+
+ /**
+ * Reads pipes for the freshest output.
+ *
+ * @param string $caller The name of the method that needs fresh outputs
+ * @param bool $blocking Whether to use blocking calls or not
+ *
+ * @throws LogicException in case output has been disabled or process is not started
+ */
+ private function readPipesForOutput(string $caller, bool $blocking = false)
+ {
+ if ($this->outputDisabled) {
+ throw new LogicException('Output has been disabled.');
+ }
+
+ $this->requireProcessIsStarted($caller);
+
+ $this->updateStatus($blocking);
+ }
+
+ /**
+ * Validates and returns the filtered timeout.
+ *
+ * @throws InvalidArgumentException if the given timeout is a negative number
+ */
+ private function validateTimeout(?float $timeout): ?float
+ {
+ $timeout = (float) $timeout;
+
+ if (0.0 === $timeout) {
+ $timeout = null;
+ } elseif ($timeout < 0) {
+ throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.');
+ }
+
+ return $timeout;
+ }
+
+ /**
+ * Reads pipes, executes callback.
+ *
+ * @param bool $blocking Whether to use blocking calls or not
+ * @param bool $close Whether to close file handles or not
+ */
+ private function readPipes(bool $blocking, bool $close)
+ {
+ $result = $this->processPipes->readAndWrite($blocking, $close);
+
+ $callback = $this->callback;
+ foreach ($result as $type => $data) {
+ if (3 !== $type) {
+ $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data);
+ } elseif (!isset($this->fallbackStatus['signaled'])) {
+ $this->fallbackStatus['exitcode'] = (int) $data;
+ }
+ }
+ }
+
+ /**
+ * Closes process resource, closes file handles, sets the exitcode.
+ *
+ * @return int The exitcode
+ */
+ private function close(): int
+ {
+ $this->processPipes->close();
+ if (\is_resource($this->process)) {
+ proc_close($this->process);
+ }
+ $this->exitcode = $this->processInformation['exitcode'];
+ $this->status = self::STATUS_TERMINATED;
+
+ if (-1 === $this->exitcode) {
+ if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
+ // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
+ $this->exitcode = 128 + $this->processInformation['termsig'];
+ } elseif ($this->isSigchildEnabled()) {
+ $this->processInformation['signaled'] = true;
+ $this->processInformation['termsig'] = -1;
+ }
+ }
+
+ // Free memory from self-reference callback created by buildCallback
+ // Doing so in other contexts like __destruct or by garbage collector is ineffective
+ // Now pipes are closed, so the callback is no longer necessary
+ $this->callback = null;
+
+ return $this->exitcode;
+ }
+
+ /**
+ * Resets data related to the latest run of the process.
+ */
+ private function resetProcessData()
+ {
+ $this->starttime = null;
+ $this->callback = null;
+ $this->exitcode = null;
+ $this->fallbackStatus = [];
+ $this->processInformation = null;
+ $this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+');
+ $this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+');
+ $this->process = null;
+ $this->latestSignal = null;
+ $this->status = self::STATUS_READY;
+ $this->incrementalOutputOffset = 0;
+ $this->incrementalErrorOutputOffset = 0;
+ }
+
+ /**
+ * Sends a POSIX signal to the process.
+ *
+ * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants)
+ * @param bool $throwException Whether to throw exception in case signal failed
+ *
+ * @throws LogicException In case the process is not running
+ * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed
+ * @throws RuntimeException In case of failure
+ */
+ private function doSignal(int $signal, bool $throwException): bool
+ {
+ if (null === $pid = $this->getPid()) {
+ if ($throwException) {
+ throw new LogicException('Cannot send signal on a non running process.');
+ }
+
+ return false;
+ }
+
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode);
+ if ($exitCode && $this->isRunning()) {
+ if ($throwException) {
+ throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output)));
+ }
+
+ return false;
+ }
+ } else {
+ if (!$this->isSigchildEnabled()) {
+ $ok = @proc_terminate($this->process, $signal);
+ } elseif (\function_exists('posix_kill')) {
+ $ok = @posix_kill($pid, $signal);
+ } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) {
+ $ok = false === fgets($pipes[2]);
+ }
+ if (!$ok) {
+ if ($throwException) {
+ throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal));
+ }
+
+ return false;
+ }
+ }
+
+ $this->latestSignal = $signal;
+ $this->fallbackStatus['signaled'] = true;
+ $this->fallbackStatus['exitcode'] = -1;
+ $this->fallbackStatus['termsig'] = $this->latestSignal;
+
+ return true;
+ }
+
+ private function prepareWindowsCommandLine(string $cmd, array &$env): string
+ {
+ $uid = uniqid('', true);
+ $varCount = 0;
+ $varCache = [];
+ $cmd = preg_replace_callback(
+ '/"(?:(
+ [^"%!^]*+
+ (?:
+ (?: !LF! | "(?:\^[%!^])?+" )
+ [^"%!^]*+
+ )++
+ ) | [^"]*+ )"/x',
+ function ($m) use (&$env, &$varCache, &$varCount, $uid) {
+ if (!isset($m[1])) {
+ return $m[0];
+ }
+ if (isset($varCache[$m[0]])) {
+ return $varCache[$m[0]];
+ }
+ if (str_contains($value = $m[1], "\0")) {
+ $value = str_replace("\0", '?', $value);
+ }
+ if (false === strpbrk($value, "\"%!\n")) {
+ return '"'.$value.'"';
+ }
+
+ $value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value);
+ $value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"';
+ $var = $uid.++$varCount;
+
+ $env[$var] = $value;
+
+ return $varCache[$m[0]] = '!'.$var.'!';
+ },
+ $cmd
+ );
+
+ $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')';
+ foreach ($this->processPipes->getFiles() as $offset => $filename) {
+ $cmd .= ' '.$offset.'>"'.$filename.'"';
+ }
+
+ return $cmd;
+ }
+
+ /**
+ * Ensures the process is running or terminated, throws a LogicException if the process has a not started.
+ *
+ * @throws LogicException if the process has not run
+ */
+ private function requireProcessIsStarted(string $functionName)
+ {
+ if (!$this->isStarted()) {
+ throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName));
+ }
+ }
+
+ /**
+ * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated".
+ *
+ * @throws LogicException if the process is not yet terminated
+ */
+ private function requireProcessIsTerminated(string $functionName)
+ {
+ if (!$this->isTerminated()) {
+ throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName));
+ }
+ }
+
+ /**
+ * Escapes a string to be used as a shell argument.
+ */
+ private function escapeArgument(?string $argument): string
+ {
+ if ('' === $argument || null === $argument) {
+ return '""';
+ }
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ return "'".str_replace("'", "'\\''", $argument)."'";
+ }
+ if (str_contains($argument, "\0")) {
+ $argument = str_replace("\0", '?', $argument);
+ }
+ if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) {
+ return $argument;
+ }
+ $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument);
+
+ return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"';
+ }
+
+ private function replacePlaceholders(string $commandline, array $env)
+ {
+ return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) {
+ if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) {
+ throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline);
+ }
+
+ return $this->escapeArgument($env[$matches[1]]);
+ }, $commandline);
+ }
+
+ private function getDefaultEnv(): array
+ {
+ $env = getenv();
+ $env = ('\\' === \DIRECTORY_SEPARATOR ? array_intersect_ukey($env, $_SERVER, 'strcasecmp') : array_intersect_key($env, $_SERVER)) ?: $env;
+
+ return $_ENV + ('\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($env, $_ENV, 'strcasecmp') : $env);
+ }
+}
diff --git a/wp-content/plugins/wp-webauthn/vendor/symfony/process/ProcessUtils.php b/wp-content/plugins/wp-webauthn/vendor/symfony/process/ProcessUtils.php
new file mode 100644
index 00000000..6cc7a610
--- /dev/null
+++ b/wp-content/plugins/wp-webauthn/vendor/symfony/process/ProcessUtils.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Process;
+
+use Symfony\Component\Process\Exception\InvalidArgumentException;
+
+/**
+ * ProcessUtils is a bunch of utility methods.
+ *
+ * This class contains static methods only and is not meant to be instantiated.
+ *
+ * @author Martin Hasoň