\n >\n );\n}\n\nexport default InitTotp;\n","import React from \"react\";\nimport {useDispatch} from \"react-redux\";\n\nimport ModalComponent from \"../modal/ModalComponent\";\nimport { hideModal } from \"../redux/actionCreators\";\n\nconst DeleteDeviceModal = ({title, body, action, id}) => {\n const dispatch = useDispatch();\n\n const close = () => {\n dispatch(hideModal());\n }\n\n const confirm = () => {\n action(id);\n }\n\n return (\n \n {body}\n \n )\n}\n\nexport default DeleteDeviceModal;","export const BucketIcon = () => {\n return (\n \n )\n}\n","import React, {useEffect, useState, useRef} from \"react\";\nimport {useDispatch} from 'react-redux';\n\nimport {deleteDeviceFido} from \"../../redux/actions\";\nimport InitFido from \"./InitFido\";\nimport EditDeviceNameModal from \"./EditDeviceNameModal\";\nimport DeleteDeviceModal from \"../DeleteDeviceModal\";\nimport {dateToLocale} from \"../../utils/utils\";\n\nimport {BucketIcon} from \"../../controls/BucketIcon\"\nimport { hideModal, showModal } from \"../../redux/actionCreators\";\n\nconst RenderFidoKeysList = ({keys}) => {\n const dispatch = useDispatch();\n\n const [list, setList] = useState([]);\n const [visible, setVisible] = useState(false);\n\n const initFidoRef = useRef(null);\n\n useEffect(() => {\n setList(keys);\n setVisible(false);\n }, [keys]);\n\n useEffect(() => {\n if (initFidoRef && initFidoRef.current)\n initFidoRef.current.scrollIntoView({behavior: 'smooth'});\n }, [visible]);\n\n const registerViewToggle = () => {\n setVisible(true);\n }\n\n const deleteDevice = (id) => {\n dispatch(showModal(DeleteDeviceModal, {\n title: 'Удаление устройства FIDO2',\n body: Вы уверены, что хотите удалить FIDO2 устройство?
,\n action: deleteDeviceCredential,\n id: id\n }));\n }\n\n const deleteDeviceCredential = async (id) => {\n dispatch(deleteDeviceFido(id))\n .then((response) => {\n const newKeys = list.filter((item) => item.id !== id);\n setList(newKeys);\n dispatch(hideModal());\n });\n }\n\n const renameDevice = async (id) => {\n dispatch(showModal(EditDeviceNameModal, {isCreate: false, credential: id}));\n }\n\n return (\n \n
Добавленные устройства
\n {list.map((item) =>\n
\n
\n
\n
{item.label}
\n
renameDevice(item.id)}>
\n
\n
\n Последняя активность: \n {dateToLocale(item.lastLogin)}\n
\n
\n Вход без логина и пароля: \n {item.isPasswordLess ? \"Включен\" : \"Выключен\"}\n
\n
\n\n
deleteDevice(item.id)}>\n
deleteDevice(item.id)}>\n \n
\n
\n
\n )}\n {\n !visible &&\n
\n
registerViewToggle()}\n >\n Добавить Рутокен MFA\n
\n
\n }\n {\n visible &&\n
\n \n
\n }\n
\n );\n}\n\n\nexport default RenderFidoKeysList;\n","import React from \"react\";\nimport {useDispatch} from 'react-redux';\n\nimport {removeTotp} from \"../../redux/actions\";\n\nimport DeleteDeviceModal from \"../DeleteDeviceModal\";\nimport {BucketIcon} from \"../../controls/BucketIcon\"\nimport { hideModal, showModal } from \"../../redux/actionCreators\";\n\nconst TotpKeyRow = ({totpkey}) => {\n const dispatch = useDispatch();\n\n const deleteDevice = (id) => {\n dispatch(showModal(DeleteDeviceModal, {\n title: 'Удаление устройства OTP',\n body: Вы уверены, что хотите удалить OTP устройство?
,\n action: removeDevice,\n id: id\n }));\n }\n\n const removeDevice = (totpKey) => {\n dispatch(removeTotp(totpKey))\n .then(() => dispatch(hideModal()))\n }\n \n return (\n \n
Рутокен OTP
\n
deleteDevice(totpkey)}>\n
\n \n
\n
\n
\n );\n}\n\nconst RenderTotpKeysList = ({keys}) => {\n\n return (\n \n
\n {keys.map((el, id) => )}\n
\n
\n )\n}\n\nexport default RenderTotpKeysList;","export const LogoutIcon = () => {\n return (\n \n )\n}\n","import unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nexport default function _createForOfIteratorHelper(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (!it) {\n if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = it.call(o);\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}","class NoSupportPlatformError {\n}\n\nclass NoSupportOsError {\n constructor(supportedOs) {\n this.supportedOs = supportedOs;\n }\n}\n\nclass NoSupportBrowserError {\n constructor(browser, supportedBrowsers) {\n this.browser = browser;\n this.supportedBrowsers = supportedBrowsers;\n }\n}\n\nclass NoInstalledPluginError {\n constructor(browser, os, needExtension = true) {\n this.browser = browser;\n this.os = os;\n this.needExtension = needExtension;\n }\n}\n\nclass NoSupportBrowserVersionError {\n constructor(browser, supportedBrowsers) {\n this.browser = browser;\n this.supportedBrowsers = supportedBrowsers;\n }\n}\n\nclass NoSupportPluginVersionError {\n constructor(os) {\n this.os = os;\n }\n}\n\nexport {\n NoInstalledPluginError,\n NoSupportPlatformError,\n NoSupportOsError,\n NoSupportBrowserError,\n NoSupportBrowserVersionError,\n NoSupportPluginVersionError,\n};\n","const supportedBrowsers = {\n desktop:\n { \n Default:\n {\n },\n Windows:\n {\n 'Internet Explorer': {\n versions: [\n {\n browserSupportedVersions: '>10',\n pluginVersion: '4.3.0.0',\n extensionCheck: false,\n },\n {\n browserSupportedVersions: '>10',\n pluginVersion: '4.2.0.0',\n extensionCheck: false,\n },\n ],\n },\n Opera: {\n versions: [\n {\n browserSupportedVersions: '>15',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>15',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n 'Microsoft Edge': {\n versions: [\n {\n browserSupportedVersions: '>78',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>10',\n pluginVersion: '4.3.0.0',\n extensionCheck: false,\n },\n ],\n },\n Firefox: {\n versions: [\n {\n browserSupportedVersions: '>73',\n pluginVersion: '4.5.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>52',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n Chrome: {\n versions: [\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n Chromium: {\n versions: [\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n 'Yandex Browser': {\n versions: [\n {\n browserSupportedVersions: '>1',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>1',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n SputnikBrowser: {\n versions: [\n {\n browserSupportedVersions: '>3',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>3',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n },\n ],\n },\n Vivaldi: {\n versions: [\n {\n browserSupportedVersions: '>2',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n ],\n },\n },\n macOS:\n {\n Opera: {\n versions: [\n {\n browserSupportedVersions: '>15',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n ],\n },\n Firefox: {\n versions: [\n {\n browserSupportedVersions: '>73',\n pluginVersion: '4.5.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>51',\n pluginVersion: '4.2.0.0',\n extensionCheck: false,\n },\n ],\n },\n Chrome: {\n versions: [\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n ],\n },\n Chromium: {\n versions: [\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n ],\n },\n 'Yandex Browser': {\n versions: [\n {\n browserSupportedVersions: '>1',\n pluginVersion: '4.3.0.0',\n extensionCheck: true,\n },\n ],\n },\n },\n Linux:\n {\n Firefox: {\n versions: [\n {\n browserSupportedVersions: '>73',\n pluginVersion: '4.5.0.0',\n extensionCheck: true,\n },\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.2.0.0',\n extensionCheck: false,\n },\n ],\n },\n Opera: {\n versions: [\n {\n browserSupportedVersions: '>15',\n pluginVersion: '4.3.3.0',\n extensionCheck: true,\n },\n ],\n },\n Chrome: {\n versions: [\n {\n browserSupportedVersions: '>50',\n pluginVersion: '4.3.3.0',\n extensionCheck: true,\n },\n ],\n },\n SputnikBrowser: {\n versions: [\n {\n browserSupportedVersions: '>3',\n pluginVersion: '4.5.0.0',\n extensionCheck: true,\n },\n ],\n },\n Chromium: {\n versions: [\n {\n browserSupportedVersions: '>49',\n pluginVersion: '4.2.0.0',\n extensionCheck: true,\n allowUnknownBrowserVersion: true\n },\n ],\n }, \n 'Yandex Browser': {\n versions: [\n {\n browserSupportedVersions: '>1',\n pluginVersion: '4.5.1.0',\n extensionCheck: true,\n },\n ],\n },\n },\n },\n};\n\nexport default supportedBrowsers;\n","import Bowser from 'bowser';\nimport {\n NoSupportOsError,\n NoSupportPlatformError,\n NoSupportBrowserError,\n NoSupportBrowserVersionError,\n NoSupportPluginVersionError,\n\n} from './supportError';\n\nimport supportedBrowsersConfig from './supportedBrowsersConfig';\n\n\nclass BrowserCompatibility {\n constructor() {\n const detectedBrowser = Bowser.getParser(window.navigator.userAgent);\n\n if (window.navigator.userAgent.includes('SputnikBrowser')) {\n detectedBrowser.parsedResult.browser = {\n name: 'SputnikBrowser',\n version: window.navigator.userAgent.split('SputnikBrowser/')[1].split(' ')[0],\n };\n }\n if (window.navigator.userAgent.includes('Chromium GOST')) {\n detectedBrowser.parsedResult.browser = {\n name: 'Chromium',\n version: window.navigator.userAgent.split('Chrome/')[1].split(' ')[0],\n };\n }\n\n this.detectedBrowser = detectedBrowser;\n\n this.defaultOS = \"Default\";\n this.browser = detectedBrowser.getBrowser();\n this.os = detectedBrowser.getOS();\n this.platform = detectedBrowser.getPlatform();\n }\n\n getBrs() {\n const os = supportedBrowsersConfig[this.platform.type];\n\n if (!os) throw new NoSupportPlatformError();\n\n if (window.navigator.maxTouchPoints > 0 && this.os.name === 'macOS') { //detect ios safari with userAgent as desctop setting\n throw new NoSupportPlatformError();\n }\n\n const browsers = !os[this.os.name] ? os[this.defaultOS] : os[this.os.name];\n\n if (!browsers) throw new NoSupportOsError(Object.keys(os));\n\n const brs = !browsers[this.browser.name] ? os[this.defaultOS][this.browser.name] : browsers[this.browser.name];\n\n if (!brs) throw new NoSupportBrowserError(this.browser.name, Object.keys(browsers));\n\n this.brs = Array.isArray(brs) ? brs : brs.versions;\n\n const detector = this.detectedBrowser;\n const browserName = this.browser.name;\n\n const lastVersion = this.brs.reduce((previous, current) => {\n if (previous.pluginVersion >= current.pluginVersion) {\n if (detector.satisfies({ [browserName]: previous.browserSupportedVersions })) {\n return previous;\n }\n return current;\n }\n return current;\n });\n\n if (this.brs != null && lastVersion != null) {\n this.browserConfigVersion = lastVersion;\n this.brs = [lastVersion];\n } else {\n throw new NoSupportPluginVersionError(this.os.name);\n }\n }\n\n needToCheckInstalledExtension() {\n return this.browserConfigVersion.extensionCheck;\n }\n\n isCurrentBrowserSupported() {\n this.getBrs();\n }\n\n isVersionValid(currentVersion, minVersion) {\n const splitVersions = (val) => val.replace(/[^0-9.]/g, '').split('.').map(Number);\n\n const current = splitVersions(currentVersion);\n const minimum = splitVersions(minVersion);\n\n for (let i = 0; i < Math.max(current.length, minimum.length); i++) {\n const curr = current[i] || 0, min = minimum[i] || 0;\n if (curr != min) {\n return curr > min;\n } \n }\n\n return true;\n }\n\n getSupportedBrowsersByPluginVersion(version) {\n const versions = this.brs;\n\n for (let index = 0; index < versions.length; index += 1) {\n const x = versions[index];\n\n if (this.isVersionValid(version, x.pluginVersion)) {\n const brs = { [this.browser.name]: x.browserSupportedVersions };\n\n const isValid = this.detectedBrowser.satisfies(brs);\n\n if (isValid) return;\n if(!this.browser.version && x.allowUnknownBrowserVersion) return;\n if (index != versions.length - 1) continue;\n\n const os = supportedBrowsersConfig[this.platform.type];\n\n const browsers = os[this.os.name];\n\n throw new NoSupportBrowserVersionError(this.browser, Object.keys(browsers));\n }\n }\n\n throw new NoSupportPluginVersionError(this.os.name);\n }\n}\n\nexport default BrowserCompatibility;\n","/* eslint max-len: [\"error\", { \"ignoreStrings\": true }] */\r\nconst getErrorCodes = (errorCodes) => ({\r\n 'DEFAULT_ERROR': 'Произошла ошибка',\r\n [errorCodes.UNKNOWN_ERROR]: 'Неизвестная ошибка',\r\n [errorCodes.BAD_PARAMS]: 'Неправильные параметры',\r\n [errorCodes.NOT_ENOUGH_MEMORY]: 'Недостаточно памяти',\r\n [errorCodes.DEVICE_NOT_FOUND]: 'Устройство не найдено',\r\n [errorCodes.DEVICE_ERROR]: 'Ошибка устройства',\r\n [errorCodes.TOKEN_INVALID]: 'Ошибка чтения/записи устройства. Возможно, устройство было извлечено. Попробуйте перезагрузить страницу',\r\n [errorCodes.CERTIFICATE_CATEGORY_BAD]: 'Недопустимый тип сертификата',\r\n [errorCodes.CERTIFICATE_EXISTS]: 'Сертификат уже существует на устройстве',\r\n [errorCodes.CERTIFICATE_NOT_FOUND]: 'Сертификат не найден',\r\n [errorCodes.CERTIFICATE_HASH_NOT_UNIQUE]: 'Хэш сертификата не уникален',\r\n [errorCodes.CA_CERTIFICATES_NOT_FOUND]: 'Корневые сертификаты не найдены',\r\n [errorCodes.CERTIFICATE_VERIFICATION_ERROR]: 'Ошибка проверки сертификата',\r\n [errorCodes.PKCS11_LOAD_FAILED]: 'Не удалось загрузить PKCS#11 библиотеку',\r\n [errorCodes.PIN_LENGTH_INVALID]: 'Некорректная длина PIN-кода',\r\n [errorCodes.PIN_INCORRECT]: 'Неверный текущий PIN-код',\r\n [errorCodes.PIN_LOCKED]: 'PIN-код заблокирован',\r\n [errorCodes.PIN_CHANGED]: 'PIN-код был изменен',\r\n [errorCodes.SESSION_INVALID]: 'Состояние токена изменилось',\r\n [errorCodes.USER_NOT_LOGGED_IN]: 'Выполните вход на устройство',\r\n [errorCodes.ALREADY_LOGGED_IN]: 'Вход на устройство уже был выполнен',\r\n [errorCodes.ATTRIBUTE_READ_ONLY]: 'Свойство не может быть изменено',\r\n [errorCodes.KEY_NOT_FOUND]: 'Соответствующая сертификату ключевая пара не найдена',\r\n [errorCodes.KEY_ID_NOT_UNIQUE]: 'Идентификатор ключевой пары не уникален',\r\n [errorCodes.CEK_NOT_AUTHENTIC]: 'Выбран неправильный ключ',\r\n [errorCodes.KEY_LABEL_NOT_UNIQUE]: 'Метка ключевой пары не уникальна',\r\n [errorCodes.WRONG_KEY_TYPE]: 'Неправильный тип ключа',\r\n [errorCodes.LICENCE_READ_ONLY]: 'Лицензия доступна только для чтения',\r\n [errorCodes.DATA_INVALID]: 'Неверные данные',\r\n [errorCodes.UNSUPPORTED_BY_TOKEN]: 'Операция не поддерживается токеном',\r\n [errorCodes.KEY_FUNCTION_NOT_PERMITTED]: 'Операция запрещена для данного типа ключа',\r\n [errorCodes.BASE64_DECODE_FAILED]: 'Ошибка декодирования даных из BASE64',\r\n [errorCodes.PEM_ERROR]: 'Ошибка разбора PEM',\r\n [errorCodes.ASN1_ERROR]: 'Ошибка декодирования ASN1 структуры',\r\n [errorCodes.FUNCTION_REJECTED]: 'Операция отклонена пользователем',\r\n [errorCodes.FUNCTION_FAILED]: 'Невозможно выполнить операцию',\r\n [errorCodes.MECHANISM_INVALID]: 'Указан неправильный механизм',\r\n [errorCodes.ATTRIBUTE_VALUE_INVALID]: 'Передан неверный атрибут',\r\n [errorCodes.X509_UNABLE_TO_GET_ISSUER_CERT]: 'Невозможно получить сертификат подписанта',\r\n [errorCodes.X509_UNABLE_TO_GET_CRL]: 'Невозможно получить CRL',\r\n [errorCodes.X509_UNABLE_TO_DECRYPT_CERT_SIGNATURE]: 'Невозможно расшифровать подпись сертификата',\r\n [errorCodes.X509_UNABLE_TO_DECRYPT_CRL_SIGNATURE]: 'Невозможно расшифровать подпись CRL',\r\n [errorCodes.X509_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY]: 'Невозможно раскодировать открытый ключ эмитента',\r\n [errorCodes.X509_CERT_SIGNATURE_FAILURE]: 'Неверная подпись сертификата',\r\n [errorCodes.X509_CRL_SIGNATURE_FAILURE]: 'Неверная подпись CRL',\r\n [errorCodes.X509_CERT_NOT_YET_VALID]: 'Срок действия сертификата еще не начался',\r\n [errorCodes.X509_CRL_NOT_YET_VALID]: 'Срок действия CRL еще не начался',\r\n [errorCodes.X509_CERT_HAS_EXPIRED]: 'Срок действия сертификата истек',\r\n [errorCodes.X509_CRL_HAS_EXPIRED]: 'Срок действия CRL истек',\r\n [errorCodes.X509_ERROR_IN_CERT_NOT_BEFORE_FIELD]: 'Некорректные данные в поле \\'notBefore\\' у сертификата',\r\n [errorCodes.X509_ERROR_IN_CERT_NOT_AFTER_FIELD]: 'Некорректные данные в поле \\'notAfter\\' у сертификата',\r\n [errorCodes.X509_ERROR_IN_CRL_LAST_UPDATE_FIELD]: 'Некорректные данные в поле \\'lastUpdate\\' у CRL',\r\n [errorCodes.X509_ERROR_IN_CRL_NEXT_UPDATE_FIELD]: 'Некорректные данные в поле \\'nextUpdate\\' у CRL',\r\n [errorCodes.X509_OUT_OF_MEM]: 'Нехватает памяти',\r\n [errorCodes.X509_DEPTH_ZERO_SELF_SIGNED_CERT]: 'Недоверенный самоподписанный сертификат',\r\n [errorCodes.X509_SELF_SIGNED_CERT_IN_CHAIN]: 'В цепочке обнаружен недоверенный самоподписанный сертификат',\r\n [errorCodes.X509_UNABLE_TO_GET_ISSUER_CERT_LOCALLY]: 'Невозможно получить локальный сертификат подписанта',\r\n [errorCodes.X509_UNABLE_TO_VERIFY_LEAF_SIGNATURE]: 'Невозможно проверить первый сертификат',\r\n [errorCodes.X509_CERT_CHAIN_TOO_LONG]: 'Слишком длинная цепочка сертификатов',\r\n [errorCodes.X509_CERT_REVOKED]: 'Сертификат отозван',\r\n [errorCodes.X509_INVALID_CA]: 'Неверный корневой сертификат',\r\n [errorCodes.X509_INVALID_NON_CA]: 'Неверный некорневой сертфикат, помеченный как корневой',\r\n [errorCodes.X509_PATH_LENGTH_EXCEEDED]: 'Превышена длина пути',\r\n [errorCodes.X509_PROXY_PATH_LENGTH_EXCEEDED]: 'Превышина длина пути прокси',\r\n [errorCodes.X509_PROXY_CERTIFICATES_NOT_ALLOWED]: 'Проксирующие сертификаты недопустимы',\r\n [errorCodes.X509_INVALID_PURPOSE]: 'Неподдерживаемое назначение сертификата',\r\n [errorCodes.X509_CERT_UNTRUSTED]: 'Недоверенный сертификат',\r\n [errorCodes.X509_CERT_REJECTED]: 'Сертифкат отклонен',\r\n [errorCodes.X509_APPLICATION_VERIFICATION]: 'Ошибка проверки приложения',\r\n [errorCodes.X509_SUBJECT_ISSUER_MISMATCH]: 'Несовпадения субьекта и эмитента',\r\n [errorCodes.X509_AKID_SKID_MISMATCH]: 'Несовпадение идентификатора ключа у субьекта и доверенного центра',\r\n [errorCodes.X509_AKID_ISSUER_SERIAL_MISMATCH]: 'Несовпадение серийного номера субьекта и доверенного центра',\r\n [errorCodes.X509_KEYUSAGE_NO_CERTSIGN]: 'Ключ не может быть использован для подписи сертификатов',\r\n [errorCodes.X509_UNABLE_TO_GET_CRL_ISSUER]: 'Невозможно получить CRL подписанта',\r\n [errorCodes.X509_UNHANDLED_CRITICAL_EXTENSION]: 'Неподдерживаемое расширение',\r\n [errorCodes.X509_KEYUSAGE_NO_CRL_SIGN]: 'Ключ не может быть использован для подписи CRL',\r\n [errorCodes.X509_KEYUSAGE_NO_DIGITAL_SIGNATURE]: 'Ключ не может быть использован для цифровой подписи',\r\n [errorCodes.X509_UNHANDLED_CRITICAL_CRL_EXTENSION]: 'Неподдерживаемое расширение CRL',\r\n [errorCodes.X509_INVALID_EXTENSION]: 'Неверное или некорректное расширение сертификата',\r\n [errorCodes.X509_INVALID_POLICY_EXTENSION]: 'Неверное или некорректное расширение политик сертификата',\r\n [errorCodes.X509_NO_EXPLICIT_POLICY]: 'Явные политики отсутствуют',\r\n [errorCodes.X509_DIFFERENT_CRL_SCOPE]: 'Другая область CRL',\r\n [errorCodes.X509_UNSUPPORTED_EXTENSION_FEATURE]: 'Неподдерживаемое расширение возможностей',\r\n [errorCodes.X509_UNNESTED_RESOURCE]: 'RFC 3779 неправильное наследование ресурсов',\r\n [errorCodes.X509_PERMITTED_VIOLATION]: 'Неправильная структура сертифката',\r\n [errorCodes.X509_EXCLUDED_VIOLATION]: 'Неправильная структура сертфиката',\r\n [errorCodes.X509_SUBTREE_MINMAX]: 'Неправильная структура сертифката',\r\n [errorCodes.X509_UNSUPPORTED_CONSTRAINT_TYPE]: 'Неправильная структура сертфиката',\r\n [errorCodes.X509_UNSUPPORTED_CONSTRAINT_SYNTAX]: 'Неправильная структура сертифката',\r\n [errorCodes.X509_UNSUPPORTED_NAME_SYNTAX]: 'Неправильная структура сертфиката',\r\n [errorCodes.X509_CRL_PATH_VALIDATION_ERROR]: 'Неправильный путь CRL',\r\n [errorCodes.CMS_CERTIFICATE_ALREADY_PRESENT]: 'Сертификат уже используется',\r\n [errorCodes.CANT_HARDWARE_VERIFY_CMS]: 'Проверка множественной подписи с вычислением хеша на устройстве не поддерживается',\r\n});\r\n\r\nexport default getErrorCodes;\r\n","/* eslint max-len: [\"error\", { \"ignoreStrings\": true }] */\r\nconst getErrorCodes = (errorCodes) => ({\r\n 'DEFAULT_ERROR': 'An error has occurred',\r\n [errorCodes.UNKNOWN_ERROR]: 'Unknown error',\r\n [errorCodes.BAD_PARAMS]: 'Wrong parameters',\r\n [errorCodes.NOT_ENOUGH_MEMORY]: 'Low memory',\r\n [errorCodes.DEVICE_NOT_FOUND]: 'Device not found',\r\n [errorCodes.DEVICE_ERROR]: 'Device error',\r\n [errorCodes.TOKEN_INVALID]: 'Device read/write error. Device may have been removed. Try refreshing the page ',\r\n [errorCodes.CERTIFICATE_CATEGORY_BAD]: 'Invalid certificate type',\r\n [errorCodes.CERTIFICATE_EXISTS]: 'Certificate already exists on the device',\r\n [errorCodes.CERTIFICATE_NOT_FOUND]: 'Certificate not found',\r\n [errorCodes.CERTIFICATE_HASH_NOT_UNIQUE]: 'Certificate hash not unique',\r\n [errorCodes.CA_CERTIFICATES_NOT_FOUND]: 'Root certificates not found',\r\n [errorCodes.CERTIFICATE_VERIFICATION_ERROR]: 'Certificate verification error',\r\n [errorCodes.PKCS11_LOAD_FAILED]: 'PKCS#11 library load failed',\r\n [errorCodes.PIN_LENGTH_INVALID]: 'PIN length invalid',\r\n [errorCodes.PIN_INCORRECT]: 'Current PIN incorrect',\r\n [errorCodes.PIN_LOCKED]: 'PIN locked',\r\n [errorCodes.PIN_CHANGED]: 'PIN changed',\r\n [errorCodes.SESSION_INVALID]: 'Token state changed',\r\n [errorCodes.USER_NOT_LOGGED_IN]: 'Please log in to the device',\r\n [errorCodes.ALREADY_LOGGED_IN]: 'You are already logged in',\r\n [errorCodes.ATTRIBUTE_READ_ONLY]: 'Attribute cannot be changed',\r\n [errorCodes.KEY_NOT_FOUND]: 'No key pair found for the certificate',\r\n [errorCodes.KEY_ID_NOT_UNIQUE]: 'Key pair ID not unique',\r\n [errorCodes.CEK_NOT_AUTHENTIC]: 'Wrong key selected',\r\n [errorCodes.KEY_LABEL_NOT_UNIQUE]: 'Key pair label not unique',\r\n [errorCodes.WRONG_KEY_TYPE]: 'Wrong key type',\r\n [errorCodes.LICENCE_READ_ONLY]: 'Licence read only',\r\n [errorCodes.DATA_INVALID]: 'Data invalid',\r\n [errorCodes.UNSUPPORTED_BY_TOKEN]: 'Operation not supported by token',\r\n [errorCodes.KEY_FUNCTION_NOT_PERMITTED]: 'Operation not permitted for this key type',\r\n [errorCodes.BASE64_DECODE_FAILED]: 'Base64 data decoding error',\r\n [errorCodes.PEM_ERROR]: 'PEM error',\r\n [errorCodes.ASN1_ERROR]: 'ASN1 structure decoding error',\r\n [errorCodes.FUNCTION_REJECTED]: 'Operation rejected by user',\r\n [errorCodes.FUNCTION_FAILED]: 'Operation failed',\r\n [errorCodes.MECHANISM_INVALID]: 'Mechanism invalid',\r\n [errorCodes.ATTRIBUTE_VALUE_INVALID]: 'Attribute invalid',\r\n [errorCodes.X509_UNABLE_TO_GET_ISSUER_CERT]: 'Unable to get issuer certificate',\r\n [errorCodes.X509_UNABLE_TO_GET_CRL]: 'Unable to get CRL',\r\n [errorCodes.X509_UNABLE_TO_DECRYPT_CERT_SIGNATURE]: 'Unable to decrypt certificate signature',\r\n [errorCodes.X509_UNABLE_TO_DECRYPT_CRL_SIGNATURE]: 'Unable to decrypt CRL signature',\r\n [errorCodes.X509_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY]: 'Unable to decode issuer public key',\r\n [errorCodes.X509_CERT_SIGNATURE_FAILURE]: 'Wrong certificate signature',\r\n [errorCodes.X509_CRL_SIGNATURE_FAILURE]: 'Wrong CRL signature',\r\n [errorCodes.X509_CERT_NOT_YET_VALID]: 'Certificate not yet valid',\r\n [errorCodes.X509_CRL_NOT_YET_VALID]: 'CRL not yet valid',\r\n [errorCodes.X509_CERT_HAS_EXPIRED]: 'Certificate has expired',\r\n [errorCodes.X509_CRL_HAS_EXPIRED]: 'CRL has expired',\r\n [errorCodes.X509_ERROR_IN_CERT_NOT_BEFORE_FIELD]: 'Error in certificate \\'notBefore\\' field',\r\n [errorCodes.X509_ERROR_IN_CERT_NOT_AFTER_FIELD]: 'Error in certificate \\'notAfter\\' field',\r\n [errorCodes.X509_ERROR_IN_CRL_LAST_UPDATE_FIELD]: 'Error in CRL \\'lastUpdate\\' field',\r\n [errorCodes.X509_ERROR_IN_CRL_NEXT_UPDATE_FIELD]: 'Error in CRL \\'nextUpdate\\' field',\r\n [errorCodes.X509_OUT_OF_MEM]: 'Not enough memory',\r\n [errorCodes.X509_DEPTH_ZERO_SELF_SIGNED_CERT]: 'Untrusted self-signed certificate',\r\n [errorCodes.X509_SELF_SIGNED_CERT_IN_CHAIN]: 'Untrusted self-signed certificate found in chain',\r\n [errorCodes.X509_UNABLE_TO_GET_ISSUER_CERT_LOCALLY]: 'Unable to get issuer local certificate',\r\n [errorCodes.X509_UNABLE_TO_VERIFY_LEAF_SIGNATURE]: 'Unable to verify first certificate',\r\n [errorCodes.X509_CERT_CHAIN_TOO_LONG]: 'Certificate chain too long',\r\n [errorCodes.X509_CERT_REVOKED]: 'Certificate revoked',\r\n [errorCodes.X509_INVALID_CA]: 'Invalid root certificate',\r\n [errorCodes.X509_INVALID_NON_CA]: 'Invalid non-root certificate labelled as root certificate',\r\n [errorCodes.X509_PATH_LENGTH_EXCEEDED]: 'Path length exceeded',\r\n [errorCodes.X509_PROXY_PATH_LENGTH_EXCEEDED]: 'Proxy path length exceeded',\r\n [errorCodes.X509_PROXY_CERTIFICATES_NOT_ALLOWED]: 'Proxy certificates not allowed',\r\n [errorCodes.X509_INVALID_PURPOSE]: 'Invalid certificate purpose',\r\n [errorCodes.X509_CERT_UNTRUSTED]: 'Certificate untrusted',\r\n [errorCodes.X509_CERT_REJECTED]: 'Certificate rejected',\r\n [errorCodes.X509_APPLICATION_VERIFICATION]: 'Application verification failed',\r\n [errorCodes.X509_SUBJECT_ISSUER_MISMATCH]: 'Subject and Issuer mismatch',\r\n [errorCodes.X509_AKID_SKID_MISMATCH]: 'Mismatch between key identifier of the subject and trusted authority ',\r\n [errorCodes.X509_AKID_ISSUER_SERIAL_MISMATCH]: 'Mismatch between serial number of the subject and trusted authority ',\r\n [errorCodes.X509_KEYUSAGE_NO_CERTSIGN]: 'Key cannot be used for certificate signature',\r\n [errorCodes.X509_UNABLE_TO_GET_CRL_ISSUER]: 'Unable to get issuer CRL',\r\n [errorCodes.X509_UNHANDLED_CRITICAL_EXTENSION]: 'Extension not supported',\r\n [errorCodes.X509_KEYUSAGE_NO_CRL_SIGN]: 'Key cannot be used for CRL signature',\r\n [errorCodes.X509_KEYUSAGE_NO_DIGITAL_SIGNATURE]: 'Key cannot be used for digital signature',\r\n [errorCodes.X509_UNHANDLED_CRITICAL_CRL_EXTENSION]: 'CRL extension not supported',\r\n [errorCodes.X509_INVALID_EXTENSION]: 'Invalid or incorrect certificate extension',\r\n [errorCodes.X509_INVALID_POLICY_EXTENSION]: 'Invalid or incorrect certificate policy extension',\r\n [errorCodes.X509_NO_EXPLICIT_POLICY]: 'No explicit policy',\r\n [errorCodes.X509_DIFFERENT_CRL_SCOPE]: 'Different CRL scope',\r\n [errorCodes.X509_UNSUPPORTED_EXTENSION_FEATURE]: 'Unsupported extension',\r\n [errorCodes.X509_UNNESTED_RESOURCE]: 'RFC 3779 incorrect resource inheritance ',\r\n [errorCodes.X509_PERMITTED_VIOLATION]: 'Wrong certificate structure',\r\n [errorCodes.X509_EXCLUDED_VIOLATION]: 'Wrong certificate structure',\r\n [errorCodes.X509_SUBTREE_MINMAX]: 'Wrong certificate structure',\r\n [errorCodes.X509_UNSUPPORTED_CONSTRAINT_TYPE]: 'Wrong certificate structure',\r\n [errorCodes.X509_UNSUPPORTED_CONSTRAINT_SYNTAX]: 'Wrong certificate structure',\r\n [errorCodes.X509_UNSUPPORTED_NAME_SYNTAX]: 'Wrong certificate structure',\r\n [errorCodes.X509_CRL_PATH_VALIDATION_ERROR]: 'Wrong CRL path',\r\n [errorCodes.CMS_CERTIFICATE_ALREADY_PRESENT]: 'Certificate already in use',\r\n [errorCodes.CANT_HARDWARE_VERIFY_CMS]: 'Multiple signature verification with hash computation is not supported on the device',\r\n});\r\n\r\nexport default getErrorCodes;\r\n","class PluginError {\r\n constructor(err, method, errorCodes) {\r\n /* eslint-disable no-restricted-globals */\r\n let code = null;\r\n if (err.message) {\r\n code = Number(err.message);\r\n } else {\r\n code = Number(err);\r\n }\r\n\r\n if (errorCodes[code]) {\r\n this.description = errorCodes[code];\r\n this.code = code;\r\n } else {\r\n this.description = errorCodes.DEFAULT_ERROR;\r\n this.code = null;\r\n }\r\n\r\n this.method = method;\r\n }\r\n}\r\n\r\nexport default PluginError;\r\n","import getErrorCodesRussian from './errorCodes/ru';\r\nimport getErrorCodesEnglish from './errorCodes/en';\r\nimport PluginError from './pluginError';\r\n\r\n/* eslint-disable prefer-rest-params */\r\nfunction bindMethods(plugin) {\r\n const ru = getErrorCodesRussian(plugin.errorCodes);\r\n const en = getErrorCodesEnglish(plugin.errorCodes);\r\n\r\n const getCurrentErrorCodes = () => (this.locale === 'en'\r\n ? en\r\n : ru);\r\n\r\n Object.keys(plugin).forEach((key) => {\r\n if (plugin[key].prototype !== undefined) {\r\n /* eslint func-names: [\"error\", \"never\"] */\r\n this[key] = function () {\r\n return Promise.resolve().then(() => plugin[key].apply(this, arguments))\r\n .catch((err) => {\r\n throw new PluginError(err, key, getCurrentErrorCodes());\r\n });\r\n };\r\n } else {\r\n this[key] = plugin[key];\r\n }\r\n });\r\n\r\n this.translateErrorByCode = (code) => {\r\n const locale = getCurrentErrorCodes();\r\n\r\n return locale[code];\r\n };\r\n}\r\n\r\nexport default bindMethods;\r\n","\nfunction bindAlgorithms(plugin) {\n const hashAlgorithms = {};\n\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_94] = {\n name: 'HASH_TYPE_GOST3411_94',\n text: 'ГОСТ Р 34.11-94',\n value: plugin.HASH_TYPE_GOST3411_94,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_12_256] = {\n name: 'HASH_TYPE_GOST3411_12_256',\n text: 'ГОСТ Р 34.11-12 256',\n value: plugin.HASH_TYPE_GOST3411_12_256,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_12_512] = {\n name: 'HASH_TYPE_GOST3411_12_512',\n text: 'ГОСТ Р 34.11-12 512',\n value: plugin.HASH_TYPE_GOST3411_12_512,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_MD5] = {\n name: 'HASH_TYPE_MD5',\n text: 'MD5',\n value: plugin.HASH_TYPE_MD5,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_SHA1] = {\n name: 'HASH_TYPE_SHA1',\n text: 'SHA1',\n value: plugin.HASH_TYPE_SHA1,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_SHA256] = {\n name: 'HASH_TYPE_SHA256',\n text: 'SHA256',\n value: plugin.HASH_TYPE_SHA256,\n };\n\n hashAlgorithms[plugin.HASH_TYPE_SHA512] = {\n name: 'HASH_TYPE_SHA512',\n text: 'SHA512',\n value: plugin.HASH_TYPE_SHA512,\n };\n\n\n const keyAlgorithms = {};\n\n keyAlgorithms[plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_256] = {\n name: 'PUBLIC_KEY_ALGORITHM_GOST3410_2012_256',\n text: 'ГОСТ Р 34.10-2012 256-бит',\n value: plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_256,\n additional: 'используется в ЕГАИС',\n paramset: 'A',\n signatureSize: 512,\n hash: [\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_12_256],\n ],\n };\n\n keyAlgorithms[plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_512] = {\n name: 'PUBLIC_KEY_ALGORITHM_GOST3410_2012_512',\n text: 'ГОСТ Р 34.10-2012 512-бит',\n value: plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_512,\n paramset: 'A',\n signatureSize: 1024,\n hash: [\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_12_512],\n ],\n };\n\n keyAlgorithms[plugin.PUBLIC_KEY_ALGORITHM_RSA] = {\n name: 'PUBLIC_KEY_ALGORITHM_RSA',\n text: 'RSA',\n value: plugin.PUBLIC_KEY_ALGORITHM_RSA,\n signatureSize: 2048,\n hash: [\n hashAlgorithms[plugin.HASH_TYPE_MD5],\n hashAlgorithms[plugin.HASH_TYPE_SHA1],\n hashAlgorithms[plugin.HASH_TYPE_SHA256],\n hashAlgorithms[plugin.HASH_TYPE_SHA512],\n ],\n };\n\n keyAlgorithms[plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2001] = {\n name: 'PUBLIC_KEY_ALGORITHM_GOST3410_2001',\n text: 'ГОСТ Р 34.10-2001',\n value: plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2001,\n additional: 'выводится из эксплуатации',\n paramset: 'A',\n signatureSize: 512,\n hash: [\n hashAlgorithms[plugin.HASH_TYPE_GOST3411_94],\n ],\n };\n\n this.keyAlgorithms = keyAlgorithms;\n}\n\nexport default bindAlgorithms;\n","import rutoken from '@aktivco/rutoken-plugin';\nimport BrowserCompatibility from './browserCompatibility';\nimport bindMethods from './bindMethods';\nimport bindAlgorithms from './bindAlgorithms';\n\n\nimport { NoInstalledPluginError } from './supportError';\n\nclass Plugin {\n init(locale = null) {\n const browserCompatibility = new BrowserCompatibility();\n\n return rutoken.ready\n .then(() => browserCompatibility.isCurrentBrowserSupported())\n .then(() => browserCompatibility.needToCheckInstalledExtension())\n .then((result) => (result ? rutoken.isExtensionInstalled() : true))\n .then((result) => {\n if (result) {\n return rutoken.isPluginInstalled();\n }\n throw new NoInstalledPluginError(browserCompatibility.browser, browserCompatibility.os);\n })\n .then((result) => {\n if (result) {\n return rutoken.loadPlugin();\n }\n\n throw new NoInstalledPluginError(browserCompatibility.browser, browserCompatibility.os, false);\n })\n .then((pluginObject) => {\n browserCompatibility.getSupportedBrowsersByPluginVersion(pluginObject.version);\n\n bindMethods.bind(this)(pluginObject);\n bindAlgorithms.bind(this)(pluginObject);\n this.setLocale(locale);\n\n return Promise.resolve(this);\n })\n .catch((err) => {\n throw err;\n });\n }\n\n setLocale(locale) {\n this.locale = locale;\n }\n \n getPlatformType() {\n const browserCompatibility = this.getBrowserCompatibility();\n\n return browserCompatibility.platform.type;\n }\n\n getBrowserCompatibility() {\n const browserCompatibility = new BrowserCompatibility();\n\n // detect ios safari with userAgent as desctop setting\n // https://stackoverflow.com/a/58064481/9811165\n if (window.navigator.maxTouchPoints > 0 && browserCompatibility.os.name === 'macOS') {\n //max mobile Ios width (iPhone 12 Pro) 1170px\n browserCompatibility.platform.type = window.screen.width <= 1170 ? \"mobile\" : \"tablet\";\n }\n\n return browserCompatibility;\n }\n}\n\nexport default new Plugin();\n","import Plugin from '@aktivco-it/rutoken-plugin-bootstrap/src/index';\nimport {\n setPluginLoadError,\n setPluginLoadSuccess,\n setPluginLoadStart,\n setLoginState,\n setPkiAuthData,\n setPluginOperationStart,\n setPluginOperationSuccess,\n setPluginOperationError,\n setPluginDevicesLoadSuccess\n} from '../actionCreators';\nimport axios from 'axios';\nimport { getUserInfo } from '.';\nimport { getRutokenModelName } from '../../utils/getRutokenModelName';\n\nconst hexToBigIntString = (hexString) => {\n const hex = hexString.replaceAll(':', '');\n if (hex.length % 2) { hex = '0' + hex; }\n\n const bn = BigInt('0x' + hex);\n\n return bn.toString(10);\n}\n\nexport const loadPlugin = (rethrow = true) => {\n return (dispatch, getState) => {\n const plugin = getState().plugin.instance;\n if (plugin) return Promise.resolve(plugin);\n\n dispatch(setPluginLoadStart());\n return (Plugin.init()\n .then((plugin) => {\n dispatch(setPluginLoadSuccess(plugin));\n return plugin;\n })\n .catch((error) => {\n dispatch(setPluginLoadError(error));\n if (rethrow) throw error;\n }));\n }\n};\n\nexport const getPkiDevices = () => {\n return (dispatch) => {\n dispatch(setPluginOperationStart());\n\n return dispatch(loadPlugin())\n .then((plugin) => {\n const tokenInfos = [\n plugin.TOKEN_INFO_SERIAL,\n plugin.TOKEN_INFO_SUPPORTED_MECHANISMS,\n plugin.TOKEN_INFO_FEATURES,\n plugin.TOKEN_INFO_SPEED,\n Plugin.TOKEN_INFO_PINS_INFO,\n ];\n\n return plugin.enumerateDevices()\n .then((deviceIds) => Promise.all(deviceIds.map((deviceId) => {\n return Promise.all(tokenInfos.map(tokenInfo => plugin.getDeviceInfo(deviceId, tokenInfo)))\n .then((tokenInfos) => {\n const device = {\n deviceId: deviceId,\n serial: tokenInfos[0],\n mechanisms: tokenInfos[1],\n features: tokenInfos[2],\n speed: tokenInfos[3],\n isPinCached: tokenInfos[4].isPinCached\n };\n\n const modelInfo = getRutokenModelName(device, plugin);\n return {...device, ...modelInfo }; \n })\n .then((device) => {\n return plugin.enumerateCertificates(device.deviceId, plugin.CERT_CATEGORY_USER)\n .then((certIds) => {\n return Promise.all(certIds.map((certId) =>\n plugin.parseCertificate(deviceId, certId)\n .then((certificate) => {\n return {\n ...certificate,\n certId: certId,\n serial: hexToBigIntString(certificate.serialNumber),\n subjectProp: Object.assign({}, ...certificate.subject.map(is => ({ [is.rdn]: is.value }))),\n }\n })\n ))\n })\n .then((certs) => ({ ...device, certs }))\n })\n })\n ))\n .then(devices => {\n const serialNumbers = devices.map(device => device.certs.map(cert => cert.serial)).flat(1);\n return axios.post('/pki/certs', serialNumbers)\n .then(({ data: dbCerts }) => {\n return devices.map(device => ({\n ...device, \n certs: device.certs\n .filter(cert => dbCerts.hasOwnProperty(cert.serial))\n .map(cert => ({\n ...cert,\n lastLoginDate: dbCerts[cert.serial]\n }))\n .toSorted((a, b) => new Date(b.lastLoginDate) - new Date(a.lastLoginDate))\n }))\n })\n })\n .then((devices) => dispatch(setPluginDevicesLoadSuccess(devices)))\n })\n .catch((error) => dispatch(setPluginOperationError(error)));\n }\n};\n\nexport const loginByCert = () => {\n return (dispatch, getState) => {\n dispatch(setPluginOperationStart());\n const { deviceId, certId } = getState().pkiAuthData;\n\n return dispatch(loadPlugin())\n .then((plugin) => {\n return axios.get('/pki/random')\n .then(({data: random}) => {\n const options = {\n detached: false,\n addUserCertificate: true,\n useHardwareHash: false,\n };\n \n return plugin.sign(deviceId, certId, random, plugin.DATA_FORMAT_PLAIN, options);\n })\n .then(cms => axios.post('/pki/login', {cms} ))\n .then(() => dispatch(setLoginState(true)))\n .then(() => dispatch(setPluginOperationSuccess()))\n .catch((error) => dispatch(setPluginOperationError(error)));\n })\n }\n};\n\nexport const bindPki = (onSuccess) => {\n return (dispatch, getState) => {\n dispatch(setPluginOperationStart());\n const { deviceId } = getState().pkiAuthData;\n const { userName } = getState().userInfo;\n\n return dispatch(loadPlugin())\n .then((plugin) => {\n const date = new Date();\n\n const [year, month, day] = [\n ('0' + date.getFullYear()).slice(-2),\n ('0' + date.getMonth() + 1).slice(-2),\n ('0' + date.getDate()).slice(-2),\n ];\n \n const [hour, minutes, seconds, milliseconds] = [\n ('0' + date.getHours()).slice(-2),\n ('0' + date.getMinutes()).slice(-2),\n ('0' + date.getSeconds()).slice(-2),\n ('00' + date.getMilliseconds()).slice(-3),\n ];\n \n const name = `DemoAuth${year}${month}${day}${hour}${minutes}${seconds}${milliseconds}`;\n \n const id = name.split('').map((x) => x.charCodeAt(0).toString(16)).join(':');\n\n const options = {\n id: id,\n publicKeyAlgorithm: plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_256,\n signatureSize: 512,\n paramset: 'A',\n keyType: plugin.KEY_TYPE_COMMON,\n };\n\n return plugin.generateKeyPair(deviceId, undefined, '', options)\n .then((keyId) => {\n const subject = [\n {\n rdn: 'commonName',\n value: userName,\n },\n ];\n \n const extensions = {\n keyUsage: [\n 'digitalSignature',\n 'nonRepudiation',\n ]\n };\n \n const options = {\n \"hashAlgorithm\": plugin.HASH_TYPE_GOST3411_12_256,\n };\n \n return plugin.createPkcs10(deviceId, keyId, subject, extensions, options);\n })\n .then((pkcs10Request) => axios.post('/pki/register', { pem: pkcs10Request }))\n .then((resp) => plugin.importCertificate(deviceId, resp.data, plugin.CERT_CATEGORY_USER))\n .then((certId) => dispatch(setPkiAuthData(deviceId, certId)))\n .then(() => dispatch(loginByCert()))\n .then(() => dispatch(getUserInfo()))\n .then(() => dispatch(setPluginOperationSuccess()))\n .then(() => dispatch(getPkiDevices()))\n .then(onSuccess);\n })\n .catch((error) => dispatch(setPluginOperationError(error)));\n }\n};\n\nexport const deletePki = (certSerial) => {\n return async (dispatch) => {\n await axios.delete(`pki/certs/${certSerial}`);\n return dispatch(getUserInfo());\n }\n}","export default function _readOnlyError(name) {\n throw new TypeError(\"\\\"\" + name + \"\\\" is read-only\");\n}","function knownDeviceModels(plugin) {\n var knownDevices = [];\n\n function RutokenModel() {\n this.mechanisms = undefined;\n this.features = undefined;\n this.speed = undefined;\n this.name = undefined;\n }\n\n RutokenModel.prototype.has = function(mechanisms, features, speed) {\n function findSecondArrayInFirst(firts, second) {\n for (var key in second) {\n if (firts.indexOf(second[key]) == -1) return false;\n }\n return true;\n }\n\n for (var mechType in this.mechanisms) {\n for (var implType in this.mechanisms[mechType]) {\n if (!findSecondArrayInFirst(mechanisms[mechType][implType], this.mechanisms[mechType][implType]))\n return false;\n }\n }\n\n for (var featureName in this.features) {\n if(!this.features.hasOwnProperty(featureName))\n return false;\n\n if (features[featureName] != this.features[featureName])\n return false;\n }\n\n if (this.speed != undefined && this.speed != speed) {\n return false;\n }\n return true;\n }\n\n var mechsSignGost2012 = [plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_256, plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2012_512];\n var mechsSignGost2001 = [plugin.PUBLIC_KEY_ALGORITHM_GOST3410_2001];\n var mechsSignRsa = [plugin.PUBLIC_KEY_ALGORITHM_RSA_512, plugin.PUBLIC_KEY_ALGORITHM_RSA_768, plugin.PUBLIC_KEY_ALGORITHM_RSA_1024,\n plugin.PUBLIC_KEY_ALGORITHM_RSA_1280, plugin.PUBLIC_KEY_ALGORITHM_RSA_1536, plugin.PUBLIC_KEY_ALGORITHM_RSA_1792, plugin.PUBLIC_KEY_ALGORITHM_RSA_2048];\n var mechsSignRsa4096 = [plugin.PUBLIC_KEY_ALGORITHM_RSA_4096];\n\n var mechsHash94 = [plugin.HASH_TYPE_GOST3411_94];\n var mechsHash2012 = [plugin.HASH_TYPE_GOST3411_12_256, plugin.HASH_TYPE_GOST3411_12_512];\n\n var mechGostCipher = [plugin.CIPHER_ALGORITHM_GOST28147];\n\n var ecp3_0Mechanisms = {\n \"sign\": {\n \"hardware\": [].concat(mechsSignGost2001).concat(mechsSignGost2012).concat(mechsSignRsa).concat(mechsSignRsa4096)\n },\n\n \"hash\": {\n \"hardware\": [].concat(mechsHash94).concat(mechsHash2012)\n }\n\n };\n\n var ecp2_0Mechanisms = {\n \"sign\": {\n \"hardware\": [].concat(mechsSignGost2001).concat(mechsSignGost2012).concat(mechsSignRsa)\n },\n\n \"hash\": {\n \"hardware\": [].concat(mechsHash94).concat(mechsHash2012)\n }\n\n };\n\n var ecpMechanisms = {\n \"sign\": {\n \"hardware\": [].concat(mechsSignGost2001).concat(mechsSignRsa)\n },\n\n \"hash\": {\n \"hardware\": [].concat(mechsHash94)\n },\n\n \"cipher\": {\n \"hardware\": [].concat(mechGostCipher)\n }\n };\n\n\n var RutokenEcp3_0 = function() {\n this.mechanisms = ecp3_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"customPin\": true,\n \"externalAuth\": false\n };\n\n this.name = \"Рутокен ЭЦП 3.0\";\n this.isSupported = true;\n }\n RutokenEcp3_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcp3_0());\n\n var RutokenEcp2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true\n };\n\n this.speed = 3;\n\n this.name = \"Рутокен ЭЦП 2.0\";\n this.isSupported = true;\n }\n RutokenEcp2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcp2_0());\n\n var RutokenEcpFlash2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"flashDrive\": true\n };\n\n this.name = \"Рутокен ЭЦП 2.0 Flash\";\n this.isSupported = true;\n }\n RutokenEcpFlash2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpFlash2_0());\n\n var RutokenEcpTouch2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"confirmation\": true,\n \"visualization\": false\n };\n\n this.name = \"Рутокен ЭЦП 2.0\";\n this.isSupported = true;\n }\n RutokenEcpTouch2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpTouch2_0());\n\n var RutokenEcpFlashTouch2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"confirmation\": true,\n \"flashDrive\": true,\n \"visualization\": false\n };\n\n this.name = \"Рутокен ЭЦП 2.0 Flash\";\n this.isSupported = true;\n }\n RutokenEcpFlashTouch2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpFlashTouch2_0());\n\n var RutokenEcpPki2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true\n };\n\n this.speed = 1;\n\n this.name = \"Рутокен ЭЦП 2.0\";\n this.isSupported = true;\n }\n RutokenEcpPki2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpPki2_0());\n\n var RutokenEcp2151 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"bio\": 1\n };\n\n this.name = \"Рутокен 2151\";\n this.isSupported = false;\n }\n RutokenEcp2151.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcp2151());\n\n var RutokenEcp2_0Bluetooth = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"sm\": true\n };\n\n this.name = \"Рутокен Bluethooth\";\n this.isSupported = false;\n }\n RutokenEcp2_0Bluetooth.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcp2_0Bluetooth());\n\n var RutokenPinpad2_0 = function() {\n this.mechanisms = ecp2_0Mechanisms;\n\n this.features = {\n \"journal\": true,\n \"pin2\": true,\n \"confirmation\": true,\n \"visualization\": true\n };\n\n this.name = \"Рутокен PINPad\";\n this.isSupported = false;\n }\n RutokenPinpad2_0.prototype = new RutokenModel();\n knownDevices.push(new RutokenPinpad2_0());\n\n var RutokenEcp = function() {\n this.mechanisms = ecpMechanisms;\n\n this.speed = 3;\n\n this.name = \"Рутокен ЭЦП\";\n this.isSupported = false;\n }\n RutokenEcp.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcp());\n\n var RutokenEcpBluetooth = function() {\n this.mechanisms = ecpMechanisms;\n\n this.features = {\n \"sm\": true\n };\n\n this.name = \"Рутокен Bluethooth\";\n this.isSupported = false;\n }\n RutokenEcpBluetooth.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpBluetooth());\n\n var RutokenEcpPki = function() {\n this.mechanisms = ecpMechanisms;\n\n this.speed = 1;\n\n this.name = \"Рутокен PKI\";\n this.isSupported = false;\n }\n RutokenEcpPki.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpPki());\n\n var RutokenEcpFlash = function() {\n this.mechanisms = ecpMechanisms;\n\n this.features = {\n \"flashDrive\": true\n };\n\n this.name = \"Рутокен ЭЦП Flash\";\n this.isSupported = false;\n }\n RutokenEcpFlash.prototype = new RutokenModel();\n knownDevices.push(new RutokenEcpFlash());\n\n var RutokenLite = function() {\n this.mechanisms = {\n \"sign\": {\n \"hardware\": []\n },\n\n \"hash\": {\n \"hardware\": []\n },\n\n \"cipher\": {\n \"hardware\": []\n }\n };\n\n this.name = \"Рутокен Lite\"\n }\n RutokenLite.prototype = new RutokenModel();\n knownDevices.push(new RutokenLite());\n\n return knownDevices;\n}\n\nexport function getRutokenModelName(device, plugin) {\n var knownModels = knownDeviceModels(plugin);\n\n for (var i in knownModels)\n if (knownModels[i].has(device.mechanisms, device.features, device.speed))\n return {modelName: knownModels[i].name, isSupported: knownModels[i].isSupported};\n\n return {modelName: \"Неизвестная модель\", isSupported: false};\n}","import React, { useEffect } from \"react\";\nimport { BucketIcon } from \"../../controls/BucketIcon\";\nimport DeleteDeviceModal from \"../DeleteDeviceModal\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { hideModal, showModal } from \"../../redux/actionCreators\";\nimport { deletePki, getPkiDevices } from \"../../redux/actions/pkiActions\";\nimport { Status } from \"../../utils/constants\";\nimport LoadingContent from \"../../common/LoadingContent\";\nimport { dateToLocaleWithoutTime } from \"../../utils/utils\";\n\nconst PKIDevices = () => {\n const dispatch = useDispatch();\n const { operationStatus, devices } = useSelector(state => state.plugin);\n const { pkiKeys } = useSelector(state => state.userInfo);\n\n useEffect(() => {\n if (devices.length === 0) dispatch(getPkiDevices());\n }, []);\n\n const showDeleteDeviceModal = (serial) => {\n dispatch(showModal(DeleteDeviceModal, {\n title: 'Удаление устройства Рутокен',\n body: Вы уверены, что хотите удалить Рутокен устройство?
,\n action: deleteDevice,\n id: serial\n }));\n }\n\n const deleteDevice = (certSerial) => {\n dispatch(deletePki(certSerial))\n .then(() => dispatch(hideModal()));\n }\n\n const getBindedDevices = () => {\n const bindedDevices = [];\n \n for (let device of devices) {\n for (let cert of device.certs) {\n if (pkiKeys.some(pkiKey => pkiKey.serialNumber === cert.serial)) {\n bindedDevices.push({\n serial: device.serial,\n name: cert.subjectProp.commonName,\n modelName: device.modelName,\n certSerial: cert.serial,\n validNotAfter: cert.validNotAfter,\n });\n }\n }\n }\n\n return bindedDevices;\n }\n\n const renderBindedDevicesWithCerts = () => {\n if (operationStatus === Status.Loading) return ;\n if (operationStatus === Status.Error || devices.length === 0) return \"Не удалось получить информацию о добавленных устройствах\";\n\n const bindedDevices = getBindedDevices();\n\n if (bindedDevices.length === 0) return \"Устройство не подключено или на нем отсутствует привязанный сертификат\";\n\n return bindedDevices.map((device) =>\n \n
\n
\n {device.modelName}\n {device.serial}\n
\n
showDeleteDeviceModal(device.certSerial)}>\n
\n \n
\n
\n
\n
\n
\n
{device.name}\n
\n Сертификат истекает\n {dateToLocaleWithoutTime(device.validNotAfter)}\n
\n
\n
\n );\n }\n\n return (\n \n
Добавленные устройства\n
\n {renderBindedDevicesWithCerts()}\n
\n
\n );\n}\n\nexport default PKIDevices;\n","import React from 'react';\n\nconst Rutoken3Image = props => (\n \n);\n\nexport default Rutoken3Image;\n\n\n","import React from \"react\";\n\nconst NoDevicesFoundSvg = () => (\n \n)\n\nexport default NoDevicesFoundSvg;","import React from \"react\";\nimport NoDevicesFoundSvg from \"../../images/NoDevicesFoundSvg\";\n\nconst PKINoDevicesFound = ({ text }) => {\n return (\n \n );\n}\n\nexport default PKINoDevicesFound;","import React, { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Status } from \"../../utils/constants\";\nimport Rutoken3Image from \"../../images/Rutoken3Image\";\nimport LoadingContent from \"../../common/LoadingContent\";\nimport ErrorContent from \"../../common/ErrorContent\";\nimport { getPkiDevices } from \"../../redux/actions/pkiActions\";\nimport { setPkiAuthData } from \"../../redux/actionCreators\";\nimport PKINoDevicesFound from \"./PKINoDevicesFound\";\n\nconst PKISelectDevice = ({ onSelect }) => {\n const dispatch = useDispatch();\n const { operationStatus, devices } = useSelector(state => state.plugin);\n\n useEffect(() => {\n dispatch(getPkiDevices());\n }, []);\n\n useEffect(() => {\n if (devices.length == 1) {\n handleSelect(devices[0]);\n };\n }, [devices])\n\n const handleSelect = (device) => {\n dispatch(setPkiAuthData(device.deviceId));\n onSelect?.(device);\n }\n\n if (operationStatus === Status.Loading) return \n\n if (operationStatus === Status.Error) return \n\n if (devices.length === 0) return \n\n return (\n \n {\n devices.map(device =>\n
device.isSupported ? handleSelect(device) : null}>\n
\n
\n
\n {device.modelName}\n {device.serial}\n {!device.isSupported &&\n Не поддерживается\n }\n
\n
\n
\n )\n }\n
\n )\n};\n\nexport default PKISelectDevice;","import React, {useState} from \"react\";\nimport cn from \"classnames\";\nimport {FormFeedback, Input} from \"reactstrap\";\n\nconst PasswordInput = (props) => {\n \n const [fieldType, setFieldType] = useState(\"password\");\n\n const renderEyeIconClass = (fieldType) => cn({\n img__eye: true,\n active: fieldType === 'text',\n });\n\n const fieldTypeToggle = () =>\n setFieldType(fieldType === 'password' ? 'text' : 'password');\n\n return (\n \n \n \n {props.feedback}\n \n fieldTypeToggle()}\n />\n
\n );\n \n}\n\nexport default PasswordInput;","import React from 'react';\n\nconst ErrorIcon = props => (\n \n);\n\nexport default ErrorIcon;","import React from 'react';\nimport ErrorIcon from '../../images/ErrorIcon';\n\nconst PKIPinCodeBlocked = () => {\n return (\n \n
\n
\n
\n
\n PIN-код заблокирован
\n \n
\n
\n
\n );\n}\n\nexport default PKIPinCodeBlocked;","import React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport CommonButton from '../../common/CommonButton';\nimport PasswordInput from '../../controls/PasswordInput';\nimport PKIPinCodeBlocked from './PKIPinCodeBlocked';\nimport ErrorContent from '../../common/ErrorContent';\n\nconst PKIEnterPinCode = ({ onSuccess }) => {\n const { instance: plugin } = useSelector(state => state.plugin);\n const { deviceId } = useSelector(state => state.pkiAuthData);\n\n const [pinCode, setPinCode] = useState('');\n const [isUnknownError, setIsUnknownError] = useState(null);\n const [isBlocked, setIsBlocked] = useState(false);\n const [retriesLeft, setRetriesLeft] = useState(null);\n\n const handlePinCodeChange = (e) => {\n const inputValue = e.target.value;\n\n setPinCode(inputValue);\n };\n\n const getPinRetriesLeft = () => {\n return plugin.getDeviceInfo(deviceId, plugin.TOKEN_INFO_PINS_INFO)\n .then(({ retriesLeft }) => {\n if (retriesLeft === 0) {\n setIsBlocked(true);\n }\n setRetriesLeft(retriesLeft);\n });\n }\n\n const handleSuccessLogin = () => {\n plugin.getDeviceInfo(deviceId, plugin.TOKEN_INFO_PINS_INFO)\n .then(({ isPinDefault }) => {\n onSuccess?.(isPinDefault);\n });\n }\n\n const handleErrorLogin = (error) => {\n switch (error.code) {\n case plugin?.errorCodes?.ALREADY_LOGGED_IN:\n handleSuccessLogin();\n break;\n case plugin?.errorCodes?.PIN_INCORRECT:\n getPinRetriesLeft();\n break;\n case plugin?.errorCodes?.PIN_LOCKED:\n setIsBlocked(true);\n break;\n default:\n setIsUnknownError(true);\n }\n } \n\n const onSubmit = () => {\n return plugin.login(deviceId, pinCode)\n .then(handleSuccessLogin)\n .catch(handleErrorLogin);\n }\n\n if (isBlocked) return \n\n if (isUnknownError) return \n\n return (\n \n );\n}\n\nexport default PKIEnterPinCode;","import React, {useState} from 'react';\nimport { useSelector } from 'react-redux';\n\nimport CommonButton from '../../common/CommonButton';\nimport PasswordInput from '../../controls/PasswordInput';\nimport ErrorContent from '../../common/ErrorContent';\n\nconst DEFAULT_PIN_CODE = '12345678';\n\nconst PKIChangePinCode = ({ onSuccess }) => {\n const { instance: plugin } = useSelector(state => state.plugin);\n const { deviceId } = useSelector(state => state.pkiAuthData);\n\n const [newPin, setNewPin] = useState('');\n const [repeatPin, setRepeatPin] = useState('');\n const [errorNewPin, setErrorNewPin] = useState(null);\n const [errorRepeatPin, setErrorRepeatPin] = useState(null);\n const [isUnknownError, setIsUnknownError] = useState(null);\n \n const handlePinChange = (e, setCallback, validateCallback) => {\n const value = e.target.value;\n\n setCallback(value);\n validateCallback(value);\n }\n\n const validateNewPin = (value) => {\n setErrorNewPin(() => {\n if (value.length < 6)\n return 'PIN‑код должен содержать 6 и более символов';\n \n if (value == DEFAULT_PIN_CODE)\n return 'Новый PIN-код совпадает с PIN-кодом по умолчанию';\n\n return null;\n });\n\n setErrorRepeatPin(() => {\n if (repeatPin != value)\n return 'PIN‑коды не совпадают';\n \n return null;\n });\n }\n\n const validateRepeatPin = (value) => {\n setErrorRepeatPin(() => {\n if (value != newPin)\n return 'PIN‑коды не совпадают';\n \n return null;\n });\n }\n\n const onSubmit = () => {\n plugin.changePin(deviceId, DEFAULT_PIN_CODE, newPin, {})\n .then(() => {\n onSuccess?.();\n })\n .catch(() => {\n setIsUnknownError(true);\n });\n }\n\n if (isUnknownError) return \n\n return (\n \n
handlePinChange(e, setNewPin, validateNewPin)}\n feedback={errorNewPin}\n />\n handlePinChange(e, setRepeatPin, validateRepeatPin)}\n feedback={errorRepeatPin}\n />\n \n Продолжить\n \n \n );\n}\n\nexport default PKIChangePinCode;","import React, { useState } from 'react';\nimport { useDispatch, useSelector } from \"react-redux\";\n\nimport ModalComponent from \"../../modal/ModalComponent\";\nimport { hideModal } from '../../redux/actionCreators';\nimport PKISelectDevice from '../../components/pki/PKISelectDevice';\nimport PKIEnterPinCode from '../../components/pki/PKIEnterPinCode';\nimport PKIChangePinCode from '../../components/pki/PKIChangePinCode';\nimport { bindPki } from '../../redux/actions/pkiActions';\nimport LoadingContent from '../../common/LoadingContent';\nimport ErrorContent from '../../common/ErrorContent';\nimport { Status } from '../../utils/constants';\n\nconst PKIBindModal = ({ onSuccess }) => {\n const dispatch = useDispatch();\n const { operationStatus } = useSelector(state => state.plugin);\n\n const [step, setStep] = useState(2);\n\n const handleCorrectNotDefaultPinCode = () => {\n setStep(5);\n dispatch(bindPki(onSuccess));\n }\n\n const getTitle = () => {\n if (step === 2) return 'Выберите Рутокен';\n if (step === 3) return 'Введите PIN‑код';\n if (step === 4) return 'Измените PIN‑код по умолчанию';\n }\n\n \n const onDeviceSelected = (device) => {\n if(device.isPinCached) {\n handleCorrectNotDefaultPinCode();\n return;\n } \n setStep(3)\n }\n\n const renderBody = () => {\n if (step === 2) return ;\n if (step === 3) return isDefaultPin ? setStep(4) : handleCorrectNotDefaultPinCode()}/>;\n if (step === 4) return handleCorrectNotDefaultPinCode()} />;\n\n if (step === 5 && operationStatus === Status.Loading) return ;\n if (step === 5 && operationStatus === Status.Error) return ;\n }\n\n return (\n dispatch(hideModal()), label: 'Назад' }]}\n >\n {renderBody()}\n \n )\n}\n\nexport default PKIBindModal;","\nimport React from 'react';\n\nconst SuccessIcon2 = props => (\n \n\n);\n\nexport default SuccessIcon2;","import React from 'react';\n\nconst StepCircle = ({ step }) => {\n if (isNaN(step)) return;\n\n return (\n \n {step}\n
\n );\n};\n\nexport default StepCircle;\n","import React, { useEffect } from \"react\";\nimport SuccessIcon2 from \"../../images/SuccessIcon2\";\nimport StepCircle from \"../../common/StepCircle\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { NoInstalledPluginError } from \"@aktivco-it/rutoken-plugin-bootstrap/src/supportError\";\nimport cn from 'classnames';\nimport { loadPlugin } from \"../../redux/actions/pkiActions\";\nimport { getExtensionDownloadLink, getPluginDownloadLink } from \"./pluginDownloadLinks\";\n\nconst PKICheckPlugins = ({ onInstalled }) => {\n const dispatch = useDispatch();\n const { instance: plugin, loadError } = useSelector(state => state.plugin);\n\n useEffect(() => {\n let intervalId;\n\n if (plugin) onInstalled?.();\n else if (loadError instanceof NoInstalledPluginError) {\n intervalId = setInterval(() => {\n dispatch(loadPlugin(false));\n }, 1000);\n } \n return () => {\n if (intervalId) clearInterval(intervalId);\n };\n }, [plugin]);\n\n const isSomethingNotInstalled = loadError instanceof NoInstalledPluginError;\n const isExtensionNotInstalled = isSomethingNotInstalled && loadError.needExtension;\n const isPluginNotInstalled = isSomethingNotInstalled && !loadError.needExtension;\n\n const pluginLink = getPluginDownloadLink(loadError?.os?.name)\n const extensionLink = getExtensionDownloadLink(loadError?.browser?.name)\n\n return (\n \n
\n {\n isExtensionNotInstalled\n ?
\n :
\n }\n
Адаптер «Рутокен Плагин»
\n
Расширение для браузера\n {\n isExtensionNotInstalled &&\n
Установите расширение или убедитесь, что оно включено\n }\n \n
\n
\n {\n !isExtensionNotInstalled && !isPluginNotInstalled\n ?
\n :
\n }\n
«Рутокен Плагин»
\n
Приложение для компьютера\n {\n isPluginNotInstalled &&\n
Установите приложение\n }\n
\n
\n );\n}\n\nexport default PKICheckPlugins;","const getPluginDownloadLink = (os) => {\n let href = '';\n\n switch (os) {\n case \"Windows\":\n href = 'https://download.rutoken.ru/Rutoken_Plugin/Current/Windows/RutokenPlugin.msi'\n break;\n case \"macOS\":\n href = 'https://download.rutoken.ru/Rutoken_Plugin/Current/macOS/RutokenPlugin.pkg'\n break;\n default:\n href = 'https://www.rutoken.ru/support/download/rutoken-plugin/';\n break;\n }\n\n return href;\n}\n\nconst getExtensionDownloadLink = (browserName) => {\n switch (browserName) {\n case \"Chrome\":\n case \"Chromium\":\n case \"Vivaldi\":\n case \"SputnikBrowser\":\n case \"Yandex Browser\":\n return \"https://chrome.google.com/webstore/detail/адаптер-рутокен-плагин/ohedcglhbbfdgaogjhcclacoccbagkjg\";\n\n case \"Firefox\":\n return \"https://addons.mozilla.org/ru/firefox/addon/adapter-rutoken-plugin/\";\n\n case \"Opera\":\n return \"https://addons.opera.com/ru/extensions/details/adapter-rutoken-plagin/\";\n\n case \"Microsoft Edge\":\n return \"https://microsoftedge.microsoft.com/addons/detail/rutoken-plugin-for-edge/bbkhpnmiijkcilgdnlaojbkokdhiijfc?hl=ru\";\n default:\n return \"http://www.rutoken.ru/support/download/rutoken-plugin/\"\n }\n}\n\n\nexport { getExtensionDownloadLink, getPluginDownloadLink };\n","import React, { useEffect } from \"react\";\nimport CommonButton from \"../../common/CommonButton\";\nimport Step from \"../../common/Step\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport PKIBindModal from \"./PKIBindModal\";\nimport PKICheckPlugins from \"../../components/pki/PKICheckPlugins\";\nimport { hideModal, showModal } from \"../../redux/actionCreators\";\nimport { loadPlugin } from \"../../redux/actions/pkiActions\";\nimport { NoInstalledPluginError } from \"@aktivco-it/rutoken-plugin-bootstrap/src/supportError\";\nimport { Status } from \"../../utils/constants\";\n\nconst PKIBindInit = () => {\n const dispatch = useDispatch();\n const { loadStatus, loadError } = useSelector(state => state.plugin);\n\n useEffect(() => {\n dispatch(loadPlugin(false));\n }, []);\n\n return (\n <>\n \n
\n
Установите компоненты
\n
\n \n
\n
Они необходимы для получения доступа к хранилищу
\n
устройства Рутокен и работы с сертификатами и ключами.
\n
\n
\n \n dispatch(showModal(PKIBindModal, {onSuccess: () => dispatch(hideModal())}))}\n disabled={loadStatus === Status.Error && loadError instanceof NoInstalledPluginError}\n >\n Добавить Рутокен\n \n >\n );\n}\n\nexport default PKIBindInit;\n","import React, {useEffect, useState} from \"react\";\nimport {useDispatch, useSelector} from 'react-redux';\nimport cn from \"classnames\";\n\nimport {getUserInfo, signOut} from \"../redux/actions\";\n\nimport Layout from \"../common/Layout\";\nimport InitFido from \"./fido/InitFido\";\nimport InitTotp from \"./totp/InitTotp\";\nimport RenderFidoKeysList from \"./fido/RenderFidoKeysList\";\nimport RenderTotpKeysList from \"./totp/RenderTotpKeysList\";\nimport {LogoutIcon} from \"../controls/LogoutIcon\"\nimport { Factor } from \"../utils/constants\";\nimport PKIDevices from \"./pki/PKIDevices\";\nimport PKIBindInit from \"./pki/PKIBindInit\";\n\n\nconst RenderTwoFactor = ({fidoKeys, totpKeys, pkiKeys}) => {\n const renderStatus = () => cn({\n \"personal-two-factor__value \": true,\n \"personal-two-factor__value--on\": fidoKeys.length || totpKeys.length || pkiKeys.length\n });\n\n const getStatus = () => {\n if (fidoKeys.length) return 'Включена (Рутокен MFA)';\n if (totpKeys.length) return 'Включена (Рутокен OTP)';\n if (pkiKeys.length) return 'Включена (Рутокен ЭЦП)';\n return 'Выключена';\n }\n\n return (\n \n
\n Двухфакторная защита учетной записи:\n
\n\n
\n {getStatus()}\n
\n
\n );\n}\n\nconst RenderDeviceInit = ({factor}) => {\n if (factor === Factor.FIDO) return ;\n if (factor === Factor.TOTP) return ;\n if (factor === Factor.PKI) return ;\n return null;\n}\n\nconst RenderTwoFactorInit = () => {\n const [selectedFactor, setSelectedFactor] = useState(null);\n\n const renderFactorBlock = (factor) => {\n return (\n setSelectedFactor(factor)}\n >\n {factor}\n {factor == selectedFactor && }\n
\n )\n }\n\n return (\n <>\n \n
Добавить второй фактор защиты
\n {\n selectedFactor && (\n
setSelectedFactor(null)}\n >\n Отменить\n
\n )\n }\n
\n\n \n {Object.values(Factor).map(factor => renderFactorBlock(factor))}\n
\n\n \n >\n );\n}\n\nconst DevicesContainer = ({fidoKeys, totpKeys, pkiKeys}) => {\n if (fidoKeys.length) {\n return ;\n }\n\n if (totpKeys.length) {\n return ;\n }\n\n if (pkiKeys.length) {\n return ;\n }\n\n return ;\n}\n\nconst Personal = () => {\n const userInfo = useSelector(state => state.userInfo);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(getUserInfo());\n }, []);\n\n if (!userInfo) return <>>;\n\n const renderDateLeft = () => {\n if (userInfo.hoursLeft == 0) return `${userInfo.minutesLeft} м.`;\n return `${userInfo.hoursLeft} ч. ${userInfo.minutesLeft} м.`;\n }\n \n return (\n \n \n
Личный кабинет
\n
\n
\n
\n
\n
{userInfo.userName}
\n
\n
dispatch(signOut())}>\n
Выйти
\n
\n
\n
\n
\n
\n
Срок действия учeтной записи:
\n
{renderDateLeft()}
\n
\n
\n
\n
\n
\n \n );\n}\n\nexport default Personal;\n","import React, {useState, useMemo} from \"react\";\nimport {useDispatch} from 'react-redux';\n\n\nimport {signInOrUp, loginPasswordLess, loginPki} from \"../redux/actions\";\nimport PasswordInput from \"../controls/PasswordInput\";\nimport {FormFeedback, Input} from \"reactstrap\";\nimport ModalComponent from \"../modal/ModalComponent\";\n\n\nconst Login = () => {\n const [isRegisterView, setIsRegisterView] = useState(false);\n const [userName, setUserName] = useState('');\n const [password, setPassword] = useState('');\n const [repeatPassword, setRepeatPassword] = useState('');\n const [error, setError] = useState(null);\n\n const dispatch = useDispatch();\n\n const registerViewToggle = () => {\n setError(null);\n setUserName(\"\");\n setPassword(\"\");\n setRepeatPassword(\"\");\n setIsRegisterView(!isRegisterView);\n }\n\n const handleSubmit = (evt) => {\n evt.preventDefault();\n setError(null);\n\n dispatch(signInOrUp(isRegisterView, userName, password, repeatPassword))\n .catch(err => {\n setError(err);\n });\n }\n\n const isContinueDisable = useMemo(() => {\n if (isRegisterView)\n return !userName || !password || !repeatPassword;\n else\n return !userName || !password;\n }, [userName, password, repeatPassword, isRegisterView]);\n\n const handleUserNameChange = (evt) => setUserName(evt.target.value);\n const handlePasswordChange = (evt) => setPassword(evt.target.value);\n const handleRepeatPasswordChange = (evt) => setRepeatPassword(evt.target.value);\n\n const renderBody = () => {\n return (\n \n );\n }\n\n const getFooterLinks = () => {\n if (isRegisterView) return [\n {\n onClick: () => registerViewToggle(),\n label: 'У меня есть учетная запись'\n }\n ];\n\n return [\n {\n onClick: () => dispatch(loginPasswordLess()),\n label: 'Без логина и пароля (MFA)'\n }, \n {\n onClick: () => dispatch(loginPki()),\n label: 'По сертификату'\n }\n ];\n }\n\n return (\n \n {renderBody()}\n \n );\n}\n\nexport default Login;","import React, { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { loginFido, loginWithoutTwoFactor } from \"../redux/actions\";\nimport { Status } from \"../utils/constants\";\nimport ModalComponent from \"../modal/ModalComponent\";\nimport ErrorContent from \"../common/ErrorContent\";\nimport FidoSuccessContent from \"../components/fido/FidoSuccessContent\";\nimport LoadingContent from \"../common/LoadingContent\";\n\nconst LoginFIDO = () => {\n const dispatch = useDispatch();\n const twoFactorType = useSelector(state => state.twoFactorType);\n\n const [status, setStatus] = useState(null);\n\n useEffect(() => loginFIDO(), [twoFactorType]);\n\n const loginFIDO = () => {\n setStatus(Status.Loading);\n\n dispatch(loginFido())\n .then((response) => {\n setStatus(Status.Success);\n })\n .catch(err => {\n setStatus(Status.Error);\n });\n }\n\n const renderBody = () => {\n if (status === Status.Error) return ;\n if (status === Status.Loading) return ;\n if (status === Status.Success) return ;\n }\n\n return (\n loginFIDO(), submitButtonText: 'Повторить'})}\n {...(status === Status.Error && {footerLinks: [{onClick: () => dispatch(loginWithoutTwoFactor()), label: 'Назад'}]})}\n >\n {renderBody()}\n \n )\n}\n\nexport default LoginFIDO;","import React, { useState } from \"react\";\nimport { useDispatch } from 'react-redux';\n\nimport { setLoginState, loginWithoutTwoFactor, verifyTotp } from \"../redux/actions\";\nimport { Form, FormFeedback, FormGroup, Input, Label } from \"reactstrap\";\nimport ModalComponent from \"../modal/ModalComponent\";\nimport { Status } from \"../utils/constants\";\n\nconst LoginTOTP = () => {\n const dispatch = useDispatch();\n\n const [status, setStatus] = useState(null);\n const [errorMsg, setErrorMsg] = useState(false);\n const [isVerified, setIsVerified] = useState(null);\n const [code, setCode] = useState(\"\");\n\n const handleCodeChange = (e) => {\n const value = e.target.value;\n\n if (/^[0-9]*$/.test(value)) {\n setCode(value);\n }\n }; \n\n const handleSubmit = (e) => {\n e.preventDefault();\n setStatus(Status.Loading);\n\n dispatch(verifyTotp(code))\n .then((response) => {\n setIsVerified(response.data);\n\n if (response.data) {\n dispatch(setLoginState(true));\n }\n })\n .catch((error) => {\n setErrorMsg(error?.response?.data?.message);\n setStatus(Status.Error);\n })\n .finally(() => setStatus(null));\n }\n\n const renderBody = () => {\n return (\n \n
\n Нажмите кнопку на корпусе Рутокен
OTP и введите отобразившиеся
цифры в поле\n
\n
\n
\n );\n }\n \n return (\n dispatch(loginWithoutTwoFactor(null)), label: 'Назад'}]}\n backdrop={false}\n fade={false}\n >\n {renderBody()}\n \n )\n}\n\nexport default LoginTOTP;\n","import React, { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\n\nimport { dateToLocaleWithoutTime } from \"../../utils/utils\";\nimport { getPkiDevices, } from '../../redux/actions/pkiActions'\nimport LoadingContent from \"../../common/LoadingContent\";\nimport { setPkiAuthData } from \"../../redux/actionCreators\";\nimport PKINoDevicesFound from \"./PKINoDevicesFound\";\nimport { Status } from \"../../utils/constants\";\nimport ErrorContent from \"../../common/ErrorContent\";\nimport { getUserInfo } from \"../../redux/actions\";\n\nconst PKISelectCertificate = ({ onSelect }) => {\n const dispatch = useDispatch();\n const { operationStatus, devices } = useSelector(state => state.plugin);\n const twoFactorType = useSelector(state => state.twoFactorType);\n const userInfo = useSelector(state => state.userInfo);\n\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n dispatch(getPkiDevices());\n\n if (twoFactorType === \"PKI\") {\n setIsLoading(true);\n dispatch(getUserInfo())\n .then(() => setIsLoading(false));\n };\n }, []);\n \n const handleSelectCert = (device, certId) => {\n dispatch(setPkiAuthData(device.deviceId, certId));\n onSelect?.(device);\n }\n\n const renderDeviceText = (text) => (\n {text}\n );\n\n const renderCerts = (device) => {\n if (!device.isSupported)\n return renderDeviceText(\"Устройство не поддерживается\");\n\n if (device.certs.length === 0)\n return renderDeviceText(\"Нет сертификатов\");\n\n return device.certs.map((cert, idx) => (\n handleSelectCert(device, cert.certId)}\n >\n {\n idx === 0 && !!cert.lastLoginDate && twoFactorType === \"PKINoLoginBefore\" &&\n
Использовали ранее\n }\n
\n \n {cert.subjectProp.commonName}\n \n
\n
\n Сертификат истекает {dateToLocaleWithoutTime(cert.validNotAfter)}\n
\n ))\n };\n\n const getFilteredDevices = () => {\n if (twoFactorType === \"PKINoLoginBefore\") return devices;\n\n if (!userInfo) return [];\n\n for (let device of devices) {\n for (let pkiKey of userInfo.pkiKeys) {\n const found = device.certs.find(cert => cert.serial === pkiKey.serialNumber)\n\n if (found) {\n return [{ ...device, certs: [found]}];\n }\n }\n }\n\n return [];\n }\n\n if (operationStatus === Status.Loading || isLoading)\n return \n\n if (operationStatus === Status.Error)\n return \n\n const filteredDevices = getFilteredDevices();\n\n if (filteredDevices.length === 0)\n return ;\n\n return (\n \n {filteredDevices.map((device) => (\n
\n
\n {device.modelName}\n {device.serial}\n
\n
\n {renderCerts(device)}\n
\n
\n ))}\n
\n )\n};\n\nexport default PKISelectCertificate;","import React, { useEffect, useState } from \"react\";\nimport { useDispatch, useSelector } from 'react-redux';\nimport ModalComponent from \"../modal/ModalComponent\";\n\nimport { loadPlugin, loginByCert } from \"../redux/actions/pkiActions\";\nimport { loginWithoutTwoFactor } from \"../redux/actions\";\nimport PKICheckPlugins from \"../components/pki/PKICheckPlugins\";\nimport PKISelectCertificate from \"../components/pki/PKISelectCertificate\";\nimport PKIEnterPinCode from \"../components/pki/PKIEnterPinCode\";\nimport PKIChangePinCode from \"../components/pki/PKIChangePinCode\";\nimport { Status } from \"../utils/constants\";\nimport { NoInstalledPluginError } from \"@aktivco-it/rutoken-plugin-bootstrap/src/supportError\";\nimport ErrorContent from \"../common/ErrorContent\";\nimport LoadingContent from \"../common/LoadingContent\";\n\nconst LoginPKI = () => {\n const dispatch = useDispatch();\n const {\n loadStatus,\n loadError,\n operationStatus,\n } = useSelector(state => state.plugin);\n\n const [step, setStep] = useState(0);\n\n useEffect(() => {\n dispatch(loadPlugin())\n .then(() => setStep(2))\n .catch((error) => {\n if (error instanceof NoInstalledPluginError)\n setStep(1);\n });\n }, []);\n\n const handleCorrectNotDefaultPinCode = () => {\n setStep(5);\n dispatch(loginByCert());\n }\n\n const getTitle = () => {\n if ([loadStatus, operationStatus].some(status => status === Status.Loading)) return \"\";\n\n if (step === 1) return \"Установите компоненты\";\n if (step === 2) return \"Выберите сертификат\";\n if (step === 3) return \"Введите PIN-код\";\n if (step === 4) return \"Измените PIN-код по умолчанию\";\n }\n\n const onDeviceSelected = (device) => {\n if(device.isPinCached) {\n handleCorrectNotDefaultPinCode();\n return;\n } \n setStep(3);\n }\n\n const renderBody = () => {\n if (loadStatus === Status.Loading) return ;\n if (loadStatus === Status.Error && !(loadError instanceof NoInstalledPluginError)) return ;\n\n if (step === 1) return setStep(2)} />;\n if (step === 2) return ;\n if (step === 3) return isDefaultPin ? setStep(4) : handleCorrectNotDefaultPinCode()}/>;\n if (step === 4) return ;\n \n if (step === 5 && operationStatus === Status.Loading) return ;\n if (step === 5 && operationStatus === Status.Error) return ;\n }\n\n return (\n dispatch(loginWithoutTwoFactor(null)), label: 'Назад' }]}\n backdrop={false}\n fade={false}\n >\n {renderBody()}\n \n )\n}\n\nexport default LoginPKI;\n","import React from \"react\";\nimport LoginFIDO from \"./LoginFido\";\nimport LoginTOTP from \"./LoginTotp\";\nimport LoginPKI from \"./LoginPKI\";\n\n\nconst TwoFactorContainer = ({type}) => {\n if (type === 'FIDO') return ;\n if (type === 'TOTP') return ;\n if (type === 'PKI' || type === 'PKINoLoginBefore') return ;\n\n return null;\n};\n\n\nexport default TwoFactorContainer;","import React from \"react\";\nimport {useSelector} from 'react-redux';\n\nimport Login from \"./Login\";\nimport TwoFactorContainer from \"./TwoFactor\";\n\nconst AuthRenderer = ({twoFactorType}) =>\n (twoFactorType && ) || ;\n\nconst Auth = () => {\n\n const twoFactorType = useSelector(state => state.twoFactorType);\n\n return (\n \n );\n}\n\n\nexport default Auth;","import React, {useEffect} from \"react\";\nimport axios from \"axios\";\nimport {useDispatch, useSelector} from 'react-redux';\nimport {setLoginState, checkLoginState} from './redux/actions';\n\nimport Personal from \"./personal/Personal\";\nimport Auth from \"./auth/Auth\";\n\nconst CheckLogin = () => {\n\n const loginState = useSelector(state => state.loginState);\n const dispatch = useDispatch();\n\n useEffect(() => {\n axios.interceptors.response.use(\n (response) =>\n response,\n (error) => {\n if (error.response.status === 403) dispatch(setLoginState(false));\n return Promise.reject(error);\n },\n );\n\n dispatch(checkLoginState());\n }, []);\n\n if (loginState == null) return null;\n if (loginState) return ;\n return ;\n\n\n}\n\n\nexport default CheckLogin;","/** A function that accepts a potential \"extra argument\" value to be injected later,\r\n * and returns an instance of the thunk middleware that uses that value\r\n */\nfunction createThunkMiddleware(extraArgument) {\n // Standard Redux middleware definition pattern:\n // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware\n var middleware = function middleware(_ref) {\n var dispatch = _ref.dispatch,\n getState = _ref.getState;\n return function (next) {\n return function (action) {\n // The thunk middleware looks for any functions that were passed to `store.dispatch`.\n // If this \"action\" is really a function, call it and return the result.\n if (typeof action === 'function') {\n // Inject the store's `dispatch` and `getState` methods, as well as any \"extra arg\"\n return action(dispatch, getState, extraArgument);\n } // Otherwise, pass the action down the middleware chain as usual\n\n\n return next(action);\n };\n };\n };\n\n return middleware;\n}\n\nvar thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version\n// with whatever \"extra arg\" they want to inject into their thunks\n\nthunk.withExtraArgument = createThunkMiddleware;\nexport default thunk;","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n }\n\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import { Status } from \"../../utils/constants\";\n\nconst pluginInitialState = {\n instance: null,\n loadStatus: Status.Idle,\n loadError: null,\n operationStatus: Status.Idle,\n operationError: null,\n devices: [],\n}\n\nconst plugin = (state = pluginInitialState, action) => {\n switch (action.type) {\n case 'SET_PLUGIN_LOAD_START':\n return {\n ...state,\n loadStatus: Status.Loading,\n };\n case 'SET_PLUGIN_LOAD_SUCCESS':\n return {\n ...state,\n loadStatus: Status.Success,\n instance: action.payload,\n };\n case 'SET_PLUGIN_LOAD_ERROR':\n return {\n ...state,\n instance: null,\n loadStatus: Status.Error,\n loadError: action.payload,\n };\n case \"SET_PLUGIN_OPERATION_START\":\n return {\n ...state,\n operationStatus: Status.Loading,\n operationError: null,\n };\n case \"SET_PLUGIN_OPERATION_SUCCESS\":\n return {\n ...state,\n operationStatus: Status.Success,\n operationError: null,\n };\n case \"SET_PLUGIN_OPERATION_ERROR\":\n return {\n ...state,\n operationStatus: Status.Error,\n operationError: action.payload,\n };\n case \"SET_PLUGIN_DEVICES_LOAD_SUCCESS\":\n return {\n ...state,\n operationStatus: Status.Success,\n devices: action.payload,\n };\n default:\n return state;\n }\n}\n\nconst pkiAuthData = (state = { deviceId: null, certId: null }, action) => {\n switch (action.type) {\n case \"SET_PKI_AUTH_DATA\":\n return { ...action.payload }\n default:\n return state\n }\n}\n\nexport {\n plugin,\n pkiAuthData,\n};","import {combineReducers} from 'redux';\nimport { plugin, pkiAuthData } from './pkiReducers';\n\nconst loginState = (state = null, action) => {\n switch (action.type) {\n case \"SET_LOGIN_STATE\":\n return action.payload\n default:\n return state\n }\n}\n\nconst userInfo = (state = null, action) => {\n switch (action.type) {\n case \"SET_USER_INFO\":\n return action.payload\n default:\n return state\n }\n}\n\nconst totpParams = (state = {}, action) => {\n switch (action.type) {\n case \"TOTP_PARAMS\":\n return action.payload\n default:\n return state\n }\n}\n\nconst twoFactorType = (state = null, action) => {\n switch (action.type) {\n case \"SET_TWO_FACTOR_TYPE\":\n return action.payload\n default:\n return state\n }\n}\n\nconst modal = (state = {modal: null, data: {}}, action) => {\n if (action.type === 'SHOW_MODAL') {\n return {\n ...state,\n modal: action.payload.modal,\n data: action.payload.data,\n };\n }\n if (action.type === 'HIDE_MODAL') {\n return {modal: null, data: {}};\n }\n return state;\n};\n\n\nconst rootReducer = combineReducers({\n loginState,\n userInfo,\n totpParams,\n twoFactorType,\n modal,\n\n plugin,\n pkiAuthData,\n});\n\nexport default rootReducer;","import React from 'react';\nimport {useSelector} from \"react-redux\";\n\nconst ModalContainer = () => {\n const MODAL = useSelector(state => state.modal);\n \n if (!MODAL.modal) {\n return <>>;\n }\n \n const WrappedModalComponent = MODAL.modal;\n \n return ;\n};\n\nexport default ModalContainer;\n","// import 'bootstrap/dist/css/bootstrap.css';\nimport React from 'react';\nimport {createRoot} from 'react-dom/client';\nimport CheckLogin from './CheckLogin';\n\nimport './styles/main.scss';\n\nimport thunk from 'redux-thunk'\nimport {Provider} from 'react-redux';\nimport {applyMiddleware, createStore} from 'redux';\nimport rootReducer from './redux/reducers/index';\nimport ModalContainer from \"./modal/ModalContainer\";\n\n\nconst store = createStore(rootReducer, applyMiddleware(thunk))\n\n\nconst rootElement = document.getElementById('root');\nconst root = createRoot(rootElement);\n\nroot.render();\n\n\n"],"names":["rutoken","n","t","e","r","i","window","o","call","apply","l","arguments","s","u","ready","Promise","resolve","isExtensionInstalled","isPluginInstalled","loadPlugin","a","rutokenLoaded","c","document","createElement","style","setProperty","innerHTML","setAttribute","body","appendChild","push","p","then","length","all","wrapWithOldInterface","f","originalObject","d","Array","prototype","slice","shift","this","message","initialize","navigator","mimeTypes","ActiveXObject","module","exports","m","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","hasOwnProperty","getFirstMatch","match","getSecondMatch","matchAndReturnConst","test","getWindowsVersionName","getMacOSVersionName","split","splice","map","parseInt","getAndroidVersionName","getVersionPrecision","compareVersions","Math","max","join","reverse","min","find","assign","concat","keys","forEach","getBrowserAlias","BROWSER_ALIASES_MAP","getBrowserTypeByAlias","BROWSER_MAP","ENGINE_MAP","OS_MAP","PLATFORMS_MAP","Bada","BlackBerry","Chrome","Chromium","Electron","Epiphany","Firefox","Focus","Generic","Googlebot","Maxthon","Opera","PhantomJS","Puffin","QupZilla","QQ","QQLite","Safari","Sailfish","SeaMonkey","Sleipnir","Swing","Tizen","Vivaldi","WeChat","Roku","amazon_silk","android","bada","blackberry","chrome","chromium","electron","epiphany","firefox","focus","generic","googlebot","google_search","ie","k_meleon","maxthon","edge","mz","naver","opera","opera_coast","phantomjs","puffin","qupzilla","qq","qqlite","safari","sailfish","samsung_internet","seamonkey","sleipnir","swing","tizen","uc","vivaldi","webos","wechat","yandex","tablet","mobile","desktop","tv","WindowsPhone","Windows","MacOS","iOS","Android","WebOS","Linux","ChromeOS","PlayStation4","EdgeHTML","Blink","Trident","Presto","Gecko","WebKit","configurable","writable","key","getParser","Error","parse","getResult","_ua","parsedResult","getUA","parseBrowser","browser","some","describe","getBrowser","getBrowserName","String","name","toLowerCase","getBrowserVersion","version","getOS","os","parseOS","getOSName","getOSVersion","getPlatform","platform","parsePlatform","getPlatformType","type","getEngine","engine","parseEngine","getEngineName","satisfies","isOS","isPlatform","h","isBrowser","compareVersion","substr","indexOf","isEngine","is","search","versionName","replace","vendor","model","Number","hasOwn","classNames","classes","arg","argType","isArray","inner","toString","includes","reactIs","require","REACT_STATICS","childContextTypes","contextType","contextTypes","defaultProps","displayName","getDefaultProps","getDerivedStateFromError","getDerivedStateFromProps","mixins","propTypes","KNOWN_STATICS","caller","callee","arity","MEMO_STATICS","compare","TYPE_STATICS","getStatics","component","isMemo","ForwardRef","render","Memo","getOwnPropertyNames","getOwnPropertySymbols","getOwnPropertyDescriptor","getPrototypeOf","objectPrototype","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","inheritedComponent","targetStatics","sourceStatics","descriptor","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","aa","ca","b","encodeURIComponent","da","Set","ea","fa","ha","add","ia","ja","ka","la","ma","v","g","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","z","ra","sa","toUpperCase","ta","pa","isNaN","qa","oa","removeAttribute","setAttributeNS","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","A","Ma","stack","trim","Na","Oa","prepareStackTrace","set","Reflect","construct","k","Pa","tag","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","constructor","getValue","setValue","stopTracking","Ua","Wa","checked","Xa","activeElement","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","ownerDocument","eb","fb","options","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","valueOf","firstChild","removeChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","charAt","substring","tb","menuitem","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","ub","vb","wb","xb","target","srcElement","correspondingUseElement","parentNode","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","addEventListener","removeEventListener","Nb","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","current","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","log","LN2","rc","sc","tc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","id","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","Date","now","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","data","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","fromCharCode","code","repeat","locale","which","Rd","Td","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","le","color","date","datetime","email","month","password","range","tel","text","time","url","week","me","ne","oe","event","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","offset","nextSibling","Le","contains","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","href","Ne","contentEditable","Oe","focusedElem","selectionRange","documentElement","start","end","selectionStart","selectionEnd","defaultView","getSelection","extend","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","left","scrollLeft","top","scrollTop","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","instance","listener","D","of","has","pf","qf","rf","random","sf","capture","passive","J","x","w","F","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","unshift","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","setTimeout","Gf","clearTimeout","Hf","Jf","queueMicrotask","catch","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","E","G","Vf","H","Wf","Xf","Yf","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","context","memoizedValue","next","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","ch","eventTime","lane","payload","callback","dh","K","eh","fh","gh","q","y","hh","ih","jh","Component","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","L","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","state","updater","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","ref","_owner","_stringRef","th","uh","vh","index","wh","xh","yh","implementation","zh","Ah","done","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","tagName","Jh","Kh","Lh","M","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","N","O","P","Sh","Th","Uh","Vh","Q","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","queue","di","ei","fi","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","R","ni","lastEffect","stores","oi","pi","qi","ri","destroy","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","digest","Li","Mi","console","error","Ni","WeakMap","Oi","Pi","Qi","Ri","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dataset","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","yj","Ej","S","Fj","Gj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","size","createElementNS","autoFocus","createTextNode","T","Hj","Ij","Jj","Kj","U","Lj","WeakSet","V","Mj","W","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","insertBefore","_reactRootContainer","Xj","X","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","display","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","src","Wk","mk","ceil","nk","ok","pk","Y","Z","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","cache","pendingSuspenseBoundaries","dl","el","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","querySelectorAll","JSON","stringify","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","isDisabled","supportsFiber","inject","createPortal","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","hasElementType","Element","hasMap","hasSet","hasArrayBuffer","ArrayBuffer","isView","equal","it","entries","RegExp","warn","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Fragment","Lazy","Portal","Profiler","StrictMode","Suspense","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isPortal","isProfiler","isStrictMode","isSuspense","isValidElementType","typeOf","__self","__source","jsx","jsxs","setState","forceUpdate","escape","_status","_result","Children","count","toArray","only","PureComponent","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","pop","sortIndex","performance","setImmediate","startTime","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","floor","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","inst","useSyncExternalStoreWithSelector","hasValue","warning","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","obj","prop","fn","thisArg","kindOf","thing","str","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","isDate","isFile","isBlob","isFileList","isURLSearchParams","allOwnKeys","len","findKey","_key","_global","globalThis","self","global","isContextDefined","TypedArray","isTypedArray","Uint8Array","isHTMLForm","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","isAsyncFn","isBuffer","isFormData","kind","FormData","append","isArrayBufferView","buffer","isBoolean","isStream","pipe","merge","caseless","result","assignValue","targetKey","stripBOM","content","charCodeAt","inherits","superConstructor","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","lastIndex","arr","forEachEntry","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","p1","p2","noop","toFiniteNumber","isFinite","generateString","alphabet","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","_classCallCheck","Constructor","TypeError","_defineProperties","_createClass","protoProps","staticProps","AxiosError","config","request","response","captureStackTrace","utils","toJSON","description","fileName","lineNumber","columnNumber","status","from","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","path","dots","token","predicates","formData","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","isFlatArray","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","params","_pairs","toFormData","encoder","_encode","buildURL","serializedParams","serializeFn","serialize","hashmarkIndex","InterceptorManager","handlers","fulfilled","rejected","synchronous","runWhen","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams","isStandardBrowserEnv","product","isStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","protocols","buildPath","isNumericKey","isLast","arrayToObject","parsePropPath","DEFAULT_CONTENT_TYPE","defaults","transitional","transitionalDefaults","adapter","transformRequest","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","formDataToJSON","setContentType","helpers","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","method","_arrayLikeToArray","arr2","_unsupportedIterableToArray","minLen","_i","_s","_e","_arr","_n","_d","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","parsed","line","parseHeaders","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","format","normalized","formatHeader","targets","asStrings","first","computed","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","accessor","transformData","fns","normalize","isCancel","__CANCEL__","CanceledError","write","expires","domain","secure","cookie","toGMTString","read","decodeURIComponent","remove","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","originURL","msie","userAgent","urlParsingNode","resolveURL","protocol","host","hash","hostname","port","pathname","requestURL","samplesCount","firstSampleTS","bytes","timestamps","head","chunkLength","startedAt","bytesCount","passed","round","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","speedometer","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","XMLHttpRequest","reject","onCanceled","requestData","requestHeaders","cancelToken","unsubscribe","signal","auth","username","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","settle","responseText","statusText","open","paramsSerializer","onreadystatechange","readyState","responseURL","onabort","onerror","ontimeout","timeoutErrorMessage","xsrfValue","withCredentials","isURLSameOrigin","cookies","setRequestHeader","onDownloadProgress","onUploadProgress","upload","cancel","abort","subscribe","aborted","parseProtocol","send","knownAdapters","http","xhr","xhrAdapter","adapters","nameOrAdapter","throwIfCancellationRequested","throwIfRequested","dispatchRequest","reason","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","deprecatedWarnings","validator","formatMessage","opt","desc","opts","assertOptions","schema","allowUnknown","Axios","instanceConfig","interceptors","configOrUrl","contextHeaders","boolean","function","requestInterceptorChain","synchronousRequestInterceptors","interceptor","promise","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","axios","createInstance","defaultConfig","Cancel","promises","spread","isAxiosError","formToJSON","batch","getBatch","ContextKey","ReactVersion","gT","ReactReduxContext","Proxy","_","handler","realContext","getContext","_target","args","createReduxContextHook","useReduxContext","notInitialized","refEquality","createSelectorHook","useDefaultReduxContext","selector","equalityFnOrOptions","equalityFn","stabilityCheck","noopCheck","store","subscription","getServerState","globalStabilityCheck","wrappedSelector","selectedState","addNestedSub","getState","useSelector","nullListeners","notify","createSubscription","parentSub","handleChangeWrapper","onStateChange","trySubscribe","clear","isSubscribed","prev","createListenerCollection","notifyNestedSubs","Boolean","tryUnsubscribe","getListeners","useIsomorphicLayoutEffect","serverState","contextValue","previousState","Context","React","createStoreHook","useStore","createDispatchHook","useDefaultStore","newBatch","useDispatch","ownKeys","enumerableOnly","symbols","sym","_objectSpread2","initializeConnect","dateOptions","year","day","hour","minute","second","dateWithoutTimeOptions","coerceToArrayBuffer","atob","coerceToBase64Url","byteLength","dateToLocaleWithoutTime","dateStr","toLocaleString","setLoginState","loginState","setTwoFactorType","factor","showModal","modal","setPluginLoadSuccess","plugin","setPluginLoadError","setPluginOperationError","setPkiAuthData","deviceId","certId","getUserInfo","sequense","userInfo","setUserInfo","loginWithoutTwoFactor","deleteDeviceFido","className","iter","_assertThisInitialized","ReferenceError","_setPrototypeOf","setPrototypeOf","__proto__","_inherits","subClass","superClass","_getPrototypeOf","_typeof","_possibleConstructorReturn","_createSuper","Derived","hasNativeReflectConstruct","sham","Super","NewTarget","ManagerReferenceNodeContext","ManagerReferenceNodeSetterContext","Manager","_ref","_React$useState","referenceNode","setReferenceNode","hasUnmounted","handleSetReferenceNode","unwrapArray","safeInvoke","_len","setRef","fromEntries","reduce","acc","getWindow","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","getBoundingClientRect","includeScale","rect","scaleX","scaleY","offsetHeight","offsetWidth","right","bottom","getWindowScroll","win","pageXOffset","pageYOffset","getNodeName","getDocumentElement","getWindowScrollBarX","getComputedStyle","isScrollParent","_getComputedStyle","overflowX","overflowY","getCompositeRect","elementOrVirtualElement","offsetParent","isFixed","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","scroll","offsets","getNodeScroll","clientLeft","clientTop","getLayoutRect","clientRect","abs","offsetLeft","offsetTop","getParentNode","assignedSlot","getScrollParent","listScrollParents","list","_element$ownerDocumen","scrollParent","isBody","visualViewport","updatedList","isTableElement","getTrueOffsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","auto","basePlacements","viewport","popper","variationPlacements","placement","placements","modifierPhases","modifiers","visited","sort","modifier","requires","requiresIfExists","dep","depModifier","debounce","DEFAULT_OPTIONS","strategy","areValidElements","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","reference","orderedModifiers","modifiersData","elements","attributes","styles","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","scrollParents","contextElement","phase","orderModifiers","existing","mergeByName","enabled","_ref3","_ref3$options","effect","cleanupFn","noopFn","update","_state$elements","rects","reset","_state$orderedModifie","_state$orderedModifie2","_options","onFirstUpdate","getBasePlacement","getVariation","getMainAxisFromPlacement","computeOffsets","basePlacement","variation","commonX","commonY","mainAxis","unsetSides","mapToStyles","_ref2","_Object$assign2","popperRect","gpuAcceleration","adaptive","roundOffsets","_offsets$x","_offsets$y","hasX","hasY","sideX","sideY","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets","getOppositePlacement","matched","getOppositeVariationPlacement","parent","rootNode","getRootNode","isSameNode","rectToClientRect","getClientRectFromMixedType","clippingParent","html","clientWidth","clientHeight","getViewportRect","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","direction","getDocumentRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","mergePaddingObject","paddingObject","expandToHashMap","hashMap","detectOverflow","_options$placement","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","padding","altContext","clippingClientRect","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","axis","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","_options$allowedAutoP","allPlacements","allowedPlacements","overflows","computeAutoPlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","fittingPlacement","within","mathMax","mathMin","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","maxLen","arrowElement","arrow","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","arrowOffsetParent","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","withinMaxClamp","_state$modifiersData$","toPaddingObject","minProp","maxProp","endDiff","startDiff","clientSize","centerToReference","center","axisProp","centerOffset","_options$element","querySelector","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","createPopper","_options$scroll","_options$resize","resize","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","initialStyles","margin","property","attribute","flip","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","EMPTY_MODIFIERS","NOOP","NOOP_PROMISE","Popper","_ref$placement","_ref$strategy","_ref$modifiers","referenceElement","innerRef","popperElement","setPopperElement","_React$useState2","setArrowElement","_usePopper","prevOptions","optionsWithDefaults","updateStateModifier","ReactDOM","popperOptions","newOptions","isEqual","popperInstanceRef","popperInstance","defaultCreatePopper","usePopper","childrenProps","hide","arrowProps","Reference","refHandler","excluded","sourceKeys","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","initialStatus","appear","isMounting","enter","appearStatus","in","unmountOnExit","mountOnEnter","nextCallback","prevState","_proto","updateStatus","prevProps","nextStatus","cancelNextCallback","getTimeouts","exit","mounting","nodeRef","forceReflow","performEnter","performExit","_this2","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","safeSetState","onEntered","onEnter","onEntering","onTransitionEnd","_this3","onExit","onExiting","onExited","nextState","setNextCallback","_this4","active","doesNotHaveTimeoutOrListener","addEndListener","maybeNextCallback","_this$props","childProps","_objectWithoutPropertiesLoose","TransitionGroupContext","globalCssModule","getScrollbarWidth","scrollDiv","scrollbarWidth","setScrollbarWidth","paddingRight","isBodyOverflowing","innerWidth","getOriginalBodyPadding","getPropertyValue","conditionallyUpdateScrollbar","fixedContent","bodyPadding","mapToCssModules","cssModule","omit","omitKeys","pick","pickKeys","warned","warnOnce","deprecated","propType","explanation","rest","DOMElement","targetPropType","tagPropType","TransitionTimeouts","Fade","Collapse","Modal","Carousel","Offcanvas","TransitionPropTypeKeys","TransitionStatuses","keyCodes","esc","space","tab","up","down","home","PopperPlacements","canUseDOM","isReactRefObj","getTag","toNumber","other","isBinary","findDOMElements","selection","isArrayOrNodeList","els","getTarget","allElements","defaultToggleEvents","addMultipleEventListeners","_els","_events","useCapture","events","focusableElements","fluid","Container","Tag","containerClass","rowColsPropType","noGutters","xs","sm","xl","xxl","widths","Row","colClasses","colWidth","colSize","isXs","colWidths","stringOrNumberProp","columnProps","getColumnSizeClass","getColumnClasses","columnProp","colSizeInterfix","colClass","Col","modifiedAttributes","light","dark","full","fixed","sticky","role","container","expand","Navbar","getExpandClass","NavbarBrand","NavbarText","NavbarToggler","tabs","pills","vertical","horizontal","justified","fill","navbar","card","Nav","getVerticalClass","NavItem","NavLink","listTag","listClassName","Breadcrumb","ListTag","label","listClasses","BreadcrumbItem","variant","CloseButton","block","outline","close","Button","ariaLabel","btnOutlineColor","onBlur","onFocus","ButtonToggle","toggled","DropdownContext","a11y","group","isOpen","nav","toggle","inNavbar","setActiveFromChild","menuRole","preventDefaultKeys","Dropdown","addEvents","handleDocumentClick","handleKeyDown","removeEvents","handleMenuRef","containerRef","menuRef","getContextValue","dropup","onMenuRef","handleProps","getContainer","getMenu","getMenuCtrl","_$menuCtrl","getItemType","getMenuItems","menuContainer","menu","clickIsInContainer","clickIsInInput","classList","clickIsInMenu","isTargetMenuItem","getAttribute","isTargetMenuCtrl","isTab","click","$menuitems","charPressed","attrs","subItemIsActive","dropdownItem","ButtonDropdown","ButtonGroup","ButtonToolbar","divider","DropdownItem","getTabIndex","getRole","tabIndex","updateOnSelect","directionPositionMap","DropdownMenu","show","position1","position2","poperPlacement","poperModifiers","combinedStyle","tagRef","caret","DropdownToggle","baseClass","baseClassActive","otherProps","transitionProps","AccordionContext","flush","Accordion","accordionContext","defaultOpen","stayOpen","UncontrolledAccordion","setOpen","accordionId","targetId","AccordionHeader","buttonClasses","collapsed","AccordionItem","transitionStatusToClassHash","dimension","getDimension","isAppearing","collapseClass","getTransitionClass","AccordionBody","pill","Badge","inverse","Card","CardGroup","CardDeck","CardColumns","CardBody","CardLink","CardFooter","CardHeader","CardImg","cardImgClassName","CardImgOverlay","CarouselItem","startAnimation","CustomEvent","isIn","slide","isActive","directionClassName","itemClasses","CarouselContext","handleKeyPress","renderItems","hoverStart","hoverEnd","handleTouchStart","handleTouchEnd","touchStartX","touchStartY","activeIndex","indicatorClicked","ride","setInterval","clearInterval","interval","cycleInterval","pause","mouseEnter","mouseLeave","evt","keyboard","previous","enableTouch","currentX","currentY","diffX","carouselItems","item","fade","outerClasses","innerClasses","onMouseEnter","onMouseLeave","controlLeft","controlRight","indicators","wrappedIndicators","onClickHandler","onTouchStart","onTouchEnd","nextProps","newState","CarouselControl","directionText","anchorClasses","iconClasses","screenReaderClasses","cursor","CarouselIndicators","items","idx","indicatorClasses","caption","values","CarouselCaption","captionHeader","captionText","controls","autoPlay","defaultActiveIndex","goToIndex","UncontrolledCarousel","animating","nextIndex","newIndex","slides","alt","altText","CardSubtitle","CardText","CardTitle","popperClassName","placementPrefix","arrowClassName","hideArrow","boundariesElement","onClosed","PopperContent","setTargetNode","getTargetNode","getRef","_element","childNodes","targetNode","getContainerNode","renderChildren","_arrowClassName","_popperClassName","modifierNames","baseModifiers","extendedModifiers","popperTransition","ReactPopper","popperPlacement","PopperTargetHelper","popperManager","innerClassName","autohide","trigger","DEFAULT_DELAYS","isInDOMSubtree","subtreeRoot","isInDOMSubtrees","subtreeRoots","subTreeRoot","TooltipPopoverWrapper","_targets","currentTargetElement","addTargetEvents","removeTargetEvents","showWithDelay","hideWithDelay","onMouseOverTooltipContent","onMouseLeaveTooltipContent","onEscKeyDown","_isMounted","updateTarget","clearShowTimeout","clearHideTimeout","_hideTimeout","_showTimeout","getDelay","_popover","getCurrentTarget","parentElement","composedPath","triggers","addEventOnTargets","isBubble","removeEventOnTargets","newTarget","popperClasses","onMouseOver","onKeyDown","Popover","UncontrolledPopover","PopoverHeader","PopoverBody","bar","multi","animated","striped","barClassName","barStyle","barAriaValueText","barAriaLabelledBy","Progress","percent","progressClasses","progressBarProps","defaultNode","FadePropTypes","centered","fullscreen","scrollable","labelledBy","backdrop","onOpened","wrapClassName","modalClassName","backdropClassName","contentClassName","external","backdropTransition","modalTransition","unmountOnClose","returnFocusAfterClose","trapFocus","propsToOmit","_originalBodyPadding","_originalBodyOverflow","getFocusableChildren","handleBackdropClick","handleBackdropMouseDown","handleEscape","handleStaticBackdropAnimation","handleTab","manageFocusAfterClose","clearBackdropAnimationTimeout","showStaticBackdropAnimation","init","setFocus","ev","_dialog","modalIndex","openCount","getFocusedChild","currentFocus","focusableChildren","_mouseDownElement","totalFocusable","focusedIndex","_backdropAnimationTimeout","_triggeringElement","_mountContainer","modalOpenClassName","modalOpenClassNameRegex","renderModalDialog","dialogBaseClass","isModalHidden","modalAttributes","onMouseDown","onKeyUp","hasTransition","Backdrop","wrapTag","closeAriaLabel","ModalHeader","closeButton","WrapTag","ModalBody","ModalFooter","Tooltip","bordered","borderless","hover","responsive","responsiveTag","Table","ResponsiveTag","table","responsiveClassName","numbered","ListGroup","getHorizontalClass","inline","Form","submit","valid","tooltip","FormFeedback","validMode","row","switch","floating","FormGroup","switchProp","formCheck","FormText","bsSize","invalid","plaintext","addon","Input","checkInput","isNotaNumber","selectInput","rangeInput","formControlClass","InputGroup","InputGroupText","hidden","Label","htmlFor","colFormLabel","formLabel","heading","middle","Media","defaultTag","media","offcanvasTransition","offcanvasIndex","_backdrop","isOffcanvasHidden","offcanvasAttributes","visibility","OffcanvasBody","OffcanvasHeader","Pagination","PaginationItem","PaginationLink","defaultAriaLabel","defaultCaret","TabContext","activeTab","TabContent","activeTabId","tabId","TabPane","getClasses","closeClassName","Alert","closeClasses","alertTransition","Toast","toastTransition","ToastBody","icon","ToastHeader","tagClassName","iconProp","xmlns","preserveAspectRatio","focusable","handleDisabledOnClick","ListGroupItem","ListGroupItemHeading","ListGroupItemText","List","ListInlineItem","UncontrolledButtonDropdown","toggler","toggleEvents","UncontrolledCollapse","togglers","removeEventListeners","UncontrolledDropdown","onToggle","UncontrolledTooltip","Spinner","Placeholder","PlaceholderButton","createEvent","initCustomEvent","viewBox","clipPath","step","fullWidth","cn","_regeneratorRuntime","Op","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","_invoke","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","invoke","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","info","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","isGeneratorFunction","genFun","ctor","mark","awrap","async","skipTempReset","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","sourceSymbolKeys","propertyIsEnumerable","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","getSide","getAlignment","getOppositeAxis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rtl","alignment","alignmentAxis","mainAlignmentSide","getExpandedPlacements","getOppositeAlignmentPlacement","getOppositeAxisPlacements","flipAlignment","isStart","lr","getSideList","getPaddingObject","expandPaddingObject","computeCoordsFromPlacement","coords","sideAxis","alignLength","commonAlign","computePosition","middleware","validMiddleware","isRTL","getElementRects","statefulPlacement","middlewareData","resetCount","initialPlacement","nextX","nextY","_await$platform$isEle","getScale","offsetScale","convertOffsetParentRelativeRectToViewportRelativeRect","convertValueToCoords","mainAxisMulti","crossAxisMulti","crossAxis","hasWindow","isNode","_node$ownerDocument","Node","isOverflowElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","containerType","backdropFilter","CSS","supports","isLastTraversableNode","scrollX","scrollY","getNearestOverflowAncestor","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","frameElement","getFrameElement","getCssDimensions","parseFloat","hasOffset","shouldFallback","$","unwrapElement","domElement","noOffsets","getVisualOffsets","isFixedStrategy","scale","visualOffsets","floatingOffsetParent","shouldAddVisualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","paddingLeft","paddingTop","leftScroll","getHTMLOffset","ignoreScrollbarX","htmlRect","getClientRectFromClippingAncestor","clippingAncestor","visualViewportBased","hasFixedPositionAncestor","stopNode","getRectRelativeToOffsetParent","offsetRect","htmlOffset","isStaticPositioned","polyfill","rawOffsetParent","svgOffsetParent","getOffsetParentFn","getDimensionsFn","getDimensions","floatingDimensions","topLayer","elementClippingAncestors","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingElementAncestors","_c","clippingAncestors","firstClippingAncestor","getClientRects","rectsAreEqual","autoUpdate","ancestorScroll","ancestorResize","elementResize","ResizeObserver","layoutShift","IntersectionObserver","animationFrame","referenceEl","ancestors","frameId","cleanupIo","onMove","timeoutId","io","root","cleanup","_io","disconnect","refresh","skip","threshold","elementRectForRootMargin","rootMargin","isFirstUpdate","handleObserve","observe","ratio","intersectionRatio","observeMove","reobserveFrame","resizeObserver","firstEntry","unobserve","cancelAnimationFrame","requestAnimationFrame","_resizeObserver","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","diffCoords","_middlewareData$offse","_middlewareData$arrow","alignmentOffset","checkCrossAxis","limiter","detectOverflowOptions","mainAxisCoord","crossAxisCoord","maxSide","limitedCoords","fallbackStrategy","fallbackAxisSideDirection","initialSideAxis","hasFallbackAxisSideDirection","overflowsData","_middlewareData$flip","sides","_middlewareData$flip2","nextPlacement","resetPlacement","_overflowsData$filter","_overflowsData$filter2","currentSideAxis","arrowDimensions","isYAxis","clientProp","largestPossiblePadding","minPadding","maxPadding","min$1","shouldAddOffset","mergedOptions","platformWithCache","computePosition$1","core","process","REACT_TOOLTIP_DISABLE_CORE_STYLES","REACT_TOOLTIP_DISABLE_BASE_STYLES","insertAt","getElementById","getElementsByTagName","styleSheet","cssText","elementReference","tooltipReference","tooltipArrowReference","place","middlewares","border","tooltipStyles","tooltipArrowStyles","borderBottom","borderRight","SVGElement","scrollingElement","anchorRefs","activeAnchor","attach","detach","setActiveAnchor","getTooltipData","j","noArrow","clickable","closing","success","classNameArrow","anchorId","anchorSelect","openOnClick","positionStrategy","wrapper","delayShow","delayHide","float","closeOnEsc","closeOnScroll","closeOnResize","openEvents","closeEvents","globalCloseEvents","imperativeModeOnly","afterShow","afterHide","disableTooltip","contentWrapperRef","defaultIsOpen","setIsOpen","arrowColor","dblclick","mousedown","mouseover","mouseenter","mouseout","blur","mouseleave","mouseup","clickOutsideAnchor","isConnected","MutationObserver","oldValue","removedNodes","flatMap","addedNodes","childList","subtree","attributeFilter","attributeOldValue","background","disableStyleInjection","getAttributeNames","startsWith","disableCore","disableBase","title","withLabel","onSubmit","submitButtonText","submitButtonDisabled","withDelimeter","footerLinks","footerError","isCreate","credential","isWithoutLogin","setError","mfaName","setMfaName","handleMfaNameChange","createOrUpdate","attestationObject","clientDataJSON","rawId","attestationResponse","extensions","getClientExtensionResults","AttestationObject","clientDataJson","confirmRegisterFido","maxLength","placeholder","onChange","Status","freeze","Idle","Loading","Success","Factor","FIDO","TOTP","PKI","cx","cy","stroke","fillRule","clipRule","rx","setStatus","register","challenge","user","excludeCredentials","authenticatorSelection","authenticatorAttachment","credentials","publicKey","registerFido","EditDeviceNameModal","setChecked","setVisible","fidoKeys","setIsWithoutLogin","RegisterFidoModal","StepButton","currentStep","stepId","toNextStep","btnTitle","hashMode","changeHashMode","timeStep","changeTimeStep","changeSecret","setTotpParams","generateSecret","generatedSecret","QrCodeRenderer","qrCodeLink","setQrCodeLink","collapse","setCollapse","totpParams","dataUri","RenderError","totpPassword","changeTotpPassword","verified","setVerified","checkParams","checkTotp","setStep","toStep","BucketIcon","xmlnsXlink","shapeRendering","textRendering","strokeLinecap","setList","visible","initFidoRef","scrollIntoView","behavior","deleteDevice","DeleteDeviceModal","deleteDeviceCredential","newKeys","renameDevice","overflowWrap","lastLogin","isPasswordLess","TotpKeyRow","totpkey","removeDevice","totpKey","LogoutIcon","_createForOfIteratorHelper","allowArrayLike","normalCompletion","didErr","_e2","NoSupportPlatformError","NoSupportOsError","supportedOs","NoSupportBrowserError","supportedBrowsers","NoInstalledPluginError","needExtension","NoSupportBrowserVersionError","NoSupportPluginVersionError","Default","versions","browserSupportedVersions","pluginVersion","extensionCheck","SputnikBrowser","macOS","allowUnknownBrowserVersion","BrowserCompatibility","detectedBrowser","Bowser","defaultOS","supportedBrowsersConfig","maxTouchPoints","browsers","brs","detector","browserName","lastVersion","browserConfigVersion","getBrs","currentVersion","minVersion","splitVersions","minimum","curr","isVersionValid","errorCodes","UNKNOWN_ERROR","BAD_PARAMS","NOT_ENOUGH_MEMORY","DEVICE_NOT_FOUND","DEVICE_ERROR","TOKEN_INVALID","CERTIFICATE_CATEGORY_BAD","CERTIFICATE_EXISTS","CERTIFICATE_NOT_FOUND","CERTIFICATE_HASH_NOT_UNIQUE","CA_CERTIFICATES_NOT_FOUND","CERTIFICATE_VERIFICATION_ERROR","PKCS11_LOAD_FAILED","PIN_LENGTH_INVALID","PIN_INCORRECT","PIN_LOCKED","PIN_CHANGED","SESSION_INVALID","USER_NOT_LOGGED_IN","ALREADY_LOGGED_IN","ATTRIBUTE_READ_ONLY","KEY_NOT_FOUND","KEY_ID_NOT_UNIQUE","CEK_NOT_AUTHENTIC","KEY_LABEL_NOT_UNIQUE","WRONG_KEY_TYPE","LICENCE_READ_ONLY","DATA_INVALID","UNSUPPORTED_BY_TOKEN","KEY_FUNCTION_NOT_PERMITTED","BASE64_DECODE_FAILED","PEM_ERROR","ASN1_ERROR","FUNCTION_REJECTED","FUNCTION_FAILED","MECHANISM_INVALID","ATTRIBUTE_VALUE_INVALID","X509_UNABLE_TO_GET_ISSUER_CERT","X509_UNABLE_TO_GET_CRL","X509_UNABLE_TO_DECRYPT_CERT_SIGNATURE","X509_UNABLE_TO_DECRYPT_CRL_SIGNATURE","X509_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY","X509_CERT_SIGNATURE_FAILURE","X509_CRL_SIGNATURE_FAILURE","X509_CERT_NOT_YET_VALID","X509_CRL_NOT_YET_VALID","X509_CERT_HAS_EXPIRED","X509_CRL_HAS_EXPIRED","X509_ERROR_IN_CERT_NOT_BEFORE_FIELD","X509_ERROR_IN_CERT_NOT_AFTER_FIELD","X509_ERROR_IN_CRL_LAST_UPDATE_FIELD","X509_ERROR_IN_CRL_NEXT_UPDATE_FIELD","X509_OUT_OF_MEM","X509_DEPTH_ZERO_SELF_SIGNED_CERT","X509_SELF_SIGNED_CERT_IN_CHAIN","X509_UNABLE_TO_GET_ISSUER_CERT_LOCALLY","X509_UNABLE_TO_VERIFY_LEAF_SIGNATURE","X509_CERT_CHAIN_TOO_LONG","X509_CERT_REVOKED","X509_INVALID_CA","X509_INVALID_NON_CA","X509_PATH_LENGTH_EXCEEDED","X509_PROXY_PATH_LENGTH_EXCEEDED","X509_PROXY_CERTIFICATES_NOT_ALLOWED","X509_INVALID_PURPOSE","X509_CERT_UNTRUSTED","X509_CERT_REJECTED","X509_APPLICATION_VERIFICATION","X509_SUBJECT_ISSUER_MISMATCH","X509_AKID_SKID_MISMATCH","X509_AKID_ISSUER_SERIAL_MISMATCH","X509_KEYUSAGE_NO_CERTSIGN","X509_UNABLE_TO_GET_CRL_ISSUER","X509_UNHANDLED_CRITICAL_EXTENSION","X509_KEYUSAGE_NO_CRL_SIGN","X509_KEYUSAGE_NO_DIGITAL_SIGNATURE","X509_UNHANDLED_CRITICAL_CRL_EXTENSION","X509_INVALID_EXTENSION","X509_INVALID_POLICY_EXTENSION","X509_NO_EXPLICIT_POLICY","X509_DIFFERENT_CRL_SCOPE","X509_UNSUPPORTED_EXTENSION_FEATURE","X509_UNNESTED_RESOURCE","X509_PERMITTED_VIOLATION","X509_EXCLUDED_VIOLATION","X509_SUBTREE_MINMAX","X509_UNSUPPORTED_CONSTRAINT_TYPE","X509_UNSUPPORTED_CONSTRAINT_SYNTAX","X509_UNSUPPORTED_NAME_SYNTAX","X509_CRL_PATH_VALIDATION_ERROR","CMS_CERTIFICATE_ALREADY_PRESENT","CANT_HARDWARE_VERIFY_CMS","PluginError","DEFAULT_ERROR","ru","getErrorCodesRussian","en","getErrorCodesEnglish","getCurrentErrorCodes","translateErrorByCode","hashAlgorithms","HASH_TYPE_GOST3411_94","HASH_TYPE_GOST3411_12_256","HASH_TYPE_GOST3411_12_512","HASH_TYPE_MD5","HASH_TYPE_SHA1","HASH_TYPE_SHA256","HASH_TYPE_SHA512","keyAlgorithms","PUBLIC_KEY_ALGORITHM_GOST3410_2012_256","additional","paramset","signatureSize","PUBLIC_KEY_ALGORITHM_GOST3410_2012_512","PUBLIC_KEY_ALGORITHM_RSA","PUBLIC_KEY_ALGORITHM_GOST3410_2001","Plugin","browserCompatibility","isCurrentBrowserSupported","needToCheckInstalledExtension","pluginObject","getSupportedBrowsersByPluginVersion","bindMethods","bindAlgorithms","setLocale","getBrowserCompatibility","screen","hexToBigIntString","hexString","hex","replaceAll","BigInt","rethrow","getPkiDevices","tokenInfos","TOKEN_INFO_SERIAL","TOKEN_INFO_SUPPORTED_MECHANISMS","TOKEN_INFO_FEATURES","TOKEN_INFO_SPEED","enumerateDevices","deviceIds","tokenInfo","getDeviceInfo","device","serial","mechanisms","features","speed","isPinCached","modelInfo","knownModels","knownDevices","RutokenModel","findSecondArrayInFirst","firts","mechType","implType","featureName","mechsSignGost2012","mechsSignGost2001","mechsSignRsa","PUBLIC_KEY_ALGORITHM_RSA_512","PUBLIC_KEY_ALGORITHM_RSA_768","PUBLIC_KEY_ALGORITHM_RSA_1024","PUBLIC_KEY_ALGORITHM_RSA_1280","PUBLIC_KEY_ALGORITHM_RSA_1536","PUBLIC_KEY_ALGORITHM_RSA_1792","PUBLIC_KEY_ALGORITHM_RSA_2048","mechsSignRsa4096","PUBLIC_KEY_ALGORITHM_RSA_4096","mechsHash94","mechsHash2012","mechGostCipher","CIPHER_ALGORITHM_GOST28147","ecp3_0Mechanisms","ecp2_0Mechanisms","ecpMechanisms","RutokenEcp3_0","isSupported","RutokenEcp2_0","RutokenEcpFlash2_0","RutokenEcpTouch2_0","RutokenEcpFlashTouch2_0","RutokenEcpPki2_0","RutokenEcp2151","RutokenEcp2_0Bluetooth","RutokenPinpad2_0","RutokenEcp","RutokenEcpBluetooth","RutokenEcpPki","RutokenEcpFlash","RutokenLite","knownDeviceModels","modelName","getRutokenModelName","enumerateCertificates","CERT_CATEGORY_USER","certIds","parseCertificate","certificate","serialNumber","subjectProp","subject","rdn","certs","devices","serialNumbers","cert","flat","dbCerts","lastLoginDate","toSorted","setPluginDevicesLoadSuccess","loginByCert","pkiAuthData","sign","DATA_FORMAT_PLAIN","detached","addUserCertificate","useHardwareHash","cms","operationStatus","pkiKeys","certSerial","deletePki","bindedDevices","pkiKey","commonName","validNotAfter","getBindedDevices","renderBindedDevicesWithCerts","maskUnits","mask","x1","y1","x2","y2","gradientUnits","stopColor","rel","onSelect","handleSelect","fieldType","setFieldType","autoComplete","feedback","img__eye","renderEyeIconClass","onSuccess","pinCode","setPinCode","isUnknownError","setIsUnknownError","isBlocked","setIsBlocked","retriesLeft","setRetriesLeft","handleSuccessLogin","TOKEN_INFO_PINS_INFO","isPinDefault","handleErrorLogin","backgroundImage","inputValue","login","DEFAULT_PIN_CODE","newPin","setNewPin","repeatPin","setRepeatPin","errorNewPin","setErrorNewPin","errorRepeatPin","setErrorRepeatPin","handlePinChange","setCallback","validateCallback","validateNewPin","validateRepeatPin","changePin","handleCorrectNotDefaultPinCode","userName","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","minutes","seconds","milliseconds","publicKeyAlgorithm","keyType","KEY_TYPE_COMMON","generateKeyPair","keyId","createPkcs10","keyUsage","pkcs10Request","pem","resp","importCertificate","bindPki","onDeviceSelected","isDefaultPin","strokeLinejoin","onInstalled","loadError","intervalId","isSomethingNotInstalled","isExtensionNotInstalled","isPluginNotInstalled","pluginLink","getPluginDownloadLink","extensionLink","getExtensionDownloadLink","loadStatus","PKIBindModal","RenderTwoFactor","totpKeys","RenderDeviceInit","RenderTwoFactorInit","selectedFactor","setSelectedFactor","renderFactorBlock","DevicesContainer","hoursLeft","minutesLeft","isRegisterView","setIsRegisterView","setUserName","setPassword","repeatPassword","setRepeatPassword","registerViewToggle","isContinueDisable","handleUserNameChange","handlePasswordChange","handleRepeatPasswordChange","toSingUp","twoFactorType","signInOrUp","loginFIDO","allowCredentials","assertedCredential","authData","authenticatorData","sig","signature","errorMsg","setErrorMsg","isVerified","setIsVerified","setCode","handleCodeChange","verifyTotp","finally","isLoading","setIsLoading","renderDeviceText","renderCerts","handleSelectCert","filteredDevices","found","getFilteredDevices","AuthRenderer","TwoFactor","createThunkMiddleware","extraArgument","thunk","withExtraArgument","formatProdErrorMessage","$$observable","observable","randomString","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","proto","createStore","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","replaceReducer","nextReducer","outerSubscribe","observer","observeState","compose","funcs","pluginInitialState","operationError","rootReducer","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","hasChanged","previousStateForKey","nextStateForKey","combineReducers","MODAL","WrappedModalComponent","_dispatch","middlewareAPI","_objectSpread","applyMiddleware","rootElement"],"sourceRoot":""}