diff --git a/.changeset/upset-bobcats-open.md b/.changeset/upset-bobcats-open.md new file mode 100644 index 00000000..6117b6d2 --- /dev/null +++ b/.changeset/upset-bobcats-open.md @@ -0,0 +1,5 @@ +--- +'@monocloud/auth-web-js': patch +--- + +Inital release of @monocloud/auth-web-js diff --git a/.changeset/web-js-signout-path-and-default-app-url.md b/.changeset/web-js-signout-path-and-default-app-url.md new file mode 100644 index 00000000..b3ef5c4c --- /dev/null +++ b/.changeset/web-js-signout-path-and-default-app-url.md @@ -0,0 +1,10 @@ +--- +'@monocloud/auth-web-js': patch +--- + +Refine sign-out and redirect URI handling in `@monocloud/auth-web-js`: + +- Renamed the `signOutCallbackPath` option to `signOutPath`. +- Made `appUrl` optional; it now defaults to the current page's origin (`window.location.origin`). +- Sign-out now always sends a `post_logout_redirect_uri`, defaulting to the app root when `signOutPath` is not set (mirroring how `callbackPath` defaults to the root for sign-in). +- Redirect and post-logout redirect URIs now have any trailing slash trimmed, and callback URL matching in `processCallback()` trims trailing slashes too, so they compare consistently. diff --git a/docs-gen/hook.mjs b/docs-gen/hook.mjs index 73a6accf..bc8dd25c 100644 --- a/docs-gen/hook.mjs +++ b/docs-gen/hook.mjs @@ -18,6 +18,7 @@ const ROOT_SDK_NAME_REPLACEMENTS = [ ['@monocloud/auth-node-core', 'Node.js Core'], ['@monocloud/auth-core', 'Node.js'], ['@monocloud/backend-node', 'Node.js Backend'], + ['@monocloud/auth-web-js', 'JavaScript'], ]; const Type = { @@ -290,6 +291,11 @@ export const load = app => { ); } + page.contents = page.contents.replace( + /#### Implementation of\n\n.+?(\n\n|\n?$)/g, + '' + ); + if (type === Type.Components) { const signatureRegex = /> \*\*.*?\*\*[\s\S]*?(\n\n|$)/; page.contents = page.contents.replace(signatureRegex, ''); diff --git a/docs-gen/post-generate.mjs b/docs-gen/post-generate.mjs index 58a53efd..6226b351 100644 --- a/docs-gen/post-generate.mjs +++ b/docs-gen/post-generate.mjs @@ -8,6 +8,7 @@ const SDK_SLUGS = { '_monocloud_auth-node-core': 'nodejs-core', '_monocloud_auth-core': 'nodejs', '_monocloud_backend-node': 'nodejs-backend', + '_monocloud_auth-web-js': 'web-js', }; const CATEGORY_MAP = { diff --git a/docs/html/assets/hierarchy.js b/docs/html/assets/hierarchy.js index a8deb72f..c9f61fd0 100644 --- a/docs/html/assets/hierarchy.js +++ b/docs/html/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "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" \ No newline at end of file +window.hierarchyData = "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" \ No newline at end of file diff --git a/docs/html/assets/navigation.js b/docs/html/assets/navigation.js index 0a8dd576..187f40f9 100644 --- a/docs/html/assets/navigation.js +++ b/docs/html/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "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" \ No newline at end of file +window.navigationData = "eJzNnV1z3LYVhv/LXjtt42nS1leVN3ZsxbI0Wju9yHg0NAlpWXEJFsRGUjv57x1+LYnvc/BBeXzn4XkfgOSSAN6X0G//23DyyDevNv880JrmFT0WmxebfF9WBSP15tVvpwOyI99/l1NGNi82Tcb3m1ebAy2OFWn/fHOqvTkd9ac9P1SbF5v7si42r17qNcu6II9Avf5YkOpZnpO2/UTvST1rlzUn7DbL7fKLUgn1w49/vNARtlVWHtoAziBgpRUFIy2eMZRZlY98T2pe5hknlw0vaY2nqBJAImULGH9qwBzKZMRf/vG37394KWEoK/+bdQ26yljmcYlUCVfHdjzjxIfTF9rUt1lVfc3ye7+uiNVWTlWSmndNuiB8TwvEBZJLXZdoSwuy3WdVReo7gqep1S7gT2XbVNmTcp87WWKhC/OmLnakbaebhnDC0BdMp2G7bD8zemwQPeqPd3XkfRHwgBOKbU1/X3NG24bk3PMBpAhYaW17JOyC8KzIeIZGCdV2zueWsPd1f6J9O6bRsDHPH+6xiPOHe4ciutVdjV2zfUeygjD/X4dGwk7kfvfwqdCmfkFruu3Kuyff66wlbxijbEblVda2do5eQoR+//LvOujw0B1vjq4U20ezEqjT7zhvAjp8Kgd19rIs8tdZfk/qsbV+UEXGD+75q3YKgs57Vxx6DpCdHw4X7zE/pHp3ObExTrbHWb4KuLfHYlBHx5e9d/fGelCn+vdyQL/melDXuneYd7+6YlCnfs2qsuhH6gE9k0Rs3busx1O+ZSTjZX2HGHwpta6B2FXGrknb0Br/eF+U2s7jFaOHhiP6MBQ4G35s96SIMBczCtk6dU1uCc/3wyDqlno+QvQqDi4j7f5nlnk/tzQSAOJ4W4UxRRE7dbixLmhBMNMpoc51C00Hf+pUPSB9nQuyI/mRlfzprLqjrOT7A4akFrtw/RMUfX2GKtsF6Y+YH2IBo0Kzko3f/UbK+pb6PqzkehtrbBw5f+CLtTTPW98qprbiy6IdR15WC551BbM/FrSCWZCcPS0fyLfHOu9bY1Meq0TCj39dtHY8QrNWhQEYVqx0JGVgg+FoRzUChdQ+52mscuv6nie53E3yO09isYVyR2rCMk4+0jrHdkaoBTCuftm+8UR0pQCCzyURai2McrnogmQItRZGk7GWmFZ0QSSNgq1P3UOwzirMY+pmKgI9r27LupD8Fkg/ZshJwHr5+dXxa1Xmu/LuF/L0ltHDsCAnLlPhwFZRpTFf+n9zk3rZB/L1u38D3gHDcTF9sVExnTMmAKDeGMKtEvUBflXTVJ0DVNJaegjoh2mivlQM8ZB8zDERmtIeM5ESGmQKMplFppBSmGQCBGGTjUd69kYoj2nHiZT0hpzI87DkyG12rPo2yhcNAFSq4zqAImsdD1Bgol1AwodJovfTSlYI9hxF9TSuo8BA+I7F8Kj0YEylDl+TsKwfiXQLHagTJdU6Txne1BRxcFtzxynL7jweeVNlDANTEI5lYcqiSUxMCYKyMT/QPKuU829a3xZIy1Lroj05UPbkxxBqQc4A0jAVaWtbpnp6ctNUj8XZpudtEGwsRxp2vjSsMQl16Ay0RB6dnpbKpdPTkD4dYlHawoP5qmBPUE9K5wrqeQhf8FTzL/L1fBf2U1hIYJHeA0CLmO2Mo+1QAZrcEBVoUEuUtnyap6F6syx0dgTku4ryKzivInBl71WAr+e+ylgP/zUUl9Tp1QETeb0SKpXbq8Uk8nsFFt7xHU+038haLLa9CnblXf3e/64Qym13w3DgrqxCXjUaERfz8hiGm+udNroHwT0A8jLIBYbbIvcwp0dCEnta0E5jUOsQaSxqHSmqSS0A0tjUOkQao1pHSmBVC5hUZrUWEtuu1kKiG9YCJbFlLbBSmdZLSELbWo9ZxbjWoyNY1zUtCPCbztOhMQ3sWTSdhy0zEtjYCiLEycZw7I52lE89FWZKQ9sCS+hp66jJbG0dDOxsh1w4SSOykW6ixf/kVCGlt7kVJN7p3lJ6Xwb98AQF2wnFudwyZiWjW8Z6eN0eiyAyVVGJbq9riHEddgWQxmSXMXCffTbL+hv4mvznSFruB9Vr4fCIqbeb715HxuUMFCIoaoD3/xUOOAIANellQiyfXqObxKpXOSi33tfllrEhRnfwK0cvBer2ljICtb8s2EkE1GGEr25E4r9IxjtuRnjir1TNXIQNHqejmO4hkxouKDimEfKmkkWAwIB3k6ICQ9IjJ4EXc9AA4TAZCiMPE6OIMEY0aHngw29hVQ/TjM5BitOAXgmG5oHrDVolOPoqY7zMqngtEAWjZ3mM8HRxHjsycqLHCEsX6jEiUd/7d1t1bPdZXZPqA72jR2dqQ8ZqJFzTtMu6GwEhozUqVyPiJksnF8rSnEmdenCf0P3ZEY79ekhHVURiZ5VkaNQdHBTxFcJECnPlPJHMXy9SpCGvs6uDAZwo7qPSUiV+TCRY6Cc7kF3Jya9ZdcSjxOr4ASOF55sx+lDeEl4e/B42koY7AxRyV6LiRsjoj44VPf0jQ2ABoNDnF+LB5ZU30vGiR45mSJLUkSyfJnhkoKTJHhlgUeNHMiNNAslASRNCMsAS5JBkUqookokTO41k4kQPJMmgxJkkGZcqliRxEiaTjKRVwklGeox8EnnkkK01huNAZzaXTAmHZK6xH0zBpDmsgkv1CCSNiu0V3zDKSc4H1+BKCJdbLplAVCQsd8uVfCxqJCNgTVK23h5b0p0ffB/HQs1dN4vn9NDQmtQcfsPNJaA7ZBjxYlo/6w+1lkszHHDFaIO7GjKiVwAMx/27cSmvfCn9uDzy0I5MEq6efIa9o7SMz7bX03BAaDdGBVsvsE+0E+AG8XAbf62k8DpbN+JvnhTuRwwptlN5wDlUwKKofQ2kKBnJ+Sca8LOd+LKYpf/yoRF6r5XUzeO+CCMdWIR3gCbM7y4BKcK7gn6q5K4AwcR2mwa6Fi8hgGvxZ03TG7jsrCnfZXVREfa2xrJUBQz2sh4u60+kLkkxSng3QauGa04/84jbJpMkuGFbWvf/5XO3CQqOu204thuPBXV6IQCJbSMi4gIOlQ/v6i/KoqjIQ8YwA+UBJpZbnuDeToncNYRB4pNqXuJ8Is3HltPD6c3aX/eLjOd75D1j0XE1ARl1XlKROedHzjLdNmXQyykJ2C7lHUEtcC0pc6nl9vSMTi85qNz03RR59umObk1d7o1HKlvqTORItqAOyWOj/0yQioD88SN86nuJSbS1msiA5J3LdvkREmZGMkCk+qhrmSIHtpDp/ceixFOX6M9FCRBHivuwTCujz5dQbTlf3tnqJSwgWN1V+AyOdAKuJ4NQ431v6FSAMW50hlzLxQfIMWFuLRKX5J4HduGdVbRAHf5IHjk4Ma/lzgqwJDc4N66lJQuN62mIM4kKbmtpqNQ2IkKthyXKT2thqcPTNugayWkAP2Fs2kZPmZnWc1cLTJvxqdPSWnLCqLSZFzsnrSUlDElreYiEdPfyWbz4hEU41CjJJuQaLcm1yqpbUEsUNVxzrkl7rNwRXXMLBgF31BkfVV8yvXLq+BXqZFFxEbJKTlxGeoTE74jPSVzUQRARV9zdcsgGRVlzB2o6mwYL0wtkUJJ+jFqgZ8ZjnS0MNRxx1pS+4mdN6XZlz5qys5Z8Bwc6FcdXDePxnlkTGQvMmZwKmjjcBsclxVnT7Aj7vTNtRjMXezeadAD3vqkU7UQ7G+M04cPdBS9fQSzCGQtSLRAVeo8Bbq7xd44MiQnPCFg6rDuqdwi6a70rC9JfZm8DE6IKuIe6+uF9uXwjdJ+O+Fxesxrwgs8CylsqvE1aSWzDAu9ISQdxha4JP7I69CzMKq6OM/+kz0CWBRDpHu+zbBCynWaxmbgIn66j9hzftXxspK7CPuPBfcEm0pJ9vqbDpPh2bclJ/uGaAFvnqzURCf5kze9zqCUM8i3UMkPXfVJA6qLPyFujdMsDYR8IdJsQPVDWZ/R1B5DHRozAuaiz4s1Yi43zwYxlF1QRtAaWlkbum0FBWf5XblxnE8yqzlAMfDdDVyvQGxv2x28J4+Vt3/Rr0tLqd+t4GdYGjaarMe+3Wb53/sJc+EHFnjXgjLYNfATtRMqCVjpq5zUnGv532DwSA2569PyACxlhTzgAIvb2cG4kaqe48wce58F5EgI5BPDshIsbkKR4PUh/7MKHbusb3BBF1q8xkX5YTkDEPAS4Lfh97sbWx7xOiqxfY2JfJxMAdJ0gqQp4SxAZC6BvCmYjXVSM4whuA8J/BC+Au+DI5fBxXBjpHjTpAlZPdMl29HhP0Yq7fAnEQ7fpiDDAFXRcnR1vR7KYokTquFnZdhKmqvMHnq5JWnHdxHdu123W8vL2yWvuOdauO/ecoP5zz7eDgv/c89QEs+oKc8+pFc859xTbsPrcc8KvOPc8Idefe57QzzL3nOmrzT0nZMK55wKx1txzRq4795y56849J+6zzz2Vhnwbc093s9abeypteY65p9KIb2Pu6W7WWnNPtSXrzT0V9jPMPZU2rDn3nODPMvec4AFzz3eU2v5INpDcqawz35TAK8w3J+IzzzenZnxD8025SeD5Jm6zEgHvtVuJx0hJ2bTEPUjyncSN39KvPW9bYteZqo1fuyaenU2fI68zIZu+4F1tDpbsk2ENJfZM66SadHI1UVaYT02oFaZQwd8+B8yaJPYzTpRcLUk8Nwr6UDlgOiR/Uvt8MyBXS5JOegK+Y/aZ54R9nOg9tfH/ki/K/EL+8AI9pQiGphrUL/Z6X3kcP5Cfe+gutsLDHXJvES/wYm8QrxGPvj28mRF9c3gzKtbW8BpC9I3hzYzo28KbUXE3hddwEmwJb6FE3BDeQom5HbwGk24zeA0swVbwKiXNRvA2Tupt4G1sn03gv/zx5f+0meee" \ No newline at end of file diff --git a/docs/html/assets/search.js b/docs/html/assets/search.js index afe09c2f..3913d592 100644 --- a/docs/html/assets/search.js +++ b/docs/html/assets/search.js @@ -1 +1 @@ -window.searchData = "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phzkKSFTVmTKS4wsB3lKyJQVmfIiI8tBnpIyZVWmvMjISpCnpEzHF///n/70+de/v3z7/vLpf/z66eXf/vSv//N//unDx48vv//+8/evf3359U8//ceffv7sS5bmT+tb/ulf/+NPueY//et//OdPfxqPh/8jvT6I+tf/+M///On45v7147uutdcfw+Nfwucfwc3/y/0dWvH/LY+5/5H2tyxt/z9b7funKfX4R/N/vA4j9Z/v9VSy/yuPdv5r/4ep5cc/+9N//PLh899+f/4dxo/fYey4vR/f/3WwzPrXKqP6J7/Xy7/99vnbh++fv775m5Uf3+/4I6V0/EnG8Zfo5x/gx689zl/7n37R3vzG9ng8vW59Ht/8SIrXMqn9nR75nd/p2/M3aE9JN3ZGlLm/z+sgPY9eantv9L9/+PLHy5tfIj+9bnn/vK/bLv9mef+j5/3tez+y7XxtX0/h7D9tPn6kfCRlymfmnambSj7+227v/NE/ffr28vubHzw9/eDpfL13lh1Jnls9cmP/ox7v2dba8S4+fqW682fm8yU8IqbX53j7N5p2/uF/vIOO37yX+b7f6Mtf3vw2OT39OvX4mx3ftPbjH/P4lq9N5fe/7PjamRxpnF8bx9VqtdXe/zp+3HUk1f/1emrnfT/4l6//+D9/vHz7998+fPvwt69/f/n27fMnSar09O5Mr+3P9k96fLdU2zvfEX97847oT++4UY8Xux8v7fH+b/14IY+/URpnGtbzXVneedn77bcvnz+uC9Dv3z98f3lzDShP1+5idmTS+ZaY70yH3377+uvLt29fv719c9anv2N5vPvn/fb1j+8v3z789vmXD79++vLy7c9vbzejvQn7zsvgU9ivv/pF8dPLr59fPu1v8vZb9Dffwv4b3+Iv377+8dt/+X3Gm+/zzqw6vs/Hr79+f/m3728jzjcR3/muOCL+9uEvL/RzzvQm6jsve7/9Bhn3lBOln9flnXF9vvvV/OPblzeBu/0I3B/5eM/242L4OK8utb3zr/L9518+/P7Lm3fw09/huErXY58y849L6zvfN398eo7+9NLN4z51XAfPq0Q+vtnxK5Z2/Ir9+HumUY9fdh7/Wq2Bj13M8S97797pj0+fX379+OalfD1c8HQPO37C1R9xR/cLyTuif//l5++f//Ym/PPreWx66qMcv305f/t3Zswf3395+fX765Xw5e2N+Ckh7bjiNnvnW/4p6qeXf/vt9Tb/7eX//PHy+/e3f6qnK3/q478R/M8ffv/++c//TsGf31Jrztw/G/zrb+vu8Obt9PxXOXYhdnxyeHd6n9+D7j65Pd190utjpn8y6Ndvv3z+9e3l7/mDzk7812doez+4/9GP7On9fJ8d7xxL5y6wHO+rfG6/z016Kuf7r/tm5Z/7wd9uOJ7eSPncvJbjRzs3no/3f6O/ff706cvLPz58e/sXn/bmOn7uZ977seaP7798/fb5/67X8+eXXz/99lVegPl8+znypR5b83luu/s8djTz2CWuAud/+qdY27i3f82ne3c+X/rj02U/X8DH+/Pt/G5y00nPWxE7Lv/N3nkf35FfPv3+8etvL/Lp7OlO8wr5HrmeO8JypGl77z3+j++/wB+rPu907LyV5HMH3sb54eC4+qbun0fe9T0vb/v6tLuuR7bXI9vne29I33/5x+dfP339x+t94+sf39/uBfLzXuCdf5//+9ub289TiOMvUB/1uP2c+/H2vmv5//rw8a8ff/nw668vX37+8vUvX//4/vPvL7///vo2+v2P3377+vog501mPX86T1aON9Lx8fm8XvV5XJvmsPON9L4LBf1Q/MM8b/+O20E9ro+vMzSPH6afP0w+f5j33ZCefhj/Wd6k6eM5TV/HNRxvg+Nf+6Plf/1tPn/7/ssnScn+lJJz/1Z2bDpyOzd6+x+tHZ/YjyvoPC7bKZ1PqGyc28F2vFqtHG/gXt+X6B/fvlvrmxfi+Fa9vO/9+PG6oX0KOI9P6Y/zA+j50fydW+aPHz7+IpvE/maTeHxefxw5s46Mvi/0ly+vOfI2LcabtDj+zOn8V53vy74jOm2F5vPH9nem2RHvesV9fgmPvNib2Ndnnu/bzf4I//2Xt1e+8nzle2dW7GDwYe35MWV/35Xu48u375//vPaV315+//rl728/Sr7a+tNuNZ9PVo9r3AL1d32jX14+/vW8in7+87cPbz9AvDYkeb61HVet4099Ptrr53OdeT6CS+2dWfnL5y+fvsnz8P5mX3u+5XM9Lgj5nRdof04dXZSfv8txu67HBXGee9Z+fvCd50On1N959fny+UV22M3ebNrf+VqtOD9/lt/g+c17/LTnzWQem5HVN+z932Vtf1++//L1zTd7/qzx41ucn4OPPehxZS9HJrR0fFY4rv4zHS/j43xQ1sf5yfvcLs0j6BrcfVz2zlfguMiu9lf7pzh/Y5vvfLOt3/jpLfdmL/78+Tydd7P9PX4ASj9ueWme4jDPXD0TafVHPP51vm2PK5edj92X1P+3fni8Xrx5tNzPJ9qzn9lR33mZW99OUnA8ZbMdD0D743xMfX5cSKeW1XY+3/7xhzv+0zVS4XiFz4fT5x/p9Yzg+3/W318+fnt58+57PUz4/Fn/CHu8MEeitQMM+vkZ73E+Enqcn8LS+RS+HpucNOaZtmfYRz+T9aC8VSBx/FLv3Bx8+frxr7//9eUfb3+jpw2CPc6Y57vux0993t1PGKztfD72418ncPwAxHneXB4/PKGfe5FzV5LS+QbMP16883HWjwdb870p9/XjX79//fLy7YM8PHs9jvn0a/94YrZ/7fN6OI4rUhozn7/Y+a/jP1ijmY5f7LzajBNK0pmB+ccLeF53fmzG5juvtF8/vf1M93SpOdHq+MPNdz7Xfg3688dfPnz58vLrX15+9mt4ePd7Nho7ng8e+77Zz3Q437dznO/Md3r36w90/jxvLkpPd67jU1A+rrDlSJ3+46HD6XB2PsxJ77zCP/8M19taeboeHBuN4x6Tj0dZ5XjNy7EB6MfnlXH8n2c6n4Cd961yfq3YO+/zXz+9/P3l2+c/f357Fbfn5yTHTux4NnO8OcsBh+X4e43jZjXe6QIfv/7tVaJ+/S5PhJ6vmjm/N8ePWP8fbIP68yeP/N6PR69PQb/98fH7WyhLz1Ruj3MjfFwVjr+LHS9WOy4A7bi8t+OP2I7jE+24jv84x/AoRx4+zntYLee/zhvEOMlzno98ToxcA9z2v87Pyul4xrrKoI+ryvH/y+8EtI9fv/7189sHlm8+LZw7pZTOB1Wp//jX8Xu286Zx3gdTsx//eufme/00+IHQnj80v/elf412vaPn9PyR/vxYnNJ5ja/vfIDy8evbh71POX+8i8p7L8TfXq4pX948Barv3ZN//ePX79/+/c0P9vyM+DwZdFyQfnxIeu9e6dvnt3uk+saldrh6fsh72HlH/XHP/JG19s5b+7e/vz0B8fyxqJ6XuPOt92PPct6Qhp07kHR+7nynuH/84/fvX//227ev318+fn/5tPT2bx++f/xF4fb5Q2Kx9wV/e6fNzyGOi3Y9d2OPH4l67iaHnVuQdH7Eeqf/f3r5X3/85S/ya6T25k1yvJXTeXmq7/y8/unl9Rb1v//xNmOeD2bY47xsHS/K8XL+uIb8QJn5+LEDO/YXj3nutsr5r/6+98unl4/f/v23t4+z7Vk0jl3g+TdO+dw+5nde2vY3wcfzr8d3n77bcSc+DxXlH/end24K9nfbT2refq83Xndsl85zL/nHa/He1H3584c/vnxn7LDy9O3KsR3sp+mdn91Sepx3xXc+Kfn08uVFeLM8P/pM5wesdu6v+vms+IQx2++wd3y/379/+/rv8EfNj+fr6+Odj4Y/vfz988eXn/9r4Xvtjfu08z5o5NhazH5eXc/LwTzPBqR3PkT89Pn33758eHPXKE8X2OMhVz620+W4fvfTeA8zG+eLen6+T/lkg/zjrNP5kaEcV+N0Imzq7811/8Fh19Cen8we7HX8Yea5TynvPJHx6evfPnyW1/3N87TzR6/v/dG//vo2f/9faee647auZOF3mfk7wBFJXedVBgcNp63uKOm2fWx1LgOcdx/YVn3FkuikGvNvI8kmZYmsy6pVqwxpISTnlztZ55GnafKuG6KcSg04DhJTEysgpejExff/srvnR1XC2wb3Uektx4n1GudqTOuMX/cfW6JvyjO0oNxIgLPQkuu3wecjbJhnaDgSFzec+qri/EP4bLSSW4P7JCCsAPbhzNzH991kCuNd9kyCx0RBI5JgNQ3ZiyQcvUTuFAYC1KcQAVlr0peWm9w1viNye9anJUk1kU6X2WvxslFSnCQ4TCOP2EoM0MsHHODRBmjaEcSyVg9AeaprfCdrPGyjgvx6JoEC+YohVeCxTpOybFKOCnIYNkmZt4cEk4Czk5OXvuxWigryWDpJ3N5j0BLAanIapfGwp1BU9mn5HRL7Q2o8dGTGCikqaNg5L8lhvzzDLTIZ59GygNrMWIkvqmWXwWsa2GRDVclxVkGmWieDfcPtzWkjcq4jbq0FjBD/VinyQCtDVESdaBojRMEiJq8Ruj7jfrw8n6fT2go3WUwr1ifyksWatNLyQFAfKnDlBoM9aB1E0teYnCyT8deV4/A6mjhrjaaGnBYcE9mHLzIcf1kXbPzP8vvka0CsxIRBeqv55R0Os9cPRUmjqoFVaxym1wZce2PGy5MNZGJe1U9SbUuSrHdS69QAMxKxRWeAuexsN26ywJlCoJzXwcl6XhGygyFAyFtrCDarSp0yr5kDVnHAovuAzefdA67XkAdjtfMbvZR4F70BVJ0A1cvufXr7/XRY1elzJJWCrGTQSSKDhvYoKcn1epq1T0IMddSOCQooLfBn1/hMysu4H8+7Vekh5ZyZQDtd6JLzNciil+n1sGGu5U5Ajr6SJSnEhaBhnWK5zrrGy7gBioIp64t/j8QQkWBC/qrBjAo5MWCogNqwF8q77DE+Az9hYPmKZaueNGBQp6D1Qf6rBWGiShmdLJ3bi/i4jOfp8HK03yHvjVuOopjGWqt00r8guUUvF7xXuJGEmJJ/iEpbc9qrl+ntWh/fT/sHDYw5aiPvH+pJHcE6xIhSWWmBKIlyqFyHqEQqZ5TzMh322wbUnJddi53rlRkDSrg04f19m+P5eTyPL+fR8tlikxfEJIqnkh1qJ2z9cjy/7+bVzY8GJlxerWSJdKqF5KyH3xhLP4/n75d/LK0DFu/IYZzOe7V1zaVjwJKvcg8wOKGml/PxMH+OvJr7PEmoGxp7e6yCFrK1VN15317hqcpPY0p1Ug8gNKU1stdilxa2Oh989joe9taidnk3j5g3sWRJjGYjFq0VBLCXPxmU5QrPhNbQUFOja6ngdY3v1b2Oh5sHOhxXrISYY/1JeGM9bOcE+yMlnzmQrU7f1zvl1EIpifTQaBNMjJQ+96MKqWveciYxYw+3NcGNSMn7sW0Jr84PWCBubsEbOzAMiNsxOJujXsd59/a2lA9tGTLn7rYUDmHuN04S2es4byuvMWePDYQYUC1C4yzPvY7zNI/v1khnTw6Hp5XrR/m2c/qc13H+9vO77a/OS/5RwQlJKgWKbKmiaEv4wD+H4BcrACFc4k3m0fl47+O82+/mnX3EnHummIZcMYkp2qRBlDKAeDDt75PA6qa+LY/oc6ev41yArJNlaDpd5+s4nz6+vE3Pl+n1+/j75Xx8ny6Xj/G8/kbR0mgEwVJsXhmFzl7n13G+9XabHxFNGYbv3Ti99Os4n3c/C313KZprz1dqnOSw13G+jOcf4/ky7cfT+Xhauf/cVXdO+Oe25hZQy2sPLfy4CrZnTSS2uMVPbFQkSGRuZFDKU+22RwW5ihwea6HCVahU1GR3Te2+l/d9iv2P+dmUVwbNM9TOstrr9GM8bFLePlucXEt+U0ItQdKLVu59L38yaKsDdE2UBEJNdRo2UOicLNnX8+4wP82/T+ND5l0elwpS0QCd0fXSg2cM1MODswp+a5434Gh2iSVgq+XVDSoh4eyqua1f+OxXecqMD6zLavbKj4qaqfLz0KiIgKLR2YFyeySrSZO5MNJJACGx9klSziQOLCmqJx4VQp38ycBtCdgDOp5CwsuDv4QaYk5NLg++G1qAiZYqTUvY2nEUOkmXQqfdS8o4xvYP3OuBvGpQFjLMmQBJI6gqCMzkLLSjmJecrd3373FLtM0JMVZfyUrKxtB+XZ68pkmvSfrGwKUoEcHZC3QbhA6Bml5ZzETHwelsvs7z6Xh4s57RELoqovzGybWYdhbpNO02yzEjugLGk5oKWUutTcEULXsF2/mYuKuINFGMzgLQVGhMyx+3Ay4cOi6zU5ho2hcUt3KoIEnRV6tH0RnZytpPV6xwOrw+7d5en37cZJAeWGcTssnlaKRbeNA+FQXfFF7rfM5/skX+mDNCohjIVllaeOvW6ZmnLYTUVrn7v/9/MPjxCJJL1HLeWrmhrcTJRPcDpiio6BVmLGq1FuPVek/bI5AuJ/2Ln6zFtA8Y3drpq9mn0FeRo0dim6C91OK7OvBKWlSjUwsg37zY4mDq01JFl7illh/byf3uyWCjM7ZanuB992tn6fmmVg0ECkT7qdU3GIkpTsv7TKCpXptxjzzvt3qlppWCaXYGLaP3JjROjGyzzfE8zV+tPxsM1C2ccfhIlVNfZXo/Ho7Pb8eP/R1LKCRMMa8/DU4Jre26l9PxcFlhFTlzw/sJbv9vvkr20pfPKll2T7SUtIXSSaaeDvu75IdNL7LdGgmiB0pVtVMGYTpc5aaer3Hs+6qIHJuUb+F9KfN4Puze7onpVtHLNOMFJwY4Hebz8XIan+cHApIhb5iNlSIyWikC5Gi1KkTdR+WMevdrW57oISPElM0lNGrEUdAoHNDfCwMQUXACQ/oY334WUt46GZFAQOQKoYfo7CPWjQo5Tw4jBg3PtY9Ve1Zb5+u9GOkia9tMzImKSdKmI6KFxilGOF3u1Xxbq8kLmm3WLqL6mc7Te3k77vbTwZroHFEJ3pRiWmlAmjZxsbdKLF/OnKBgA7l8reof2udGHW+gYRFwJCIXE6P7Z18hO3slTOe3tDggO0kIjSpGGIAkgxOIvG9bgkuH/DIIDkM6RdgeOq0vU0EOXp9/mY/nVTARrV6N045e7lXlDY4Rc7ZmLflAD9uxIhSF+BJqfhH2J3qb2MyDlAAPg442egn5mNoEjBEOTuj02wruzRncTi2rb/NkHtcwWLgEnDdaWoMTCPr287u9knn6RLuZZE0NZTsS24oLW6mk7aApOxmtds0FzWjJNUEBo5ORtwbTTeUO88D9l3NDnxMyABLaJDH4NQVbOXet/EknpkXbrauoYbv+Vq1YkFfDch606yrh0pROhpsLWU+W9tMAqwG6Jafc1vWNPX2c7XmyNlh4yZI00jIcICaHgbgjOKON68Y3/KHEDw9GBA89W+3Xlj/hrPCqBDdpxWm3ko904jNCpfQO6tx0uQelwmuXRK8aTjTGDNqppnAMCk8VhzcELUFxoFvAGo1bnF1uvLmbg7dNhLnSTeRKQQtCYJzL0Hf6w/gR6itVSljRpd57si5fx93+Kp9aIvYGo9rUY0L4RpmR4MFUf8B9vOct4BAaE0LqPnxPLRU6Ub+VvczXl3feYJArlRgEb4LIHavIDXdKFX0ffz+tCmUh5xaFFkutBpqsmVAdRkOs1LQ4+Z3fx9+rV2wKdYJzKmVPmwYbjFxSc+8LHb+vdEtMXzTIiWQlDYKB6p249JVWKvk6SrzotYtRNU2UbFfpg/sc+PfZXlvTDiO0ggbbVGFzGs0DeVsVwUh0ikS9HZ93b7b2lkexwgaJchmThNYNRlUsY6/QNcAhkRnNLQHxgtCS3XROptXtaSf7xmJOZBBgAsl4QpTkLATctiiGuTlF3tnw9HZ8nQ5rDVajKS41TZ4ckQpUMuTbq31GzyaAF4aETamzXjnKSk7jdWuR3r3ZzghDtFMWH9cEccpAxTEgaRpaLE1LBqQ1dpUS6hCW7VW0JWgA6LM+8gO21cJkDnZy8gW34KnRfMOeyGcUwBMkGQVPCSW6BDov2Y18OpXmQd8nJIXW0J9IvFJkAQLDHELnbGd63/2a3j/ey015+buiXT/gwUKLHVqiq79vN74fz7+LNytvK3DmPWXCUF5nodQMH0l8X0unVK+ZkU5PIEdCEf02XV5CHl9qJ8/3h7jWUE1JHVVpSB5f/oTnEhPcipVr5Z5r9ZjALYCGhaC+Q6NZbd1SlT8yx0F1CmCRV6oBWIEfqIoBGThaW5Feg9ugyE+/vVJsm8vlsDcwJ/1K6rUpEtBJHOm0iurmYqN5hdPg3CSHDsf5NjljBeaZGmpwEjXv0tRbTkyeB6EDJgY3iVdtOBTMclGATEkSYonp3wwYqKAzbjonB3ODrdc5iiOHDRHAzmvMpbTxjytemm+QRXfCM2fOi7pEr2Vim2sfz3iwAlKGz9A51Q5Ycv3gyaDJDXypxtmdaxb+sruMmxpEaIx8DLaCPJcO2IYwotfbrRfAiaCZJyrOxmjNL3ZegnzVEvVyMLicU5SGVZcPfbiKh22FfIyiS4+ZqMg+ly6f/8d+hZ9Um278HjU25AhjdIbJWhLM97qeFuuBjNIsep6+dHpVdiyyHI3OBjhD48yMsh1KckvJ9CQvUKF/0SvhZ3t3chJlZJYUkSkSNqEhtB7wghWfzDswjqf5dtk8SzSMjvhJu6PzDYqXx3C0PnvRD+OvuSR/ZaHhTx6j47R/Xm7Jdu3Q5g5fdVPw2xUKKt4G18cbF2mPeZIJYRfqbgzaCOhU4jP7F35xn8N3kmq1TuXYwuKb2z+YCSaftMq6bultDUbNkJD0s9brWLig+clFllM7fAjeQ4NwDfPeYlDCvFMvJXuWAvvfRGRwExrnyIP12usvlKJRvnO2bLJqkZFvFI+BVZvPntkSySQZmCA4u6d1yatC26piY/oHlIL/2eixwPgPuW+KkgUqIBWUuOuEeta7lQ6MQWIVSWmdWN2DLTbnxsw7QtYntE4lxvU215R9tYE5Rqo181kndWtFK72oxigraSffZ4PH2wan3Xmedm/FfQxdR2nbzhoj+9wHmW48eK5Aj85NqxJH0BS0I3xQvjbOJTnBf/s4q+6Q7Je2iucoFusFCGWPa9nc/tjcYUnG32pjnNLenToAbPVj9zbtbwBK4RXno6FQHlKZA+DFVvkfFDcCxY3kLG7wTD/HL98uW7cd82pl6ySplRYtxdN5y17nNEvW6hlYj7EtAERU3kOj+toU2qhkx+gcDbWBMMzcUBSkBDwVAKKReJsWgF5wrQELXelEGQqFqGIEMIfQAFPrcKjOOVLl8OXFZtZ5gCvPAVYmrAC5t0Oj0IpKxaiGMG0bmnwDM4YsDffZvGtQbvkkyWjhe8GQ6zpZ8mAmgdpw38iqOdmq69U3Q0DtFkYaxqkhbbc4j5ePt1WeYkqyTubTYXr+vjnOJj5DmUXI5HIEG7EyVEJ6wegGnVdG5STqAGLl4tFH0zkphofjbfjpKmU2wEZwdnMf1uBePkJV0TYvNLYhjJuJp2ICuOZSdxSsqoYhjz663C7QtE6YMaDbzAbQuR3MEghIVITaycI7HOeX48dhBfbW5uX6HEo5+4t5vttSRAWcC41TF+/x/U2tUX1AUpYRaqEFM28hRmhjaecM9o6HPw8uM4O+4cwElGxCVIqE9tA5aYZX6bDzuMSxz+dxN695qo1pynL6tVIgkk8A7mG/QSwL0JKCZsQkHiFloCyeC6mx1klj/os9Ta3tTNXSMZuTZLW9/hdvnYPYOXGIa474+N1n90WiXmQtEn8iJoGx8h3yQnIdOsn6dRgIVaoQdHAD9S804wI8rKCknNap13X9dfOfxocno+ReUf4OKsemEZeWyZ1S3UdbWQg5rwCRjYYbxXz4gFRY6OkJhYUTlyP71+2tiJ4RzkEKlI+AgHtA0CX08BcheMXlE/19893rWLiFtem9bp0e6bqYf/Z5bToIWyfSu9rDM/y8Nq0ArRPXLMna5Q9ca7ees/H6tDsXm4ry6IxG4g7zFZ2FhNPufBkfjwOMuT5gLUkDBzckCvfJWZRZzwRMZg4e1LPQOCGs01Wh4rKJtcz4OeiKoXH2SJ6+Hg/j0+Hj/Ys9Fb1V+l+MpNQgksZCUvhD51uyKm0Yh04bEFcItXp9Ve5z9rjlz1xUEO5t4548PA36YjcY1gL3SZMq7cvHyeKXavVa/LvOCceepuf5wwJdvYlNJK6X2jssnEZsZwujR0L+AbCHalKgAzjUZN4KCnXOTOp0PH2c7hN+v47T69eVTGJ2SjrnDMJsxZ/Tfj03s8sX9Dmo0/Ey796e1uqt0YyUW5y7HE7aAEJywrzXXUqzT2Nes/Hy3/LFCrYop5B5aVbXJe9x71We8DxeT5nh2OexvhypWmgZTAwegoY2IB+gEFGrD9zfzikVqA+4kkROnVF9dtaITufxZTyfx/3TFSLc5MwGAherJWY9Qf4WN4JaRi9HZQC91EIg9NRQK8yo+hlO5OB0Pl4d8r0buHikcpWV1kkozVY9fpRPap6Ktd5jfz6+TJa5a/y8OGTGkaQegEqYuxKe0cM0oIAfVYoBZKJWHQ7+XefET07n47vVZzcUIcnyJUxMzDwT+ltHjw0MWR6fIx+hQyLIGkggAqcrwA8OdaY3okK1Tnd3ny5kA1Az5khLPM6G9GXJ3Wmyq5oRQ7g2lZBgvnYMTsK87rQ7lRrfatPN2Dp1iXTVW4ReWtZkKf1nH3apahbpM5b3pFo4BIhObim7nR7+CJvtOP3rfdk72nNaSzK0xtY6+UybJUtFrtaIjTpLW0zOsg7BAAj+q39fanc63fvmmRxoX2oOp37CDD5afCsZZ6Zktc6COjs8Xjj1RlTGCU79dThZbbCxzklZsMuuMkHD5NfRIM5i0rL01+PR+K+6NnTcz50whertkkZu2ylvuCxZvLFGLFhldbXDFLmy5AVA7rutb3JtJq82Gtg7wcVs2a0C4g3UtwL6dS6lFLrPP/wdS8nBiKu6nd3CzJh2TmbdbLEBPbb7GM0pL4Cw2qfw9WMy637KF8u653H+OB+2j5xbrc7Zi3j6uHwd96thYotreyC3YfQUJE+W+IIBYqHXNmJtFO6dluP2VOahCjlQDn+hS96BX0dnnbGwWYGxFPJ8gebm1on02GFXtfUvyysElGUSY0BXMqDAHivMQ3Qe/3+tGvNbY4Bkd3pciVwRJQwovUZGckYvqia5pq1QGWKQ8yXKSvPxnhhZx2fbw0GYNfdyUnbWuxRvsXmFzhBpvXDBeZur5QzU7bKrolZtRgA2miw5i4KbxYtvIw/ruk9+zBUEkU9ilIJIElSrlgSqk/PYSyo5KKilWqBOdOgKE8zPFoltzeQQpzFdFiqNqQh5Skypp1bdBiH+qVKq/DIa8KAWh6DNdlS9a60fOa3s6nFLRJ8c+KdM10Enic7CfWH8QzKcf6/69bJQScYxf1K59Dq1ILpv022Dm7au/X4571ral1onsJWvWnzNRhJEIAhxMl3Di0cMELgNOD86FRuXZyk9Rm5DO6em5rJckdmaw6tCKGql1uYt+tgNim8vL9/S09roi3Ffh+tGWz1LQ3ZbvB+akAJ3UqNoW0wSTW5KrtHaKioLrZNXdR5fN+P3cmb+8kBSn0AeICRnfnnd4DKveqaMLEV0VjDO4/vxx7gdJpC5zYYXJ2VApmt27ru6idLy+Q5ySZMAcDUXSoxm3ysHBxzOSSeRIPn45dv4PH9C9tV4Fgn+BEljWGHoVdNFVVucKJU8Gyonj54lj2PkYpIoMuklMOkkDKp745RckWdZOfqYF8gpnXZ8hqWZ9jPL//3n5oGKBNREiIySCYi3h0HboZ3t1svzjPvL8/FkQY98lMZyIpkpg7aqdsaCEaP3FFq3v709xDq2ykc7SXlHooZeR7Y6KTXXTabz+PSnFNJ24xgUSUI4glK05wPa57HSxu7e+9Mvx4+z5fXlFLZlU1RXxEZIrClobS1noJYvUotHgQ2J9lojHKFWuLQd1QKGIUp+1w18ayk1Uj+QeHCQkHeg5SBQUaYjP0QlHyDplVo9N0zt0t5qnYtA5FDrZAY+QZuJOHhtzv3Fr5ji2SfvaFersHIqY9m4bdudAfJ0bfV+aGRzkE2sPY1Y6GiHXnvw6eALzn57HuRPIxgMJIZIBwrXkB1ojY8VHfXLPGX3g6x73/PeFYlAmBdQy+HrJKnqew0q9bh4jbw+wio4y6xeYk+KxFGp8E5oVbaap/dxTeE0b7vCbDKhNjRup7VssgLZ8jYd4e8yUKAWq1J3vFtJRIBXIvzW2g1I6LOs3m3eciKbd1iMqFxtdwh8RRZXxfdocnLxSp38ok6pOzQSJJ0ATVbK9IuQlGwyKCYtq3Q6i8spgHoefxzvvMcyYmkwY3jdYiYHHbHL5ImKlpDgLKldn+H7uNVLzufroEjSej/Htm5ifkuFWWfYSGicccrl6evOZuSDaUET7yz2YiCfqp2e+LJ7Hy/Tioda2cYbntr5qWXNe4RtE5UcAIzKGHOOMrqFa+bTmRLdctbFisL4l8vGREIEsEOkJt6p5osqvTh589swMuc/LR8JaQ3ZGu4y/yHJkASahAS1BFuMzqnFPdU6v0fiJsaRC9G5kwveSdrACL1OvBsqo738FcN5mCc7MIwlaFKmWD4M9ESwwk8Jidg1ad+VNlVwyvB5gTlRoU2KiULU4291epP2eymTblDVVuSJgvb0aUUP7UqkgmPSqelOP3A/CY/ijLxeJV6HQeiDigSzbSUnNi4jX/7+AOPu/FyYVl2bvKp1KoZexucVyTEZsLrikzdOgOS24jT/ZnrCylvmLGEI+xy7qDxNp2LEZTzsv11WemXJdCQ7G0wL6FkyX7TiXHO3Q+O1w/fFv49WrDBnUHi7KJal3qaXW/hl7W9t7C+2zzmkhBbvVedCLg4v3SFMTRucNeasf3wt+ZbXXLyjey/rqaKGSqhTzFE16sh3ho5b52z9vIxzcWxMyImwSjejIhIGTSlaACSSi6gSQs40Qx6kOEIm5IleJKlTgG3Q4AqZYe28xV/H6Ay4LuVRqPmEerqbghOmv5QGoGZvuRFvD3iL+GDnnD58GefDcTPiKiUz+dKZCW2roDHvq2pV+ZxEIKiGo3YXeA32o3JozNtPdTJY9B7wB9XQzqhkei3pbbHL9Dau+hi7LDXsnOJ/+WLF352HYs4W+0KRNlrUWprL4BRX2iahDFJqcO0nfkxG+133nsScOdY5qZuPi8Ix71jQQQ/RSYBeFi4cClMid0rVXVdbDXfIm1fUOifnOK/7goWnMwRHZwXt8jZthpaYDrpA2Z5AMqiKXutsqth4VjPYSPBLOXwSuZM/kBtQ+ALskL+SKBwUsZNYvZc3zGgcFOsHlTQj6kYNI0RaQ6OOt9S+VCdSV9CNMR3SpLaqz90GfdNOMzafx3F+2u2vmkSrcRp5HXR5R/ITez5uchZEL/N5ep4X1v3l9+HZRrn50DPJRZImafKBGZrHvOzArJYQcQ7UbUPjDRM+vtjAICeH4JAlKpBsVIqAYEONZFRoNTNUc6AnP2p9f1B4gsIq31V/LRrWQafYEShEZrrEoAGJs+Zy+bgXAv+IBufXWr5JI5cOnlygQy5WqDkEp4OZx8PuMO+P77tpNborJ7CRBiLvIa+olcJMR/jKvPIAhT00WqjUSZVEHIOmmYjvVjqQjdSTpCtGSuvRmY7ex22WET8zfEY4imI8qacGmvlihWxecEqQ2e1v5a+nuwTvw6+fp7dyrxo5hkM2igauHyL+y01xPtUato55MpnkWujY5+hsqritfi30vP1YEcTNsIABxIXZsTHQ1h3El0RkkmJyMmELelJ5UTFh3rQl09l6fVtZ9Z0eKJrF/AYnZ4A7/7Yd6nlKEdCn0nCPCgG+IVZIhy9Ehb9u+mGT8xyViGoXnTPkP6b7dAZbzs6nFor5Zs4mnCVqPlKO6VUTKysTUMjUIgJNXrVS+gCFOqdZ/jjtr5PtnuwE5MHIYUurFxIvTJFC7lKcSq+FWYAjhJdQ3Am1SlXgrDqndsb9iUuQkGmEqpxdkB8rtc3aOGQhQfC8lRZkoSEjrROZnBWj88Z+XMaN8nRnmlS8H/Jy1c+zEJlpbAfjDDAmG6cr2UrI5dQ1OQ3ayZ1PEydi1PkRcFE7p4jEdf/d6yplTcaLMW0rYElD4wwJyoTUPCpl9jJ4d6XigFALWmfjj+z3wDkbFW4hHQmjcdBB5DrVpgIxGnzQ7B84rcmokkfnIG1ZsKg/kX+ohAIMBL+ojdBOjubHPL1ZL5e/tASBBLYUUgDR21Z32+IfMkXWsgpzOEKMW68VGNg5XlBmcavjg6GytdGrggwTKw0JnXl5YaMSYd1k1wzrjCFpceZz+z2P53l6uc1Q/XKdImyzeSMQL7Edfk5LVtTLwgBMp9J92m0+CL0gBhUU1rZbejXIZmMmTUJm4e3slN9YmPSed3FQ9hLHT6Gulhy+hRMlRrOTzKvPSAs+myaP9e3nw1nFOaIVdaYPNJdBs6yOUh35VmS8VnSa2fIjlcCxPBNI5Kto8EXmG8bkZKP+HE3WHfN43DvB8+f4ZV2vHywOtXxZxF6YYiYhKxJdjNMcsqI04CUOsiaL1MG/nVP06pcNa0yHqoAILF8pBUhLJQy0YdBa9NJOfzXPdnvT1SnhI5FupfwMrY2QGxHxx6WO49je+lQjU8wAFughlRYNeQ89do85HNHbMvermf/zcr0g5hlMaybyiaQ1gHqN3kVmTzKUIUYnnvmr+bDbm45NqYCDKVY64ISXAdk2VogdRyfcZ8cAGfIJykfY80phE94C7M9YYTuj87b/7/EwrgO6wUCakskgbSRWr5GP3YLJSnY1QKiIxC5IIoVaWchc6c4jEPfP//qP03Qa36bD+B///T///Pe//w8yCSeh"; \ No newline at end of file +window.searchData = "eJzUnVmT3Day77+L6lXHbvbe83TllseWZmTpqm2fB8eJCopEV1PNIktcevGJ+91vcCdIAARyYWveZqxm8vdHgVgygcz/fZWlj/mrf/z1v6/uoyR89Y/j168Sfy9e/ePV/9mnSRrEaRn+6JfF3X8FaSZevX5VZvGrf7zap2EZi/zHbf9H2/6Pfrgr9vGr16+C2M9zkb/6x6tX/+/13H6UhOLJzmD9pwqzr18d/EwkhY529Nqz8/7Fb4JA5Pnv6b1I+tdHSSGyWz8wE4yedKdpbIyYvKPj0x7KJ4PaNKaK1pQr4NieBezPT4co84sopcQWY6McAjLxrRR5IcKbID2IHIvem8s7czzQeVpmgcDT9nY4MHOSJqVuSc0AcB370R4B2zxPPhiUIQnSpjGEacK2gTSgQRyJpNhGRLhjc3zQ4ulAg9sY4gON/IIGtDHECJrTfEKbxhAf6NciogFtDPGBJl9uaUAbQ3yg9ThNg9qZYoQtvxCh1oZIQaUJKgwz4f5NNU9RT0ZBWiZF9oyA2Qwm3JusbQoN3G2a7f2iEM4T0BhvbIQaME4DP44KVPONbFDjHdK88ONtkIbOH/GYUDZDDZmJHWB/MebrLVCj5UUmRLH10R/sZmaJAFUaU8riTiRFFPiF+Hio9lbOuHML9GNNKP4UWXQbiYyIblPZfBhsujerouF0o5Eogrs/cpG9S25TKv7aaJmLLGqMsgqI4kJkInwXInZHWiGt8SisN/lBZ5xTUNQJSYP7m3vxSKWl15AG93ljdy0Zv6exyPzE3Q9go6UYGV9B0Af/6c2OWsjef/J3Kwn4LaX/IZKUv/2/Pt6TfdetLU7cNLkReR6lyXUm/CJKdlTsaZI3hoPBMKeQBz+OQr8Q7QBLJaMz2/YgehHHR1cX3tmxajWRZkNPKp4P1grSjGL5MF3ipFn0d+05/uRnPmjumligd/Rnf/px6e4h1aBt/CB76AyCfvVpk2mdkqOf7tcocfZNaQWMDd81hjmFVAvC6zs/jkUCmnuUIiqjwcjoagI+iOIudd7+WsnYd6Y5xYRRfoh95/2xTsBgjhM6TndRQvkN1AZX6Pt76IJLSY1baVkiJ8AllpIYtbayBD5k6f5A1jN6a5zI1a4sE0HxR+bsH9dxdybLDOYpd4Gvo6904J25FaBJG7y2uEZ7w+LQenBEPNoJ+1At9z8AfJ0G9NrmHur4dMf//dk93rKEXzwDAy/2+LBTATpwxOkAB+TCL8iaujPGCVxG/64iBXTNXEZxb5AYfLpvuwE2dv3cd+aGHphInM9N01Av6EaQuGWcEQ+6eBvRoZZsRjjERDbiw05fRkTwsDkCxA2WZjz0V4sbGKdw41Hl2o/jL35wD3IEyQ9/P4c9FVzY856TdjIMiQSs0AixHaTIstR1wFZRdnY4Md+KPMiiA+DkrJY4lExywVdnc0X+joS6sRUx4kYgR7sKFuFbt0PNxG0m8jsq3tYcMzTk/JeKFnz4yxKzifJAVplK2sYceO6yhKaiJcechoOu64O71Yw8cUcvBoSmT1KEhKZwBnf5Mt/8YQbEt43XenouZ5FOfo44nPZzErZR1/r3F4XIXJdRKhPUiynYCK8lw4zzyhYznLz7d7pLy+Iz2PmqF1FZj2vrSD+siyTIeKWXAB61FpCn394vWVoe7D+5+s+JvzTMcSvpWYZgNRpn0xhx/hnlRtEBgg5eqiDh5y7tQPcULblnbMlie+fndwSQvSEmUOfLUSpI2MUoS8DibltEe9ehUIk5mGKC/dv1MpQK82/QRSgrwC9RVtyF7hOLAnNsigc2IPqGAt5PSOz9KMZTdmYYIbet85zgk5/ZY8J2vl2oYoXdLLQCvPX3Ufy8rf8fGlQ2xgO8E0noHIdRsPZ2mDCjB5EQNatkiwm3WscSLJx6OzyY7ndgFYzA+692gBSrT+C9VyvAJoSLZ+zt8GDuozCMBdH3IxvjAaYh5UV0vkWsIoTdILYDjIJ7onYcLDGhAiLZKk5oNNsK8nCXJmKblPsvFBPmxBo/MuFqT2eWSURUOdgIusdgiAk0E7ciy0S4rW4U0nx6Sptc+OltRDGZDYZ4QHOijWDOuxF0T4igYoQlQ7ACLA/Vfj3cUqwCJVs8uI/iSx5RuCoGQzygf6eJiNwvKStIR5bIUCXfeFJkaX4QQQG7tT57nvywYB3BvBZZEd3Wt+dIANtcSIFk1r2BZ41HuhtUkyN2hLa4oGNxGlz48Thr3O565qiT/BQlofs9Vo2Ezv6ot3zp7ZPKkr7MPC9F9kEUfugXvqsS6WH6BGqjs8dbkYSH1P2ylgJxozXs3spy6+m8335wH9z5SSLibRPP3bZnT7Z5eTikmXvqG5Usy9esKJJZHL+o4E4E930rRrcZYK2tEKMxyyWinplJfw2FSS74NBTb/jLrtrnNSixm+RVM4kLxEAViyzbQLdlnkiWSsO/chGo0ZplE3GZpUqwwatu+Z02Z3PL4Ze0yPym29TkgUjk6u0wyonBbn2Pb5tEuiZLd1o932yZRBKks2/dwyewXq8RDhtYwl5D6ryjAO0NMoFW6n23pfFZRhToyxQR7KPM7EU6msfamNGVvsX0Pk8zuTemXryIouD95t7cxSz50ZzxZJKqtM0sqs4hZlv4NjNKiTGxN34mzP0cj0OY9bDKbC/XbKiEA9UenNc0thn4tZDDNJuYhDch3SWqrTBIaRyXp76AwyQVfNpMFfV/SW2aS0ix3CXvRzOAq4DUai1fE9j1MMrtcuZQ/kcomHb7sVW8SCNf3TIAhL4UJag97E+SpI3dUdG3gKGhtAppX0XLatBlFcPcmdj4ErWWvDfox7Di0GXzcO94/3jsiv3+8J4+uxK5xqw5i0zzq3EKVbJ2XN3uAwjSPUsK4jp49Cmg4NIG4HkIfSEAnz00o38Ao34hRXAMwPQkoxGICeXKdlAaUJ9DcY4CBjiibe2oQ8bxNnU8hDDj946RQzsWtBiBYISsTjHMhkQEGVj/EAON65bpHAd2tNoCkhetJux6leZQSBjzwUo+74GGXetT95uoqHkhAnmEDSpmDp4DmUUqYJyjKEzXIWQBGqR+lhQFPjc2jxDCbm+OzcwRR3jxOS1XCgUpiGPCERDAdTXZGgJUD+b74XjyDMTbtw5BW0W8Y81+FH4oMnMNFYeF72FCqoeAbzHkzaTeckfsIpaFtbXHifgV4DDS0jSlOWMhiWwMLXnxbwxbP7ms9DWxjihhWHgYKUHaZ/jn6E7ruv/QYBZrBY2gIsvv7EzDg3f1FMPeb0BMw4C3oZTDnG9BTMNjt50Uw9+uvEzDg1ddFMPdrVxMw4JUrJdjxZc/1IU3S6+rJKh/fT34ufpYSqrbvM3GqLRCny+pf0iQPbD3m1dscW1VviOeSkCJBIgloe1moegpes8fQqkZRNyLIhOvQZCco70yvIKYus+l8AG9Jx2B1BQnVcbprP7gTb8vMByQWXhJT2Q8q++FgfwVZ+zZgyimte8dK8lRj7q9FcYCPt/3TFCOXCu9jFAY/+cG9SFppIMyZFfqBdlrpFY+3QZV5NbSgScO8zCuVEFSNVys1Z96QXjOo0iRnZVAAO7ZOiWSWR8bx0enwIYSiuuzz/pGy328ao18fcXOcdceaznEECigmOOvfYCcKyc1HwL8TBbR+LYh/dl2WRsN+MLuCjuFuxBtFJQsCRcMLkMUt3L+Rr8QdjLV3WS7/iGTQLY7cNf1clYp4ZlEkOtMr6NkzfP7s377DapxQzgv0NkkbfY+TlDH3Omm8zkVxzbEuzkXBvzRWKmFZHXdy+BfIchxBJH5SvE33fkT6ITV2w87uCr9Ol4fk/SPXwqB7w9fHVVYGSq/j7AHYKe1Fe9+rD9LIS+uK1Da1UeI7VmmwuCJSEs7JaiOLwNfqLm06JxHrYpmabETNpyd6ZUyz1II8pJvcrIvFmWCT+YxzBG+utaT9G9aTRhYPMOtj3hou3eShjA6Yha6wM1GI1TnjkV54Mve7tAKs/qyaI6U8iAi0zcQgrqnNq1d/fFn8jywm4++NlhnofphZA7WzncvLzu1e5/Grm6lFX2qMqr+IJGxTOLF0Fpn+qcqutBNSpfbrcaFflJLWuvQFQOv/mlWRBjk4ohu8YQ2OeAZ/IIMrgsHo3if366/l0Of15K/jwuf03TM77Vm89Wu66fn98+s55rk98uaRs0lMJM24n5u0RCSCGvPSlJv15jl1VTUgiuCuSWQwyiuPEdPa7HJv8Cuo6qX/UqVppMKvDO5agyuwt2tRSvq8N8nL/5DeC1y0QIav7NHEBlYI3rBFbcytPvqw8NwrfaVdAOhdSNdbOpuIyt8LPcbsw5FOrsOEEJ1Z5/EljI51k/sTJidrWXwKAz+1X8HlQDqWnXYva2p3mv3sQE67p10gJ9rXSvTEa/6lOwBk6HytzrrP5bqx4KiGZJ+i0EK6T7G5eEEmYcXvgGP/y3ldBKCKuH/x7YVNigjXz4MUhjX0dNbQHQwiOxH0H3MUaI0zQKuelOE+IrPWOQvGAxZWEqJmi3bTpId/E+/SLCruXNOFLklqN21tEnp/9JYVJJKesFjlaMXLnKlY7TCF2ymKT/D7lu2z39uee0RFt9lum0mXMIOkDTedGV7OtyIPsugAXwzOkEPJIiW9co0xdfE6fozt4+TZXIbT3uBFzxhtMzrcjduBdu2lTUPTREpEeAMpKaqB743Ca4vaCogmflAMN4X/cwG3jSrQMbcG2cEr9zYJcGuIFFQ1udVNDJ/fhse5krf8gWjR6lnyMSwMM+GcymiOtBkMwX/kunF0oHt8u20aIzyAX6KsuAvdK2ErMMemeGDF3o9cywAoQDszjJDbB5FFt5FziQ4d7dgeD/atv4/i5239/9DMsjEe4J1IQoJRadPbYcKMHkRC1KySLSZcSHF5FSq4sLwVZuRcNEHBGMHqJ1gBxmngxwQ/eW+HB3MfhWEsiLqnbIwHmIaUFzEK7okwB0s8qIe7NBHbpNx/oRhJJ9b4kQlnWZ1ZJhFRUJQZQQ8ZDDGBVuf6skyE22ovRNOrlTa58NPbiGIYHgzxgLpnGVVAAjONWgGWh2plH26dE9sqOCVbPLiP4kseUWxqBkM8oH+niZDO9YFJR5boUFXeij+bI3hRinBZTGyQXG28uvDOBvf8x6R1vlxnwi+iZMhaXxefNFHOHiV2q3zys89tUVXHn330JLVLpT5FIPJt5OrrmzJtJEvOXXHcOFrHZF8ZGcsqmyKCnXbFT1m6PxT2/a/5e+pON7/MUGeid93rae3QxymyP+sK5aSAGz/IHjqz7r+3thENMYv2SnSa/epe33RJzNj8HbDUqbOo6lztdVVAUyQ75xHMLKgyHYxMrywGdMLGRRL8jI2zsDDKD7HvWvJnQcxglF9AnO6ihP6bqc2u9q3s/ac31B/J3n/yV/o6ktQ9Mc4CfWeSH/4gz7sk9L1NfvxMhFEmguIP92WOWUNnGLrocRciX5okEgG+KgkQkKdlRv0hjKyuIqFepn4Yp4ygklFb3gPTRYCl/P58YJJSNJb5peSQgywLIuDnWNzxC/fA8RJ9AQwgO8OX0b/r2Apx85dR3JtlETHe1H2Wb3LDjrKrjVBv51KtPwZNuam+2dp2MNh2bntNW2q7fhYFxafGLXzznLhWZTXJaWy3Lue8sU0vZ9KP+vv04E40tUDdg4CzsI4MNf+qGoxyjNdCw0d3M7KiN7TfK6o/yDaoe4Q6jQUWcIPOZKFuQJ2IKC5EJsL2ljyo9KNJTGu+PTAadOZ5RUWdGFjWWIOeXgciYSxYCjRXrKUeVJpYJ1Ff3SswGzRA7x47IRMsIHT8VOsHezEZ1YSrkjNOZoPIZeskiGA9pJNDtRyyF6NLXIKWQpC9ZEnINPj0ebTxH/rYYgxKeowhPPt5tIkHYNWPMWDdiKDMouK5vwHpwDZ/ljiEB7qz0zzEc4loWwA+jxHQZmLG+WNoW4Q6pD1GxEWzzYBRiG7BkQliuHYWQRNO7RBj1hsiBF73PDFWrXZbuLsox2ySETzgbCwZTuHA6zLrDfEkQrgWWRHdyknLSUjbxAGBZB/W6Op2pTxxv6QFfvzeXQDIwbEkAO7ncBfQrcpGXeunKAndtxhLoroXjfrYl/5FPELH3/wfrUsDePhs+vj3calPSYW51zdrJeKbc2pg1OU5W2TI/Tk1LvgKnRMq9Hy/gRl1tt8WHn6XTk2OvE5niw26Uacmhl+qs4aF3qvTAKOu1llDQ+Z6DTB4hreFBV1hU8PCb7HZwsIvsqmJkXfZbLHJeNlBYZfaNLCIe222wIirbWpo7O02CDjtBEh2x81aCuiamwYeftPNGhd72U1DTnLfzV4E5Mqbjhx8680W1/3imxoVePfNFhN8/U1Ni7sBZwsNuwSnJkbcg7PFBV6FU/NibsMZgMfb6T+VFZRh0Tyjre/NkbYMS+NLMzcw5RLbQhF8vQ2SAQjQW4iABupBEkB+QQsRcNcgSAaZd9BCGq2D0FbuEP4siygefrF9GpaxTlP9p+4j0+i156O7SiLInkdXNW7LJKgpTe9uHwKMjo1ME0l1BPdGOt3sgtQ/zcI2TSvpQgbPKWngEgng12sfYiEB/nrTp1nYQL+e/Cwt104kIvML8Zt01csKS3qUh+rTv65/hkFVT/IwAbqW9CgtVZQ3J2B/qRYoblTSo7RUBz/LxbUfx1/84H5y0dyKTWGAgHAy1f1Yz9yJHzvMedvuGarJ7zZKJufMbBpowOifh7bP0Aqabl98Kr/EUXAT7f4lnv+Zpft3eV6KTCoc5MZstEmpY/jBp889ii//9XV5sdP8mQJJ9Y5m22VpslmkOWltmdX70dEaz2ZlKlGMnoUQ2RwWowEbZ5sGQY4tWgDXhVusc+pbo4uxWR4R7QVZl2zZZvzeoOMGzB3c/p7PErHjDR9XVPstrhmUvkWlgcH+YIVsuXmOfkAI0jIpMqvUFFqgzWAE0mhtk+gC+Gm294vCLu6iRxyboYesg6pRgWzGkRV6xEOaF368DSwvnespZUP0oJnYgYb4MWNvgx4vLzIhiq3DCSk95swWCe70IP2bwyGu/FdRmsjbJfUxetn65FmSAUgaEIe0ScLBXy9Dzm1wDJSh+LMJ1FoFsa0I64xED4NVyO+vaECqO5p2GmB3NMEioHc0LcWg7mhCRUHuaNrpAd/RpJDidEfTXY/7HU2kqA/WGaScxDgmkUKK+M02j5STBrdUUlAJtqE4O3SnEBwUGXRX1o4fflcWKgZwG9NOCvQ2poOQ2bJonLBx6W6h7j1pRrPUmC6JAIlBZ4iopKB2ziSHtKBWeICUoEt2SdOBWooApwKFinFOA2onBJYClESEffpPgBTH1J9QQQ5pP+1EuKb8hII7pfu0Q3dP9QmFt0/zaUeOXZ1Rp/e0o0aux8jTetpRO6b0hGI7pvO0Y4ek8oQLsE7jaQvvlsITCU7c8LXNddodGg8hyzyKQHfKOmqN755xFCvBNtuomwSnu/1QCdAoFVGGUTC2bXZRS2qnzKJQaKesonbg7hlFHeCne8AbcKPTueppXeADF5Hju2ki+oXgCBS7/DMiwhd9I0LkUs8IiJrwRoz4ac6IiRhWR5DYwdSMSPA1YwfOKeB4xNEcELQFxRwP5D64pGDDn12atJdhyCThhYfb7UCFVD8MQ9pZ4kV9K/Igiw6g02Ba6lAyyiegyWP2joi8seaQFA2AHAEd/ipglI/fDrdNdEbH3BpkB7dOobZI7JZMDYLaxJ5gq1QlcWMQMcdZgtMRM6Cq5mRcGzPtBvzDgYpr4x8OBG1pXH+hNi8KZPwGxgobuIlRAGM2MnaomLXOGBS91GHYcyk4EfsuK1Dw3kvBitt/2eLCvXNqZKRfzhK7KLPkj8wqGdsyc2WszGAjrR0wcK+roMXsd+1Qo13ysXQPU6hYo12SlsAAhR0s1WTGMJNNz65c1zkdqi39JE5ucXpl+izN+ZUpoCGWb8M4f5wF86249cu4boyJ38MCcvYwD2IT85+ejbbhk54kP6b0cxK2J9tq9aIQmfuopDJCv1SF7l61dLg9rLLlDNc2/p3u0rL4jAha64VU9uPaPjp+7SILNtjqZSDG3AXscZf/RRRNJm/oTYWpAfqufptmgWgLU9DgbWqTWW8S0MSzdtO7bVBXFNT8rVXcDQV7CcBFu44ds263hQYuKdXImFWlAXg6L8o5FiymQ0BmBYtZEHcNRXqa5YAuAdKmMQP4OeXG0UECb9KpQDEX6exg9zQtumdt0WJ75wOGfxVob4oNtnQ/5asCLYHneS0hi7ttEdllIV1GHYyxAf99IEGtzXBBOqXtX0J1z9rvDhyQfVcB92dlXV9gidStvAAQ1Cm5shWxe1JlAPoTyUfWmOGCdCyAsAQLqX/gDm1f/mCJ17H6AQDVqfjBIq577QMAsnVe1kVct0ys7qiRXZbnJc7IIbszAJJm9RqxrlztS0gscTpWkHBHdSwgscQLqR/hDk1Fy4355ZaEsjbDBulQ4WKR1LXABQAXFFFWscIjylagroU4lnhBdThw2KQrRVwVDoAQ+yIci+iONTgAsKASHIvc8AocEAnWBTiWud3qb7jD5mSby5x7c2lZKWSR06FQiDukW52QJVZAmRB3ZIcqIUu8rkVC3GFdaoQs0TqXCLHClfz0SdjkY3DH7Z6k98+Dg0UyEzJKNDQNbXhoAomJC6kQpwGhdxWWXyc+lu64WoSGJo/SB4nqfMofROGHfuG7N6T0OEOYaHwtcSuS8JBCcj8oMDda05BOILeizqnsB/fBnZ8kIt42Bxu27cHybV4eDmkGSSWqkmb5olWFsgtcQ1hwJ4L7vi2j2wy09FQI0hjmE1JPSMS/isIon4A0FNs+a862SZtDLmj5JWwCQ/EQBWLLOAAuvYFNmkjCvquTKtIYZhNym6VJscqIbvumdaXyS1xD2i7zk2Jbr8WIJekss0mJwm19+HNbnUmPkt3Wj3fbJmsdsTTbN/FJTYoszQ8ioB8Ytab5xNR/RQPfmWKDrXKTbkvAUV8V7sgYG/ChzO9EOJno2tRMtD3H9k1sUrt3pV++iqDgHwbc3scu+9Adk2aSqbbPLqvMInZp+newyosysTV9NQDfjkakzZsYpTY3BrfVDVL6j1BrnF8Qx7rJYJxR0EMaMOyy1HbZZDSuTOLfQ2GUT0DZTCUc/Upvm01Os0gm7VEzkyvB13hMnhbbN7FJ7a7g0P5UKquUEiRP/k2RZj4gIUP3INEd0dPL0VnJ4l0h9jiizU4UUWMF0nRdq2gQM7FPHwQBZWOIDzQnacucui1HHfD9470z3fvHe4agUexeyaID2TQPA1qnkq9zVmcPcKDmYVog90G7xwGOwiYY96PqAw3wfLoJ5xsC5xs5jvt43tMAI0gmmCf3eXHAeQJOfwYg+IizuaeHEc/bFHB6fUDqDRCDRYgPvnmYGAhQj3IAgpahNAC5J2DocYCZFgwwaeF+1q7HaR6mBUIM0PTjM2J4ph+dv7l7wQcaoNPbgFPmiOmieZgW6AmO80QPcxYgcOqHqYEQ02nzMDnQ5ub47BxFlTcGqMlKDFRJDoSYwEimr8nOC7TqYMjrcC+eESib9nFY6+gO2L5/zH8VfigyRDYohY3vZeOqBsNsZOfNpd3YRpARTEPcWuNF/gryUmiIG2O8wLDFuwYYsZi3Bi6eIetFDXBjjB74ePCs1aVYps7T9o1m6vGTJKPBmTccGg+qfNNZGYwvBsCoNrIpQGNKTWTp7AWyory9NpwKjy8QFevytaGdun2BqCi/r4Zz/A19EPs0ewZ9RNKj389XNMfCf0ZyK1F+Rwpa1IdkRQr9khSw2E/Jihf0LSlgUR+TjlT6mtIkva6erxK4/uTn4mepBIodt9IG+f2h/jVN7t42OV71Puc1gN4U/Uo70GUpJoLdNC+onsNU9DW0rlHYjQgy4b4ytxOVd8ZXEVQnyAScjV3SMthdRUZ1zvXaD+7E2zLzQaWBlgRVbwiqN4TDG1aRtm/PJfDK696ymkTVePxrURwwY3H/PM2IpkJ8n2MA26f58D5GYdA0O5BwMEB/XqX6Q5EU1X1e10WsBm8zMYnpraOmM/D351rHdSPwGnqzJbSChFkHzZpdpwC/crf/EUJRXRt8/0jUwTeNva+P2Bl3mVz06cbp+o5IwvaeGlPHkRU8VRfIdkKqZns9vnKPVNPal74IeP1DszLjMging2bxs/x77EQhxSZw1DtRfG2ssVPPEiKgyfeDRd6e8pWuwbla23JljIenXCw6KPm5qnv5TK1DdFZ5Vexpu/5q/d68DaERsW5/khSR9ilJD1+/kkbV5u6VNDN/bm5eEYlqXiBNzVn/Al5tuuogOEEk1UHcVFSFVH6pbq3TSahM7lqTq/C3a1haBXlvlFvDQ3ov5JpQWAGVRURNKIcRqxCJnxRv070fUeE3JsPOJG/rjz41CvbVvtwHP46qJIDvQsqe01lFVRRb6D1KH9EnjAurffo7iiSqyChdEm1z6c7sE7XlpjPEzfpWKnVPgx1KNmkVKMNh00nI2Q3eGmA4ZBYEIs+bWlY0eJvGZNGZxDRv124L+QBFeAPL/KgR0JvFpIK0FQGt+ahmpxmdF5DbVRAld2tyBfhqGiaCbk0Rw6omwbqpMfPgYIAv6I8dRZrnWcc4ErjxCIf8+dsmWwavN/zIWKpGghib5hODHufG+DTD3AJwXjc6IKeBGjkXvTk+aJqhecxNODIvodfuGfxkLtO3Rkmm8iUBwCzZGnJMrmxLZGDGbCUwTwsrZ5o/UHN49TTDLAMsDzrHwpUHlRtJBwsoD6oChZYHtYKEl11UoCLLLloBw2oZKmARtQztQeEVanTEyNI0VuiYMoEKbnSZQCtoYJlABS+mTKAdKrxMoAoXWSbQDhlWJlCFiygTaIUaAdKbKDgjaKYTK0hgBT4FJ6YCnxUqpgKfghddgc8KmoqWGxNa3E6FiipuZ4WLqhmnQMbXjHPGJp2RCWvG2QkB1oxToWNqxtnB4mvGqbiJasZZSoDVjFNyI2rGWcFCCrEpQMGF2KwgEYXYFKzYQmxWyNBCbApeVCE2K1hwITYFLa4QmxZX5Xv/swl8RynKAT+xwnen4r/Fl/c3qEsVIwvfYdx8SkcYOx83nf40MO5E0Qx/Jwqa40R29JMgDR6eJNCrZpfzoGHvCs3gK4tBZ5G55Q9ZWgVcrv04rsqVUUlozQaDWWYdNGcbZzpoDzfa6cCfDlTJoDseaKGiqrDxjoy+qdexFvVNFBN+yw173tlcQcHHkhQ+LZm4VfGT0Z+2913ha7K5LYbYyuEwvoRGxbjxDwf8RTRFYxrOK/13lITp4+/RXqQlYp+hVVQWd4/1K4r+FeuI6+agTz4gYemirs76wYdmNIVIIssLoZVFmxjCVdo7NknQzGJgKdgkF2Y5JFkuXCSlwf3NvXjk0JMG93ljekUxv6exyPwEczjCqKgY2V9HVihu/TKuR4c6qRz9FLppX1E9eehesY64WxGKrHJf3UxWOmTa+jeQL34WpbX7F5wrSq+LZR+zJCqKC5GJsL3ycV3XXmYQ176mPX4XdK9ZR2R7gvCmKSv4Jt6lWVTcuRdBWZTZymvrF/qjF60jlDA9kE4i9X1oe3HECYJ0Ajku6dqLTJPWs3CdCb+IEvdMvosCq5J49SuC4RXriDukh/LQ7GN+FdHujmF2qF/R7GPuulesLu6/o5BjKzPS9ti+YS1peTFzQBLKygt6P+SCpO6QLMNcNza9jpj2e/6XcM8mv6imtX0vsFf7HeQ0S0cef0C7alzVHZADS+oti+kNryNEeTGbTA3hHW17Sbo7z2SqaK8/G4UdH11deGdDzPSjdjFRly41C5s9TH7/65OffW5L9Do3++hZeq9xc98m3wI6+ZRrI9kC/PLjRjLff6lqb+N5ZWNkwNOu+Um1pLDolePniDI3TsCydH8onJDqJ+i/jnmiG6C7SGuJ48Zk9qcfl4BllRly4wfZQ2cY0im1jWmIuLQJN9PsV0gh3yVB4xfcgWv6Ogur0gxe3/lxLBLAimRBVGU8GBlfXRAw3OIiCxNvcRYXRvkh9t2X9QuCBrNriIjTXZRwfEO14RW/nb3/9Ib+o9n7T+A1vLOEJIWEUhYUdEbXEHCQ52ciBb3VNSRUfvBMBMUfkPWaWUdnGr56cxcjJ98jE4JIuQcQAbyAvagCcxUbIqNed38Ypyqmk1Lb3oPTFIPl/P58YJNTNLbXkAO8Mr8gBHN53l1CAblUvaSgAF+udhZQRnUVKvqfoYzi3jCTkPHm8LN8mhZ6Fk9thn5biI9qGUipAlqaNtV+ClkUFJ+aC1A3z4l7TWCTpMZ6e70qb6xzSJr0qT5vK6JDTW3Q9ybwbK2jQ87TqoajnQO04JjR34yt6BnITsHYH8g67qRXDFmH094uvKWtGrkdKJE6ZCv0Ta6+y4GHpDgFpW5I1vNPJkF0J5+chEWdIOiBUIOmXgvqRChYDvxIqKUm5JlQJ2FfIUXXDTrgxTacsElWdDoNdAs6e0GEk4hKEvVcYieKZJGqk0S3RrUXhI3WG+SQxOmXxEyjjZ9HHpuhv1kEHaUHWQKhn0feFxBa/SAL2o0IyiwqnvuTvE5886fJ79S3vz+okLX87Pdzj17Bhb9BP2ko/e1z94rLKl5UMWs7Vmg1axUutpy1HTGonrUKF1XQWs862iPd1BeAodOz9PT3dPZhDoY97yA3lP5y7A3IoaviPRwQflw7XPSRDBU3zTEMKwHQYL4CGxXAt4KFB+0VuMhAvRUwMDivoMUE5O1QIfE5FSg4FmeFCQy1K0Ax4XUrVLBLWAGLcwZb4hZllkAyEyh5K2PgdARWwEC/tYIW47G2Q412yR/uyVJVqNEuKYH5Uq1Q4dFIBS0yAqkDni+/mvwruEWYZOP7W4rN8WgWZHLT8SzLVOwEizMrdOyiQcFOsnSwgkctIBTk+GWEFTZy6lOAU0yAVuioWUUBjp9bdNjTUfBjiRoAh8c5QnPIDAwKQKKkC5OWo14dT6Fxy+Nl0Ori6r/TXVoWnxEnOlXkleW4tow+0GknBbcgneITrEiVyOOvEFgzjLdU2LYARSXm9bW2iBiEuXAP4m7bGBN7rW2p5BdBS46MkAO24TwCyqklctR6UkQhdhbI0WrN2wJyvHfMJ5mhgByPM13CH/BN1akBhrEHWEBKSYarITVrLQ0yvEKTGhpZpMkWG1anSY2MKNXkhAuvDWHgRtaFsBWAqdmkpkeXbbJFB1ZuUlNjijdZA8PrN2mgkSWcrMFhVZw00IhCTrbAwDJJamBMpSRbYEyxJDU1ul6SLToh8wqw0MJJGmBU7SRbaFT5JDU4voISBJ56oiSso2QtB1hKSSMAU03JGhlfUElDT1RTyV4IrKySjh5RWckWGVJcSY0Lrq9ki4oosaQmxlZZsgWHFlpSU6NqLdkig8stqZlxFZcM0MOhxrKI4mEFuE/DMtaz1n8M2YWPXn0+TuccZM+jYxK3ZRLUjkvz+9vHQN6ARq6JprpJKgcR3bD655n4puVT3Ojap6nZRAL6JdvHmGjAv+T0eSY+4C8pP03NthNJHa76Tcp2YokmPcxF9ulf1z9DwapnubhAXU16mJosypt7hr9UO3NXMulharKDn+Xiuq9eIuVms+RTmCChnEyNP9YzeOLHTnPktnuKbrK8jZLJzR27hhpQegvwdhpaQ/MpFJ/KL3EU3ES7f4nnf2bp/l2elyJ7P76q58pttEqrZfjxp08maSj+K0hHO0RdP+j/UoGmelMToLC32izunGQP8OpIzZs6cmp9L2zKMnocyGUTISbDawPFbmFDg1EL7J+rmK911n0XAWJsmU1Km1NKhDfW544WRfQ2Hc8egfDtD3pZcDue8QIA2x/vWsRlaV1p8LCPoc6MN4+yDBpBWiZFZnVlxIS1GewAG7BtHl2cLs32flHYuU6NoGNLLKh1vCQq8E06MsQCWp0B8+NtYHkazsgq22LBzcQOOjGMSXszLJB5kQlRbB0OTBhhZ+aooKWR6XCIq+tp9eVIyxMTszdMbFCNVRLncJNOOJyNnaHOzTCNrKH4swnKWIWtbDnrZMEPg2Fgl1A0JlUqHmslsFw8GCnQZDz2klDZeBDSIOl4rFWB8/EQCXJKyANS5Z6RBy/tg/V9EFdJjjdD8FJ+s8367KrELfMzQohtmiRrAU55khDgoERJ1irgmZIQkgBJeKwFQbPwuMmZJpR5M84CsJRMxvCqNCNbrEyXVoAiICpQVAUQa0+Xw+1LW0jABUwL06S5JuylgJNOICQ5F/6wlgOr+kElxb7kB0yQY70PhCyH/CDWUlwThSDwnS7/Wgtwv/+LkGB/Bdian2CtR13aw5odv7ojL+phze6YcgQB71jOw1oB5OonSoZ1IQ8HCW5VPPD49D9CbXa13wAR4iErQoIT4FSBxEWEe/kRAiG2tUechThdV0QIQQThiEqOYODBDm+aYiMIdKfcPtb47kl+3CRMd53wiAPs2OGKzvuBjs5l3zQXy+JyhEuwpDSCohaSI0788tGIiZ0sR6QkU6QRFjcMj1AJBl8zKM0XTzDQTjHHY1N3ZBIRaJyYYBmn0LE5FSRRXG7ahFr/9c9ZloJGWSV8mojWHis2clOmRKfYkOnxVd0b7uvFnCle50CjgpDkTOOk7QwrCCpq1LEaO1yB/QbHvDQfoAXwW5EHWXSAnhjVsoeSXVYZTZqjd3T8jUGHtEkw8Agem1NhY8NxdtBtLiRS8tbmGvjWmZZsuN2SLgGBu5z7wCWfkruxiVv+WeKTcvMATyPN13EkkvpS3iRuZRdrnj5OFm2eYhoibJakcwscofHrNL2PMOcNJQNczfm2icJNMe1aUn6YoxF/TsL2kErdf0UhMlBbquywLD0Rs5uWET3HKVuROnWovRxcDlGMOPC4rBeDG50X4Mefwi+imBTvAuiYGWH5CDKBdi+oQTetZbSLYd6Y2kZvcjDi2lyywePPSbNAtDXeyCA3tdWstwpua7kNWXuNQgVhp7EUAnf/6hQgvcC26HBnsBoc6RM2YE8XMvIlfLv1C+Duvd2yBX1NQDLAdRSSBmzTWIL9wHJD4bPI2uAi70TZIe/JWnfP3brF9s6HTRoq3N4aJ3IJOlWpwi3h5yctUYu7bRHZ5Y6zAh7scWL/bVWnyAb4b/s6RSBUp4TNFsDuCZtB2AHlVxes8NFZZ5i24HXLMA3HdUqcacvtnjETJuCJ6hNsLDGiOibDtkCGJMMGodsnw7agdkyGDQN2SoZtA+2eDBsGbp0M2wbaLRk2CDiyy+hpQRs5pPKEoZKtjiPulbF9inELWscU4yBgxxTjFtSQFOMgdELmFWC/3FKx1pY4UR2yodvwumZDh0FDz06qiFHnJ61wXZO3W1CDkrej4anXoLjk7TA59snbbQQ4Jm+HIYOSt9vQw5O3A4VYJ2+3ondL3g5Czim3tvkKW1vLbPM2tA7Z5kGobtnmLYgB2eZB4A7Z5i2oXbPNg5Bdss1bMDtnm7eFliIPH9Ikva5sNMdHPsPvTmpM0Z1EOb0cZ7Z9E8fNe2BbGQPsZicKP46D3jqw+TVNq5fU/B2HnKCzzCbF2KfsCw4uvxlSe9CyV+W0P4FUVoThN5iXkRj/CEnYZOUAaekeZjruAY93y2T4QPfQTOQR7gkqMrStApV+7zoF9wdR+KFf+CBeyQJPEHl8ZXMrkvCQArNsKGA3WuvAFpdbVBdO8oP74M5PEhFvm0Nq2/bg8DYvD4c0A+aSVQm0fNfacteQuZK84E4E932jRrcZdCOokKWxzSqnXvrR/0IKu6wy0lBs+zRG2yaPEYes5fdwygzFQxSILe8gufQSToEiCfv+T61LY5tTzm2WJsVaY7/ty1YXvIrQlQTuMj8p6vrrDKOLzjinoCjcNjXl82iXRMlu68e7bZN8kF6g7ctYBSdFluYHEbAMnlrrrJLqvyKT0FnjRK5S0m5L2D0QFfTIHif2oczvRDiZG9u8WeR9yfZlnIK716VfvoqgWGWQcHvlGuIP3U0aPrHqV6whrsyiNQTqX8MtMsrE1vQpwVw3Gqk2L+MV3Pj8tlXyOJaPU2t/FVlMKy+DfV5ZD2nAs4tTm+YU07gv6X8bhV1WGWUz7zD1NL15TlHNqpu6j82sriehhuTz89i+jFNwd7uQ/GdTGSYWMo47vH+8h5C/f7zniTDEoLIUHc6meR7WXlVT6DyY2QMKq3meHAv0RfVQ8E/EhAS6xTAwwa8umKC+4aC+cUCBAhM9Ezz0YEJ6Ag1jA9QTfLQyYKFGqM09C5J43qaw6w0DWG+DHi/CDQ3N8/RYsGqXAxaiyKUBC5S+pYeC52kxIKUF6EBlD9U8T46FG9xZxnbc0M4ysn8DOU4HJrif1ABVwg5w9VTN8+RYTyioJxakswAHVT/PgIWbnJvnObA2N8dn51i2vLHBwFci0UoOLNxESDUNTnaC0PUMT8qSe/GMA9q0FsAtpTt1/f4x/1X4ochwWeoUZr6vTbUaD7nJnjeddtMdAUc8DXdrkB38K9SnouFu7LFjgzcNGmzcJsIau3gGrko12I09Fuzj4ax6fxq8SqH6k58LObl9+/pFFWozHDmuJsfXEQny1JZYRr4w3fsRaHtngNz0VmGdRNOSGgl3RXH4mMSg9YJJRGU3beyuIQN6JdMkAXUb0w3/4MM25Cb81uYq+CLLo7wQsDCFUcTY8hpScn8vboA3C01CKruoO4aOMkQAvGJtFNFZ5ZKgmsGu00w06cDh09dgg+VmWHUl4bo5k9okOyYjHd92iDvT6NbvG1SjJ2izvNPJGFnkoD/zhtSdQZWUPyuDArPemfFLRtl/gFDkRZY+t0mF6WS0dvPeLruSnSimazm0ip0o0t7mGgrIf4edKNb9DZq8t6QCis4kO3+UvxkKyY/OeaBVRLk/MbyCliYjtZxgmEBJc7Bj15rl0CFHkKIwIJ6VN5XNoLPJ/ktUZ4vfEX7TzVnltcg/Ui4yKoMrLS2aBCHkA2pjdsUxtZzmlcdLwCaUX/h6VWvrX4vigPQM9SZYvUIf++GGwjM0s8biHQp0JZDokDfNO6pH9907kJ1n3tJGeTciyARu22+Ulnf215JVF3eAXahaUjSYXktMWz/oprlG8ybepVlU3O05xLVVhdobO/7oVWuJra6BXfvBnXhbZj60FuOSzOolQfWScHjJWgL37VlbdpHdi9YUqpqePn5CTk6tAarhndzNMOaj9TF0Tac7iknXrsgyq07EqkKrBPAUdVYNOtQrGop1DOPqxY/j9PH/liJ7roONHx9ElkUhLNeREnhTv+Fb9Yb6bmA6egP2JzCPo/7h8EcGKj6gEXI4lBm8AIEtdrMgeodcR86XWIg4uhs6xVqRcYW4JCEN7m/uxSMlfxrc541JZvg64ELe/k0KxHXaPxRfyt0OuzCX4uyDRW70W7+M650gvNC9TkNtunri0JnmFXMrQpFV3tKbiRcKraW3TOaOstnqYQoE6nRQlAe0FhHFhchEiC4SpxHTmm+3d0FnnlfUbN9KJ2i2T2UXQ7wv5d6Nrr4HXWPnaRaVJj9pI/hoSWnCEMNfFNR62K8z4RdRQvj9VJkSatPBYJpfTPHmcIijJqfBDbTssl5Q4Q/mcSWYbUWRFcZWi6Itim0riqDmrloOVc1deyFN4mDCiXRskh2+zmfye7QXpCNZZ7joDTMLScuC9Cfo7PFi55PgJpqbLKy5BE47sK4zkOZFFgXFp6YSyc1zArpcpxNQmW6LnOSNaV4xhUj8pHiLP1Yu6WisUh0rX5BQ5uKTT7hLL3Nx8Pn36NXU8maHPcE8Jc/8HclpFkXBcoNPubqoQSGjsvMf51vuofn9y3U7s/uYR4Jo/cwmfEpf8yCA3N+8LIHO5zmVQez3NEsh9D2PdVD7n40iiH3QIx0cfmiTFEpf9CCD3B9tlsDgkx5r4fJLm0Rx+KYHTWz+abMk4g31WA/HltoohstXPRLF6q82iWPxWQ/C+PzWJlEsvutBFJ//2iSKzYc9COP1Y5vEMfmyB2mc/myzMAaf9lgWl197SRSLb1sWxuffNolj83EP4nj93CZxDL7uQRaXv9ssiNDnPZZC7fdeEEHt+5aksPi/jYLIfOAjHbR+cBM+oS984Kf2hxsF0A/I6w3ALL7xsRAu/7hJFLWPfNDD4ic3SaHzlQ8iiP3lC/h0PnNJAbHffCJC6TtHlLae2mDJMYGuaa2kJCpmPWtFvQh4CWWtAGTpZAf4OmZByv6ttciO/tl/pO7iFX/mP2a9WXoR6i8VXjB8ZoTlWw3ThJBu05pDt+68IriUmaDiTPz4RmQPIpMvXuE1dNbz2jrRlaElSc2d2N/SauRMH2EVQjR6GtNJWvi9aWYxSXqdJugcW7KKJA16m+z4xT/TMqH8DZK0uG1NMsN3zgVC+JFJZvhcJOH7HLkJk+Erk19zii3YMjzNikGmJ1wyLOL/ltZ+Zlr+JA1aowwClJMu3g/RmGA5UKJPwIYE5ci/1jalLkw+zb2GVUCXes0MPsmng8WmSqezDI0NFE+pV+gks+wzWG46T/MMXDmcTBMAQfhbGzwn1IJA5PkkaxoWctNYpUqc1rWhTkJbglSEN3URRUIZveW8s8wrpQ2t0ylog+ns4Jm4zUR+R0zfWl1HQjUy0KG31siRTYMMRaYF2RRPuij8MldBuaFa6U4aU3esjOI0hUoG3RkKOyF7/ynal3uS0yEqPa39tWXlcRRij06o5Ax215FRpMjs1koRrVUuCRaDFPro/tzcf8ZgNT3NS/0zGM/C0n/ko5OwTF+48YAb2+A1OuHGO4AZw9rkg9gops0zkJmj9LSD2ThAzzCg2QRT2yduqJTVhnhCNSIWyAMeM8ZNb5Sm4Ztm1If2iOl3FLcobNBzcvScE13Z0auzPCQbjJGh73bGnjLSzdXjZrRp8k9+VkR+TNbysr3v+gdQoNL+DpO2XcjRWfs2kGk6BxusSaQJ3HmNCW6XIxXi2OGI7xxt8y3j//x0iAhWnhohYmydVRKF23EsgszruICd1z8A8riDBJ6L3iIrOpm/dExP6y5dElAfYSLxucsaWrtUHvclGc2hfUL+3iAreE7b7GytrZyf/sC62isDPHNTGGYix7VrD7cZrCGbtW4wHfKeqC03jSVG1C9RVtyF2HsGA/DYHiO22PsRLsPFgNzZ4sbdPogsuo2Qc+OEe2yUUcCtv4/i5239/2joZYuM6DuRhFRj26Y3xgkcPYiEsqklg5zgVQEwqoG6N8YIHIWg+toK2sYSI2qcBn5M1SF6Y4zA+ygMY0HZjWWLjOiEzCvARsE9JfBgjhH6cJcmYpuU+y9kI/PE5Erw1HO6zjannKi6uE7VfwZrnMjVHfUsE+G2OtND2PuVhlmF1PdXyeg7a4zIefmFCLexxIjaFGYMtz4u1DMQSwYZwR/FlxxbB36gHqwxIv+dJiLCngoemEfmiKFVcYQ//TgKa7cuMpgwMUQXNb668M6G+l8fDXl2iueDBbHCAh9sVRNUlz/HFldhgw9Y7gW2iMw/ObYFV2s9U1Yhe9iZDY7w3Cc/w9zoHT3O4vpsIh/5FpZsYkq3kczBhtVxg5nDENsSlm9pRi3bo8Sedt1PWbo/uI6kzUMsnbPM70T4pr3wUH8I8HSZWmNM8eTsTz8uYdEQM+rGD7KHzjawN2gb1nCdpUoeHPhFmv0awa5BL8kav+MuQlyLdpYXpKG4vvPjWCQ72DhollbZD0b2X0IWvAy2izhkIWxniWGUH2IflBVkQdZgeSUpcbqLEqZvq7a97je195/esHxMe//JX/MrStIEFotf0NHZXUnGQZ7b6XT0hlcSkuHSWS6oochkCZAEzg20KAeXHgggBX54ZVEL8hgLREy9ZP6QhkyCavP7xvzKon5/PnCKKhrzK4mCHz1akIM8hOQuBJryckkHKu+ls4wy+ncdYuX4Scoo7m3zyRlvRD/L6YYRB9/Vlli2oCQpuw28hEm7Ne3LmVjVJIwuteqisEkvq47K/pL5SYHrYlMzLP0LM9PrGPFzvKoRyecMLT5ytjDDK/oKPsmC0hBLf0FnbNejElVTUTeqTg5VORWTLNJ6Kk7yok4WoviVQVmvCFsECyzq9zQWmQ/c2lsqK0bvWEFeVdCFWE1rcgV4quWKTgnpasVeVkY6qauEtW/YVW9I+zesII1qHaYTRroMs5f10BxhEO/gF9AMojrr2OtoS5Kmob3PI1fG0APtInzSs1xh888jtwQUsH6WC/DG34ubqBCTuJ4dofwwG6IIyiwqnt/EuzSLiru9M+bMAEdct+20/45u62oukC9sYoLnzjgV2AY+ck2bSndOggwVvlSxRC3JUEsGVKmb1jlVEZO2ZIDnmAGqguicrw7CI2uGys2mXe2Bc9wrqNMEl9PeCjkTuygvYMf1Fcwjc6zQRZklwGLYSurKXokohK3Dnn55H0vMelm2wOTPwNe7VWDSVbqdtCJ9ngUVPXZdaweNHD6m0BTjxzI0WUVGlQTaWox2gsCxKpUAXIBKCzweVuApaNgzz2wL6Ec4T9SyxX2B5hwPuBO5Y1iCw7hLGWRoWnVkhwOz9d/QsE6NcQDXQQ4saGeEA7AWvy2A5xvGlJIlItTxiEQQUV4nlAyebjWRY9x8axkobj8GMuzBHjX2tE9UYSzMvYypje8tL42SD52aZtZyHClf1Oj4rC+28ODEL2pwXO4XJ2jUVXEDPf6auK0MZBIYtQaKPDC2AuCpYNTsyGww1tiohDAadHxOGGt8cFoYDTouM4wtNjzjihobmXTFFhuZd0XNTpF6xVYALfk6yIgcLBpsbBoWW3RsJhY1PkkyFogEhkmWNiWLtSh4VhaNDGRiFmtwktwsGg106Vns5YAztOg04JK02IID87SooTGpWmyBcdla1NwECVts8RE5W9Ts2LQttuCYzC1qcnTyFgP6cNqjLKJ4WFXu07CMjcT13wM9ASOA89HtWxFkz6NLhbdlEtSujUWK9kmoX6KRbmKqLnfImTec4XoTfJTTSpzOjMgynAZCkUB/2/ZJPibMbzs1wUcJ/21lAwyEO5HUIebfpKvN9oDS84x8n/51/TMCr3qckQ7aBaXnGfiivHE0/1K5CQB80vMMfAc/y8V1Wxh7cnrJnlJhhYp1MsX+WK8HEj92nWu33YOkk+5tlEyObFg32gDUG0G12dAymg+l+FR+iaPgJtr9Szz/M0v37/K8FNn78UUFAL3RMLmioTvMHhZPxVeLJVj9Zwou1TuCOBKjHCALNpu/dpTcUKujT2+GLDyz3GWmdbGEozACQWzNaYMK1jFJK7iNY0xyyaj2WEI++mNLP42dgCj3J5bZpfw79a2rQdqKiHubzPhZczuXEH6wyIxuXRjcjtutMrgD9LnkSCpEUFzXj33yd1ZLJ+lVMws0g4qUcm76CpeTGRKszhLDQOi7nQK3xwQdB7cyTxAqc5DhGjAjkFDfB+bREbSm1xCz94vg7k1sd+DAQUlt14+BH4KzjDR5Ux+NfCsS29CIg5g0aQ5ehp31dSTZn8ly0oJZBrmLqDeZvD9O/dW8wC/kdvfCQRLgEoarkHNpqVHN8c6zdfsc0Rw9Smq5P6SJSArrfdfwBHKfNGqU5haLQ5sMDM2jsGYZtJuurH3KUrc5dApXG6AjRGTGXQSEZMM1GaXNgGuBD896C5ER3EVxmFmeM1+mH5ljhHZJ8rrM7JzYFYLslsx1GRqQwBWC7ZC0dZnZNVErBNghq+kysGsmUwiwU9asZWT3fFkwaMBKxkgNXcA4YTsk+Fpmdk3tBQF2y5q4zAzIlGiJPVkKja+/uq6FPjpXXnFYDH0sC+RqqLPAtBzCT8gSINWM3Lfb0uVnKu6xQU7w4RIuajiT4YfLt/gxTSFg8rH9YRXUVRr/wzWe6/Cp/XFAfmmtge933zEGJNt3dM3GtfaVoGnWvgvI2EWkREyyiFwAxq/JJGSiNdkiNHpNNqGmWZMtYGPXZBIzyZpsAZhgTSYxU63J5tgqH9mPjscJ+ge3JCcLRjNX63QcrRgcJq+t7LkUIXKS+NEmCCjC6+4B+Mw2I5dtkuugW1zakBMsN380v0Z/FbM5+cUnbfSGdaW5x0DdhAGjoTSynOOiEG2wCClWYBcr/YX59+tipy/0OyJjdm5aKaJ3AMGjeavL1fR7Co/5dFKntlhnsenL8HOY0iLvDIbbtS2DU2zjfjS9hTeeZCOQLsAEEorZwFrIQ+9oQaJw4R0LWQTxHpAwxN7dQhV2Mw+ShAgRWUjCxoxAklAOCwtReA8GUBbGpWGlC+3jAAlDOD0sVGG9ICBJOLeIhSoCP4mtsMFx0uS7snSWNFd1Ca9e1Itc+2ysY4rRs6AFmUWKShqwNkelY35CjUUL4J+rLJP10XRSdDE2yyOiLd0pwhvX0UOD3xuEDRgO4M6zk5YYNg9ZozoPzBpQ+haVBgaHRHuS5eY5+gEhSMukyFzW9HOgzWAE0mhtk+i8g2m29wu38LQCcWyGHrKe36IC2YwjK/SIVWDbj7eBbf1bLaVsiB60yqYPGeLHjL0Nery8yIQoti4ZM7WYM1skuNJ4czjEwAugrfmJAZIRaFrs5s3h8HFyB0JT5GaC1j7FBfU5LQuRvTlEv/pJGIvsn4kj39wAO+pH6X5M+14ottLYChJmbmm0Dp1FGjHyF9e89jpNCvHk4q2YcLcG6Of8g+sFQwPYBnanUG3Rpn9Ul1wwvWH0PE9HHjtpF4t2SYjSkyRw57KX+kOd+vLRzxwu7DZs8tP0H42ifrdz99QUGSfeP7sHMcx48LCF1i5HoGJJBDY04SymWn9eV7FTkTh5uReEVGaDkdkVRXwQxV0K2OZYSdl3xnkFuYeIFkQAg0LO4JAw0AI6OPDjDO8c6lkghwV3nLGT1LZmsxV1Z44X2jkGtUANizo5Y2eOdaqs2EH1qcACapcnJXxncBVw4oavba7T7lAXsB4e5Qp2Qu+LHZPi11b3cAeYu4TfbSsgOUlwq4YElAB1zOvgUQ56B2yYu0xL7VYTDwgNCeUugIODtzbw083ztWE9bLGDVjzOsse/LvMi3fdnD2vHwofqKKebT8JghgX7bbOWnubBsiCVnyTf/v/8VGT+G0jqqwZv8vz3tO1XoWG3/NPmYtvuq+FptvqWIqAbSiU6ajNpCQzfSCqRkZtIS2jgBlJJjNk8WuIC92BKXMz+yxIXvIRWAuOWz5bIwEWbEhizYLPEha97lMTINY8eWs6o7JBWfmx+eJJ8Iv6lN+2eLLOBm1mgn4zbzKxdCU4ixC7ha9nW64D99PMG1P34kwrW9r89qIC11U/fWEb88pIB+h/+Ns0C8dmhEuwi3qY26VwM1mSXsdcq+Kk6raUE4DymY8dMZLbQwJlMjYyZygzA042aXO7BYn8Gqe9gMSRUVsHDwehh+qHA+WKtBgp4g3ZujfaqrJkWdCfWHhmQKFjHC80NbIQdd9F3TemLun3du4P0NIvXgABp05gBtJ/cODpI4EFGFSjmHKMd7J6mRfesLVps73zACkUF2ptigy3dTxyoQEvg2QJLyOJuW0SW5TcXUQdjbMB/H0hQazNckONC92jUsTEu4IDsuwq4P6u6mj0FaWeIFdSt0rANMaC4sDv6E8lH1pjhgrz191H8bF/CfAFWNscFvRNJ6FSURsvbW2JDjR5EQta8kjU2ZNjeRYWL2LxYoUaWBYwXOCOXmsXukDSr14h15do4lCk4e0tcqPv6nDfZNyWb44KmouXG/HJLQlmbYYOMgnuy9hxsseGCjpGqWOEHSK1AD3dpIrZJuf9CM7lO7K2BTbpS1BlmExJVR1VJuspgig22cu1nmQi3lXOf6nNUWuWTkN5GNJPeYIoLNifbXObcm8u8/ELCWZvhgiwPlTcg3NKsICVrXMiP4kse0bhDBlNcsH+niYgggUQF7cgWIa7kp0/C5sCYO273JMdBAmA8U2ZCBjKHpqGNYE4gMaFLFaJUpV5dBtnyTMPkceqLr1HexNzloKo12+hh8gDru7F1aKBVZYQr4AqLY2oJ8fFMZQtSxzX1/Lj45gL8uKe8f3RJj92Yf/94zxDTjF0qhMsgm+ZhQEtV8nVBgewBDtQ8TAvkvjXqcYCbHxOMu4t8oAH6xU043xA438hx3Gf+ngY42ZtgALlCBpwn4MLYAAQfcTbOmfaXYcTz1i3p9RSpN0AMFiE++OZhYiBAGrIBCJp9zADknsurxwGm8DLApIX7Hr/HaR6mBUIM0PTjM2J4ph+dv7lfmB5ogBejDThljpgumodpgZ7gOE/0MGcBAqd+mBoIMZ02D5MDbW6Oz85RVHljgJqsxECV5ECICYxk+hp5D6qHrquHKh+Fq/dAephmL3Z82aN9GFv/yc+FnEGxfY+ZUG2D5fax9CpABjfV8+QeGeklUI+Mygj9TjydZMxE023SRLQWAV+QsuUWGvk6Te8jgW5myQx9Q4fp3o/cF7EGvE1vEtPQcutp4O+K4vAxid1HVBN+ZTRtjLILAEU+TfDwoKcb+MEHbDVM4K1BfnCR5VFeCMAVdiP+2Cy7iNzfixtIMM8koTIKD+s5ChAB5KyCEb8zyQKvWpn8WhQHzKqkf55voh+ymqLnoZmp7ysMs8CJD8YY2pQ6JLOkBReYcReSJsAiinZy0gRTNhEuCrnC1KqhWGc6yMBUubSVhC5uCZV3kPJHkQ9fm95+1tlnk6WaQn4TT8W1XPnabQ4ZDBBta08HSl+dVBsFWF9Q24+NYtp71HyDhjNvXGA8yYusDArwJD3lly2Swx+fH3un4xTKmaDsH5vKYF9qnZ5+3H0UOWBw7DtR5L1BdvZJChM0etHZ4yXXHVfC8Ue5P7HKrUJ1rAmroUkksmtt8ipQu1ZxCvqH/BK9WbYZfdIoDEhHn8rgSqNPO7ETgQ/WVqF+c4howf0DMGTozv7J31GtFVqLB3DGPQf6TFc+HSehM1ukebRL0F5RVx0fS6ovQBaSlizfgnKN/PETxsnSPk2yOqZdWY7JCJeVXXPpDmIRteWGYpdrw/pW5EEWHQr4OnKOHUo2aRUo/XBo7xubz82P4/Tx/5Yie67zOX58EFkWhZidtrS/rs1/q8zXpbTSkXlUs5u9Bv7h4Fad2yjhcCjdK3G7ATeLoncI142E3JiDHr9zg74RQSYQwRQFeN6ZZIVPg/ube/FIRp4G93ljjxO7DlDQtnltco02D8WXcrcDXA9Wg4/MsULf+mVcIBK46+hru9WfY6oM2sq4FaHIqr37dFmIU9GbpVkVLorAJBnVKUCnGLXGj+JCZCLE5fXTyGhtR2HtaAo624xyokbGTb2x2b0B3J1RS2klNBumHfhaja2Mr4/3+bUf3Im3ZeYXkOrMahmV3aCyGw52GWXsReGHfuFzSOlsrygnTX7yg/vrOz9JRPzvdJeSDVlp8sUP7oPGctxZZpXS+sGvM+EXUUL1nVRFjmq7wWCXWUaBLrmtl1L4g21EQSFbOVWl96ZffUZUj1PLqWw3PQtdRM5WDjYDt1oISQZuewnNTXOqKXFsjxe7qWIW7QXdKNVXMeutckpABtdlcopI+uL5MTmwiCOmiSouIRMOlysMj3mRRUHxqclMc/OcuF+A0aFXdtuMN3ljl1FGIRI/Kd4iDzlLChqTJIecF+DLXHzyqXbLZS4OPvNeuZon3uxQZ2unzJm/w4cLLU/sfwZWYZ0aoD+KsxPFmzhuTqcixukxX3UmwY/joLeJaeCu5fT4DTsdetDZ48WuPeN01N9ac7zQn/1H0q5ckWf+I6qmsAlf+S0ilyTN8/Txki90u9IR4oZ6S9o2n86L7Mdx9UYa9pE1PuRcjsqjgElC8cu4KC/rlJe7S5TojeOYmGjDOENWDhXTU4bO5JQF5yY1UqoT05OThCi8TWOS5DBh1246+La4sQhvYDnaNAJ6s5ikbbYiWh81EXvrmeZFbgu2UXK3JleArz58IujWFC2saQBBH9Lgrg0ZINfQqsKQJOtobVVIOZKKDkqoBBCFI+wk7P2naF/u8eEVlZLW+KqC8jgKUREJlZDB6AoCihRzkVSJ35pkgbcYgKpMFVSKKlvf+0DUM3IMRnVjrjQgDUJYvmGTFKaBaVDEOTiZhBEPUIMgjkHKKIRyoBrJIB+sJiJMA9YNiabaCr3PNBSxwERcZnSb3iJBYzdNp/fhUXLv0Af7bKBzWuicDVrZoauIGn4DMLLyHc66Uzqi+XbcdDbN/MnPisiPaVpbNvadNroCkrDtJ+25cJ2m9itgbtQMBvjylmBdZs3zrA49ErixOw/ZFdomWwb/+ekQYVeJGglibJpPDNqpN8an8ektAOd1o2NSc0jIuejN8UHT+CHH3IRuyCX0OsaI91zL9K1REr/1kgBg8RYNOaaEiyUysJCLEpinhZUzzR8oh3X1NMMsA6xaP8fCVa2XG0kHC6harwKFVq23goRXA1egIquBWwHDSmwrYBEltu1B4YUTdcTIiolW6Jjq1QpudPVqK2hg9WoFL6Z6tR0qvHq1ChdZvdoOGVa9WoWLqF5thRoBqt8oOCNoIRwrSGBhaAUnpjC0FSqmMLSCF10Y2gqaipYbE1pzWYWKqrlshYsqZaxAxpcydsYmnZEJSxnbCQGWMlahY0oZ28HiSxmruIlKGVtKgJUyVnIjShlbwULqAytAwfWBrSAR9YEVrNj6wFbI0PrACl5UfWArWHB9YAUtrj6wFlfle//Tj6Ow9o9iHPATK0SRU7meSZWea5TNVp0A2qKuicnOKuD67MgA+pmxFSR8FnkZF3Dq5nkW0I+GO/oWnIrHmTDlr80Kje/T+qhNB2AFNnmYDVF/1d8Sc2aABbVKNwn4gUePsWHVtxeyN4dIHvYA1aGWra0hYjb64ZXoTPLIydL9wWmEap4ggTmXlttSalrLemvtY0w045SzbkBvDhH5QYBPvek3B3DteJUR+mAN0GWohUN5DpXtZgSHVVtZokfUWXGRAK6woufH1VZxgUdWVdFLoKin4iYEX4LEpIao+MiCJPXwU68T0OPPyMp3OABN6YhGoHHTsQ5BGn6SMchCBMEgNFNANQpZ4JMNQzMRtOOQlRTKgUihh3wkUotSDkUHkqHowDoU+fAkqXrC+sYwJkWqugmZRtM5Psloao+OHE11/BSjqY0I/Gg6V0A0mtrgU42mcxGko6mdFMLRVKWHejS1EZWJoswSSHJ4g5TGaAlNEr8kQOHHaGrWvTkcbkT2ILLrdH9Ik3HeLTvnhs4M135e9a5PWQofb7UG6ee2A2peM4NuCKY3fdtqcyj6WYCcrhdkNa94CXGgPBR2ouB5KRzEaL/52nn6oZrQHB2vKgNcblZlyU5nSJqPWDEMIVfR3/HymWPdzLpgpl4p8y+RWdbGzIti+tUw9zKLYX01R55HQaTidW5hkOpRrgGrsv1LVU61mjNuolDU08V1mhTiyf2EkY1R+sENMyMvo+JnZXMbL0531eNNUHm8Yfr9+eAUN180xjljD2+dbfzQOpQWOT8XAm/ZxMz3ON+rEKnm/Wkrai+kTL8ZUjF10efKfB6F4tCa5xeFWtSoheAXN07wqEWOQQF+sWMpA7voUWogWfxYCqDxBSplEDoDrcWQeQM1imjdgZay0AtVpRiaBatewsIE/rl+PXLOHoxQnzjSllq2XHBPnydfRnyevAC6jtDY4UhLkv3pxyXg+r0JceMH2UNnFtCNdc1oWA1VVUsDv0izXyNAEQmzmLH5uwhaU8JRVBjlh9h3ryBglDIY5RcQp7soof81arOr/Qp7/+nNzv1qi1HB3n8C16V3xD/IB1dJ8Hub/PjgZCZGAbikJs4SoMuEBQ2odYKjCGCGFqMCTKYWR/wy+nd9B5xYQRnFvVkWEdqVz7g+BGjp85Hqwox27fOxBAdLdIboVz99DWJaxs3YLrpnjFpSN8qTFKQ0SyIsTGkhb7pN+dzWNPyQhm5xQelBFhdo94ZqvwNCqx9kQbvx9+ImKsRkhW/BJj/JAyeCMouK5zfxLs2i4m7vBjh7mnw8a6/L/Tu6rUtpOn9Pk+cZEoySIG2AdRSnzaPL8kQDCVysWUKWNJAlNeS4O/7RFkbqhg1n5KmB7yf7nJIMl4Bu1lrk6d3U0MgMb7bYsCRvamREnjcnXHhiGQM3MqmMrQBMwjc1PTrnmy06MO2bmhqT+c0aGJ78TQONzP9mDQ4L/WmgEUE/W2BgjjU1MCbNmi0wJtOamhqdbM0WnZB5BVho1jUNMCrxmi00KveaGhyffg0CTz1REiZhs5YDzMOmEYBJxWaNjM/GpqEnSshmLwSWk01Hj0jLZosMycymxgUnZ7NFReRnUxNjU7TZgkOztKmpUYnabJHBudrUzLh0bQbowak1slDVtRZJ+F9JGg6Nvk/DMpbpx3+n2JKr3nKb+XvxmGb3+Y/i6SBtuZdeMDy6bR+1dgNIgtQ+ijdDrZD6ENnSYngJbWYPBPuDor20JwmWJl0Y8qYxjMWeW9f6BuNIJMU2YpIzNr+eKPG0lLgaKKcxvJ6QaHH2AAqJ7GYROiGL3j6oEDvHH5mQr8VSwAwopDG8npDkyy2PkMbwekLq8wE8UjrTK4pZXOBCpditdzFCpoG7N8NxOBH+3Bj43FQ40kfwFuXpjTLM+VNJ1/V0VjF8EMVdasj0uqRjamk1+GuRFdFt3X6fRZ7GD6ZLvnYqFCY55IzWj++u/eAO+9E3Rlga3rVGrAOqQ4nYpY+5bUUN+HKFWBdqywKxOOTl+rAuyJblYd2Rxx05KbI0P1jfGF/kn9rj3ggF0xGARUC7jwik1+B/mVnjYwI2QGX28RsyOVanNIFy7E9rksl5aJLVi1En/ClKLEq6AyV27xv1xi/9+1hlSyNHnpci+yAKP/QLH6tUMsbvPCnu0iz6u87bvRVJeEiXT/8DJGy0L8L/SnLr6w6N+MF90CSf3zZnIrd5c4Znm5eHQ5otnyiFyLZ87Qs2wsri1xcd3Ingvm/1qLbDIFbzmrVE1jtA1l9T8Yq1xKWh2NYXeUWyE9t9vUtjFrv8ypXEh+IhCsR2tYF66X0ryRZJ2H9MjGo1r1lJ5G2WJsULzEq2733JZlhb/vqyd5mfFNva0cMqV/eelWRG4bauAb/No10SJbutH++2zU1jVtm2712rGfrNBPOQpn3RWkLrv+IQ1hleScjXx/t8Wy7eyoJIGZleScyhzO9EOJnWs8Zbz9kbbd+7UjN0b06/fBVBsfaQ5Pb2lZukTiIlCpGt0gTqt60sucyilWXr37ii9CgTW9N3ifZHahrA5r2rNUNzImy7ry6ZMv/02letLZZ/rWl41WpiH9KAfZesfstKEhvHPuvvqHjFWuLKZnLk76v6N60ktdmeMPbS2QteRFg92K/itbN970rNULbHjzl/YtU7+OTJUa/qePW7JlMgUchcYZI7AmafPxNM75pLc/nnUbQ8Lq8mXJtLjk2ksHHve/94j5T0/vGePboaY+PeHeSmMYVu4arZdFGW7IEKtjHFCYudPXpUkunABIo9/j6Qkpx3N6F+I0P9xoyKDeD2pCQhWhPoYsZ+e9QnkrndAEs1om7uuUHF83Y59bg9bm+OFRp9sWcAprnEY4ItlrKY2sMWVrlLEbAJFWrCDJoWd1SojSlOWLKJi3veIpu2uGetb9hQ0kBKEjkyoJaLyaqsWRtTnLBPVKhP3KBnS/nf7FHPrHLAoWDJli6NKWbYzc3x2Tkhcd6Y46VeymLnAGyVyQ4BS7YgYFgOTDwDBCtDdr/TvXgmw9y0xihaVe9wyX8VfiiyT134Eo8/s/if4JBRQ9M5aObNrHXYRPgRWqOmtb2mnK8EHj2Nmsb0mmIoNnsaMWSbP2sxxTN+L6AR05hmFiMPYwVJmpPezvef3kRGpUprMjQkW+aPCThRxo9FcHymjwk4UYaPZXB0Zo8pOE1Gj0VwfAKMCThR4otFcHyOiAk4UW4IJfjxcDv7Q5qk15WlKuvBT34ufs6ydDiz277fRYfaIsfgqJLxU/P4b2komjwIJFJmVvlvcKfB/c29eGTE39QvyZuXoDua4Rcwafw9jUXmJ6MqQVxCi9Gb1lF75g15PoI0yYusDAqij0unVHrNOjInmTWqC3PvHzm/u03zkq+PJJOpe8e9FUVwJ1h/x+EVL/Ab7kQhuU4Y9O1E8bV5xcvom13R59G4H17zAjqH+z+jDFGciocXNvVci/aFL/CNfmXuwKv23pmyOnvN2zKrzx1zywyql4XDy15S889Phyh7XkWx6F71Anr3KwxPq49NSoWr9eTuhd9Bb5a08/doSfnKvXqaCex6jX1NLor1tzZKpavsbjq5629wZN+wSPykeJvu/Yj1Q27eE3bveYFft8s1tdKqqnvdS6yplLrfP661oOze+PXxRVaU43CB/gGaGw+L9lcIL0QiWSzXTKNjM3ob42+5cCUiIEhYaqm3e9ULitWlyeXVXf+n6v7VvnvrSzfBu1Wl08RokZJvRJCh07A6yc67N76k9Olak1n3KktOG9HzZSe/8pVWnwvyp65ZVt2rOGltsuCuuQJprjCm/RtfTvrgbXz/WNRL0ZVaYHjx18ei6F78cg2h9wiyNsPKvsGl661GhxJrQ7yAa2mhMZR7cdY2WG9XrpCuOgjwa1Ec6M4y9NbWOsfwMQqDVjrhOYaZ1f+scwxqfKaV1/wXWO8cg0koz0LLpJbzHINOKdM5BpNMxnMMGpU85xisOy7lOQaNQo4lsvVvSHmOQaOP4xyDiz7Scwx6jSyxQmudfOcYNIr5zzFYf6Nk5xg0UlftvSucYzDI5Fueu2smjPouKWaI+FrrJT3HoBG6+ti00jmGBbnfQW/mOsdgo3zlXs17jkEjmO0cg7PSVXY3vOcYrHs1+TkGjVw2j4n1r8sYz9doXiGeb1SviufPHiD2puvs87teeOK9Rj288V7tT7VSvNdGOnG8FyaZNt5rI5sh3usunTjeu6R7lan5ReK9FspXmqXXjfeada/izHqBeK9ZNVu811U6W5jTrH9l18FLhjnNDfECO0/LWN/HT3SRvtYWw+qMNYwyouYLnrTNrEvzwPIbbDqz6+p4K/Igiw503pyZpFB6A6s61TdT7/XoPpvB3FoR8j+bvWSUEqqY2GSQcj5Kq5mlRRXTOAzJIG/LpC7W5kQ/2GHgHW+ZP/Uv+tyU6aFZh+jMsm+Qh1Lhn0Wexg/odaRRyWb0vmx4H/rD1/4qppIcqwiu37Sy1OOjqwvv7HjaZz9EYRiLRz8btkh1sReA2MHUOp8b6Ue2aikNeuRNb5iqLy18LE31IwYhveGVhHSe1+thEPopSsIowaZBVInrXjYa8b70L+MTPP32f1eOdM7fvWSG+Zv/c361kOb71xtexw896ne8Slp/ZCC9D93nDL8L5xC4pJVuOHQXSDI0LgmkGybdBbINmUuieYdPq4ZQjUlymJB2WFLa/k8dmfRieAcn9Q+0xvhkUEw/RDnJ/IrPAW4hkuoUHUgi6UBsEEk/FjvJZB+ODdLXGZGXmmNY2Y6M3Pp5Ed0OB6/2aVjGdg3QPgoaZjVzxYgflVy5Q5vZQ88JXXuRJ1k2I2OTLWutmye3LTj7+IKcsfn1RMEzSS/IQWaUdhYCzyy9IASZYdpdCDjT9JIQXMZpZyFfC2hNpgUhjeH1hMBTaC8IQabSdhZSrzd4pHSmVxQDzg++JAWXJ9xGyNSvVp0prE66Vcug8J+NgdYh7+5l6wH0Rhnm/Kmka91hSWcdU0urwV8bwllAFQqTHHLGpcSvESmZOvjGCEvDSzdEYwF2GShQN71B9MfctqL+2iAh9Q536tMOOSdFzrmQxx25v0KIc5T1L5va494IUTnHzAJoHWLad7E4wRaU4R1fznJQnqAFOXjvj7Mcco/PgkQeL4+NbGnkyPNSZLOL3UClkjF+50lxl2bR3/UJqq1IwkMaJeiRey5ho30R/leSW18jtLIS3PlJIuJtnO7SstjmIs8rmLw8HNKsEFi/i0q25WtfsBFWFr++6OBOBPd9q0e1HQaxmtesJbLeAbL+mopXrCUuDcU2uPPjWCQ7sW2uqTGLXX7lSuJD8RAFYrvaQL30vpVkiyTsPyZGtZrXrCTyNkuT4gVmJdv3vmQzrC1/fdm7zE+Kbe3oYZWre89KMqNwWx8r3ubRLomS3daPd9sHPy6ZZdu+d61m6DcTzEOa9kVrCa3/ikNYZ3glIdURkW2ZYYNMKikj0yuJOZT5nQgn03rWeOs5e6Pte1dqhu7N6ZevIijWHpLc3r5ykxy68turNIH6bStLLrNoZdn6N64oPcrE1vRdov2Rmgawee9qzZAf0iQX230asn/02letLZZ/rWl41WpiH9KAfZesfstKEhvHPuvvqHjFWuLKZnLk76v6N60ktdmeMPbS2QteRFg92K/itbN970rNUOYii5LblPMnVr2DT54c9fojF9m75Bd8fpvhvXOT3BGwJuhbn6Diom8Dy0H7DoKfR9HyuuwzfhHcvYljNm31C/yY4idaEjbufe8f75GS3j/es0dXY2zcu4PcNKbQLVw1my7Kkj1QwTamOGGxs0ePSjIdmECxx98HUpLz7ibUb2So35hRsQHcnpQkRGsCfcJO+gPqE8ncboClGlE399yg4nmbok+BDbi9OVZo9MWeAZjmEo8Jtngmgy1QSb8tYKHZ9GaoqLReFqBpcUeF2pjihCWbuLjnLbJpi3vW+oYNJQ2kJJEjA2qZk02xjSlO2Ccq1Cdu0LOADLU2xQtLtnRpTDHDbm6Oz84JifPGHC91SQdcMsOSLQgYlgMTzwDBypDd73QvnskwN60xilbVO1zyX4UfiuxTF77E488s/ic4ZNTQdA6aeTNrHTYRfoTWqGltrynnK4FHT6OmMb2mGIrNnkYM2ebPWkzxjN8LaMQ0ppnFyMNYQZLmpLfz/ac3kVGp0poMDcmW+WMCTpTxYxEcn+ljAk6U4WMZHJ3ZYwpOk9FjERyfAGMCTpT4YhEcnyNiAk6UG0IJrkrJXmU9+MnPBTghe/dGtUWOwVElY1ZynkTKzCr/DW5EjUJLfJoqSMsvM2pEVSd0EkpS9MhJLWHREGulNOVDnGTS1V63VUlSex3ecRG1120VEpSrgv+GiNrrtvoIaq+j9GFqrztopKhvDNdJVnvdVjF57XX4NwqtvW4rddXeS1973UUmWc0wAs3wStXOivFVquF6MbXXbYWuPjbx1F53lfsd9Gai2usg5Sv3atLa67aCqWqv45Wusrshrb0O79XY2uu2cqlqr8N/3Yd5FQZOwd3rXmJNxVRz3lU6Xc15N/WqmvOzB2huPCzaXyG8EAl4HWo3HZvR2xh/y6UC3AQJSy31dq96QbG6NLm8uuv/VN2/2ndvfekmeLeqdJoYLVLyjQgydBpWJ9l598aXlD5dazLrXmXJaSN6vuzkV77S6nNB/tQ1y6p7FSetTRbcNVcgzRXGtH/jy0kfvI3vH4t6KbpSCwwv/vpYFN2LX64h9B5B1mZY2Te4dL3V6FBibYgXcC0t1YlW7cVZ22C9XblCuuogwK9FcaA7y9BbW+scw8coDFrphOcYZlb/s84xqPGZVl7zX2C9cwwmoTwLLZNaznMMOqVM5xhMMhnPMWhU8pxjsO64lOcYNAo5lsjWvyHlOQaNPo5zDC76SM8x6DWyxAqtdfKdY9Ao5j/HYP2Nkp1j0EhdtfeucI7BIJNvee6umTDqu6SYIeJrrZf0HING6Opj00rnGBbkfge9mescg43ylXs17zkGjWC2cwzOSlfZ3fCeY7Du1eTnGDRy2Twm1r8uYzxfo3mFeL5RvSqeP3uA2Juus8/veuGJ9xr18MZ7tT/VSvFeG+nE8V6YZNp4r41shnivu3TieO+S7lWm5heJ91ooX2mWXjfea9a9ijPrBeK9ZtVs8V5X6WxhTrP+lV0HLxnmNDfEC+w8LWN9Hz/RRfpaWwyrM9YwyoiaL3jSNrMuzQPLb7DpzK6r463Igyw60HlzZpJC6Q2s6lTfTL3Xo/tsBnNrRcj/bPaSUUqoYmKTQcr5KK1mlhZVTOMwJIO8LZO6WJsT/WCHgXe8Zf7Uv+hzU6aHZh2iM8u+QR5KhX8WeRo/oNeRRiWb0fuy4X3oD1/7q5hKcqwiuH7TylKPj64uvLPjaZ/9NU2HnGJ1mReAzMrIOp8Y6Ye1avkMeuRNb5iq/yx8IE3FIwYhveGVhHTe1uth4PkpSsIowaY+VInrXjYa5b70L+MTPP3ef1eObs5fvGSG+Zv/c36dkOb71xtex/c86ne8SlofZCC9D93nDL8L5xC4pJVuOHQXSDI0LgmkGybdBbINmUuieYdPq4ZQjUlyaJB2WFLa/k8dmfRieAcn9Q+0xvhkUEw/RDnJ/IrP+20hkurkHEgi6UBsEEk/FjvJZB+ODdLXGZGXmmNY2UZJKIb6Fvs0LGOD5vqvQYOpZkYYUbqnTW5oZiZgg33TEDRJkk1goPzIGoPm6WjrliPcCD22yIrumNXZCA1J6OyI65jL2YgLSePsiuuWwdmMC0je7Ij7tXCqaGTEbWyx4jqmmTbiQjJMO+LWszAZcGeNF9ktH7YZGJAKexl36jm61p2XMzuPmhdNH6aZ2dSI14a4hT2rwgoR9Lgy9LVrhp0GsXmOqhGla32xcNvzzYA2vQ1Ij2xbRH+jC8e2A5zBswHLsWA5Idi4g/U3tQC+idb+1ATDqhTldTBhEjgXNObpfAhGfqCrwBHafbtshAbuih2haTa/RiGEe9xlcdJ3m+elyGa3V+31SM+z7COLuzSL/q4Pg2xFEh7SKIGMgXPQjdY2qMXlltTIqR4M7vwkEfE2TndpWWxzkefV+/PycEizQgC2oCpxlm9aVyq/xFWkBXciuO+bM6rdSjSSNJYZpdTLcepfRmGVUUIaim1w58exSHZi29x3oZe0/BY+iaF4iAKx5RwMl17BJ04kYd/jaTVpLPNJuc3SpFhnfLd91cpiVxC5irhd5ifFtt7GU4vSmeYTE4Xb+gzgNo92SZTstn682z74cUkvzvZVjGL7pS/9gKK1zSin/isi/M4WH24Vjd2WGcALrQIeWeNDPpT5nQgnM1/WHGwl7j+2r+IT270s/fJVBMUKA4LbC/mFH7p6tFxC1S/gF1ZmEb84/Ut4BUaZ2Jo+HohPSSPT5lWcYvNDmuRiu09Djo9Ra30FSSyrKYN1TkkPacCxC1Mb5hPSeFCpfxOFVUYJZTOzsPQuvXE+Qc36mbZfzWyuhV+PoVw+GdtX8Yktc5FFyW1K/HOpzJKKkGMAf+Qie5f8Akxp0L1qboUhHtDEqepDBISMbfgraM3CmlrRirrkAX4R3L2JY0oFtU0/Bjb3Ev64v7x/vHcHf/8IvLJnjg7FgBhch7Jpnoa0VtUEOm909oBAap4mRgKMtj0QdPg04QDOKw480AOKJqBvGKBv9ECAYFLPAw0XmXCeANPaAPQEnb0MSIgRaHPPgCOetynkNMYA1VugRoOcaR6wwOeXTUjFMwapcE83uojklLpnAuSeNmQRJy3uEEDN08RImEGbYczGDNkMI/Y3gMN74IH6tw1AZY6ZRJqniZGeEEBPDDhnAQaofpocCTPRNk/TI21ujs/OcVx5Y4GcrURhlfRImImNZlqb7NRgaxKOnfu9eMbAbNrngS2k38zmvwo/FNmnLqoBgpwZ+X42u2o01OZ33mTazXAEGtE0zK05ZuivMP+GhrmxxowMXORrkDGLfmvk4hm0otQgN9bokeWhooDeuO0f/V5u2spAiBu2Q6NQXk+d4MGvpS7iga6jTvDg11CX8SDXT6d44Guni3ig+5sTPPi9zUU80OXHCR780qMST5VBs7qu+JOfC7f8mc1L1EaIhhkV7KwOKBR4ZojlvpdreRgrSETO+SX7jvnlCeXAE8k7aMLmXrbUg0i87CAGWajSTgu8NiW0q7mWo7TTAU3aD/09XItO2qmA1plEqHAuLWmtBFyxDaoGV0DSThdNzUjot+NUJtJOEHd/IyoGaS8GV7cArcyxQJ6jLmA9PKgq58KOdnLWGBkIyze6iXqZ/ocp0gjQx98P8aUY7WShqi9i9XCtuPE1FqH9EFRW0U4UqpIi9Jd6mKdUJZbVvWGl9QRlaUg3gchqkC4aVQUgZw+Az6IumuRxw0bCsfSbC+1m9ALa32Wpsh0sdZSlqs76upIQJTnd1GGrcJIIdSu8CRAIjhchhbmX1wSIA1bURAsEFNF0VMe1qGIrlemuj299RV8Q00kdlzuNqeylkzZUpUukwMF99P6xqBdbfDqHd319LIruXavKRdXydBLL7/nhrtjpJHcdZ8NSiTHVXo9aKeuuz7Lw6K9FcUBFT3sDjJHTWVVVKOzM0PcYOVVD0q065q3JGjk1ySFbZJg0EUdOdXroIqcmMbSRU40WssipdVdDRk41OoiWeta/BzJyqlFBFDl1UYGNnOqVUMVHrNWQRk41ulgip9bfDiZyqhHE3d94IqcGMaSLSXdluKjVki6aiJW1KmzkVCNnjZGBL3K6IOpl+h9h5NRGH38/JI+camRRRk6d9XCtuMkjp9b9kCJyqhFFuYe2/qVoY4saZTyxRaNGVWxx9gDeh6kzybIZJ4tXGanJ41XaZueLV9kIxMerYMLQ8SobcTTxKneB+HjVkjquqWyteJWFPr5ZjT1eZVbH5cRYJ15l1kYZr3IVSBnAMavk34CuHMAxy11nz2MZ3/j4CRXdaB+nWZlQO6JHbKTu57bJdNdSqdpz01lip30r8iCLDqj9/Qw8lIxSa1D15XqXgerOgwXGaF1bGDpKcawTMzTA4y3OpywtKrfwIfrc5KcGz3Y6SxwbGkPpTBrezegV2fAKSAfXtrApAS6XrNo4vyBFD8P2K+6csCRguDqIk5Yy5tymwUVVQLTDpSx/qJJAXvtQK2taxvd35YdqU7pXepJ+TP9zfqcB/PXpbbE5qlD1VRd4yQqtGtqYeJhZUoQactxlQIefJRmoochdBuWwtCSNfIiykqsaEWRfPXpQUJr7vscFPTL50KBubKbRwaCLZIBwEvMVlDjQQgriSAZICHawM0ghGe+cxHAMeQaBbKPekuhhhVYWUTz8evs0LGODsvqvQaPX6OXn46qrQfZ8GOI1t2VSF/5bImifg42jjWQTTxUHvCnGg6gjWG+Ai/CmqUMK5WsfJ6cTCez3bJ/j4oH/nlMDXITQ31N+nJxuJxKR+YX4LR3H5WzhpKfZ2D796/pnMFr1MBsZrMtJT5OzReMqNM5s0tPkbAc/y8W1H8fVA3Wy0NyZUGGDhnMyZf5YrwMSP3abO7fdY4ST6G2UhPLBIsvGGmB6E4i2GlpE81EUn8ovcRTcRLt/ied/Zum+qZ0lnYR3JjeapVHzP69fNVuvf/zvqweR1eP0P14d/3Dyw9Wr169uIxGH+at//NUIff0qSPf75upRmAZl/T//p/2zP0UVd6v+uPnrH49evf7r6PXp6Q+nFxevvdenlz+cn53/z/+8/quzUv9F/R86Y8N/qS14r17/dfz6/OiH8xNPetCbPehJDx6/ev3Xyeuzox+ujs+kB49nDx5LD57oHjyZPXgiPXj66vVfp6/PLn44O5Y1ns4ePJUePHv1+q8z1YNnswfPpAfPX73+6/z16fEPx6cX0oPnswfPpQcvXr3+6+L1yeUP5yfH0oMXswcvpAcvX73+6/L1+fEP56fSc5ez5y6l565evf7r6vXZ8Q+nnvwzXs0evJJ//6o7eEeKV3rzruNN+k7VIzxP9VpP0X3k/uNVvcI7Vj4870Ke3Ie8qmd4J8qH593Ik/uRV/UO71Qled6TPLkreVUH8c6UL573Jk/uTl7VSbzz12enP3hncofy5j3Kk7uUV3UU7+L16cUPp2eX8sPzXuXJ3cqreot3+fr0av6dz7uWJ/ctr+ox3pWqvea9y5O713HVY45V3et43r2O5e51XI9NnurZee86noxOVX85PlY9qxif5M51XHWX4xPVs/O+dSz3reOquxyr+tbxvG8dy33ruOotx2evz89+8Caj+PG8bx3Lfeu46i3H56pR7njet47lvnVc9Zbji9dnJz8cn04envetY7lvHVe95fhS1auP533rWO5bx1V3Ob56fXb5w9WkVx/PO9ex3LlOqv5ycqR6+GTeu07k3nVSdZgTT9XaJ/PudSJ3r5N69jtWPjzvXyeTCbCeAU+qafvycoKtmAPlDnZS9ZmT0+pLPjqV55aTeQ87kXvYSdVnTs5en1XYV/LD8x52Ivewk6rPnJwruvbJvIOdyB3spOoyJxeqZ+f960TuXydVjzm5VK4Y5v3rRO5fJ1WPOVHOjCfz/nUi96/TqsecHimXHPP+dSr3r9Oqx5x6qm/qdN6/TuX+dVr1mNPj12feD+enMvbpvH+dyv3rtOoxpyfKh+f963SyyKpXWafVUvL0coKtWGfJ/eu06jGnZ9VPdTwZCk7n/etU7l+nVZc5PVfNUafzDnYqd7DTqs+cXrw+O//h+OJEfnjew07lHnZa9ZnTS+XvPO9hp3IPO636zKlqdjydd7BTuYOdHekWmGfz/nUm96+zqsecKTvn2bx/ncn966zqMWeeqrnO5v3rTO5fZye61e3ZvHudyd3rrOowZ8evT89/uLqUf+Szefc6m6zj64W8smOfKZbycveqylv9dXaqGrLP5t3rTO5eZxfa2fVs3r3O5O51dqn9pM7m3etM7l5nV9pP6mzev87k/nWu7V/n8/51Lvevc0/3K5/Pu9e53L3Oj7W/8vm8e53L3eu86jFnymXQ+bx/ncv96/xUt7s8n3evc7l7ndfd61z54nn3Op9sFevupVxCnSt2i3L3Oq86zJlyCXU+717ncvc6rzrM2ZUSe969zuXudV51mPMjZYPNu9e53L0u6u7lqbAv5v3rQu5fF552M3Qx72AXcge7qLrMuXL9dTHvYBdyB7s40fbOi3kHu5A72EXVZ85PVB/zxbyHXcg97OJMuya4mPewC7mHXdTeCNXW4mLewS4m/oiqy5wrv6kLhUtC7mAXl9o+cjHvYBdyB7uoO9i5asl5Me9gF3IHuzzS/lKX8w52KXewy6rLnKvWnJfz/nUp96/Lun8pHTHz7nUpd6/LqsOcqxYEl/PedSn3rstT7T79ct67LuXedVn1l4sj1aR+Oe9dl3Lvuqw6zIVqs305712Xcu+6vNB5ny7nnety4vCqusuFaqN+qfB5yX3rsuotF6qN+uW8a13KXeuq6iwXp0qX2bxrXcld66qeG88UL76ad60ruWtdVb3l4lz54nnfupL71lW99LpQPjzvXFdy57o61brrruad60ruXFd157pUPjzvXFdy57qqO5faPznvXVdy77qqOszlkfLhefe6krvXVe1Q9V6fej9cyePe1bx7XU18qldaD+WVwq069ase6V2URyrX6sS3elR1m0u1f/RI4V09mrhXj6qec6l5v8LBejTxsB5VnefyVDXqN/82fX7iZD061XtKjxR+1qOJo/Wo6kKXmucVrtajia/16Fy7cG7+bfr8xN16VHc75Xfa/Nv0+YnH9ajuecpPtfm36fMTp+tR1Z8ulR9c82/T5yf9r/bVXyq/OU/l2p/59qv+dKX87Dyld3/S/2qP/ZVqQvFU/v2pg7/x8Kvd3SoX/9THX/vtr9Sfj8rNP/Xz1677K/Xno/L0T139tff+Sjm/eCpn/9TbXzvwr1RTjKdy90/9/bUL/0rde1Ue/6nLv3bjK8dNT+X0n3j9vdqTr9w8egq/vzdx/Hu1M//qQvntKnz/3sT579UO/atLlWPYU/j/vUkAwKud+ldKr7SniAF4kyCAVzv2vSOlZ9pTBAK8SSTAq5373pGnNqDofpNogFc7+L2jY7UBRf+bRAS82snvHZ2oDSh64CQq4NWOfu/oVG1A0QUnkQGvdvZ7R2dqA4pOOIkOeCdNaPNcaUARIPAmEQKvdvp7RxdqA4p+OIkSeLXj3ztSd0RFoMCbRAq82vnvHal7oiJY4E2iBd5Js+ZT90RFwMCbRAy8OgjgeeqeqAgaeJOogVdHAjxP3RMVkQNvEjrw6nCA56l7oiJ84E3iB14dEvA8dU9UhBC8SQzBq8MCnqfuiYowgjeJI3h1aMDz1D1REUrwJrEE77SJtKt7oiKc4E3iCV4dIvA8dU9UhBS8SUzBq8MEnqfuiYqwgjeJK3h1qMA7VvdERWjBm8QWvDpc4B2re6IivOBN4gteHTLwjtU9URFi8CYxBq8OG3jH6p6oCDN4kziDV4cOvGN1T1SEGrxJrME7bbYk6p6oiDd4k4CDVwcRvGN1T1QEHbxJ1MGrAwne8YXyyJAi8OBNIg/eWXPuQxnP8xTBB28SffDqiIJXxYznYQBPEYHwJiEIr44qeFXcWGVA0RMnYQivjix4J57agOoYyKQn1tEF7+RYFU/wFNEIbxKO8OoIg3dyojag6ImTkIRXRxm8E+VxKk8RlfAmYQmvjjR4J8pjVZ4iMuFNQhPeebM/VnoGPUV4wpvEJ7w65uCdXCgJFDEKbxKk8Oq4g3eijPt5ijiFNwlUeOfNKaQrtQFFT5wEK7zz5iSSuicqAhbeJGLh1UEIr/IoqwgUPXEStfDqQIR3qu6JisCFN4lceHUwwjtV90RF8MKbRC+8OiDhnap7oiKA4U0iGF4dlPBO1T1REcTwJlEMrw5MeKfK6J6nCGR4k0iG14QyTtU9URHM8CbRDK8OUHjqCLSnCGj8f87udkmO40jz/b3oM21Ohcf73MG5hrVjNCzQErGCCC4ISqMdm3tf6/DIRPWTf89pnW+wDtL7pbwyo/IX7p5ENNJCilQ4EwE1kqhG6v60Bjk5AWwkkY3U/WAcZyLgRhLdSEssXmu/MQBkohBHWmqRKmciKEcS5khLLvhcTgLoSCIdaeFFqnx3B+xIoh1pAUaqfHcH8EgiHmmkmxsTqEcS9kiLMlLl7QHQRxL7SCPf3FvBP5IASBp3l0QwkCQIkoYnIm+VwUGSQEganoiEPwksJAmGpFhDEnBIEg9JY8SHaoFEkphIGvFT6wQsksRF0rx5bg0ykoRG0uKO4Lkv6EgSHklLPIIHfwAkSYQkLfRIlS+FgCRJlCQ5k7THT238W9UNKkBJEilJCz+YiBNYSRIsSdOPCSd8/AVekgRM0jKQ1NBNE5hJEjRJC0LS669QL5SYAE6SyElyOmmFA9CpYT02vLKw4U3dgE9M+MQefryAjisa8IkJn9jikNQ6vYoGfmLiJ7Y8JLVBr6IBoJgAijmgtPn6Kj5mkgBwmlgExZaIpFcQhpO5QCgmhGKPFueRgaGYGIo9/Mw6nhAxQBQTRLGFIqkbB4DTxaIotlQkddwUGDCKCaPYYhHeFBgwigmjmNdI8FvJwFFMHMW8TuJVquFPAJJiIim2JaVyAEhEoRTzegl+MxtYiomlmBdNdDzrY4ApJphiXjjRcYNtoCkmmmK7eAI32AaeYuIp5gUUfdK5awNQMQEV8yKKgRtsA1IxLaRYRpIGlkNQLYUWUywj4buSUT3FpaBi5eErSEORABZVSB5ajm9rRpUVWlrhqhJckqm8QusrXFWCSzKVWGiNhd1dEKnMQussXFVeVf56Rseo1EJrLezmzmxUbqH1FnZzZzYquRBVMVeVUWh7ZKAqJqpiriqjcgDIRFEVc1UZjQNAJoqqmKtKcGcFVTFRFXNVCe6soComqmKuKqPzrwCZKKpiripjcADIRFEVyzd7RANVMVEVc1UJ7u2gKiaqYq4qwb0dVMVEVazc3JoBVUxQxcrdrRlQxQRVrNzdmgFVTFDFyt2tGVDFBFWs3N2aAVVMUMXK3a0ZUMUEVcxRZUxMREAVE1QxR5XXgyZwXwFUMUEVc1R5PWlCPwEkoqCKOapMPE1sgComqGKOKjPjTwCoYoIq5qgS7C4AVUxQxRxVZiGVMUAVE1SxZSRcGWZgKiamYm4qs/7U82V3AqRiQirmpBJckoFUTEjFnFSCSzKQigmpWL27IAKpmJCK1bsLIpCKCalYvbsgAqmYkIq1mwsiiIqJqFi7uyCCqJiIirW7CyKIiomoWLu7IIKomIiKtbsLIoiKiahYu7sggqiYiIq5qATvZRAVE1ExF5XJ2xsQFRNRsQUkwU4fQMUEVMxBJdioA6iYgIo5qARvJQAVE1AxB5XZ8YoMoGICKuagEmQygIoJqJiDSpBHAComoGIOKpM/cQKomICK9bsrIoCKCahYjyuSDDzFxFOsx0VJBpxiwinW/b5MhRAGnGLCKbZ0xB7YOwA0xURTbHjrAfzADJhiginm9SNY9mJgKSaWYl5DwrcDoBQTSrElI/ZAEDOgFBNKsSUj9uBnX0ApJpRiS0bsgd0MQFJMJMVcUrCaxUBSTCTFFo1wQYsBpZhQinltCZ7BNaAUE0oxry/BQ7QGlGJCKeY1JngE3IBSTCjFvMwEj4AbUIoJpZiXmiBFGVCKCaXYkhGuvDCQFBNJsQUjeIjYwFFMHMWmpx+dgTZwFBNHscUiXEFhwCgmjGJeeIISZqAoJopiXnuCFRQGiGKCKLZMhCsgDAzFxFDyIhGuYMhAKFkIJXsFCqZvBkLJQijZK1AwfTMIShZByV6Bwr0bAFCyAEpeHsIVDBn8JIuf5O0nJJEZ+CQLn+SlIVyCkEFPsuhJXhjCJQgZ8CQLnuRlIVyCkMFOsthJfvgNGM/FZLCTLHaS3U64VwnYSRY7yYtC7IHbwAx2ksVO8qIQ4/PXGewki53k5PdgLK7OYCdZ7CQvCuGmFhnoJAud5CUh9tqfi34ASEKhk7wkJOieAnKSRU7ygpCggQrASRY4yctBuIdKBjfJ4iZ5MQiXTGdgkyxskheDcCeVDGyShU3yYhBuppKBTbKwSV4Kws0fMqhJFjXJC0G4jC0DmmRBk2w3CQhmksVM8iIQbqySgUyykEleAsIn2zKISRYxyQtAsIVFBi/J4iV58Qcfa8vAJVm4JC/94EYpGbQka4eqHBZCZWpRpT2qFn1wAXymLlXapmrJB3dMydSo6tKpal3/EnfJwmZVkn537aqoX5U2rMp+/TNsWUU9q7Rp1XIPS/ghKFPjKu1cleMEpN5V2rxqqUeQAJB/2r5qmYclbFuTqYOVIEle6MGt3TIgSRYkycs8uLtbBiPJYiR5kQc3eMtAJFmIJC/xCHq8gZBkEZK8wCNotgZAkgVI8vKOqN8a5J/4SC53+Qc+ksVH8uKO6B0APpLFR/LijqDpG/BIFh7JxVOQPoZl0JEsOpIXdljCxnGAI1lwJFdvA4nN48BGsthIXtRhaeBbCGwki43k6hdB3gQCjmTBkVzLzTYUdCSLjuSFHWa8CwQdyaIjeWGHGV/HQUey6EjeOoKXAcCRLDiSl3WYccdEwJEsOJKXdZhlAKYMNpLFRvKyDi6IzmAjWWwkL+rAZxkZZCSLjOQFHXwbABfJ4iJ5MQcXRGdgkSwskpdyGPYlzaAiWVQku4rgk7wMKJIFRfIyDn4Sl8FEsphIXsTBT+IykEgWEsmLOPhJXAYSyUIieQkHP4nLICJZRCQv4OAncRlAJAuI5OUb/CQug4dk8ZC8eIOzFzQki4bkhRv8JC0DhmTBkLxsg5+kZbCQLBaSF23wk7QMFJKFQvKiDX6SloFCslBI7nEvkAwUkoVCco97gWSgkCwUknvcCyQDhWShkDziXiAZKCQLheQR9wLJQCFZKCSP+Ex/BgrJQiF5yUbwJA0kJIuE5AUbwZM0gJAsEJIXbARP0gBCskBIHn77xS0UQEgWCMleUsL5BxCSBULyCLsgZXCQLA6Sl2sEe2hwkCwOkmf8IRgYJAuD5Bl3A8nAIFkYJE/vBY4bUGCQLAySF2uY4QYUGCQLg+TpN18qKMrgIFkcJLuDGEFqBgfJ4iB5uYZlgtQMDpLFQfJyDcsEqRkcJIuD5OUalqnHWwYHyeIgebmGZerzlsFBsjhIWa5hmTY/BRykiIOU5RqW6d1bwEGKOEhZrmEZn6MXgJAiEFIe3pCeErAAhBSBkLJgwzIlYAEIKQIhZcGGZexxDBBSBELKgg0rlIAFIKQIhJQFG4+f8uuYk/mTlfRTefxbzeUnK7b/KUGh5bPoSFnagZNPCuBIERwpyzqw0WwBGilCI8VpBP93kJEiMlIWdPAsFHCRIi5SFnNgbVUBFSmiImUhBz4SK2AiRUykLOPA20EBEilCIiXFn0UKiEgRESleTILJDCBSBETKAg6caFHAQ4p4SFm+gUMtCnBIEQ4paUZzLQpoSBENKT6Og66kBTCkCIYUn8iBF1KwkCIWUnwoR8n0EKAAhhTBkOKTObCNbQEMKYIhxadz8IUYMKQIhhSf0IEPUwtgSBEMKT6kAx+mFsCQIhhSfE4HPkwtoCFFNKQs3eCHqQU0pIiGlKUbPDOjgIYU0ZDiAzvwIVABDinCIcVnduBGtACHFOGQ4mM78GFuAQ4pwiElx6ekC2hIEQ0priG0ES2AIUUwpPj4DtwGAIUUoZCSYwouICFFJKTkmIILUEgRCik5puACFlLEQkqOKbgAhRSd5lFiCi40z0MHepSYgguN9NCZHiWm4EJTPXSsR4kpuNBgj8tkj5iCC872kPQrMQUXGu+h8z1KTMGFJnzoiA+f8YE3bprxoUM+lmvwroWmfOiYj8UaLMmFJn0Ig5TFGizJBRikCIOUGs5jKKAgRRSk1HgkQwEEKYIgZZkGS3IBAyliIMUHf6BjFiCQIgRSnED41g0CUkRAygKN4M0HAFIEQMoCjWi0DWSfAEipcfYBfxThj7I4I3j1IflEP0qLG+kX0I8i+lEWZ/BMjgL8UYQ/yvIM/rgD/FGEP4qPBMHJHAX4owh/lMUZfBS+AH8U4Y/ik0F43wb8UYQ/ig8HQUAswB9F+KMszuCj6AX4owh/FK8IwaPoBfijCH+UXRHC/z+kn/BH8UEhvO8D/ijCH6XHx2AK8EcR/ijdP3gUwMMC/lHEP8ryDCuc/wAgRQCk9JsPHgAgRQCk+OAQvnoBgBQBkNL9CQy/g0BAighI6TeXPxCQIgJSenz5AwApAiClx8ewCgBIEQApXgtSUGAKCEgRASkjvvsCgBQBkDI8AfEEQAEBKSIgZcQzawoISBEBKSMeW1NAQIoISBnx5JoCAlJEQIoLyOvmDZ63AYEUIZCySAOn3xQQkCICUhZp8ACcAgRShEDKiOckFSCQIgRSlmnwGJwCBlLEQMq8uQKCgRQxkOIGUvEESQEEKYIgxRGk8md/UJAiClK8rRbXeRdgkCIMUrytFl5CQEGKKEjxGST4DgYEKYIgZaEGThMqYCBFDKQs08CBQgUIpAiBlEUaOFOogIAUEZDq3bTwkWkFAakiIHWJBhdiVRCQKgJSF2jgcKEK/lHFP+ryDHzuUIE/qvBHXZyBI4Yq6EcV/ahLM3DKUAX8qIIf9REffamAH1Xwoy63wFlDFZijCnPU5RZ8cqaCc1Rxjrrggk/OVICOKtBRfb44tjOsIB1VpKOmuAauAnVUoY6a4hq4CtZRxTpqimvgKmBHFeyoKayBq4AdVbCjOnbgyYcK2FEFO6pjB558qKAdVbSjLr7gkz8VuKMKd9TlF3zyp4J3VPGO6nNI8ORPBfCoAh7Vu2bhyZ8K4lFFPOoiDD45VIE8qpBH9fIPHt8J4lFFPOoSDD55VEE8qohHXYLBJ48qiEcV8ahLMPjkUQXxqCIedQkGnzyqIB5VxKMuweCTRxXEo4p41CUYOIWoAnhUAY/q3bLw4FIF8KgCHnUBBh9cqgAeVcCjLsDgg0sVwKMKeNQFGHxwqQJ4VAGP6vUfFT+5VxCPKuJRF2HwhGMQjyriURdhBKOGIftEPKoXf1Q6NFxBPKqIR12CwXOEKohHFfGoSzB4jlAF8agiHtVbZPEcoQrkUYU8qg8e4TlCFcyjinlU75HFc4QqoEcV9KjeI4vnCFVQjyrqUb1HFs8RqsAeVdijeo8sniNUwT2quEf1Hlk8R6gCfFSBj+o9sniOUAX5qCIf1XtkcQFBBfuoYh/Ve2TxHKEK+lFFP6r3yOI5QhX4o+qkc++RxXOEKk0713Hn3iOL5whVmniuI8+9RxbPEao09VzHnvvgEZ4jVGn0uc4+9yZZPEeo0vjzy/xzH8bEmYgj0CUTvUsWzxGqNAZd56B7HQjPEao0Cl1noXuXLJ4jVGkcus5D9y5ZPEeo0kh0sZDqg0d4jlAFDKmCIdXbZPEcoQoaUkVDqrfJ4jlCFTykiodUb5PFc4QqgEgVEKneJovnCFUQkSoiUr0ghOcIVSCRKiRSm9+a6ZF8BRKpQiJ1EYdV/FwMJFKFROoiDqt0FqMCiVQhkbqIwyo9EKpAIlVIpHqPLB6UUMFEqphI7TezHiqgSBUUqd4ji4cQVVCRKipSvUcWDyGqoCJVVKR6jyweQlSBRaqwSPUeWTyEqIKLVHGR6kNHeAhRBRep4iLVh47wEKIKMFIFRqp3yeIhRBVopAqNVJ86wkOIKthIFRupPnWEJ25UsJEqNlJ96ggPIaqgI1V0pHp5CA8hqqAjVXSk+tQRHkJUgUeq8EjdU0c4E8FHqvhI9akjPISoApBUAZLqvbJ4CFEFIKkCJHX4ICbORCCSKkRSffAIn8+pYCRVjKT65BEeQlQBSaogSfXRI3zGpoKSVFGSumePcCYCk1RhkurDR3gIUQUmqcIkdU8f4UwEJqnCJHXG9eoVlKSKktTp4294awBOUsVJqk8f4SFEFaSkipRUnz4S3JjASqpYSfXpIzyEqIKWVNGS6tNHgnsreEkVL2mPm0tiAzBpAibNp4/wEKIGYtJETJrXjNQB26MGZNKETNrjpsV5AzRpgibNa0Zwf9VATZqoSfOaEdxfNWCTJmzSvGYE91cN2KQJm7SH7w8n/gGvSdjETZpPHon+gNckbAInzbtnBX/Aaw42gZO2ICT4AwKcNIGT5s2z+A8IcNIETprPHeE5Sg3kpImcNJ87wnOUGtBJEzppKT6z0MBOmthJczvhPrYN8KQJnrR0M+6hgZ400ZPmY0e4DW0DPmnCJ83HjnAb2gZ+0sRPmo8d4TlKDQClCaA0rxhpD3ofAaA0AZRmKR4X0UBQmghK23NHcFxEA0JpQijN547wuIgGhtLEUJrdDGJqgChNEKXZzSCmBorSRFGazx3hcRENGKUJo7Q9dwTHRTRwlCaO0vbcEX4rgKQ0kZS2JQXPIDaglCaU0nzuCHdHb2ApTSyl3RSPNLCUJpbS8k1P6QaY0gRTmo8d4e7oDTClCaa0PXYEu6M34JQmnNJ87EhwOQFQaQIqzceOcHf0BqLSRFSajx3hcRENSKUJqTQfO8LHiBqYShNTaW4qPC6igak0MZXmpsLjIhqYShNTaW4qPC6igak0MZW2545gi/kGptLEVJqbCo+LaGAqTUyleVctLIRqQCpNSKU5qXB39Aak0oRUmpNKcE0GUmlCKm0JCR8JbyAqTUSlLSDhI+ENQKUJqLQ9dISOdDXwlCae0ryrFnZHb8ApTTileVct7I7eQFOaaEpbOMIHIhtgShNMactG+Eh6A0tpYilt99TCT+oNLKWJpTQvKOHu6A0spYmlNO+p1fBEZANLaWIpbdEIFkU0kJQmktIWjOATqwaO0sRRWo1PtDZglCaM0ppvDPkyCIzShFHaUpEgA0BRmihKa2ERewNDaWIorYVF7A0EpYmgtBYWsTfwkyZ+0lrcWr8BnzThk9bi1voN+KQJn7QWt9ZvwCdN+KS1uLV+Az5pwietxa31G/BJEz5pPW6t30BPmuhJ6/GxwgZ40gRPWo+PFTawkyZ20np8rLABnTShk9bDY4UN4KQJnLQet9Zv4CZN3KT1uLV+AzZpwiatx631G6hJEzVpPW6t3wBNmqBJ63Fr/QZm0sRM2ohb6zcgkyZk0kbcWr+BmDQRkzbi1voNwKQJmLQRt9Zv4CVNvKSNuLV+Ay5pwiVtxK31G2hJEy1pI26t3wBLmmBJG3Fr/QZW0sRK2ohb6zegkiZU0sZNa/0GVNKEStr0uy+dbGsgJU2kpLmUBPtnkJImUtK8oAQLchpASRMoaV5P0vAKBE7SxEmaN9VqWNHWAEqaQEnzrlqt418QUlCcpLmTBB9EwUmaOElzJwk+R4KTNHGS5n21XotK4FMcOEkTJ2neWKvhM3JgkiZM0r2xFle1dWCSLkzSvbNWp4eLHZSki5J0VxIsLOmgJF2UpHtjrW74/a9J2AVJuiNJp3dhByTpgiR9oQc/4e6AJF2QpPuAdp7J3EFJuihJ9wHt/Ii8A5N0YZK+mQRnMndgki5M0n1AO89k7uAkXZyku5NwZWEHKOkCJd2hpKOYdpCSLlLSfcoIPkroACVdoKT7kBF8lNDBSbo4Sff57DwtrwOUdIGSvqEEn2x2gJIuUNI3lOBzxQ5Q0gVKuk8ZwcY8HZyki5N076rVafxoBybpwiTd22r1hv8/JKEoSXcl6fiAvgOTdGGS7p21OhUIdlCSLkrSvbVWp0t5ByTpgiTdO2sNvBKDkXQxku6dtUbC/x9SUIikbyLBR5odiKQLkfQlHvxEsoOQdBGSbjcZCEDSBUj68o5gVlEHIOkCJN1m3CS+A5B0AZKeH/Gsog5A0gVIek43SQxC0kVI+gIPbjDUAUi6AEnf00awSLkDkHQBku79tbDDVQcf6eIj3Rts4ceiDjzShUf60g7ucNVBR7roSF/YwVX2HXCkC45077CFHa462EgXG+neYQub/HSgkS400r3DFrap6CAjXWSke4ctrJbrACNdYKSXmwQEF+niIt07bGGHqw4s0oVFunfYQtXowCJdWKSXsMS9A4p0QZG+jIOPz3UwkS4m0t1EsMtGBxPpYiK9hLNuOpBIFxLp3mELibkDiXQhke4dtjh7gUS6kEjfg0bwgX4HE+liIr3G7QU7mEgXE+l70AiOeumAIl1QpDuK8LCZDijSBUV6jRMQSKQLifQa9ljoACJdQKQv4bCBH8dARLqISPchI9GvDxkoJtLrzbSlDijSBUV6i6ctdTCRLibSWzxtqYOJdDGR3uJpSx1QpAuK9KUc3CC0g4p0UZHe4tOrHVikC4v0Fk9b6sAiXVikt5tpSx1cpIuL9HYzbakDjHSBkd7iaUsdYKQLjPQWT1vqACNdYKT3eNpSBxjpAiO9x9OWOsBIFxjp3mpr4CMRgJEuMNL7zcHVDjLSRUZ6jw+udqCRLjTSe3xwtQONdKGR3uODqx1opAuN9O4XQTww18FGuthIX9YRbILBRrrYSPe569zsrAOOdMGRvrAj2EUDjnTBkb6wI9jFAo50wZG+sCPYxQKOdMGRvrAj2MUCjnTBke5z17nZWgcd6aIj3Ztt8TYWdKSLjvSlHXwXBxzpgiN9YUfQLK2DjnTRkT7ifSDgSBcc6Y4jfOKzA450wZE+bzaCgCNdcKRPvwvj0yCwkS420pd1BO9AsJEuNtLnTbvBDjjSBUf6so7gHQA20sVG+ozbDXawkS420mecgCAjXWSkL+jg/AEX6eIi3V2ET8t2cJEuLtLdRYInwgAjXWBkbBjBK8AAGBkCI2NBB7eLGwAjQ2BkOIzwW3iAjAyRkeEywkMTB9DIEBoZTiM8NHGAjQyxkeEFJPw8bACODMGR4RUkPDRxAI4MwZHhJSQ8NHEAjgzBkbFxhHbzA2xkiI0MLyHhoYkDbGSIjQy3ERzYMIBGhtDISCk8ZTRARobIyPDmW8jkA2RkiIyMJR18SmiAjAyRkeGTRvhdADAyBEbGcg4+JTTARYa4yFjMwaeEBrDIEBYZ3n0Lj1kMYJEhLDK8+xadEhqgIkNUZHjzLTxlMUBFhqjIWMjBp3wGoMgQFBnefAtP+QxAkSEoMhZy8CmfASgyBEXGTfOtASgyBEXGTfOtASgyBEXGTfOtASYyxETGTfOtASYyxETGTfOtASYyxESGF43gKZ8BJDKERMYSDj7lM0BEhojI8O5bnH8AIkNAZHj3Lb58gYcM8ZCxfIMHzw3wkCEeMtxDcPDcAA4ZwiFj8QYPnhvAIUM4ZPjwdRw8N4BDhnDI8PZbOHhuAIcM4ZCxeIMHzw3gkCEcMhZv8OC5ARwyhEOGD1/HwXMDOGQIhwyfvY6D5wZwyBAOGT57HQfPDeCQIRwyfPY6D54b4CFDPGQs3+DBcwM8ZIiHjOUbPHhugIcM8ZCxgIMHzw0AkSEgMnz4Og6eGwAiQ0BkLOA4B8+ln3L/t57mTzbG/qeEhJwUIxkLPXDs3AAjGWIkY5kH1gwMIJIhRDIWefD/DkIyREjGAg8sORjgI0N8ZNTwxP4AHhnCI6OGJ/YH4MgQHBk1PLE/gEaG0Mjw3lu8FwYbGWIjw1tvYSqDjQyxkeE2gpkMNDKERsamEfzfIe0ERsaevo7/O6SdsMhwFsHrKKjIEBUZriJ4GQUUGYIiw1GEx84NUJEhKjJaDsfODVCRISoyWjz9YYCKDFGR4cUiqEoDVGSIigxXEVSlASgyBEWGowiq0gATGWIiw00EVWmAiQwxkbGMg8fODTCRISYylnHw2LkBJjLEREaPK4cHmMgQExk9duEBJjLERMYiDjalASQyhETGIg4cOzdARIaIyFjCwZsAAJEhIDIWcPDT0AEgMgRExvIN5oQBHjLEQ8byDT6UM8BDhnjIWLzBh3IGcMgQDhmLN5gzBnDIEA4ZziH4MHcAhwzhkOEcgg9zB3DIEA4ZziF4KGcAhwzhkLF0gzVjgIYM0ZDhGoKHcgZoyBANGYs3+FDOAA4ZwiFj6QaOnRuAIUMwZIxw8s0ADBmCIWPZBp/pGWAhQyxkuIXgmZ4BFjLEQsYMB98MoJAhFDIWbfCZngEUMoRCxpINppwBEjJEQsaSDR47N0BChkjI2FUi+OcHCRkiIWPRRvDmAwoZQiFjxnOXBljIEAsZM84+kJAhEjIWbASvPiSfOMhcrMGv/gQGmcIg0+tDBp1qnsAgUxhkPuKT+RMUZIqCTFeQ1ydg1zvvBAWZoiBzoQZfuyYgyBQEmcs0eO7eBAOZYiBzkQZ+3psgIFMEZC7Q4Ll7EwBkCoDMBRrcZGECgEwBkLk8g5ssTPCPKf4xl2fw3L0J/jHFP+byDK6Rn+AfU/xjLs/gEvcJ/jHFP+ZuocX/P6Sf+Mf0Dlq48Z3gH1P8Yy7PCN6/4B9T/GMuz+D6pgn+McU/ZorPQ0/wjyn+Mb0sZFJVwgQAmQIgc4EG1jhO8I8p/jGXZ/DQsQn+McU/pt2kH/jHFP+YyzNYkSf4xxT/mMszgpcf/GOKf0wvCnmtcLxC/AQAmQIg06tCuMZygoBMEZDpA9d57NkEAplCINMnrvPYswkGMsVApt30K5qAIFMQZC7UwDv4BAOZYiBzmQbewScQyBQCmYs0cOzZBAGZIiBziQaOPZsAIFMAZC7QwLFnE/xjin9M75eFj+wm+McU/5g+fQSbZEzwjyn+MZdnYHXqBP6Ywh/Tp4/Q594J+jFFP+bSDBx7NgE/puDHXJiBY88m2McU+5jLMpj+J9jHFPuYyzJw7NkE+phCH3NJBp8cmCAfU+RjLsngkwMT5GOKfEwfOoJjzybIxxT5mCU+eTBBPqbIxyzxyYMJ8jFFPmaJTx5MYI4pzDFLePJgAnNMYY7p3bFQfic4xxTnmD5tBOV3AnRMgY655IJPPkyQjinSMRdd8MmHCdQxhTrmsgs++TDBOqZYx/RJI3jyYQJ2TMGOufCCT05MwI4p2DF92jp+bJ2gHVO0Yy6+4JMXE7hjCnfM5Rd88mKCd0zxjrkAg09eTACPKeAxl2DwyYsJ4jFFPOYiDD55MYE8ppDHXIKBY88mgMcU8Jg+XwQPbkwAjyngMRdg8MGNCeAxBTzmAgw+uDEBPKaAx1yAwQc3JoDHFPCYGzyoiGECeEwBj+nDRSY+dpogHlPEY3oVyOSPDkAeU8hjehnIpCPME8hjCnlMLwOZeIZ2gnlMMY/pdSA8OW4CekxBj9lD7Z1gHlPMY/ZQeyeYxxTzmAsxePLbBPSYgh5zIQZPfpuAHlPQY/pcEZ78NkE9pqjH9LkiPPltAntMYY/pc0V48tsE95jiHtPnivDktwnwMQU+ps8V4clvE+RjinxMnyvCk98m0McU+pg+V4Qnv02wjyn2MX2uCE9+m4AfU/BjeqMsPgU9QT+m6Mf0uSI8+W0Cf0zhj+lzRXjy2wQAmQIg0+eK8OS3CQQyhUCmzxXhyW8TDGSKgUyfK8KT3yYgyBQEmd4tiye/TWCQKQwyfa4IT36b4CBTHGT6XBGe/DYBQqZAyPTx6zz5bYKETJGQ6YNFePLbBAqZQiHTG2bx5LcJFjLFQqY3zOLJbxMwZAqGTB8swpPfJnDIFA6ZPliEJ79NAJEpIJIePlmER7/t1bchnr94xEjx9Le9eomRNIbFA+D26iWGaYwcz4Dbq5cYWWOUeFTLXr3EKBqjxgNn9uolRtUYLR6GtlcvMZrG6PE8tL16idE1xohHou3VS4yhMWY8FW2vXmJonvrYdh6Mtlc1RtI89eoRno22Vy8xNE99CgmPR9urlxiap64oPCFtr15iaJ56jy2eCLRXLzE0T73NFs9J26uXGJqn3mmLR6Xt1UsMzVOfSsLT0vbqJYbmqQ8m4YFpe/USQ/PUZ5PwzLS9eomheerz3Xls2l7VGKZ56iNKeHLaXr3E0Dz1KSV8ymSvXmJonvqgEp6ftlcvMTRPfVYJnxfZq5cYmqeuLjxFba9eYmie+sQSHqS2Vy8xNE99aAnPUturlxiap0tT+OjeXryE0DT1ySU8UW2vXmJomvrwEh6qtlc1RtY0zenuNgca8/zFI4bFo9X26iWGpqmPMYlu2eAyz188YtxeTsFmnr94xKjxjLW9eomhaerzTHjI1V69xNA09SqVibN19uolhqapV6pMHIuyVy8xNE+XwOQHztvaq5cYmqdLYfi5817UEEXTdElMfuB8lb16iaFpujQmPxCO9+olhqZp8VY2OGVlr15iaJr6mJMH9uLYq5cYmqZLZvKDWlPuxUsIzdKFM/mB53D26iWGZukCmsz9CffqJYZmqU+R594se/USQ7PUC1geNNhwL15CaJJ6EcuDToXtRQ1RNUm91Ree7NiLlxCao9XCBtZ78RJCU3SpTU5U1LEXLyE0Q73jF5d47dVLDM1Qn4TCrbT36iWGpugehoK9qPfqJYamqJe4cDvpvXqJoSm6ICcnOvGzFy8hNEN9wDwPR9qrlxiaoj5jnsfu7VWN0TRHfcz8xLl1e/USQ5N0wQ4fwNqLlxCapG5B3CJ6r15iaJb6uHmeHrdXLzE0S33iPHc53quXGJqlPjWFGx3v1UsMzdLW417He/USQ7O0jXj81V69xNA0bfPuYgxG9PzFHWOpD5/P3IsaomuWLvfhI5p78RJCk9TLY1Jwtwcrev7iEcMvpVjjtVcvMTRLvXMYntfZi5cQmqQ+kJ4bsu/VSwxNUp9JH73hAI+ev3jE6HFb9r16iaFJ6n3EuBniXr3E0CTtXrmFjrlXLzE0ScdNg/e9qjGGZum46fG+Vy8xNE1HfJh8L15CaJaOuNP7XryE0CRdQJRTcLMGUnr+4hHjpt/7Xr3E0CwdNy3f9+olhmbpkqL82msQX1nK0qFZurCIa+v24iWEJunwJA32LgBMz1/cMZYY8VHbvaghpuaoIxOfFN2rlxiaoz6VBdvI78VLCM3R6VdSPDS/Vy8xNEl9iD23XtqrlxiapIuPMndf2quXGJqkS5D4APNevITQHJ03DUH36iWG5qi7Eze336uXGJqkS5Iy94Laq5cYkqTp4XWwfJNMhE9J8SktScpWaIOdyJ6S2lN62M29OpE9JbWntCe34L06ET0lpafk9BTcqxPRU1J6Sk5Pwb06ET0lpafk9BTcqxPRU1J6So9+c69ORE9J6Sk9xs29OhE9JaWn5B3Lgnt1InpKSk/Jm5YF9+pE9JSUntKe6cIvLclTUnlKPtWF79WJ4CkpPKWUb+7VieApKTwlh6fgXp0InpLCU9rzXfhenQieksJTWooU3asTwVNSeEo3U1724iWEJmkaN/fqRO6U1J2SV/XwvToROyVlp+TsFNyrE7FTUnZKNyNf9uIlhOao2c29OpE6JVWntAgpulcnUqek6pSs3NyrE6lTUnVKFtea7cVLCM1Rr/YJ7tWJ0CkpOiVHp+BenQidkqJTcnQK7tWJ1CmpOiWbd/dqUqek6pSy3++xke5e1RiqTsmHwvBR1r16iaFp6n3Q+DTrXr3E0DTNnqb8NCyROiVVp+TjYQwPte7VSwxNUx8RY/j8OhE6JUWntAQpGz6/TmROSc0pLUDKmcY17cVLCE3S7DKKT0oTiVNScUouTpnmNezFSwhN0cVHOdNJ672oIRSckoNT5h0peVNSb0ruTRmNJhE3JeWm5K3S+MD0Xr3E0Px0bsp0aHsvXkJoero25ejHoPxUbkq33JSIm5JyU7rlpkTclJSbkrdKC0whETcl5aZU5o0pJPKmpN6UvJgoAIFE4JQUnFL1D/dUyrgXLyE0SR2cHqhFicApKTglHzDz4E9NBE5JwSktPeKa5L14CaE56kNmsCp+L15CaIo6Nz34eEkibkrKTan6NZTdPhE3JeWm5Nz0erTsWiK6Vy8xNEUXHmVsUrgXLyE0Q5cd5cKvK2lTUm1Ki45yoXLRvXgJoQnavM0VlYzuxUsITVCfP1MY3BNhU1JsSnsGTfCaEDYlxaa059Dwa0LWlNSa0oKj8DWhDFVqSq3fvSaUoCpNyVuvRa8J5adCU/LuayXYRRI0JYWm5B3YXhvi0yWUpCmpNCXvwlaCT6BETUmpKe1ObMEthagpKTUlp6bCZ3USUVNSakr9NkfJmpJaU/K2bJXP+ySypqTWlLw3W/hzUJaqNSUfWPPgY3qJrCmpNaXut/rgAyRZU1JrSj1sjbrXLhE0S71TG/8e5ExJnSmNuGPHXryE0BR1ZuKmLXv1EkNTdKlRdIclZ0rqTGmhEZ9fSKRMSZUpLTLCAr69domg2bnACGv49tolguamj7J54DmfRMCUFJiSly9hE4m9eAmhmbm0iPtI7MVLCE3NGbdT2IsaQn0peSc3rKnei5cQmpsLi7grwl68hNDUXFbEjQ324iWEpuaiIu5tsBcvITQ3lxRxe4O9eAmhybmkCDsc7LVLBE1Op6UHniBLJEtJZSktJuI+BXvxEkKTcykRtyrYi5cQkpz2uDk1asRKpqxkC4m44cBevIRIGsLCngF78RLCNEQO2wbsxUuIrCFK2DlgL15CFA1Rw+YBe/ESomqIFvYP2IuXEE1D9LAHwF68hOgaYoRtAPbiJcTQEDPsBLAXLyE0OxcOcTOAvaghlJPMOenBpyyNPMnUkyzZDaAYgZIpKJmDUsVndkaeZOpJlkrc0nCvXmJogqYaO44RJ5lykm1O4o24ESeZcpKlHo9c36uXGJqi3iGO66v36iWG5ujSoWDw+l69xNAkXTrETXL3ooZQTzL3JJ6evlcvMTRJHZSwV/NevITQHHVPCq5exEmmnGTLhrhj8168hNAUXTbEnQP34iWEpuiiIe7bvBcvITRDlwxx6+a9eAmhCbpgiBvI7sVLCM3P5ULcjGcvXkJoeua79CRIMoUkWyrErVD34iWEZudCoaDGzoiRTBnJcthVZK9dImhyLhEKCuyMDMnUkGyJEPdk3ouXEJqcOf5oZERIpoRkC4QCbzUiJFNCsgVC3Jx5L15CaG76iB2eub5XLzE0Od2QgtsRGZKpIZlP2gnk2AiRTBHJfNoOz57eq5cYmp7lJj3JkEwNyUrY92avXSJodvrQneAskREhmRKS+eAdPn9jJEimgmSLg4LzN0aAZApI5oCEDSf24iWE5ucuVwpCUHoqH5mXK3EJqpEemeqR1XST4aRHpnpk9TY7iY9M+cicj6J3CfmRqR/Z0iCeZbEXLyE0Qb1eCUek78VLCM1P9yOckr4XLyE0P52PKlctGPGRKR/ZnspD7VX34iWEJqjrUeUyRyM+MuUjcz6qrC5GfmTqR+bVSkHDCCNAMgUkc0CqLA1GgmQqSOazenh8+l69xNAcdUGqrBVGgmQqSOYze6LPWURIpoRkTki148c9IiRTQjLvZMeDgPfqJYZmqXez43nKe/USQ9PUG9oFhzqNEMkUkWyJUPBw3ciQTA3Jdlu74FUhQzI1JOtxV+29eAmhSdrjxtp78RJCc9SLlXhA8169xNAc7TWe0bxXLzE0R3u7+wBNgmQqSOaCFBxBNBIkU0EyF6TgCKKRIJkKknnLO2y3vxcvITRHvVgpOPpnhEimiGSLhHLFI2ZGiGSKSOaIFOU5IZIpItnwh014TM0IkUwRyZYJ8fzpvXgJoTnqtUrML0aMZMpI5owUPAAkRzJ1JFsqFNiJkSOZOpItFQrsxMiRTB3J3JGCZ8vkSKaOZO5IwdMZciRTR7KlQoGdGDmSqSPZUiG2EyNGMmUkWygUwIcRI5kyki0UCuDDiJFMGcmckQL4IEYyZSRzRgrggxzJ1JFsxs2S9+IlhCbnjPsl78VLCE3OGbdM3ouXEJKc+RF3Td6LEiKrI+VH3Dh5L15CJA1hMXxkcqSsjpSXCgXwkcmRsjpSXioUwEcmR8rqSHmpUAAfmRwpqyPlpUI8wXovXkI0DdHDIdZ78RKia4gRzrHei5cQQ0PMcJT1XryE0Oz0uiScZr0XNYQ6UnZHwoHWe/ESQrPTy5JwpvVevITQ7FwmxGOt9+IlhGanKxJOtt6LlxCanYuEeLj1XryE0OxcIhQ1P8mESFkRKTsi4XTLvXgJoenphoRTrvfiJYSmpxMSDrrei5cQmp72CGdd70UNoYKUFwc9Xh9Uld5/ym1dRm10DUaJqpSUnZIaWmUmSspKSdkpqWF9QSZKykpJecFQ0OEiEyVlpaS8YCjo0pOJkrJSUl4wlBtWOWSipKyUlBcM5YZVDpkoKSslZRs3h6YzWVJWS8peltSwUiKTJWW1pOxVSQ2rHDJZUlZLyjndPKDJhElZMSnneA+ayZKyWlL2RnjGWppJk7JqUvZGeK/PqMFQMnFSVk7KXpLUuBFeJk/K6kl58VD0gTGTKGUVpexFSY19LhMpZSWl7I3wgudVmUwpqyllL0tq+ME1EyllJaXspNSxvioTKWUlpeykFFSvZCKlrKSUvS6p8zWURCmrKGVvgxfkKJFSVlLKXpYUbMvJlLKaUvaypM6PRTKZUlZTyuXG4zOZUlZTyuXG4zOZUlZTyuXG4zOZUlZTykuIAkzPZEpZTSkvIWInzERKWUkpewe86I1GppTVlPICIrbGTKKUVZTy4qFAkDOBUlZQyt4BL6jwyiRKWUUpV09Pvj+TKGUVpbx8KMxwIqWspJSdlDrbRSZSykpK2SuSOt+giZSyklJePmSDGSYTKWUlpeyk1PkmT6KUVZSyVyQFVy4CpayglJcORZcM8qSsnpQXDkXvd+KkrJyUlw0Fb1bCpKyYlB2TojcrYVJWTMotPjGSyZKyWlJeMBS9WYmSslJS9nKkjqKVSZKySlL2cqSOT8czQVJWSMpejdR5g0CQlBWSshcjRW93gqSskJS9GGnwJoMgKSsk5cVCwSaWHCmrI+Ve7jax5EhZHSl7JdLgbQoxUlZGyl6IFO0diZGyMlJeJpRH9JpQgiojZW96N/hOQIqUVZGy1yFFf1BKUFWkvEgo2nERImVFpLxIKLr0ESJlRaS8RCjaLZEhZTWkPO6unmRIWQ0pLxGKdktkSFkNKd9UImUipKyElBcIhRdgMqSshpTdkPgCTISUlZDyuDlvl4mQshJSXiBk/JmEBCmrIOXlQVxmlwmQsgJSXhwURaDMVD/Ki4O4UC+TH2X1o7w0iMvbMvFRVj7K8+auTnqUVY/ysqAgIQiPsuJR9pFKjKOZ8CgrHmUfqsQPHsmOstpRnv5YiSNQUiod5emHQDkCJaXKUXk4u1OEQnBUFI7Kwx/NcwRIyqJuVJYCsXUXYqOibFS8qV3hnj+F3KioG5WlQHngc8JCblTUjcrDb+f4EaKQGxV1o7IUKA/c/hdyo6JuVLyl3cCtYiE3KupGxTvaDdwqFnKjom5UHn4z52LvQnBUFI5K8rs57vMKwVFROCqLgTIyXCE3KupGxcuPJo9lKARHReGoePkRUkkhNyrqRiWVeG9UyI2KulHx4iPeGxVyo6JuVBYCBfUlhdioKBuVhUBBfUkhNirKRmUhULBDK8RGRdmoLAQKdmiF2KgoGxUvPOIdWiE2KspGZdFPUF9SCIuKYlFZ9BNs8gphUVEsKot+gvqSQlhUFIuK1x3xZ5BCWFQUi4rXHeHttJAVFbWisuSH9xWFqKgoFZUFP0GFSiEqKkpFZblPUKFSSIqKSlFZ7sO7m0JQVBSKymKf4JRkISgqCkVlqU+wYy7kREWdqHjRUfBOJygqCkXFe9dNdMxCTlTUicpCH55XUkiJiipRcSXCmdZ78RJCU9Mb1wVXbzKiokZU3IiCqzcRUVEiKvnuuklCVFSISr67bpIQFRWiUu6umyRERYWoLO6JLnoEREWBqCzuCS4W5ENFfags7QnepsRDRXmoLOyJ3mPEQ0V5qHjJUZDepENFdah4xdHkcoxCPFSUh0rpN11dC/lQUR8qu2kdHmsp5ENFfah4z7rKx6ELAVFRICrLe6zycehCRFSUiEq9a0hfiIiKElGpNwlKRFSUiEq9SVASoqJCVLxlHW9byYeK+lCpfgg58/2QgKgoEJUa9wspxENFeags64ke1RbioaI8VBb2ROcNCvlQUR8qC3saHncqpENFdags62m8SyIcKopDxcuN+MlHIRwqikNlUU/QlacQDhXFobKoh5vQF7KhojZUFvUEt0OyoaI2VBb0dH70QTJUVIaKyxA/+iAZKipDZTlPcMK+kAwVlaGynKfzZZNgqCgMlcU8wRn9QjBUFIbKYp7gjH4hGCoKQ2Upz+uwewxBiakuVJbyBMf8C7lQURcqi3mCY/6FYKgoDJWlPMEx/0IuVNSFylKe4JJHLFSUhYrPQuKD1IVUqKgKFR+FxAepC6FQURQq/abLUiEUKopCpd90WSqEQkVRqIybLkuFUKgoCpVFPImLDQqhUFEUKot4gnqFQihUFIWKo1DwvIBQqCgKlUU8QclDIRQqikJlGU9Q8lBIhYqqUFnEE5Q8FEKhoihUlvEEJQ+FVKioCpVlPEHJQyEVKqpCZSHP5PsYqVBRFSoLeYKiiUIsVJSFylKeoGiikAsVdaGymCcomigEQ0VhqCznCYomCslQURkqC3qsskMXsqGiNlRmTJaFbKioDZUZn/coRENFaajMHh98LmRDRW2ouA0FJ/QL6VBRHSoLe5Jx46xCPlTUh+rinmjrXEmIqgpRXeATbZ0rGVFVI6peWxTMzq6kRFWVqC7yieaAV1KiqkpUffZR5qPglZioKhNVn32UuaNEJSeq6kTVZx9lptxKUFQViqo3qsuMuZWkqKoU1eU+UfeCSlRUlYrqcp+Ue/BzQJ5WpaK64CdlfgRdyYqqWlFN3omBZ5pX0qKqWlQX/UTz2StpUVUtqgt/0uuTU/w5KE/Vi6pPPypBnhIYVQWj6tOPSpCnJEZVxagu/0klyFMio6pkVBcApRLkKZlRVTOqS4BS4etpJTSqikZ1EVAqQZ6SGlVVo+rzjwIqqcRGVdmoLgRKJchTcqOqblSXAqXAOirBUVU4qouBUg3ylOSoqhzV5UCpBnlKdFSVjuqSoFSDPCU8qopH1QuNJp8grsRHVfmo+gSkGr0ulKfqR9UnIE08QlDJj6r6UfVKo4lHCCoBUlVAqouDoqKWSoJUVZDqnn/EUyIqEVJVQqp7/hEfIqhkSFUNqbohPbjbeyVEqopIdZlQ8AmykiJVVaTqivTgYwSVGKkqI1VnpAc/qq/kSFUdqbojPbjtUSVIevriEWMl6SN4s5AkVZWkmufNoPdKlFSVkqoXG0086VKJkqpSUi3pbn9LllTVkuqioXB/S5pUVZOqVxsFpWiVPKmqJ9Vy16G2EihVBaXq9UbBceJKolRVlKqPQYre+SRKVUWp+hikiSfNK4FSVVCqZdwc3KkkSlVFqZZ5Myu+kihVFaW6eKg88BRTJVCqCkrVa46Y+Sp5UlVPqt7GjnmtEihVBaW6fCj4WFtJlKqKUvWao+BjbSVTqmpK1WuOols1mVJVU6rexq7xpK5KqlRVleoiohJd0UmVqqpSXURUHogQlVCpKirVZUQluqATK1VlpepFR0EBQCVYqgpLdTFRiW4KJEtVZakuJ0ozuPoQLVWlpbqkKHzLEi5VxaXaborfK+lSVV2qC4sqd+GsxEtVeal6F7sU3O4JmKoCU/VJSMHI6ErCVFWYqrexY62rRExViakuMIpGRlcypqrGVJcYRSOjKyFTVWSqjkzByOhKylRVmapXHwVtXisxU1Vmqj4KKRgZXcmZqjpT9UZ2wcjoStBUFZqqN7ILugtWoqaq1FT7TcvaStRUlZpqv2lZW4maqlJT9fqjYGR0JWuqak11t7HjkdGVsKkqNtXxuBkZXUmbqmpT9T52wcSDStxUlZvqsLjzbSVuqspN1fvYBaMGKnlTVW+qS4+Cno+VvKmqN1VvZBecpqkETlXBqXoZEo+MrgROVcGpDr+Scs/HSuJUVZzq8qNoZHQlcqpKTnUJUjQyuhI6VUWnOm8OiFZCp6roVOdd4+9K6lRVneq0m5HRldipKjvVhUjRyOhK7lTVnepCpGhkdCV3qupOdTFSNDK6kjxVlac6283I6Er2VNWeqs9GCkZGV8KnqvhUp6cpj4yuhE9V8alOT1PufVsJn6riU3s8bmbyNsKnpvjUliRFM3kb4VNTfGpLkqKZvI3wqSk+NS9RCrqaNMKnpvjUHncdGxrhU1N8ao5PwUzeRvjUFJ+a4xPP5G1kT03tqXlzO57J24iemtJT8+Z2PJO3kTw1lae2GClojNwInprCU1uKFEwMbOROTd2p7SFJ/Ay8kTs1dafmVUrBTN5G7tTUnZpXKQUzLRu5U1N3al6nxM3UGrFTU3Zqe0gSv66kTk3VqfmQJJ7/2gidmqJTW4IUzH9tZE5NzaktQIpm8jYyp6bm1BYgxa8JpaiaU7PHzWtC5NSUnJqlm9eExKmpODVvaxe8JgROTcGpeVu74DUhb2rqTc3KzUzeRt7U1Jua97ULZvI28qam3tTcm4KZvI28qak3Ne9sF8zkbeRNTb2puTcFM3kbgVNTcGp2m6MkTk3FqXlvu2AmbyNxaipOzZvbRT8HiVNTcWouTsFM3kbi1FScWs43M3kbiVNTcWrLj7jUvxE4NQWntvSI3b0RNzXlprbsKLo7kjY11aa26CiaydtIm5pqU1t0FN1hCZuaYlNbcsTU1IiamlJTK3HfsEbS1FSa2mIjPlbWyJmaOlPzOUk8k7cRMzVlprbMKDj930iZmipT8zlJfPq/ETI1Raa2xCg49d7ImJoaU1tgFJxZb0RMTYmpLTAKzqw3IqamxNSWFwUHzhsJU1NhaouLggPnjYCpKTC1xUXBgfNGwNQUmNriIj5w3siXmvpSc1/imbyNfKmpL7V605q+kS819aVWb1rTN+KlprzU6k1r+ka61FSXWr1pTd8Il5riUqs3rekb2VJTW2r1pjV9I1tqakut3rSmb0RLTWmptZvW9I1kqakstXbTmr4RLDWFpdZuWtM3cqWmrtTaTWv6RqzUlJVau2lN34iVmrJSazet6RuxUlNWaq3dzORtxEpNWak1t088ptRIlZqqUmtOn3hMqZEqNVWl1pw+8fxHI1RqikrNO9oFj9oboVJTVGq3s5EaoVJTVGr95nF9I1Nqakqt3z2ub2RKTU2pLSAqD2z80oiUmpJSWz5UHnhyo5EoNRWltnyoJDwx0UiUmopSWz4UlIg3EqWmotT6uPH9RqLUVJRan7HvNwKlpqDUlg6VhD0CG3lSU09q4+buTprUVJPasJtjUo04qSkntZFvjkk14qSmnNQWDkXHpBp5UlNPauPuiFMjT2rqSW14hmJjikae1NSTmhcwBS8KJahqUhvj9kWhBFVNamPeviiUoapJzRvbRS8KcVJTTmre2i56UYiTmnJS8+Z2CRt1NNKkpprUXJOC/viNNKmpJjUfj8QvLFlSU0tqC4bCF5YsqaklNe9wF72wZElNLal5HVP4wlKSqiU1t6TwhaUkVUtq3uYuaCLZyJKaWlJ/+GUU27t1oqSulNSXC5WEm55OktRVkrpLUtAVrZMkdZWkvlioJNw4dYKkrpDUHZICcegESV0hqS8VKgk3X50cqasj9cfdQdFOkNQVkvrD+4mh7HeCpK6Q1L3bXfCm7yRJXSWpLxfiN30nSOoKST3dVdp1kqSuktTTXaVdJ0nqKknd5yQFb7ZOktRVkvpioehMYidJ6ipJfblQSbiP7CRJXSWp+6SkKM2JkrpSUveWd4Z70U6U1JWSure8M9zBdaKkrpTUd8s73G90kqSuktRdkqIsJ0nqKknde94Z3mE7SVJXSeoW70U7QVJXSOp2txftJEldJanb3V60EyV1paRud3vRTpTUlZK63e1FO1FSV0rqdtdiuRMldaWkbp6ifHckSeoqSd0lKThD3EmSukpSXyxUjO+wBEldIak7JAXJQY7U1ZG6OxI/surESF0Zqeeb+QmdFKmrIvVFQkGrtU6I1BWR+jKhoNVaJ0XqqkjdFYk/R3dipK6M1HPcl7GTInVVpO6KFGU4KVJXRerLhJhfOiFSV0TqjkjRC0LJqYrUvfddcEa+kyN1daTuze+Mt38ESV0hqe/pSNGPQempktSXCwUHOztJUldJ6l6vlJAMOklSV0nq3v8uYX/fTpLUVZK6VytVPmXfiZK6UlJfMGQJO6V1oqSulNS9WqkGWyaypK6W1Ivf4qPXlVJUManXx01BfydN6qpJvfqUOT5k0cmTunpSd0/iruCdPKmrJ/V6g52dPKmrJ/WlQ4FUdvKkrp7Ulw4FUtnJk7p6Ul86FEhlJ0/q6kl96VAglZ08qasn9aVDgVR28qSuntTdk1hyOnlSV0/q7km8fyRO6spJfeFQwIydOKkrJ/WFQwEzduKkrpzUFw4FzNiJk7pyUl84FDBjJ07qykl94VDAjJ04qSsn9WVDATN20qSumtSXDQXM2EmTumpSXzYUMGMnTeqqSX3ZUMCMnTSpqyb1ftPMqRMmdcWk3m+aOXWypK6W1PtNM6dOltTVknq/aebUiZK6UlL38qQxXnefrb7u/zpOxe3ESl1ZqTsrGcpUJ1bqykp9IRE/KCJU6opKfRFRkGNkSl1NqS8g4graTqLUVZS61yhxm8ROotRVlLqXKAUpRqLUVZS698MLUoxIqSspdSclvr8TKHUFpe6gFFz/yJO6elJfOJQani3rxEldOal7eVLwnidN6qpJ3TXJ+FEXaVJXTeoLh14r1+ijHnFSV07qy4ZK5uKkTpzUlZP68P7gfPSxEyd15aTunBQcr+3ESV05qTsnBcdrO3FSV07q026O13bypK6e1L0pHn/CIU3qqkl94dAM7tDESV05qc+4m2gnTOqKSf2mJV4nSupKSX250OxYu9tJkrpKUl8sNLn4pRMkdYWkvlRoziAEZac60vCGeI8HxhgESUMhaXhDvEcKYkB2DpWk4Q3xXp9tYwzIzqGSNLwh3uthZ4wB+TmUkoY3xHtwBfEgShpKScNrkh41iAEpOtSShtckvZ5qwhiQpEMtaXhDvAc/0R2ESUMxaXhDvAen6SBMGopJwxviPThPB3HSUE4azkkpyFPipKGcNJyTUpCnxElDOWl4Q7wU5Clx0lBOGt4QLwV5Spw0lJOGN8RLQZ6SJw31pOEN8VKQp+RJQz1peEO8FOQpgdJQUBreEC8FeUqiNFSUhjfES0GeEikNJaXhDfFSkKdESkNJaXhDPAvylExpqCkNb4hnQZ6SKg1VpbFVKchTUqWhqjS2KgV5Sqo0VJWGN8SzIE9JlYaq0vCGeBbkKanSUFUa5udHgjwlVRqqSsMb4gUNaAex0lBWGnZ3yGkQKw1lpWF3h5wGudJQVxr5cdOAdhAsDYWlkdNNA9pBsjRUlka2mwa0g2hpKC2NnG8a0A6ypaG2NHK5aUA7CJeG4tLI9aYB7SBdGqpLI7eb59WDfGmoL43cbxrQDvKlob408rhpQDtImIYK0/CeeEED2kHENJSYRnncNKAdRExDiWl4U7ygAe0gYxpqTMOb4gUNaAcZ01BjGl6tFDSgHYRMQ5FplHLTgHaQMg1VplHqTQPaQcw0lJlGaTcNaAcx01BmGj5mKWhAO8iZhjrTKOOmAe0gZxrqTMO74gUNaAc501BnGu5MQQPaQc401JmGz1kKGtAOcqahzjSq3TSgHQRNQ6FpODQFDWgHSdNQaRrLjXL+qZR/G0NvtyRNQ6Vp+LClGmwdiJqGUtNYcJRqsHUgaxpqTcPHLUW3OcKmodg0fNxSDbYfpE1DtWnUeXfLJm4ayk2j3V5OCZyGgtPwkUs12K6TOA0Vp+EFTBWfXg8Sp6HiNLyACR8kDQKnoeA0WomfPQ8Cp6HgNFqNnz0PAqeh4DRai589DwKnoeA0Wo+fHA8Cp6HgNBYfBY99B4HTUHAa3hQv6Bc9SJyGitNYflQyn7oaRE5DyWncNsUbZE5DzWksQUpt4AO+Qeg0FJ1Gv+vcOEidhqrTWG6UXsuT4Yn+IGoaSk1jwVFq3B5rkDUNtabh85c6V60P4qah3DR8AFO3IAalqYLTcHDqwa2JyGkoOY0+b25NRE5DyWnsrnjcWW+QOQ01p+Hm9HoYg/4chE5D0Wk4OvUaxKA0VXYazk5Bh79B7jTUnYa7U2d4GgRPQ+FpbHgKdoMkT0PlaQxP02A3SPQ0lJ7G6Ddd3AbZ01B7GtueuAPbIHsaak/DS5lGsKMkexpqT2P65ZQ7sA2yp6H2NBYklcwd2AbZ01B7Gl7KlLlr2SB7GmpPY1FSQIKD8GkoPo1FSVHb1kH6NFSfhhczBW1bB/nTUH8aXswU3aFIoIYK1FieFN6hiKCGEtRYoBTeGcighhrU8KlMwUjUQQg1FKGmFzNlbkg3CaGmItR0hAouyZMQaipCTUeo4FI4CaGmItR0hAouH5MQaipCTUeoYJjAJISailDTEarhUdJJBjXVoObjLk0nGdRUg5qPuzSdZFBTDWq6QQUbqUkGNdWgphtUsJGaZFBTDWq6QQVvl0kGNdWgphtUsJGaZFBTDWq6QQUbqUkGNdWgphtUsJGaZFBTDWqmm8/4kwhqKkFNJ6joXUsENZWgphNUsJGaRFBTCWo6QQUbqUkENZWgphNUdPUggppKUNMJKthITSKoqQQ1naCCjdQkgppKUNMJKthITSKoqQQ17a4d7iSCmkpQ0wkq2ARNIqipBDWdoAY2+5skUFMFai5OCvYekwBqKkBNB6hg7zEJoKYC1HSACvYekwBqKkBNB6jook4ANRWgpgNUdFEngJoKUDPfXkwJoKYC1HSACvYekwBqKkBNB6joCkQANRWgZr77CDUJoKYC1HSACmZFTAKoqQA1HaCiGyUB1FSAmkuTglkRk/xpqj/NhUnBrIhJ/DSVn2YeN30LJ/HTVH6ay5KixkCT+GkqP81d4YQNTybp01R9ml7g9NrKlja3pE9T9WkW//zEzdon6dNUfZqLkkrhkwmT9GmqPs3iFXhY+jsJn6bi0yw1LnCfZE9T7WkuSOIDgJPkaao8Te+VhwcAJ7nTVHeaC5GCA4CT2GkqO81lSPELQvmp7DR9GFPh56WT2GkqO81lSMGRzEnqNFWd5iKk4BUhc5pqTnMBUvCKkDhNFae5/Ch6RUicporTXHxkhudbJ4HTVHCaS4/CPyYlp3rTrHEnnUnaNFWb5qKjaGNO2DQVm+aSo+j1oNRUaprLjaLXg6RpqjRNn8FUsD5/EjRNhabppU34ghIzTWWmecNMk5hpKjNNZyYskpikTFOVaboyMVRNUqapyjRdmRiqJinTVGWarkwMVZOUaaoyTVcmLJKYhExTkWluZAp+CEpMNaa5By/x9oSIaSoxTScm1rJJwjRVmObiolKwRcEkYJoKTLPfPBGd5EtTfWl6g7ygSGKSL031pemlTEGRxCRfmupLs7ebIolJvjTVl2bvN0USk3xpqi9NH7sUFElM8qWpvjSXFnGRxCRemspLc1lRdBMhXZqqS/OmR94kW5pqS3NBUXAHIFmaKktzMVF0ByBYmgpLcylRUCQxyZWmutJcSBQUSUxipamsNJ2VgiKJSaw0lZWms1JQJDGJlaay0vQOeUGRxCRWmspK01kpKJKYxEpTWWlOLxrhkzmTWGkqK83pRSN8MmcSK01lpekDl4IiiUmsNJWV5vSiET7NMsmVprrSdFcKiiQmudJUV5ruSkGRxCRXmupK010pKJKY5EpTXWm6KwVFEpNcaaorTXeloEhikitNdaXprhQUSUxypSmuZA8vbuIiib36NsbzF48YXjSCebpXLzGSxvCiEczTvXqJYRrDi0YwT/fqJUbWGH7gCfN0r15iFI3he1HM0716iVE1hm9GMU/36iVG0xh+GB/zdK9eYnSN4YfxMU/36iXG0Bh+GB/zdK9eYmie7l55QZ4CLD1/8YjhRSNBngIsPX/xiOFFI0GeAiw9f/GI4UUjuAvbq5cYmqde3MRFEnv1EkPz1GWJiyT26iWG5qnLEp+43KuXGJqn6eb06F69xNA8dVniIom9eomheeqyxEUSe/USQ/PUZYmLJPaqxjDNU5clLpLYq5cYmqcuS1wksVcvMTRPXZa4SGKvXmJonroscZHEXr3E0Dz14iYuktirlxiap25LfKp3r15iaJ66LXGRxF69xNA8dVviIom9eomheeq2xEUSe/USQ/PUbYmLJPaqxsiap25LXCSxVy8xNE/dlrhIYq9eYmieui1xkcRevcTQPHVb4iKJvXqJoXnqtsRFEnv1EkPz1IubuEhir15iaJ56cRMXSezVSwzNUy9u4iKJvXqJoXnqxU1cJLFXLzE0T5cV8XPavaghiqap1zZxkcRevcTQNPXaJi6S2KuXGJqmXtsU3eZAl56/eMRYacpFEnv1EkPT1Gubols2+NLzF48Yt5dTEKbnLx4xPE2D7ToY0/MXjxiepvT0ei9eQmiWLjDCp9d77RJBc9QLm/DZ817UEFVz1Oua8NnzXryE0BT1siZ89rwXLyE0Q2vcXmcvXkJogtYSPvbdi5cQmp+7qCm4jIIxPX/xiNHiIom9eomh+elFTXwMZK9eYmh+elETHwPZq5cYmqBe1MRHFvbqJYamqBc18dm+vaoxmuaoFzXxcZS9eomhSbqnMuHZvr16iaFZ2nJ8tm+vXmJomjo48dm+vXqJoXm6ACm6NQE5PX/xCNHikzV79RJD09TNic/27dVLDE3TXdqEZ/v26iWGpqmzE5/w2auXGJqmu5sewtNe1Rhd03TDU7AbBHl6/uIRw+KzfXv1EkPTtN+cct6rlxiaptuesEhir15iaJp6bROfD9yrlxiapz6eiYsk9uolhuapz2fiIom9eomheeoDmrhIYq9eYmieLkpiEtyLlxCapl7bxAcV96rGGJqmXtvEBxX36iWGpqnXNkV3KBCo5y8eMfLdHQoI6vmLR4xyd2cAg3r+4hGjxgcV9+olhqapd9XjIom9eomhaeoIFV2SAaGev3jEuDnmvFcvMTRNHaGiywcg1PMXdwxHKC6S2KsaY2qeOkJhkcRevITQNJ23aQoG9fzFI8ZtmoJBPX/xiFHuNlJgUM9fPGLUu40UGNTzF48Y7e7tAgb1/MUjRr/bSIFBPX/xiDHuNlJgUM9fPGLMu40UGNTzFz1Getx8xk9EUEkJKt2VNu3VS4ykMexmI5WIoJISVNqlTbyRSkRQSQkq7dImvnokIqikBJWcoIKNVCKCSkpQyQkq2EglIqikBJWcoIKNVCKCSkpQyQkquBImIqikBJUeN5Wie/USQ9PUCQqLJPaihlCBSouTgr1HIoBKClDJASrYeyQCqKQAlRyggr1HIoBKClDJASq4qCcCqKQAlXZpE1/UEwFUUoBK6e5imgigkgJUcoAK9h6JACopQKVd2hRcgQigkgJUSncfoRIBVFKASg5QXCSxVzWGAlRygApulIkAKilApaVJXCSxFy8hNE0XJnGRxF68hNAstRIXSezVSwzNUqtxkcRevcTQLF2WxEUSe/ESQpPUBzZxkcRevcTQJLURF0ns1UsMTVK7OZO/Vy8xNEmzn8mnqU97UUMoPqUlSVwksRcvITRFc3gkf69dImiG5vBI/l67RNAEzfGR/L14CaH56QOboheE2CkpO6VlSEGRxF69xNAEXYbERzL34iWE5ucipOgVoexUc0o5PJS/1y4RNDdLfCh/L2oIFae0+IiLJPbiJYTm5tKj6I9J3pTUm9LCo+CPSdqUVJtSiauX9+IlhCbnkqPg9SBqSkpNablR+HpQZqo0JR/WhMdtEjlTUmdKS434WkPKlFSZ0o0yJVKmpMqUXJmoRmKvaQRFpuTIxE6VCJmSIlNyZGKnSoRMSZEpOTKxUyVCpqTIlByZqEZir10iaFpuYwp+CMpLJabkffOCT1gkTEmFKbkwMZYlAqakwJSWFkWfKMiXkvpSqjMucNirlxianO0RFzjsVY2hvpRaigsc9uolhuZns7jAYa9eYmiCLiwKChz26iWGZujCIixw2GuXCJqhy4qiGwDpUlJdSi0sAt1rlwiaoC0sAt1rlwiany0uAt2LlxCanz6liU/kJnKlpK6UFhJxgcNe1BDKSslZiQsc9uolhmansxIXOOzVSwzNTmclLnDYq5cYmp3eMo8LHPbqJYbmp7MSFzjs1UsMTVBvmccFDnv1EkNT1FvmcYHDXr3E0CTdM5r4JEoiVkrKSsmnNHGBw169xNA0dVfiAoe9qjHUlZK7Ehc47NVLDM1TdyUucNirlxiap+5KXOCwVy8xNE/dlbjAYa9eYmieuisFBQ6JXCmpKyUvbgoKHBK5UlJXSu5KQYFDIldK6krJXSkocEjkSkldKbkrBQUOiVwpqSsld6WgwCGRKyV1peSuFBQ4JIKlpLCUHJaCAodEsJQUlpLDUlDgkAiWksJSclgKChwSwVJSWEoOS0GBQyJYSgpLyWEpKHBIBEtJYSk5LAUFDolgKSksJYeloMAhESwlhaXksBQUOCSCpaSwZF7cFBQ4GMmSqSyZy1JwWtJIlkxlyVyWgpOfRrJkKkvmshQUOBjJkqksmctSUOBgJEumsmQuS0GBg5EsmcqSuSwFBQ5GsmQqS+ayFBQ4GMmSqSyZy1JQ4GAkS6ayZC5LQYGDkSyZypK5LAUFDka0ZEpL5sVNwYlcI1sytSVzWwoKHIxsydSWzG0pKHAwsiVTWzK3paDAwciWTG3J3JaCAgcjWzK1JXNbCgocjGzJ1JbMbSkocDCyJVNbMreloMDByJZMbcncloICByNbMrUlc1sKChyMbMnUlsxtKShwMLIlU1syL24KChyMcMkUl8yLm4ICByNdMtUl8+KmoMDBSJdMdcns5hSpES6Z4pJ5bVNQ4GCkS6a6ZF7bFBQ4GOmSqS6Z1zZFtznSJVNdMq9tCgocjHTJVJfsbnDTXtUYykuWby+n5EumvmRe2xQUOBgJk6kwmdc2cYGDETGZEpM5MeGDJCNhMhUmy3Fznb14CaE5muPmOnvxEkJTNMfNdfbiJYRm6K5qCkJQgiowmRc18TNbI2EyFSbzgU1BgYMRMZkSk+2WeQx2RsZkakxW7s7lGSGTKTJZuTuXZ8RMpsxk5e5cnpEzmTqTlbtzeUbSZCpNVu6OkhhRkyk1Wbk7l2eETabYZOXuXJ6RN5l6k5W7c3lG4mQqTlZvzuUZkZMpOVm9O5dnZE6m5mT17lyeETqZopPVu3N5Rupkqk5W787lGbmTqTtZvTuXZwRPpvBk9e5cnpE8mcqT1btzeUb0ZEpPVu/O5RnZk6k92bYnLnAwsidTezKvbQrO9hnZk6k9mbfRCwocjOzJ1J6s2U2Bg5E9mdqTLUiKChyM7MnUnmxRUkCCRvhkik/m3fSCQ4ZG+mSqT7Zrm/iQoZE/mfqTtbsSPCOBMhUoa3cleEYEZUpQtmubgjsDGZSpQZnXNgWHDI0QyhShrKebAgcjhDJFKOs33Zz36iWGpmm/6ea8Vy8xNE333Kbg8kEIZYpQtuc2BR/QCaFMEcocobjAwcigTA3K+m2akkGZGpT12zQlgzI1KOt3laJGBmVqUDbuKkWNDMrUoGzcVYoaGZSpQdm4qxQ1MihTg7JxVylqZFCmBmXjrlLUyKBMDcrG3Wd8IihTgrJxVylqRFCmBGXjrlLUiKBMCcrGXaWoEUGZEpSNu2PORgRlSlA27ypFjQjKlKBs3lWKGhGUKUHZvKsUNSIoU4KyeVcpakRQpgRle25TsAkigjIlKHOC4gIHI4EyFShbnBTtPQigTAHKHKCivQcBlClA2Z7aFOw9CKBMAcocoKKLOgGUKUBlB6jgop4JoLICVH7cXUwzAVRWgMoOUMHeIxNAZQWo7AAVXIEyAVRWgMq3pU2ZACorQGUHqKDAIRNAZQWovMc28Y0yE0BlBai8NCkocMjkT1n9KS9MCgocMvFTVn7Kj3lT4JCJn7LyU16WFBU4ZOKnrPyU080Ih716iaFZmm5GOOzVSwzN0nQzwmGvXmJoli5LCkoLMulTVn3Ki5L46F0me8pqT3lBEh+9yyRPWeUpL0YKjt5lgqes8JSXIsV/TcpQhaec5k1pQSZ4ygpP2eJuz3tRQ6g7ZQu7Pe+1SwRNTwu7Pe+1SwRNTou7Pe/FSwjNTS9o4tKCTOKUVZyy3ZwszSROWcUpW3yyNJM3ZfWmvPAo2BJn4qas3JSXHUWvB6WmYlNechS+HpSZak15wZEZfnrMRE1ZqSlnrxbpHIJSU6UpLzYy4ysWQVNWaMqLjcwmh6DcVGjKy40sY4lCJmnKKk15uZFl3IJmkqas0pSXG1nGUrtM0pRVmvJyI3t9KkkhKDlVmrJPZ8pYo5BJmrJKU/bhTJnf6iRNWaUpLzayHNzZSZqySlP2YqbM6UnQlBWa8lIjy5ye5ExZnSkvNLLM6UnMlJWZ8jIjK5yepEzHF/+/n/70+de/v3z7/vLp//3108t//Onf/8f/+NOHjx9ffv/95+9f//ry659++s8//fzZlyzNn9Z3/NO//+efcs1/+vf//K+f/jQexf+RXh9A/ft//td//XR8c//68V3X2uuP4fEv4fOP4Ob/5/4ObX+D8pj7H+mx/9H2f9lq3z9N2f/NqPu/eZ1K6j/f66lk/1eej/Nfaf+r5fKv/vQfv3z4/Lffn3+H8eN3GDtu78f3n8dPu4qo/sXv9fIfv33+9uH7569v/mblx/c7/kgpHX+Scfwljl/x9Uj18Wvb+Wv/yy/am9/YHo+n1+34C7fjr59eq6T2d3r0d36nb8/foD0l3dgZUeb+Pq+T9Dx6aY/3Rv/7hy9/vLz5JfLT65b3n+111+nfLO9/9Lz/xr3v/6Yff8Zxvsivx3H237gcP1tuxyuQzxQs6XjbnPFTz+/8HT59+vby+5vfID39Bul44fd3eH1c5r9Sq0eS7H/Ux36dWtv/zTjyZ9R6/I2Pn/T1yPX+LUc9M6mdr8D5Vjp/8+5Xif/+N/rylze/TU5Pv87xg7ye5vefuh//mPttn17bzO9/5ePHqI/jxxjn18ZxoViNtve/jh93nU3d/7J3vkO/fPn6j//9x8u3f/724duHv339+8u3b58/SXalp0tbem2Ftv+cx3dLtb3zrfG3N2+N/vTWO16Q1+ea+6U9LgStHy/k8Td6Pfd+vGjn27O88/r3229fPn9cV6Lfv3/4/vLmYlCeftNyvBPG+T3K453p8NtvX399+fbt67e379Kny10qj3f/vN++/vH95duH3z7/8uHXT19evv357X1n1Ddh33k9fAr79Ve/On56+fXzy6f9Td5+i/bmW7T/H9/iL9++/vHbf/t9+pvv886sOr7Px6+/fn/5j+9vI443Ed/5rjgi/vbhLy/0c87Hc9T0zsveb79Bxj29eOV4a/XjMtvnuxPuj29f3gTuT5egfr5TX5sQHu/e431c2zv/Kt9//uXD77+8eQc/fZPjKl2Pbzbzj0vrO3+NPz49R3+6cx67ouN6+eMqkY9v1s9vdvyKvZ//eTt+2Xn8a3ULPrYzx7/svZuoPz59fvn145uX8vV8wdM97NiYrV6JO7pfSN4R/fsvP3///Lc34bs9/anH8duX47cf52//zvf/H99/efn1++uV8OXtjfjpt7DjvtPs/T/5EfXTy3/89nqb//byv/94+f3Nu7LY00ub+njn9eQ5+J8//P7985//ScHL82X2dfDcvxr862/r7vDm7fT8Vzl2IXZ8hHh3ep/fg+4+uT29xCnbvxz067dfPv/69vL3/IlnJ3k+Ng7leMv048bajw32ON85ZucusBzvq3zuw8+NWDqDpe5J86/94G83HE93m3zuYsvxo50bz/T+b/S3z58+fXn5x4dvb//iM725jp/7mfd+vvnj+y9fv33+P+v1/Pnl10+/fZUXYD4n+vGnrMe7dZ7b7n58IlgD3PZlqb/zvvL8U6xt3Nu/5tM9NZ8vfT3+mucLmN6fb+d3k5tOet4nvJ6Y3hePfy3yy6ffP3797UU+pj29UnbkX/vx0fD4OJ/ae+/xf3z/Bf5Y9XmnY+etJJ878DbPDweP8zNymu/+npe3fX26XNUj2+uR7fO9N6Tvv/zj86+fvv7j9b7x9Y/vb/cC9rwXeOer8X9+e3P7edoZH7vv+jg/Yv3Yj7/vWv4/P3z868dfPvz668uXn798/cvXP77//PvL77+/vo1+/+O3376+PtF5k1nPH9NfG4HtN9LxOfrHnf74RLimGB5vpPddKOiH4h/m+bJx3A5qOZ7YHB+v0zg+w6xxiMcP874b0tMP4z/LmzR9PKfp6wCH/TY4/9Ue7/ydP3/7/ssnScn+lJLHoyY7Nh25nRu9/Y/Wjk/sxxV0lvP5yfmo6vwYn8rxiS61clx+en1fon98+24tb96tx7fq5X3vx4/XDe3Tff7YwdXH8QG0pPM3eN9F5uOHj7/IJrG92SQen9cfR86sU6PvC/3ly2uOvE2L/iYtjj9zOv/VHu/LviM6bYXG8778nWl2xLtecevTX/zYm5+PYuY7P83+CP/9l7dXvvx85Xtniu1g8GHt+XnlO9/HH1++ff/857Wv/Pby+9cvf3/7UbI8b9HSLOcjVjsSIqd3fqNfXj7+9byKfv7ztw9vP0C8diZ5frMcV63jT30+2hvnp8V5vOdXp5L3/RCfv3z6Jg/G+5t97fmWz8fdLuV3XqD9gXV0UX5+SmXH58PjDzrPPes4P/jOcX4C7O9MjS+fX2SH3dKbTfs7X6sV5+fP8hs8v3mPS9l5M5nHZmT1D3v/d1nb35fvv3x9883a8xvj2OXMY+tpx4fX48pejoex7Xju28+b//GgOT3OB2X9xwf1c7s0jxvlmuR9XPbOV+B4brvaYB2XwuM3tvm+bYX/xk9vuTd78edLbzrvZvsvnc8fuc8ff4/z/n3m6plIq0ni/tePt+3xiHqdczj+9c6LmP7wfL14zpJ+PtGe/Ud2vPPmt76dpOB4equeFNBPgnqcHxfSyWa1nReOH3+44/Kyxiscr/D5cPr8I9l83yM+/1l/f/n47eXNuy+9efcdj/LPz6x2/Gjt+JzaH+cT9/OR0OP8FJbOp/C1n5eLeaatnU/cx5ms6Xz23s7vPt+5Ofjy9eNff//ryz/e/kZPt/Cn5/nnu26cP/V5dz9fnhMW0vjxrxM4fkjiPG8ujx+eMM69yLkrSel8A5YfL975OOvHg6353pT7+vGv379+efn2QR6evZ7EfPq1zz/q+bKdOdbt/MX6+Yud/7J5/mLnrzjOq81xLVrNqo9f7McLeF53zs1YfrzzSvv109vPdE+XmhOtjoSb73yu/Rr054+/fPjy5eXXv7z87Nfw8O73Zid8PB88frk5znQ437fz3Nmnd8L36w90/jxvLkpP16Rj55+PK2w5nnb041nOOO9pZ16nkt55hX/+Ga63tfJ0PTh2Nsc1K6fD34+PjeV41tKPS/k4bkgz/XgC9uMRyfmMOb/zPv/108vfX759/vPnt1dxe35OcuzEjmczx9+kHHBYjmv7aOdjgfe+Yn97lahfv8sTocebDdl7c/yI9f/ANqg/f/LI7/149PoU9NsfH7+/hbL0bOZ2JKwdVm7H38WOV7YdF4x2XB7b8Udsxyfidnyc6ydgPsp5MT3vYbWc/zpvEOP8P+Z5+T0xco10O64v5z343EBZOS+h514nvxPQPn79+tfPbx9Yvvm0cO6UUjofVKUfwHPe1lo6H44db4HU7PzXO5/X+k9DHwifn6LO9N6X/jXa9Y6e0/OF7PxYnNJ5ja/v/eD19e3D3qcf8njKXd57If72ck358uaRVH3vnvzrH79+//bPNz/Ym0+A+y1/bKrHjw9J790rffv8do/05pHmcZev88z9fN5Rf9wzf2StvfPW/u3vb09APH/mq+cl7nTIH3uW84Y08rkDSeet+J1PKz/+8fv3r3/77dvX7y8fv798Wnr7tw/fP/6icPv8Y5X8vuBv77T5+XPmcdGuPy4qPxL13E2O89L1SCc1vvNpxKeX//nHX/4iv0aqb94kx1s5nZen+s7P659eXm9R/+sfbzPm+f5gj/MTzZETx8vZzjvjD5SZj/NqeHyyWnOWjqvh+a/xvvfLp5eP3/7529vH2fYsGsee7vwbp3y8ApbfeWnb3wQfz7+e3X36bscN+DxUlB/nZvGdm4L93faTmrff643XHUZznnvJ5x83vzd1X/784Y8v3xk7rDx9u3I8nu3ns4fzs1tK5/67vvNJyaeXLy/Cm+XN5+/zA9aPLOrns+ITxlYj6fd9v9+/f/v6T/ij5sfzEZDHOx8Nf3r5++ePLz//98L32iT3aed90MhxAZ3jvLqel4N5ng3Y9+j//qf5/PtvXz68uWuUpyvZ8eHsfOZQjl14PzffxyeAcb6oZuet5WSDfD7CyedHhnJcjdO5lU/9vbnuPzjsGtrTff54tcvxDGae+5TyzhMZn77+7cP/Le1cd9xWdiz8Lmf+DrBVVbrOqwwOGk5b3VHSbfvY7lwGOO8+8IUfSUnOZs/8C7Kzq2SpipfFxcXJXyZXe6149Cb66PudP7+OtJBK8MsdvPOw0Y242wbrWakBx0FianIFpJSDuPj2X353e1QlbG3AdCq95TixXuNcjWmD8ev2Y8n4LTZXTDxEAjhLIIypzTEf4cM8V2ERH9QQDFeYtwzhs9FKLsTfvgBhZbCPYOY+vm8mVxjvzDOBrgj6XARR4TFaSUd6idwpDKQE4xuqZKpJX0h3UtfEjsj1WZ/uSaqLdGxKB3IiJroIWtLIoWnFovfyAQd4tAm+NmXEVKsHoDzVNbGTNe6WUYEFRmH18hVTSeCxQZNy32Q9KrAM3yJIVA8JpgBnlyBB/b7bWlRgY+kicXuPQSsAqyVolMbdlkLRuk+zd6jIHZLgbejJjBVSVNCwC16S3fb+DNfIZDyPngXUGmMlSGMtp2eImgY2WVBVLM4qRq7NwRc45/Y2ZjWAYNxaCxgh/s3AuPQ0ZEXUiaYxQgkjVKJG6PKM2/H0fJwOcyvcmJAIPJeXLKa4FXyEoD5V4MoNBnvQOgjAewmycMZfF47D6+jirDmamiyJNxeyj+B7+OVdsK0YSO2TFFSMmhiLAdJbzS/vtFKqH6pVOAhYtcFhRm3ApUlmPD3NAhkbwHLZi1CEOok5NcDMRGw5GGDed/YbNybgoRAop3sIsp5nhOxk6WhJPHBDMaNK6pR5zRywigOWwwfsfNw84HoNNpOvg9/oZY130TtANQhQvWzep7ffT7tZnb4zX5vEWZx+EU/f0Ccl57KXmsZAhT1RfM3aMQEGw/VOXRO7Si/jdjxuZqWHYtlCqTT48jr4GmTR0/S6WzDXbJYgP1nJkhTiUjJhneaqwU86LoCi5Li4A+ePGp/8gaNJIU0MepswVAozY2gIunuAuIGfMBSgE7kh17ns9z9R50yJ56n1yUCYqFKWIEvn+iI+TuNx2r3s/XewTXL3oyg5Zk2VTmxTJ2F3L2Zx0A4EEmJK/omnT03QXr1Mb5f6+HbaPuhktKiNvP8iFaE6g3VIx4W8574lUSDKoXKdcq0odPDKTLvtshPVwvi1mO1emTGghPcmvL/fZn98Ho/jy3H0fLbc2IKYmAMq2akOwtYv++P75jy7+dnBhPdXKzUyOtVSCdbDr4yln/vj99Nf99YBj3dYGKeLXm1d894x4FsFrAcYglDTy3G/O3+OvOqKY+Lz5NAPPVZBC9laqu6ib2/lqdafxr5IwdwbQlNaI3stdmlhq4vBZ6/jbustamdZg2KsJGkoYjQbuWqtuKlebNygLFfiNdLRRO9UaqngdU3s1b2Ou6sH2u1nrIRssf4iXqeH7Vxgf5QSMwey1eH7fCdLLRQOcw+NtsDEKOVzP2oldbUtZ8JQ7uG2FrgRpUQ/ti/h1fa4J+LmFryxA8OAuH2d9hfcbPP2di8ferzPspYlXk1J+2mDJLLX8bysvObBMoMJMbg/qQmW517H83Qe372RNms3ko+1UhhrJRDugtj763j+9vO776+2nXpZCyRSuxAoUsvC2hI+gGVA8MsVIREu8aryGHy89/G82W7OG/+IlnumVRVxhQIVtgWIjqxhAAKptL9PAqurBrc8Ysydvo7nFci6VA5RDrrO1/F8+PjyNj2fptfv4++X4/59Op0+xuP8G2VPoxEES7F5ZRQGe51fx/O1t9vD2K4MQ9WsCXrp1/F83Pxc6bsr2V17CmRNkBz2Op5P4/HHeDxN2/Fw3B9m7t+66i4I/1zXXAJqtvbQAk1WsD1rIrGmicUEutEqQcKc7EEpT3XYHq3oVlh4THuSKuQqarK7pgnfy9s+q/2P9mzKK4PmmepgWe11+jHuFimvTZ8xLPKbCmoJ4m1b8fW9BJuDtjpA1yRnTvCnkup6dEGW7Otxszs/nX8fxofMO2sU5Do1QGd0vfTgGQNpfQpWwa/N8w4cNXdN0rxaXt2Ay6uDXTXX9Vc++0WY0vCBNWvQ7JUfVTRT5eehUUFWfJWvDD+SF6exNCPcu7gHiQkRKykSQRZF9cSjQqgToGyodUGkULAMBS9fCDNriDk1ubz2I7a9/oneG8JWpbN2UlRLnXYvKeMY2z9wrwfyqkFZyDBnEh49QWxNANImtKOYV4KQ9+17XBNtd0JcWtboG4ONof26PDmyLYn2k9SCC7SUiFrehJISOgRqemUxEx2noLP5ej4f9rs37xkdoasiym+CXItp45FO125zP2ZKlZcjCWinAB1hsvasKNjOx8RdZV57zsEC0LTSmGZx8Q64cOi4zEGFomm7Ir1loYIi1kOrRzmIpsjaTxescNq9Pm3eXp9+XPWQHljn5KmuYp2F5at9Kgq+KbzWx5z/5Iv82TJCshzhVlsnIK63Qc88LSGktrLu//b/QVvHI0guUcv3bOWotBJOE90PmKIkpYWEZFHKWq3FeLXR0/YIpLOkf7n+tZj2AaNbB301+6z0VVjyhuQ4RYrqtXi2ThKcnhbVHNQCsJuvtji4+rRU0cVI12LLOslfejLYHIyt7k/wvvm18fR8V6sGAhU0o/3U6guMxBWn5X3K7+uDEgb3xe+3eqamVZJrdgYto/cmNUGMbLHN/jidv3p/NjioWyoOcFKqoL7K9L7f7Z/f9h/bG5awkjBlW38aghJay3VPh/3uNMMqLN0k+gmu/69dxbz0+2eVpLwnWiraQhkkU0+77U3yw6cXZrdGYoeBUlUdlEGYdhe5qedLHPs+KyLnptgtgpbrst5u83ZLTJeKXq4ZLwUxwGl3Pu5Ph/H5/EBJMtmu5Wxan7RSBMjRalWIuo/KGfXh13Z/ooeMEFc2F7pEg0glIRv6e2kgk0tBYEgf49vPlZS3dqXjoaJGhtBDDvYR60YrOY8F+khgUqd9rNqz2gZf78lJF3nb5mJOVEyKNh0RLTRBMcLpdKvm+1qNLWi25BpJo+7o6T297TfbaedNtG0nTtGUYpppQLo1xN4SllEhkHpAo9g/X0n73KjjDRBcAEcycjE5h3/2BbLzV8K1tUuLg0TlNJcnVDHSACSZgkDkbds1uHSweZfkRI2UownbU6f1ZSrIKerzT+f9cRZMZK9XE/3St6ryAsfIlq1ZS5G4rxWTg2dPmzkRYmoaqiLBJjb3IGuAhwMxFRDUxE2bgDHCKQidfpvBvZbBHSR1fTtP7nGdoiSXgPNGS2sKAkHffn73V9L1OGmnzv24UbZTRgbtPJVCyxT/e8XutWsOEkOl3SFSlrrO/w0+uMfqbeUOxSZeh/gOKbChHYPKGZFNTcFW8JtW/qajH5MiVwXZIyuVWF8c1LGBzzWYriulfZB14+aS6cniPUE2Q9H2KscffWNPH0d/nrwNFl5yA3zBT8JAD8QdKRhtXDa+4g9r/PDkPInaS86D/I0AR7C4s0SLrTjtVvKRDpm6ytA7yMf5FI0y+3r1OwQ0rDJop5rCMarwxOFN2semXMAOsIa4pQS73HhzVwfvmwgtUypTDqNtH6VxLkPf6w/jR7T6I3hMRZf66Mk6fR0324t86hqxNzVOKBMTwpcxRkJNgyobRx/ivAQcUuN0poHmta6ppcIg6jezl3Z9WbUhcK9UYhC8CSJ3rjI3vIo56O/j76dZoSy5FuEWS42B1qyZUB1GQ67UtAT5nd/H37NXbH2SbNuA5FZaYaaPu+Iy52Do+H2mW+K6SpRlJ3gfgoGEk5Vm9Fqp5Oso8aLXLkbVNFGyndqlYKvh97O/tlawgB6YhqtZYXOofiWoGrkiGMlBkai3/fPmzdfebBSL5ZLLSL2jwagKPN1L6UVVcrDXiepdqjn8LdlNF2RaXZ928m8sWyKDABNIxtMRX4KFgOsWq2GupcgHa1Zv+9dpN9dgdZriUtPkyRGpKIC44rToNVUQlgpcoeBZiPZq0zRHfSloxa690ps33yLhGt40NS1a0NFuNUg2hO4t/MmWVKjFyEPmTR0Ks72qt6g+S1CBRX7AsmxYegddBImDSxTVib9hWOR7CvIJpIyUp2RiHT2Z8mIo9PXyDVWsh0AnFQXbUKQovNs6kwVjs7pgg9P75tf0/vG+3qbn2iQULyB+QlIptTl2m9/H9/3x9+pds40GwUxonUJkKy/kZ1RC5f21HOFecyWdp6BZkxEi4k99LNmT5/tDpOt0qhVHlY3kb4j7wfrEKLdi91oUnI0YGy0VxDlJvYmWFjlKytEe6B8ZVLkAXnmlqoBos2gdPpOT85iZ7oPr0MhPv721aNcK6GAsyB/pYKL9r6dsQG9xpvcqI/yVVVzmzi2NPOrX/Xa3P19naczgPVdVTUHq5k2sesmScWM4JGIVeJA6e8OhEFisFxuhLALOW4I4kWpixJaEtQuyMhdou232p6LdyUfoo1Zdih1/XRBUu4GJ94R5LqzGXn1j1DKxzaWzZ9x5SSkHCUU5mCw5f/AyuBZwGFRNsF/XLfxlcxoXVYnUOEEZbAWYGpeiIZ7o9XbrBQhiau6JVqdluLbz4GQat+oaGdPJOTZBmRpWvX/o3UVObCnt49RresxERT56hx/+H/ut/KTaqQP06LMhUJhzMHDWIqHd63JavAeyWRPoVlAIflaIXOU9OuUNmqObYK5kdlgTYCpOeeMOHsYXvVCAlnfH0ioz06WIrBG1SWiPpwEvWPHJorPkeJpvp8WzZMfxCDJeWVAnHqxeHgdzf/ai78Zf55Xv4QQ3mmA9mEX30/b5fkuWa6fWOnyF5PDb1aAAWwxCeLzxKhHSpp3E3JB5M/2HOQe1+dz+K7/YTovKAomFY+3l4ovbP7iZJp90a7ru2tsanL6hSq5+9uFXLqi1KVliHtWRJ3hPDVI2TIDLSSn0QQUV8yzLW+QqgBVshWhVbL72/AuVbP1BCjZxsuoqR98VtwFam8+e2TXaSXFU0BTsp9YlL5ptsxqO6yjgG7efjR5XegCSNVYIvmrvmNb+2qDazXy3tQPj4GHE41IbRO8ebLE4N24CEhhwaoPajPNtLin7bAN3jFR9Jn/Silyb09ZeVO20lrS377PB43WDw+Z4njZva/s0jsCjRO5g1ZF9bjNOFx7catJnJNRhzyeIC5Sq0qAMbpxLCZYD/OPM+kWMA2vhridFZ6NIoexxKaT7H2sdllTXWpjLSYnwQWUAtvqxeZu2VwBl5RXbYVFoEYE4gtCnVhkhlDsY3pJLsNzBM/0cv3w7Ld12tvXLNgohrCy6Fk9bXcYu6A681bOcA7C8BhCMWnyiVyJBxsjUtnMO5ggLCMOJu6IpJSiq3L9G4u1WjmcvgPkADk21PBGnJ9jWqe41UNfuH0gxwSEruy8vPrO2AS7PIcdKeAIKtwCtAOF3qp1EXDSY5BtOiabhQdToEpR7hklx+V0UDLmsY5IHNxvUZasu/WqD/NX56ouxoH4Lp+UWVJX2WxzH08fbTLjXSdAEuVC76fn74ji7BBStFqGXS9reyOFtBWHrpV4wcCQ1qck6kljZeVjsLkg63O2v41BnKZoDNlKwv3s3B/esHpOibVFobEEhdzNQxQRoxn1/m1ImquHMo5gubrRhYoWU1UC3mRagkzxA2FNN60Md5OXt9ueX/cduBvYWF67GbP969pdtvquNY4BzqQkq5T2+v6V1qhSIzDI0ILVg5i3EnxY6ahcM9va7P48yS25mFUEC2jYpK2lCu+qCrPaLmNhxvMexz8dxc54zVxs3yy3o19YCETsTeGDGEPWcRFEi0VaQMhe8KCirWRniY22Q2Pw39rS0TvpD1QppOWs0yYIfhXJ+aqnvd8GZNpcc8fG7N9GAOGlkGikzMzCqVjqXtOvQtyOFjU5ess4JoVyVlM1NyShljSLI+DQeaoNSXpefef7TZPHiBtxXhKdJldo09NLCeVDFe+9LDMnJ2qAuyrKMjk+0H6aeIikEnXw/u3+7vdfXc8knKqGYErTdE0zu1FPihPuV75/o7zffvI4r17F2Kjdt0DVdFouPRa9d63cbhHxne0TmoteuS6ANApwrind2dF+qtQs5yG85bI6r/UY2oEL5tFMmbIrFhofN8TQ+nhSYLRxUi4Xl4CYGG+cSrM7MxwUWN9gTVlpqgljW4SJecVoEXW7wHkzGFG1COnzd78an3cf7F38qetcWJ2VgyYWKBkVSAWS6s/yN9pIzaSpRUE61un8V9Qu2v9lnXhUX7r3Xl4end1/sBnNc0C+Xv4E3nbJ6WxxUre6Lf9cFcdnD9Hz+8IhX78y3BPjy0go0R8ET6Gbv5W8GIlom2iRShYT6fqIxN3XBlOqwP3wcbsN/v47T69eZgqKV0Q0CgGbFn9N2PlKztQvGMojD/nTevD3NhV2zmzZ39/KS+9MhkOog3nvZZW0sarZK1p1k59E55ZdVb2HrRW/wOF7OhiPN21BdDkItATMjgAd0C6gSJlgzKWvxgFvXBbX/9AFnGsfFfvtUgmpoh+P4Mh6P4/bpgvAtUl4HzIqtkQvIZHh4DbAAe/mboVXcRgdbwGJTlFAFMYKJ/+G4v7jR1SNgk502WO04HPcvk2fLDg4vFmslF5qZCRArSKHoGxpQnUdNNGH3Uq3aF/y7LohQHI77d6+J7kg4kkdLQoLedC3RV0eALT6qEyuq9CktflKUTIWySeHf1Zz3WjU+tFEv6lFvE3181GWddKNFlGAT+H3JzWHyq7qBRfiMVjt26M5JQZK67rQ5rDWb1a6ptg1qAemq19B3bVkH8vaffdh73XCVoGLdIOOwM+N28z36i+92ePgjXA4zBAPU27I3POUwl0FonTkMMoYWS66VkVqnlx8sHjGtyttsl6LHr/5tqc3hcOtVZ1qff6muNyPqVh8vvpRpcxB5tEbBDo8XLp2T2QrCP387EKx26FMXJAX4ZWfMGqeHpOM4glXk+9Jf93vnv+raM5s/9fMVDPdLutm5QUnB+5KrN9YJ9KqULaxcpDhziSILt93mN7l2s74bjZiD8J1Zdqk6eIXNf83ujT183ecf/gZS2Cz/oijnWaZurnNwGupiiwWasNzH6TxFM/PZPitf38byKZxo+HWP4/njuFs+srNawf6/w8fp67idDfC6u7YHEhdOx14SUKnIMbQrMd8mV9qc2wctx/Wp3EOtAB0W7kGzraNzMwcreSubrXCCkg3pUWKPykH4AVOOF8KoAlJxph8m2skSque5wjzk4PH/16wZvnUGSHanI4LIFYp8Ql01MwYzR+EqSQd9DchRb4I4lKx03t+kiTxm52QmiKAbTY+CpJj5Lqu32LnvYIg0X3jpvHvfVv5/ed5Z2ah2A68bTZaCZbfF4qtvwx2oT37MGUpgRbGlZIrKC4KznaCZvVyaQdEilfXMMT93yeTPzx7idF1HUa2A+0JroyGSTYkRg65VK0GodVLVHkDEdC4GtjWZdjZVG9XCTMzKzh53jUpjUy/EKjt2ysHS+MrIheLaL6KK0/eF1qQT7ZNK8VonBeTwbbpucNWz9d/PMpul17D93O+/rrr6mp0Mh0AQYnQ7ZhhJvt1B0kK6IOWgSuL9WdYew9rQ6LCb+3Kr3FGLWwr20Qo+0AaV4P0Gq2/PFkhpEFYgOdjycN9oqSFpvjw9LugwSumOtm0QKdTWU1IqoxYtUTZog8yl4/i6GHlnue/3BxLTQEt+qoP55WWD03nWlWRHtqUcLA0cx/f9j3Ep4G8cRcOLE3iTNxKdWrISpdUmuZJLWgRSrblQAuX1RD1ZZTSDhA0Jkvdfvo3P509IrTp4RYI/ueIMCEwMqsqVKqUEUSp5NpRFHj2L9dxyMRs5rUxXSb1Kn9BRmYIyJ/IsM0efbVWYCSEdYGkO1kzM8n//c+1ZFliuEWcx6Hw7bXKGfZmCDc335xm3p+f9wYMednzF/UQyxwVFVe09BSNmeHeK+5vrQ8xjKztOSSowEj/0OiY1SFq5bDIdx6c/pZC+38VBH+K4gKbRe0/ojedKW6f76E8/7T+OnjlnSWL3TVE6ERshsaawfWo5kkwIQMcBrY5anhjybCtdBB2hqtymjsnhTF1tiGKFv4uqr7BLBkj9ifwwa4qrVX1ktAq6LoX/o2j3splFoMLBKiBKOdjIJERtzu3Fz7jY5pOrinuFlUtZo9bwPldqxdOlmfqhkXUMDhFnkQ+IdnXqtcsdYmoK0tF5kD+NPXB4FXoYqErDIqD5PFdMz7tTpcMPMu8ut10bErIXySZqsQCdeMVeuwFUuySc+egjzIIzY/UogHX0wmQlmwehVdnqPL2PC5KkmzyD2UT4MTVhp3XfZAayWRqk3Joid7WWO4hEQId1HbQcCPc+DEjos8zerW3qaIielKoHrB4OgS/I4qw+nl1OLqXrTvxFr5wYqPpFpy6TKxaInUVZHINi0rJKp/OvguDacfyxvxEK1xFLh+XCnBbTj9poonsiV4x+SsGS2uUZvo9LjWIrXo0MYRvFSJZ1E2dPKsw6I4VTE4xTTk9fNz4jH5wIh3hnsRcDfaJ10BOfNu/jaZoRPF1JosJ9NcFPLWveImyfqLhBEma+asytXMM19+lcU8X90IsVhVPPCHohZyE6nTI18U5VVVRLJchMX4aRlqVz/0iIV8jWsIP5gyRD8hmLWKRacHoApFrcU60zcyRuYgS4RBmdhEedWJtOopmOge+S3fSCYDEQhxmuAwNQkknKFOYgqNHhKYAghdi1aGeTti1wymq6ovhBqYV20WG0iNCSTkzSjiqlqA09yRACQEm75rSih14k8ry56KTyoB+4nYRHcYY9/eLRwXsHI8xLmxqz4+7iJ3//AOPm+LwyIbpOvqIQXe15xh4sDqyu+ORNECC5rjidfzOxYOYtLf1WznqnTQZKgAxqMpzG3fbbaaYIVlzPb7CFcwU9K85rVZxr2l1TE7XDt8W/j14g0DIF7tOCoku9TS/X8Mvb3+LsL7YvOBiEJupZS4AVZBf2Xy1WdAjWmE2H9lxUzdZcumAfw2k+ydP1q+vkcHSDOvKdQcWVg82Vp/G8OqolWbqmtkVQEUmDphQdAJKO5laRnmCaIQ+yOrYl2UQva9kSWz5ocIW0L3TsrHPBczDgOq2PHzXvZOBqpyBF9LQ2dNSs2Ii3b+U1ttD4g90Gp/G82y/GSpXipk0GM6FlFTTbziVtQ6q0kV1VEpVuGDXYj8qh2fYrd5Rec/SAP6iGdk6QMmpJr4udprdx3iloxRODqqd2sdXf7SjNwVu0LNJmj1oLqVRFeAlmkzJIaZpug1qBjwu42XYZ6CCEHOQT3xeed4lkO66yC5ZiZa3lYXCl8aAI3GW12SAF24us49tKcHTWbcGVp3PExuAEuNPbtBgQ4oQHEvE8AWRqMfRt1GfPPaobIiS4pRw6QSTJG8gJKHgBcsh/kppWLdF9J8e0ZwRqhcemrE2fHdE2OhMp03SZdZSk0eEJvuE1f2+recFSz4qyi+thJjWmkS+hrp/a6NE/H8fx/LTZXlSDZiMwbB31/q7FnfYckjrYnnY6H6fn8521f/q9e/ZRsh1UJtkeOsqdZEGdylWBYaas6ZpG1To5OWggP774wMLmFrITuZhks4LeovPcSP5Hh26vUAYpOvwAmpRSrU3cfFfF1KD6J508R6CRmcOSkwY0wZrN6eNWSPwjmmyPnXwTVfCCaJfoXctVRT4anA52Hneb3Xm7f99Ms3lblgFHiYaRDZKOt7RFcJ0rHURLTNxopZP0XRvCB81T0cetdIoauStZW0blLOdgPnubkbkOGbqJMUJy5NxQkU302eUKabsUbJzx+18LaE83mdyH398ml2JkGwo+lU6QQbGnQnv/PrI3+Fhz5DtbhKHIW9dpzTnYl3Fd/VIrevsx45jXXmaTk8CctkTLNaPVMpXjXIJk2hXRJ1uXBF/qtV0y2BZ9XVlFmB7IjmV7iaOBx/m37x53rAxEpDiVVVErhW2q1SLFHMWHz+/t2ctqGoOj3z+m21AFXxG3wwbFgjMeE19DaYN2QUo72VQaqIVqHYI+sVpZgeBKXdAyfxy2l4F0T35w8eBCNekWQ4eF4U9oUkoqjH7/wMXNFb+iUohSJbmYCBEUuLg98Rqq5HqpqmCv48dMErN2Pll4FFjxSmu6MJnRv8kMvMo5eGM/TuNCHrr14+SDH/J0EbnzKJtrOgcmTZAum6AzWeq8WfabnAaVDE/k5JRkU6vTHqCzdkGBh8v+m9dZ1ltcwKBTArGkqQkGBeucVhuYMjIZy10BAibYCW2wd0j2e+Cenai18JYoMMLaSb1Oo2HYUwoSD//Aiy1uQFIODsCWBVfFIWzEAYVDx21n7XcO8jw/ztObd3P2rRWJvnqIb9iuHG3Nu27xl0x/9cxEC2nIYe61ikP4GAV27n51fDAMtnaqUhBqcqVRYdDVrmy0Rnp3mTpDNjMTLnMJEthkv+fxeJ5errNPv1ym/3pkwClRi31l0knBV1BzSwNQnwrsaVP5IBYpJ5X91dZd+j3IaLPRDSG5iHaHym9cmdBu6yVEdeLKGepSi9No6cKWm93JE/YgBVGZZnmsbz8fzhi2IFZWbwZyNGii1VHuI+ViXmLOQTu7/khroJ3NBZRRgVJehuCYSxDm+Dm6zDvbzsfo5M2f45d5zX9wPkiiPJRYmD4mEVoLs4TasGqCkW+gJpBqEkmK0ilayfnl4xrXmilAAjFkpTQi+i+Y8Z0ZkJaj1NVfzbPf3rVPSvzIUauU40GA1ZMcEfLnHNTA/9V4p+pEfhmTAhpSaeGR99Bj95iWkaNtd7+a83+cLlUo9wyu7RKRQ/IaEIVGx2EBQDA6IecgNvqr+fDbu+5MqaJzviodQ8LLgLCbKySJcxDy88N6XAEVWSIynUqRE94CDNJcQTvIwdv+P/vdOI/oBq+ILVdVuCOSaDYSM7QQV+XyDtqZQuwCOJdqZTJzpbuIets///Mfh+kwvk278R//9d///Pe//xdr0krV"; \ No newline at end of file diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudAuthBaseError.html index 7180aa01..f2bcbe51 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
MonoCloud Authentication SDK
    Preparing search index...

    Base class for all MonoCloud authentication errors.

    All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

    -

    Hierarchy

    +

    Hierarchy

    diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudHttpError.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudHttpError.html index b696bd2c..1e810ad8 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
    MonoCloud Authentication SDK
      Preparing search index...

      Error thrown when a request to the MonoCloud authorization server fails.

      This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

      -

      Hierarchy

      +

      Hierarchy

      diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOPError.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOPError.html index a3e1ff40..2b590137 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
      MonoCloud Authentication SDK
        Preparing search index...

        OAuth error returned by the authorization server during an authentication or token request.

        These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

        -

        Hierarchy

        Index

        Constructors

        Hierarchy

        Index

        Constructors

        Properties

        Constructors

        Properties

        error: string

        OAuth error code returned by the authorization server.

        diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcBackendClient.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcBackendClient.html index 16c1ebac..a3d75a98 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcBackendClient.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcBackendClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcBackendClient | MonoCloud Authentication SDK
        MonoCloud Authentication SDK
          Preparing search index...

          Hierarchy

          Index

          Constructors

          constructor +MonoCloudOidcBackendClient | MonoCloud Authentication SDK
          MonoCloud Authentication SDK
            Preparing search index...

            Hierarchy

            Index

            Constructors

            Properties

            clockSkew clockTolerance fetcher? diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClient.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClient.html index 4764a323..c65a8643 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClient.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcClient | MonoCloud Authentication SDK
            MonoCloud Authentication SDK
              Preparing search index...

              Hierarchy

              Index

              Constructors

              constructor +MonoCloudOidcClient | MonoCloud Authentication SDK
              MonoCloud Authentication SDK
                Preparing search index...

                Hierarchy

                Index

                Constructors

                Properties

                fetcher? jwks? jwksCacheDuration diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClientBase.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClientBase.html index f801fe41..e63ab5bf 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClientBase.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudOidcClientBase.html @@ -1,4 +1,4 @@ -MonoCloudOidcClientBase | MonoCloud Authentication SDK
                MonoCloud Authentication SDK
                  Preparing search index...

                  Hierarchy

                  Index

                  Constructors

                  constructor +MonoCloudOidcClientBase | MonoCloud Authentication SDK
                  MonoCloud Authentication SDK
                    Preparing search index...

                    Hierarchy

                    Index

                    Constructors

                    Properties

                    fetcher? jwks? jwksCacheDuration diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudTokenError.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudTokenError.html index fade42db..92929dc3 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                    MonoCloud Authentication SDK
                      Preparing search index...

                      Error thrown when a token operation fails.

                      -

                      Hierarchy

                      +

                      Hierarchy

                      diff --git a/docs/html/classes/_monocloud_auth-core.index.MonoCloudValidationError.html b/docs/html/classes/_monocloud_auth-core.index.MonoCloudValidationError.html index c7f63ec6..8c47c036 100644 --- a/docs/html/classes/_monocloud_auth-core.index.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_auth-core.index.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                      MonoCloud Authentication SDK
                        Preparing search index...

                        Error thrown when validation fails.

                        -

                        Hierarchy

                        +

                        Hierarchy

                        diff --git a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudAuthBaseError.html index d8f6169d..4bb51b5e 100644 --- a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                        MonoCloud Authentication SDK
                          Preparing search index...

                          Base class for all MonoCloud authentication errors.

                          All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                          -

                          Hierarchy

                          +

                          Hierarchy

                          diff --git a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudHttpError.html b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudHttpError.html index 418c219a..2b2f6665 100644 --- a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                          MonoCloud Authentication SDK
                            Preparing search index...

                            Error thrown when a request to the MonoCloud authorization server fails.

                            This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                            -

                            Hierarchy

                            +

                            Hierarchy

                            diff --git a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudOPError.html b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudOPError.html index cf7c55a9..642de34d 100644 --- a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                            MonoCloud Authentication SDK
                              Preparing search index...

                              OAuth error returned by the authorization server during an authentication or token request.

                              These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                              -

                              Hierarchy

                              Index

                              Constructors

                              Hierarchy

                              Index

                              Constructors

                              Properties

                              Constructors

                              Properties

                              error: string

                              OAuth error code returned by the authorization server.

                              diff --git a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudTokenError.html b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudTokenError.html index ff837b35..072fb614 100644 --- a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                              MonoCloud Authentication SDK
                                Preparing search index...

                                Error thrown when a token operation fails.

                                -

                                Hierarchy

                                +

                                Hierarchy

                                diff --git a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudValidationError.html b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudValidationError.html index 6da36962..05c2b713 100644 --- a/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_auth-nextjs.index.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                MonoCloud Authentication SDK
                                  Preparing search index...

                                  Error thrown when validation fails.

                                  -

                                  Hierarchy

                                  +

                                  Hierarchy

                                  diff --git a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudAuthBaseError.html index 9ca4e73b..7285f48d 100644 --- a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                                  MonoCloud Authentication SDK
                                    Preparing search index...

                                    Base class for all MonoCloud authentication errors.

                                    All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                                    -

                                    Hierarchy

                                    +

                                    Hierarchy

                                    diff --git a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudHttpError.html b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudHttpError.html index cb7e1af5..6282ab5e 100644 --- a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                                    MonoCloud Authentication SDK
                                      Preparing search index...

                                      Error thrown when a request to the MonoCloud authorization server fails.

                                      This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                                      -

                                      Hierarchy

                                      +

                                      Hierarchy

                                      diff --git a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudOPError.html b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudOPError.html index 5c99b99f..4ad37e86 100644 --- a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                                      MonoCloud Authentication SDK
                                        Preparing search index...

                                        OAuth error returned by the authorization server during an authentication or token request.

                                        These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                                        -

                                        Hierarchy

                                        Index

                                        Constructors

                                        Hierarchy

                                        Index

                                        Constructors

                                        Properties

                                        Constructors

                                        Properties

                                        error: string

                                        OAuth error code returned by the authorization server.

                                        diff --git a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudTokenError.html b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudTokenError.html index 8facfd9b..88c12ffd 100644 --- a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                                        MonoCloud Authentication SDK
                                          Preparing search index...

                                          Error thrown when a token operation fails.

                                          -

                                          Hierarchy

                                          +

                                          Hierarchy

                                          diff --git a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudValidationError.html b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudValidationError.html index 553a1563..6cbcad9d 100644 --- a/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_auth-node-core.index.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                          MonoCloud Authentication SDK
                                            Preparing search index...

                                            Error thrown when validation fails.

                                            -

                                            Hierarchy

                                            +

                                            Hierarchy

                                            diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.html index f082ffc3..635c78a0 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                                            MonoCloud Authentication SDK
                                              Preparing search index...

                                              Base class for all MonoCloud authentication errors.

                                              All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                                              -

                                              Hierarchy

                                              +

                                              Hierarchy

                                              diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudHttpError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudHttpError.html index 9d5c36d5..6e054572 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                                              MonoCloud Authentication SDK
                                                Preparing search index...

                                                Error thrown when a request to the MonoCloud authorization server fails.

                                                This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                                                -

                                                Hierarchy

                                                +

                                                Hierarchy

                                                diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudJsError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudJsError.html index a2add311..f18f6510 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudJsError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudJsError.html @@ -1,3 +1,3 @@ MonoCloudJsError | MonoCloud Authentication SDK
                                                MonoCloud Authentication SDK
                                                  Preparing search index...

                                                  Error thrown when a general JavaScript or internal SDK failure occurs.

                                                  This error indicates an unexpected issue within the browser that does not fall under network, validation, or OAuth-specific categories.

                                                  -

                                                  Hierarchy

                                                  +

                                                  Hierarchy

                                                  diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOPError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOPError.html index edf4e33e..9f5ed3fc 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                                                  MonoCloud Authentication SDK
                                                    Preparing search index...

                                                    OAuth error returned by the authorization server during an authentication or token request.

                                                    These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                                                    -

                                                    Hierarchy

                                                    Index

                                                    Constructors

                                                    Hierarchy

                                                    Index

                                                    Constructors

                                                    Properties

                                                    Constructors

                                                    Properties

                                                    error: string

                                                    OAuth error code returned by the authorization server.

                                                    diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.html index a16cb91a..3f808f79 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcClient | MonoCloud Authentication SDK
                                                    MonoCloud Authentication SDK
                                                      Preparing search index...

                                                      Hierarchy

                                                      Index

                                                      Constructors

                                                      constructor +MonoCloudOidcClient | MonoCloud Authentication SDK
                                                      MonoCloud Authentication SDK
                                                        Preparing search index...

                                                        Hierarchy

                                                        Index

                                                        Constructors

                                                        Properties

                                                        fetcher? jwks? jwksCacheDuration diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudTokenError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudTokenError.html index 683c99e3..61e56247 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                                                        MonoCloud Authentication SDK
                                                          Preparing search index...

                                                          Error thrown when a token operation fails.

                                                          -

                                                          Hierarchy

                                                          +

                                                          Hierarchy

                                                          diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudValidationError.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudValidationError.html index 72f6aa64..2d44d7cc 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                                          MonoCloud Authentication SDK
                                                            Preparing search index...

                                                            Error thrown when validation fails.

                                                            -

                                                            Hierarchy

                                                            +

                                                            Hierarchy

                                                            diff --git a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.html b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.html index 4e6367f1..9986a491 100644 --- a/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.html +++ b/docs/html/classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.html @@ -10,39 +10,35 @@
                                                          • Automatic PKCE, state, and nonce generation and validation.
                                                          • -
                                                            import { MonoCloudWebJSClient } from '@monocloud/auth-web-js';

                                                            export const client = new MonoCloudWebJSClient({
                                                            tenantDomain: 'https://your-tenant.us.monocloud.com',
                                                            clientId: 'your-client-id',
                                                            appUrl: 'http://localhost:3000',
                                                            callbackPath: '/callback',
                                                            signOutCallbackPath: '/logout',
                                                            }); +
                                                            import { MonoCloudWebJSClient } from '@monocloud/auth-web-js';

                                                            export const client = new MonoCloudWebJSClient({
                                                            tenantDomain: 'https://<your-tenant>',
                                                            clientId: '<your-client-id>',
                                                            });
                                                            -
                                                            Index

                                                            Constructors

                                                            Index

                                                            Constructors

                                                            Constructors

                                                            • Initializes a new instance of MonoCloudWebJSClient.

                                                              Parameters

                                                              • options: MonoCloudWebJSClientOptions

                                                                Configuration options for the client.

                                                                -
                                                              • storage: IStorage = ...

                                                                Storage implementation used to persist sessions. Defaults to LocalStorage.

                                                                -
                                                              • OptionalpostCallbackFn: PostCallback

                                                                Callback executed after a successful sign-in or sign-out callback. Useful for client-side router integration.

                                                                -
                                                              • OptionalonSessionCreating: OnSessionCreating

                                                                Hook invoked while creating or updating session.

                                                                -

                                                              Returns MonoCloudWebJSClient

                                                              import { MonoCloudWebJSClient } from '@monocloud/auth-web-js';

                                                              export const client = new MonoCloudWebJSClient({
                                                              tenantDomain: 'https://your-tenant.us.monocloud.com',
                                                              clientId: 'your-client-id',
                                                              appUrl: 'http://localhost:3000',
                                                              }); +

                                                            Returns MonoCloudWebJSClient

                                                            import { MonoCloudWebJSClient } from '@monocloud/auth-web-js';

                                                            export const client = new MonoCloudWebJSClient({
                                                            tenantDomain: 'https://<your-tenant>',
                                                            clientId: '<your-client-id>',
                                                            });
                                                            -
                                                            import { MonoCloudWebJSClient, MemoryStorage } from '@monocloud/auth-web-js';
                                                            import { router } from './router';

                                                            export const client = new MonoCloudWebJSClient(
                                                            {
                                                            tenantDomain: 'https://your-tenant.us.monocloud.com',
                                                            clientId: 'your-client-id',
                                                            appUrl: 'http://localhost:3000',
                                                            },
                                                            new MemoryStorage(),
                                                            state => {
                                                            // Use the router to navigate instead of a full page reload.
                                                            router.push(state.returnUrl ?? '/dashboard');
                                                            }
                                                            ); +
                                                            import { MonoCloudWebJSClient, MemoryStorage } from '@monocloud/auth-web-js';
                                                            import { router } from './router';

                                                            export const client = new MonoCloudWebJSClient({
                                                            tenantDomain: 'https://<your-tenant>',
                                                            clientId: '<your-client-id>',
                                                            storage: new MemoryStorage(),
                                                            postCallback: state => {
                                                            router.push(state.returnUrl ?? '/dashboard');
                                                            },
                                                            });
                                                            -

                                                            Properties

                                                            Underlying OpenID Connect client used for advanced authorization and token operations.

                                                            +

                                                            Properties

                                                            Underlying OpenID Connect client used for advanced authorization and token operations.

                                                            Use this when you need lower-level access to OIDC protocol operations not directly exposed by the SDK.

                                                            -

                                                            Methods

                                                            Methods

                                                            • Processes the sign-in callback from the authorization server.

                                                              -

                                                              Call this from the route handler that owns the sign-in callback path -(callbackPath).

                                                              -

                                                              Returns Promise<void>

                                                              A promise that resolves when sign-in callback processing is complete.

                                                              -
                                                              // /callback route handler
                                                              await client.processSignInCallback(); +
                                                            • Processes the authentication callback from the authorization server.

                                                              +

                                                              Call this once on application startup (typically in your entry point or +router). It inspects the current URL together with the persisted callback +state and automatically completes a pending sign-in or sign-out flow - +there is no need to dispatch on the route yourself.

                                                              +

                                                              Returns Promise<void>

                                                              A promise that resolves when callback processing is complete.

                                                              +

                                                              Example: Application Entry

                                                              async function init() {
                                                              // Complete any pending redirect callback before rendering.
                                                              await client.processCallback();

                                                              // Continue mounting the app.
                                                              }

                                                              init();
                                                              -

                                                              MonoCloudJsError If no sign-in callback state is found (for example, the page was reloaded after the callback was already consumed, or the route was hit without an in-progress sign-in flow).

                                                              -
                                                            • Processes the sign-out callback from the authorization server.

                                                              -

                                                              Call this from the route handler that owns the sign-out callback path -(signOutCallbackPath).

                                                              -

                                                              Returns Promise<void>

                                                              A promise that resolves when sign-out callback processing is complete.

                                                              -
                                                              // /logout route handler
                                                              await client.processSignOutCallback(); -
                                                              - -

                                                              MonoCloudJsError If no sign-out callback state is found (for example, the page was reloaded after the callback was already consumed, or the route was hit without an in-progress sign-out flow).

                                                              -
                                                            • Refetches user information from the UserInfo endpoint and updates the local session.

                                                              The default access token (matching the client's configured default resource and authorized scopes) is used to call the UserInfo endpoint.

                                                              Returns Promise<void>

                                                              await client.refetchUserInfo();
                                                              const session = await client.getSession();
                                                              console.log('Updated user data:', session?.user);
                                                              -

                                                              MonoCloudValidationError If the session is invalid or the default access token is missing.

                                                              -
                                                            • Refreshes the current user's session using the OAuth 2.0 Refresh Token Grant.

                                                              Requires a session that includes a refresh token (obtained by including the offline_access scope at sign-in).

                                                              -

                                                              To start a fresh, non-interactive authorization (for example, on app bootstrap when there is no local session yet) use MonoCloudWebJSClient.signInSilent instead.

                                                              +

                                                              To start a fresh, non-interactive authorization (for example, on app bootstrap when there is no local session yet) use signInSilent() instead.

                                                              Parameters

                                                              • OptionalrefreshOptions: RefreshOptions

                                                                Optional configuration for the refresh flow.

                                                              Returns Promise<void>

                                                              A promise that resolves when the session has been refreshed.

                                                              -
                                                              await client.refreshSession();
                                                              +
                                                              await client.refreshSession();
                                                               
                                                              await client.refreshSession({
                                                              refreshGrantOptions: {
                                                              resource: 'https://api.example.com',
                                                              scopes: 'read:data',
                                                              },
                                                              });
                                                              -

                                                              MonoCloudValidationError If the session is invalid or missing a refresh token.

                                                              -
                                                            • Initiates the sign-in flow.

                                                              Parameters

                                                              • OptionalsignInOptions: SignInOptions

                                                                Optional configuration for the sign-in request.

                                                                -

                                                              Returns Promise<void>

                                                              document.getElementById('login-btn')!.addEventListener('click', async () => {
                                                              // Standard top-level redirect to the authorization server.
                                                              await client.signIn();
                                                              }); +

                                                            Returns Promise<void>

                                                            await client.signIn();
                                                             
                                                            -
                                                            document.getElementById('login-popup-btn')!.addEventListener('click', async () => {
                                                            // Opens a centered popup for authentication.
                                                            await client.signIn({ mode: 'popup' });
                                                            console.log('User finished popup flow!');
                                                            }); +
                                                            await client.signIn({ mode: 'popup' });
                                                             
                                                            -
                                                            document.getElementById('register-btn')!.addEventListener('click', async () => {
                                                            // Forces the identity provider to show the registration/sign-up screen.
                                                            await client.signIn({ signUp: true });
                                                            }); +
                                                            await client.signIn({ signUp: true });
                                                             
                                                            -
                                                            • Attempts to silently sign the user in using a hidden iframe and prompt=none.

                                                              Useful for restoring a session at app bootstrap when the user is signed in at MonoCloud but no local session exists yet (for example, after opening a new tab or a hard refresh that cleared in-memory storage).

                                                              -

                                                              The method runs a full authorization round-trip through a hidden iframe. If MonoCloud has a valid session it resolves to the new session. Otherwise it rejects with a MonoCloudOPError - typically with error: 'login_required', 'interaction_required', 'consent_required', or 'account_selection_required', depending on why the authorization server cannot satisfy the request without user interaction.

                                                              +

                                                              The method runs a full authorization round-trip through a hidden iframe. If MonoCloud has a valid session it resolves to the new session. Otherwise it rejects with a MonoCloudOPError.

                                                              Parameters

                                                              • OptionalsignInSilentOptions: SignInSilentOptions

                                                                Optional configuration for the silent sign-in request.

                                                              Returns Promise<MonoCloudSession>

                                                              The newly established session.

                                                              -
                                                              import { MonoCloudOPError } from '@monocloud/auth-web-js';

                                                              try {
                                                              const session = await client.signInSilent();
                                                              console.log('Restored session for:', session.user);
                                                              } catch (error) {
                                                              if (error instanceof MonoCloudOPError && error.error === 'login_required') {
                                                              console.log('Not signed in');
                                                              } else {
                                                              throw error;
                                                              }
                                                              } -
                                                              - -
                                                              await client.signInSilent({
                                                              resource: 'https://api.example.com',
                                                              scopes: 'read:data',
                                                              }); +
                                                              import { MonoCloudOPError } from '@monocloud/auth-web-js';

                                                              try {
                                                              const session = await client.signInSilent();
                                                              console.log('Restored session for:', session.user);
                                                              } catch (error) {
                                                              if (error instanceof MonoCloudOPError && error.error === 'login_required') {
                                                              console.log('Not signed in');
                                                              } else {
                                                              throw error;
                                                              }
                                                              }
                                                              -

                                                              MonoCloudOPError If the authorization server cannot satisfy the request - for example, because the user has no IdP session (login_required) or interaction is otherwise required.

                                                              -

                                                              MonoCloudJsError If the iframe cannot be created (for example, in a cross-origin-isolated context) or the authentication window times out.

                                                              -
                                                            • Initiates the sign-out flow.

                                                              Clears the local session and, when federatedSignOut is enabled, also signs the user out of MonoCloud (Single Sign-Out).

                                                              Parameters

                                                              • OptionalsignOutOptions: SignOutOptions

                                                                Optional configuration for the sign-out request.

                                                              Returns Promise<void>

                                                              A promise that resolves when the sign-out flow has been initiated (redirect mode) or completed (popup mode).

                                                              -
                                                              document.getElementById('logout-btn')!.addEventListener('click', async () => {
                                                              await client.signOut();
                                                              }); +
                                                              await client.signOut();
                                                               
                                                              -
                                                              document.getElementById('logout-popup-btn')!.addEventListener('click', async () => {
                                                              // Opens a popup to perform federated sign-out while keeping the user on the current page.
                                                              await client.signOut({ mode: 'popup' });
                                                              }); +
                                                              await client.signOut({ mode: 'popup' });
                                                               
                                                              -
                                                            +
                                                            diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudAuthBaseError.html index 8ec93b53..85adcde5 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                                                            MonoCloud Authentication SDK
                                                              Preparing search index...

                                                              Base class for all MonoCloud authentication errors.

                                                              All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                                                              -

                                                              Hierarchy

                                                              • Error
                                                                • MonoCloudAuthBaseError
                                                              +

                                                              Hierarchy

                                                              • Error
                                                                • MonoCloudAuthBaseError
                                                              diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudBackendNodeClient.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudBackendNodeClient.html index 4d229ff4..a42eefdf 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudBackendNodeClient.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudBackendNodeClient.html @@ -1,7 +1,7 @@ MonoCloudBackendNodeClient | MonoCloud Authentication SDK
                                                              MonoCloud Authentication SDK
                                                                Preparing search index...

                                                                Backend client for validating access tokens in Node.js server applications.

                                                                Extends the core OIDC backend client with caching support and automatic detection of JWT vs. opaque token formats.

                                                                -

                                                                Hierarchy

                                                                Index

                                                                Hierarchy

                                                                Index
                                                                clockSkew clockTolerance constructor decodeJwt diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudHttpError.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudHttpError.html index 4007d295..e74951d3 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                                                                MonoCloud Authentication SDK
                                                                  Preparing search index...

                                                                  Error thrown when a request to the MonoCloud authorization server fails.

                                                                  This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                                                                  -

                                                                  Hierarchy

                                                                  +

                                                                  Hierarchy

                                                                  diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOPError.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOPError.html index 6a41d41e..8fca4d30 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                                                                  MonoCloud Authentication SDK
                                                                    Preparing search index...

                                                                    OAuth error returned by the authorization server during an authentication or token request.

                                                                    These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                                                                    -

                                                                    Hierarchy

                                                                    Index

                                                                    Hierarchy

                                                                    Index
                                                                    error: string

                                                                    OAuth error code returned by the authorization server.

                                                                    diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOidcBackendClient.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOidcBackendClient.html index f06f8e8d..6a3f885f 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOidcBackendClient.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudOidcBackendClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                    MonoCloud Authentication SDK
                                                                      Preparing search index...

                                                                      Hierarchy

                                                                      Index
                                                                      clockSkew +MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                      MonoCloud Authentication SDK
                                                                        Preparing search index...

                                                                        Hierarchy

                                                                        Index
                                                                        clockSkew clockTolerance constructor decodeJwt diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudTokenError.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudTokenError.html index 1f012434..505ad755 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                                                                        MonoCloud Authentication SDK
                                                                          Preparing search index...

                                                                          Error thrown when a token operation fails.

                                                                          -

                                                                          Hierarchy

                                                                          +

                                                                          Hierarchy

                                                                          diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudValidationError.html b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudValidationError.html index cd0e102a..5b346302 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_express.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                                                          MonoCloud Authentication SDK
                                                                            Preparing search index...

                                                                            Error thrown when validation fails.

                                                                            -

                                                                            Hierarchy

                                                                            +

                                                                            Hierarchy

                                                                            diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudAuthBaseError.html index 2426f3cf..c23dc662 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                                                                            MonoCloud Authentication SDK
                                                                              Preparing search index...

                                                                              Base class for all MonoCloud authentication errors.

                                                                              All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                                                                              -

                                                                              Hierarchy

                                                                              • Error
                                                                                • MonoCloudAuthBaseError
                                                                              +

                                                                              Hierarchy

                                                                              • Error
                                                                                • MonoCloudAuthBaseError
                                                                              diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudBackendNodeClient.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudBackendNodeClient.html index 795814b3..cead7958 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudBackendNodeClient.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudBackendNodeClient.html @@ -1,7 +1,7 @@ MonoCloudBackendNodeClient | MonoCloud Authentication SDK
                                                                              MonoCloud Authentication SDK
                                                                                Preparing search index...

                                                                                Backend client for validating access tokens in Node.js server applications.

                                                                                Extends the core OIDC backend client with caching support and automatic detection of JWT vs. opaque token formats.

                                                                                -

                                                                                Hierarchy

                                                                                Index

                                                                                Hierarchy

                                                                                Index
                                                                                clockSkew clockTolerance constructor decodeJwt diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudHttpError.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudHttpError.html index d3ce21f2..42114ad8 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                                                                                MonoCloud Authentication SDK
                                                                                  Preparing search index...

                                                                                  Error thrown when a request to the MonoCloud authorization server fails.

                                                                                  This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                                                                                  -

                                                                                  Hierarchy

                                                                                  +

                                                                                  Hierarchy

                                                                                  diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOPError.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOPError.html index 6ebc974c..95e12252 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                                                                                  MonoCloud Authentication SDK
                                                                                    Preparing search index...

                                                                                    OAuth error returned by the authorization server during an authentication or token request.

                                                                                    These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                                                                                    -

                                                                                    Hierarchy

                                                                                    Index

                                                                                    Hierarchy

                                                                                    Index
                                                                                    error: string

                                                                                    OAuth error code returned by the authorization server.

                                                                                    diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOidcBackendClient.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOidcBackendClient.html index e3329217..acb2962a 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOidcBackendClient.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudOidcBackendClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                                    MonoCloud Authentication SDK
                                                                                      Preparing search index...

                                                                                      Hierarchy

                                                                                      Index
                                                                                      clockSkew +MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                                      MonoCloud Authentication SDK
                                                                                        Preparing search index...

                                                                                        Hierarchy

                                                                                        Index
                                                                                        clockSkew clockTolerance constructor decodeJwt diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudTokenError.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudTokenError.html index a1a8f461..243d908c 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                                                                                        MonoCloud Authentication SDK
                                                                                          Preparing search index...

                                                                                          Error thrown when a token operation fails.

                                                                                          -

                                                                                          Hierarchy

                                                                                          +

                                                                                          Hierarchy

                                                                                          diff --git a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudValidationError.html b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudValidationError.html index a714bbe4..c1857703 100644 --- a/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_backend-node.frameworks_fastify.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                                                                          MonoCloud Authentication SDK
                                                                                            Preparing search index...

                                                                                            Error thrown when validation fails.

                                                                                            -

                                                                                            Hierarchy

                                                                                            +

                                                                                            Hierarchy

                                                                                            diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudAuthBaseError.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudAuthBaseError.html index fdde7849..cd8ee07c 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudAuthBaseError.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudAuthBaseError.html @@ -1,3 +1,3 @@ MonoCloudAuthBaseError | MonoCloud Authentication SDK
                                                                                            MonoCloud Authentication SDK
                                                                                              Preparing search index...

                                                                                              Base class for all MonoCloud authentication errors.

                                                                                              All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using instanceof.

                                                                                              -

                                                                                              Hierarchy

                                                                                              +

                                                                                              Hierarchy

                                                                                              diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudBackendNodeClient.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudBackendNodeClient.html index 7f83202a..7d50ffcf 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudBackendNodeClient.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudBackendNodeClient.html @@ -1,7 +1,7 @@ MonoCloudBackendNodeClient | MonoCloud Authentication SDK
                                                                                              MonoCloud Authentication SDK
                                                                                                Preparing search index...

                                                                                                Backend client for validating access tokens in Node.js server applications.

                                                                                                Extends the core OIDC backend client with caching support and automatic detection of JWT vs. opaque token formats.

                                                                                                -

                                                                                                Hierarchy

                                                                                                Index

                                                                                                Constructors

                                                                                                Hierarchy

                                                                                                Index

                                                                                                Constructors

                                                                                                Properties

                                                                                                clockSkew clockTolerance fetcher? diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudHttpError.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudHttpError.html index 86fbcc17..58123723 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudHttpError.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudHttpError.html @@ -1,3 +1,3 @@ MonoCloudHttpError | MonoCloud Authentication SDK
                                                                                                MonoCloud Authentication SDK
                                                                                                  Preparing search index...

                                                                                                  Error thrown when a request to the MonoCloud authorization server fails.

                                                                                                  This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server.

                                                                                                  -

                                                                                                  Hierarchy

                                                                                                  +

                                                                                                  Hierarchy

                                                                                                  diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudOPError.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudOPError.html index b00cc745..f1b8c131 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudOPError.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudOPError.html @@ -1,6 +1,6 @@ MonoCloudOPError | MonoCloud Authentication SDK
                                                                                                  MonoCloud Authentication SDK
                                                                                                    Preparing search index...

                                                                                                    OAuth error returned by the authorization server during an authentication or token request.

                                                                                                    These errors correspond to standard OAuth / OpenID Connect error responses such as invalid_request, access_denied, or invalid_grant.

                                                                                                    -

                                                                                                    Hierarchy

                                                                                                    Index

                                                                                                    Constructors

                                                                                                    Hierarchy

                                                                                                    Index

                                                                                                    Constructors

                                                                                                    Properties

                                                                                                    Constructors

                                                                                                    Properties

                                                                                                    error: string

                                                                                                    OAuth error code returned by the authorization server.

                                                                                                    diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudOidcBackendClient.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudOidcBackendClient.html index e7474442..784c72ff 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudOidcBackendClient.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudOidcBackendClient.html @@ -1,4 +1,4 @@ -MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                                                    MonoCloud Authentication SDK
                                                                                                      Preparing search index...

                                                                                                      Hierarchy

                                                                                                      Index

                                                                                                      Constructors

                                                                                                      constructor +MonoCloudOidcBackendClient | MonoCloud Authentication SDK
                                                                                                      MonoCloud Authentication SDK
                                                                                                        Preparing search index...

                                                                                                        Hierarchy

                                                                                                        Index

                                                                                                        Constructors

                                                                                                        Properties

                                                                                                        clockSkew clockTolerance fetcher? diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudTokenError.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudTokenError.html index da047543..58bb1f9a 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudTokenError.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudTokenError.html @@ -1,2 +1,2 @@ MonoCloudTokenError | MonoCloud Authentication SDK
                                                                                                        MonoCloud Authentication SDK
                                                                                                          Preparing search index...

                                                                                                          Error thrown when a token operation fails.

                                                                                                          -

                                                                                                          Hierarchy

                                                                                                          +

                                                                                                          Hierarchy

                                                                                                          diff --git a/docs/html/classes/_monocloud_backend-node.index.MonoCloudValidationError.html b/docs/html/classes/_monocloud_backend-node.index.MonoCloudValidationError.html index 7ea3d5c3..57ecf510 100644 --- a/docs/html/classes/_monocloud_backend-node.index.MonoCloudValidationError.html +++ b/docs/html/classes/_monocloud_backend-node.index.MonoCloudValidationError.html @@ -1,2 +1,2 @@ MonoCloudValidationError | MonoCloud Authentication SDK
                                                                                                          MonoCloud Authentication SDK
                                                                                                            Preparing search index...

                                                                                                            Error thrown when validation fails.

                                                                                                            -

                                                                                                            Hierarchy

                                                                                                            +

                                                                                                            Hierarchy

                                                                                                            diff --git a/docs/html/interfaces/_monocloud_auth-core.index.AccessTokenClaims.html b/docs/html/interfaces/_monocloud_auth-core.index.AccessTokenClaims.html index 9febbdd8..dd150ba0 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.AccessTokenClaims.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.AccessTokenClaims.html @@ -1,5 +1,5 @@ AccessTokenClaims | MonoCloud Authentication SDK
                                                                                                            MonoCloud Authentication SDK
                                                                                                              Preparing search index...

                                                                                                              Claims contained in a validated OAuth 2.0 access token.

                                                                                                              -
                                                                                                              interface AccessTokenClaims {
                                                                                                                  aud: string | string[];
                                                                                                                  client_id?: string;
                                                                                                                  exp: number;
                                                                                                                  iat: number;
                                                                                                                  iss: string;
                                                                                                                  jti?: string;
                                                                                                                  nbf?: number;
                                                                                                                  scope?: string;
                                                                                                                  sub: string;
                                                                                                                  [key: string]: unknown;
                                                                                                              }

                                                                                                              Hierarchy

                                                                                                              Indexable

                                                                                                              • [key: string]: unknown

                                                                                                                Additional custom or provider-specific claims.

                                                                                                                +
                                                                                                              interface AccessTokenClaims {
                                                                                                                  aud: string | string[];
                                                                                                                  client_id?: string;
                                                                                                                  exp: number;
                                                                                                                  iat: number;
                                                                                                                  iss: string;
                                                                                                                  jti?: string;
                                                                                                                  nbf?: number;
                                                                                                                  scope?: string;
                                                                                                                  sub: string;
                                                                                                                  [key: string]: unknown;
                                                                                                              }

                                                                                                              Hierarchy

                                                                                                              Indexable

                                                                                                              • [key: string]: unknown

                                                                                                                Additional custom or provider-specific claims.

                                                                                                              Index

                                                                                                              Properties

                                                                                                              aud client_id? exp diff --git a/docs/html/interfaces/_monocloud_auth-core.index.IdTokenClaims.html b/docs/html/interfaces/_monocloud_auth-core.index.IdTokenClaims.html index be86292c..920c2ae0 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.IdTokenClaims.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.IdTokenClaims.html @@ -1,5 +1,5 @@ IdTokenClaims | MonoCloud Authentication SDK
                                                                                                              MonoCloud Authentication SDK
                                                                                                                Preparing search index...

                                                                                                                Standard OpenID Connect ID Token claims.

                                                                                                                -
                                                                                                                interface IdTokenClaims {
                                                                                                                    acr?: string;
                                                                                                                    address?: Address;
                                                                                                                    amr?: string[];
                                                                                                                    at_hash?: string;
                                                                                                                    aud: string | string[];
                                                                                                                    auth_time?: number;
                                                                                                                    azp?: string;
                                                                                                                    birthdate?: string;
                                                                                                                    c_hash?: string;
                                                                                                                    email?: string;
                                                                                                                    email_verified?: boolean;
                                                                                                                    exp: number;
                                                                                                                    family_name?: string;
                                                                                                                    gender?: string;
                                                                                                                    given_name?: string;
                                                                                                                    groups?: Group[];
                                                                                                                    iat: number;
                                                                                                                    iss: string;
                                                                                                                    locale?: string;
                                                                                                                    middle_name?: string;
                                                                                                                    name?: string;
                                                                                                                    nbf?: number;
                                                                                                                    nickname?: string;
                                                                                                                    nonce?: string;
                                                                                                                    phone_number?: string;
                                                                                                                    phone_number_verified?: boolean;
                                                                                                                    picture?: string;
                                                                                                                    preferred_username?: string;
                                                                                                                    profile?: string;
                                                                                                                    s_hash?: string;
                                                                                                                    sub: string;
                                                                                                                    updated_at?: number;
                                                                                                                    website?: string;
                                                                                                                    zoneinfo?: string;
                                                                                                                    [key: string]: unknown;
                                                                                                                }

                                                                                                                Hierarchy

                                                                                                                Indexable

                                                                                                                • [key: string]: unknown

                                                                                                                  Additional provider-specific claims.

                                                                                                                  +
                                                                                                                interface IdTokenClaims {
                                                                                                                    acr?: string;
                                                                                                                    address?: Address;
                                                                                                                    amr?: string[];
                                                                                                                    at_hash?: string;
                                                                                                                    aud: string | string[];
                                                                                                                    auth_time?: number;
                                                                                                                    azp?: string;
                                                                                                                    birthdate?: string;
                                                                                                                    c_hash?: string;
                                                                                                                    email?: string;
                                                                                                                    email_verified?: boolean;
                                                                                                                    exp: number;
                                                                                                                    family_name?: string;
                                                                                                                    gender?: string;
                                                                                                                    given_name?: string;
                                                                                                                    groups?: Group[];
                                                                                                                    iat: number;
                                                                                                                    iss: string;
                                                                                                                    locale?: string;
                                                                                                                    middle_name?: string;
                                                                                                                    name?: string;
                                                                                                                    nbf?: number;
                                                                                                                    nickname?: string;
                                                                                                                    nonce?: string;
                                                                                                                    phone_number?: string;
                                                                                                                    phone_number_verified?: boolean;
                                                                                                                    picture?: string;
                                                                                                                    preferred_username?: string;
                                                                                                                    profile?: string;
                                                                                                                    s_hash?: string;
                                                                                                                    sub: string;
                                                                                                                    updated_at?: number;
                                                                                                                    website?: string;
                                                                                                                    zoneinfo?: string;
                                                                                                                    [key: string]: unknown;
                                                                                                                }

                                                                                                                Hierarchy

                                                                                                                Indexable

                                                                                                                • [key: string]: unknown

                                                                                                                  Additional provider-specific claims.

                                                                                                                Index

                                                                                                                Properties

                                                                                                                acr? address? amr? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.IntrospectOptions.html b/docs/html/interfaces/_monocloud_auth-core.index.IntrospectOptions.html index 3eb15e5c..80f83615 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.IntrospectOptions.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.IntrospectOptions.html @@ -1,5 +1,5 @@ IntrospectOptions | MonoCloud Authentication SDK
                                                                                                                MonoCloud Authentication SDK
                                                                                                                  Preparing search index...

                                                                                                                  Options for introspecting an opaque access token.

                                                                                                                  -
                                                                                                                  interface IntrospectOptions {
                                                                                                                      clientCertificate?: string;
                                                                                                                      groups?: string[];
                                                                                                                      scopes?: string[];
                                                                                                                      validateCertificateBinding?: boolean;
                                                                                                                  }

                                                                                                                  Hierarchy

                                                                                                                  Index

                                                                                                                  Properties

                                                                                                                  interface IntrospectOptions {
                                                                                                                      clientCertificate?: string;
                                                                                                                      groups?: string[];
                                                                                                                      scopes?: string[];
                                                                                                                      validateCertificateBinding?: boolean;
                                                                                                                  }

                                                                                                                  Hierarchy

                                                                                                                  Index

                                                                                                                  Properties

                                                                                                                  clientCertificate? groups? scopes? validateCertificateBinding? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.JwtClaims.html b/docs/html/interfaces/_monocloud_auth-core.index.JwtClaims.html index 91aee088..af046813 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.JwtClaims.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.JwtClaims.html @@ -1,5 +1,5 @@ JwtClaims | MonoCloud Authentication SDK
                                                                                                                  MonoCloud Authentication SDK
                                                                                                                    Preparing search index...

                                                                                                                    Standard JWT claims shared between ID tokens and access tokens.

                                                                                                                    -
                                                                                                                    interface JwtClaims {
                                                                                                                        aud: string | string[];
                                                                                                                        exp: number;
                                                                                                                        iat: number;
                                                                                                                        iss: string;
                                                                                                                        nbf?: number;
                                                                                                                        sub: string;
                                                                                                                        [key: string]: unknown;
                                                                                                                    }

                                                                                                                    Hierarchy

                                                                                                                    Indexable

                                                                                                                    • [key: string]: unknown

                                                                                                                      Additional custom or provider-specific claims.

                                                                                                                      +
                                                                                                                    interface JwtClaims {
                                                                                                                        aud: string | string[];
                                                                                                                        exp: number;
                                                                                                                        iat: number;
                                                                                                                        iss: string;
                                                                                                                        nbf?: number;
                                                                                                                        sub: string;
                                                                                                                        [key: string]: unknown;
                                                                                                                    }

                                                                                                                    Hierarchy

                                                                                                                    Indexable

                                                                                                                    • [key: string]: unknown

                                                                                                                      Additional custom or provider-specific claims.

                                                                                                                    Index

                                                                                                                    Properties

                                                                                                                    aud exp iat diff --git a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudClientOptionsBase.html b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudClientOptionsBase.html index 53bc54d2..d8d6a2f3 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudClientOptionsBase.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudClientOptionsBase.html @@ -1,7 +1,7 @@ MonoCloudClientOptionsBase | MonoCloud Authentication SDK
                                                                                                                    MonoCloud Authentication SDK
                                                                                                                      Preparing search index...

                                                                                                                      Interface MonoCloudClientOptionsBase

                                                                                                                      Shared configuration options for MonoCloud OIDC clients.

                                                                                                                      These options are common to both MonoCloudOidcClientOptions and MonoCloudOidcBackendClientOptions.

                                                                                                                      -
                                                                                                                      interface MonoCloudClientOptionsBase {
                                                                                                                          clientAuthMethod?: ClientAuthMethod;
                                                                                                                          clientSecret?: string | Jwk;
                                                                                                                          fetcher?: {
                                                                                                                              (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                              (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                          };
                                                                                                                          jwksCacheDuration?: number;
                                                                                                                          metadataCacheDuration?: number;
                                                                                                                      }

                                                                                                                      Hierarchy

                                                                                                                      Index

                                                                                                                      Properties

                                                                                                                      interface MonoCloudClientOptionsBase {
                                                                                                                          clientAuthMethod?: ClientAuthMethod;
                                                                                                                          clientSecret?: string | Jwk;
                                                                                                                          fetcher?: {
                                                                                                                              (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                              (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                          };
                                                                                                                          jwksCacheDuration?: number;
                                                                                                                          metadataCacheDuration?: number;
                                                                                                                      }

                                                                                                                      Hierarchy

                                                                                                                      Index

                                                                                                                      Properties

                                                                                                                      clientAuthMethod? clientSecret? fetcher? jwksCacheDuration? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcBackendClientOptions.html b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcBackendClientOptions.html index f0df0dd5..8f66f3e4 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcBackendClientOptions.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcBackendClientOptions.html @@ -1,5 +1,5 @@ MonoCloudOidcBackendClientOptions | MonoCloud Authentication SDK
                                                                                                                      MonoCloud Authentication SDK
                                                                                                                        Preparing search index...

                                                                                                                        Interface MonoCloudOidcBackendClientOptions

                                                                                                                        Configuration options used to initialize the MonoCloudOidcBackendClient.

                                                                                                                        -
                                                                                                                        interface MonoCloudOidcBackendClientOptions {
                                                                                                                            clientAuthMethod?: ClientAuthMethod;
                                                                                                                            clientId?: string;
                                                                                                                            clientSecret?: string | Jwk;
                                                                                                                            clockSkew?: number;
                                                                                                                            clockTolerance?: number;
                                                                                                                            fetcher?: {
                                                                                                                                (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                                (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                            };
                                                                                                                            groupOptions?: IsUserInGroupOptions;
                                                                                                                            jwksCacheDuration?: number;
                                                                                                                            metadataCacheDuration?: number;
                                                                                                                        }

                                                                                                                        Hierarchy

                                                                                                                        Index

                                                                                                                        Properties

                                                                                                                        interface MonoCloudOidcBackendClientOptions {
                                                                                                                            clientAuthMethod?: ClientAuthMethod;
                                                                                                                            clientId?: string;
                                                                                                                            clientSecret?: string | Jwk;
                                                                                                                            clockSkew?: number;
                                                                                                                            clockTolerance?: number;
                                                                                                                            fetcher?: {
                                                                                                                                (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                                (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                            };
                                                                                                                            groupOptions?: IsUserInGroupOptions;
                                                                                                                            jwksCacheDuration?: number;
                                                                                                                            metadataCacheDuration?: number;
                                                                                                                        }

                                                                                                                        Hierarchy

                                                                                                                        Index

                                                                                                                        Properties

                                                                                                                        clientAuthMethod? clientId? clientSecret? clockSkew? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcClientOptions.html b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcClientOptions.html index 0b6cec0c..854e91a2 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcClientOptions.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudOidcClientOptions.html @@ -1,5 +1,5 @@ MonoCloudOidcClientOptions | MonoCloud Authentication SDK
                                                                                                                        MonoCloud Authentication SDK
                                                                                                                          Preparing search index...

                                                                                                                          Interface MonoCloudOidcClientOptions

                                                                                                                          Configuration options used to initialize the MonoCloudOidcClient.

                                                                                                                          -
                                                                                                                          interface MonoCloudOidcClientOptions {
                                                                                                                              clientAuthMethod?: ClientAuthMethod;
                                                                                                                              clientSecret?: string | Jwk;
                                                                                                                              fetcher?: {
                                                                                                                                  (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                                  (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                              };
                                                                                                                              idTokenSigningAlgorithm?: SecurityAlgorithms;
                                                                                                                              jwksCacheDuration?: number;
                                                                                                                              metadataCacheDuration?: number;
                                                                                                                          }

                                                                                                                          Hierarchy

                                                                                                                          Index

                                                                                                                          Properties

                                                                                                                          interface MonoCloudOidcClientOptions {
                                                                                                                              clientAuthMethod?: ClientAuthMethod;
                                                                                                                              clientSecret?: string | Jwk;
                                                                                                                              fetcher?: {
                                                                                                                                  (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
                                                                                                                                  (input: string | URL | Request, init?: RequestInit): Promise<Response>;
                                                                                                                              };
                                                                                                                              idTokenSigningAlgorithm?: SecurityAlgorithms;
                                                                                                                              jwksCacheDuration?: number;
                                                                                                                              metadataCacheDuration?: number;
                                                                                                                          }

                                                                                                                          Hierarchy

                                                                                                                          Index

                                                                                                                          Properties

                                                                                                                          clientAuthMethod? clientSecret? fetcher? idTokenSigningAlgorithm? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudUser.html b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudUser.html index 5ab4ae1b..bbed576a 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudUser.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.MonoCloudUser.html @@ -1,5 +1,5 @@ MonoCloudUser | MonoCloud Authentication SDK
                                                                                                                          MonoCloud Authentication SDK
                                                                                                                            Preparing search index...

                                                                                                                            Represents the authenticated user stored in a MonoCloud session.

                                                                                                                            -
                                                                                                                            interface MonoCloudUser {
                                                                                                                                address?: Address;
                                                                                                                                amr?: string[];
                                                                                                                                birthdate?: string;
                                                                                                                                email?: string;
                                                                                                                                email_verified?: boolean;
                                                                                                                                family_name?: string;
                                                                                                                                gender?: string;
                                                                                                                                given_name?: string;
                                                                                                                                groups?: Group[];
                                                                                                                                idp?: string;
                                                                                                                                locale?: string;
                                                                                                                                middle_name?: string;
                                                                                                                                name?: string;
                                                                                                                                nickname?: string;
                                                                                                                                phone_number?: string;
                                                                                                                                phone_number_verified?: boolean;
                                                                                                                                picture?: string;
                                                                                                                                preferred_username?: string;
                                                                                                                                profile?: string;
                                                                                                                                sub: string;
                                                                                                                                updated_at?: number;
                                                                                                                                website?: string;
                                                                                                                                zoneinfo?: string;
                                                                                                                                [key: string]: unknown;
                                                                                                                            }

                                                                                                                            Hierarchy

                                                                                                                            Indexable

                                                                                                                            • [key: string]: unknown

                                                                                                                              Additional provider-specific claims.

                                                                                                                              +
                                                                                                                            interface MonoCloudUser {
                                                                                                                                address?: Address;
                                                                                                                                amr?: string[];
                                                                                                                                birthdate?: string;
                                                                                                                                email?: string;
                                                                                                                                email_verified?: boolean;
                                                                                                                                family_name?: string;
                                                                                                                                gender?: string;
                                                                                                                                given_name?: string;
                                                                                                                                groups?: Group[];
                                                                                                                                idp?: string;
                                                                                                                                locale?: string;
                                                                                                                                middle_name?: string;
                                                                                                                                name?: string;
                                                                                                                                nickname?: string;
                                                                                                                                phone_number?: string;
                                                                                                                                phone_number_verified?: boolean;
                                                                                                                                picture?: string;
                                                                                                                                preferred_username?: string;
                                                                                                                                profile?: string;
                                                                                                                                sub: string;
                                                                                                                                updated_at?: number;
                                                                                                                                website?: string;
                                                                                                                                zoneinfo?: string;
                                                                                                                                [key: string]: unknown;
                                                                                                                            }

                                                                                                                            Hierarchy

                                                                                                                            Indexable

                                                                                                                            • [key: string]: unknown

                                                                                                                              Additional provider-specific claims.

                                                                                                                            Index

                                                                                                                            Properties

                                                                                                                            address? amr? birthdate? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.PushedAuthorizationParams.html b/docs/html/interfaces/_monocloud_auth-core.index.PushedAuthorizationParams.html index d1c690ec..958bcd25 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.PushedAuthorizationParams.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.PushedAuthorizationParams.html @@ -2,7 +2,7 @@

                                                                                                                            This type mirrors AuthorizationParams but excludes requestUri, since the request_uri value is generated by the authorization server after a successful PAR request and must not be supplied by the client.

                                                                                                                            -
                                                                                                                            interface PushedAuthorizationParams {
                                                                                                                                acrValues?: string[];
                                                                                                                                authenticatorHint?: Authenticators;
                                                                                                                                codeChallenge?: string;
                                                                                                                                codeChallengeMethod?: CodeChallengeMethod;
                                                                                                                                display?: DisplayOptions;
                                                                                                                                loginHint?: string;
                                                                                                                                maxAge?: number;
                                                                                                                                nonce?: string;
                                                                                                                                prompt?: Prompt;
                                                                                                                                redirectUri?: string;
                                                                                                                                request?: string;
                                                                                                                                resource?: string;
                                                                                                                                responseMode?: ResponseModes;
                                                                                                                                responseType?: ResponseTypes;
                                                                                                                                scopes?: string;
                                                                                                                                state?: string;
                                                                                                                                uiLocales?: string;
                                                                                                                            }

                                                                                                                            Hierarchy

                                                                                                                            Index

                                                                                                                            Properties

                                                                                                                            interface PushedAuthorizationParams {
                                                                                                                                acrValues?: string[];
                                                                                                                                authenticatorHint?: Authenticators;
                                                                                                                                codeChallenge?: string;
                                                                                                                                codeChallengeMethod?: CodeChallengeMethod;
                                                                                                                                display?: DisplayOptions;
                                                                                                                                loginHint?: string;
                                                                                                                                maxAge?: number;
                                                                                                                                nonce?: string;
                                                                                                                                prompt?: Prompt;
                                                                                                                                redirectUri?: string;
                                                                                                                                request?: string;
                                                                                                                                resource?: string;
                                                                                                                                responseMode?: ResponseModes;
                                                                                                                                responseType?: ResponseTypes;
                                                                                                                                scopes?: string;
                                                                                                                                state?: string;
                                                                                                                                uiLocales?: string;
                                                                                                                            }

                                                                                                                            Hierarchy

                                                                                                                            Index

                                                                                                                            Properties

                                                                                                                            acrValues? authenticatorHint? codeChallenge? codeChallengeMethod? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.RefreshGrantOptions.html b/docs/html/interfaces/_monocloud_auth-core.index.RefreshGrantOptions.html index 33d30f16..569dd1d7 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.RefreshGrantOptions.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.RefreshGrantOptions.html @@ -1,6 +1,6 @@ RefreshGrantOptions | MonoCloud Authentication SDK
                                                                                                                            MonoCloud Authentication SDK
                                                                                                                              Preparing search index...

                                                                                                                              Options used when exchanging a refresh token for a new access token.

                                                                                                                              These parameters allow requesting an access token scoped to specific resources or scopes that were previously authorized by the user.

                                                                                                                              -
                                                                                                                              interface RefreshGrantOptions {
                                                                                                                                  resource?: string;
                                                                                                                                  scopes?: string;
                                                                                                                              }

                                                                                                                              Hierarchy

                                                                                                                              Index

                                                                                                                              Properties

                                                                                                                              interface RefreshGrantOptions {
                                                                                                                                  resource?: string;
                                                                                                                                  scopes?: string;
                                                                                                                              }

                                                                                                                              Hierarchy

                                                                                                                              Index

                                                                                                                              Properties

                                                                                                                              Properties

                                                                                                                              resource?: string

                                                                                                                              Space-separated list of resource indicators that the new access token should be issued for.

                                                                                                                              The requested resources must have been previously granted during the original authorization flow.

                                                                                                                              diff --git a/docs/html/interfaces/_monocloud_auth-core.index.TokenValidationOptionsBase.html b/docs/html/interfaces/_monocloud_auth-core.index.TokenValidationOptionsBase.html index e4d65ea9..a46f1edd 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.TokenValidationOptionsBase.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.TokenValidationOptionsBase.html @@ -1,5 +1,5 @@ TokenValidationOptionsBase | MonoCloud Authentication SDK
                                                                                                                              MonoCloud Authentication SDK
                                                                                                                                Preparing search index...

                                                                                                                                Interface TokenValidationOptionsBase

                                                                                                                                Shared options for token validation and introspection.

                                                                                                                                -
                                                                                                                                interface TokenValidationOptionsBase {
                                                                                                                                    clientCertificate?: string;
                                                                                                                                    groups?: string[];
                                                                                                                                    scopes?: string[];
                                                                                                                                    validateCertificateBinding?: boolean;
                                                                                                                                }

                                                                                                                                Hierarchy

                                                                                                                                Index

                                                                                                                                Properties

                                                                                                                                interface TokenValidationOptionsBase {
                                                                                                                                    clientCertificate?: string;
                                                                                                                                    groups?: string[];
                                                                                                                                    scopes?: string[];
                                                                                                                                    validateCertificateBinding?: boolean;
                                                                                                                                }

                                                                                                                                Hierarchy

                                                                                                                                Index

                                                                                                                                Properties

                                                                                                                                clientCertificate? groups? scopes? validateCertificateBinding? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.UserinfoResponse.html b/docs/html/interfaces/_monocloud_auth-core.index.UserinfoResponse.html index 03d9d22f..bb553245 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.UserinfoResponse.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.UserinfoResponse.html @@ -1,6 +1,6 @@ UserinfoResponse | MonoCloud Authentication SDK
                                                                                                                                MonoCloud Authentication SDK
                                                                                                                                  Preparing search index...

                                                                                                                                  Interface UserinfoResponse<TAddress>

                                                                                                                                  Represents the OpenID Connect UserInfo response.

                                                                                                                                  interface UserinfoResponse<TAddress extends Address = Address> {
                                                                                                                                      address?: TAddress;
                                                                                                                                      birthdate?: string;
                                                                                                                                      email?: string;
                                                                                                                                      email_verified?: boolean;
                                                                                                                                      family_name?: string;
                                                                                                                                      gender?: string;
                                                                                                                                      given_name?: string;
                                                                                                                                      groups?: Group[];
                                                                                                                                      locale?: string;
                                                                                                                                      middle_name?: string;
                                                                                                                                      name?: string;
                                                                                                                                      nickname?: string;
                                                                                                                                      phone_number?: string;
                                                                                                                                      phone_number_verified?: boolean;
                                                                                                                                      picture?: string;
                                                                                                                                      preferred_username?: string;
                                                                                                                                      profile?: string;
                                                                                                                                      sub: string;
                                                                                                                                      updated_at?: number;
                                                                                                                                      website?: string;
                                                                                                                                      zoneinfo?: string;
                                                                                                                                      [key: string]: unknown;
                                                                                                                                  }

                                                                                                                                  Type Parameters

                                                                                                                                  Hierarchy

                                                                                                                                  Indexable

                                                                                                                                  • [key: string]: unknown

                                                                                                                                    Additional provider-specific claims.

                                                                                                                                    +

                                                                                                                                  Hierarchy

                                                                                                                                  Indexable

                                                                                                                                  • [key: string]: unknown

                                                                                                                                    Additional provider-specific claims.

                                                                                                                                  Index

                                                                                                                                  Properties

                                                                                                                                  address? birthdate? email? diff --git a/docs/html/interfaces/_monocloud_auth-core.index.ValidateJwtAccessTokenOptions.html b/docs/html/interfaces/_monocloud_auth-core.index.ValidateJwtAccessTokenOptions.html index a358e441..787ffd9c 100644 --- a/docs/html/interfaces/_monocloud_auth-core.index.ValidateJwtAccessTokenOptions.html +++ b/docs/html/interfaces/_monocloud_auth-core.index.ValidateJwtAccessTokenOptions.html @@ -1,5 +1,5 @@ ValidateJwtAccessTokenOptions | MonoCloud Authentication SDK
                                                                                                                                  MonoCloud Authentication SDK
                                                                                                                                    Preparing search index...

                                                                                                                                    Interface ValidateJwtAccessTokenOptions

                                                                                                                                    Options for validating a JWT access token.

                                                                                                                                    -
                                                                                                                                    interface ValidateJwtAccessTokenOptions {
                                                                                                                                        clientCertificate?: string;
                                                                                                                                        groups?: string[];
                                                                                                                                        jwks?: Jwks;
                                                                                                                                        scopes?: string[];
                                                                                                                                        validateCertificateBinding?: boolean;
                                                                                                                                    }

                                                                                                                                    Hierarchy

                                                                                                                                    Index

                                                                                                                                    Properties

                                                                                                                                    interface ValidateJwtAccessTokenOptions {
                                                                                                                                        clientCertificate?: string;
                                                                                                                                        groups?: string[];
                                                                                                                                        jwks?: Jwks;
                                                                                                                                        scopes?: string[];
                                                                                                                                        validateCertificateBinding?: boolean;
                                                                                                                                    }

                                                                                                                                    Hierarchy

                                                                                                                                    Index

                                                                                                                                    Properties

                                                                                                                                    clientCertificate? groups? jwks? scopes? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.client.ProtectClientPageOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.client.ProtectClientPageOptions.html index 0a267760..2f8a2903 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.client.ProtectClientPageOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.client.ProtectClientPageOptions.html @@ -1,5 +1,5 @@ ProtectClientPageOptions | MonoCloud Authentication SDK
                                                                                                                                    MonoCloud Authentication SDK
                                                                                                                                      Preparing search index...

                                                                                                                                      Options for configuring page protection.

                                                                                                                                      -
                                                                                                                                      interface ProtectClientPageOptions {
                                                                                                                                          authParams?: ExtraAuthParams;
                                                                                                                                          groups?: string[];
                                                                                                                                          groupsClaim?: string;
                                                                                                                                          matchAll?: boolean;
                                                                                                                                          onAccessDenied?: () => ReactNode;
                                                                                                                                          onError?: (error: Error) => ReactNode;
                                                                                                                                          onGroupAccessDenied?: (user: MonoCloudUser) => ReactNode;
                                                                                                                                          returnUrl?: string;
                                                                                                                                      }

                                                                                                                                      Hierarchy

                                                                                                                                      Index

                                                                                                                                      Properties

                                                                                                                                      interface ProtectClientPageOptions {
                                                                                                                                          authParams?: ExtraAuthParams;
                                                                                                                                          groups?: string[];
                                                                                                                                          groupsClaim?: string;
                                                                                                                                          matchAll?: boolean;
                                                                                                                                          onAccessDenied?: () => ReactNode;
                                                                                                                                          onError?: (error: Error) => ReactNode;
                                                                                                                                          onGroupAccessDenied?: (user: MonoCloudUser) => ReactNode;
                                                                                                                                          returnUrl?: string;
                                                                                                                                      }

                                                                                                                                      Hierarchy

                                                                                                                                      Index

                                                                                                                                      Properties

                                                                                                                                      authParams? groups? groupsClaim? matchAll? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.components.SignInProps.html b/docs/html/interfaces/_monocloud_auth-nextjs.components.SignInProps.html index f134b8ee..4e6f03aa 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.components.SignInProps.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.components.SignInProps.html @@ -1,5 +1,5 @@ SignInProps | MonoCloud Authentication SDK
                                                                                                                                      MonoCloud Authentication SDK
                                                                                                                                        Preparing search index...

                                                                                                                                        Props for the <SignIn /> component.

                                                                                                                                        -
                                                                                                                                        interface SignInProps {
                                                                                                                                            acrValues?: string[];
                                                                                                                                            authenticatorHint?: Authenticators;
                                                                                                                                            children: ReactNode;
                                                                                                                                            display?: DisplayOptions;
                                                                                                                                            loginHint?: string;
                                                                                                                                            maxAge?: number;
                                                                                                                                            prompt?: Prompt;
                                                                                                                                            resource?: string;
                                                                                                                                            returnUrl?: string;
                                                                                                                                            scopes?: string;
                                                                                                                                            uiLocales?: string;
                                                                                                                                        }

                                                                                                                                        Hierarchy

                                                                                                                                        Index

                                                                                                                                        Properties

                                                                                                                                        interface SignInProps {
                                                                                                                                            acrValues?: string[];
                                                                                                                                            authenticatorHint?: Authenticators;
                                                                                                                                            children: ReactNode;
                                                                                                                                            display?: DisplayOptions;
                                                                                                                                            loginHint?: string;
                                                                                                                                            maxAge?: number;
                                                                                                                                            prompt?: Prompt;
                                                                                                                                            resource?: string;
                                                                                                                                            returnUrl?: string;
                                                                                                                                            scopes?: string;
                                                                                                                                            uiLocales?: string;
                                                                                                                                        }

                                                                                                                                        Hierarchy

                                                                                                                                        Index

                                                                                                                                        Properties

                                                                                                                                        acrValues? authenticatorHint? children display? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.components.SignUpProps.html b/docs/html/interfaces/_monocloud_auth-nextjs.components.SignUpProps.html index f36303ff..8395e5b4 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.components.SignUpProps.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.components.SignUpProps.html @@ -1,5 +1,5 @@ SignUpProps | MonoCloud Authentication SDK
                                                                                                                                        MonoCloud Authentication SDK
                                                                                                                                          Preparing search index...

                                                                                                                                          Props for the <SignUp /> component.

                                                                                                                                          -
                                                                                                                                          interface SignUpProps {
                                                                                                                                              acrValues?: string[];
                                                                                                                                              display?: DisplayOptions;
                                                                                                                                              maxAge?: number;
                                                                                                                                              resource?: string;
                                                                                                                                              returnUrl?: string;
                                                                                                                                              scopes?: string;
                                                                                                                                              uiLocales?: string;
                                                                                                                                          }

                                                                                                                                          Hierarchy

                                                                                                                                          • Omit<ExtraAuthParams, "authenticatorHint" | "loginHint" | "prompt">
                                                                                                                                            • SignUpProps
                                                                                                                                          Index

                                                                                                                                          Properties

                                                                                                                                          interface SignUpProps {
                                                                                                                                              acrValues?: string[];
                                                                                                                                              display?: DisplayOptions;
                                                                                                                                              maxAge?: number;
                                                                                                                                              resource?: string;
                                                                                                                                              returnUrl?: string;
                                                                                                                                              scopes?: string;
                                                                                                                                              uiLocales?: string;
                                                                                                                                          }

                                                                                                                                          Hierarchy

                                                                                                                                          • Omit<ExtraAuthParams, "authenticatorHint" | "loginHint" | "prompt">
                                                                                                                                            • SignUpProps
                                                                                                                                          Index

                                                                                                                                          Properties

                                                                                                                                          acrValues? display? maxAge? resource? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.components_client.RedirectToSignInProps.html b/docs/html/interfaces/_monocloud_auth-nextjs.components_client.RedirectToSignInProps.html index cca7fd18..dd8a8155 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.components_client.RedirectToSignInProps.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.components_client.RedirectToSignInProps.html @@ -1,5 +1,5 @@ RedirectToSignInProps | MonoCloud Authentication SDK
                                                                                                                                          MonoCloud Authentication SDK
                                                                                                                                            Preparing search index...

                                                                                                                                            Props for the <RedirectToSignIn /> Component

                                                                                                                                            -
                                                                                                                                            interface RedirectToSignInProps {
                                                                                                                                                acrValues?: string[];
                                                                                                                                                authenticatorHint?: Authenticators;
                                                                                                                                                display?: DisplayOptions;
                                                                                                                                                loginHint?: string;
                                                                                                                                                maxAge?: number;
                                                                                                                                                prompt?: Prompt;
                                                                                                                                                resource?: string;
                                                                                                                                                returnUrl?: string;
                                                                                                                                                scopes?: string;
                                                                                                                                                uiLocales?: string;
                                                                                                                                            }

                                                                                                                                            Hierarchy

                                                                                                                                            Index

                                                                                                                                            Properties

                                                                                                                                            interface RedirectToSignInProps {
                                                                                                                                                acrValues?: string[];
                                                                                                                                                authenticatorHint?: Authenticators;
                                                                                                                                                display?: DisplayOptions;
                                                                                                                                                loginHint?: string;
                                                                                                                                                maxAge?: number;
                                                                                                                                                prompt?: Prompt;
                                                                                                                                                resource?: string;
                                                                                                                                                returnUrl?: string;
                                                                                                                                                scopes?: string;
                                                                                                                                                uiLocales?: string;
                                                                                                                                            }

                                                                                                                                            Hierarchy

                                                                                                                                            Index

                                                                                                                                            Properties

                                                                                                                                            acrValues? authenticatorHint? display? loginHint? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.AccessToken.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.AccessToken.html index 7d32ef1e..b07cbd5c 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.AccessToken.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.AccessToken.html @@ -1,5 +1,5 @@ AccessToken | MonoCloud Authentication SDK
                                                                                                                                            MonoCloud Authentication SDK
                                                                                                                                              Preparing search index...

                                                                                                                                              Represents an OAuth 2.0 access token and its associated metadata.

                                                                                                                                              -
                                                                                                                                              interface AccessToken {
                                                                                                                                                  accessToken: string;
                                                                                                                                                  accessTokenExpiration: number;
                                                                                                                                                  requestedScopes?: string;
                                                                                                                                                  resource?: string;
                                                                                                                                                  scopes: string;
                                                                                                                                              }

                                                                                                                                              Hierarchy

                                                                                                                                              Index

                                                                                                                                              Properties

                                                                                                                                              interface AccessToken {
                                                                                                                                                  accessToken: string;
                                                                                                                                                  accessTokenExpiration: number;
                                                                                                                                                  requestedScopes?: string;
                                                                                                                                                  resource?: string;
                                                                                                                                                  scopes: string;
                                                                                                                                              }

                                                                                                                                              Hierarchy

                                                                                                                                              Index

                                                                                                                                              Properties

                                                                                                                                              accessToken accessTokenExpiration requestedScopes? resource? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ApplicationState.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ApplicationState.html index 5f48bbe7..ad4dd4e0 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ApplicationState.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ApplicationState.html @@ -1,3 +1,3 @@ ApplicationState | MonoCloud Authentication SDK
                                                                                                                                              MonoCloud Authentication SDK
                                                                                                                                                Preparing search index...

                                                                                                                                                Represents custom application state associated with an authentication request.

                                                                                                                                                This object is populated via onSetApplicationState and is persisted through the authentication flow. The resolved value is later available during session creation and can be used to carry application-specific context (for example: return targets, workflow state, or tenant hints).

                                                                                                                                                -

                                                                                                                                                Hierarchy

                                                                                                                                                • Record<string, any>
                                                                                                                                                  • ApplicationState

                                                                                                                                                Indexable

                                                                                                                                                • [key: string]: any
                                                                                                                                                +

                                                                                                                                                Hierarchy

                                                                                                                                                • Record<string, any>
                                                                                                                                                  • ApplicationState

                                                                                                                                                Indexable

                                                                                                                                                • [key: string]: any
                                                                                                                                                diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ExtraAuthParams.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ExtraAuthParams.html index 35ce6dc1..8cb2a2f6 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ExtraAuthParams.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ExtraAuthParams.html @@ -1,5 +1,5 @@ ExtraAuthParams | MonoCloud Authentication SDK
                                                                                                                                                MonoCloud Authentication SDK
                                                                                                                                                  Preparing search index...

                                                                                                                                                  A subset of authorization parameters supported by client-side helpers.

                                                                                                                                                  -
                                                                                                                                                  interface ExtraAuthParams {
                                                                                                                                                      acrValues?: string[];
                                                                                                                                                      authenticatorHint?: Authenticators;
                                                                                                                                                      display?: DisplayOptions;
                                                                                                                                                      loginHint?: string;
                                                                                                                                                      maxAge?: number;
                                                                                                                                                      prompt?: Prompt;
                                                                                                                                                      resource?: string;
                                                                                                                                                      scopes?: string;
                                                                                                                                                      uiLocales?: string;
                                                                                                                                                  }

                                                                                                                                                  Hierarchy

                                                                                                                                                  Index

                                                                                                                                                  Properties

                                                                                                                                                  interface ExtraAuthParams {
                                                                                                                                                      acrValues?: string[];
                                                                                                                                                      authenticatorHint?: Authenticators;
                                                                                                                                                      display?: DisplayOptions;
                                                                                                                                                      loginHint?: string;
                                                                                                                                                      maxAge?: number;
                                                                                                                                                      prompt?: Prompt;
                                                                                                                                                      resource?: string;
                                                                                                                                                      scopes?: string;
                                                                                                                                                      uiLocales?: string;
                                                                                                                                                  }

                                                                                                                                                  Hierarchy

                                                                                                                                                  Index

                                                                                                                                                  Properties

                                                                                                                                                  acrValues? authenticatorHint? display? loginHint? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.GetTokensOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.GetTokensOptions.html index 781771e9..e0580921 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.GetTokensOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.GetTokensOptions.html @@ -1,5 +1,5 @@ GetTokensOptions | MonoCloud Authentication SDK
                                                                                                                                                  MonoCloud Authentication SDK
                                                                                                                                                    Preparing search index...

                                                                                                                                                    Options used to control token retrieval and refresh behavior when calling getTokens().

                                                                                                                                                    -
                                                                                                                                                    interface GetTokensOptions {
                                                                                                                                                        forceRefresh?: boolean;
                                                                                                                                                        refetchUserInfo?: boolean;
                                                                                                                                                        resource?: string;
                                                                                                                                                        scopes?: string;
                                                                                                                                                    }

                                                                                                                                                    Hierarchy

                                                                                                                                                    Index

                                                                                                                                                    Properties

                                                                                                                                                    interface GetTokensOptions {
                                                                                                                                                        forceRefresh?: boolean;
                                                                                                                                                        refetchUserInfo?: boolean;
                                                                                                                                                        resource?: string;
                                                                                                                                                        scopes?: string;
                                                                                                                                                    }

                                                                                                                                                    Hierarchy

                                                                                                                                                    Index

                                                                                                                                                    Properties

                                                                                                                                                    forceRefresh? refetchUserInfo? resource? scopes? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.GroupOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.GroupOptions.html index cb12b534..00c300d7 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.GroupOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.GroupOptions.html @@ -1,5 +1,5 @@ GroupOptions | MonoCloud Authentication SDK
                                                                                                                                                    MonoCloud Authentication SDK
                                                                                                                                                      Preparing search index...

                                                                                                                                                      Configuration options that require the user to belong to specific groups.

                                                                                                                                                      -
                                                                                                                                                      interface GroupOptions {
                                                                                                                                                          groups?: string[];
                                                                                                                                                          groupsClaim?: string;
                                                                                                                                                          matchAll?: boolean;
                                                                                                                                                      }

                                                                                                                                                      Hierarchy

                                                                                                                                                      Index

                                                                                                                                                      Properties

                                                                                                                                                      interface GroupOptions {
                                                                                                                                                          groups?: string[];
                                                                                                                                                          groupsClaim?: string;
                                                                                                                                                          matchAll?: boolean;
                                                                                                                                                      }

                                                                                                                                                      Hierarchy

                                                                                                                                                      Index

                                                                                                                                                      Properties

                                                                                                                                                      groups?: string[]

                                                                                                                                                      A list of group IDs or group names the authenticated user must belong to.

                                                                                                                                                      diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.IdTokenClaims.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.IdTokenClaims.html index a6419b03..f57347f8 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.IdTokenClaims.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.IdTokenClaims.html @@ -1,5 +1,5 @@ IdTokenClaims | MonoCloud Authentication SDK
                                                                                                                                                      MonoCloud Authentication SDK
                                                                                                                                                        Preparing search index...

                                                                                                                                                        Standard OpenID Connect ID Token claims.

                                                                                                                                                        -
                                                                                                                                                        interface IdTokenClaims {
                                                                                                                                                            acr?: string;
                                                                                                                                                            address?: Address;
                                                                                                                                                            amr?: string[];
                                                                                                                                                            at_hash?: string;
                                                                                                                                                            aud: string | string[];
                                                                                                                                                            auth_time?: number;
                                                                                                                                                            azp?: string;
                                                                                                                                                            birthdate?: string;
                                                                                                                                                            c_hash?: string;
                                                                                                                                                            email?: string;
                                                                                                                                                            email_verified?: boolean;
                                                                                                                                                            exp: number;
                                                                                                                                                            family_name?: string;
                                                                                                                                                            gender?: string;
                                                                                                                                                            given_name?: string;
                                                                                                                                                            groups?: Group[];
                                                                                                                                                            iat: number;
                                                                                                                                                            iss: string;
                                                                                                                                                            locale?: string;
                                                                                                                                                            middle_name?: string;
                                                                                                                                                            name?: string;
                                                                                                                                                            nbf?: number;
                                                                                                                                                            nickname?: string;
                                                                                                                                                            nonce?: string;
                                                                                                                                                            phone_number?: string;
                                                                                                                                                            phone_number_verified?: boolean;
                                                                                                                                                            picture?: string;
                                                                                                                                                            preferred_username?: string;
                                                                                                                                                            profile?: string;
                                                                                                                                                            s_hash?: string;
                                                                                                                                                            sub: string;
                                                                                                                                                            updated_at?: number;
                                                                                                                                                            website?: string;
                                                                                                                                                            zoneinfo?: string;
                                                                                                                                                            [key: string]: unknown;
                                                                                                                                                        }

                                                                                                                                                        Hierarchy

                                                                                                                                                        Indexable

                                                                                                                                                        • [key: string]: unknown

                                                                                                                                                          Additional provider-specific claims.

                                                                                                                                                          +
                                                                                                                                                        interface IdTokenClaims {
                                                                                                                                                            acr?: string;
                                                                                                                                                            address?: Address;
                                                                                                                                                            amr?: string[];
                                                                                                                                                            at_hash?: string;
                                                                                                                                                            aud: string | string[];
                                                                                                                                                            auth_time?: number;
                                                                                                                                                            azp?: string;
                                                                                                                                                            birthdate?: string;
                                                                                                                                                            c_hash?: string;
                                                                                                                                                            email?: string;
                                                                                                                                                            email_verified?: boolean;
                                                                                                                                                            exp: number;
                                                                                                                                                            family_name?: string;
                                                                                                                                                            gender?: string;
                                                                                                                                                            given_name?: string;
                                                                                                                                                            groups?: Group[];
                                                                                                                                                            iat: number;
                                                                                                                                                            iss: string;
                                                                                                                                                            locale?: string;
                                                                                                                                                            middle_name?: string;
                                                                                                                                                            name?: string;
                                                                                                                                                            nbf?: number;
                                                                                                                                                            nickname?: string;
                                                                                                                                                            nonce?: string;
                                                                                                                                                            phone_number?: string;
                                                                                                                                                            phone_number_verified?: boolean;
                                                                                                                                                            picture?: string;
                                                                                                                                                            preferred_username?: string;
                                                                                                                                                            profile?: string;
                                                                                                                                                            s_hash?: string;
                                                                                                                                                            sub: string;
                                                                                                                                                            updated_at?: number;
                                                                                                                                                            website?: string;
                                                                                                                                                            zoneinfo?: string;
                                                                                                                                                            [key: string]: unknown;
                                                                                                                                                        }

                                                                                                                                                        Hierarchy

                                                                                                                                                        Indexable

                                                                                                                                                        • [key: string]: unknown

                                                                                                                                                          Additional provider-specific claims.

                                                                                                                                                        Index

                                                                                                                                                        Properties

                                                                                                                                                        acr? address? amr? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.IsUserInGroupOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.IsUserInGroupOptions.html index d3c60e47..cccc72fb 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.IsUserInGroupOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.IsUserInGroupOptions.html @@ -1,5 +1,5 @@ IsUserInGroupOptions | MonoCloud Authentication SDK
                                                                                                                                                        MonoCloud Authentication SDK
                                                                                                                                                          Preparing search index...

                                                                                                                                                          Configuration options for evaluating user group membership.

                                                                                                                                                          -
                                                                                                                                                          interface IsUserInGroupOptions {
                                                                                                                                                              groupsClaim?: string;
                                                                                                                                                              matchAll?: boolean;
                                                                                                                                                          }

                                                                                                                                                          Hierarchy

                                                                                                                                                          Index

                                                                                                                                                          Properties

                                                                                                                                                          interface IsUserInGroupOptions {
                                                                                                                                                              groupsClaim?: string;
                                                                                                                                                              matchAll?: boolean;
                                                                                                                                                          }

                                                                                                                                                          Hierarchy

                                                                                                                                                          Index

                                                                                                                                                          Properties

                                                                                                                                                          groupsClaim?: string

                                                                                                                                                          The name of the claim in the user profile that contains group information. This value is read from the authenticated user's session.

                                                                                                                                                          'groups'
                                                                                                                                                          diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudOptions.html
                                                                                                                                                          index e2961751..c4a4bc2f 100644
                                                                                                                                                          --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudOptions.html
                                                                                                                                                          +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudOptions.html
                                                                                                                                                          @@ -229,7 +229,7 @@ 

                                                                                                                                                          Hierarchy

                                                                                                                                                          • Partial<
                                                                                                                                                                Omit<
                                                                                                                                                                    MonoCloudOptionsBase,
                                                                                                                                                                    "defaultAuthParams"
                                                                                                                                                                    | "session"
                                                                                                                                                                    | "routes"
                                                                                                                                                                    | "state",
                                                                                                                                                                >,
                                                                                                                                                            >
                                                                                                                                                            • MonoCloudOptions
                                                                                                                                                          Index

                                                                                                                                                          Properties

                                                                                                                                                          interface MonoCloudOptions {
                                                                                                                                                              allowQueryParamOverrides?: boolean;
                                                                                                                                                              appUrl?: string;
                                                                                                                                                              clientId?: string;
                                                                                                                                                              clientSecret?: string;
                                                                                                                                                              clockSkew?: number;
                                                                                                                                                              cookieSecret?: string;
                                                                                                                                                              debugger?: string;
                                                                                                                                                              defaultAuthParams?: AuthorizationParams;
                                                                                                                                                              federatedSignOut?: boolean;
                                                                                                                                                              fetchUserInfo?: boolean;
                                                                                                                                                              filteredIdTokenClaims?: string[];
                                                                                                                                                              idTokenSigningAlg?: SecurityAlgorithms;
                                                                                                                                                              jwksCacheDuration?: number;
                                                                                                                                                              metadataCacheDuration?: number;
                                                                                                                                                              onBackChannelLogout?: OnBackChannelLogout;
                                                                                                                                                              onSessionCreating?: OnSessionCreating;
                                                                                                                                                              onSetApplicationState?: OnSetApplicationState;
                                                                                                                                                              postLogoutRedirectUri?: string;
                                                                                                                                                              refetchUserInfo?: boolean;
                                                                                                                                                              resources?: Indicator[];
                                                                                                                                                              responseTimeout?: number;
                                                                                                                                                              routes?: Partial<MonoCloudRoutes>;
                                                                                                                                                              session?: MonoCloudSessionOptions;
                                                                                                                                                              state?: MonoCloudStatePartialOptions;
                                                                                                                                                              strictProfileSync?: boolean;
                                                                                                                                                              tenantDomain?: string;
                                                                                                                                                              usePar?: boolean;
                                                                                                                                                              userAgent?: string;
                                                                                                                                                          }

                                                                                                                                                          Hierarchy

                                                                                                                                                          • Partial<
                                                                                                                                                                Omit<
                                                                                                                                                                    MonoCloudOptionsBase,
                                                                                                                                                                    "defaultAuthParams"
                                                                                                                                                                    | "session"
                                                                                                                                                                    | "routes"
                                                                                                                                                                    | "state",
                                                                                                                                                                >,
                                                                                                                                                            >
                                                                                                                                                            • MonoCloudOptions
                                                                                                                                                          Index

                                                                                                                                                          Properties

                                                                                                                                                          allowQueryParamOverrides? appUrl? clientId? clientSecret? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudRequest.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudRequest.html index 0b5f7417..f60ced38 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudRequest.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudRequest.html @@ -1,5 +1,5 @@ MonoCloudRequest | MonoCloud Authentication SDK
                                                                                                                                                          MonoCloud Authentication SDK
                                                                                                                                                            Preparing search index...

                                                                                                                                                            Represents a request object that includes cookie handling capabilities.

                                                                                                                                                            -
                                                                                                                                                            interface MonoCloudRequest {
                                                                                                                                                                getAllCookies(): Promise<Map<string, string>>;
                                                                                                                                                                getCookie(name: string): Promise<string | undefined>;
                                                                                                                                                                getQuery(parameter: string): string | string[] | undefined;
                                                                                                                                                                getRawRequest(): Promise<
                                                                                                                                                                    { body: string
                                                                                                                                                                    | Record<string, string>; method: string; url: string },
                                                                                                                                                                >;
                                                                                                                                                            }

                                                                                                                                                            Hierarchy

                                                                                                                                                            Index

                                                                                                                                                            Methods

                                                                                                                                                            interface MonoCloudRequest {
                                                                                                                                                                getAllCookies(): Promise<Map<string, string>>;
                                                                                                                                                                getCookie(name: string): Promise<string | undefined>;
                                                                                                                                                                getQuery(parameter: string): string | string[] | undefined;
                                                                                                                                                                getRawRequest(): Promise<
                                                                                                                                                                    { body: string
                                                                                                                                                                    | Record<string, string>; method: string; url: string },
                                                                                                                                                                >;
                                                                                                                                                            }

                                                                                                                                                            Hierarchy

                                                                                                                                                            Index

                                                                                                                                                            Methods

                                                                                                                                                            getAllCookies getCookie getQuery getRawRequest diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudSessionOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudSessionOptions.html index 30e8bb46..5cab9c0a 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudSessionOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudSessionOptions.html @@ -1,5 +1,5 @@ MonoCloudSessionOptions | MonoCloud Authentication SDK
                                                                                                                                                            MonoCloud Authentication SDK
                                                                                                                                                              Preparing search index...

                                                                                                                                                              Partial configuration options for authentication sessions.

                                                                                                                                                              -
                                                                                                                                                              interface MonoCloudSessionOptions {
                                                                                                                                                                  cookie?: Partial<MonoCloudCookieOptions>;
                                                                                                                                                                  duration?: number;
                                                                                                                                                                  maximumDuration?: number;
                                                                                                                                                                  sliding?: boolean;
                                                                                                                                                                  store?: MonoCloudSessionStore;
                                                                                                                                                              }

                                                                                                                                                              Hierarchy

                                                                                                                                                              Index

                                                                                                                                                              Properties

                                                                                                                                                              interface MonoCloudSessionOptions {
                                                                                                                                                                  cookie?: Partial<MonoCloudCookieOptions>;
                                                                                                                                                                  duration?: number;
                                                                                                                                                                  maximumDuration?: number;
                                                                                                                                                                  sliding?: boolean;
                                                                                                                                                                  store?: MonoCloudSessionStore;
                                                                                                                                                              }

                                                                                                                                                              Hierarchy

                                                                                                                                                              Index

                                                                                                                                                              Properties

                                                                                                                                                              cookie? duration? maximumDuration? sliding? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudTokens.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudTokens.html index 7f4c0bea..9c06f0de 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudTokens.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudTokens.html @@ -1,6 +1,6 @@ MonoCloudTokens | MonoCloud Authentication SDK
                                                                                                                                                              MonoCloud Authentication SDK
                                                                                                                                                                Preparing search index...

                                                                                                                                                                Represents the token set associated with the currently authenticated user.

                                                                                                                                                                This object extends AccessToken and includes additional tokens issued during authentication, along with convenience metadata used by the SDK to indicate token validity.

                                                                                                                                                                -
                                                                                                                                                                interface MonoCloudTokens {
                                                                                                                                                                    accessToken: string;
                                                                                                                                                                    accessTokenExpiration: number;
                                                                                                                                                                    idToken?: string;
                                                                                                                                                                    isExpired: boolean;
                                                                                                                                                                    refreshToken?: string;
                                                                                                                                                                    requestedScopes?: string;
                                                                                                                                                                    resource?: string;
                                                                                                                                                                    scopes: string;
                                                                                                                                                                }

                                                                                                                                                                Hierarchy

                                                                                                                                                                Index

                                                                                                                                                                Properties

                                                                                                                                                                interface MonoCloudTokens {
                                                                                                                                                                    accessToken: string;
                                                                                                                                                                    accessTokenExpiration: number;
                                                                                                                                                                    idToken?: string;
                                                                                                                                                                    isExpired: boolean;
                                                                                                                                                                    refreshToken?: string;
                                                                                                                                                                    requestedScopes?: string;
                                                                                                                                                                    resource?: string;
                                                                                                                                                                    scopes: string;
                                                                                                                                                                }

                                                                                                                                                                Hierarchy

                                                                                                                                                                Index

                                                                                                                                                                Properties

                                                                                                                                                                accessToken accessTokenExpiration idToken? isExpired diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudUser.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudUser.html index e222b7a7..aa48341a 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudUser.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.MonoCloudUser.html @@ -1,5 +1,5 @@ MonoCloudUser | MonoCloud Authentication SDK
                                                                                                                                                                MonoCloud Authentication SDK
                                                                                                                                                                  Preparing search index...

                                                                                                                                                                  Represents the authenticated user stored in a MonoCloud session.

                                                                                                                                                                  -
                                                                                                                                                                  interface MonoCloudUser {
                                                                                                                                                                      address?: Address;
                                                                                                                                                                      amr?: string[];
                                                                                                                                                                      birthdate?: string;
                                                                                                                                                                      email?: string;
                                                                                                                                                                      email_verified?: boolean;
                                                                                                                                                                      family_name?: string;
                                                                                                                                                                      gender?: string;
                                                                                                                                                                      given_name?: string;
                                                                                                                                                                      groups?: Group[];
                                                                                                                                                                      idp?: string;
                                                                                                                                                                      locale?: string;
                                                                                                                                                                      middle_name?: string;
                                                                                                                                                                      name?: string;
                                                                                                                                                                      nickname?: string;
                                                                                                                                                                      phone_number?: string;
                                                                                                                                                                      phone_number_verified?: boolean;
                                                                                                                                                                      picture?: string;
                                                                                                                                                                      preferred_username?: string;
                                                                                                                                                                      profile?: string;
                                                                                                                                                                      sub: string;
                                                                                                                                                                      updated_at?: number;
                                                                                                                                                                      website?: string;
                                                                                                                                                                      zoneinfo?: string;
                                                                                                                                                                      [key: string]: unknown;
                                                                                                                                                                  }

                                                                                                                                                                  Hierarchy

                                                                                                                                                                  Indexable

                                                                                                                                                                  • [key: string]: unknown

                                                                                                                                                                    Additional provider-specific claims.

                                                                                                                                                                    +
                                                                                                                                                                  interface MonoCloudUser {
                                                                                                                                                                      address?: Address;
                                                                                                                                                                      amr?: string[];
                                                                                                                                                                      birthdate?: string;
                                                                                                                                                                      email?: string;
                                                                                                                                                                      email_verified?: boolean;
                                                                                                                                                                      family_name?: string;
                                                                                                                                                                      gender?: string;
                                                                                                                                                                      given_name?: string;
                                                                                                                                                                      groups?: Group[];
                                                                                                                                                                      idp?: string;
                                                                                                                                                                      locale?: string;
                                                                                                                                                                      middle_name?: string;
                                                                                                                                                                      name?: string;
                                                                                                                                                                      nickname?: string;
                                                                                                                                                                      phone_number?: string;
                                                                                                                                                                      phone_number_verified?: boolean;
                                                                                                                                                                      picture?: string;
                                                                                                                                                                      preferred_username?: string;
                                                                                                                                                                      profile?: string;
                                                                                                                                                                      sub: string;
                                                                                                                                                                      updated_at?: number;
                                                                                                                                                                      website?: string;
                                                                                                                                                                      zoneinfo?: string;
                                                                                                                                                                      [key: string]: unknown;
                                                                                                                                                                  }

                                                                                                                                                                  Hierarchy

                                                                                                                                                                  Indexable

                                                                                                                                                                  • [key: string]: unknown

                                                                                                                                                                    Additional provider-specific claims.

                                                                                                                                                                  Index

                                                                                                                                                                  Properties

                                                                                                                                                                  address? amr? birthdate? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiAppOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiAppOptions.html index e6c8df8c..4f2f3911 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiAppOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiAppOptions.html @@ -1,5 +1,5 @@ ProtectApiAppOptions | MonoCloud Authentication SDK
                                                                                                                                                                  MonoCloud Authentication SDK
                                                                                                                                                                    Preparing search index...

                                                                                                                                                                    Options for configuring protectApi() in the App Router.

                                                                                                                                                                    -
                                                                                                                                                                    interface ProtectApiAppOptions {
                                                                                                                                                                        groups?: string[];
                                                                                                                                                                        groupsClaim?: string;
                                                                                                                                                                        matchAll?: boolean;
                                                                                                                                                                        onAccessDenied?: AppRouterApiOnAccessDeniedHandler;
                                                                                                                                                                        onGroupAccessDenied?: AppRouterApiOnGroupAccessDeniedHandler;
                                                                                                                                                                    }

                                                                                                                                                                    Hierarchy

                                                                                                                                                                    Index

                                                                                                                                                                    Properties

                                                                                                                                                                    interface ProtectApiAppOptions {
                                                                                                                                                                        groups?: string[];
                                                                                                                                                                        groupsClaim?: string;
                                                                                                                                                                        matchAll?: boolean;
                                                                                                                                                                        onAccessDenied?: AppRouterApiOnAccessDeniedHandler;
                                                                                                                                                                        onGroupAccessDenied?: AppRouterApiOnGroupAccessDeniedHandler;
                                                                                                                                                                    }

                                                                                                                                                                    Hierarchy

                                                                                                                                                                    Index

                                                                                                                                                                    Properties

                                                                                                                                                                    groups? groupsClaim? matchAll? onAccessDenied? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiPageOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiPageOptions.html index 5d4ec950..615d7afd 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiPageOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectApiPageOptions.html @@ -1,5 +1,5 @@ ProtectApiPageOptions | MonoCloud Authentication SDK
                                                                                                                                                                    MonoCloud Authentication SDK
                                                                                                                                                                      Preparing search index...

                                                                                                                                                                      Options for configuring protectApi() in the Pages Router.

                                                                                                                                                                      -
                                                                                                                                                                      interface ProtectApiPageOptions {
                                                                                                                                                                          groups?: string[];
                                                                                                                                                                          groupsClaim?: string;
                                                                                                                                                                          matchAll?: boolean;
                                                                                                                                                                          onAccessDenied?: PageRouterApiOnAccessDeniedHandler;
                                                                                                                                                                          onGroupAccessDenied?: PageRouterApiOnGroupAccessDeniedHandler;
                                                                                                                                                                      }

                                                                                                                                                                      Hierarchy

                                                                                                                                                                      Index

                                                                                                                                                                      Properties

                                                                                                                                                                      interface ProtectApiPageOptions {
                                                                                                                                                                          groups?: string[];
                                                                                                                                                                          groupsClaim?: string;
                                                                                                                                                                          matchAll?: boolean;
                                                                                                                                                                          onAccessDenied?: PageRouterApiOnAccessDeniedHandler;
                                                                                                                                                                          onGroupAccessDenied?: PageRouterApiOnGroupAccessDeniedHandler;
                                                                                                                                                                      }

                                                                                                                                                                      Hierarchy

                                                                                                                                                                      Index

                                                                                                                                                                      Properties

                                                                                                                                                                      groups? groupsClaim? matchAll? onAccessDenied? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectAppPageOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectAppPageOptions.html index 846ec479..8d48859a 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectAppPageOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectAppPageOptions.html @@ -1,5 +1,5 @@ ProtectAppPageOptions | MonoCloud Authentication SDK
                                                                                                                                                                      MonoCloud Authentication SDK
                                                                                                                                                                        Preparing search index...

                                                                                                                                                                        Options for configuring protectPage() in the App Router.

                                                                                                                                                                        -
                                                                                                                                                                        interface ProtectAppPageOptions {
                                                                                                                                                                            authParams?: ExtraAuthParams;
                                                                                                                                                                            groups?: string[];
                                                                                                                                                                            groupsClaim?: string;
                                                                                                                                                                            matchAll?: boolean;
                                                                                                                                                                            onAccessDenied?: (
                                                                                                                                                                                props: {
                                                                                                                                                                                    params?: Record<string, string | string[]>;
                                                                                                                                                                                    searchParams?: Record<string, string | string[] | undefined>;
                                                                                                                                                                                },
                                                                                                                                                                            ) => Element
                                                                                                                                                                            | Promise<Element>;
                                                                                                                                                                            onGroupAccessDenied?: (
                                                                                                                                                                                props: {
                                                                                                                                                                                    params?: Record<string, string | string[]>;
                                                                                                                                                                                    searchParams?: Record<string, string | string[] | undefined>;
                                                                                                                                                                                    user: MonoCloudUser;
                                                                                                                                                                                },
                                                                                                                                                                            ) => Element
                                                                                                                                                                            | Promise<Element>;
                                                                                                                                                                            returnUrl?: string;
                                                                                                                                                                        }

                                                                                                                                                                        Hierarchy

                                                                                                                                                                        Index

                                                                                                                                                                        Properties

                                                                                                                                                                        interface ProtectAppPageOptions {
                                                                                                                                                                            authParams?: ExtraAuthParams;
                                                                                                                                                                            groups?: string[];
                                                                                                                                                                            groupsClaim?: string;
                                                                                                                                                                            matchAll?: boolean;
                                                                                                                                                                            onAccessDenied?: (
                                                                                                                                                                                props: {
                                                                                                                                                                                    params?: Record<string, string | string[]>;
                                                                                                                                                                                    searchParams?: Record<string, string | string[] | undefined>;
                                                                                                                                                                                },
                                                                                                                                                                            ) => Element
                                                                                                                                                                            | Promise<Element>;
                                                                                                                                                                            onGroupAccessDenied?: (
                                                                                                                                                                                props: {
                                                                                                                                                                                    params?: Record<string, string | string[]>;
                                                                                                                                                                                    searchParams?: Record<string, string | string[] | undefined>;
                                                                                                                                                                                    user: MonoCloudUser;
                                                                                                                                                                                },
                                                                                                                                                                            ) => Element
                                                                                                                                                                            | Promise<Element>;
                                                                                                                                                                            returnUrl?: string;
                                                                                                                                                                        }

                                                                                                                                                                        Hierarchy

                                                                                                                                                                        Index

                                                                                                                                                                        Properties

                                                                                                                                                                        authParams? groups? groupsClaim? matchAll? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectOptions.html index 9db927d5..e6c1a440 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectOptions.html @@ -1,5 +1,5 @@ ProtectOptions | MonoCloud Authentication SDK
                                                                                                                                                                        MonoCloud Authentication SDK
                                                                                                                                                                          Preparing search index...

                                                                                                                                                                          Options for configuring protect().

                                                                                                                                                                          -
                                                                                                                                                                          interface ProtectOptions {
                                                                                                                                                                              authParams?: ExtraAuthParams;
                                                                                                                                                                              groups?: string[];
                                                                                                                                                                              groupsClaim?: string;
                                                                                                                                                                              matchAll?: boolean;
                                                                                                                                                                              returnUrl?: string;
                                                                                                                                                                          }

                                                                                                                                                                          Hierarchy

                                                                                                                                                                          Index

                                                                                                                                                                          Properties

                                                                                                                                                                          interface ProtectOptions {
                                                                                                                                                                              authParams?: ExtraAuthParams;
                                                                                                                                                                              groups?: string[];
                                                                                                                                                                              groupsClaim?: string;
                                                                                                                                                                              matchAll?: boolean;
                                                                                                                                                                              returnUrl?: string;
                                                                                                                                                                          }

                                                                                                                                                                          Hierarchy

                                                                                                                                                                          Index

                                                                                                                                                                          Properties

                                                                                                                                                                          authParams? groups? groupsClaim? matchAll? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPageGetServerSidePropsContext.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPageGetServerSidePropsContext.html index 5d5ff256..905a23fc 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPageGetServerSidePropsContext.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPageGetServerSidePropsContext.html @@ -1,4 +1,4 @@ ProtectPageGetServerSidePropsContext | MonoCloud Authentication SDK
                                                                                                                                                                          MonoCloud Authentication SDK
                                                                                                                                                                            Preparing search index...

                                                                                                                                                                            Interface ProtectPageGetServerSidePropsContext<Q>

                                                                                                                                                                            Next.js getServerSideProps context extended with the authenticated user when using protectPage().

                                                                                                                                                                            -
                                                                                                                                                                            interface ProtectPageGetServerSidePropsContext<
                                                                                                                                                                                Q extends ParsedUrlQuery = ParsedUrlQuery,
                                                                                                                                                                            > {
                                                                                                                                                                                user: MonoCloudUser;
                                                                                                                                                                            }

                                                                                                                                                                            Type Parameters

                                                                                                                                                                            • Q extends ParsedUrlQuery = ParsedUrlQuery

                                                                                                                                                                            Hierarchy

                                                                                                                                                                            • GetServerSidePropsContext<Q>
                                                                                                                                                                              • ProtectPageGetServerSidePropsContext
                                                                                                                                                                            Index

                                                                                                                                                                            Properties

                                                                                                                                                                            interface ProtectPageGetServerSidePropsContext<
                                                                                                                                                                                Q extends ParsedUrlQuery = ParsedUrlQuery,
                                                                                                                                                                            > {
                                                                                                                                                                                user: MonoCloudUser;
                                                                                                                                                                            }

                                                                                                                                                                            Type Parameters

                                                                                                                                                                            • Q extends ParsedUrlQuery = ParsedUrlQuery

                                                                                                                                                                            Hierarchy

                                                                                                                                                                            • GetServerSidePropsContext<Q>
                                                                                                                                                                              • ProtectPageGetServerSidePropsContext
                                                                                                                                                                            Index

                                                                                                                                                                            Properties

                                                                                                                                                                            Properties

                                                                                                                                                                            The authenticated user resolved from the current session.

                                                                                                                                                                            diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPagePageOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPagePageOptions.html index 2e368e29..35bd98ec 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPagePageOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.ProtectPagePageOptions.html @@ -1,7 +1,7 @@ ProtectPagePageOptions | MonoCloud Authentication SDK
                                                                                                                                                                            MonoCloud Authentication SDK
                                                                                                                                                                              Preparing search index...

                                                                                                                                                                              Interface ProtectPagePageOptions<P, Q>

                                                                                                                                                                              Options for configuring protectPage() in the Pages Router.

                                                                                                                                                                              interface ProtectPagePageOptions<
                                                                                                                                                                                  P extends Record<string, any> = Record<string, any>,
                                                                                                                                                                                  Q extends ParsedUrlQuery = ParsedUrlQuery,
                                                                                                                                                                              > {
                                                                                                                                                                                  authParams?: ExtraAuthParams;
                                                                                                                                                                                  getServerSideProps?: GetServerSideProps<P, Q>;
                                                                                                                                                                                  groups?: string[];
                                                                                                                                                                                  groupsClaim?: string;
                                                                                                                                                                                  matchAll?: boolean;
                                                                                                                                                                                  onAccessDenied?: ProtectPagePageOnAccessDeniedType<P, Q>;
                                                                                                                                                                                  onGroupAccessDenied?: ProtectPagePageOnGroupAccessDeniedType<P, Q>;
                                                                                                                                                                                  returnUrl?: string;
                                                                                                                                                                              }

                                                                                                                                                                              Type Parameters

                                                                                                                                                                              • P extends Record<string, any> = Record<string, any>

                                                                                                                                                                                Props returned from getServerSideProps.

                                                                                                                                                                              • Q extends ParsedUrlQuery = ParsedUrlQuery

                                                                                                                                                                                Query parameters parsed from the URL.

                                                                                                                                                                                -

                                                                                                                                                                              Hierarchy

                                                                                                                                                                              Index

                                                                                                                                                                              Properties

                                                                                                                                                                              Hierarchy

                                                                                                                                                                              Index

                                                                                                                                                                              Properties

                                                                                                                                                                              authParams? getServerSideProps? groups? groupsClaim? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.RedirectToSignInOptions.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.RedirectToSignInOptions.html index 46380576..04575849 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.RedirectToSignInOptions.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.RedirectToSignInOptions.html @@ -1,5 +1,5 @@ RedirectToSignInOptions | MonoCloud Authentication SDK
                                                                                                                                                                              MonoCloud Authentication SDK
                                                                                                                                                                                Preparing search index...

                                                                                                                                                                                Options for redirectToSignIn().

                                                                                                                                                                                -
                                                                                                                                                                                interface RedirectToSignInOptions {
                                                                                                                                                                                    acrValues?: string[];
                                                                                                                                                                                    authenticatorHint?: Authenticators;
                                                                                                                                                                                    display?: DisplayOptions;
                                                                                                                                                                                    loginHint?: string;
                                                                                                                                                                                    maxAge?: number;
                                                                                                                                                                                    prompt?: Prompt;
                                                                                                                                                                                    resource?: string;
                                                                                                                                                                                    returnUrl?: string;
                                                                                                                                                                                    scopes?: string;
                                                                                                                                                                                    uiLocales?: string;
                                                                                                                                                                                }

                                                                                                                                                                                Hierarchy

                                                                                                                                                                                Index

                                                                                                                                                                                Properties

                                                                                                                                                                                interface RedirectToSignInOptions {
                                                                                                                                                                                    acrValues?: string[];
                                                                                                                                                                                    authenticatorHint?: Authenticators;
                                                                                                                                                                                    display?: DisplayOptions;
                                                                                                                                                                                    loginHint?: string;
                                                                                                                                                                                    maxAge?: number;
                                                                                                                                                                                    prompt?: Prompt;
                                                                                                                                                                                    resource?: string;
                                                                                                                                                                                    returnUrl?: string;
                                                                                                                                                                                    scopes?: string;
                                                                                                                                                                                    uiLocales?: string;
                                                                                                                                                                                }

                                                                                                                                                                                Hierarchy

                                                                                                                                                                                Index

                                                                                                                                                                                Properties

                                                                                                                                                                                acrValues? authenticatorHint? display? loginHint? diff --git a/docs/html/interfaces/_monocloud_auth-nextjs.index.UserinfoResponse.html b/docs/html/interfaces/_monocloud_auth-nextjs.index.UserinfoResponse.html index 76ef755f..9c643cfe 100644 --- a/docs/html/interfaces/_monocloud_auth-nextjs.index.UserinfoResponse.html +++ b/docs/html/interfaces/_monocloud_auth-nextjs.index.UserinfoResponse.html @@ -1,6 +1,6 @@ UserinfoResponse | MonoCloud Authentication SDK
                                                                                                                                                                                MonoCloud Authentication SDK
                                                                                                                                                                                  Preparing search index...

                                                                                                                                                                                  Interface UserinfoResponse<TAddress>

                                                                                                                                                                                  Represents the OpenID Connect UserInfo response.

                                                                                                                                                                                  interface UserinfoResponse<TAddress extends Address = Address> {
                                                                                                                                                                                      address?: TAddress;
                                                                                                                                                                                      birthdate?: string;
                                                                                                                                                                                      email?: string;
                                                                                                                                                                                      email_verified?: boolean;
                                                                                                                                                                                      family_name?: string;
                                                                                                                                                                                      gender?: string;
                                                                                                                                                                                      given_name?: string;
                                                                                                                                                                                      groups?: Group[];
                                                                                                                                                                                      locale?: string;
                                                                                                                                                                                      middle_name?: string;
                                                                                                                                                                                      name?: string;
                                                                                                                                                                                      nickname?: string;
                                                                                                                                                                                      phone_number?: string;
                                                                                                                                                                                      phone_number_verified?: boolean;
                                                                                                                                                                                      picture?: string;
                                                                                                                                                                                      preferred_username?: string;
                                                                                                                                                                                      profile?: string;
                                                                                                                                                                                      sub: string;
                                                                                                                                                                                      updated_at?: number;
                                                                                                                                                                                      website?: string;
                                                                                                                                                                                      zoneinfo?: string;
                                                                                                                                                                                      [key: string]: unknown;
                                                                                                                                                                                  }

                                                                                                                                                                                  Type Parameters

                                                                                                                                                                                  Hierarchy

                                                                                                                                                                                  Indexable

                                                                                                                                                                                  • [key: string]: unknown

                                                                                                                                                                                    Additional provider-specific claims.

                                                                                                                                                                                    +

                                                                                                                                                                                  Hierarchy

                                                                                                                                                                                  Indexable

                                                                                                                                                                                  • [key: string]: unknown

                                                                                                                                                                                    Additional provider-specific claims.

                                                                                                                                                                                  Index

                                                                                                                                                                                  Properties

                                                                                                                                                                                  address? birthdate? email? diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.AccessToken.html b/docs/html/interfaces/_monocloud_auth-node-core.index.AccessToken.html index ea731e96..10ace539 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.AccessToken.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.AccessToken.html @@ -1,5 +1,5 @@ AccessToken | MonoCloud Authentication SDK
                                                                                                                                                                                  MonoCloud Authentication SDK
                                                                                                                                                                                    Preparing search index...

                                                                                                                                                                                    Represents an OAuth 2.0 access token and its associated metadata.

                                                                                                                                                                                    -
                                                                                                                                                                                    interface AccessToken {
                                                                                                                                                                                        accessToken: string;
                                                                                                                                                                                        accessTokenExpiration: number;
                                                                                                                                                                                        requestedScopes?: string;
                                                                                                                                                                                        resource?: string;
                                                                                                                                                                                        scopes: string;
                                                                                                                                                                                    }

                                                                                                                                                                                    Hierarchy

                                                                                                                                                                                    Index

                                                                                                                                                                                    Properties

                                                                                                                                                                                    interface AccessToken {
                                                                                                                                                                                        accessToken: string;
                                                                                                                                                                                        accessTokenExpiration: number;
                                                                                                                                                                                        requestedScopes?: string;
                                                                                                                                                                                        resource?: string;
                                                                                                                                                                                        scopes: string;
                                                                                                                                                                                    }

                                                                                                                                                                                    Hierarchy

                                                                                                                                                                                    Index

                                                                                                                                                                                    Properties

                                                                                                                                                                                    accessToken accessTokenExpiration requestedScopes? resource? diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.ApplicationState.html b/docs/html/interfaces/_monocloud_auth-node-core.index.ApplicationState.html index cb7d33c6..a7cdf7fe 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.ApplicationState.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.ApplicationState.html @@ -1,3 +1,3 @@ ApplicationState | MonoCloud Authentication SDK
                                                                                                                                                                                    MonoCloud Authentication SDK
                                                                                                                                                                                      Preparing search index...

                                                                                                                                                                                      Represents custom application state associated with an authentication request.

                                                                                                                                                                                      This object is populated via onSetApplicationState and is persisted through the authentication flow. The resolved value is later available during session creation and can be used to carry application-specific context (for example: return targets, workflow state, or tenant hints).

                                                                                                                                                                                      -

                                                                                                                                                                                      Hierarchy

                                                                                                                                                                                      • Record<string, any>
                                                                                                                                                                                        • ApplicationState

                                                                                                                                                                                      Indexable

                                                                                                                                                                                      • [key: string]: any
                                                                                                                                                                                      +

                                                                                                                                                                                      Hierarchy

                                                                                                                                                                                      • Record<string, any>
                                                                                                                                                                                        • ApplicationState

                                                                                                                                                                                      Indexable

                                                                                                                                                                                      • [key: string]: any
                                                                                                                                                                                      diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.CookieOptions.html b/docs/html/interfaces/_monocloud_auth-node-core.index.CookieOptions.html index 9811d0e4..76c5bfd9 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.CookieOptions.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.CookieOptions.html @@ -1,2 +1,2 @@ CookieOptions | MonoCloud Authentication SDK
                                                                                                                                                                                      MonoCloud Authentication SDK
                                                                                                                                                                                        Preparing search index...

                                                                                                                                                                                        Options for serializing cookies.

                                                                                                                                                                                        -

                                                                                                                                                                                        Hierarchy

                                                                                                                                                                                        • SerializeOptions
                                                                                                                                                                                          • CookieOptions
                                                                                                                                                                                        +

                                                                                                                                                                                        Hierarchy

                                                                                                                                                                                        • SerializeOptions
                                                                                                                                                                                          • CookieOptions
                                                                                                                                                                                        diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.EndSessionParameters.html b/docs/html/interfaces/_monocloud_auth-node-core.index.EndSessionParameters.html index 9582da3b..59fcc351 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.EndSessionParameters.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.EndSessionParameters.html @@ -1,5 +1,5 @@ EndSessionParameters | MonoCloud Authentication SDK
                                                                                                                                                                                        MonoCloud Authentication SDK
                                                                                                                                                                                          Preparing search index...

                                                                                                                                                                                          Parameters used to construct an OpenID Connect end-session (sign-out) request.

                                                                                                                                                                                          -
                                                                                                                                                                                          interface EndSessionParameters {
                                                                                                                                                                                              idToken?: string;
                                                                                                                                                                                              postLogoutRedirectUri?: string;
                                                                                                                                                                                              state?: string;
                                                                                                                                                                                          }

                                                                                                                                                                                          Hierarchy

                                                                                                                                                                                          Index

                                                                                                                                                                                          Properties

                                                                                                                                                                                          interface EndSessionParameters {
                                                                                                                                                                                              idToken?: string;
                                                                                                                                                                                              postLogoutRedirectUri?: string;
                                                                                                                                                                                              state?: string;
                                                                                                                                                                                          }

                                                                                                                                                                                          Hierarchy

                                                                                                                                                                                          Index

                                                                                                                                                                                          Properties

                                                                                                                                                                                          idToken?: string

                                                                                                                                                                                          ID token hint identifying the session to terminate.

                                                                                                                                                                                          diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.GetTokensOptions.html b/docs/html/interfaces/_monocloud_auth-node-core.index.GetTokensOptions.html index e6cba5b0..53640e01 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.GetTokensOptions.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.GetTokensOptions.html @@ -1,5 +1,5 @@ GetTokensOptions | MonoCloud Authentication SDK
                                                                                                                                                                                          MonoCloud Authentication SDK
                                                                                                                                                                                            Preparing search index...

                                                                                                                                                                                            Options used to control token retrieval and refresh behavior when calling getTokens().

                                                                                                                                                                                            -
                                                                                                                                                                                            interface GetTokensOptions {
                                                                                                                                                                                                forceRefresh?: boolean;
                                                                                                                                                                                                refetchUserInfo?: boolean;
                                                                                                                                                                                                resource?: string;
                                                                                                                                                                                                scopes?: string;
                                                                                                                                                                                            }

                                                                                                                                                                                            Hierarchy

                                                                                                                                                                                            Index

                                                                                                                                                                                            Properties

                                                                                                                                                                                            interface GetTokensOptions {
                                                                                                                                                                                                forceRefresh?: boolean;
                                                                                                                                                                                                refetchUserInfo?: boolean;
                                                                                                                                                                                                resource?: string;
                                                                                                                                                                                                scopes?: string;
                                                                                                                                                                                            }

                                                                                                                                                                                            Hierarchy

                                                                                                                                                                                            Index

                                                                                                                                                                                            Properties

                                                                                                                                                                                            forceRefresh? refetchUserInfo? resource? scopes? diff --git a/docs/html/interfaces/_monocloud_auth-node-core.index.IMonoCloudCookieRequest.html b/docs/html/interfaces/_monocloud_auth-node-core.index.IMonoCloudCookieRequest.html index 878a1edd..08dc7ddf 100644 --- a/docs/html/interfaces/_monocloud_auth-node-core.index.IMonoCloudCookieRequest.html +++ b/docs/html/interfaces/_monocloud_auth-node-core.index.IMonoCloudCookieRequest.html @@ -1,5 +1,5 @@ IMonoCloudCookieRequest | MonoCloud Authentication SDK
                                                                                                                                                                                            MonoCloud Authentication SDK
                                                                                                                                                                                              Preparing search index...

                                                                                                                                                                                              Interface for reading cookies from an incoming request.

                                                                                                                                                                                              -
                                                                                                                                                                                              interface IMonoCloudCookieRequest {
                                                                                                                                                                                                  getAllCookies(): Promise<Map<string, string>>;
                                                                                                                                                                                                  getCookie(name: string): Promise<string | undefined>;
                                                                                                                                                                                              }

                                                                                                                                                                                              Hierarchy

                                                                                                                                                                                              Index

                                                                                                                                                                                              Methods

                                                                                                                                                                                              interface IMonoCloudCookieRequest {
                                                                                                                                                                                                  getAllCookies(): Promise<Map<string, string>>;
                                                                                                                                                                                                  getCookie(name: string): Promise<string | undefined>;
                                                                                                                                                                                              }

                                                                                                                                                                                              Hierarchy

                                                                                                                                                                                              Index

                                                                                                                                                                                              Methods

                                                                                                                                                                                              Returns Promise<void> | void

                                                                                                                                                                                              Returns a promise or void. Execution continues once the callback completes.

                                                                                                                                                                                              -
                                                                                                                                                                                              +
                                                                                                                                                                                              diff --git a/docs/html/types/_monocloud_auth-web-js.index.PostCallback.html b/docs/html/types/_monocloud_auth-web-js.index.PostCallback.html index f125b144..d922d318 100644 --- a/docs/html/types/_monocloud_auth-web-js.index.PostCallback.html +++ b/docs/html/types/_monocloud_auth-web-js.index.PostCallback.html @@ -1,5 +1,5 @@ -PostCallback | MonoCloud Authentication SDK
                                                                                                                                                                                              MonoCloud Authentication SDK
                                                                                                                                                                                                Preparing search index...
                                                                                                                                                                                                PostCallback: (state: PostCallbackParams) => Promise<void> | void

                                                                                                                                                                                                Callback executed after sign-in or sign-out callback processing.

                                                                                                                                                                                                +PostCallback | MonoCloud Authentication SDK
                                                                                                                                                                                                MonoCloud Authentication SDK
                                                                                                                                                                                                  Preparing search index...
                                                                                                                                                                                                  PostCallback: (state: CallbackState) => Promise<void> | void

                                                                                                                                                                                                  Callback executed after sign-in or sign-out callback processing.

                                                                                                                                                                                                  The default implementation removes query parameters from the current URL on signIn (no navigation) or performs a full page reload to returnUrl. Provide a custom implementation to integrate with a client-side router and avoid full page reloads.

                                                                                                                                                                                                  -

                                                                                                                                                                                                  Type Declaration

                                                                                                                                                                                                  +
                                                                                                                                                                                                  diff --git a/docs/html/types/_monocloud_auth-web-js.index.PostCallbackParams.html b/docs/html/types/_monocloud_auth-web-js.index.PostCallbackParams.html deleted file mode 100644 index d3c8d32e..00000000 --- a/docs/html/types/_monocloud_auth-web-js.index.PostCallbackParams.html +++ /dev/null @@ -1,8 +0,0 @@ -PostCallbackParams | MonoCloud Authentication SDK
                                                                                                                                                                                                  MonoCloud Authentication SDK
                                                                                                                                                                                                    Preparing search index...
                                                                                                                                                                                                    PostCallbackParams:
                                                                                                                                                                                                        | {
                                                                                                                                                                                                            mode: InteractionMode
                                                                                                                                                                                                            | "silent";
                                                                                                                                                                                                            returnUrl?: string;
                                                                                                                                                                                                            type: "signIn";
                                                                                                                                                                                                        }
                                                                                                                                                                                                        | { mode: InteractionMode; returnUrl?: string; type: "signOut" }

                                                                                                                                                                                                    Metadata passed to PostCallback after callback processing completes.

                                                                                                                                                                                                    -

                                                                                                                                                                                                    Type Declaration

                                                                                                                                                                                                    • { mode: InteractionMode | "silent"; returnUrl?: string; type: "signIn" }
                                                                                                                                                                                                      • mode: InteractionMode | "silent"

                                                                                                                                                                                                        Interaction mode used during sign-in.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • OptionalreturnUrl?: string

                                                                                                                                                                                                        Optional URL to navigate to after sign-in.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • type: "signIn"

                                                                                                                                                                                                        Indicates a sign-in flow was completed.

                                                                                                                                                                                                        -
                                                                                                                                                                                                    • { mode: InteractionMode; returnUrl?: string; type: "signOut" }
                                                                                                                                                                                                      • mode: InteractionMode

                                                                                                                                                                                                        Interaction mode used during sign-out.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • OptionalreturnUrl?: string

                                                                                                                                                                                                        Optional URL to navigate to after sign-out.

                                                                                                                                                                                                        -
                                                                                                                                                                                                      • type: "signOut"

                                                                                                                                                                                                        Indicates a sign-out flow was completed.

                                                                                                                                                                                                        -
                                                                                                                                                                                                    diff --git a/docs/markdown/Classes/_monocloud_auth-web-js.index.LocalStorage.md b/docs/markdown/Classes/_monocloud_auth-web-js.index.LocalStorage.md new file mode 100644 index 00000000..d47b9efc --- /dev/null +++ b/docs/markdown/Classes/_monocloud_auth-web-js.index.LocalStorage.md @@ -0,0 +1,83 @@ +--- +rootSdk: JavaScript +title: "LocalStorage" +category: Classes +description: "window.localStorage-backed implementation of IStorage. This is the default storage used by MonoCloudWebJSClient." +--- + +# Class: LocalStorage + +`window.localStorage`-backed implementation of [IStorage](/sdks/web-js/api-reference/types/istorage). + +This is the default storage used by `MonoCloudWebJSClient`. + +## Implements + +- [`IStorage`](/sdks/web-js/api-reference/types/istorage) + +## Constructors + +### Constructor + +> **new LocalStorage**(): `LocalStorage` + +#### Returns + +`LocalStorage` + +## Methods + +### getItem() + +> **getItem**(`key`: `string`): `Promise`\<`string` \| `null`\> + +Retrieves the value associated with the given key. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `key` | `string` | The unique identifier for the stored item. | + +#### Returns + +`Promise`\<`string` \| `null`\> + +The stored value as a string, or `null` if the key does not exist. + +--- + +### removeItem() + +> **removeItem**(`key`: `string`): `Promise`\<`void`\> + +Removes the item associated with the specified key from storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | -------------------------------------------- | +| `key` | `string` | The unique identifier of the item to remove. | + +#### Returns + +`Promise`\<`void`\> + +--- + +### setItem() + +> **setItem**(`key`: `string`, `value`: `string`): `Promise`\<`void`\> + +Stores a key-value pair in the storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ----------------------------------- | +| `key` | `string` | The unique identifier for the item. | +| `value` | `string` | The string value to store. | + +#### Returns + +`Promise`\<`void`\> diff --git a/docs/markdown/Classes/_monocloud_auth-web-js.index.MemoryStorage.md b/docs/markdown/Classes/_monocloud_auth-web-js.index.MemoryStorage.md new file mode 100644 index 00000000..c5f467c7 --- /dev/null +++ b/docs/markdown/Classes/_monocloud_auth-web-js.index.MemoryStorage.md @@ -0,0 +1,83 @@ +--- +rootSdk: JavaScript +title: "MemoryStorage" +category: Classes +description: "In-memory implementation of IStorage. Useful for testing or for sessions that should not persist across page reloads." +--- + +# Class: MemoryStorage + +In-memory implementation of [IStorage](/sdks/web-js/api-reference/types/istorage). + +Useful for testing or for sessions that should not persist across page reloads. + +## Implements + +- [`IStorage`](/sdks/web-js/api-reference/types/istorage) + +## Constructors + +### Constructor + +> **new MemoryStorage**(): `MemoryStorage` + +#### Returns + +`MemoryStorage` + +## Methods + +### getItem() + +> **getItem**(`key`: `string`): `Promise`\<`string` \| `null`\> + +Retrieves the value associated with the given key. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `key` | `string` | The unique identifier for the stored item. | + +#### Returns + +`Promise`\<`string` \| `null`\> + +The stored value as a string, or `null` if the key does not exist. + +--- + +### removeItem() + +> **removeItem**(`key`: `string`): `Promise`\<`void`\> + +Removes the item associated with the specified key from storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | -------------------------------------------- | +| `key` | `string` | The unique identifier of the item to remove. | + +#### Returns + +`Promise`\<`void`\> + +--- + +### setItem() + +> **setItem**(`key`: `string`, `value`: `string`): `Promise`\<`void`\> + +Stores a key-value pair in the storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ----------------------------------- | +| `key` | `string` | The unique identifier for the item. | +| `value` | `string` | The string value to store. | + +#### Returns + +`Promise`\<`void`\> diff --git a/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.md b/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.md new file mode 100644 index 00000000..c53c5b78 --- /dev/null +++ b/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudOidcClient.md @@ -0,0 +1,510 @@ +--- +rootSdk: JavaScript +title: "MonoCloudOidcClient" +category: Classes +description: "MonoCloudOidcClient is a class in the MonoCloud JavaScript SDK." +--- + +# Class: MonoCloudOidcClient + +## Extends + +- [`MonoCloudOidcClientBase`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase) + +## Constructors + +### Constructor + +> **new MonoCloudOidcClient**(`tenantDomain`: `string`, `clientId`: `string`, `options?`: [`MonoCloudOidcClientOptions`](/sdks/nodejs/api-reference/types/monocloudoidcclientoptions)): `MonoCloudOidcClient` + +Creates a new instance of MonoCloudOidcClient. + +#### Parameters + +| Parameter | Type | Description | +| -------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | +| `tenantDomain` | `string` | The tenant domain URL. | +| `clientId` | `string` | Client id of the application registered in MonoCloud. | +| `options?` | [`MonoCloudOidcClientOptions`](/sdks/nodejs/api-reference/types/monocloudoidcclientoptions) | Additional client configuration options. | + +#### Returns + +`MonoCloudOidcClient` + +#### Overrides + +[`MonoCloudOidcClientBase`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase).[`constructor`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase#constructor) + +## Properties + +| Property | Type | Description | +| ---------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | +| `fetcher?` | (`input`: `URL` \| `RequestInfo`, `init?`: `RequestInit`) => `Promise`\<`Response`\> | Custom fetch implementation used for making HTTP requests. Falls back to the global `fetch` if not provided. | +| `jwks?` | [`Jwks`](/sdks/web-js/api-reference/types/jwks) | Cached JSON Web Key Set retrieved from the issuer's JWKS endpoint. | +| `jwksCacheDuration` | `number` | Duration (in seconds) for which the JWKS is cached. Defaults to 300 (5 minutes). | +| `jwksCacheExpiry` | `number` | Timestamp (in seconds) when the cached JWKS expires. | +| `metadata?` | [`IssuerMetadata`](/sdks/web-js/api-reference/types/issuermetadata) | Cached issuer metadata retrieved from the OpenID Connect discovery endpoint. | +| `metadataCacheDuration` | `number` | Duration (in seconds) for which the metadata is cached. Defaults to 300 (5 minutes). | +| `metadataCacheExpiry` | `number` | Timestamp (in seconds) when the cached metadata expires. | +| `tenantDomain` | `string` | The normalized tenant domain URL used as the base for discovery endpoints. | + +## Methods + +### authenticate() + +> **authenticate**(`code`: `string`, `redirectUri`: `string`, `requestedScopes`: `string`, `resource?`: `string`, `options?`: [`AuthenticateOptions`](/sdks/web-js/api-reference/types/authenticateoptions)): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Generates a session with user and tokens by exchanging authorization code from callback params. + +#### Parameters + +| Parameter | Type | Description | +| ----------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `code` | `string` | The authorization code received from the callback. | +| `redirectUri` | `string` | The redirect URI that was used in the authorization request. | +| `requestedScopes` | `string` | A space-separated list of scopes originally requested via the `/authorize` endpoint. This is stored in the session to ensure the correct access token can be identified and refreshed during `refreshSession()`. | +| `resource?` | `string` | A space-separated list of resource indicators originally requested via the `/authorize` endpoint. Used alongside scopes to uniquely identify and refresh the specific access token associated with these resources. | +| `options?` | [`AuthenticateOptions`](/sdks/web-js/api-reference/types/authenticateoptions) | Options for authenticating a user with authorization code. | + +#### Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +The user's session containing authentication tokens and user information. + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) - When the token scope does not contain the openid scope, +or if 'expires_in' or 'scope' is missing from the token response. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized. +OAuth 2.0 error response. + +#### Throws + +[MonoCloudTokenError](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) - If ID Token validation fails. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### authorizationUrl() + +> **authorizationUrl**(`params`: [`AuthorizationParams`](/sdks/web-js/api-reference/types/authorizationparams)): `Promise`\<`string`\> + +Generates an authorization URL with specified parameters. + +If no values are provided for `responseType`, or `codeChallengeMethod`, they default to `code`, and `S256`, respectively. + +#### Parameters + +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------------------- | ----------------------------- | +| `params` | [`AuthorizationParams`](/sdks/web-js/api-reference/types/authorizationparams) | Authorization URL parameters. | + +#### Returns + +`Promise`\<`string`\> + +Tenant's authorization URL. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### decodeJwt() + +> `static` **decodeJwt**(`jwt`: `string`): [`JwtClaims`](/sdks/nodejs/api-reference/types/jwtclaims) + +Decodes the payload of a JSON Web Token (JWT) and returns it as an object. + +> Note: THIS METHOD DOES NOT VERIFY JWT TOKENS. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | -------------- | +| `jwt` | `string` | JWT to decode. | + +#### Returns + +[`JwtClaims`](/sdks/nodejs/api-reference/types/jwtclaims) + +Decoded payload. + +#### Throws + +[MonoCloudTokenError](/sdks/nodejs/api-reference/error-classes/monocloudtokenerror) - If decoding fails + +#### Inherited from + +[`MonoCloudOidcClientBase`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase).[`decodeJwt`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase#decodejwt) + +--- + +### endSessionUrl() + +> **endSessionUrl**(`params`: [`EndSessionParameters`](/sdks/web-js/api-reference/types/endsessionparameters)): `Promise`\<`string`\> + +Generates OpenID end session URL for signing out. + +Note - The `state` is added only when `postLogoutRedirectUri` is present. + +#### Parameters + +| Parameter | Type | Description | +| --------- | --------------------------------------------------------------------------------------- | ------------------------------------ | +| `params` | [`EndSessionParameters`](/sdks/web-js/api-reference/types/endsessionparameters) | Parameters to build end session URL. | + +#### Returns + +`Promise`\<`string`\> + +Tenant's end session URL. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### exchangeAuthorizationCode() + +> **exchangeAuthorizationCode**(`code`: `string`, `redirectUri`: `string`, `codeVerifier?`: `string`, `resource?`: `string`): `Promise`\<[`Tokens`](/sdks/web-js/api-reference/types/tokens)\> + +Exchanges an authorization code for tokens. + +#### Parameters + +| Parameter | Type | Description | +| --------------- | -------- | ----------------------------------------------------------------------- | +| `code` | `string` | The authorization code received from the authorization server. | +| `redirectUri` | `string` | The redirect URI used in the initial authorization request. | +| `codeVerifier?` | `string` | Code verifier for PKCE. | +| `resource?` | `string` | Space-separated list of resources the access token should be scoped to. | + +#### Returns + +`Promise`\<[`Tokens`](/sdks/web-js/api-reference/types/tokens)\> + +Tokens obtained by exchanging an authorization code at the token endpoint. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error response. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### getJwks() + +> **getJwks**(`forceRefresh?`: `boolean`): `Promise`\<[`Jwks`](/sdks/web-js/api-reference/types/jwks)\> + +Fetches the JSON Web Keys used to sign the ID token. +The JWKS is cached for 5 minutes by default. + +#### Parameters + +| Parameter | Type | Description | +| -------------- | --------- | ---------------------------------------------------------------------------- | +| `forceRefresh` | `boolean` | If `true`, bypasses the cache and fetches fresh set of JWKS from the server. | + +#### Returns + +`Promise`\<[`Jwks`](/sdks/web-js/api-reference/types/jwks)\> + +The JSON Web Key Set containing the public keys for token verification. + +#### Throws + +[MonoCloudHttpError](/sdks/nodejs/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +#### Inherited from + +[`MonoCloudOidcClientBase`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase).[`getJwks`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase#getjwks) + +--- + +### getMetadata() + +> **getMetadata**(`forceRefresh?`: `boolean`): `Promise`\<[`IssuerMetadata`](/sdks/web-js/api-reference/types/issuermetadata)\> + +Fetches the authorization server metadata from the .well-known endpoint. +The metadata is cached for 5 minutes by default. + +#### Parameters + +| Parameter | Type | Description | +| -------------- | --------- | ------------------------------------------------------------------------- | +| `forceRefresh` | `boolean` | If `true`, bypasses the cache and fetches fresh metadata from the server. | + +#### Returns + +`Promise`\<[`IssuerMetadata`](/sdks/web-js/api-reference/types/issuermetadata)\> + +The issuer metadata for the tenant, retrieved from the OpenID Connect discovery endpoint. + +#### Throws + +[MonoCloudHttpError](/sdks/nodejs/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +#### Inherited from + +[`MonoCloudOidcClientBase`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase).[`getMetadata`](/sdks/nodejs/api-reference/classes/monocloudoidcclientbase#getmetadata) + +--- + +### pushedAuthorizationRequest() + +> **pushedAuthorizationRequest**(`params`: [`PushedAuthorizationParams`](/sdks/web-js/api-reference/types/pushedauthorizationparams)): `Promise`\<[`ParResponse`](/sdks/web-js/api-reference/types/parresponse)\> + +Performs a pushed authorization request. + +#### Parameters + +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------------------------------- | ------------------------- | +| `params` | [`PushedAuthorizationParams`](/sdks/web-js/api-reference/types/pushedauthorizationparams) | Authorization Parameters. | + +#### Returns + +`Promise`\<[`ParResponse`](/sdks/web-js/api-reference/types/parresponse)\> + +Response from Pushed Authorization Request (PAR) endpoint. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the request is invalid. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### refetchUserInfo() + +> **refetchUserInfo**(`accessToken`: [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken), `session`: [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession), `options?`: [`RefetchUserInfoOptions`](/sdks/web-js/api-reference/types/refetchuserinfooptions)): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Refetches user information for an existing session using the userinfo endpoint. +Updates the session's user object with the latest user information. + +#### Parameters + +| Parameter | Type | Description | +| ------------- | ------------------------------------------------------------------------------------------- | ---------------------------------------- | +| `accessToken` | [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken) | Access token used to fetch the userinfo. | +| `session` | [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) | The current MonoCloudSession. | +| `options?` | [`RefetchUserInfoOptions`](/sdks/web-js/api-reference/types/refetchuserinfooptions) | Userinfo refetch options. | + +#### Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Updated session with the latest userinfo. + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) - When the token scope does not contain openid scope + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error response. + +#### Throws + +[MonoCloudTokenError](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) - If ID Token validation fails + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### refreshGrant() + +> **refreshGrant**(`refreshToken`: `string`, `options?`: [`RefreshGrantOptions`](/sdks/web-js/api-reference/types/refreshgrantoptions)): `Promise`\<[`Tokens`](/sdks/web-js/api-reference/types/tokens)\> + +Exchanges a refresh token for new tokens. + +#### Parameters + +| Parameter | Type | Description | +| -------------- | ------------------------------------------------------------------------------------- | --------------------------------------------- | +| `refreshToken` | `string` | The refresh token used to request new tokens. | +| `options?` | [`RefreshGrantOptions`](/sdks/web-js/api-reference/types/refreshgrantoptions) | Refresh grant options. | + +#### Returns + +`Promise`\<[`Tokens`](/sdks/web-js/api-reference/types/tokens)\> + +Tokens obtained by exchanging a refresh token at the token endpoint. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error response. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### refreshSession() + +> **refreshSession**(`session`: [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession), `options?`: [`RefreshSessionOptions`](/sdks/web-js/api-reference/types/refreshsessionoptions)): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Refreshes an existing session using the refresh token. +This function requests new tokens using the refresh token and optionally updates user information. + +#### Parameters + +| Parameter | Type | Description | +| ---------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| `session` | [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) | The current MonoCloudSession containing the refresh token. | +| `options?` | [`RefreshSessionOptions`](/sdks/web-js/api-reference/types/refreshsessionoptions) | Session refresh options. | + +#### Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +User's session containing refreshed authentication tokens and user information. + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) - If the refresh token is not present in the session, +or if 'expires_in' or 'scope' (including the openid scope) is missing from the token response. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error response. + +#### Throws + +[MonoCloudTokenError](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) - If ID Token validation fails + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### revokeToken() + +> **revokeToken**(`token`: `string`, `tokenType?`: `string`): `Promise`\<`void`\> + +Revokes an access token or refresh token, rendering it invalid for future use. + +#### Parameters + +| Parameter | Type | Description | +| ------------ | -------- | -------------------------------------------------------------- | +| `token` | `string` | The token string to be revoked. | +| `tokenType?` | `string` | Hint about the token type ('access_token' or 'refresh_token'). | + +#### Returns + +`Promise`\<`void`\> + +If token revocation succeeded. + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) - If token is invalid or unsupported token type + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error response. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +--- + +### userinfo() + +> **userinfo**(`accessToken`: `string`): `Promise`\<[`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse)\<[`Address`](/sdks/web-js/api-reference/types/address)\>\> + +Fetches userinfo associated with the provided access token. + +#### Parameters + +| Parameter | Type | Description | +| ------------- | -------- | ----------------------------------------------- | +| `accessToken` | `string` | A valid access token used to retrieve userinfo. | + +#### Returns + +`Promise`\<[`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse)\<[`Address`](/sdks/web-js/api-reference/types/address)\>\> + +The authenticated user's claims. + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) - When the OpenID Provider returns a standardized +OAuth 2.0 error (e.g., 'invalid_token') in the 'WWW-Authenticate' header +following a 401 Unauthorized response. + +#### Throws + +[MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) - Thrown if there is a network error during the request or +unexpected status code during the request or a serialization error while processing the response. + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) - When the access token is invalid. + +--- + +### validateIdToken() + +> **validateIdToken**(`idToken`: `string`, `jwks`: [`Jwk`](/sdks/web-js/api-reference/types/jwk)[], `clockSkew`: `number`, `clockTolerance`: `number`, `maxAge?`: `number`, `nonce?`: `string`): `Promise`\<[`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims)\> + +Validates an ID Token. + +#### Parameters + +| Parameter | Type | Description | +| ---------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------ | +| `idToken` | `string` | The ID Token JWT string to validate. | +| `jwks` | [`Jwk`](/sdks/web-js/api-reference/types/jwk)[] | Array of JSON Web Keys (JWK) used to verify the token's signature. | +| `clockSkew` | `number` | Number of seconds to adjust the current time to account for clock differences. | +| `clockTolerance` | `number` | Additional time tolerance in seconds for time-based claim validation. | +| `maxAge?` | `number` | Maximum authentication age in seconds. | +| `nonce?` | `string` | Nonce value to validate against the token's nonce claim. | + +#### Returns + +`Promise`\<[`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims)\> + +Validated ID Token claims. + +#### Throws + +[MonoCloudTokenError](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) - If ID Token validation fails diff --git a/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.md b/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.md new file mode 100644 index 00000000..783b476a --- /dev/null +++ b/docs/markdown/Classes/_monocloud_auth-web-js.index.MonoCloudWebJSClient.md @@ -0,0 +1,361 @@ +--- +rootSdk: JavaScript +title: "MonoCloudWebJSClient" +category: Classes +description: "MonoCloudWebJSClient is the core SDK entry point for integrating MonoCloud authentication into single-page applications (SPAs) and other browser-based JavaScript environments." +--- + +# Class: MonoCloudWebJSClient + +`MonoCloudWebJSClient` is the core SDK entry point for integrating MonoCloud +authentication into single-page applications (SPAs) and other browser-based +JavaScript environments. + +Features: + +- Redirect and popup sign-in / sign-out flows. +- Silent sign-in via a hidden iframe (`prompt=none`) for restoring SSO sessions at app bootstrap. +- Refresh Token Grant based session refreshing. +- Session and token storage with pluggable storage adapters. +- Automatic PKCE, state, and nonce generation and validation. + +## Initialization + +```typescript:src/auth.ts +import { MonoCloudWebJSClient } from '@monocloud/auth-web-js'; + +export const client = new MonoCloudWebJSClient({ + tenantDomain: 'https://', + clientId: '', +}); +``` + +## Constructors + +### Constructor + +> **new MonoCloudWebJSClient**(`options`: [`MonoCloudWebJSClientOptions`](/sdks/web-js/api-reference/types/monocloudwebjsclientoptions)): `MonoCloudWebJSClient` + +Initializes a new instance of MonoCloudWebJSClient. + +#### Parameters + +| Parameter | Type | Description | +| --------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------- | +| `options` | [`MonoCloudWebJSClientOptions`](/sdks/web-js/api-reference/types/monocloudwebjsclientoptions) | Configuration options for the client. | + +#### Returns + +`MonoCloudWebJSClient` + +#### Examples + +```typescript:src/auth.ts tab="Default Integration" tab-group="constructor" +import { MonoCloudWebJSClient } from '@monocloud/auth-web-js'; + +export const client = new MonoCloudWebJSClient({ + tenantDomain: 'https://', + clientId: '', +}); +``` + +```typescript:src/auth.ts tab="Custom Storage & Router" tab-group="constructor" +import { MonoCloudWebJSClient, MemoryStorage } from '@monocloud/auth-web-js'; +import { router } from './router'; + +export const client = new MonoCloudWebJSClient({ + tenantDomain: 'https://', + clientId: '', + storage: new MemoryStorage(), + postCallback: state => { + router.push(state.returnUrl ?? '/dashboard'); + }, +}); +``` + +## Properties + +| Property | Type | Description | +| ------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `oidcClient` | [`MonoCloudOidcClient`](/sdks/web-js/api-reference/classes/monocloudoidcclient) | Underlying OpenID Connect client used for advanced authorization and token operations. Use this when you need lower-level access to OIDC protocol operations not directly exposed by the SDK. | + +## Methods + +### getSession() + +> **getSession**(): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) \| `undefined`\> + +Retrieves the current session object from the configured storage. + +#### Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) \| `undefined`\> + +The active session, or `undefined` if not authenticated. + +#### Example + +```typescript:src/app.ts +const session = await client.getSession(); +if (session) { + console.log('User is logged in:', session.user); +} +``` + +--- + +### getTokens() + +> **getTokens**(`options?`: [`GetTokensOptions`](/sdks/web-js/api-reference/types/gettokensoptions)): `Promise`\<[`MonoCloudTokens`](/sdks/web-js/api-reference/types/monocloudtokens)\> + +Retrieves the active tokens for the current session. + +If the access token is expired (or about to expire), this method automatically attempts to refresh it using the Refresh Token Grant before returning. + +#### Parameters + +| Parameter | Type | Description | +| ---------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| `options?` | [`GetTokensOptions`](/sdks/web-js/api-reference/types/gettokensoptions) | Options that control token retrieval (force refresh, scopes, resource). | + +#### Returns + +`Promise`\<[`MonoCloudTokens`](/sdks/web-js/api-reference/types/monocloudtokens)\> + +The active tokens for the requested resource and scopes. + +#### Examples + +```typescript:src/app.ts tab="Default Tokens" tab-group="getTokens" +const tokens = await client.getTokens(); +console.log(tokens.accessToken); +``` + +```typescript:src/app.ts tab="Force Refresh" tab-group="getTokens" +const tokens = await client.getTokens({ forceRefresh: true }); +``` + +```typescript:src/app.ts tab="Specific Resource" tab-group="getTokens" +const tokens = await client.getTokens({ + resource: 'https://api.example.com', + scopes: 'read:data', +}); +``` + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) If no session exists or the access token cannot be located. + +--- + +### processCallback() + +> **processCallback**(): `Promise`\<`void`\> + +Processes the authentication callback from the authorization server. + +Call this once on application startup (typically in your entry point or +router). It inspects the current URL together with the persisted callback +state and automatically completes a pending sign-in or sign-out flow - +there is no need to dispatch on the route yourself. + +#### Returns + +`Promise`\<`void`\> + +A promise that resolves when callback processing is complete. + +#### Example + +```typescript:src/main.ts +async function init() { + // Complete any pending redirect callback before rendering. + await client.processCallback(); + + // Continue mounting the app. +} + +init(); +``` + +--- + +### refetchUserInfo() + +> **refetchUserInfo**(): `Promise`\<`void`\> + +Refetches user information from the UserInfo endpoint and updates the local session. + +The default access token (matching the client's configured default resource and authorized scopes) is used to call the UserInfo endpoint. + +#### Returns + +`Promise`\<`void`\> + +#### Example + +```typescript:src/app.ts +await client.refetchUserInfo(); +const session = await client.getSession(); +console.log('Updated user data:', session?.user); +``` + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) If the session is invalid or the default access token is missing. + +--- + +### refreshSession() + +> **refreshSession**(`refreshOptions?`: [`RefreshOptions`](/sdks/web-js/api-reference/types/refreshoptions)): `Promise`\<`void`\> + +Refreshes the current user's session using the OAuth 2.0 Refresh Token Grant. + +Requires a session that includes a refresh token (obtained by including the `offline_access` scope at sign-in). + +To start a fresh, non-interactive authorization (for example, on app bootstrap when there is no local session yet) use [signInSilent()](#signinsilent) instead. + +#### Parameters + +| Parameter | Type | Description | +| ----------------- | --------------------------------------------------------------------------- | -------------------------------------------- | +| `refreshOptions?` | [`RefreshOptions`](/sdks/web-js/api-reference/types/refreshoptions) | Optional configuration for the refresh flow. | + +#### Returns + +`Promise`\<`void`\> + +A promise that resolves when the session has been refreshed. + +#### Examples + +```typescript:src/app.ts tab="Default" tab-group="refreshSession" +await client.refreshSession(); +``` + +```typescript:src/app.ts tab="Resource-Scoped Refresh" tab-group="refreshSession" +await client.refreshSession({ + refreshGrantOptions: { + resource: 'https://api.example.com', + scopes: 'read:data', + }, +}); +``` + +#### Throws + +[MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) If the session is invalid or missing a refresh token. + +--- + +### signIn() + +> **signIn**(`signInOptions?`: [`SignInOptions`](/sdks/web-js/api-reference/types/signinoptions)): `Promise`\<`void`\> + +Initiates the sign-in flow. + +#### Parameters + +| Parameter | Type | Description | +| ---------------- | ------------------------------------------------------------------------- | ----------------------------------------------- | +| `signInOptions?` | [`SignInOptions`](/sdks/web-js/api-reference/types/signinoptions) | Optional configuration for the sign-in request. | + +#### Returns + +`Promise`\<`void`\> + +#### Examples + +```typescript:src/app.ts tab="Redirect Flow" tab-group="signIn" +await client.signIn(); +``` + +```typescript:src/app.ts tab="Popup Flow" tab-group="signIn" +await client.signIn({ mode: 'popup' }); +``` + +```typescript:src/app.ts tab="Sign Up" tab-group="signIn" +await client.signIn({ signUp: true }); +``` + +--- + +### signInSilent() + +> **signInSilent**(`signInSilentOptions?`: [`SignInSilentOptions`](/sdks/web-js/api-reference/types/signinsilentoptions)): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Attempts to silently sign the user in using a hidden iframe and `prompt=none`. + +Useful for restoring a session at app bootstrap when the user is signed in at MonoCloud but no local session exists yet (for example, after opening a new tab or a hard refresh that cleared in-memory storage). + +The method runs a full authorization round-trip through a hidden iframe. If MonoCloud has a valid session it resolves to the new session. Otherwise it rejects with a [MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror). + +#### Parameters + +| Parameter | Type | Description | +| ---------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------ | +| `signInSilentOptions?` | [`SignInSilentOptions`](/sdks/web-js/api-reference/types/signinsilentoptions) | Optional configuration for the silent sign-in request. | + +#### Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +The newly established session. + +#### Example + +```typescript:src/app.ts +import { MonoCloudOPError } from '@monocloud/auth-web-js'; + +try { + const session = await client.signInSilent(); + console.log('Restored session for:', session.user); +} catch (error) { + if (error instanceof MonoCloudOPError && error.error === 'login_required') { + console.log('Not signed in'); + } else { + throw error; + } +} +``` + +#### Throws + +[MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) If the authorization server cannot satisfy the request - for example, because the user has no IdP session (`login_required`) or interaction is otherwise required. + +#### Throws + +[MonoCloudJsError](/sdks/web-js/api-reference/error-classes/monocloudjserror) If the iframe cannot be created (for example, in a cross-origin-isolated context) or the authentication window times out. + +--- + +### signOut() + +> **signOut**(`signOutOptions?`: [`SignOutOptions`](/sdks/web-js/api-reference/types/signoutoptions)): `Promise`\<`void`\> + +Initiates the sign-out flow. + +Clears the local session and, when `federatedSignOut` is enabled, also signs the user out of MonoCloud (Single Sign-Out). + +#### Parameters + +| Parameter | Type | Description | +| ----------------- | --------------------------------------------------------------------------- | ------------------------------------------------ | +| `signOutOptions?` | [`SignOutOptions`](/sdks/web-js/api-reference/types/signoutoptions) | Optional configuration for the sign-out request. | + +#### Returns + +`Promise`\<`void`\> + +A promise that resolves when the sign-out flow has been initiated (redirect mode) or completed (popup mode). + +#### Examples + +```typescript:src/app.ts tab="Redirect Flow" tab-group="signOut" +await client.signOut(); +``` + +```typescript:src/app.ts tab="Popup Flow" tab-group="signOut" +await client.signOut({ mode: 'popup' }); +``` diff --git a/docs/markdown/Classes/_monocloud_auth-web-js.index.SessionStorage.md b/docs/markdown/Classes/_monocloud_auth-web-js.index.SessionStorage.md new file mode 100644 index 00000000..ccbf9edf --- /dev/null +++ b/docs/markdown/Classes/_monocloud_auth-web-js.index.SessionStorage.md @@ -0,0 +1,83 @@ +--- +rootSdk: JavaScript +title: "SessionStorage" +category: Classes +description: "window.sessionStorage-backed implementation of IStorage. Data persists for the lifetime of the current browser tab." +--- + +# Class: SessionStorage + +`window.sessionStorage`-backed implementation of [IStorage](/sdks/web-js/api-reference/types/istorage). + +Data persists for the lifetime of the current browser tab. + +## Implements + +- [`IStorage`](/sdks/web-js/api-reference/types/istorage) + +## Constructors + +### Constructor + +> **new SessionStorage**(): `SessionStorage` + +#### Returns + +`SessionStorage` + +## Methods + +### getItem() + +> **getItem**(`key`: `string`): `Promise`\<`string` \| `null`\> + +Retrieves the value associated with the given key. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `key` | `string` | The unique identifier for the stored item. | + +#### Returns + +`Promise`\<`string` \| `null`\> + +The stored value as a string, or `null` if the key does not exist. + +--- + +### removeItem() + +> **removeItem**(`key`: `string`): `Promise`\<`void`\> + +Removes the item associated with the specified key from storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | -------------------------------------------- | +| `key` | `string` | The unique identifier of the item to remove. | + +#### Returns + +`Promise`\<`void`\> + +--- + +### setItem() + +> **setItem**(`key`: `string`, `value`: `string`): `Promise`\<`void`\> + +Stores a key-value pair in the storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ----------------------------------- | +| `key` | `string` | The unique identifier for the item. | +| `value` | `string` | The string value to store. | + +#### Returns + +`Promise`\<`void`\> diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.md new file mode 100644 index 00000000..c7ffabe5 --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudAuthBaseError.md @@ -0,0 +1,44 @@ +--- +rootSdk: JavaScript +title: "MonoCloudAuthBaseError" +category: Error Classes +description: "Base class for all MonoCloud authentication errors." +--- + +# Error Class: MonoCloudAuthBaseError + +Base class for all MonoCloud authentication errors. + +All errors thrown by the MonoCloud SDK extend this class, allowing applications to safely detect and handle MonoCloud-specific failures using `instanceof`. + +## Extends + +- `Error` + +## Extended by + +- [`MonoCloudTokenError`](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) +- [`MonoCloudHttpError`](/sdks/web-js/api-reference/error-classes/monocloudhttperror) +- [`MonoCloudOPError`](/sdks/web-js/api-reference/error-classes/monocloudoperror) +- [`MonoCloudValidationError`](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) +- [`MonoCloudJsError`](/sdks/web-js/api-reference/error-classes/monocloudjserror) + +## Constructors + +### Constructor + +> **new MonoCloudAuthBaseError**(`message?`: `string`): `MonoCloudAuthBaseError` + +#### Parameters + +| Parameter | Type | +| ---------- | -------- | +| `message?` | `string` | + +#### Returns + +`MonoCloudAuthBaseError` + +#### Inherited from + +`Error.constructor` diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudHttpError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudHttpError.md new file mode 100644 index 00000000..e2a6111e --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudHttpError.md @@ -0,0 +1,36 @@ +--- +rootSdk: JavaScript +title: "MonoCloudHttpError" +category: Error Classes +description: "Error thrown when a request to the MonoCloud authorization server fails." +--- + +# Error Class: MonoCloudHttpError + +Error thrown when a request to the MonoCloud authorization server fails. + +This error typically indicates a network failure, an unexpected HTTP response, or an unsuccessful response returned by the authorization server. + +## Extends + +- [`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) + +## Constructors + +### Constructor + +> **new MonoCloudHttpError**(`message?`: `string`): `MonoCloudHttpError` + +#### Parameters + +| Parameter | Type | +| ---------- | -------- | +| `message?` | `string` | + +#### Returns + +`MonoCloudHttpError` + +#### Inherited from + +[`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror).[`constructor`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror#constructor) diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudJsError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudJsError.md new file mode 100644 index 00000000..addf0d3e --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudJsError.md @@ -0,0 +1,16 @@ +--- +rootSdk: JavaScript +title: "MonoCloudJsError" +category: Error Classes +description: "Error thrown when a general JavaScript or internal SDK failure occurs." +--- + +# Error Class: MonoCloudJsError + +Error thrown when a general JavaScript or internal SDK failure occurs. + +This error indicates an unexpected issue within the browser that does not fall under network, validation, or OAuth-specific categories. + +## Extends + +- [`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudOPError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudOPError.md new file mode 100644 index 00000000..ee4bfcc8 --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudOPError.md @@ -0,0 +1,44 @@ +--- +rootSdk: JavaScript +title: "MonoCloudOPError" +category: Error Classes +description: "OAuth error returned by the authorization server during an authentication or token request." +--- + +# Error Class: MonoCloudOPError + +OAuth error returned by the authorization server during an authentication or token request. + +These errors correspond to standard OAuth / OpenID Connect error responses such as `invalid_request`, `access_denied`, or `invalid_grant`. + +## Extends + +- [`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) + +## Constructors + +### Constructor + +> **new MonoCloudOPError**(`error`: `string`, `errorDescription?`: `string`): `MonoCloudOPError` + +#### Parameters + +| Parameter | Type | +| ------------------- | -------- | +| `error` | `string` | +| `errorDescription?` | `string` | + +#### Returns + +`MonoCloudOPError` + +#### Overrides + +[`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror).[`constructor`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror#constructor) + +## Properties + +| Property | Type | Description | +| ------------------------------------------------- | -------- | ------------------------------------------------------ | +| `error` | `string` | OAuth error code returned by the authorization server. | +| `errorDescription?` | `string` | Human-readable description of the error. | diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudTokenError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudTokenError.md new file mode 100644 index 00000000..98e581d6 --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudTokenError.md @@ -0,0 +1,34 @@ +--- +rootSdk: JavaScript +title: "MonoCloudTokenError" +category: Error Classes +description: "Error thrown when a token operation fails." +--- + +# Error Class: MonoCloudTokenError + +Error thrown when a token operation fails. + +## Extends + +- [`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) + +## Constructors + +### Constructor + +> **new MonoCloudTokenError**(`message?`: `string`): `MonoCloudTokenError` + +#### Parameters + +| Parameter | Type | +| ---------- | -------- | +| `message?` | `string` | + +#### Returns + +`MonoCloudTokenError` + +#### Inherited from + +[`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror).[`constructor`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror#constructor) diff --git a/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudValidationError.md b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudValidationError.md new file mode 100644 index 00000000..ddb71920 --- /dev/null +++ b/docs/markdown/Error_Classes/_monocloud_auth-web-js.index.MonoCloudValidationError.md @@ -0,0 +1,34 @@ +--- +rootSdk: JavaScript +title: "MonoCloudValidationError" +category: Error Classes +description: "Error thrown when validation fails." +--- + +# Error Class: MonoCloudValidationError + +Error thrown when validation fails. + +## Extends + +- [`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) + +## Constructors + +### Constructor + +> **new MonoCloudValidationError**(`message?`: `string`): `MonoCloudValidationError` + +#### Parameters + +| Parameter | Type | +| ---------- | -------- | +| `message?` | `string` | + +#### Returns + +`MonoCloudValidationError` + +#### Inherited from + +[`MonoCloudAuthBaseError`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror).[`constructor`](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror#constructor) diff --git a/docs/markdown/Other/_monocloud_auth-web-js.index.md b/docs/markdown/Other/_monocloud_auth-web-js.index.md new file mode 100644 index 00000000..dcf3ed6e --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.index.md @@ -0,0 +1,79 @@ +--- +rootSdk: JavaScript +title: "index" +category: Other +--- + +# index + +## Classes + +- [LocalStorage](/sdks/web-js/api-reference/classes/localstorage) +- [MemoryStorage](/sdks/web-js/api-reference/classes/memorystorage) +- [MonoCloudOidcClient](/sdks/web-js/api-reference/classes/monocloudoidcclient) +- [MonoCloudWebJSClient](/sdks/web-js/api-reference/classes/monocloudwebjsclient) +- [SessionStorage](/sdks/web-js/api-reference/classes/sessionstorage) + +## Error Classes + +- [MonoCloudAuthBaseError](/sdks/web-js/api-reference/error-classes/monocloudauthbaseerror) +- [MonoCloudHttpError](/sdks/web-js/api-reference/error-classes/monocloudhttperror) +- [MonoCloudJsError](/sdks/web-js/api-reference/error-classes/monocloudjserror) +- [MonoCloudOPError](/sdks/web-js/api-reference/error-classes/monocloudoperror) +- [MonoCloudTokenError](/sdks/web-js/api-reference/error-classes/monocloudtokenerror) +- [MonoCloudValidationError](/sdks/web-js/api-reference/error-classes/monocloudvalidationerror) + +## Types + +- [AccessToken](/sdks/web-js/api-reference/types/accesstoken) +- [Address](/sdks/web-js/api-reference/types/address) +- [ApplicationState](/sdks/web-js/api-reference/types/applicationstate) +- [AuthenticateOptions](/sdks/web-js/api-reference/types/authenticateoptions) +- [AuthorizationParams](/sdks/web-js/api-reference/types/authorizationparams) +- [AuthState](/sdks/web-js/api-reference/types/authstate) +- [CallbackParams](/sdks/web-js/api-reference/types/callbackparams) +- [CallbackState](/sdks/web-js/api-reference/types/callbackstate) +- [DefaultAuthParams](/sdks/web-js/api-reference/types/defaultauthparams) +- [EndSessionParameters](/sdks/web-js/api-reference/types/endsessionparameters) +- [GetTokensOptions](/sdks/web-js/api-reference/types/gettokensoptions) +- [Group](/sdks/web-js/api-reference/types/group) +- [IdTokenClaims](/sdks/web-js/api-reference/types/idtokenclaims) +- [Indicator](/sdks/web-js/api-reference/types/indicator) +- [IssuerMetadata](/sdks/web-js/api-reference/types/issuermetadata) +- [IStorage](/sdks/web-js/api-reference/types/istorage) +- [Jwk](/sdks/web-js/api-reference/types/jwk) +- [Jwks](/sdks/web-js/api-reference/types/jwks) +- [JwsHeaderParameters](/sdks/web-js/api-reference/types/jwsheaderparameters) +- [MonoCloudClientOptionsBase](/sdks/web-js/api-reference/types/monocloudclientoptionsbase) +- [MonoCloudSession](/sdks/web-js/api-reference/types/monocloudsession) +- [MonoCloudTokens](/sdks/web-js/api-reference/types/monocloudtokens) +- [MonoCloudUser](/sdks/web-js/api-reference/types/monoclouduser) +- [MonoCloudWebJSClientOptions](/sdks/web-js/api-reference/types/monocloudwebjsclientoptions) +- [ParResponse](/sdks/web-js/api-reference/types/parresponse) +- [PushedAuthorizationParams](/sdks/web-js/api-reference/types/pushedauthorizationparams) +- [RefetchUserInfoOptions](/sdks/web-js/api-reference/types/refetchuserinfooptions) +- [RefreshGrantOptions](/sdks/web-js/api-reference/types/refreshgrantoptions) +- [RefreshOptions](/sdks/web-js/api-reference/types/refreshoptions) +- [RefreshSessionOptions](/sdks/web-js/api-reference/types/refreshsessionoptions) +- [SignInOptions](/sdks/web-js/api-reference/types/signinoptions) +- [SignInSilentOptions](/sdks/web-js/api-reference/types/signinsilentoptions) +- [SignOutOptions](/sdks/web-js/api-reference/types/signoutoptions) +- [Tokens](/sdks/web-js/api-reference/types/tokens) +- [UserinfoResponse](/sdks/web-js/api-reference/types/userinforesponse) + +## Types (Enums) + +- [Authenticators](/sdks/web-js/api-reference/enums/authenticators) +- [ClientAuthMethod](/sdks/web-js/api-reference/enums/clientauthmethod) +- [CodeChallengeMethod](/sdks/web-js/api-reference/enums/codechallengemethod) +- [DisplayOptions](/sdks/web-js/api-reference/enums/displayoptions) +- [InteractionMode](/sdks/web-js/api-reference/enums/interactionmode) +- [Prompt](/sdks/web-js/api-reference/enums/prompt) +- [ResponseModes](/sdks/web-js/api-reference/enums/responsemodes) +- [ResponseTypes](/sdks/web-js/api-reference/enums/responsetypes) +- [SecurityAlgorithms](/sdks/web-js/api-reference/enums/securityalgorithms) + +## Types (Handler) + +- [OnSessionCreating](/sdks/web-js/api-reference/handler-types/onsessioncreating) +- [PostCallback](/sdks/web-js/api-reference/handler-types/postcallback) diff --git a/docs/markdown/Other/_monocloud_auth-web-js.md b/docs/markdown/Other/_monocloud_auth-web-js.md new file mode 100644 index 00000000..8babdc97 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.md @@ -0,0 +1,153 @@ +--- +rootSdk: JavaScript +title: "@monocloud/auth-web-js" +category: Other +--- + +# auth-web-js + + + +## Introduction + +**MonoCloud Web Authentication SDK – secure authentication for single-page applications and other browser-based JavaScript environments.** + +[MonoCloud](https://www.monocloud.com?utm_source=github&utm_medium=auth_js) is a modern, developer-friendly Identity & Access Management platform. + +This SDK provides a **browser-side authentication client** for single-page apps (SPAs) and any JavaScript environment running in the browser. It implements **OAuth 2.0 / OpenID Connect** with **PKCE**, handles redirect and popup flows, manages sessions and tokens, and serves as the foundation for higher-level framework SDKs (React, Vue, Angular, Svelte, Astro, etc.). + +## 📘 Documentation + +- **Documentation:** [https://www.monocloud.com/docs](https://www.monocloud.com/docs?utm_source=github&utm_medium=auth_js) +- **API Reference:** [https://monocloud.github.io/auth-js](https://monocloud.github.io/auth-js?utm_source=github&utm_medium=auth_js) + +## Supported Platforms + +- **Modern Browsers** (Chrome, Edge, Firefox, Safari) + +## 🚀 Getting Started + +### Requirements + +- A **MonoCloud Tenant** +- A **Client** configured as a Single Page Application (SPA) +- The application's URL registered in **Callback URLs**, **Sign-out URLs** and **Cross Origin URLs** + +## 📦 Installation + +```bash +npm install @monocloud/auth-web-js +``` + +### Initialization + +Create a shared `MonoCloudWebJSClient` instance and reuse it throughout your application. + +```typescript +import { MonoCloudWebJSClient } from "@monocloud/auth-web-js"; + +export const client = new MonoCloudWebJSClient({ + tenantDomain: "https://", + clientId: "", +}); +``` + +### Process the Callback + +Call `processCallback()` once at application startup. It inspects the current URL and the persisted callback state to automatically complete a pending sign-in or sign-out flow — no per-route dispatch required. When the current URL is not an in-progress callback, it is a no-op. + +```typescript +await client.processCallback(); +``` + +### Sign In and Sign Out + +Start an authentication flow by redirecting the user to MonoCloud, or end the session and return the user to your sign-out callback. + +```typescript +await client.signIn(); + +await client.signOut(); +``` + +### Silent Sign In (SSO Restore) + +Attempt to restore an authenticated session at app bootstrap without disrupting the user. Uses a hidden iframe with `prompt=none`; resolves to the new session on success, or rejects with a `MonoCloudOPError` (typically `login_required`) when the authorization server cannot satisfy the request without interaction. + +```typescript +import { MonoCloudOPError } from "@monocloud/auth-web-js"; + +try { + const session = await client.signInSilent(); + console.log("Restored session for:", session.user); +} catch (error) { + if (error instanceof MonoCloudOPError && error.error === "login_required") { + console.log("Not signed in"); + } else { + throw error; + } +} +``` + +### Get the Current Session + +Retrieve the active session, including the authenticated user's profile and tokens. Returns `null` when no user is signed in. + +```typescript +const session = await client.getSession(); + +if (session) { + console.log(session.user); +} +``` + +## When should I use `auth-web-js`? + +Use **`@monocloud/auth-web-js`** if you are building a **browser-based JavaScript application** and want a secure, OIDC-compliant authentication client without tying yourself to a specific UI framework. + +This package is a good fit if you: + +- Are building a **single-page application (SPA)** in plain JavaScript / TypeScript +- Are writing a **custom framework integration** on top of MonoCloud +- Need full control over **PKCE, redirects, popups, silent refresh, and token storage** +- Want **cross-tab refresh coordination** and pluggable storage out of the box + +Higher-level packages build on top of `auth-web-js` and provide framework-specific ergonomics while reusing the same underlying browser implementation. + +## 🤝 Contributing & Support + +### Issues & Feedback + +- Use **GitHub Issues** for bug reports and feature requests. +- For tenant or account-specific help, contact MonoCloud Support through your dashboard. + +### Security + +Do **not** report security issues publicly. Please follow the contact instructions at: [https://www.monocloud.com/contact](https://www.monocloud.com/contact?utm_source=github&utm_medium=auth_js) + +## 📄 License + +Licensed under the **MIT License**. See the included [`LICENSE`](https://github.com/monocloud/auth-js/blob/main/LICENSE) file. + +## Modules + +- [index](/sdks/web-js/api-reference/undefined/index) +- [utils](/sdks/web-js/api-reference/undefined/utils) +- [utils/internal](/sdks/web-js/api-reference/undefined/utils_internal) diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.decrypt.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.decrypt.md new file mode 100644 index 00000000..543768b5 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.decrypt.md @@ -0,0 +1,25 @@ +--- +rootSdk: JavaScript +title: "decrypt" +category: Other +description: "Decrypts an encrypted string using a secret with AES-GCM." +--- + +# decrypt + +> **decrypt**(`encrypted`: `string`, `secret`: `string`): `Promise`\<`string` \| `undefined`\> + +Decrypts an encrypted string using a secret with AES-GCM. + +## Parameters + +| Parameter | Type | Description | +| ----------- | -------- | --------------------------------------------- | +| `encrypted` | `string` | The ciphertext to decrypt. | +| `secret` | `string` | The secret used to derive the decryption key. | + +## Returns + +`Promise`\<`string` \| `undefined`\> + +Decrypted plaintext string or undefined if decryption fails. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptAuthState.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptAuthState.md new file mode 100644 index 00000000..304119d4 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptAuthState.md @@ -0,0 +1,35 @@ +--- +rootSdk: JavaScript +title: "decryptAuthState" +category: Other +description: "Decrypts an encrypted AuthState." +--- + +# decryptAuthState + +> **decryptAuthState**\<`T`\>(`encryptedAuthState`: `string`, `secret`: `string`): `Promise`\<`T`\> + +Decrypts an encrypted AuthState. + +## Type Parameters + +| Type Parameter | +| ------------------------------------------------------------------------------- | +| `T` _extends_ [`AuthState`](/sdks/web-js/api-reference/types/authstate) | + +## Parameters + +| Parameter | Type | Description | +| -------------------- | -------- | ------------------------------------------- | +| `encryptedAuthState` | `string` | The encrypted auth state string to decrypt. | +| `secret` | `string` | The secret used for decryption. | + +## Returns + +`Promise`\<`T`\> + +State object on success. + +## Throws + +If decryption fails or the auth state has expired. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptSession.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptSession.md new file mode 100644 index 00000000..a5895802 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.decryptSession.md @@ -0,0 +1,29 @@ +--- +rootSdk: JavaScript +title: "decryptSession" +category: Other +description: "Decrypts an encrypted MonoCloud session." +--- + +# decryptSession + +> **decryptSession**(`encryptedSession`: `string`, `secret`: `string`): `Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Decrypts an encrypted MonoCloud session. + +## Parameters + +| Parameter | Type | Description | +| ------------------ | -------- | ---------------------------------------- | +| `encryptedSession` | `string` | The encrypted session string to decrypt. | +| `secret` | `string` | The secret used for decryption. | + +## Returns + +`Promise`\<[`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession)\> + +Session object on success. + +## Throws + +If decryption fails or the session has expired. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.encrypt.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.encrypt.md new file mode 100644 index 00000000..8af5e9b3 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.encrypt.md @@ -0,0 +1,25 @@ +--- +rootSdk: JavaScript +title: "encrypt" +category: Other +description: "Encrypts a given string using a secret with AES-GCM." +--- + +# encrypt + +> **encrypt**(`data`: `string`, `secret`: `string`): `Promise`\<`string`\> + +Encrypts a given string using a secret with AES-GCM. + +## Parameters + +| Parameter | Type | Description | +| --------- | -------- | --------------------------------------------- | +| `data` | `string` | The plaintext data to encrypt. | +| `secret` | `string` | The secret used to derive the encryption key. | + +## Returns + +`Promise`\<`string`\> + +Base64-encoded ciphertext. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptAuthState.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptAuthState.md new file mode 100644 index 00000000..61aa4108 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptAuthState.md @@ -0,0 +1,32 @@ +--- +rootSdk: JavaScript +title: "encryptAuthState" +category: Other +description: "Encrypts an AuthState object with a secret and optional time-to-live (TTL)." +--- + +# encryptAuthState + +> **encryptAuthState**\<`T`\>(`authState`: `T`, `secret`: `string`, `ttl?`: `number`): `Promise`\<`string`\> + +Encrypts an AuthState object with a secret and optional time-to-live (TTL). + +## Type Parameters + +| Type Parameter | +| ------------------------------------------------------------------------------- | +| `T` _extends_ [`AuthState`](/sdks/web-js/api-reference/types/authstate) | + +## Parameters + +| Parameter | Type | Description | +| ----------- | -------- | --------------------------------------------------------------------- | +| `authState` | `T` | A type that extends the AuthState interface. | +| `secret` | `string` | The secret used for encryption. | +| `ttl?` | `number` | Optional time-to-live in seconds, after which the auth state expires. | + +## Returns + +`Promise`\<`string`\> + +Encrypted auth state string. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptSession.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptSession.md new file mode 100644 index 00000000..eaf18ca0 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.encryptSession.md @@ -0,0 +1,26 @@ +--- +rootSdk: JavaScript +title: "encryptSession" +category: Other +description: "Encrypts a MonoCloud session object with a secret and optional time-to-live (TTL)." +--- + +# encryptSession + +> **encryptSession**(`session`: [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession), `secret`: `string`, `ttl?`: `number`): `Promise`\<`string`\> + +Encrypts a MonoCloud session object with a secret and optional time-to-live (TTL). + +## Parameters + +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| `session` | [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) | The session object to encrypt. | +| `secret` | `string` | The secret used for encryption. | +| `ttl?` | `number` | Optional time-to-live in seconds, after which the session expires. | + +## Returns + +`Promise`\<`string`\> + +Encrypted session string. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.generateNonce.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.generateNonce.md new file mode 100644 index 00000000..fb2f63f7 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.generateNonce.md @@ -0,0 +1,16 @@ +--- +rootSdk: JavaScript +title: "generateNonce" +category: Other +description: "Generates a random nonce string." +--- + +# generateNonce + +> **generateNonce**(): `string` + +Generates a random nonce string. + +## Returns + +`string` diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.generatePKCE.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.generatePKCE.md new file mode 100644 index 00000000..7d9f0528 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.generatePKCE.md @@ -0,0 +1,16 @@ +--- +rootSdk: JavaScript +title: "generatePKCE" +category: Other +description: "Generates a PKCE (Proof Key for Code Exchange) code verifier and code challenge." +--- + +# generatePKCE + +> **generatePKCE**(): `Promise`\<\{ `codeChallenge`: `string`; `codeVerifier`: `string`; \}\> + +Generates a PKCE (Proof Key for Code Exchange) code verifier and code challenge. + +## Returns + +`Promise`\<\{ `codeChallenge`: `string`; `codeVerifier`: `string`; \}\> diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.generateState.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.generateState.md new file mode 100644 index 00000000..8383abeb --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.generateState.md @@ -0,0 +1,16 @@ +--- +rootSdk: JavaScript +title: "generateState" +category: Other +description: "Generates a random state string." +--- + +# generateState + +> **generateState**(): `string` + +Generates a random state string. + +## Returns + +`string` diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.isUserInGroup.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.isUserInGroup.md new file mode 100644 index 00000000..15203410 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.isUserInGroup.md @@ -0,0 +1,27 @@ +--- +rootSdk: JavaScript +title: "isUserInGroup" +category: Other +description: "Checks if a user is a member of a specified group or groups." +--- + +# isUserInGroup + +> **isUserInGroup**(`user`: [`MonoCloudUser`](/sdks/web-js/api-reference/types/monoclouduser) \| [`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims), `groups`: `string`[], `groupsClaim?`: `string`, `matchAll?`: `boolean`): `boolean` + +Checks if a user is a member of a specified group or groups. + +## Parameters + +| Parameter | Type | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| `user` | [`MonoCloudUser`](/sdks/web-js/api-reference/types/monoclouduser) \| [`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims) | The user. | +| `groups` | `string`[] | An array of group names or IDs to check membership against. | +| `groupsClaim` | `string` | The claim in the user object that contains groups. | +| `matchAll` | `boolean` | If `true`, requires the user to be in all specified groups; if `false`, checks if the user is in at least one of the groups. | + +## Returns + +`boolean` + +`true` if the user is in the specified groups, `false` otherwise. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.md new file mode 100644 index 00000000..f937c422 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.md @@ -0,0 +1,21 @@ +--- +rootSdk: JavaScript +title: "utils" +category: Other +--- + +# utils + +## Functions + +- [decrypt](/sdks/web-js/api-reference/undefined/decrypt) +- [decryptAuthState](/sdks/web-js/api-reference/undefined/decryptauthstate) +- [decryptSession](/sdks/web-js/api-reference/undefined/decryptsession) +- [encrypt](/sdks/web-js/api-reference/undefined/encrypt) +- [encryptAuthState](/sdks/web-js/api-reference/undefined/encryptauthstate) +- [encryptSession](/sdks/web-js/api-reference/undefined/encryptsession) +- [generateNonce](/sdks/web-js/api-reference/undefined/generatenonce) +- [generatePKCE](/sdks/web-js/api-reference/undefined/generatepkce) +- [generateState](/sdks/web-js/api-reference/undefined/generatestate) +- [isUserInGroup](/sdks/web-js/api-reference/undefined/isuseringroup) +- [parseCallbackParams](/sdks/web-js/api-reference/undefined/parsecallbackparams) diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils.parseCallbackParams.md b/docs/markdown/Other/_monocloud_auth-web-js.utils.parseCallbackParams.md new file mode 100644 index 00000000..d0689077 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils.parseCallbackParams.md @@ -0,0 +1,22 @@ +--- +rootSdk: JavaScript +title: "parseCallbackParams" +category: Other +description: "Parses callback parameters from a URL, a URLSearchParams object, or a query string." +--- + +# parseCallbackParams + +> **parseCallbackParams**(`queryOrUrl`: `string` \| `URL` \| `URLSearchParams`): [`CallbackParams`](/sdks/web-js/api-reference/types/callbackparams) + +Parses callback parameters from a URL, a URLSearchParams object, or a query string. + +## Parameters + +| Parameter | Type | +| ------------ | -------------------------------------- | +| `queryOrUrl` | `string` \| `URL` \| `URLSearchParams` | + +## Returns + +[`CallbackParams`](/sdks/web-js/api-reference/types/callbackparams) diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.findToken.md b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.findToken.md new file mode 100644 index 00000000..89a65100 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.findToken.md @@ -0,0 +1,26 @@ +--- +rootSdk: JavaScript +title: "findToken" +category: Other +description: "Finds a specific access token in an array based on resource and scopes." +--- + +# findToken + +> **findToken**(`tokens?`: [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken)[], `resource?`: `string`, `scopes?`: `string`): [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken) \| `undefined` + +Finds a specific access token in an array based on resource and scopes. + +## Parameters + +| Parameter | Type | Description | +| ----------- | ----------------------------------------------------------------------- | ------------------------------------ | +| `tokens?` | [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken)[] | The array of access tokens. | +| `resource?` | `string` | Space-separated resource indicators. | +| `scopes?` | `string` | Space-separated scopes. | + +## Returns + +[`AccessToken`](/sdks/web-js/api-reference/types/accesstoken) \| `undefined` + +The matching AccessToken, or `undefined` if not found. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.getPublicSigKeyFromIssuerJwks.md b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.getPublicSigKeyFromIssuerJwks.md new file mode 100644 index 00000000..1c1a0f8d --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.getPublicSigKeyFromIssuerJwks.md @@ -0,0 +1,29 @@ +--- +rootSdk: JavaScript +title: "getPublicSigKeyFromIssuerJwks" +category: Other +description: "Retrieves a public CryptoKey from a JWK set based on the JWS header." +--- + +# getPublicSigKeyFromIssuerJwks + +> **getPublicSigKeyFromIssuerJwks**(`jwks`: [`Jwk`](/sdks/web-js/api-reference/types/jwk)[], `header`: [`JwsHeaderParameters`](/sdks/web-js/api-reference/types/jwsheaderparameters)): `Promise`\<`CryptoKey`\> + +Retrieves a public CryptoKey from a JWK set based on the JWS header. + +## Parameters + +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------------------- | --------------------------------------------------- | +| `jwks` | [`Jwk`](/sdks/web-js/api-reference/types/jwk)[] | The set of JSON Web Keys. | +| `header` | [`JwsHeaderParameters`](/sdks/web-js/api-reference/types/jwsheaderparameters) | The JWS header containing the algorithm and key ID. | + +## Returns + +`Promise`\<`CryptoKey`\> + +A promise that resolves to the CryptoKey. + +## Throws + +If no applicable key or multiple keys are found or the algorithm is unsupported. diff --git a/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.md b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.md new file mode 100644 index 00000000..f3752c41 --- /dev/null +++ b/docs/markdown/Other/_monocloud_auth-web-js.utils_internal.md @@ -0,0 +1,12 @@ +--- +rootSdk: JavaScript +title: "utils/internal" +category: Other +--- + +# internal + +## Functions + +- [findToken](/sdks/web-js/api-reference/undefined/findtoken) +- [getPublicSigKeyFromIssuerJwks](/sdks/web-js/api-reference/undefined/getpublicsigkeyfromissuerjwks) diff --git a/docs/markdown/README.md b/docs/markdown/README.md index 315eb78a..1fb58927 100644 --- a/docs/markdown/README.md +++ b/docs/markdown/README.md @@ -47,12 +47,13 @@ This SDK provides a typed JavaScript client for implementing **OAuth 2.0** and * ## 📦 Packages -| Package | Description | Links | -| ----------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| **@monocloud/auth-core** | Framework-agnostic authentication primitives and OAuth/OIDC logic | [npm](https://www.npmjs.com/package/@monocloud/auth-core) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/core) | -| **@monocloud/auth-node-core** | Node.js-specific helpers for server-side authentication flows | [npm](https://www.npmjs.com/package/@monocloud/auth-node-core) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/node-core) | -| **@monocloud/auth-nextjs** | Authentication SDK for Next.js (App Router & Pages Router) | [npm](https://www.npmjs.com/package/@monocloud/auth-nextjs) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/nextjs) | -| **@monocloud/backend-node** | Authentication SDK for Node.js API Servers | [npm](https://www.npmjs.com/package/@monocloud/backend-node) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/node-backend) | +| Package | Description | Links | +| ----------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| **@monocloud/auth-core** | Framework-agnostic authentication primitives and OAuth/OIDC logic | [npm](https://www.npmjs.com/package/@monocloud/auth-core) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/core) | +| **@monocloud/auth-web-js** | Browser-side authentication SDK for SPAs and other JavaScript apps | [npm](https://www.npmjs.com/package/@monocloud/auth-web-js) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/web-js) | +| **@monocloud/auth-node-core** | Node.js-specific helpers for server-side authentication flows | [npm](https://www.npmjs.com/package/@monocloud/auth-node-core) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/node-core) | +| **@monocloud/auth-nextjs** | Authentication SDK for Next.js (App Router & Pages Router) | [npm](https://www.npmjs.com/package/@monocloud/auth-nextjs) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/nextjs) | +| **@monocloud/backend-node** | Authentication SDK for Node.js API Servers | [npm](https://www.npmjs.com/package/@monocloud/backend-node) \| [README](https://github.com/monocloud/auth-js/tree/main/packages/node-backend) | > **Note:** `auth-core` is runtime-agnostic. Environment-specific packages build on top of it. diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.AccessToken.md b/docs/markdown/Types/_monocloud_auth-web-js.index.AccessToken.md new file mode 100644 index 00000000..c781c667 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.AccessToken.md @@ -0,0 +1,20 @@ +--- +rootSdk: JavaScript +title: "AccessToken" +category: Types +description: "Represents an OAuth 2.0 access token and its associated metadata." +--- + +# Type: AccessToken + +Represents an OAuth 2.0 access token and its associated metadata. + +## Properties + +| Property | Type | Description | +| ---------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| `accessToken` | `string` | The issued access token. | +| `accessTokenExpiration` | `number` | The expiration time of the access token (Unix epoch, in seconds). | +| `requestedScopes?` | `string` | Optional space-separated list of scopes originally requested during token acquisition. | +| `resource?` | `string` | Optional resource (audience) that the access token is scoped for. | +| `scopes` | `string` | Space-separated list of scopes granted to the access token. These represent the effective permissions approved by the authorization server. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Address.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Address.md new file mode 100644 index 00000000..8ec87e0b --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Address.md @@ -0,0 +1,27 @@ +--- +rootSdk: JavaScript +title: "Address" +category: Types +description: "Represents a postal address as defined by the OpenID Connect standard address claim." +--- + +# Type: Address + +Represents a postal address as defined by the OpenID Connect standard `address` claim. + +## Indexable + +> \[`key`: `string`\]: `unknown` + +Additional provider-specific address fields. + +## Properties + +| Property | Type | Description | +| --------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | +| `country?` | `string` | Country name or ISO country code. | +| `formatted?` | `string` | Full mailing address formatted for display or mailing labels. | +| `locality?` | `string` | City or locality component. | +| `postal_code?` | `string` | Postal or ZIP code. | +| `region?` | `string` | State, province, or region component. | +| `street_address?` | `string` | Full street address component, which may include house number, street name, apartment, suite, or unit information. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.ApplicationState.md b/docs/markdown/Types/_monocloud_auth-web-js.index.ApplicationState.md new file mode 100644 index 00000000..298b625e --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.ApplicationState.md @@ -0,0 +1,14 @@ +--- +rootSdk: JavaScript +title: "ApplicationState" +category: Types +description: "Custom application state passed through an authentication flow." +--- + +# Type: ApplicationState + +> **ApplicationState** = `Record`\<`string`, `unknown`\> + +Custom application state passed through an authentication flow. + +Captured when the flow is initiated (for example via `signIn` or `signInSilent`) and surfaced to the [OnSessionCreating](/sdks/web-js/api-reference/handler-types/onsessioncreating) hook when the session is constructed. diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.AuthState.md b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthState.md new file mode 100644 index 00000000..cffe32c3 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthState.md @@ -0,0 +1,21 @@ +--- +rootSdk: JavaScript +title: "AuthState" +category: Types +description: "Represents the authentication transaction state stored between the authorization request and the callback." +--- + +# Type: AuthState + +Represents the authentication transaction state stored between the authorization request and the callback. + +## Properties + +| Property | Type | Description | +| ----------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- | +| `codeVerifier?` | `string` | Optional. PKCE code verifier used to validate the authorization code exchange. | +| `maxAge?` | `number` | Optional. Maximum allowed time (in seconds) since the user's last authentication. | +| `nonce` | `string` | A cryptographic value used to associate the ID token with the original authentication request and prevent replay attacks. | +| `resource?` | `string` | Optional. Space-separated list of resource indicators requested for the access token. | +| `scopes` | `string` | Space-separated list of scopes requested during authorization. | +| `state` | `string` | A unique value used to correlate the authorization request with the callback and protect against CSRF attacks. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.AuthenticateOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthenticateOptions.md new file mode 100644 index 00000000..2aa00dae --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthenticateOptions.md @@ -0,0 +1,25 @@ +--- +rootSdk: JavaScript +title: "AuthenticateOptions" +category: Types +description: "Options used when authenticating a user via the Authorization Code flow." +--- + +# Type: AuthenticateOptions + +Options used when authenticating a user via the Authorization Code flow. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `codeVerifier?` | `string` | PKCE code verifier associated with the authorization request. | +| `fetchUserInfo?` | `boolean` | When enabled, user profile data is fetched from the UserInfo endpoint and merged into the session user object. | +| `filteredIdTokenClaims?` | `string`[] | List of ID token claims to remove before storing the session. | +| `idTokenClockSkew?` | `number` | Clock skew adjustment (in seconds) applied when validating ID token timestamps against the authorization server. | +| `idTokenClockTolerance?` | `number` | Additional allowed clock tolerance (in seconds) when validating time-based ID token claims such as `exp`, `iat`, and `nbf`. | +| `idTokenMaxAge?` | `number` | Maximum allowed authentication age (in seconds) for the ID token. | +| `idTokenNonce?` | `string` | Nonce value expected in the ID token. Used to prevent replay attacks. | +| `jwks?` | [`Jwks`](/sdks/web-js/api-reference/types/jwks) | JSON Web Key Set used to validate the ID token signature. If not provided, the JWKS is automatically fetched from the authorization server metadata. | +| `onSessionCreating?` | [`OnSessionCreating`](/sdks/nodejs/api-reference/handler-types/onsessioncreating) | Callback invoked before a session is created or updated. Allows customization or enrichment of the session. | +| `validateIdToken?` | `boolean` | Determines whether the ID token signature and claims should be validated. Disabling validation is not recommended except for advanced or controlled environments. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.AuthorizationParams.md b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthorizationParams.md new file mode 100644 index 00000000..e34647a6 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.AuthorizationParams.md @@ -0,0 +1,33 @@ +--- +rootSdk: JavaScript +title: "AuthorizationParams" +category: Types +description: "Parameters used to construct an OAuth 2.0 / OpenID Connect authorization request." +--- + +# Type: AuthorizationParams + +Parameters used to construct an OAuth 2.0 / OpenID Connect authorization request. + +## Properties + +| Property | Type | Description | +| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `acrValues?` | `string`[] | Authentication Context Class Reference (ACR) values requesting specific authentication assurance levels or methods. | +| `authenticatorHint?` | [`Authenticators`](/sdks/web-js/api-reference/enums/authenticators) | Hint to the authorization server indicating which authenticator or connection should be used. | +| `codeChallenge?` | `string` | PKCE code challenge derived from the code verifier. Used to secure authorization code exchanges. | +| `codeChallengeMethod?` | [`CodeChallengeMethod`](/sdks/web-js/api-reference/enums/codechallengemethod) | Method used to generate the PKCE code challenge. | +| `display?` | [`DisplayOptions`](/sdks/web-js/api-reference/enums/displayoptions) | Preferred display mode for the authentication UI. | +| `loginHint?` | `string` | Hint identifying the user (for example, email or username). Used to prefill or optimize the sign-in experience. | +| `maxAge?` | `number` | Maximum acceptable time (in seconds) since the user last authenticated. If exceeded, the user may be required to sign in again. | +| `nonce?` | `string` | A cryptographically random value included in the ID token to prevent replay attacks. | +| `prompt?` | [`Prompt`](/sdks/web-js/api-reference/enums/prompt) | Controls authentication interaction behavior. For example, forcing login or consent. | +| `redirectUri?` | `string` | The redirect URI where the authorization server sends the user after authentication completes. | +| `request?` | `string` | A signed JWT containing authorization request parameters. | +| `requestUri?` | `string` | URI referencing a previously created authorization request (typically via Pushed Authorization Requests — PAR). When set, other authorization parameters may be ignored. | +| `resource?` | `string` | Space-separated list of resource indicators that scope the issued access token. | +| `responseMode?` | [`ResponseModes`](/sdks/web-js/api-reference/enums/responsemodes) | Specifies how the authorization response is returned to the client. | +| `responseType?` | [`ResponseTypes`](/sdks/web-js/api-reference/enums/responsetypes) | Determines which artifacts are returned from the authorization endpoint. | +| `scopes?` | `string` | Space-separated list of scopes requested during authentication. | +| `state?` | `string` | A cryptographically random value used to maintain request state and protect against CSRF attacks. | +| `uiLocales?` | `string` | Preferred UI language. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackParams.md b/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackParams.md new file mode 100644 index 00000000..9449968f --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackParams.md @@ -0,0 +1,25 @@ +--- +rootSdk: JavaScript +title: "CallbackParams" +category: Types +description: "Parameters returned to the application after the authorization server redirects the user back to the callback URL." +--- + +# Type: CallbackParams + +Parameters returned to the application after the authorization server redirects the user back to the callback URL. + +## Properties + +| Property | Type | Description | +| ------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| `accessToken?` | `string` | Access token returned directly by implicit or hybrid flows. | +| `code?` | `string` | Authorization code returned when using the Authorization Code Flow. | +| `error?` | `string` | Error code returned when authorization fails. | +| `errorDescription?` | `string` | Human-readable description providing additional information about the authorization error. | +| `expiresIn?` | `number` | Lifetime of the access token in seconds. | +| `idToken?` | `string` | ID token issued by the authorization server. | +| `refreshToken?` | `string` | Refresh token issued during authorization (if enabled). | +| `scope?` | `string` | Access token scopes (Implicit Flow) | +| `sessionState?` | `string` | OIDC session state value used for session monitoring and front-channel session management. | +| `state?` | `string` | The state value originally sent in the authorization request. Used to validate request integrity and prevent CSRF attacks. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackState.md b/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackState.md new file mode 100644 index 00000000..f727e6ed --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.CallbackState.md @@ -0,0 +1,30 @@ +--- +rootSdk: JavaScript +title: "CallbackState" +category: Types +description: "Internal state persisted between an authorization request and its callback." +--- + +# Type: CallbackState + +Internal state persisted between an authorization request and its callback. + +## Extends + +- `Partial`\<[`AuthState`](/sdks/web-js/api-reference/types/authstate)\> + +## Properties + +| Property | Type | Description | +| ----------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `appState?` | [`ApplicationState`](/sdks/web-js/api-reference/types/applicationstate) | Custom application state associated with the request. | +| `codeVerifier?` | `string` | Optional. PKCE code verifier used to validate the authorization code exchange. | +| `maxAge?` | `number` | Optional. Maximum allowed time (in seconds) since the user's last authentication. | +| `mode` | `"popup"` \| `"redirect"` \| `"silent"` | Interaction mode used to initiate the original authorization request. | +| `nonce?` | `string` | A cryptographic value used to associate the ID token with the original authentication request and prevent replay attacks. | +| `resource?` | `string` | Optional. Space-separated list of resource indicators requested for the access token. | +| `responseType?` | [`ResponseTypes`](/sdks/web-js/api-reference/enums/responsetypes) | Response type requested during authorization. | +| `returnUrl?` | `string` | URL to navigate to after the callback has been processed. | +| `scopes?` | `string` | Space-separated list of scopes requested during authorization. | +| `signOut?` | `boolean` | Indicates whether the callback represents a sign-out flow. | +| `state?` | `string` | A unique value used to correlate the authorization request with the callback and protect against CSRF attacks. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.DefaultAuthParams.md b/docs/markdown/Types/_monocloud_auth-web-js.index.DefaultAuthParams.md new file mode 100644 index 00000000..5008d944 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.DefaultAuthParams.md @@ -0,0 +1,14 @@ +--- +rootSdk: JavaScript +title: "DefaultAuthParams" +category: Types +description: "Subset of AuthorizationParams that can be pre-configured as defaults for every authentication request." +--- + +# Type: DefaultAuthParams + +> **DefaultAuthParams** = `Pick`\<[`AuthorizationParams`](/sdks/web-js/api-reference/types/authorizationparams), `"scopes"` \| `"resource"` \| `"responseType"` \| `"prompt"` \| `"display"` \| `"uiLocales"` \| `"acrValues"` \| `"maxAge"` \| `"loginHint"` \| `"authenticatorHint"`\> + +Subset of [AuthorizationParams](/sdks/web-js/api-reference/types/authorizationparams) that can be pre-configured as defaults for every authentication request. + +Per-request values (`state`, `nonce`, `codeChallenge`, `codeChallengeMethod`, `redirectUri`) are managed internally by the SDK and cannot be overridden here. diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.EndSessionParameters.md b/docs/markdown/Types/_monocloud_auth-web-js.index.EndSessionParameters.md new file mode 100644 index 00000000..1730b992 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.EndSessionParameters.md @@ -0,0 +1,18 @@ +--- +rootSdk: JavaScript +title: "EndSessionParameters" +category: Types +description: "Parameters used to construct an OpenID Connect end-session (sign-out) request." +--- + +# Type: EndSessionParameters + +Parameters used to construct an OpenID Connect end-session (sign-out) request. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `idToken?` | `string` | ID token hint identifying the session to terminate. When provided, the authorization server can use this value to determine which user session should be signed out. | +| `postLogoutRedirectUri?` | `string` | The URL the authorization server should redirect the user to after a successful sign-out. | +| `state?` | `string` | Optional state value returned to the application after sign-out. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.GetTokensOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.GetTokensOptions.md new file mode 100644 index 00000000..cfa35f7b --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.GetTokensOptions.md @@ -0,0 +1,23 @@ +--- +rootSdk: JavaScript +title: "GetTokensOptions" +category: Types +description: "Options used to control token retrieval and refresh behavior in getTokens()." +--- + +# Type: GetTokensOptions + +Options used to control token retrieval and refresh behavior in `getTokens()`. + +## Extends + +- [`RefreshGrantOptions`](/sdks/web-js/api-reference/types/refreshgrantoptions) + +## Properties + +| Property | Type | Description | +| ----------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `forceRefresh?` | `boolean` | When `true`, forces an access token refresh even if the current token has not expired. | +| `refetchUserInfo?` | `boolean` | When enabled, refetches user information from the UserInfo endpoint after tokens are refreshed. | +| `resource?` | `string` | Space-separated list of resource indicators that the new access token should be issued for. The requested resources must have been previously granted during the original authorization flow. | +| `scopes?` | `string` | Space-separated list of scopes to request for the refreshed access token. The requested scopes must have been granted during the original authorization flow. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Group.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Group.md new file mode 100644 index 00000000..046417fa --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Group.md @@ -0,0 +1,28 @@ +--- +rootSdk: JavaScript +title: "Group" +category: Types +description: "Represents a user group included in the authenticated session." +--- + +# Type: Group + +> **Group** = \{ `id`: `string`; `name`: `string`; \} \| `string` + +Represents a user group included in the authenticated session. + +## Type Declaration + +> \{ `id`: `string`; `name`: `string`; \} + +Structured group representation. + +| Name | Type | Description | +| ------ | -------- | ----------------- | +| `id` | `string` | Group identifier. | +| `name` | `string` | Group name. | + + +> `string` + +Group identifier or group name. diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.IStorage.md b/docs/markdown/Types/_monocloud_auth-web-js.index.IStorage.md new file mode 100644 index 00000000..1b88897a --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.IStorage.md @@ -0,0 +1,77 @@ +--- +rootSdk: JavaScript +title: "IStorage" +category: Types +description: "Defines a storage adapter used to persist session data." +--- + +# Type: IStorage + +Defines a storage adapter used to persist session data. + +Implement this interface to plug a custom storage backend (for example, an +encrypted store, secure cookie helper, or a wrapper around `IndexedDB`) into +`MonoCloudWebJSClient`. + +Built-in implementations: + +- [LocalStorage](/sdks/web-js/api-reference/classes/localstorage) (default) - backed by `window.localStorage`. +- [SessionStorage](/sdks/web-js/api-reference/classes/sessionstorage) - backed by `window.sessionStorage`. +- [MemoryStorage](/sdks/web-js/api-reference/classes/memorystorage) - in-memory store, useful for testing. + +## Methods + +### getItem() + +> **getItem**(`key`: `string`): `Promise`\<`string` \| `null`\> + +Retrieves the value associated with the given key. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ------------------------------------------ | +| `key` | `string` | The unique identifier for the stored item. | + +#### Returns + +`Promise`\<`string` \| `null`\> + +The stored value as a string, or `null` if the key does not exist. + +--- + +### removeItem() + +> **removeItem**(`key`: `string`): `Promise`\<`void`\> + +Removes the item associated with the specified key from storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | -------------------------------------------- | +| `key` | `string` | The unique identifier of the item to remove. | + +#### Returns + +`Promise`\<`void`\> + +--- + +### setItem() + +> **setItem**(`key`: `string`, `value`: `string`): `Promise`\<`void`\> + +Stores a key-value pair in the storage. + +#### Parameters + +| Parameter | Type | Description | +| --------- | -------- | ----------------------------------- | +| `key` | `string` | The unique identifier for the item. | +| `value` | `string` | The string value to store. | + +#### Returns + +`Promise`\<`void`\> diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.IdTokenClaims.md b/docs/markdown/Types/_monocloud_auth-web-js.index.IdTokenClaims.md new file mode 100644 index 00000000..9eb5399c --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.IdTokenClaims.md @@ -0,0 +1,59 @@ +--- +rootSdk: JavaScript +title: "IdTokenClaims" +category: Types +description: "Standard OpenID Connect ID Token claims." +--- + +# Type: IdTokenClaims + +Standard OpenID Connect ID Token claims. + +## Extends + +- [`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse).[`JwtClaims`](/sdks/nodejs/api-reference/types/jwtclaims) + +## Indexable + +> \[`key`: `string`\]: `unknown` + +Additional provider-specific claims. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `acr?` | `string` | Authentication Context Class Reference. Indicates the assurance level of the authentication performed. | +| `address?` | [`Address`](/sdks/web-js/api-reference/types/address) | Postal address. | +| `amr?` | `string`[] | Authentication Methods References. Lists the authentication methods used (for example: `pwd`, `mfa`, `otp`). | +| `at_hash?` | `string` | Access token hash. Used to validate access tokens returned alongside the ID token. | +| `aud` | `string` \| `string`[] | Intended audience(s) of the token. | +| `auth_time?` | `number` | Time when the end-user authentication occurred (Unix epoch seconds). | +| `azp?` | `string` | Authorized party - identifies the client to which the ID token was issued. | +| `birthdate?` | `string` | Birthday. | +| `c_hash?` | `string` | Authorization code hash. Used to validate authorization codes returned with hybrid flows. | +| `email?` | `string` | Email address. | +| `email_verified?` | `boolean` | Whether the email address has been verified by the provider. | +| `exp` | `number` | Expiration time of the token (Unix epoch seconds). | +| `family_name?` | `string` | Surname(s) / last name. | +| `gender?` | `string` | Gender. | +| `given_name?` | `string` | Given name(s) / first name. | +| `groups?` | [`Group`](/sdks/web-js/api-reference/types/group)[] | Group memberships for the user. | +| `iat` | `number` | Time at which the token was issued (Unix epoch seconds). | +| `iss` | `string` | Issuer identifier - the authorization server that issued the token. | +| `locale?` | `string` | Locale. | +| `middle_name?` | `string` | Middle name(s). | +| `name?` | `string` | Full name of the user (e.g. "Jane Doe"). | +| `nbf?` | `number` | Not-before time (Unix epoch seconds). | +| `nickname?` | `string` | Casual name used by the user. | +| `nonce?` | `string` | Nonce value used to associate the authentication request with the issued ID token and prevent replay attacks. | +| `phone_number?` | `string` | Phone number (formatted in E.164 standard). | +| `phone_number_verified?` | `boolean` | Whether the phone number has been verified by the provider. | +| `picture?` | `string` | URL of the user's profile picture. | +| `preferred_username?` | `string` | Preferred username. | +| `profile?` | `string` | URL of the user's profile page. | +| `s_hash?` | `string` | State hash (used in some hybrid flow validations). | +| `sub` | `string` | Subject identifier - a unique, stable identifier for the user within the issuer. | +| `updated_at?` | `number` | Time the user's information was last updated (seconds since epoch). | +| `website?` | `string` | URL of the user's website. | +| `zoneinfo?` | `string` | Time zone name. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Indicator.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Indicator.md new file mode 100644 index 00000000..a64b49f3 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Indicator.md @@ -0,0 +1,19 @@ +--- +rootSdk: JavaScript +title: "Indicator" +category: Types +description: "Represents an additional resource indicator that can be requested when acquiring tokens." +--- + +# Type: Indicator + +Represents an additional resource indicator that can be requested when acquiring tokens. + +Resource indicators allow access tokens to be scoped to specific APIs or audiences. Multiple indicators can be configured to request tokens for different protected resources during the same authentication flow. + +## Properties + +| Property | Type | Description | +| -------------------------------- | -------- | ------------------------------------------------------------------------------------- | +| `resource` | `string` | Resource (or space-separated list of resources) the access token should be scoped to. | +| `scopes?` | `string` | Optional space-separated list of scopes to request specifically for this resource. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.IssuerMetadata.md b/docs/markdown/Types/_monocloud_auth-web-js.index.IssuerMetadata.md new file mode 100644 index 00000000..443e3dd8 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.IssuerMetadata.md @@ -0,0 +1,43 @@ +--- +rootSdk: JavaScript +title: "IssuerMetadata" +category: Types +description: "OpenID Connect Discovery metadata published by the authorization server." +--- + +# Type: IssuerMetadata + +OpenID Connect Discovery metadata published by the authorization server. + +## Properties + +| Property | Type | Description | +| ------------------------------------------------------------------------------------------------------ | ---------- | ------------------------------------------------------------------------ | +| `authorization_endpoint` | `string` | Authorization endpoint used to initiate authentication requests. | +| `backchannel_logout_session_supported` | `boolean` | Indicates back-channel logout session support. | +| `backchannel_logout_supported` | `boolean` | Indicates support for back-channel logout. | +| `check_session_iframe` | `string` | Session management iframe endpoint. | +| `claims_supported` | `string`[] | Claims that may be returned in tokens or UserInfo responses. | +| `code_challenge_methods_supported` | `string`[] | Supported PKCE code challenge methods. | +| `device_authorization_endpoint` | `string` | Device Authorization Grant endpoint. | +| `end_session_endpoint` | `string` | End-session endpoint used to initiate logout. | +| `frontchannel_logout_session_supported` | `boolean` | Indicates front-channel logout session support. | +| `frontchannel_logout_supported` | `boolean` | Indicates support for front-channel logout. | +| `grant_types_supported` | `string`[] | Supported OAuth grant types. | +| `id_token_signing_alg_values_supported` | `string`[] | Supported signing algorithms for ID tokens. | +| `introspection_endpoint` | `string` | Token introspection endpoint. | +| `issuer` | `string` | The issuer identifier for the authorization server. | +| `jwks_uri` | `string` | JSON Web Key Set (JWKS) endpoint used to obtain signing keys. | +| `pushed_authorization_request_endpoint?` | `string` | Pushed Authorization Request (PAR) endpoint. | +| `request_object_signing_alg_values_supported` | `string`[] | Supported signing algorithms for request objects. | +| `request_parameter_supported` | `boolean` | Indicates support for request objects passed by value. | +| `request_uri_parameter_supported` | `boolean` | Indicates support for request objects passed by reference (request_uri). | +| `require_pushed_authorization_requests` | `boolean` | Indicates whether PAR is required for authorization requests. | +| `response_modes_supported` | `string`[] | Supported response modes. | +| `response_types_supported` | `string`[] | Supported OAuth/OIDC response types. | +| `revocation_endpoint` | `string` | Token revocation endpoint. | +| `scopes_supported` | `string`[] | OAuth scopes supported by the authorization server. | +| `subject_types_supported` | `string`[] | Supported subject identifier types. | +| `token_endpoint` | `string` | Token endpoint used to exchange authorization codes for tokens. | +| `token_endpoint_auth_methods_supported` | `string`[] | Supported authentication methods for the token endpoint. | +| `userinfo_endpoint` | `string` | UserInfo endpoint used to retrieve user profile claims. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Jwk.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Jwk.md new file mode 100644 index 00000000..802092a2 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Jwk.md @@ -0,0 +1,42 @@ +--- +rootSdk: JavaScript +title: "Jwk" +category: Types +description: "Represents a JSON Web Key (JWK) as defined by RFC 7517." +--- + +# Type: Jwk + +Represents a JSON Web Key (JWK) as defined by RFC 7517. + +A JWK describes a cryptographic key used to verify or encrypt JSON Web Tokens (JWTs) as obtained from the JWKS (JSON Web Key Set) endpoint exposed by the authorization server. + +The available properties depend on the key type (`kty`). + +## Properties + +| Property | Type | Description | +| -------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------ | +| `alg?` | `string` | Intended algorithm for the key (for example: `RS256`). | +| `crv?` | `string` | Elliptic curve name (for example: `P-256`). | +| `d?` | `string` | RSA private exponent. | +| `dp?` | `string` | RSA first factor CRT exponent. | +| `dq?` | `string` | RSA second factor CRT exponent. | +| `e?` | `string` | RSA public exponent. | +| `ext?` | `boolean` | Indicates whether the key is extractable. | +| `k?` | `string` | Symmetric key value (base64url encoded). | +| `key_ops?` | `string`[] | Allowed operations for the key (e.g. `sign`, `verify`, `encrypt`). | +| `kid?` | `string` | Key identifier used to match keys during verification. | +| `kty` | `string` | Key type (for example: `RSA`, or `EC`). | +| `n?` | `string` | RSA modulus. | +| `oth?` | \{ `d?`: `string`; `r?`: `string`; `t?`: `string`; \}[] | Additional prime information (multi-prime RSA). | +| `p?` | `string` | RSA first prime factor. | +| `q?` | `string` | RSA second prime factor. | +| `qi?` | `string` | RSA CRT coefficient. | +| `use?` | `string` | Public key use (`sig` for signature or `enc` for encryption). | +| `x?` | `string` | X coordinate for EC public keys. | +| `x5c?` | `string`[] | X.509 certificate chain. | +| `x5t?` | `string` | X.509 certificate SHA-1 thumbprint. | +| `x5t#S256?` | `string` | X.509 certificate SHA-256 thumbprint. | +| `x5u?` | `string` | URL referencing the X.509 certificate. | +| `y?` | `string` | Y coordinate for EC public keys. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Jwks.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Jwks.md new file mode 100644 index 00000000..0f3242b1 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Jwks.md @@ -0,0 +1,18 @@ +--- +rootSdk: JavaScript +title: "Jwks" +category: Types +description: "Represents a JSON Web Key Set (JWKS). A JWKS is a collection of public JSON Web Keys used to verify signatures of JSON Web Tokens (JWTs)." +--- + +# Type: Jwks + +Represents a JSON Web Key Set (JWKS). + +A JWKS is a collection of public JSON Web Keys used to verify signatures of JSON Web Tokens (JWTs). + +## Properties + +| Property | Type | Description | +| ------------------------ | ---------------------------------------------- | -------------------------------------------------- | +| `keys` | [`Jwk`](/sdks/web-js/api-reference/types/jwk)[] | The list of public keys contained in this key set. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.JwsHeaderParameters.md b/docs/markdown/Types/_monocloud_auth-web-js.index.JwsHeaderParameters.md new file mode 100644 index 00000000..76ea544d --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.JwsHeaderParameters.md @@ -0,0 +1,20 @@ +--- +rootSdk: JavaScript +title: "JwsHeaderParameters" +category: Types +description: "Parameters contained in a JSON Web Signature (JWS) header." +--- + +# Type: JwsHeaderParameters + +Parameters contained in a JSON Web Signature (JWS) header. + +## Properties + +| Property | Type | Description | +| ------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `alg` | [`SecurityAlgorithms`](/sdks/web-js/api-reference/enums/securityalgorithms) | The cryptographic algorithm used to sign the token. | +| `crit?` | `string`[] | List of header parameters that are marked as critical and must be understood by the token processor. | +| `jwk?` | [`Jwk`](/sdks/web-js/api-reference/types/jwk) | An embedded JSON Web Key (JWK) containing the signing key. | +| `kid?` | `string` | Identifier of the key used to sign the token. | +| `typ?` | `string` | The token type. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudClientOptionsBase.md b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudClientOptionsBase.md new file mode 100644 index 00000000..51653891 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudClientOptionsBase.md @@ -0,0 +1,23 @@ +--- +rootSdk: JavaScript +title: "MonoCloudClientOptionsBase" +category: Types +description: "Shared configuration options for MonoCloud OIDC clients. These options are common to both MonoCloudOidcClientOptions and MonoCloudOidcBackendClientOptions." +--- + +# Type: MonoCloudClientOptionsBase + +Shared configuration options for MonoCloud OIDC clients. + +These options are common to both [MonoCloudOidcClientOptions](/sdks/nodejs/api-reference/types/monocloudoidcclientoptions) +and [MonoCloudOidcBackendClientOptions](/sdks/nodejs/api-reference/types/monocloudoidcbackendclientoptions). + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `clientAuthMethod?` | [`ClientAuthMethod`](/sdks/web-js/api-reference/enums/clientauthmethod) | Client authentication method used when communicating with the token endpoint. | +| `clientSecret?` | `string` \| [`Jwk`](/sdks/web-js/api-reference/types/jwk) | Client secret or key material used for client authentication. When `clientAuthMethod` is `client_secret_jwt` and a plain-text secret is provided, the default signing algorithm is `HS256`. To use a different algorithm, provide a symmetric JSON Web Key (JWK) (`kty: "oct"`) with the desired algorithm specified in its `alg` property. | +| `fetcher?` | (`input`: `URL` \| `RequestInfo`, `init?`: `RequestInit`) => `Promise`\<`Response`\> | Optional custom `fetch` implementation used for network requests. | +| `jwksCacheDuration?` | `number` | Duration (in seconds) to cache the JSON Web Key Set (JWKS) retrieved from the authorization server. | +| `metadataCacheDuration?` | `number` | Duration (in seconds) to cache OpenID Connect discovery metadata. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudSession.md b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudSession.md new file mode 100644 index 00000000..1a2c1627 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudSession.md @@ -0,0 +1,28 @@ +--- +rootSdk: JavaScript +title: "MonoCloudSession" +category: Types +description: "Represents an authenticated session, containing the authenticated user profile along with the tokens and metadata issued during authentication." +--- + +# Type: MonoCloudSession + +Represents an authenticated session, containing the authenticated user profile along with the tokens and metadata issued during authentication. + +## Indexable + +> \[`key`: `string`\]: `unknown` + +Additional custom properties attached to the session. + +These may be added via hooks such as `onSessionCreating`. + +## Properties + +| Property | Type | Description | +| ------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `accessTokens?` | [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken)[] | Access tokens associated with the session. Multiple tokens may exist when access tokens are issued for different resources or scope sets. | +| `authorizedScopes?` | `string` | Space-separated list of scopes authorized for the session. | +| `idToken?` | `string` | Optional ID token issued during authentication. | +| `refreshToken?` | `string` | Optional refresh token used to obtain new access tokens without requiring the user to re-authenticate. | +| `user` | [`MonoCloudUser`](/sdks/web-js/api-reference/types/monoclouduser) | The authenticated user profile, typically derived from ID token claims and/or the `UserInfo` endpoint. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudTokens.md b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudTokens.md new file mode 100644 index 00000000..ec0350e5 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudTokens.md @@ -0,0 +1,29 @@ +--- +rootSdk: JavaScript +title: "MonoCloudTokens" +category: Types +description: "Tokens available in the current session." +--- + +# Type: MonoCloudTokens + +Tokens available in the current session. + +Extends [AccessToken](/sdks/web-js/api-reference/types/accesstoken) with the ID token, refresh token, and a convenience flag indicating whether the access token has expired. + +## Extends + +- [`AccessToken`](/sdks/web-js/api-reference/types/accesstoken) + +## Properties + +| Property | Type | Description | +| ---------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| `accessToken` | `string` | The issued access token. | +| `accessTokenExpiration` | `number` | The expiration time of the access token (Unix epoch, in seconds). | +| `idToken?` | `string` | ID token issued during authentication. | +| `isExpired` | `boolean` | Indicates whether the access token is expired at the time of evaluation. | +| `refreshToken?` | `string` | Refresh token issued during authentication, if any. | +| `requestedScopes?` | `string` | Optional space-separated list of scopes originally requested during token acquisition. | +| `resource?` | `string` | Optional resource (audience) that the access token is scoped for. | +| `scopes` | `string` | Space-separated list of scopes granted to the access token. These represent the effective permissions approved by the authorization server. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudUser.md b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudUser.md new file mode 100644 index 00000000..e4ef9bae --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudUser.md @@ -0,0 +1,48 @@ +--- +rootSdk: JavaScript +title: "MonoCloudUser" +category: Types +description: "Represents the authenticated user stored in a MonoCloud session." +--- + +# Type: MonoCloudUser + +Represents the authenticated user stored in a MonoCloud session. + +## Extends + +- [`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse) + +## Indexable + +> \[`key`: `string`\]: `unknown` + +Additional provider-specific claims. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `address?` | [`Address`](/sdks/web-js/api-reference/types/address) | Postal address. | +| `amr?` | `string`[] | Authentication Methods References (AMR). Indicates how the user authenticated. | +| `birthdate?` | `string` | Birthday. | +| `email?` | `string` | Email address. | +| `email_verified?` | `boolean` | Whether the email address has been verified by the provider. | +| `family_name?` | `string` | Surname(s) / last name. | +| `gender?` | `string` | Gender. | +| `given_name?` | `string` | Given name(s) / first name. | +| `groups?` | [`Group`](/sdks/web-js/api-reference/types/group)[] | Group memberships for the user. | +| `idp?` | `string` | Identity Provider (IdP) identifier. Specifies the upstream provider used to authenticate the user. | +| `locale?` | `string` | Locale. | +| `middle_name?` | `string` | Middle name(s). | +| `name?` | `string` | Full name of the user (e.g. "Jane Doe"). | +| `nickname?` | `string` | Casual name used by the user. | +| `phone_number?` | `string` | Phone number (formatted in E.164 standard). | +| `phone_number_verified?` | `boolean` | Whether the phone number has been verified by the provider. | +| `picture?` | `string` | URL of the user's profile picture. | +| `preferred_username?` | `string` | Preferred username. | +| `profile?` | `string` | URL of the user's profile page. | +| `sub` | `string` | Subject identifier - a unique, stable identifier for the user within the issuer. | +| `updated_at?` | `number` | Time the user's information was last updated (seconds since epoch). | +| `website?` | `string` | URL of the user's website. | +| `zoneinfo?` | `string` | Time zone name. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudWebJSClientOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudWebJSClientOptions.md new file mode 100644 index 00000000..9a8cd072 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.MonoCloudWebJSClientOptions.md @@ -0,0 +1,40 @@ +--- +rootSdk: JavaScript +title: "MonoCloudWebJSClientOptions" +category: Types +description: "Configuration options used to initialize MonoCloudWebJSClient." +--- + +# Type: MonoCloudWebJSClientOptions + +Configuration options used to initialize [MonoCloudWebJSClient](/sdks/web-js/api-reference/classes/monocloudwebjsclient). + +## Properties + +| Property | Type | Description | +| --------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `appUrl?` | `string` | The base URL of the application implementing authentication. Used to construct redirect URLs and validate cross-origin messages received from popups or iframes. If omitted, it defaults to the current page's origin (`window.location.origin`). **Example** `"https://example.com"` | +| `authWindowTimeout?` | `number` | Timeout (in seconds) for popup and silent (iframe) authentication windows before rejecting with a timeout error. Applies to `signIn`, `signOut`, and `signInSilent`. | +| `callbackPath?` | `string` | Relative callback path where MonoCloud redirects the user after sign-in. This URL must be registered in the application's callback URL settings in MonoCloud. If omitted, the callback URL defaults to `appUrl` with path `/`. **Example** `"/callback"` | +| `clientAuthMethod?` | [`ClientAuthMethod`](/sdks/web-js/api-reference/enums/clientauthmethod) | Method used for client authentication when calling the token endpoint. | +| `clientId` | `string` | Client identifier of the application registered in MonoCloud. | +| `clientSecret?` | `string` \| [`Jwk`](/sdks/web-js/api-reference/types/jwk) | Client secret or JSON Web Key used for client authentication. Only required for confidential clients (for example, when using `client_secret_jwt` or `private_key_jwt`). | +| `clockSkew?` | `number` | Maximum allowed clock skew (in seconds) for ID token issue and expiration (`iat`, `exp`) validation. | +| `clockTolerance?` | `number` | Maximum allowed clock tolerance (in seconds) applied to other time-based ID token claims such as `nbf` and `auth_time`. | +| `defaultAuthParams?` | [`DefaultAuthParams`](/sdks/web-js/api-reference/types/defaultauthparams) | Default authorization parameters to include in authentication requests. Only a subset of [AuthorizationParams](/sdks/web-js/api-reference/types/authorizationparams) is configurable here; per-request values (`state`, `nonce`, `codeChallenge`, `codeChallengeMethod`, `redirectUri`) are managed internally by the SDK. If `scopes` is not set (here or on the `signIn` call), the SDK defaults to `'openid profile email'`. **Hybrid response types** (`code id_token`, `code token`, `code id_token token`) are supported, but the SDK always completes the back-channel authorization code exchange and uses those tokens. The front-channel `id_token` and `access_token` returned in the URL fragment are only checked for presence; they are not validated and are not stored on the session - the authoritative tokens come from the code exchange, where the ID token signature, nonce, and claims are validated. | +| `federatedSignOut?` | `boolean` | When `true`, signs the user out from both the application and MonoCloud (Single Sign-Out). | +| `fetchUserinfo?` | `boolean` | Determines whether user profile data is fetched from the UserInfo endpoint after authentication. | +| `filteredIdTokenClaims?` | `string`[] | List of ID token claims to exclude when constructing the final user object stored on the session. If omitted, a default set of protocol claims are removed. | +| `idTokenSigningAlgorithm?` | [`SecurityAlgorithms`](/sdks/web-js/api-reference/enums/securityalgorithms) | Expected signing algorithm used to validate ID token signatures. | +| `jwksCacheDuration?` | `number` | Duration (in seconds) to cache the JSON Web Key Set (JWKS) document after it is fetched from the authorization server. | +| `metadataCacheDuration?` | `number` | Duration (in seconds) to cache OpenID Connect discovery metadata after it is fetched from the authorization server. | +| `onSessionCreating?` | [`OnSessionCreating`](/sdks/web-js/api-reference/handler-types/onsessioncreating) | Hook invoked while creating or updating session. | +| `popupWindowHeight?` | `number` | The height of the popup window in pixels. Used to size and center the window when `signIn` or `signOut` is called with `mode: 'popup'`. | +| `popupWindowWidth?` | `number` | The width of the popup window in pixels. Used to size and center the window when `signIn` or `signOut` is called with `mode: 'popup'`. | +| `postCallback?` | [`PostCallback`](/sdks/web-js/api-reference/handler-types/postcallback) | Callback executed after a successful sign-in or sign-out callback. Useful for client-side router integration. | +| `resources?` | [`Indicator`](/sdks/web-js/api-reference/types/indicator)[] | Additional resources that can be requested via `getTokens()`. | +| `sessionKey?` | `string` | A unique identifier that differentiates sessions when multiple clients are used within the same application. This key is appended to the internal session storage key to prevent collisions when multiple `MonoCloudWebJSClient` instances share the same `clientId`. | +| `signOutPath?` | `string` | Relative path where MonoCloud redirects the user after sign-out. This URL must be registered in the application's sign-out URLs in MonoCloud. If omitted, the sign-out callback URL defaults to `appUrl` with path `/`. **Example** `"/signout"` | +| `storage?` | [`IStorage`](/sdks/web-js/api-reference/types/istorage) | Storage implementation used to persist sessions. Defaults to [LocalStorage](/sdks/web-js/api-reference/classes/localstorage). | +| `tenantDomain` | `string` | MonoCloud tenant domain. **Example** `"https://your-tenant.us.monocloud.com"` | +| `validateIdToken?` | `boolean` | Determines whether the ID token signature and claims should be validated. Disabling validation is not recommended. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.ParResponse.md b/docs/markdown/Types/_monocloud_auth-web-js.index.ParResponse.md new file mode 100644 index 00000000..f538e206 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.ParResponse.md @@ -0,0 +1,17 @@ +--- +rootSdk: JavaScript +title: "ParResponse" +category: Types +description: "Response returned from the Pushed Authorization Request (PAR) endpoint." +--- + +# Type: ParResponse + +Response returned from the Pushed Authorization Request (PAR) endpoint. + +## Properties + +| Property | Type | Description | +| -------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `expires_in` | `number` | Lifetime of the `request_uri`, in seconds. After this duration expires, the authorization request becomes invalid. | +| `request_uri` | `string` | The URI reference identifying the pushed authorization request. This value must be supplied as the `request_uri` parameter when redirecting the user to the authorization endpoint. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.PushedAuthorizationParams.md b/docs/markdown/Types/_monocloud_auth-web-js.index.PushedAuthorizationParams.md new file mode 100644 index 00000000..8fef7848 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.PushedAuthorizationParams.md @@ -0,0 +1,40 @@ +--- +rootSdk: JavaScript +title: "PushedAuthorizationParams" +category: Types +description: "Parameters used when creating a Pushed Authorization Request (PAR)." +--- + +# Type: PushedAuthorizationParams + +Parameters used when creating a Pushed Authorization Request (PAR). + +This type mirrors [AuthorizationParams](/sdks/web-js/api-reference/types/authorizationparams) but excludes `requestUri`, +since the `request_uri` value is generated by the authorization server +after a successful PAR request and must not be supplied by the client. + +## Extends + +- `Omit`\<[`AuthorizationParams`](/sdks/web-js/api-reference/types/authorizationparams), `"requestUri"`\> + +## Properties + +| Property | Type | Description | +| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `acrValues?` | `string`[] | Authentication Context Class Reference (ACR) values requesting specific authentication assurance levels or methods. | +| `authenticatorHint?` | [`Authenticators`](/sdks/web-js/api-reference/enums/authenticators) | Hint to the authorization server indicating which authenticator or connection should be used. | +| `codeChallenge?` | `string` | PKCE code challenge derived from the code verifier. Used to secure authorization code exchanges. | +| `codeChallengeMethod?` | [`CodeChallengeMethod`](/sdks/web-js/api-reference/enums/codechallengemethod) | Method used to generate the PKCE code challenge. | +| `display?` | [`DisplayOptions`](/sdks/web-js/api-reference/enums/displayoptions) | Preferred display mode for the authentication UI. | +| `loginHint?` | `string` | Hint identifying the user (for example, email or username). Used to prefill or optimize the sign-in experience. | +| `maxAge?` | `number` | Maximum acceptable time (in seconds) since the user last authenticated. If exceeded, the user may be required to sign in again. | +| `nonce?` | `string` | A cryptographically random value included in the ID token to prevent replay attacks. | +| `prompt?` | [`Prompt`](/sdks/web-js/api-reference/enums/prompt) | Controls authentication interaction behavior. For example, forcing login or consent. | +| `redirectUri?` | `string` | The redirect URI where the authorization server sends the user after authentication completes. | +| `request?` | `string` | A signed JWT containing authorization request parameters. | +| `resource?` | `string` | Space-separated list of resource indicators that scope the issued access token. | +| `responseMode?` | [`ResponseModes`](/sdks/web-js/api-reference/enums/responsemodes) | Specifies how the authorization response is returned to the client. | +| `responseType?` | [`ResponseTypes`](/sdks/web-js/api-reference/enums/responsetypes) | Determines which artifacts are returned from the authorization endpoint. | +| `scopes?` | `string` | Space-separated list of scopes requested during authentication. | +| `state?` | `string` | A cryptographically random value used to maintain request state and protect against CSRF attacks. | +| `uiLocales?` | `string` | Preferred UI language. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.RefetchUserInfoOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.RefetchUserInfoOptions.md new file mode 100644 index 00000000..431ed9dd --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.RefetchUserInfoOptions.md @@ -0,0 +1,17 @@ +--- +rootSdk: JavaScript +title: "RefetchUserInfoOptions" +category: Types +description: "Options used when refetching user profile data from the UserInfo endpoint." +--- + +# Type: RefetchUserInfoOptions + +Options used when refetching user profile data from the UserInfo endpoint. + +## Properties + +| Property | Type | Description | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `onSessionCreating?` | [`OnSessionCreating`](/sdks/nodejs/api-reference/handler-types/onsessioncreating) | Callback invoked before a session is created or updated. Allows customization or enrichment of the session. | +| `strictProfileSync?` | `boolean` | When enabled, replaces the existing session user profile with a new profile constructed from the latest UserInfo response. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshGrantOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshGrantOptions.md new file mode 100644 index 00000000..576b6017 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshGrantOptions.md @@ -0,0 +1,19 @@ +--- +rootSdk: JavaScript +title: "RefreshGrantOptions" +category: Types +description: "Options used when exchanging a refresh token for a new access token." +--- + +# Type: RefreshGrantOptions + +Options used when exchanging a refresh token for a new access token. + +These parameters allow requesting an access token scoped to specific resources or scopes that were previously authorized by the user. + +## Properties + +| Property | Type | Description | +| --------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `resource?` | `string` | Space-separated list of resource indicators that the new access token should be issued for. The requested resources must have been previously granted during the original authorization flow. | +| `scopes?` | `string` | Space-separated list of scopes to request for the refreshed access token. The requested scopes must have been granted during the original authorization flow. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshOptions.md new file mode 100644 index 00000000..24bd21f5 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshOptions.md @@ -0,0 +1,16 @@ +--- +rootSdk: JavaScript +title: "RefreshOptions" +category: Types +description: "Options used to customize the session refresh flow." +--- + +# Type: RefreshOptions + +Options used to customize the session refresh flow. + +## Properties + +| Property | Type | Description | +| ------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `refreshGrantOptions?` | [`RefreshGrantOptions`](/sdks/web-js/api-reference/types/refreshgrantoptions) | Configuration applied to the Refresh Token Grant request, such as overriding the requested scopes or resources. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshSessionOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshSessionOptions.md new file mode 100644 index 00000000..0b78a8d7 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.RefreshSessionOptions.md @@ -0,0 +1,24 @@ +--- +rootSdk: JavaScript +title: "RefreshSessionOptions" +category: Types +description: "Options used when refreshing an existing MonoCloud session." +--- + +# Type: RefreshSessionOptions + +Options used when refreshing an existing MonoCloud session. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fetchUserInfo?` | `boolean` | When enabled, user profile data is fetched from the UserInfo endpoint and merged into the session user object. | +| `filteredIdTokenClaims?` | `string`[] | List of ID token claims to remove before storing the session. | +| `idTokenClockSkew?` | `number` | Clock skew adjustment (in seconds) applied when validating ID token timestamps against the authorization server. | +| `idTokenClockTolerance?` | `number` | Additional allowed clock tolerance (in seconds) when validating time-based ID token claims such as `exp`, `iat`, and `nbf`. | +| `jwks?` | [`Jwks`](/sdks/web-js/api-reference/types/jwks) | JSON Web Key Set used to validate the ID token signature. If not provided, the JWKS is automatically fetched from the authorization server metadata. | +| `onSessionCreating?` | [`OnSessionCreating`](/sdks/nodejs/api-reference/handler-types/onsessioncreating) | Callback invoked before a session is created or updated. Allows customization or enrichment of the session. | +| `refreshGrantOptions?` | [`RefreshGrantOptions`](/sdks/web-js/api-reference/types/refreshgrantoptions) | Options applied to the refresh token grant request, such as requesting tokens for specific resources or scopes. | +| `strictProfileSync?` | `boolean` | When enabled, replaces the existing session user profile with a freshly constructed profile derived from the latest ID token and/or UserInfo response. | +| `validateIdToken?` | `boolean` | Determines whether the ID token signature and claims should be validated. Disabling validation is not recommended except for advanced or controlled environments. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.SignInOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.SignInOptions.md new file mode 100644 index 00000000..500f09ce --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.SignInOptions.md @@ -0,0 +1,28 @@ +--- +rootSdk: JavaScript +title: "SignInOptions" +category: Types +description: "Options used to customize the sign-in flow." +--- + +# Type: SignInOptions + +Options used to customize the sign-in flow. + +## Properties + +| Property | Type | Description | +| --------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `acrValues?` | `string`[] | Authentication Context Class Reference (ACR) values requesting specific authentication assurance levels or methods. | +| `appState?` | [`ApplicationState`](/sdks/web-js/api-reference/types/applicationstate) | Custom application state preserved across the authentication round-trip. The value is provided to the [OnSessionCreating](/sdks/web-js/api-reference/handler-types/onsessioncreating) hook when the session is constructed. | +| `authenticatorHint?` | [`Authenticators`](/sdks/web-js/api-reference/enums/authenticators) | Specifies the preferred authenticator or identity provider to use for sign-in. | +| `display?` | [`DisplayOptions`](/sdks/web-js/api-reference/enums/displayoptions) | Preferred display mode for the authentication UI. | +| `loginHint?` | `string` | Hint identifying the user (for example, an email or username). Used to pre-fill or optimize the sign-in experience. **Example** `"user@example.com"` | +| `maxAge?` | `number` | Maximum allowed time (in seconds) since the user's last authentication. Used to force re-authentication if the time since the last sign-in exceeds this value. | +| `mode?` | [`InteractionMode`](/sdks/web-js/api-reference/enums/interactionmode) | Determines the interaction mode for the sign-in flow. | +| `prompt?` | [`Prompt`](/sdks/web-js/api-reference/enums/prompt) | Specifies the desired authentication interaction behavior. | +| `resource?` | `string` | Space-separated resources the access token should be scoped to for this specific sign-in. Merged with `defaultAuthParams.resource` and any indicator resources configured on the client. | +| `returnUrl?` | `string` | Relative URL to navigate to after sign-in completes. | +| `scopes?` | `string` | Space-separated scopes requested from the authorization server for this specific sign-in. Merged with `defaultAuthParams.scopes` and any indicator scopes configured on the client. | +| `signUp?` | `boolean` | When `true`, starts the sign-up (user registration) flow instead of a standard sign-in. Equivalent to setting `prompt: 'create'`. If both are provided, `signUp: true` wins. | +| `uiLocales?` | `string` | Preferred locale(s) for the sign-in UI. **Example** `"en-US"` | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.SignInSilentOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.SignInSilentOptions.md new file mode 100644 index 00000000..6a239fe9 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.SignInSilentOptions.md @@ -0,0 +1,21 @@ +--- +rootSdk: JavaScript +title: "SignInSilentOptions" +category: Types +description: "Options used to customize the silent sign-in flow." +--- + +# Type: SignInSilentOptions + +Options used to customize the silent sign-in flow. + +## Properties + +| Property | Type | Description | +| ----------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `acrValues?` | `string`[] | Authentication Context Class Reference (ACR) values requesting specific authentication assurance levels or methods. If the existing session does not satisfy the requested ACR, the authorization server will reject with `interaction_required`. | +| `appState?` | [`ApplicationState`](/sdks/web-js/api-reference/types/applicationstate) | Custom application state preserved across the silent authentication round-trip. The value is provided to the [OnSessionCreating](/sdks/web-js/api-reference/handler-types/onsessioncreating) hook when the session is constructed. | +| `loginHint?` | `string` | Hint identifying the user (for example, an email or username). Helps the authorization server disambiguate when multiple sessions are present. **Example** `"user@example.com"` | +| `maxAge?` | `number` | Maximum allowed time (in seconds) since the user's last authentication. If the existing session is older than this value, the authorization server cannot satisfy the silent request and will reject with `login_required`. | +| `resource?` | `string` | Space-separated resources the access token should be scoped to for this specific silent sign-in. Merged with `defaultAuthParams.resource` and any indicator resources configured on the client. | +| `scopes?` | `string` | Space-separated scopes requested from the authorization server for this specific silent sign-in. Merged with `defaultAuthParams.scopes` and any indicator scopes configured on the client. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.SignOutOptions.md b/docs/markdown/Types/_monocloud_auth-web-js.index.SignOutOptions.md new file mode 100644 index 00000000..750a3db3 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.SignOutOptions.md @@ -0,0 +1,19 @@ +--- +rootSdk: JavaScript +title: "SignOutOptions" +category: Types +description: "Options used to customize the sign-out flow." +--- + +# Type: SignOutOptions + +Options used to customize the sign-out flow. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `federatedSignOut?` | `boolean` | When `true`, signs the user out from both the application and MonoCloud (Single Sign-Out). Overrides the client-level `federatedSignOut` configuration for this specific call. If omitted, the client-level setting is used. | +| `mode?` | [`InteractionMode`](/sdks/web-js/api-reference/enums/interactionmode) | Determines the interaction mode for the sign-out flow. | +| `postLogoutRedirectUri?` | `string` | URL to redirect the user to after sign-out completes. This URI must be registered in the application's sign-out URLs in MonoCloud. | +| `returnUrl?` | `string` | Relative URL to navigate to after sign-out completes. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.Tokens.md b/docs/markdown/Types/_monocloud_auth-web-js.index.Tokens.md new file mode 100644 index 00000000..c1ca207c --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.Tokens.md @@ -0,0 +1,21 @@ +--- +rootSdk: JavaScript +title: "Tokens" +category: Types +description: "OAuth 2.0 / OpenID Connect token endpoint response." +--- + +# Type: Tokens + +OAuth 2.0 / OpenID Connect token endpoint response. + +## Properties + +| Property | Type | Description | +| ------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------- | +| `access_token` | `string` | Access token issued by the authorization server. | +| `expires_in?` | `number` | Lifetime of the access token (in seconds) from the time the response was issued. | +| `id_token?` | `string` | Optional ID token containing authentication claims about the user. | +| `refresh_token?` | `string` | Optional refresh token used to obtain new access tokens without requiring user re-authentication. | +| `scope?` | `string` | Space-separated list of scopes granted for the access token. | +| `token_type?` | `string` | Token type issued. | diff --git a/docs/markdown/Types/_monocloud_auth-web-js.index.UserinfoResponse.md b/docs/markdown/Types/_monocloud_auth-web-js.index.UserinfoResponse.md new file mode 100644 index 00000000..48259568 --- /dev/null +++ b/docs/markdown/Types/_monocloud_auth-web-js.index.UserinfoResponse.md @@ -0,0 +1,48 @@ +--- +rootSdk: JavaScript +title: "UserinfoResponse" +category: Types +description: "Represents the OpenID Connect UserInfo response." +--- + +# Type: UserinfoResponse + +Represents the OpenID Connect **UserInfo** response. + +## Type Parameters + +| Type Parameter | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `TAddress` _extends_ [`Address`](/sdks/web-js/api-reference/types/address) | The shape of the `address` claim. Defaults to [Address](/sdks/web-js/api-reference/types/address). | + +## Indexable + +> \[`key`: `string`\]: `unknown` + +Additional provider-specific claims. + +## Properties + +| Property | Type | Description | +| ----------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------- | +| `address?` | `TAddress` | Postal address. | +| `birthdate?` | `string` | Birthday. | +| `email?` | `string` | Email address. | +| `email_verified?` | `boolean` | Whether the email address has been verified by the provider. | +| `family_name?` | `string` | Surname(s) / last name. | +| `gender?` | `string` | Gender. | +| `given_name?` | `string` | Given name(s) / first name. | +| `groups?` | [`Group`](/sdks/web-js/api-reference/types/group)[] | Group memberships for the user. | +| `locale?` | `string` | Locale. | +| `middle_name?` | `string` | Middle name(s). | +| `name?` | `string` | Full name of the user (e.g. "Jane Doe"). | +| `nickname?` | `string` | Casual name used by the user. | +| `phone_number?` | `string` | Phone number (formatted in E.164 standard). | +| `phone_number_verified?` | `boolean` | Whether the phone number has been verified by the provider. | +| `picture?` | `string` | URL of the user's profile picture. | +| `preferred_username?` | `string` | Preferred username. | +| `profile?` | `string` | URL of the user's profile page. | +| `sub` | `string` | Subject identifier - a unique, stable identifier for the user within the issuer. | +| `updated_at?` | `number` | Time the user's information was last updated (seconds since epoch). | +| `website?` | `string` | URL of the user's website. | +| `zoneinfo?` | `string` | Time zone name. | diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Authenticators.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Authenticators.md new file mode 100644 index 00000000..c3ba28e9 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Authenticators.md @@ -0,0 +1,29 @@ +--- +rootSdk: JavaScript +title: "Authenticators" +category: Enums +description: "Supported authentication methods and identity providers." +--- + +# Enum: Authenticators + +> **Authenticators** = `"password"` \| `"passkey"` \| `"email"` \| `"phone"` \| `"google"` \| `"apple"` \| `"facebook"` \| `"microsoft"` \| `"github"` \| `"gitlab"` \| `"discord"` \| `"twitter"` \| `"linkedin"` \| `"xero"` + +Supported authentication methods and identity providers. + +## Type Declaration + +- `password` - Username/password authentication. +- `passkey` - Passkey (WebAuthn / FIDO2) authentication. +- `email` - Email-based authentication (magic link or OTP). +- `phone` - Phone-based authentication (SMS OTP). +- `google` - Google identity provider. +- `apple` - Apple identity provider. +- `facebook` - Facebook identity provider. +- `microsoft` - Microsoft identity provider. +- `github` - GitHub identity provider. +- `gitlab` - GitLab identity provider. +- `discord` - Discord identity provider. +- `twitter` - Twitter (X) identity provider. +- `linkedin` - LinkedIn identity provider. +- `xero` - Xero identity provider. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ClientAuthMethod.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ClientAuthMethod.md new file mode 100644 index 00000000..0adc3e81 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ClientAuthMethod.md @@ -0,0 +1,23 @@ +--- +rootSdk: JavaScript +title: "ClientAuthMethod" +category: Enums +description: "Supported OAuth 2.0 client authentication methods. These methods define how a client authenticates itself when calling the authorization server token endpoint." +--- + +# Enum: ClientAuthMethod + +> **ClientAuthMethod** = `"client_secret_basic"` \| `"client_secret_post"` \| `"client_secret_jwt"` \| `"private_key_jwt"` \| `"tls_client_auth"` \| `"self_signed_tls_client_auth"` + +Supported OAuth 2.0 client authentication methods. + +These methods define how a client authenticates itself when calling the authorization server token endpoint. + +## Type Declaration + +- `client_secret_basic` - Client credentials are sent using HTTP Basic authentication +- `client_secret_post` - Client credentials are included in the request body as form parameters. +- `client_secret_jwt` - Client authenticates using a signed JWT created with the client secret. +- `private_key_jwt` - Client authenticates using a signed JWT created with a private key. +- `tls_client_auth` - Client authenticates using a TLS client certificate issued by a trusted certificate authority. +- `self_signed_tls_client_auth` - Client authenticates using a self-signed TLS client certificate. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.CodeChallengeMethod.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.CodeChallengeMethod.md new file mode 100644 index 00000000..925b89ab --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.CodeChallengeMethod.md @@ -0,0 +1,19 @@ +--- +rootSdk: JavaScript +title: "CodeChallengeMethod" +category: Enums +description: "Supported PKCE (Proof Key for Code Exchange) code challenge methods." +--- + +# Enum: CodeChallengeMethod + +> **CodeChallengeMethod** = `"plain"` \| `"S256"` + +Supported PKCE (Proof Key for Code Exchange) code challenge methods. + +PKCE protects authorization code flows by binding the authorization request to the token exchange using a cryptographic verifier. + +## Type Declaration + +- `plain` - Uses the code verifier directly as the challenge. Not recommended for production use. +- `S256` - Uses a SHA-256 hash of the code verifier. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.DisplayOptions.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.DisplayOptions.md new file mode 100644 index 00000000..0d1a41b5 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.DisplayOptions.md @@ -0,0 +1,21 @@ +--- +rootSdk: JavaScript +title: "DisplayOptions" +category: Enums +description: "Supported OpenID Connect display parameter values." +--- + +# Enum: DisplayOptions + +> **DisplayOptions** = `"page"` \| `"popup"` \| `"touch"` \| `"wap"` + +Supported OpenID Connect `display` parameter values. + +The display parameter hints to the authorization server how the authentication or consent UI should be presented to the user. + +## Type Declaration + +- `page` - Full-page authentication experience in the browser. +- `popup` - Authentication optimized for popup windows. +- `touch` - Authentication optimized for touch-based devices. +- `wap` - Authentication optimized for legacy mobile or constrained browsers. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.InteractionMode.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.InteractionMode.md new file mode 100644 index 00000000..62dc57bd --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.InteractionMode.md @@ -0,0 +1,17 @@ +--- +rootSdk: JavaScript +title: "InteractionMode" +category: Enums +description: "Interaction modes supported for sign-in and sign-out flows." +--- + +# Enum: InteractionMode + +> **InteractionMode** = `"popup"` \| `"redirect"` + +Interaction modes supported for sign-in and sign-out flows. + +## Type Declaration + +- `popup` - Opens a popup window for interactive authentication and keeps the user on the current page. +- `redirect` - Performs a full-page redirect to the authorization server. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Prompt.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Prompt.md new file mode 100644 index 00000000..506933f6 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.Prompt.md @@ -0,0 +1,22 @@ +--- +rootSdk: JavaScript +title: "Prompt" +category: Enums +description: "Supported OpenID Connect prompt parameter values." +--- + +# Enum: Prompt + +> **Prompt** = `"none"` \| `"login"` \| `"consent"` \| `"select_account"` \| `"create"` + +Supported OpenID Connect `prompt` parameter values. + +The `prompt` parameter controls whether the authorization server should force specific user interactions during authentication. + +## Type Declaration + +- `none` - Do not display any authentication or consent UI. +- `login` - Forces the user to re-authenticate even if an active session exists. +- `consent` - Forces the consent screen to be displayed to the user. +- `select_account` - Prompts the user to choose an account when multiple sessions exist. +- `create` - Prompts the user to create a new account (sign-up flow). diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseModes.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseModes.md new file mode 100644 index 00000000..e56d1dbd --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseModes.md @@ -0,0 +1,20 @@ +--- +rootSdk: JavaScript +title: "ResponseModes" +category: Enums +description: "Supported OAuth 2.0 / OpenID Connect response_mode values." +--- + +# Enum: ResponseModes + +> **ResponseModes** = `"form_post"` \| `"query"` \| `"fragment"` + +Supported OAuth 2.0 / OpenID Connect `response_mode` values. + +The response mode determines how authorization results are returned from the authorization endpoint to the client application. + +## Type Declaration + +- `form_post` - Returns authorization results using an HTTP POST request with parameters encoded in the request body. +- `query` - Returns authorization results as URL query parameters. +- `fragment` - Returns authorization results in the URL fragment. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseTypes.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseTypes.md new file mode 100644 index 00000000..010f6af1 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.ResponseTypes.md @@ -0,0 +1,26 @@ +--- +rootSdk: JavaScript +title: "ResponseTypes" +category: Enums +description: "Supported OAuth 2.0 / OpenID Connect response types." +--- + +# Enum: ResponseTypes + +> **ResponseTypes** = `"code"` \| `"token"` \| `"id_token"` \| `"id_token token"` \| `"code id_token"` \| `"code token"` \| `"code id_token token"` + +Supported OAuth 2.0 / OpenID Connect response types. + +Response types determine which artifacts are returned from the authorization endpoint during authentication. + +> Modern applications should prefer the Authorization Code Flow (`code`) with PKCE. Implicit flow variants are included for compatibility with legacy or specialized scenarios. + +## Type Declaration + +- `code` - Authorization Code Flow (recommended). Returns an authorization code that is exchanged for tokens on the server-side. +- `token` - Implicit Flow returning an access token directly from the authorization endpoint. +- `id_token` - Implicit Flow returning an ID token. +- `id_token token` - Implicit Flow returning both an ID token and an access token. +- `code id_token` - Hybrid Flow returning an authorization code and an ID token. +- `code token` - Hybrid Flow returning an authorization code and an access token. +- `code id_token token` - Hybrid Flow returning an authorization code, ID token, and access token. diff --git a/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.SecurityAlgorithms.md b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.SecurityAlgorithms.md new file mode 100644 index 00000000..72ad7914 --- /dev/null +++ b/docs/markdown/Types_(Enums)/_monocloud_auth-web-js.index.SecurityAlgorithms.md @@ -0,0 +1,26 @@ +--- +rootSdk: JavaScript +title: "SecurityAlgorithms" +category: Enums +description: "Supported JSON Web Signature (JWS) algorithms used to sign tokens." +--- + +# Enum: SecurityAlgorithms + +> **SecurityAlgorithms** = `"RS256"` \| `"RS384"` \| `"RS512"` \| `"PS256"` \| `"PS384"` \| `"PS512"` \| `"ES256"` \| `"ES384"` \| `"ES512"` + +Supported JSON Web Signature (JWS) algorithms used to sign tokens. + +These algorithms define how tokens issued by MonoCloud are cryptographically signed and verified. The expected algorithm should match the configuration of your MonoCloud application. + +## Type Declaration + +- `RS256` - RSA using SHA-256. Default and most commonly used signing algorithm. +- `RS384` - RSA using SHA-384. +- `RS512` - RSA using SHA-512. +- `PS256` - RSA-PSS using SHA-256. Provides stronger cryptographic padding than RS256. +- `PS384` - RSA-PSS using SHA-384. +- `PS512` - RSA-PSS using SHA-512. +- `ES256` - ECDSA using P-256 curve and SHA-256. Produces smaller tokens and faster verification. +- `ES384` - ECDSA using P-384 curve and SHA-384. +- `ES512` - ECDSA using P-521 curve and SHA-512. diff --git a/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.OnSessionCreating.md b/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.OnSessionCreating.md new file mode 100644 index 00000000..afd9896d --- /dev/null +++ b/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.OnSessionCreating.md @@ -0,0 +1,29 @@ +--- +rootSdk: JavaScript +title: "OnSessionCreating" +category: Handler Types +description: "Callback invoked when a session is being created or updated." +--- + +# Handler Type: OnSessionCreating + +> **OnSessionCreating** = (`session`: [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession), `idToken?`: `Partial`\<[`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims)\>, `userInfo?`: [`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse), `state?`: [`ApplicationState`](/sdks/web-js/api-reference/types/applicationstate)) => `Promise`\<`void`\> \| `void` + +Callback invoked when a session is being created or updated. + +Use this hook to modify or enrich the session before it is persisted - for example, to attach custom claims, normalize user data, or apply application-specific logic. + +## Parameters + +| Parameter | Type | Description | +| ----------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `session` | [`MonoCloudSession`](/sdks/web-js/api-reference/types/monocloudsession) | The session being created or updated. Changes made to this object are persisted. | +| `idToken?` | `Partial`\<[`IdTokenClaims`](/sdks/web-js/api-reference/types/idtokenclaims)\> | Optional claims extracted from the ID token received during authentication. | +| `userInfo?` | [`UserinfoResponse`](/sdks/web-js/api-reference/types/userinforesponse) | Optional claims returned from the UserInfo endpoint. | +| `state?` | [`ApplicationState`](/sdks/web-js/api-reference/types/applicationstate) | Optional application state associated with the authentication request. | + +## Returns + +`Promise`\<`void`\> \| `void` + +Returns a promise or void. Execution continues once the callback completes. diff --git a/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.PostCallback.md b/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.PostCallback.md new file mode 100644 index 00000000..6ca1af93 --- /dev/null +++ b/docs/markdown/Types_(Handler)/_monocloud_auth-web-js.index.PostCallback.md @@ -0,0 +1,26 @@ +--- +rootSdk: JavaScript +title: "PostCallback" +category: Handler Types +description: "Callback executed after sign-in or sign-out callback processing." +--- + +# Handler Type: PostCallback + +> **PostCallback** = (`state`: [`CallbackState`](/sdks/web-js/api-reference/types/callbackstate)) => `Promise`\<`void`\> \| `void` + +Callback executed after sign-in or sign-out callback processing. + +The default implementation removes query parameters from the current URL on `signIn` (no navigation) or performs a full page reload to `returnUrl`. Provide a custom implementation to integrate with a client-side router and avoid full page reloads. + +## Parameters + +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------- | --------------- | +| `state` | [`CallbackState`](/sdks/web-js/api-reference/types/callbackstate) | Callback state. | + +## Returns + +`Promise`\<`void`\> \| `void` + +Returns a promise or void. Execution continues once the callback completes. diff --git a/docs/markdown/modules.md b/docs/markdown/modules.md index a0e9afd7..715ff505 100644 --- a/docs/markdown/modules.md +++ b/docs/markdown/modules.md @@ -9,6 +9,7 @@ category: Other ## Packages - [@monocloud/auth-core](/sdks/nodejs/api-reference/undefined/_monocloud_auth-core) +- [@monocloud/auth-web-js](/sdks/web-js/api-reference/undefined/_monocloud_auth-web-js) - [@monocloud/auth-node-core](/sdks/nodejs-core/api-reference/undefined/_monocloud_auth-node-core) - [@monocloud/auth-nextjs](/sdks/nextjs/api-reference/undefined/_monocloud_auth-nextjs) - [@monocloud/backend-node](/sdks/nodejs-backend/api-reference/undefined/_monocloud_backend-node) diff --git a/packages/test-utils/src/mock-window.ts b/packages/test-utils/src/mock-window.ts index 07f14503..70ef4567 100644 --- a/packages/test-utils/src/mock-window.ts +++ b/packages/test-utils/src/mock-window.ts @@ -139,6 +139,9 @@ export class MockWindow { hash: this.hash, search: this.search, pathname: this.pathname, + get origin() { + return new URL(mockWindowInstance.href).origin; + }, get href() { const href = (mockWindowInstance.href.endsWith('/') diff --git a/packages/web-js/README.md b/packages/web-js/README.md index eb89f252..f7f6e8a5 100644 --- a/packages/web-js/README.md +++ b/packages/web-js/README.md @@ -58,20 +58,15 @@ import { MonoCloudWebJSClient } from '@monocloud/auth-web-js'; export const client = new MonoCloudWebJSClient({ tenantDomain: 'https://', clientId: '', - appUrl: 'http://localhost:3000', - callbackPath: '/callback', - signOutCallbackPath: '/logout', }); ``` -### Wire Up the Callback Routes +### Process the Callback -Call the matching process method from each callback route. The SDK never infers which flow is in progress — wire each handler to the route that owns its redirect URI. +Call `processCallback()` once at application startup. It inspects the current URL and the persisted callback state to automatically complete a pending sign-in or sign-out flow — no per-route dispatch required. When the current URL is not an in-progress callback, it is a no-op. ```typescript -await client.processSignInCallback(); - -await client.processSignOutCallback(); +await client.processCallback(); ``` ### Sign In and Sign Out diff --git a/packages/web-js/example/src/main.ts b/packages/web-js/example/src/main.ts index 3799bfb4..97268a3c 100644 --- a/packages/web-js/example/src/main.ts +++ b/packages/web-js/example/src/main.ts @@ -13,19 +13,15 @@ import { * The example demonstrates how to sign in (interactive and silent), sign out, refresh the session, refetch the userinfo and get tokens. * * You have to enable the following settings in your client with Single Page Application preset: - * - Allowed Callback URLs: http://localhost:5173/callback - * - Allowed Signout URLs: http://localhost:5173/logout + * - Allowed Callback URLs: http://localhost:5173 + * - Allowed Signout URLs: http://localhost:5173 * - Allowed Origins (CORS): http://localhost:5173 - * - Scopes (at least): openid, profile, email * - Enable Refresh Tokens */ const options: MonoCloudWebJSClientOptions = { tenantDomain: 'https://', clientId: '', - appUrl: 'http://localhost:5173', - callbackPath: '/callback', - signOutCallbackPath: '/logout', defaultAuthParams: { scopes: 'openid profile email offline_access', // resource: @@ -75,18 +71,8 @@ const updateUI = async (): Promise => { } }; -const dispatchCallback = (): Promise => { - switch (window.location.pathname) { - case options.callbackPath: - return client.processSignInCallback(); - case options.signOutCallbackPath: - return client.processSignOutCallback(); - default: - return Promise.resolve(); - } -}; - -dispatchCallback() +client + .processCallback() .then(() => { processingCallback = false; const processCallbackMessage = document.getElementById('loading')!; diff --git a/packages/web-js/package.json b/packages/web-js/package.json index 4968e817..0cd3c395 100644 --- a/packages/web-js/package.json +++ b/packages/web-js/package.json @@ -35,6 +35,9 @@ "publishConfig": { "main": "./dist/index.cjs", "module": "./dist/index.mjs", + "browser": "./dist/index.mjs", + "unpkg": "./dist/index.mjs", + "jsdelivr": "./dist/index.mjs", "types": "./dist/index.d.mts", "exports": { ".": { diff --git a/packages/web-js/src/index.ts b/packages/web-js/src/index.ts index 01b4d16d..60bdf775 100644 --- a/packages/web-js/src/index.ts +++ b/packages/web-js/src/index.ts @@ -60,7 +60,6 @@ export type { SignOutOptions, CallbackState, PostCallback, - PostCallbackParams, GetTokensOptions, DefaultAuthParams, } from './types'; diff --git a/packages/web-js/src/monocloud-web-js-client.ts b/packages/web-js/src/monocloud-web-js-client.ts index 41e020a9..05176653 100644 --- a/packages/web-js/src/monocloud-web-js-client.ts +++ b/packages/web-js/src/monocloud-web-js-client.ts @@ -36,7 +36,6 @@ import type { OnSessionCreating, GetTokensOptions, MonoCloudTokens, - InteractionMode, } from './types'; import { AUTH_CONSTANTS } from './constants'; import { Ref } from './ref'; @@ -67,11 +66,8 @@ import { withDedupedLock } from './lock'; * import { MonoCloudWebJSClient } from '@monocloud/auth-web-js'; * * export const client = new MonoCloudWebJSClient({ - * tenantDomain: 'https://your-tenant.us.monocloud.com', - * clientId: 'your-client-id', - * appUrl: 'http://localhost:3000', - * callbackPath: '/callback', - * signOutCallbackPath: '/logout', + * tenantDomain: 'https://', + * clientId: '', * }); * ``` * @@ -95,13 +91,23 @@ export class MonoCloudWebJSClient { url.search = ''; url.hash = ''; history.replaceState({}, document.title, url.href); - } else { + return; + } + + const resolved = new URL(state.returnUrl, this.appUrl); + if (resolved.origin !== this.appOrigin) { // eslint-disable-next-line no-console console.warn( - 'Warning: The default behavior for return URL is to perform a full page reload, which resets all data when using MemoryStorage. To integrate with a client-side router, pass a custom postCallback() function during client initialization.' + `Ignoring returnUrl "${state.returnUrl}" because it resolves to a different origin than appUrl.` ); - window.location.href = state.returnUrl; + return; } + + // eslint-disable-next-line no-console + console.warn( + 'Warning: The default behavior for return URL is to perform a full page reload, which resets all data when using MemoryStorage. To integrate with a client-side router, pass a custom postCallback() function during client initialization.' + ); + window.location.href = resolved.href; }; private readonly onSessionCreating?: OnSessionCreating; @@ -154,8 +160,22 @@ export class MonoCloudWebJSClient { ); } + private get appUrl(): string { + return this.options.appUrl ?? window.location.origin; + } + + private buildCallbackUri(path?: string): string { + return removeTrailingSlash( + `${this.appUrl}${ensureLeadingSlash(path ?? '/')}` + ); + } + private get redirectUri(): string { - return `${this.options.appUrl}${ensureLeadingSlash(this.options.callbackPath ?? '/')}`; + return this.buildCallbackUri(this.options.callbackPath); + } + + private get signOutRedirectUri(): string { + return this.buildCallbackUri(this.options.signOutPath); } private get callbackStateKey(): string { @@ -207,7 +227,7 @@ export class MonoCloudWebJSClient { } private get appOrigin(): string { - return new URL(this.options.appUrl).origin; + return new URL(this.appUrl).origin; } private get isTopLevel(): boolean { @@ -257,9 +277,8 @@ export class MonoCloudWebJSClient { * import { MonoCloudWebJSClient } from '@monocloud/auth-web-js'; * * export const client = new MonoCloudWebJSClient({ - * tenantDomain: 'https://your-tenant.us.monocloud.com', - * clientId: 'your-client-id', - * appUrl: 'http://localhost:3000', + * tenantDomain: 'https://', + * clientId: '', * }); * ``` * @@ -268,42 +287,30 @@ export class MonoCloudWebJSClient { * import { MonoCloudWebJSClient, MemoryStorage } from '@monocloud/auth-web-js'; * import { router } from './router'; * - * export const client = new MonoCloudWebJSClient( - * { - * tenantDomain: 'https://your-tenant.us.monocloud.com', - * clientId: 'your-client-id', - * appUrl: 'http://localhost:3000', - * }, - * new MemoryStorage(), - * state => { - * // Use the router to navigate instead of a full page reload. + * export const client = new MonoCloudWebJSClient({ + * tenantDomain: 'https://', + * clientId: '', + * storage: new MemoryStorage(), + * postCallback: state => { * router.push(state.returnUrl ?? '/dashboard'); - * } - * ); + * }, + * }); * ``` * * @param options Configuration options for the client. - * @param storage Storage implementation used to persist sessions. Defaults to {@link LocalStorage}. - * @param postCallbackFn Callback executed after a successful sign-in or sign-out callback. Useful for client-side router integration. - * @param onSessionCreating Hook invoked while creating or updating session. */ - constructor( - options: MonoCloudWebJSClientOptions, - storage: IStorage = new LocalStorage(), - postCallbackFn?: PostCallback, - onSessionCreating?: OnSessionCreating - ) { + constructor(options: MonoCloudWebJSClientOptions) { this.options = { ...options, appUrl: removeTrailingSlash(options.appUrl), }; - this.storage = storage; - if (postCallbackFn) { - this.postCallbackFn = postCallbackFn; + this.storage = options.storage ?? new LocalStorage(); + if (options.postCallback) { + this.postCallbackFn = options.postCallback; } - this.onSessionCreating = onSessionCreating; + this.onSessionCreating = options.onSessionCreating; this.oidcClient = new MonoCloudOidcClient( this.options.tenantDomain, @@ -319,57 +326,41 @@ export class MonoCloudWebJSClient { } /** - * Processes the sign-in callback from the authorization server. + * Processes the authentication callback from the authorization server. * - * Call this from the route handler that owns the sign-in callback path - * (`callbackPath`). + * Call this once on application startup (typically in your entry point or + * router). It inspects the current URL together with the persisted callback + * state and automatically completes a pending sign-in or sign-out flow - + * there is no need to dispatch on the route yourself. * - * @example Router Integration - * ```typescript:src/routes/callback.ts - * // /callback route handler - * await client.processSignInCallback(); - * ``` * - * @returns A promise that resolves when sign-in callback processing is complete. - * @throws {@link MonoCloudJsError} If no sign-in callback state is found (for example, the page was reloaded after the callback was already consumed, or the route was hit without an in-progress sign-in flow). - */ - async processSignInCallback(): Promise { - if (!this.mainWindow) { - this.postCallbackToParent(); - return; - } - - const callbackState = this.redirectCallbackState; - this.redirectCallbackState = undefined; - - if (!callbackState) { - throw new MonoCloudJsError('Sign-in callback state not found'); - } - - await this.internalProcessSignInCallback( - window.location.href, - callbackState - ); - } - - /** - * Processes the sign-out callback from the authorization server. + * @example Application Entry + * ```typescript:src/main.ts + * async function init() { + * // Complete any pending redirect callback before rendering. + * await client.processCallback(); * - * Call this from the route handler that owns the sign-out callback path - * (`signOutCallbackPath`). + * // Continue mounting the app. + * } * - * @example Router Integration - * ```typescript:src/routes/logout.ts - * // /logout route handler - * await client.processSignOutCallback(); + * init(); * ``` * - * @returns A promise that resolves when sign-out callback processing is complete. - * @throws {@link MonoCloudJsError} If no sign-out callback state is found (for example, the page was reloaded after the callback was already consumed, or the route was hit without an in-progress sign-out flow). + * @returns A promise that resolves when callback processing is complete. */ - async processSignOutCallback(): Promise { + async processCallback(): Promise { + const currentUrl = new URL(window.location.href); + const currentPath = removeTrailingSlash( + `${currentUrl.origin}${currentUrl.pathname}` + ); + + const isSignInPath = currentPath === this.redirectUri; + const isSignOutPath = currentPath === this.signOutRedirectUri; + if (!this.mainWindow) { - this.postCallbackToParent(); + if (isSignInPath || isSignOutPath) { + this.postCallbackToParent(); + } return; } @@ -377,13 +368,20 @@ export class MonoCloudWebJSClient { this.redirectCallbackState = undefined; if (!callbackState) { - throw new MonoCloudJsError('Sign-out callback state not found'); + return; } - await this.internalProcessSignOutCallback( - window.location.href, - callbackState - ); + if (isSignInPath && !callbackState.signOut) { + await this.internalProcessSignInCallback( + window.location.href, + callbackState + ); + } else if (isSignOutPath && callbackState.signOut) { + await this.internalProcessSignOutCallback( + window.location.href, + callbackState + ); + } } /** @@ -391,27 +389,17 @@ export class MonoCloudWebJSClient { * * @example Redirect Flow * ```typescript:src/app.ts tab="Redirect Flow" tab-group="signIn" - * document.getElementById('login-btn')!.addEventListener('click', async () => { - * // Standard top-level redirect to the authorization server. - * await client.signIn(); - * }); + * await client.signIn(); * ``` * * @example Popup Flow * ```typescript:src/app.ts tab="Popup Flow" tab-group="signIn" - * document.getElementById('login-popup-btn')!.addEventListener('click', async () => { - * // Opens a centered popup for authentication. - * await client.signIn({ mode: 'popup' }); - * console.log('User finished popup flow!'); - * }); + * await client.signIn({ mode: 'popup' }); * ``` * * @example Sign Up * ```typescript:src/app.ts tab="Sign Up" tab-group="signIn" - * document.getElementById('register-btn')!.addEventListener('click', async () => { - * // Forces the identity provider to show the registration/sign-up screen. - * await client.signIn({ signUp: true }); - * }); + * await client.signIn({ signUp: true }); * ``` * * @param signInOptions Optional configuration for the sign-in request. @@ -438,6 +426,12 @@ export class MonoCloudWebJSClient { }; if (mode === 'redirect') { + if (this.isIframe) { + throw new MonoCloudJsError( + "Cannot start a redirect sign-in from inside an iframe: the MonoCloud sign-in page cannot be displayed in a framed context. Use signIn({ mode: 'popup' }) instead, or perform the redirect on the top-level window." + ); + } + const { url, callbackState } = await this.buildAuthRequest( mode, paramOverrides, @@ -462,17 +456,12 @@ export class MonoCloudWebJSClient { * * @example Standard Sign Out * ```typescript:src/app.ts tab="Redirect Flow" tab-group="signOut" - * document.getElementById('logout-btn')!.addEventListener('click', async () => { - * await client.signOut(); - * }); + * await client.signOut(); * ``` * * @example Popup Sign Out * ```typescript:src/app.ts tab="Popup Flow" tab-group="signOut" - * document.getElementById('logout-popup-btn')!.addEventListener('click', async () => { - * // Opens a popup to perform federated sign-out while keeping the user on the current page. - * await client.signOut({ mode: 'popup' }); - * }); + * await client.signOut({ mode: 'popup' }); * ``` * * @param signOutOptions Optional configuration for the sign-out request. @@ -482,6 +471,13 @@ export class MonoCloudWebJSClient { const mode = signOutOptions?.mode ?? 'redirect'; const federatedSignOut = signOutOptions?.federatedSignOut ?? this.federatedSignOut; + + if (mode === 'redirect' && federatedSignOut && this.isIframe) { + throw new MonoCloudJsError( + "Cannot start a redirect sign-out from inside an iframe: the MonoCloud end-session page cannot be displayed in a framed context. Use signOut({ mode: 'popup' }) instead, or perform the redirect on the top-level window." + ); + } + const ref = federatedSignOut && mode === 'popup' ? this.createRef(mode) : undefined; @@ -496,20 +492,15 @@ export class MonoCloudWebJSClient { return; } - let postLogoutRedirectUri: string | undefined; - - if (this.options.signOutCallbackPath) { - postLogoutRedirectUri = new URL( - this.options.signOutCallbackPath, - this.options.appUrl - ).toString(); - } + let postLogoutRedirectUri = this.signOutRedirectUri; if (signOutOptions?.postLogoutRedirectUri) { - ({ postLogoutRedirectUri } = signOutOptions); + postLogoutRedirectUri = removeTrailingSlash( + signOutOptions.postLogoutRedirectUri + ); } - const state = postLogoutRedirectUri ? generateState() : undefined; + const state = generateState(); const url = await this.oidcClient.endSessionUrl({ idToken: session?.idToken, @@ -548,15 +539,15 @@ export class MonoCloudWebJSClient { * * Requires a session that includes a refresh token (obtained by including the `offline_access` scope at sign-in). * - * To start a fresh, non-interactive authorization (for example, on app bootstrap when there is no local session yet) use {@link MonoCloudWebJSClient.signInSilent} instead. + * To start a fresh, non-interactive authorization (for example, on app bootstrap when there is no local session yet) use {@link MonoCloudWebJSClient.signInSilent | signInSilent()} instead. * - * @example Usage - * ```typescript:src/app.ts + * @example Default + * ```typescript:src/app.ts tab="Default" tab-group="refreshSession" * await client.refreshSession(); * ``` * * @example Resource-Scoped Refresh - * ```typescript:src/app.ts + * ```typescript:src/app.ts tab="Resource-Scoped Refresh" tab-group="refreshSession" * await client.refreshSession({ * refreshGrantOptions: { * resource: 'https://api.example.com', @@ -609,9 +600,9 @@ export class MonoCloudWebJSClient { * * Useful for restoring a session at app bootstrap when the user is signed in at MonoCloud but no local session exists yet (for example, after opening a new tab or a hard refresh that cleared in-memory storage). * - * The method runs a full authorization round-trip through a hidden iframe. If MonoCloud has a valid session it resolves to the new session. Otherwise it rejects with a {@link MonoCloudOPError} - typically with `error: 'login_required'`, `'interaction_required'`, `'consent_required'`, or `'account_selection_required'`, depending on why the authorization server cannot satisfy the request without user interaction. + * The method runs a full authorization round-trip through a hidden iframe. If MonoCloud has a valid session it resolves to the new session. Otherwise it rejects with a {@link MonoCloudOPError}. * - * @example App Bootstrap + * @example Usage * ```typescript:src/app.ts * import { MonoCloudOPError } from '@monocloud/auth-web-js'; * @@ -627,14 +618,6 @@ export class MonoCloudWebJSClient { * } * ``` * - * @example Resource-Scoped Silent Sign In - * ```typescript:src/app.ts - * await client.signInSilent({ - * resource: 'https://api.example.com', - * scopes: 'read:data', - * }); - * ``` - * * @param signInSilentOptions Optional configuration for the silent sign-in request. * @returns The newly established session. * @throws {@link MonoCloudOPError} If the authorization server cannot satisfy the request - for example, because the user has no IdP session (`login_required`) or interaction is otherwise required. @@ -646,7 +629,10 @@ export class MonoCloudWebJSClient { const dedupeKey = this.dedupeKey( 'signInSilent', signInSilentOptions?.resource, - signInSilentOptions?.scopes + signInSilentOptions?.scopes, + signInSilentOptions?.maxAge?.toString(), + signInSilentOptions?.loginHint, + signInSilentOptions?.acrValues?.join(' ') ); return await withDedupedLock(dedupeKey, this.lockKey, async () => { @@ -654,10 +640,14 @@ export class MonoCloudWebJSClient { 'silent', { prompt: 'none', + maxAge: signInSilentOptions?.maxAge, + loginHint: signInSilentOptions?.loginHint, + acrValues: signInSilentOptions?.acrValues, scopes: signInSilentOptions?.scopes, resource: signInSilentOptions?.resource, }, { + maxAge: signInSilentOptions?.maxAge, appState: signInSilentOptions?.appState, } ); @@ -971,7 +961,9 @@ export class MonoCloudWebJSClient { ): Promise { const url = new URL(callbackUrl); - if (this.redirectUri !== `${url.origin}${url.pathname}`) { + if ( + this.redirectUri !== removeTrailingSlash(`${url.origin}${url.pathname}`) + ) { throw new MonoCloudValidationError('Incorrect callback url'); } @@ -1158,11 +1150,7 @@ export class MonoCloudWebJSClient { await this.setSession(session); - await this.postCallbackFn({ - type: 'signIn', - returnUrl: callbackState.returnUrl, - mode: callbackState.mode, - }); + await this.postCallbackFn(callbackState); return; } @@ -1190,11 +1178,7 @@ export class MonoCloudWebJSClient { await this.setSession(session); - await this.postCallbackFn({ - type: 'signIn', - returnUrl: callbackState.returnUrl, - mode: callbackState.mode, - }); + await this.postCallbackFn(callbackState); } private async internalProcessSignOutCallback( @@ -1205,8 +1189,8 @@ export class MonoCloudWebJSClient { const url = new URL(callbackUrl); if ( - ensureLeadingSlash(this.options.signOutCallbackPath ?? '/') !== - url.pathname + this.signOutRedirectUri !== + removeTrailingSlash(`${url.origin}${url.pathname}`) ) { throw new MonoCloudValidationError('Incorrect callback url'); } @@ -1221,11 +1205,7 @@ export class MonoCloudWebJSClient { throw new MonoCloudValidationError('Sign out states mismatch'); } - await this.postCallbackFn({ - type: 'signOut', - returnUrl: callbackState.returnUrl, - mode: callbackState.mode as InteractionMode, - }); + await this.postCallbackFn(callbackState); } private postCallbackToParent(): void { diff --git a/packages/web-js/src/types.ts b/packages/web-js/src/types.ts index 7a84edc7..a03f5c2b 100644 --- a/packages/web-js/src/types.ts +++ b/packages/web-js/src/types.ts @@ -117,9 +117,11 @@ export interface MonoCloudWebJSClientOptions { * * Used to construct redirect URLs and validate cross-origin messages received from popups or iframes. * + * If omitted, it defaults to the current page's origin (`window.location.origin`). + * * @example "https://example.com" */ - appUrl: string; + appUrl?: string; /** * Relative callback path where MonoCloud redirects the user after sign-in. @@ -204,11 +206,11 @@ export interface MonoCloudWebJSClientOptions { /** * Relative path where MonoCloud redirects the user after sign-out. * - * If provided, this URL must be registered in the application's sign-out URLs in MonoCloud. + * This URL must be registered in the application's sign-out URLs in MonoCloud. If omitted, the sign-out callback URL defaults to `appUrl` with path `/`. * * @example "/signout" */ - signOutCallbackPath?: string; + signOutPath?: string; /** * Client secret or JSON Web Key used for client authentication. @@ -261,6 +263,21 @@ export interface MonoCloudWebJSClientOptions { * Duration (in seconds) to cache OpenID Connect discovery metadata after it is fetched from the authorization server. */ metadataCacheDuration?: number; + + /** + * Storage implementation used to persist sessions. Defaults to {@link LocalStorage}. + */ + storage?: IStorage; + + /** + * Callback executed after a successful sign-in or sign-out callback. Useful for client-side router integration. + */ + postCallback?: PostCallback; + + /** + * Hook invoked while creating or updating session. + */ + onSessionCreating?: OnSessionCreating; } /** @@ -323,29 +340,6 @@ export type InteractionMode = */ | 'redirect'; -/** - * Metadata passed to {@link PostCallback} after callback processing completes. - * - * @category Types - */ -export type PostCallbackParams = - | { - /** Indicates a sign-in flow was completed. */ - type: 'signIn'; - /** Interaction mode used during sign-in. */ - mode: InteractionMode | 'silent'; - /** Optional URL to navigate to after sign-in. */ - returnUrl?: string; - } - | { - /** Indicates a sign-out flow was completed. */ - type: 'signOut'; - /** Interaction mode used during sign-out. */ - mode: InteractionMode; - /** Optional URL to navigate to after sign-out. */ - returnUrl?: string; - }; - /** * Callback executed after sign-in or sign-out callback processing. * @@ -353,10 +347,10 @@ export type PostCallbackParams = * * @category Types (Handler) * - * @param state Metadata describing the completed flow. + * @param state Callback state. * @returns Returns a promise or void. Execution continues once the callback completes. */ -export type PostCallback = (state: PostCallbackParams) => Promise | void; +export type PostCallback = (state: CallbackState) => Promise | void; /** * Options used to customize the sign-in flow. @@ -482,8 +476,6 @@ export interface SignOutOptions { /** * Options used to customize the session refresh flow. * - * `refreshSession()` exclusively uses the Refresh Token Grant. To start a fresh, non-interactive authorization (e.g. on app bootstrap) use {@link MonoCloudWebJSClient.signInSilent} instead. - * * @category Types */ export interface RefreshOptions { @@ -499,6 +491,27 @@ export interface RefreshOptions { * @category Types */ export interface SignInSilentOptions { + /** + * Maximum allowed time (in seconds) since the user's last authentication. + * + * If the existing session is older than this value, the authorization server cannot satisfy the silent request and will reject with `login_required`. + */ + maxAge?: number; + + /** + * Hint identifying the user (for example, an email or username). Helps the authorization server disambiguate when multiple sessions are present. + * + * @example "user@example.com" + */ + loginHint?: string; + + /** + * Authentication Context Class Reference (ACR) values requesting specific authentication assurance levels or methods. + * + * If the existing session does not satisfy the requested ACR, the authorization server will reject with `interaction_required`. + */ + acrValues?: string[]; + /** * Space-separated scopes requested from the authorization server for this specific silent sign-in. * diff --git a/packages/web-js/tests/sign-in-silent.test.ts b/packages/web-js/tests/sign-in-silent.test.ts index 40b28a0c..9876b63b 100644 --- a/packages/web-js/tests/sign-in-silent.test.ts +++ b/packages/web-js/tests/sign-in-silent.test.ts @@ -479,6 +479,33 @@ describe('instance.signInSilent() Tests', () => { }); }); + it('should forward maxAge, loginHint, and acrValues to the authorize request', async () => { + fetchBuilder().configureMetadata().createSpy(); + mockWindow.assert(); + const { getSrc } = mountIframe(); + + const instance = testInstance({ storage: mockStorage }); + + const promise = instance.signInSilent({ + maxAge: 60, + loginHint: 'user@example.com', + acrValues: ['mfa', 'urn:level:high'], + }); + + await vi.waitFor(() => { + expect(getSrc()).toContain('https://example.com/connect/authorize'); + }); + + const url = new URL(getSrc()); + expect(url.searchParams.get('max_age')).toBe('60'); + expect(url.searchParams.get('login_hint')).toBe('user@example.com'); + expect(url.searchParams.get('acr_values')).toBe('mfa urn:level:high'); + expect(url.searchParams.get('prompt')).toBe('none'); + + dispatchSoftError(url.searchParams.get('state')); + await promise.catch(() => {}); + }); + it('should merge per-call scopes and resource with the configured defaults', async () => { fetchBuilder().configureMetadata().createSpy(); mockWindow.assert(); diff --git a/packages/web-js/tests/sign-in.test.ts b/packages/web-js/tests/sign-in.test.ts index 2b0dfca3..00a77438 100644 --- a/packages/web-js/tests/sign-in.test.ts +++ b/packages/web-js/tests/sign-in.test.ts @@ -64,7 +64,7 @@ describe('signIn() Tests', () => { mockWindow .expectOrigin('https://example.com/connect/authorize') - .expectQuery('redirect_uri', 'http://localhost:3000/') + .expectQuery('redirect_uri', 'http://localhost:3000') .assert(); const instance = testInstance({ @@ -78,6 +78,25 @@ describe('signIn() Tests', () => { fetchSpy.assert(); }); + it('should default appUrl to the current window origin when not provided', async () => { + const fetchSpy = fetchBuilder().configureMetadata().createSpy(); + + mockWindow + .expectOrigin('https://example.com/connect/authorize') + .expectQuery('redirect_uri', 'http://localhost:3000/callback') + .assert(); + + const instance = testInstance({ + storage: mockStorage, + appUrl: undefined, + }); + + await instance.signIn(); + + expect(window.location.assign).toHaveBeenCalledOnce(); + fetchSpy.assert(); + }); + it('should redirect to sign in page with the preferred authenticator', async () => { const fetchSpy = fetchBuilder().configureMetadata().createSpy(); @@ -161,6 +180,42 @@ describe('signIn() Tests', () => { fetchSpy.assert(); }); + it('Redirect Mode - should throw when called from inside an iframe', async () => { + mockWindow.mockParentSide('silent').assert(); + + const instance = testInstance({ storage: mockStorage }); + + const error = await instance.signIn().catch(e => e); + + expect(error).toBeInstanceOf(MonoCloudJsError); + expect(error.message).toContain( + 'Cannot start a redirect sign-in from inside an iframe' + ); + expect(window.location.assign).not.toHaveBeenCalled(); + }); + + it('Popup Mode - should not throw the iframe guard when called from inside an iframe', async () => { + fetchBuilder().configureMetadata().createSpy(); + + const mockPopup = { + close: vi.fn(), + closed: false, + location: { href: '' }, + } as unknown as Window; + + vi.spyOn(window, 'open').mockReturnValue(mockPopup); + + mockWindow.mockParentSide('silent').assert(); + + const instance = testInstance({ storage: mockStorage }); + + instance.signIn({ mode: 'popup' }); + + await vi.waitFor(() => { + expect(mockPopup.location.href).toMatch(urlRegex); + }); + }); + it('Redirect Mode - should process callback using the default callback state key', async () => { const idToken = await generateIdToken({ nonce: 'nonce' }); @@ -192,7 +247,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved().expectSession(); expect(await instance.getSession()).toBeDefined(); @@ -200,7 +255,7 @@ describe('signIn() Tests', () => { fetchSpy.assert(); }); - it('Redirect Mode - should throw if there is no callback state found', async () => { + it('Redirect Mode - should no-op if there is no callback state found', async () => { mockWindow .setSearch('?state=state&code=code') .setPathname('/callback') @@ -208,16 +263,13 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); - - expect(error).toBeInstanceOf(MonoCloudJsError); - expect(error.message).toBe('Sign-in callback state not found'); + await expect(instance.processCallback()).resolves.toBeUndefined(); mockStorage.expectCallbackStateRemoved().expectNoSession(); expect(await instance.getSession()).toBeUndefined(); }); - it('Redirect Mode - should throw if the stored callback state is for a sign-out flow', async () => { + it('Redirect Mode - should no-op on the sign-in path if the stored callback state is for a sign-out flow', async () => { mockWindow .setSearch('?state=state&code=code') .setPathname('/callback') @@ -233,10 +285,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); - - expect(error).toBeInstanceOf(MonoCloudValidationError); - expect(error.message).toBe('Incorrect callback state'); + await expect(instance.processCallback()).resolves.toBeUndefined(); mockStorage.expectCallbackStateRemoved().expectNoSession(); }); @@ -272,7 +321,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved().expectSession(); @@ -336,7 +385,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage, postCallback: fn }); - await instance.processSignInCallback(); + await instance.processCallback(); const session = await instance.getSession(); @@ -361,7 +410,7 @@ describe('signIn() Tests', () => { mockWindow .setSearch('?state=state&code=code') .setPathname('/callback') - .expectHrefCalled('/test') + .expectHrefCalled('http://localhost:3000/test') .assert(); const state: CallbackState = { @@ -378,12 +427,60 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); + + const session = await instance.getSession(); + + expect(session?.user).toBeDefined(); + fetchSpy.assert(); + }); + + it('should ignore returnUrl that resolves to a different origin than appUrl', async () => { + const idToken = await generateIdToken({ nonce: 'nonce' }); + + const fetchSpy = fetchBuilder() + .configureMetadata() + .configureJwks() + .configureTokenEndpoint({ + idToken, + body: 'grant_type=authorization_code&code=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&code_verifier=codeVerifier', + }) + .configureUserinfo() + .createSpy(); + + mockWindow + .setSearch('?state=state&code=code') + .setPathname('/callback') + .assert(); + + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + const state: CallbackState = { + codeVerifier: 'codeVerifier', + nonce: 'nonce', + state: 'state', + mode: 'redirect', + scopes: 'openid offline_access', + returnUrl: 'https://evil.com/phish', + responseType: 'code', + }; + + mockStorage.setCallbackState(state); + + const instance = testInstance({ storage: mockStorage }); + + await instance.processCallback(); const session = await instance.getSession(); expect(session?.user).toBeDefined(); + expect(warnSpy).toHaveBeenCalledWith( + expect.stringContaining('different origin') + ); + expect(window.location.href).not.toContain('evil.com'); fetchSpy.assert(); + + warnSpy.mockRestore(); }); it('should use default path for processing callback if the callback path is undefined', async () => { @@ -394,7 +491,7 @@ describe('signIn() Tests', () => { .configureJwks() .configureTokenEndpoint({ idToken, - body: 'grant_type=authorization_code&code=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2F&code_verifier=codeVerifier', + body: 'grant_type=authorization_code&code=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000&code_verifier=codeVerifier', }) .configureUserinfo() .createSpy(); @@ -417,7 +514,7 @@ describe('signIn() Tests', () => { callbackPath: undefined, }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -461,7 +558,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); const session = await instance.getSession(); @@ -517,7 +614,7 @@ describe('signIn() Tests', () => { defaultAuthParams: { responseType: 'code token' }, }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); const session = await instance.getSession(); @@ -553,7 +650,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -603,7 +700,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -654,7 +751,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -709,7 +806,7 @@ describe('signIn() Tests', () => { fetchUserinfo: false, }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -740,7 +837,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudValidationError); expect(error.message).toBe('Sign in callback states mismatch'); @@ -769,7 +866,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudOPError); expect(error).toMatchObject({ @@ -805,7 +902,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await expect(instance.processSignInCallback()).rejects.toThrow( + await expect(instance.processCallback()).rejects.toThrow( 'Error while fetching JWKS. Unexpected status code: 400' ); @@ -843,13 +940,13 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const processSignInCallbackPromise = instance.processSignInCallback(); + const processCallbackPromise = instance.processCallback(); - await expect(processSignInCallbackPromise).rejects.toBeInstanceOf( + await expect(processCallbackPromise).rejects.toBeInstanceOf( MonoCloudValidationError ); - await expect(processSignInCallbackPromise).rejects.toThrow( + await expect(processCallbackPromise).rejects.toThrow( 'Fetching userinfo requires the openid scope' ); @@ -886,13 +983,13 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const processSignInCallbackPromise = instance.processSignInCallback(); + const processCallbackPromise = instance.processCallback(); - await expect(processSignInCallbackPromise).rejects.toBeInstanceOf( + await expect(processCallbackPromise).rejects.toBeInstanceOf( MonoCloudValidationError ); - await expect(processSignInCallbackPromise).rejects.toThrow( + await expect(processCallbackPromise).rejects.toThrow( "The 'expires_in' parameter is missing from the callback" ); @@ -921,7 +1018,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudTokenError); expect(error.message).toBe( @@ -959,7 +1056,7 @@ describe('signIn() Tests', () => { validateIdToken: false, }); - await instance.processSignInCallback(); + await instance.processCallback(); mockStorage.expectCallbackStateRemoved(); @@ -996,7 +1093,7 @@ describe('signIn() Tests', () => { validateIdToken: false, }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudTokenError); expect(error.message).toBe('JWT does not contain payload'); @@ -1030,7 +1127,7 @@ describe('signIn() Tests', () => { validateIdToken: false, }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudHttpError); expect(error.message).toBe( @@ -1068,7 +1165,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignInCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudHttpError); expect(error.message).toBe( @@ -1091,7 +1188,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); expect(window.fetch).not.toHaveBeenCalled(); @@ -1106,6 +1203,23 @@ describe('signIn() Tests', () => { }); }); + it('Popup Mode - should not post to the parent when the URL is not a callback path', async () => { + fetchBuilder().createSpy(); + + mockWindow + .mockPostMessage() + .mockParentSide('popup') + .setPathname('/some-other-page') + .assert(); + + const instance = testInstance({ storage: mockStorage }); + + await instance.processCallback(); + + expect(mockWindow.parentPostMessage).not.toHaveBeenCalled(); + expect(window.fetch).not.toHaveBeenCalled(); + }); + it('Popup Mode - should throw an error if states mismatch', async () => { fetchBuilder().configureMetadata().createSpy(); @@ -2200,7 +2314,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const processPromise = instance.processSignInCallback(); + const processPromise = instance.processCallback(); await expect(processPromise).rejects.toThrow(SyntaxError); @@ -2311,7 +2425,7 @@ describe('signIn() Tests', () => { const instance = testInstance({ storage: mockStorage }); - await instance.processSignInCallback(); + await instance.processCallback(); expect(mockParent.postMessage).toHaveBeenCalledWith( expect.objectContaining({ @@ -2521,7 +2635,7 @@ describe('signIn() Tests', () => { .setPathname('/callback') .assert(); - await instance.processSignInCallback(); + await instance.processCallback(); const session = await instance.getSession(); expect(session).toBeDefined(); @@ -2571,7 +2685,7 @@ describe('signIn() Tests', () => { .setPathname('/callback') .assert(); - await instance.processSignInCallback(); + await instance.processCallback(); const session = await instance.getSession(); expect(session).toBeDefined(); diff --git a/packages/web-js/tests/sign-out.test.ts b/packages/web-js/tests/sign-out.test.ts index a0e3f7be..6b2c852a 100644 --- a/packages/web-js/tests/sign-out.test.ts +++ b/packages/web-js/tests/sign-out.test.ts @@ -25,7 +25,7 @@ describe('signOut() Tests', () => { window.sessionStorage.clear(); }); - it('Redirect Mode - should set custom redirect uri from options', async () => { + it('Redirect Mode - should set custom redirect uri from options (with trailing slash trimmed)', async () => { const fetchSpy = fetchBuilder().configureMetadata().createSpy(); mockWindow @@ -38,7 +38,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage }); instance.signOut({ - postLogoutRedirectUri: 'http://localhost:3000/signout/custom', + postLogoutRedirectUri: 'http://localhost:3000/signout/custom/', }); await vi.waitFor(() => { @@ -47,19 +47,67 @@ describe('signOut() Tests', () => { }); }); - it('should redirect to signout without state, logout uri and idToken', async () => { + it('Redirect Mode - should throw a federated sign-out from inside an iframe and not clear the session', async () => { + mockWindow.mockParentSide('silent').assert(); + + const session: MonoCloudSession = { + user: { sub: 'sub' }, + accessTokens: [], + authorizedScopes: 'openid', + }; + + await setSession(mockStorage, session); + + const instance = testInstance({ storage: mockStorage }); + + const error = await instance + .signOut({ federatedSignOut: true }) + .catch(e => e); + + expect(error).toBeInstanceOf(MonoCloudJsError); + expect(error.message).toContain( + 'Cannot start a redirect sign-out from inside an iframe' + ); + expect(window.location.assign).not.toHaveBeenCalled(); + + mockStorage.expectSession(session); + expect(await instance.getSession()).toEqual(session); + }); + + it('should not throw a non-federated sign-out from inside an iframe', async () => { + mockWindow.mockParentSide('silent').assert(); + + const session: MonoCloudSession = { + user: { sub: 'sub' }, + accessTokens: [], + authorizedScopes: 'openid', + }; + + await setSession(mockStorage, session); + + const instance = testInstance({ storage: mockStorage }); + + await expect( + instance.signOut({ federatedSignOut: false }) + ).resolves.toBeUndefined(); + + expect(window.location.assign).not.toHaveBeenCalled(); + mockStorage.expectNoSession(); + }); + + it('should redirect to signout with the root post logout redirect uri (and state) when signOutPath is not set', async () => { const fetchSpy = fetchBuilder().configureMetadata().createSpy(); mockWindow .expectQuery('client_id', 'clientId') - .doNotExpectQueryKey('state') - .doNotExpectQueryKey('post_logout_redirect_uri') + .expectQueryKey('state') + .expectQuery('post_logout_redirect_uri', 'http://localhost:3000') .doNotExpectQueryKey('id_token_hint') .assert(); const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); instance.signOut(); @@ -70,13 +118,13 @@ describe('signOut() Tests', () => { }); }); - it('should redirect to signout without state, logout uri and idToken (Session Present)', async () => { + it('should redirect to signout with the root post logout redirect uri (and state) when signOutPath is not set (Session Present)', async () => { const fetchSpy = fetchBuilder().configureMetadata().createSpy(); mockWindow .expectQuery('client_id', 'clientId') - .doNotExpectQueryKey('state') - .doNotExpectQueryKey('post_logout_redirect_uri') + .expectQueryKey('state') + .expectQuery('post_logout_redirect_uri', 'http://localhost:3000') .doNotExpectQueryKey('id_token_hint') .assert(); @@ -97,7 +145,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); expect(await instance.getSession()).toBeDefined(); @@ -151,17 +199,17 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: '/signout', + signOutPath: '/signout', }); - instance.processSignOutCallback(); + instance.processCallback(); await vi.waitFor(() => { mockStorage.expectCallbackStateRemoved(); }); }); - it('Redirect Mode - should process signout callback even if the signOutCallbackPath is not set', async () => { + it('Redirect Mode - should process signout callback even if the signOutPath is not set', async () => { mockWindow.setSearch('?state=state').setPathname('/').assert(); const state: CallbackState = { @@ -174,17 +222,17 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); - instance.processSignOutCallback(); + instance.processCallback(); await vi.waitFor(() => { mockStorage.expectCallbackStateRemoved(); }); }); - it('Redirect Mode - should process signout callback with signOutCallbackPath without leading slash', async () => { + it('Redirect Mode - should process signout callback with signOutPath without leading slash', async () => { mockWindow.setSearch('?state=state').setPathname('/signout').assert(); const state: CallbackState = { @@ -197,10 +245,10 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: 'signout', + signOutPath: 'signout', }); - instance.processSignOutCallback(); + instance.processCallback(); await vi.waitFor(() => { mockStorage.expectCallbackStateRemoved(); @@ -220,7 +268,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignOutCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudValidationError); expect(error.message).toBe('Sign out states mismatch'); @@ -248,10 +296,10 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: '/signout', + signOutPath: '/signout', }); - instance.processSignOutCallback(); + instance.processCallback(); await vi.waitFor(() => { expect(mockWindow.parentPostMessage).toHaveBeenCalledWith( @@ -277,7 +325,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: '/signout', + signOutPath: '/signout', }); const signOutPromise = instance.signOut({ mode: 'popup' }); @@ -328,7 +376,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); const signOutPromise = instance.signOut({ mode: 'popup' }); @@ -345,11 +393,13 @@ describe('signOut() Tests', () => { expect.any(String) ); + const state = new URL(mockPopup.location.href).searchParams.get('state'); + window.dispatchEvent( new MessageEvent('message', { data: { source: 'monocloud-auth-web-js', - url: `http://localhost:3000`, + url: `http://localhost:3000?state=${state}`, }, source: mockPopup, origin: 'http://localhost:3000', @@ -509,7 +559,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); const signOutPromise = instance.signOut({ mode: 'popup' }); @@ -533,11 +583,13 @@ describe('signOut() Tests', () => { expect(mockPopup.close).not.toHaveBeenCalled(); + const state = new URL(mockPopup.location.href).searchParams.get('state'); + window.dispatchEvent( new MessageEvent('message', { data: { source: 'monocloud-auth-web-js', - url: `http://localhost:3000`, + url: `http://localhost:3000?state=${state}`, }, source: mockPopup, origin: 'http://localhost:3000', @@ -567,7 +619,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); expect(await instance.getSession()).toBeUndefined(); @@ -595,11 +647,13 @@ describe('signOut() Tests', () => { expect(mockPopup.close).not.toHaveBeenCalled(); + const state = new URL(mockPopup.location.href).searchParams.get('state'); + window.dispatchEvent( new MessageEvent('message', { data: { source: 'monocloud-auth-web-js', - url: `http://localhost:3000`, + url: `http://localhost:3000?state=${state}`, }, source: mockPopup as unknown as Window, origin: 'http://localhost:3000', @@ -629,7 +683,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: undefined, + signOutPath: undefined, }); expect(await instance.getSession()).toBeUndefined(); @@ -655,11 +709,13 @@ describe('signOut() Tests', () => { expect(mockPopup.close).not.toHaveBeenCalled(); + const state = new URL(mockPopup.location.href).searchParams.get('state'); + window.dispatchEvent( new MessageEvent('message', { data: { source: 'monocloud-auth-web-js', - url: `http://localhost:3000`, + url: `http://localhost:3000?state=${state}`, }, source: mockPopup as unknown as Window, origin: 'http://localhost:3000', @@ -856,12 +912,12 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage, - signOutCallbackPath: '/signout', + signOutPath: '/signout', }); expect(await instance.getSession()).toBeDefined(); - const error = await instance.processSignOutCallback().catch(e => e); + const error = await instance.processCallback().catch(e => e); expect(error).toBeInstanceOf(MonoCloudValidationError); expect(error.message).toBe('Sign out states mismatch'); @@ -913,18 +969,17 @@ describe('signOut() Tests', () => { expect(error.message).toBe('Incorrect callback state'); }); - it('processSignOutCallback - should throw when callback state is missing', async () => { + it('processCallback - should no-op when callback state is missing', async () => { mockWindow.setPathname('/signout').assert(); const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignOutCallback().catch(e => e); + await expect(instance.processCallback()).resolves.toBeUndefined(); - expect(error).toBeInstanceOf(MonoCloudJsError); - expect(error.message).toBe('Sign-out callback state not found'); + mockStorage.expectCallbackStateRemoved().expectNoSession(); }); - it('processSignOutCallback - should throw when callback state is a sign-in state', async () => { + it('processCallback - should no-op on the sign-out path when callback state is a sign-in state', async () => { mockWindow.setPathname('/signout').assert(); const state: CallbackState = { @@ -937,10 +992,7 @@ describe('signOut() Tests', () => { const instance = testInstance({ storage: mockStorage }); - const error = await instance.processSignOutCallback().catch(e => e); - - expect(error).toBeInstanceOf(MonoCloudValidationError); - expect(error.message).toBe('Incorrect callback state'); + await expect(instance.processCallback()).resolves.toBeUndefined(); mockStorage.expectCallbackStateRemoved().expectNoSession(); }); diff --git a/packages/web-js/tests/utils.ts b/packages/web-js/tests/utils.ts index 89b7d30c..92824c67 100644 --- a/packages/web-js/tests/utils.ts +++ b/packages/web-js/tests/utils.ts @@ -5,9 +5,7 @@ import type { CallbackState, IStorage, InteractionMode, - PostCallback, MonoCloudWebJSClientOptions, - OnSessionCreating, } from '../src'; import { AUTH_CONSTANTS } from '../src/constants'; import { MonoCloudWebJSClient } from '../src'; @@ -20,34 +18,20 @@ export const ensureLockManagerStub = (): void => { }; export const testInstance = ( - options?: Partial & { - storage?: IStorage; - postCallback?: PostCallback; - onSessionCreating?: OnSessionCreating; - } + options?: Partial ): MonoCloudWebJSClient => { const deafultOptions = { appUrl: 'http://localhost:3000', tenantDomain: 'https://example.com', callbackPath: '/callback', - signOutCallbackPath: '/signout', + signOutPath: '/signout', clientId: 'clientId', }; - // eslint-disable-next-line no-param-reassign - options = options - ? { - ...deafultOptions, - ...options, - } - : deafultOptions; - - const instance = new MonoCloudWebJSClient( - options as MonoCloudWebJSClientOptions, - options.storage, - options.postCallback, - options.onSessionCreating - ); + const instance = new MonoCloudWebJSClient({ + ...deafultOptions, + ...options, + } as MonoCloudWebJSClientOptions); return instance; }; diff --git a/packages/web-js/tsdown.config.mts b/packages/web-js/tsdown.config.mts index 9d04263e..b57d04ac 100644 --- a/packages/web-js/tsdown.config.mts +++ b/packages/web-js/tsdown.config.mts @@ -5,6 +5,7 @@ const common = { entry: ['src/index.ts', 'src/utils/index.ts', 'src/utils/internal.ts'], clean: true, sourcemap: true, + noExternal: ['browser-tabs-lock'], }; export default defineConfig([