@strands.gg/accui 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accui.css +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js.map +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +15 -21
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.es.js +2 -2
- package/dist/nuxt/runtime/composables/useStrandsAuth.es.js.map +1 -1
- package/dist/nuxt/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt/runtime/plugin.client.es.js +1 -1
- package/dist/nuxt-v4/module.cjs.js +7 -1
- package/dist/nuxt-v4/module.cjs.js.map +1 -1
- package/dist/nuxt-v4/module.d.ts +5 -0
- package/dist/nuxt-v4/module.d.ts.map +1 -1
- package/dist/nuxt-v4/module.es.js +27 -18
- package/dist/nuxt-v4/module.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts +21 -59
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +45 -36
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.d.ts.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.es.js +23 -12
- package/dist/nuxt-v4/runtime/plugin.client.es.js.map +1 -1
- package/dist/nuxt-v4/types.d.ts +2 -2
- package/dist/nuxt-v4/types.d.ts.map +1 -1
- package/dist/nuxt-v4.d.ts +1 -0
- package/dist/nuxt-v4.d.ts.map +1 -1
- package/dist/strands-auth-ui.cjs.js +1 -1
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +1468 -1315
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/useStrandsAuth-BGunGG2x.cjs +2 -0
- package/dist/useStrandsAuth-BGunGG2x.cjs.map +1 -0
- package/dist/useStrandsAuth-DiD32KI7.js +91 -0
- package/dist/useStrandsAuth-DiD32KI7.js.map +1 -0
- package/dist/useStrandsConfig-CtzCmeS1.js +105 -0
- package/dist/useStrandsConfig-CtzCmeS1.js.map +1 -0
- package/dist/useStrandsConfig-DamqmMUO.cjs +2 -0
- package/dist/useStrandsConfig-DamqmMUO.cjs.map +1 -0
- package/dist/vue/components/StrandsAuth.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts +7 -3
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts +5 -1
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsSignIn.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsSignUp.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsUserProfile.vue.d.ts +2 -0
- package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsAuth.d.ts +2 -1
- package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsConfig.d.ts +2 -0
- package/dist/vue/composables/useStrandsConfig.d.ts.map +1 -1
- package/dist/vue/ui/UiInput.vue.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/useStrandsAuth-Bh7evftS.js +0 -66
- package/dist/useStrandsAuth-Bh7evftS.js.map +0 -1
- package/dist/useStrandsAuth-sAfTQeGC.cjs +0 -2
- package/dist/useStrandsAuth-sAfTQeGC.cjs.map +0 -1
- package/dist/useStrandsConfig-BYwF65Ph.js +0 -89
- package/dist/useStrandsConfig-BYwF65Ph.js.map +0 -1
- package/dist/useStrandsConfig-Bhbfl0PJ.cjs +0 -2
- package/dist/useStrandsConfig-Bhbfl0PJ.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strands-auth-ui.es.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 text-black rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"data:image/png;base64,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\"","<template>\n <div class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const response = await fetch(getUrl('oauthProviders'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <!-- Email -->\n <UiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string) {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign in failed')\n }\n\n return result.data\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign up failed')\n }\n\n return result.data\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual auth SDK call\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <UiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual magic link API call\n console.log('Magic link sign up attempt:', { email: form.email })\n emit('success', {\n email: form.email\n })\n } catch (err) {\n error.value = 'Failed to send magic link'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">🎉</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome to Strands!</h1>\n <p class=\"text-neutral-600 mb-4\">\n Your account has been created successfully.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n You are now signed in and can access your dashboard.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-red-500 text-6xl mb-4\">❌</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Invalid Link</h1>\n <p class=\"text-neutral-600 mb-4\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n Please request a new magic link to complete your registration.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Complete Your Registration</h1>\n <p class=\"text-neutral-600\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"mt-2\">\n <p class=\"text-sm text-neutral-500\">Creating account for: <span class=\"font-medium text-neutral-700\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"space-y-6\">\n <!-- Username -->\n <div>\n <UiInput\n id=\"username\"\n v-model=\"form.username\"\n type=\"text\"\n label=\"Username\"\n placeholder=\"Choose a username\"\n autocomplete=\"username\"\n required\n :error=\"fieldErrors.username\"\n />\n </div>\n\n <!-- First Name -->\n <div>\n <UiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <UiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <UiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"mt-2 text-xs text-neutral-500\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"mt-6 animate-fade-in\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-yellow-500 text-6xl mb-4\">⚠️</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Missing Token</h1>\n <p class=\"text-neutral-600 mb-4\">\n No registration token was provided.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.username.trim() && form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n// Watch for username requirements\nwatch(\n () => form.username,\n (username) => {\n if (username && username.length < 2) {\n fieldErrors.username = 'Username must be at least 2 characters long'\n } else {\n fieldErrors.username = ''\n }\n }\n)\n\n// Auth configuration\nconst authConfig = computed(() => ({\n baseUrl: props.config?.baseUrl || 'http://localhost:8000',\n referrerUrl: props.redirectUrl || 'http://localhost:3001'\n}))\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (authConfig.value.referrerUrl) {\n console.log('Redirecting to referrer:', authConfig.value.referrerUrl)\n window.location.href = authConfig.value.referrerUrl\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(`${authConfig.value.baseUrl}/api/v1/auth/complete-registration`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n username: form.username,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result = await response.json()\n console.log('Registration success:', result)\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-neutral-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\">\n {{ getInitials(user?.firstName, user?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"handleImageUpload\"\n >\n <svg class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200\"\n @click=\"handleImageUpload\"\n >\n Change photo\n </button>\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n\n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\n\ninterface Props {\n user?: User\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst showPasswordChange = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([\n { id: '1', device: 'Chrome on Mac', location: 'San Francisco, CA', lastActive: '2 minutes ago', current: true },\n { id: '2', device: 'Safari on iPhone', location: 'San Francisco, CA', lastActive: '1 hour ago', current: false },\n])\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst hasChanges = computed(() => {\n if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.user.phone || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Initialize form with user data\nwatch(() => props.user, (user) => {\n if (user) {\n form.firstName = user.firstName\n form.lastName = user.lastName\n form.email = user.email\n form.phone = user.phone || ''\n }\n}, { immediate: true })\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual profile update call\n // Example: await authSDK.updateProfile(form)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleImageUpload = () => {\n // Integration point: Implement image upload functionality\n // Example: Open file picker, upload to storage, update user avatar\n emit('error', 'Image upload functionality not yet implemented')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.user.phone || ''\n }\n clearMessages()\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <UiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n\n <!-- Need help -->\n <div class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" href=\"mailto:support@strands.gg\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-6\">\n <!-- QR Code Section -->\n <div class=\"text-center\">\n <div class=\"w-48 h-48 bg-gray-100 rounded-lg mx-auto mb-4 flex items-center justify-center\">\n <div class=\"text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h.01M12 12v4.01\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\">Scan this QR code with your authenticator app</p>\n </div>\n\n <!-- Setup Key -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Setup Key (manual entry)</label>\n <div class=\"p-3 bg-gray-50 rounded border text-sm font-mono break-all\">\n XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX\n </div>\n </div>\n\n <!-- Verification Code Input -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Verification Code</label>\n <input \n type=\"text\" \n placeholder=\"Enter 6-digit code\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-strands-500 focus:border-strands-500\"\n maxlength=\"6\"\n />\n <p class=\"text-xs text-gray-500 mt-1\">Enter the 6-digit code from your authenticator app</p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 pt-4\">\n <button \n type=\"button\"\n class=\"flex-1 bg-strands-500 text-white py-2 px-4 rounded-md hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-colors\"\n >\n Enable 2FA\n </button>\n <button \n type=\"button\"\n class=\"flex-1 bg-gray-200 text-gray-800 py-2 px-4 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors\"\n @click=\"$emit('back')\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'back'): void\n}\n\ndefineEmits<Emits>()\n</script>","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => h('g', [\n h('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n h('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => h('g', { fill: 'currentColor' }, [\n h('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n h('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n h('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n h('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : h('path', { d: '' })\n})\n</script>\n","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n// Phone validation (basic)\nexport const isValidPhone = (phone: string): boolean => {\n const phoneRegex = /^[\\+]?[1-9][\\d]{0,15}$/\n return phoneRegex.test(phone.replace(/[\\s\\-\\(\\)]/g, ''))\n}\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_hoisted_1","_hoisted_2","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","$setup","_createElementVNode","_hoisted_3","_hoisted_4","$props","_createCommentVNode","_renderSlot","_ctx","_createTextVNode","_hoisted_6","_cache","buttonClasses","sizeClasses","widthClasses","$event","_toDisplayString","cardClasses","paddingClasses","shadowClasses","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","event","target","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","tag","linkProps","baseProps","linkClasses","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","activeTabIndex","modelValue","toRefs","watch","_Fragment","_renderList","_normalizeStyle","_imports_0","useOAuthProviders","options","getUrl","useStrandsConfig","providers","loading","error","enabledProviders","provider","fetchProviders","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isPasswordMatch","isFormValid","PASSWORD_STRENGTH_CONFIGS","getPasswordStrength","score","config","handleAuth","handleOAuthAuth","newMode","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_18","_hoisted_19","_createVNode","_Transition","_hoisted_12","_withModifiers","_hoisted_17","registrationComplete","invalidToken","fieldErrors","hasRequiredFields","passwordMinLength","hasValidToken","username","authConfig","parts","payload","redirectToReferrer","key","errorText","showPasswordChange","successMessage","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","resolve","updatedUser","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_withDirectives","_vModelText","_hoisted_20","_hoisted_21","_hoisted_30","_hoisted_29","_hoisted_32","_hoisted_33","_hoisted_37","_component_UiLink","isSubmitted","_createStaticVNode","isAuthenticated","signOut","useStrandsAuth","isLoading","args","provideStrandsConfig","iconClass","viewBox","icons","h","iconComponent","icon","isValidEmail","validatePassword","isValid","strength","isValidName","name","isValidPhone","phone","isRequired","passwordsMatch","confirmation","first","last","formatDate","date","debounce","func","wait","timeout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.es.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 text-black rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n\n<style scoped>\n/* \n BITWARDEN & PASSWORD MANAGER STYLE PREVENTION\n =============================================\n \n These styles use !important to prevent password managers (Bitwarden, 1Password, etc.)\n from overriding our input styling. Password managers often inject their own CSS that\n can break our design system.\n \n If you need to modify input styles, edit these CSS rules rather than just the Tailwind\n classes, as password managers may override the Tailwind classes.\n*/\n\n/* Base input styles - override password manager modifications */\ninput[type=\"email\"],\ninput[type=\"password\"],\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"tel\"],\ninput[type=\"url\"] {\n /* Force our styles to take precedence over password manager modifications */\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important; /* gray-300 */\n border-radius: 0.5rem !important; /* rounded-lg */\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important; /* shadow-sm */\n color: black !important;\n font-family: inherit !important;\n font-size: 0.875rem !important; /* text-sm */\n line-height: 1.25rem !important;\n padding: 0.625rem 0.75rem !important; /* py-2.5 px-3 */\n transition: border-color 0.2s, box-shadow 0.2s !important;\n}\n\n/* Focus state overrides */\ninput[type=\"email\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus {\n border-color: rgb(234 0 168) !important; /* strands-500 */\n box-shadow: 0 0 0 3px rgb(234 0 168 / 0.1) !important; /* strands-500 with opacity */\n outline: none !important;\n}\n\n/* Error state overrides */\ninput.border-red-300 {\n border-color: rgb(252 165 165) !important; /* red-300 */\n}\n\ninput.border-red-300:focus {\n border-color: rgb(239 68 68) !important; /* red-500 */\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.1) !important; /* red-500 with opacity */\n}\n\n/* Disabled state overrides */\ninput:disabled {\n background-color: rgb(249 250 251) !important; /* gray-50 */\n color: rgb(107 114 128) !important; /* gray-500 */\n cursor: not-allowed !important;\n}\n\n/* Bitwarden and other password manager specific overrides */\ninput[data-bwautofill],\ninput[data-lpignore],\ninput[data-form-type],\ninput[data-1p-ignore] {\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important;\n}\n\n/* Override webkit autofill styling */\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px white inset !important;\n -webkit-text-fill-color: black !important;\n border: 1px solid rgb(209 213 219) !important;\n border-radius: 0.5rem !important;\n transition: background-color 5000s ease-in-out 0s !important;\n}\n\n/* Ensure password inputs have proper padding for our eye icon */\ninput[type=\"password\"] {\n padding-right: 2.5rem !important; /* pr-10 for our eye icon */\n}\n\n/* Hide browser password reveal buttons */\ninput::-ms-reveal,\ninput::-ms-clear {\n display: none !important;\n}\n\n/* Additional size-specific overrides to maintain consistency */\ninput.px-3.py-2 {\n padding: 0.5rem 0.75rem !important; /* sm size */\n}\n\ninput.px-3.py-2\\.5 {\n padding: 0.625rem 0.75rem !important; /* md size - default */\n}\n\ninput.px-4.py-3 {\n padding: 0.75rem 1rem !important; /* lg size */\n}\n\n/* Icon padding overrides */\ninput.pl-10 {\n padding-left: 2.5rem !important;\n}\n\ninput.pr-10 {\n padding-right: 2.5rem !important;\n}\n</style>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","<template>\n <div v-if=\"shouldShowSecuredBy\" class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\n\n// Get configuration\nconst { config } = useStrandsConfig(props.config)\n\n// Hide \"Secured by\" logo when using Strands' own domain\nconst shouldShowSecuredBy = computed(() => {\n const baseUrl = config.value.baseUrl\n return baseUrl !== 'https://accounts.strands.gg'\n})\n</script>","export default \"data:image/png;base64,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\"","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const response = await fetch(getUrl('oauthProviders'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <!-- Email -->\n <UiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\nconsole.log('support email:', getSupportEmail())\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string) {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n\n return result\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n \n return result.message\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual auth SDK call\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <!-- Success State -->\n <UiCard v-if=\"signupSuccess\" variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">📧</div>\n <h1 class=\"text-2xl font-bold text-gray-900 mb-2\">{{ successTitle }}</h1>\n <p class=\"text-gray-600 mb-4\">{{ successMessage }}</p>\n <div v-if=\"successEmail\" class=\"text-sm text-gray-500 mb-4\">\n <strong>{{ successEmail }}</strong>\n </div>\n <p class=\"text-sm text-gray-500 mb-6\">\n Click the link in your email to complete your account setup. The link will expire in 24 hours.\n </p>\n <UiButton\n variant=\"outline\"\n full-width\n @click=\"resetToForm\"\n >\n Send Another Link\n </UiButton>\n </div>\n </UiCard>\n\n <!-- Signup Form -->\n <UiCard v-else variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <UiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\nconst signupSuccess = ref(false)\nconst successMessage = ref('')\nconst successTitle = ref('Magic Link Sent!')\nconst successEmail = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n const signUpUrl = getUrl('signUp')\n console.log('Attempting sign up to URL:', signUpUrl)\n \n const response = await fetch(signUpUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email\n }),\n })\n\n console.log('Sign up response status:', response.status)\n console.log('Sign up response headers:', Object.fromEntries(response.headers.entries()))\n\n if (!response.ok) {\n let errorMessage = `Sign up failed (${response.status})`\n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch {\n const errorText = await response.text()\n errorMessage = errorText || errorMessage\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n console.log('Magic link sign up success:', result)\n \n // Handle success state internally\n signupSuccess.value = true\n successEmail.value = form.email\n successMessage.value = result.message || 'Magic link sent! Check your email.'\n \n // Set appropriate title based on message content\n if (result.message) {\n if (result.message.includes('already have an account') || result.message.includes('Welcome back')) {\n successTitle.value = 'Welcome Back!'\n } else if (result.message.includes('Magic link sent') || result.message.includes('Check your email')) {\n successTitle.value = 'Magic Link Sent!'\n } else {\n successTitle.value = 'Success!'\n }\n }\n \n // Still emit for any parent that might need it\n emit('success', {\n email: form.email,\n message: result.message || 'Magic link sent! Check your email.'\n })\n } catch (err) {\n console.error('Sign up error:', err)\n \n let errorMessage = 'Unable to send magic link. Please try again.'\n \n if (err instanceof Error) {\n if (err.message.includes('fetch')) {\n errorMessage = 'Unable to connect to authentication service. Please check your internet connection and try again.'\n } else if (err.message.includes('CORS')) {\n const supportEmail = getSupportEmail()\n errorMessage = supportEmail \n ? `Authentication service configuration error. Please contact ${supportEmail}.`\n : 'Authentication service configuration error.'\n } else {\n errorMessage = err.message\n }\n }\n \n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst resetToForm = () => {\n signupSuccess.value = false\n successMessage.value = ''\n successTitle.value = 'Magic Link Sent!'\n successEmail.value = ''\n form.email = ''\n error.value = ''\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">🎉</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome to Strands!</h1>\n <p class=\"text-neutral-600 mb-4\">\n Your account has been created successfully.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n You are now signed in and can access your dashboard.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-red-500 text-6xl mb-4\">❌</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Invalid Link</h1>\n <p class=\"text-neutral-600 mb-4\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n Please request a new magic link to complete your registration.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Complete Your Registration</h1>\n <p class=\"text-neutral-600\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"mt-2\">\n <p class=\"text-sm text-neutral-500\">Creating account for: <span class=\"font-medium text-neutral-700\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"space-y-6\">\n <!-- Username -->\n <div>\n <UiInput\n id=\"username\"\n v-model=\"form.username\"\n type=\"text\"\n label=\"Username\"\n placeholder=\"Choose a username\"\n autocomplete=\"username\"\n required\n :error=\"fieldErrors.username\"\n />\n </div>\n\n <!-- First Name -->\n <div>\n <UiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <UiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <UiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"mt-2 text-xs text-neutral-500\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"mt-6 animate-fade-in\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </UiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-yellow-500 text-6xl mb-4\">⚠️</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Missing Token</h1>\n <p class=\"text-neutral-600 mb-4\">\n No registration token was provided.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <UiButton \n variant=\"primary\" \n full-width \n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </UiButton>\n </div>\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Auth composable for token storage\nconst { setAuthData } = useStrandsAuth()\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.username.trim() && form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n// Watch for username requirements\nwatch(\n () => form.username,\n (username) => {\n if (username && username.length < 2) {\n fieldErrors.username = 'Username must be at least 2 characters long'\n } else {\n fieldErrors.username = ''\n }\n }\n)\n\n// Auth configuration\nconst authConfig = computed(() => ({\n baseUrl: props.config?.baseUrl || 'http://localhost:8000',\n referrerUrl: props.redirectUrl || 'http://localhost:3001'\n}))\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (authConfig.value.referrerUrl) {\n console.log('Redirecting to referrer:', authConfig.value.referrerUrl)\n window.location.href = authConfig.value.referrerUrl\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(`${authConfig.value.baseUrl}/api/v1/auth/complete-registration`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n username: form.username,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result: AuthResponse = await response.json()\n console.log('Registration success:', result)\n \n // Store authentication data if tokens are present\n if (result.access_token && result.refresh_token && result.user) {\n setAuthData(result)\n console.log('Auth tokens stored successfully for user:', result.user.email)\n } else {\n console.warn('Registration response missing auth tokens or user data')\n }\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-neutral-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\">\n {{ getInitials(user?.firstName, user?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"handleImageUpload\"\n >\n <svg class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200\"\n @click=\"handleImageUpload\"\n >\n Change photo\n </button>\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\n\ninterface Props {\n user?: User\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst showPasswordChange = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([\n { id: '1', device: 'Chrome on Mac', location: 'San Francisco, CA', lastActive: '2 minutes ago', current: true },\n { id: '2', device: 'Safari on iPhone', location: 'San Francisco, CA', lastActive: '1 hour ago', current: false },\n])\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst hasChanges = computed(() => {\n if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.user.phone || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Initialize form with user data\nwatch(() => props.user, (user) => {\n if (user) {\n form.firstName = user.firstName\n form.lastName = user.lastName\n form.email = user.email\n form.phone = user.phone || ''\n }\n}, { immediate: true })\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual profile update call\n // Example: await authSDK.updateProfile(form)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleImageUpload = () => {\n // Integration point: Implement image upload functionality\n // Example: Open file picker, upload to storage, update user avatar\n emit('error', 'Image upload functionality not yet implemented')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.user.phone || ''\n }\n clearMessages()\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <UiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <UiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-6\">\n <!-- QR Code Section -->\n <div class=\"text-center\">\n <div class=\"w-48 h-48 bg-gray-100 rounded-lg mx-auto mb-4 flex items-center justify-center\">\n <div class=\"text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h.01M12 12v4.01\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\">Scan this QR code with your authenticator app</p>\n </div>\n\n <!-- Setup Key -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Setup Key (manual entry)</label>\n <div class=\"p-3 bg-gray-50 rounded border text-sm font-mono break-all\">\n XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX\n </div>\n </div>\n\n <!-- Verification Code Input -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Verification Code</label>\n <input \n type=\"text\" \n placeholder=\"Enter 6-digit code\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-strands-500 focus:border-strands-500\"\n maxlength=\"6\"\n />\n <p class=\"text-xs text-gray-500 mt-1\">Enter the 6-digit code from your authenticator app</p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 pt-4\">\n <button \n type=\"button\"\n class=\"flex-1 bg-strands-500 text-white py-2 px-4 rounded-md hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-colors\"\n >\n Enable 2FA\n </button>\n <button \n type=\"button\"\n class=\"flex-1 bg-gray-200 text-gray-800 py-2 px-4 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors\"\n @click=\"$emit('back')\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'back'): void\n}\n\ndefineEmits<Emits>()\n</script>","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => h('g', [\n h('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n h('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => h('g', { fill: 'currentColor' }, [\n h('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n h('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n h('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n h('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : h('path', { d: '' })\n})\n</script>\n","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n// Phone validation (basic)\nexport const isValidPhone = (phone: string): boolean => {\n const phoneRegex = /^[\\+]?[1-9][\\d]{0,15}$/\n return phoneRegex.test(phone.replace(/[\\s\\-\\(\\)]/g, ''))\n}\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_hoisted_1","_hoisted_2","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","$setup","_createElementVNode","_hoisted_3","_hoisted_4","$props","_createCommentVNode","_renderSlot","_ctx","_createTextVNode","_hoisted_6","_cache","buttonClasses","sizeClasses","widthClasses","$event","_toDisplayString","cardClasses","paddingClasses","shadowClasses","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","event","target","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","tag","linkProps","baseProps","linkClasses","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","activeTabIndex","modelValue","toRefs","watch","_Fragment","_renderList","_normalizeStyle","config","useStrandsConfig","shouldShowSecuredBy","_imports_0","useOAuthProviders","options","getUrl","providers","loading","error","enabledProviders","provider","fetchProviders","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","getSupportEmail","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isPasswordMatch","isFormValid","PASSWORD_STRENGTH_CONFIGS","getPasswordStrength","score","handleAuth","handleOAuthAuth","newMode","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_19","_createVNode","_Transition","_hoisted_12","_withModifiers","_hoisted_17","_hoisted_18","signupSuccess","successMessage","successTitle","successEmail","signUpUrl","supportEmail","_hoisted_20","_hoisted_22","_hoisted_21","setAuthData","useStrandsAuth","registrationComplete","invalidToken","fieldErrors","hasRequiredFields","passwordMinLength","hasValidToken","username","authConfig","parts","payload","redirectToReferrer","key","errorText","showPasswordChange","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","resolve","updatedUser","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_42","_withDirectives","_vModelText","_hoisted_30","_hoisted_29","_hoisted_32","_hoisted_33","_hoisted_37","_hoisted_41","_component_UiLink","isSubmitted","_createStaticVNode","isAuthenticated","signOut","isLoading","args","provideStrandsConfig","iconClass","viewBox","icons","h","iconComponent","icon","isValidEmail","validatePassword","isValid","strength","isValidName","name","isValidPhone","phone","isRequired","passwordsMatch","confirmation","first","last","formatDate","date","debounce","func","wait","timeout"],"mappings":";;;;;;;;;;;;;;;AAwCA,UAAMA,IAAQC,GASRC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAAc,CAAC,uBAAuB,GAEtCC,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAGR,aAAO;AAAA,QACL,GAAGD;AAAA,QACHC,EAAeL,EAAM,OAAO;AAAA,MAAA,EAC5B,KAAK,GAAG;AAAA,IACZ,CAAC,GAEKM,IAAeH,EAAS,MAQrB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKO,IAAiBJ,EAAS,MAQvB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKQ,IAAiBL,EAAS,MAQvB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKS,IAAWN,EAAS,OACV;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,GAGKH,EAAM,OAAO,CAC3B;;;;;;;;GAlHQU,KAAA,EAAA,OAAM,mBAAA,GACJC,KAAA,EAAA,OAAM,gBAAA;EACJ,OAAM;AAAA,EAAU,MAAK;AAAA,EAAe,SAAQ;AAAA,EAAY,eAAY;eAKtEC,KAAA,EAAA,OAAM,cAAA;;EAOa,OAAM;;;AAflC,SAAAC,EAAA,GAAAC;AAAAA,IA0BM;AAAA,IAAA;AAAA,MA1BA,OAAKC,EAAEC,EAAA,YAAY;AAAA,MAAE,MAAK;AAAA,IAAA;AAAA;MAC9BC,EAwBM,OAxBNP,IAwBM;AAAA,QAvBJO,EAIM,OAJNN,IAIM;AAAA,WAAAE,KAHJC,EAEM,OAFNI,IAEM;AAAA,YADJD,EAA8D,QAAA;AAAA,cAAxD,aAAU;AAAA,cAAW,GAAGD,EAAA;AAAA,cAAU,aAAU;AAAA,YAAA,GAAA,MAAA,GAAAG,EAAA;AAAA;;QAItDF,EAKM,OALNL,IAKM;AAAA,UAJMQ,EAAA,SAAAP,EAAA,GAAVC;AAAAA,YAAuD;AAAA,YAAA;AAAA,cAAA,KAAA;AAAA,cAArC,OAAKC,EAAEC,EAAA,YAAY;AAAA,YAAA;AAAA,cAAKI,EAAA,KAAK;AAAA,YAAA;AAAA;AAAA,UAAA,KAAAC,EAAA,QAAA,EAAA;AAAA,UAC/CJ;AAAAA,YAEM;AAAA,YAAA;AAAA,cAFA,OAAKF,EAAEC,EAAA,cAAc;AAAA,YAAA;AAAA;cACzBM,EAA0BC,yBAA1B,MAA0B;AAAA,gBAAAC;AAAAA,oBAAjBJ,EAAA,OAAO;AAAA,kBAAA;AAAA;AAAA,gBAAA;AAAA,cAAA,CAAA;AAAA;;;;;QAITA,EAAA,eAAAP,EAAA,GAAXC,EASM,OATNW,IASM;AAAA,UARJR;AAAAA,YAOS;AAAA,YAAA;AAAA,cAPD,MAAK;AAAA,cAAU,OAAKF,EAAEC,EAAA,cAAc;AAAA,cAAG,SAAKU,uBAAEH,EAAA,MAAK,SAAA;AAAA,YAAA;AAAA;cACzDN;AAAAA,gBAAoC;AAAA,gBAAA,EAA9B,OAAM,UAAA;AAAA,gBAAU;AAAA,gBAAO;AAAA;AAAA,cAAA;AAAA,cAC7BA;AAAAA,gBAIM;AAAA,gBAAA;AAAA,kBAJD,OAAM;AAAA,kBAAU,MAAK;AAAA,kBAAe,SAAQ;AAAA,gBAAA;AAAA;kBAC/CA,EAEwB,QAAA;AAAA,oBAFlB,aAAU;AAAA,oBACd,GAAE;AAAA,oBACF,aAAU;AAAA,kBAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACQxB,UAAMjB,IAAQC,GAaR0B,IAAgBxB,EAAS,MAAM;AACnC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIwB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAvB,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,GAILwB,IAAe7B,EAAM,YAAY,WAAW;AAElD,aAAO;AAAA,QACL,GAAGI;AAAA,QACHwB,EAAY5B,EAAM,IAAI;AAAA,QACtBK,EAAeL,EAAM,OAAO;AAAA,QAC5B6B;AAAA,MAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC;;;;;EAtEwB,OAAM;;;EAQd,OAAM;;;cATrBf,EAaS,UAAA;AAAA,IAbA,MAAMM,EAAA;AAAA,IAAO,UAAUA,EAAA,YAAYA,EAAA;AAAA,IAAU,OAAKL,EAAEC,EAAA,aAAa;AAAA,IAAG,SAAKU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAAEP,EAAA,MAAK,SAAUO,CAAM;AAAA,EAAA,GAAA;AAAA,IAC3FV,EAAA,WAAAP,EAAA,GAAZC,EAOO,QAPPH,IAOO;AAAA,MAAAe,EAAA,CAAA,MAAAA,EAAA,CAAA,IANLT;AAAAA,QAIM;AAAA,QAAA;AAAA,UAJD,OAAM;AAAA,UAAuB,MAAK;AAAA,UAAO,SAAQ;AAAA,QAAA;AAAA;UACpDA,EAA2F,UAAA;AAAA,YAAnF,OAAM;AAAA,YAAa,IAAG;AAAA,YAAK,IAAG;AAAA,YAAK,GAAE;AAAA,YAAK,QAAO;AAAA,YAAe,gBAAa;AAAA,UAAA,CAAA;AAAA,UACrFA,EAC4H,QAAA;AAAA,YADtH,OAAM;AAAA,YAAa,MAAK;AAAA,YAC5B,GAAE;AAAA,UAAA,CAAA;AAAA;;;;MAENA;AAAAA,QAA8C;AAAA,QAAA;AAAA,QAAAc,EAArCX,EAAA,eAAW,YAAA;AAAA,QAAA;AAAA;AAAA,MAAA;AAAA,IAAA,CAAA,MAAAP,EAAA,GAEtBC,EAGO,QAHPI,IAGO;AAAA,MAFLI,EAAoBC,EAAA,QAAA,MAAA;AAAA,MACpBD,EAAQC,EAAA,QAAA,SAAA;AAAA,IAAA,CAAA;AAAA;;;;;;;;;;;ACad,UAAMvB,IAAQC,GAMR+B,IAAc7B,EAAS,MAAM;AACjC,YAAMC,IAAc,CAAC,iCAAiC,GAGhDC,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,MAAA,GAIL4B,IAAiB;AAAA,QACrB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAC,IAAgB;AAAA,QACpB,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAGN,aAAO;AAAA,QACL,GAAG9B;AAAA,QACHC,EAAeL,EAAM,OAAO;AAAA,QAC5BiC,EAAejC,EAAM,OAAO;AAAA,QAC5BkC,EAAclC,EAAM,MAAM;AAAA,MAAA,EAC1B,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC;;;;;EA5DgC,OAAM;GAI9BW,KAAA,EAAA,OAAM,YAAA;;EAIkB,OAAM;;;AATrC,SAAAE,EAAA,GAAAC;AAAAA,IAYM;AAAA,IAAA;AAAA,MAZA,OAAKC,EAAEC,EAAA,WAAW;AAAA,IAAA;AAAA;MACXO,EAAA,OAAM,UAAAV,EAAA,GAAjBC,EAEM,OAFNJ,IAEM;AAAA,QADJY,EAAsBC,EAAA,QAAA,QAAA;AAAA,MAAA,CAAA,KAAAF,EAAA,QAAA,EAAA;AAAA,MAGxBJ,EAEM,OAFNN,IAEM;AAAA,QADJW,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA,CAAA;AAAA,MAGCA,EAAA,OAAM,UAAAV,EAAA,GAAjBC,EAEM,OAFNI,IAEM;AAAA,QADJI,EAAsBC,EAAA,QAAA,QAAA;AAAA,MAAA,CAAA,KAAAF,EAAA,QAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;AC4C5B,UAAMrB,IAAQC,GAKRkC,IAAOC,GAMPC,IAAQC,GAAA,GACRC,IAAeC,EAAI,EAAK,GACxBC,IAAUD,EAAI,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,GAEhEE,IAAevC,EAAS,MACxBH,EAAM,SAAS,aACVuC,EAAa,QAAQ,SAAS,aAEhCvC,EAAM,IACd,GAEK2C,IAAexC,EAAS,MAAM;AAClC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIwB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAgB,IAAe5C,EAAM,QACvB,2EACA,IAGE6C,IAAcR,EAAM,OAAU,UAAU,IACxCS,IAAkB9C,EAAM,SAAS,aAAa,UAAU;AAE9D,aAAO;AAAA,QACL,GAAGI;AAAA,QACHwB,EAAY5B,EAAM,IAAI;AAAA,QACtB4C;AAAA,QACAC;AAAA,QACAC;AAAA,MAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC,kHAEmB,CAACC,MAAiB;AACpC,YAAMC,IAASD,EAAM;AACrB,MAAAZ,EAAK,qBAAqBa,EAAO,KAAK;AAAA,IACxC,6BAEiC,MAAM;AACrC,MAAAT,EAAa,QAAQ,CAACA,EAAa;AAAA,IACrC;;;IAjHO7B,KAAA,EAAA,OAAM,YAAA;;EAGe,OAAM;GAGzBS,KAAA,EAAA,OAAM,WAAA;;EASkB,OAAM;AAAA,EAAU,MAAK;AAAA,EAAO,QAAO;AAAA,EAAe,SAAQ;;;EAIvE,OAAM;AAAA,EAAU,MAAK;AAAA,EAAO,QAAO;AAAA,EAAe,SAAQ;;;EAQ7C,OAAM;;;EAMnB,OAAM;;;EACE,OAAM;;;AAlChC,SAAAN,EAAA,GAAAC,EAmCM,OAnCNJ,IAmCM;AAAA,IAlCSU,gBAAbN,EAGQ,SAAA;AAAA,MAAA,KAAA;AAAA,MAHa,KAAKE,EAAA;AAAA,MAAS,OAAM;AAAA,IAAA,GAAA;AAAA;QACpCe,EAAAX,EAAA,KAAK,IAAG;AAAA,QACX;AAAA;AAAA,MAAA;AAAA,MAAYA,EAAA,YAAAP,EAAA,GAAZC,EAAmD,QAAnDI,IAA2C,GAAC,KAAAG,EAAA,QAAA,EAAA;AAAA;IAG9CJ,EAwBM,OAxBNE,IAwBM;AAAA,MAvBJF,EAEkE,SAAA;AAAA,QAF1D,IAAID,EAAA;AAAA,QAAU,MAAMA,EAAA;AAAA,QAAe,OAAOI,EAAA;AAAA,QAAa,aAAaA,EAAA;AAAA,QAAc,UAAUA,EAAA;AAAA,QACjG,UAAUA,EAAA;AAAA,QAAW,cAAcA,EAAA;AAAA,QAAe,OAAKL,EAAEC,EAAA,YAAY;AAAA,QAAG,SAAOA,EAAA;AAAA,QAC/E,QAAIU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAAEP,EAAA,MAAK,QAASO,CAAM;AAAA,QAAI,SAAKJ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAAEP,EAAA,MAAK,SAAUO,CAAM;AAAA,MAAA,GAAA,MAAA,IAAAlB,EAAA;AAAA,MAE7DS,EAAA,8BAAA;AAAA,MACcD,EAAA,SAAI,mBAAlBN,EAYS,UAAA;AAAA,QAAA,KAAA;AAAA,QAZ0B,MAAK;AAAA,QACtC,OAAM;AAAA,QACL,SAAOE,EAAA;AAAA,MAAA,GAAA;AAAA,QACGA,EAAA,gBAAAH,EAAA,GAAXC,EAGM,OAHNW,IAGMC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,UAFJT;AAAAA,YAC4L;AAAA,YAAA;AAAA,cADtL,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAChE,GAAE;AAAA,YAAA;AAAA;;;;QAEN,EAAA,MAAAJ,KAAAC,EAIM,OAJNmC,IAIMvB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,UAHJT;AAAAA,YAA6G;AAAA,YAAA;AAAA,cAAvG,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;AAAA;;;;UACxEA;AAAAA,YACgI;AAAA,YAAA;AAAA,cAD1H,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAChE,GAAE;AAAA,YAAA;AAAA;;;;;;MAIRI,EAAA,aAAA;AAAA,MACWE,EAAA,OAAM,QAAAV,EAAA,GAAjBC,EAEM,OAFNoC,IAEM;AAAA,QADJ5B,EAAoBC,EAAA,QAAA,QAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA,CAAA,KAAAF,EAAA,QAAA,EAAA;AAAA;IAIxBA,EAAA,8BAAA;AAAA,IACSD,EAAA,SAAAP,EAAA,GAATC;AAAAA,MAA4D;AAAA,MAA5DqC;AAAAA,MAA4DpB,EAAZX,EAAA,KAAK;AAAA,MAAA;AAAA;AAAA,IAAA,KACvCA,EAAA,YAAAP,EAAA,GAAdC;AAAAA,MAAwE;AAAA,MAAxEsC;AAAAA,MAAwErB,EAAfX,EAAA,QAAQ;AAAA,MAAA;AAAA;AAAA,IAAA,KAAAC,EAAA,QAAA,EAAA;AAAA;;;;;;;;;;;;;;;ACjBrE,UAAMrB,IAAQC,GAORkC,IAAOC,GAIPiB,IAAMlD,EAAS,MACfH,EAAM,KAAW,gBACjBA,EAAM,OAAa,MAChB,QACR,GAEKsD,IAAYnD,EAAS,MAAM;AAC/B,YAAMoD,IAAiC,CAAA;AAEvC,aAAIvD,EAAM,KACRuD,EAAU,KAAQvD,EAAM,KACfA,EAAM,QACfuD,EAAU,OAAUvD,EAAM,MACtBA,EAAM,aACRuD,EAAU,SAAY,UACtBA,EAAU,MAAS,0BAGrBA,EAAU,OAAU,UAGlBvD,EAAM,aACRuD,EAAU,WAAc,IACxBA,EAAU,eAAe,IAAI,KAGxBA;AAAA,IACT,CAAC,GAEKC,IAAcrD,EAAS,MAAM;AACjC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIwB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAvB,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAGb,aAAO;AAAA,QACL,GAAGD;AAAA,QACHwB,EAAY5B,EAAM,IAAI;AAAA,QACtBK,EAAeL,EAAM,OAAO;AAAA,MAAA,EAC5B,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC,+EAEmB,CAAC+C,MAAsB;AACzC,MAAK/C,EAAM,YACTmC,EAAK,SAASY,CAAK;AAAA,IAEvB;;;;;cAxFEU,EAEYC,GAFI1C,EAAA,GAAG,GAAnB2C,GAEY,EAFU,OAAO3C,EAAA,YAAA,GAAqBA,EAAA,WAAS,EAAG,SAAOA,EAAA,YAAA,CAAW,GAAA;AAAA,IAAA,SAAA4C,EAC9E,MAAQ;AAAA,MAARtC,EAAQC,EAAA,QAAA,SAAA;AAAA,IAAA,CAAA;AAAA;;;;;;;;;;;;;ACuCZ,UAAMvB,IAAQC,GACRkC,IAAOC,GAEPyB,IAAarB,EAAmB,EAAE,GAClCsB,IAAiBtB,EAAI;AAAA,MACzB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA,CACV;AAED,QAAIuB,IAAkB,IAClBC,IAAc;AAElB,UAAMC,IAAiB,OAAOC,GAAeC,MAAkB;AAC7D,MAAIH,MAEJ7B,EAAK,qBAAqB+B,CAAK,GAC/B,MAAME,GAAA,GACNC,EAAwBF,CAAK;AAAA,IAC/B,GAEME,IAA0B,OAAOC,MAAqB;AAC1D,UAAI,CAACT,EAAW,MAAMS,CAAQ,KAAKA,MAAaP,EAAiB;AAEjE,MAAAC,IAAc;AACd,YAAMO,IAASV,EAAW,MAAMS,CAAQ,GAClCE,IAAYD,EAAO;AAEzB,UAAI,CAACC,EAAW;AAEhB,YAAMC,IAAUF,EAAO,sBAAA,GACjBG,IAAgBF,EAAU,sBAAA,GAC1BG,IAAUF,EAAQ,OAAOC,EAAc,MACvCE,IAAWH,EAAQ;AAEzB,UAAIV,MAAoB,IAAI;AAE1B,QAAAD,EAAe,QAAQ;AAAA,UACrB,OAAO,GAAGc,CAAQ;AAAA,UAClB,MAAM,GAAGD,CAAO;AAAA,UAChB,SAAS;AAAA,QAAA,GAEXZ,IAAkBO,GAClBN,IAAc;AACd;AAAA,MACF;AAGA,YAAMa,IADahB,EAAW,MAAME,CAAe,EACpB,sBAAA,GACzBe,IAAcD,EAAY,OAAOH,EAAc,MAC/CK,IAAeF,EAAY,OAG3BG,IAAgBV,IAAWP,GAC3BkB,IAAcD,IAAgBF,IAAcH,GAC5CO,IAAeF,IAChBL,IAAUC,IAAYE,IACtBA,IAAcC,IAAgBJ;AAGnC,MAAAb,EAAe,QAAQ;AAAA,QACrB,OAAO,GAAGoB,CAAY;AAAA,QACtB,MAAM,GAAGD,CAAW;AAAA,QACpB,SAAS;AAAA,MAAA,GAIX,WAAW,MAAM;AACf,QAAAnB,EAAe,QAAQ;AAAA,UACrB,OAAO,GAAGc,CAAQ;AAAA,UAClB,MAAM,GAAGD,CAAO;AAAA,UAChB,SAAS;AAAA,QAAA,GAEXZ,IAAkBO,GAClB,WAAW,MAAM;AACf,UAAAN,IAAc;AAAA,QAChB,GAAG,GAAG;AAAA,MACR,GAAG,GAAG;AAAA,IACR;AAGA,IAAAmB,GAAU,YAAY;AACpB,YAAMf,GAAA;AACN,YAAMgB,IAAcpF,EAAM,KAAK,UAAU,OAAOqF,EAAI,UAAUrF,EAAM,UAAU;AAC9E,MAAIoF,MAAgB,MAClBf,EAAwBe,CAAW;AAAA,IAEvC,CAAC;AAGD,UAAME,IAAiBnF;AAAA,MAAS,MAC9BH,EAAM,KAAK,UAAU,OAAOqF,EAAI,UAAUrF,EAAM,UAAU;AAAA,IAAA,GAItD,EAAE,YAAAuF,EAAA,IAAeC,GAAOxF,CAAK;AACnC,IAAAyF,GAAMF,GAAY,YAAY;AAC5B,YAAMnB,GAAA;AACN,YAAMgB,IAAcpF,EAAM,KAAK,UAAU,OAAOqF,EAAI,UAAUrF,EAAM,UAAU;AAC9E,MAAIoF,MAAgB,MAClBf,EAAwBe,CAAW;AAAA,IAEvC,CAAC;;;;;;;;;;;;IA9IM1E,KAAA,EAAA,OAAM,WAAA;EAEJ,OAAM;AAAA,EAA4C,MAAK;;;AAF9D,SAAAG,EAAA,GAAAC,EAoBM,OApBNJ,IAoBM;AAAA,IAnBJW,EAAA,YAAA;AAAA,IACAJ,EAiBM,OAjBNN,IAiBM;AAAA,OAAAE,EAAA,EAAA,GAhBJC;AAAAA,QAUS4E;AAAAA,QAAA;AAAA,QAAAC,GAVsBvE,EAAA,MAAI,CAAnBiE,GAAKlB,YAArBrD,EAUS,UAAA;AAAA,UAV6B,KAAKuE,EAAI;AAAA,UAAA,SAAA;AAAA,UAAO,KAAI;AAAA,UAAc,OAAKtE,EAAA;AAAA,YAAA;AAAA;;YAA4RC,EAAA,eAAeqE,EAAI,QAAA,qBAAA;AAAA;UAOxX,iBAAerE,iBAAeqE,EAAI;AAAA,UAAQ,iBAAa,YAAcA,EAAI,KAAK;AAAA,UAAK,IAAE,OAASA,EAAI,KAAK;AAAA,UACzG,MAAK;AAAA,UAAO,SAAK,CAAAvD,MAAEd,EAAA,eAAeqE,EAAI,OAAOlB,CAAK;AAAA,QAAA,GAAApC,EAC/CsD,EAAI,KAAK,GAAA,IAAAnE,EAAA,EAAA;AAAA;;;MAGdG,EAAA,iCAAA;AAAA,MACAJ;AAAAA,QAE4B;AAAA,QAAA;AAAA,UAD1B,OAAM;AAAA,UACL,OAAK2E,GAAE5E,EAAA,cAAc;AAAA,QAAA;AAAA;;;;;;;;;;;;;;ACL9B,UAAMhB,IAAQC,GAGR,EAAE,QAAA4F,EAAA,IAAWC,EAAiB9F,EAAM,MAAM,GAG1C+F,IAAsB5F,EAAS,MACnB0F,EAAO,MAAM,YACV,6BACpB;;;ICvBDG,KAAe;;EDCmB,OAAM;;;SAA3BhF,EAAA,uBAAAH,EAAA,GAAXC,EAEM,OAFNJ,IAEMgB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,IADJT;AAAAA,MAAyE;AAAA,MAAA;AAAA,QAApE,KAAA+E;AAAA,QAA8C,OAAM;AAAA,MAAA;AAAA;;;;;;;AEwCtD,SAASC,GAAkBC,IAAoC,IAAI;AACxE,QAAM,EAAE,QAAAC,EAAA,IAAWL,EAAA,GAEbM,IAAY5D,EAAqB,EAAE,GACnC6D,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAmB,IAAI,GAE/B+D,IAAmBpG;AAAA,IAAS,MAChCiG,EAAU,MAAM,OAAO,CAAAI,MAAYA,EAAS,OAAO;AAAA,EAAA,GAG/CC,IAAiB,YAAY;AACjC,IAAAJ,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AAEd,QAAI;AACF,YAAMI,IAAW,MAAM,MAAMP,EAAO,gBAAgB,GAAG;AAAA,QACrD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,MAClB,CACD;AAED,UAAI,CAACO,EAAS,IAAI;AAChB,cAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,cAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,MAC/F;AAEA,YAAME,IAAiC,MAAMF,EAAS,KAAA;AAEtD,UAAI,CAACE,EAAO;AACV,cAAM,IAAI,MAAMA,EAAO,OAAO,WAAW,iCAAiC;AAG5E,MAAAR,EAAU,QAAQQ,EAAO,QAAQ,CAAA;AAAA,IACnC,SAASC,GAAK;AACZ,YAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,MAAAP,EAAM,QAAQQ;AAAA,IAChB,UAAA;AACE,MAAAT,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,GAEMU,IAAqB,OACzBC,GACAC,MACoB;AACpB,UAAMC,IAAgB,EAAE,GAAGhB,GAAS,GAAGe,EAAA,GAGjCE,IAAS,IAAI,gBAAA;AAEnB,IAAID,EAAc,eAChBC,EAAO,OAAO,gBAAgBD,EAAc,WAAW,GAGrDA,EAAc,UAAUA,EAAc,OAAO,SAAS,KACxDC,EAAO,OAAO,UAAUD,EAAc,OAAO,KAAK,GAAG,CAAC;AAGxD,UAAME,IAAcD,EAAO,SAAA,GACrBE,IAAclB,EAAO,eAAe,EAAE,QAAQ,iBAAiBa,CAAU,GACzEM,IAAUF,IAAc,GAAGC,CAAW,IAAID,CAAW,KAAKC;AAEhE,QAAI;AACF,YAAMX,IAAW,MAAM,MAAMY,GAAS;AAAA,QACpC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,MAClB,CACD;AAED,UAAI,CAACZ,EAAS,IAAI;AAChB,cAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,cAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,MAC/F;AAEA,YAAME,IAAuC,MAAMF,EAAS,KAAA;AAE5D,UAAI,CAACE,EAAO;AACV,cAAM,IAAI,MAAMA,EAAO,OAAO,WAAW,8BAA8B;AAGzE,aAAOA,EAAO,KAAK;AAAA,IACrB,SAASC,GAAK;AACZ,YAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,YAAM,IAAI,MAAMC,CAAY;AAAA,IAC9B;AAAA,EACF,GAEMS,IAAqB,OACzBP,GACAC,MACG;AACH,QAAI;AACF,YAAMO,IAAU,MAAMT,EAAmBC,GAAYC,CAAa;AAClE,aAAO,SAAS,OAAOO;AAAA,IACzB,SAASX,GAAK;AACZ,YAAAP,EAAM,QAAQO,aAAe,QAAQA,EAAI,UAAU,wCAC7CA;AAAA,IACR;AAAA,EACF,GAEMY,IAAkB,CAACT,MAChBZ,EAAU,MAAM,KAAK,CAAAI,MAAYA,EAAS,OAAOQ,CAAU,GAG9DU,IAAkB,CAAClB,MAAoC;AAE3D,QAAIA,EAAS;AACX,aAAOA,EAAS;AAIlB,YAAQA,EAAS,GAAG,YAAA,GAAY;AAAA,MAC9B,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AAEE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,SAAO;AAAA,IACL,WAAWrG,EAAS,MAAMiG,EAAU,KAAK;AAAA,IACzC,kBAAAG;AAAA,IACA,SAASpG,EAAS,MAAMkG,EAAQ,KAAK;AAAA,IACrC,OAAOlG,EAAS,MAAMmG,EAAM,KAAK;AAAA,IACjC,gBAAAG;AAAA,IACA,oBAAAM;AAAA,IACA,oBAAAQ;AAAA,IACA,iBAAAE;AAAA,IACA,iBAAAC;AAAA,EAAA;AAEJ;;;;;;;;;;;ACJA,UAAM1H,IAAQC,GAKRkC,IAAOC,GAGP,EAAE,QAAA+D,GAAQ,iBAAAwB,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM;AAEjE,YAAQ,IAAI,kBAAkB2H,GAAiB;AAG/C,UAAM;AAAA,MACJ,kBAAApB;AAAA,MACA,SAASqB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAApB;AAAA,MACA,oBAAAc;AAAA,MACA,iBAAAG;AAAA,IAAA,IACEzB,GAAkB;AAAA,MACpB,aAAajG,EAAM;AAAA,IAAA,CACpB;AAGD,IAAAmF,GAAU,MAAM;AACd,MAAAsB,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAGD,UAAMiB,IAAmB3H,EAAS,MAEzBoG,EAAiB,KACzB,GAGKwB,IAAU;AAAA,MACd,MAAM,OAAOC,GAAeC,GAAkB;AAC5C,cAAMvB,IAAW,MAAM,MAAMP,EAAO,QAAQ,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU,EAAE,OAAA6B,GAAO,UAAAC,GAAU;AAAA,QAAA,CACzC;AAED,YAAI,CAACvB,EAAS,IAAI;AAChB,gBAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,gBAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,QAC/F;AAIA,eAFe,MAAMA,EAAS,KAAA;AAAA,MAGhC;AAAA,MAEA,MAAM,OAAOsB,GAAeC,GAAkBC,GAAmBC,IAAkB;AACjF,cAAMzB,IAAW,MAAM,MAAMP,EAAO,QAAQ,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU,EAAE,OAAA6B,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAC,IAAU;AAAA,QAAA,CAC9D;AAED,YAAI,CAACzB,EAAS,IAAI;AAChB,gBAAMC,KAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,gBAAM,IAAI,MAAMC,GAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,QAC/F;AAIA,gBAFe,MAAMA,EAAS,KAAA,GAEhB;AAAA,MAChB;AAAA,MAEA,MAAM,qBAAqBsB,GAAe;AAGxC,cAAM,IAAI,MAAM,yFAAyF;AAAA,MAuB3G;AAAA,IAAA,GAGII,IAAc5F,EAAIxC,EAAM,IAAI,GAC5BqG,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAI,EAAE,GACd6F,IAA2B7F,EAAI,EAAK,GAEpC8F,IAAOC,EAAS;AAAA,MACpB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,iBAAiB;AAAA,IAAA,CAClB,GAEKC,IAAWrI,EAAS,MAAMiI,EAAY,UAAU,QAAQ,GACxDK,IAAkBtI,EAAS,MAAMiI,EAAY,UAAU,gBAAgB,GAEvEM,IAAkBvI,EAAS,MACxBmI,EAAK,aAAaA,EAAK,eAC/B,GAEKK,IAAcxI,EAAS,MACvBsI,EAAgB,QACXH,EAAK,MAAM,KAAA,KAAU,CAACD,EAAyB,QAGpDG,EAAS,QACJF,EAAK,MAAM,KAAA,IAGbA,EAAK,MAAM,KAAA,KAAUA,EAAK,QAClC,GAGKM,IAA4B;AAAA,MAChC,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,IACT,GAGIC,IAAsB,CAACZ,MAAqB;AAChD,UAAIa,IAAQ;AAEZ,MAAIb,EAAS,UAAU,MAAGa,KAAS,IAC/Bb,EAAS,UAAU,OAAIa,KAAS,IAChC,QAAQ,KAAKb,CAAQ,MAAGa,KAAS,IACjC,QAAQ,KAAKb,CAAQ,MAAGa,KAAS,IACjC,QAAQ,KAAKb,CAAQ,MAAGa,KAAS,IACjC,eAAe,KAAKb,CAAQ,MAAGa,KAAS;AAE5C,YAAMjD,IAASiD,KAAS,IAAIF,EAA0B,OAClDE,KAAS,IAAIF,EAA0B,SACvCA,EAA0B;AAE9B,aAAO,EAAE,OAAAE,GAAO,GAAGjD,EAAA;AAAA,IACrB,GAEMkD,IAAa,YAAY;AAC7B,MAAA1C,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AAEd,UAAI;AACF,YAAImC,EAAgB;AAElB,gBAAMV,EAAQ,qBAAqBO,EAAK,KAAK,GAC7CD,EAAyB,QAAQ,IACjClG,EAAK,uBAAuBmG,EAAK,KAAK;AAAA,iBAC7BE,EAAS,OAAO;AAEzB,gBAAM9B,IAAW,MAAMqB,EAAQ;AAAA,YAC7BO,EAAK;AAAA,YACLA,EAAK;AAAA,YACLA,EAAK;AAAA,YACLA,EAAK;AAAA,UAAA;AAEP,UAAAnG,EAAK,WAAWuE,EAAS,IAAI;AAAA,QAC/B,OAAO;AAEL,gBAAMA,IAAW,MAAMqB,EAAQ,OAAOO,EAAK,OAAOA,EAAK,QAAQ;AAC/D,UAAAnG,EAAK,WAAWuE,EAAS,IAAI;AAAA,QAC/B;AAAA,MACF,SAASG,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,QAAAP,EAAM,QAAQQ,GACd3E,EAAK,SAAS2E,CAAY;AAAA,MAC5B,UAAA;AACE,QAAAT,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,GAEM2C,IAAkB,OAAOhC,MAAuB;AACpD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAahH,EAAM;AAAA,QAAA,CACpB;AAAA,MACH,SAAS6G,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,aAAa2B,EAAS,QAAQ,YAAY,SAAS,SAASxB,CAAU;AAChI,QAAAV,EAAM,QAAQQ,GACd3E,EAAK,SAAS2E,CAAY;AAAA,MAC5B;AAAA,IACF;AAGA,IAAArB,GAAM,MAAMzF,EAAM,MAAM,CAACiJ,MAAY;AACnC,MAAAb,EAAY,QAAQa;AAAA,IACtB,CAAC,GAGDxD,GAAM2C,GAAa,CAACa,MAAY;AAC9B,MAAA3C,EAAM,QAAQ,IACd+B,EAAyB,QAAQ,IAEjCC,EAAK,YAAY,IACjBA,EAAK,WAAW,IAChBA,EAAK,QAAQ,IACbA,EAAK,WAAW,IAChBA,EAAK,kBAAkB,IACvBnG,EAAK,gBAAgB8G,CAAO;AAAA,IAC9B,CAAC;;;;;;;;;;;;;;;;IAnaMvI,KAAA,EAAA,OAAM,qDAAA,GAGFC,KAAA,EAAA,OAAM,mBAAA;EAiBoB,KAAI;AAAA,EAAO,OAAM;;EAUW,KAAI;AAAA,EAAQ,OAAM;GAUlEC,KAAA,EAAA,OAAM,2CAAA;;EAEoB,OAAM;;;EAcO,OAAM;AAAA,EAAuB,SAAQ;GAKnEuC,KAAA,EAAA,OAAM,uEAAA,GACVC,KAAA,EAAA,OAAM,yCAAA,GAGV8F,KAAA,EAAA,OAAM,cAAA;EASyC,KAAI;AAAA,EAAU,OAAM;GACrEC,KAAA,EAAA,OAAM,eAAA,GAMTC,KAAA,EAAA,OAAM,YAAA,GAOmCC,KAAA,EAAA,KAAI,mBAAA,GACvCC,KAAA,EAAA,OAAM,yCAAA;EAqCW,KAAI;AAAA,EAAY,OAAM;;;EAetB,OAAM;GAC/BC,KAAA,EAAA,OAAM,2BAAA;;AA9If,SAAA1I,EAAA,GAAAC,EAyJM,OAzJNJ,IAyJM;AAAA,IAxJJ8I,EAuJSxI,EAAA,QAAA,EAvJD,SAAQ,SAAA,GAAQ;AAAA,MAAA,SAAA4C,EACtB,MAAe;AAAA,QAAfvC,EAAA,UAAA;AAAA,QACAJ,EAaM,OAbNN,IAaM;AAAA,UAZJ6I,EAIaC,GAAA;AAAA,YAJD,MAAK;AAAA,YAAO,MAAK;AAAA,UAAA,GAAA;AAAA,uBAC3B,MAEK;AAAA,eAAA5I,EAAA,GAFLC;AAAAA,gBAEK;AAAA,gBAAA;AAAA,kBAFA,KAAKE,EAAA;AAAA,kBAAa,OAAM;AAAA,gBAAA;AAAA,gBACxBe,EAAAf,EAAA,kBAAe,mBAAsBA,EAAA,WAAQ,mBAAA,cAAA;AAAA,gBAAA;AAAA;AAAA,cAAA;AAAA,YAAA,CAAA;AAAA;;;UAGpDwI,EAMaC,GAAA;AAAA,YAND,MAAK;AAAA,YAAO,MAAK;AAAA,UAAA,GAAA;AAAA,uBAC3B,MAII;AAAA,eAAA5I,EAAA,GAJJC;AAAAA,gBAII;AAAA,gBAAA;AAAA,kBAJA,KAAKE,EAAA;AAAA,kBAAa,OAAM;AAAA,gBAAA;AAAA,gBACvBe,EAAAf,EAAA,kBAAe,8EAAkFA,EAAA,WAAA,+CAAA,qCAAA;AAAA;;;;;;;;QAO1GK,EAAA,8CAAA;AAAA,QACAmI,EAOaC,GAAA;AAAA,UAPD,MAAK;AAAA,UAAc,MAAK;AAAA,QAAA,GAAA;AAAA,qBAClC,MAKM;AAAA,YALMzI,EAAA,mCAAAH,EAAA,GAAZC,EAKM,OALNI,IAKM;AAAA,cAJJsI,EAGKxI,EAAA,QAAA;AAAA,gBAAA,YAHYA,EAAA;AAAA,gBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAAAd,EAAA,cAAWc;AAAA,gBAAG,MAAM;AAAA,kBAAA,EAAA,OAAA,WAAA,OAAA,SAAA;AAAA;;;;;;;;QAOzCT,EAAA,kDAAA;AAAA,QACAmI,EAyCaC,GAAA;AAAA,UAzCD,MAAK;AAAA,UAAc,MAAK;AAAA,QAAA,GAAA;AAAA,qBAClC,MAuCM;AAAA,YAAA,CAvCMzI,EAAA,mBAAmBA,EAAA,kBAAkB,UAAAH,KAAjDC,EAuCM,OAvCNK,IAuCM;AAAA,eAAAN,EAAA,EAAA,GAtCJC;AAAAA,gBAqCW4E;AAAAA,gBAAA;AAAA,gBAAAC,GApCU3E,EAAA,kBAAgB,CAA5BwF,YADT/C,EAqCWzC,EAAA,UAAA;AAAA,kBAnCR,KAAKwF,EAAS;AAAA,kBACf,SAAQ;AAAA,kBACR,cAAA;AAAA,kBACC,UAAUxF,EAAA;AAAA,kBACV,SAAK,CAAAc,MAAEd,EAAA,gBAAgBwF,EAAS,EAAE;AAAA,kBACnC,OAAM;AAAA,gBAAA,GAAA;AAAA,6BAEN,MAwBM;AAAA,oBAxBNvF,EAwBM,OAxBNL,IAwBM;AAAA,sBAvBJS,EAAA,0BAAA;AAAA,sBACWmF,EAAS,WAAA3F,EAAA,GAApBC,EAEM,OAFNW,IAEM;AAAA,wBADJR,EAAsG,OAAA;AAAA,0BAAhG,KAAKuF,EAAS;AAAA,0BAAU,KAAG,GAAKA,EAAS,eAAeA,EAAS,IAAI;AAAA,0BAAS,OAAM;AAAA,wBAAA,GAAA,MAAA,GAAAvD,EAAA;AAAA,sBAG5E,CAAA,KAAAuD,EAAS,OAAE,YAAA3F,EAAA,GAA3BC;AAAAA,wBASM4E;AAAAA,wBAAA,EAAA,KAAA,EAAA;AAAA,wBAAA;AAAA,0BAVNrE,EAAA,2CAAA;AAAA,0BAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,4BASM;AAAA,4BAAA;AAAA,8BAToC,SAAQ;AAAA,8BAAY,OAAM;AAAA,4BAAA;AAAA;8BAClEA,EACgI,QAAA;AAAA,gCAD1H,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EAC8I,QAAA;AAAA,gCADxI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EACsI,QAAA;AAAA,gCADhI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EAC4I,QAAA;AAAA,gCADtI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA;;;;;;;sBAEU,KAAAuF,EAAS,OAAE,YAAA3F,EAAA,GAA3BC,EAGM,OAHNoC,IAGM,CAAA,GAAAxB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFJT;AAAAA,0BACktB;AAAA,0BAAA,EAAhtB,GAAE,4sBAAA;AAAA,0BAA2sB;AAAA,0BAAA;AAAA;AAAA,wBAAA;AAAA,sBAAA,EAAA,CAAA,MAAAJ,EAAA,GAGjtBC;AAAAA,wBAEM4E;AAAAA,wBAAA,EAAA,KAAA,EAAA;AAAA,wBAAA;AAAA,0BAHNrE,EAAA,oCAAA;AAAA,0BACAJ,EAEM,OAFNkC,IAEM;AAAA,4BADJlC;AAAAA,8BAAiI;AAAA,8BAAjImC;AAAAA,8BAAiIrB,GAAxEyE,EAAS,eAAeA,EAAS,MAAM,OAAM,GAAI,aAAW;AAAA,8BAAA;AAAA;AAAA,4BAAA;AAAA,0BAAA,CAAA;AAAA;;;;;oBAGzHvF;AAAAA,sBAEO;AAAA,sBAFPiI;AAAAA,sBAA0B,oBACVnH,EAAGyE,EAAS,eAAeA,EAAS,KAAK,OAAM,CAAA,EAAI,YAAA,IAAgBA,EAAS,KAAK,MAAK,CAAA,CAAA;AAAA,sBAAA;AAAA;AAAA,oBAAA;AAAA,kBAAA,CAAA;AAAA;;;;;;;;;;;QAM5GnF,EAAA,0CAAA;AAAA,QACAmI,EAIaC,GAAA;AAAA,UAJD,MAAK;AAAA,UAAc,MAAK;AAAA,QAAA,GAAA;AAAA,qBAClC,MAEM;AAAA,YAAA,CAFMzI,EAAA,mBAAmBA,EAAA,kBAAkB,UAAAH,KAAjDC,EAEM,OAFN4I,IAEM;AAAA,cADJzI;AAAAA,gBAA6F;AAAA,gBAA7FkI;AAAAA,gBAA2B,QAAGpH,EAAGf,EAAA,WAAQ,mBAAA,SAAA,IAAkC;AAAA,gBAAW;AAAA;AAAA,cAAA;AAAA,YAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA;;;;QAI1FA,EAAA,aAAA;AAAA,QACAJ;AAAAA,UAmCO;AAAA,UAAA;AAAA,YAnCA,UAAM0I,GAAU3I,EAAA,YAAU,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;AAAA;YACvCC,EAqBM,OArBNmI,IAqBM;AAAA,cApBJ/H,EAAA,SAAA;AAAA,cACAmI,EACkFxI,EAAA,SAAA;AAAA,gBAAA,YADhEA,EAAA,KAAK;AAAA,gBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,QAAKc;AAAA,gBAAE,MAAK;AAAA,gBAAQ,OAAM;AAAA,gBAAgB,aAAY;AAAA,gBAAmB,UAAA;AAAA,gBAC9F,cAAa;AAAA,gBAAS,OAAOd,EAAA,SAAK,CAAKA,EAAA,KAAK,QAAK,sBAAA;AAAA,cAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA,cAEnDK,EAAA,2BAAA;AAAA,cACAmI,EAcaC,GAAA;AAAA,gBAdD,MAAK;AAAA,gBAAc,MAAK;AAAA,cAAA,GAAA;AAAA,2BAClC,MAYM;AAAA,kBAAA,CAZMzI,EAAA,mBAAe,CAAKA,EAAA,YAAAH,KAAhCC,EAYM,OAZNuI,IAYM;AAAA,oBAXJpI,EAKM,OALNqI,IAKM;AAAA,sBAAA5H,EAAA,CAAA,MAAAA,EAAA,CAAA,IAJJT;AAAAA,wBAA+D;AAAA,wBAAA,EAAzD,OAAM,oCAAA;AAAA,wBAAoC;AAAA,wBAAQ;AAAA;AAAA,sBAAA;AAAA,sBACxDuI,EAESxI,EAAA,QAAA;AAAA,wBAFD,SAAQ;AAAA,wBAAU,MAAK;AAAA,wBAAM,SAAKU,uBAAEV,EAAA,cAAW;AAAA,sBAAA,GAAA;AAAA,mCAAqB,MAE5EU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,0BAAAF;AAAAA,4BAF4E;AAAA,4BAE5E;AAAA;AAAA,0BAAA;AAAA,wBAAA,EAAA;AAAA;;;;oBAGFgI,EAGmExI,EAAA,SAAA;AAAA,sBAAA,YAHjDA,EAAA,KAAK;AAAA,sBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,WAAQc;AAAA,sBAAE,MAAK;AAAA,sBACpC,aAAY;AAAA,sBAAsB,UAAA;AAAA,sBAClC,cAAa;AAAA,sBACZ,OAAOd,EAAA,SAAK,CAAKA,EAAA,KAAK,WAAQ,yBAAA;AAAA,oBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;;;;;;YAKvCwI,EAUWxI,EAAA,UAAA;AAAA,cAVD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAUA,aAAO,CAAKA,EAAA;AAAA,cAAc,SAASA,EAAA;AAAA,cAChG,gBAAcA,EAAA,kBAAe,oBAAuBA,EAAA,WAAQ,0BAAA;AAAA,YAAA,GAAA;AAAA,yBAC7D,MAOE;AAAA,gBAAAQ;AAAAA,kBAPCO,EAAAf,EAAA,kBAA+BA,EAAA,2BAAA,eAAA,oBAAuGA,EAAA,WAAA,oBAAA,SAAA;AAAA;;;;;;;;;;;QAW7IK,EAAA,sCAAA;AAAA,QACAmI,EAIaC,GAAA;AAAA,UAJD,MAAK;AAAA,UAAS,MAAK;AAAA,QAAA,GAAA;AAAA,qBAC7B,MAEiC;AAAA,YAFlBzI,EAAA,mBAAmBA,mCAAlCyC,EAEiCzC,EAAA,SAAA;AAAA,cAF2B,KAAI;AAAA,cAAgB,SAAQ;AAAA,cACrF,SAAO,0DAA4DA,EAAA,KAAK,KAAK;AAAA,cAC9E,OAAM;AAAA,YAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA;;;;QAGVA,EAAA,yCAAA;AAAA,QACAmI,EASaC,GAAA;AAAA,UATD,MAAK;AAAA,UAAc,MAAK;AAAA,QAAA,GAAA;AAAA,qBAClC,MAOM;AAAA,YAPKzI,EAAA,mBAAAH,EAAA,GAAXC,EAOM,OAPN8I,IAOM;AAAA,cANJJ,EAKSxI,EAAA,QAAA;AAAA,gBALA,SAAKU,uBAAEV,EAAA,cAAW;AAAA,gBAAa,OAAM;AAAA,cAAA,GAAA;AAAA,2BAC5C,MAEMU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,kBAFNT;AAAAA,oBAEM;AAAA,oBAAA;AAAA,sBAFD,OAAM;AAAA,sBAAU,MAAK;AAAA,sBAAO,QAAO;AAAA,sBAAe,SAAQ;AAAA,oBAAA;AAAA;sBAC7DA,EAA4F,QAAA;AAAA,wBAAtF,kBAAe;AAAA,wBAAQ,mBAAgB;AAAA,wBAAQ,gBAAa;AAAA,wBAAI,GAAE;AAAA,sBAAA,CAAA;AAAA;;;;;oBACpE;AAAA,oBAER;AAAA;AAAA,kBAAA;AAAA,gBAAA,EAAA;AAAA;;;;;;;;QAIJI,EAAA,eAAA;AAAA,QACeL,gBAAfyC,EAC0BzC,EAAA,SAAA;AAAA,UAAA,KAAA;AAAA,UADJ,SAAQ;AAAA,UAAS,SAASA,EAAA;AAAA,UAAO,OAAM;AAAA,UAAuB,aAAA;AAAA,UACjF,WAAOU,uBAAEV,EAAA,QAAK;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,QAEjBA,EAAA,aAAA;AAAA,QACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPN+I,IAOM;AAAA,UANJ5I,EAKI,KALJsI,IAKI;AAAA,YAAA7H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,cALgC;AAAA,cAElC;AAAA;AAAA,YAAA;AAAA,YAAAgI,EAESxI,EAAA,QAAA;AAAA,cAFD,SAAQ;AAAA,cAAW,MAAI,UAAYA,EAAA,gBAAA,CAAe;AAAA,YAAA,GAAA;AAAA,yBAAM,MAEhEU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBAAAF;AAAAA,kBAFgE;AAAA,kBAEhE;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA;AAAA;;;;;QAIJH,EAAA,qBAAA;AAAA,QACAmI,EAA+CxI,EAAA,sBAAA;AAAA,UAAxB,QAAQA,EAAA,MAAM;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;;;;;;;;;AC9B3C,UAAMhB,IAAQC,GAKRkC,IAAOC,GAGP,EAAE,QAAA+D,GAAQ,iBAAAwB,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM,GAG3D;AAAA,MACJ,kBAAAuG;AAAA,MACA,SAASqB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAApB;AAAA,MACA,oBAAAc;AAAA,IAAA,IACEtB,GAAkB;AAAA,MACpB,aAAajG,EAAM;AAAA,MACnB,QAAQA,EAAM;AAAA,IAAA,CACf;AAGD,IAAAmF,GAAU,MAAM;AACd,MAAAsB,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,UAAMR,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAI,EAAE,GAEd8F,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACX,uMAEoB,YAAY;AAC/B,MAAAlC,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AAEd,UAAI;AAEF,gBAAQ,IAAI,oBAAoBgC,CAAI,GACpCnG,EAAK,WAAW,EAAE,OAAOmG,EAAK,OAAO;AAAA,MACvC,QAAc;AACZ,QAAAhC,EAAM,QAAQ,6BACdnE,EAAK,SAASmE,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAD,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,sBAE0B,OAAOW,MAAuB;AACtD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAahH,EAAM;AAAA,UACnB,QAAQA,EAAM;AAAA,QAAA,CACf;AAAA,MACH,SAAS6G,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,0BAA0BG,CAAU;AAC9F,QAAAV,EAAM,QAAQQ,GACd3E,EAAK,SAAS2E,CAAY;AAAA,MAC5B;AAAA,IACF;;;;;;;;;;;;;IAzLOpG,KAAA,EAAA,OAAM,qDAAA;;EAS8B,OAAM;GAIlCQ,KAAA,EAAA,OAAM,2CAAA;;EAEoB,OAAM;;;EAcO,OAAM;AAAA,EAAuB,SAAQ;;;EAInE,OAAM;GACVgC,KAAA,EAAA,OAAM,yCAAA,GAGVC,KAAA,EAAA,OAAM,cAAA;;EAKqB,OAAM;GAMpC+F,KAAA,EAAA,OAAM,YAAA,GAMFQ,KAAA,EAAA,OAAM,yCAAA,GAsBZP,KAAA,EAAA,OAAM,mBAAA,GACNC,KAAA,EAAA,OAAM,2BAAA;;EASmB,OAAM;GAC/BE,KAAA,EAAA,OAAM,2BAAA;;AAvFf,SAAAzI,EAAA,GAAAC,EAkGM,OAlGNJ,IAkGM;AAAA,IAjGJ8I,EAgGSxI,EAAA,QAAA,EAhGD,SAAQ,SAAA,GAAQ;AAAA,MAAA,SAAA4C,EACtB,MAAe;AAAA,QAAfvC,EAAA,UAAA;AAAA,QAAAK,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,UAGM;AAAA,UAAA,EAHD,OAAM,mBAAA;AAAA,UAAkB;AAAA,YAC3BA,EAAmE,MAAA,EAA/D,OAAM,wCAAA,GAAwC,cAAY;AAAA,YAC9DA,EAAmE,KAAA,EAAhE,OAAM,mBAAA,GAAmB,qCAAmC;AAAA,UAAA;AAAA;;;QAGjEI,EAAA,mBAAA;AAAA,QACWL,EAAA,kBAAkB,UAAAH,EAAA,GAA7BC,EA8BM,OA9BNH,IA8BM;AAAA,WAAAE,EAAA,EAAA,GA7BJC;AAAAA,YA4BW4E;AAAAA,YAAA;AAAA,YAAAC,GA5BkB3E,EAAA,kBAAgB,CAA5BwF,YAAjB/C,EA4BWzC,EAAA,UAAA;AAAA,cA5BqC,KAAKwF,EAAS;AAAA,cAAI,SAAQ;AAAA,cAAU,cAAA;AAAA,cACjF,UAAUxF,EAAA;AAAA,cACV,SAAK,CAAAc,MAAEd,EAAA,kBAAkBwF,EAAS,EAAE;AAAA,cAAG,OAAM;AAAA,YAAA,GAAA;AAAA,yBAC9C,MAuBM;AAAA,gBAvBNvF,EAuBM,OAvBNC,IAuBM;AAAA,kBAtBJG,EAAA,0BAAA;AAAA,kBACWmF,EAAS,WAAA3F,EAAA,GAApBC,EAEM,OAFNK,IAEM;AAAA,oBADJF,EAAsG,OAAA;AAAA,sBAAhG,KAAKuF,EAAS;AAAA,sBAAU,KAAG,GAAKA,EAAS,eAAeA,EAAS,IAAI;AAAA,sBAAS,OAAM;AAAA,oBAAA,GAAA,MAAA,GAAA5F,EAAA;AAAA,kBAG5E,CAAA,KAAA4F,EAAS,OAAE,YAAA3F,EAAA,GAA3BC;AAAAA,oBASM4E;AAAAA,oBAAA,EAAA,KAAA,EAAA;AAAA,oBAAA;AAAA,sBAVNrE,EAAA,2CAAA;AAAA,sBAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,wBASM;AAAA,wBAAA;AAAA,0BAToC,SAAQ;AAAA,0BAAY,OAAM;AAAA,wBAAA;AAAA;0BAClEA,EACgI,QAAA;AAAA,4BAD1H,MAAK;AAAA,4BACT,GAAE;AAAA,0BAAA,CAAA;AAAA,0BACJA,EAC8I,QAAA;AAAA,4BADxI,MAAK;AAAA,4BACT,GAAE;AAAA,0BAAA,CAAA;AAAA,0BACJA,EACsI,QAAA;AAAA,4BADhI,MAAK;AAAA,4BACT,GAAE;AAAA,0BAAA,CAAA;AAAA,0BACJA,EAC4I,QAAA;AAAA,4BADtI,MAAK;AAAA,4BACT,GAAE;AAAA,0BAAA,CAAA;AAAA;;;;;;;kBAEU,KAAAuF,EAAS,OAAE,YAAA3F,EAAA,GAA3BC,EAGM,OAHNW,IAGM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFJT;AAAAA,sBACktB;AAAA,sBAAA,EAAhtB,GAAE,4sBAAA;AAAA,sBAA2sB;AAAA,sBAAA;AAAA;AAAA,oBAAA;AAAA,kBAAA,EAAA,CAAA,MAAAJ,EAAA,GAEjtBC,EAEM,OAFNmC,IAEM;AAAA,oBADJhC;AAAAA,sBAAiI;AAAA,sBAAjIiC;AAAAA,sBAAiInB,GAAxEyE,EAAS,eAAeA,EAAS,MAAM,OAAM,GAAI,aAAW;AAAA,sBAAA;AAAA;AAAA,oBAAA;AAAA,kBAAA,CAAA;AAAA;gBAGzHvF;AAAAA,kBAA0F;AAAA,kBAA1FkC;AAAAA,kBAA0B,mBAAcpB,EAAGyE,EAAS,eAAeA,EAAS,IAAI;AAAA,kBAAA;AAAA;AAAA,gBAAA;AAAA,cAAA,CAAA;AAAA;;;;;;;QAIpFnF,EAAA,WAAA;AAAA,QACWL,EAAA,kBAAkB,UAAAH,EAAA,GAA7BC,EAEM,OAFNsC,IAEM1B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,UADJT;AAAAA,YAAuD;AAAA,YAAA,EAAjD,OAAM,eAAA;AAAA,YAAe;AAAA,YAAqB;AAAA;AAAA,UAAA;AAAA,QAAA,EAAA,KAAAI,EAAA,QAAA,EAAA;AAAA,QAGlDA,EAAA,uBAAA;AAAA,QACAJ;AAAAA,UAsBO;AAAA,UAAA;AAAA,YAtBA,UAAM0I,GAAU3I,EAAA,cAAY,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;AAAA;YACzCC,EAeM,OAfNiI,IAeM;AAAA,cAdJM,EAE6DxI,EAAA,SAAA;AAAA,gBAFpD,IAAG;AAAA,gBAAA,YAAiBA,EAAA,KAAK;AAAA,gBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,QAAKc;AAAA,gBAAE,MAAK;AAAA,gBAAQ,OAAM;AAAA,gBAC1D,aAAY;AAAA,gBAA2B,cAAa;AAAA,gBAAQ,UAAA;AAAA,gBAC3D,OAAOd,UAAK,8BAAiC;AAAA,cAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA,cAEhDC,EASM,OAAA,MAAA;AAAA,gBARJA,EAKM,OALNyI,IAKM;AAAA,kBAAAhI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAJJT;AAAAA,oBAAkE;AAAA,oBAAA,EAA5D,OAAM,uCAAA;AAAA,oBAAuC;AAAA,oBAAQ;AAAA;AAAA,kBAAA;AAAA,kBAC3DuI,EAESxI,EAAA,QAAA;AAAA,oBAFA,SAAKU,uBAAEH,EAAA,MAAK,iBAAA;AAAA,oBAAqB,OAAM;AAAA,kBAAA,GAAA;AAAA,+BAAU,MAE1DG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,sBAAAF;AAAAA,wBAF0D;AAAA,wBAE1D;AAAA;AAAA,sBAAA;AAAA,oBAAA,EAAA;AAAA;;;;gBAEFgI,EACsGxI,EAAA,SAAA;AAAA,kBAD7F,IAAG;AAAA,kBAAA,YAAoBA,EAAA,KAAK;AAAA,kBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,WAAQc;AAAA,kBAAE,MAAK;AAAA,kBAAW,aAAY;AAAA,kBACzE,cAAa;AAAA,kBAAmB,UAAA;AAAA,kBAAU,OAAOd,UAAK,8BAAiC;AAAA,gBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;;YAI7FwI,EAGWxI,EAAA,UAAA;AAAA,cAHD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAUA,EAAA,WAAO,CAAKA,EAAA,KAAK,SAAK,CAAKA,EAAA,KAAK;AAAA,cAC7F,SAASA,EAAA;AAAA,cAAU,gBAAc;AAAA,YAAA,GAAA;AAAA,yBAAiB,MAErDU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBAAAF;AAAAA,kBAFqD;AAAA,kBAErD;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA;AAAA;;;;;;;QAGFH,EAAA,eAAA;AAAA,QACeL,gBAAfyC,EAC0BzC,EAAA,SAAA;AAAA,UAAA,KAAA;AAAA,UADJ,SAAQ;AAAA,UAAS,SAASA,EAAA;AAAA,UAAO,OAAM;AAAA,UAAuB,aAAA;AAAA,UACjF,WAAOU,uBAAEV,EAAA,QAAK;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,QAEjBA,EAAA,gBAAA;AAAA,QACAJ,EAOM,OAPNkI,IAOM;AAAA,UANJlI,EAKI,KALJmI,IAKI;AAAA,YAAA1H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,cALgC;AAAA,cAElC;AAAA;AAAA,YAAA;AAAA,YAAAgI,EAESxI,EAAA,QAAA;AAAA,cAFA,SAAKU,uBAAEH,EAAA,MAAK,kBAAA;AAAA,YAAA,GAAA;AAAA,yBAAsB,MAE3CG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBAAAF;AAAAA,kBAF2C;AAAA,kBAE3C;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA;AAAA;;;;;QAIJH,EAAA,aAAA;AAAA,QACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPNuI,IAOM;AAAA,UANJpI,EAKI,KALJqI,IAKI;AAAA,YAAA5H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,cALgC;AAAA,cAElC;AAAA;AAAA,YAAA;AAAA,YAAAgI,EAESxI,EAAA,QAAA;AAAA,cAFD,SAAQ;AAAA,cAAW,MAAI,UAAYA,EAAA,gBAAA,CAAe;AAAA,YAAA,GAAA;AAAA,yBAAM,MAEhEU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBAAAF;AAAAA,kBAFgE;AAAA,kBAEhE;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA;AAAA;;;;;QAIJH,EAAA,qBAAA;AAAA,QACAmI,EAA+CxI,EAAA,sBAAA;AAAA,UAAxB,QAAQA,EAAA,MAAM;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;;;;;;;;;ACoE3C,UAAMhB,IAAQC,GAKRkC,IAAOC,GAGP,EAAE,QAAA+D,GAAQ,iBAAAwB,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM,GAG3D;AAAA,MACJ,kBAAAuG;AAAA,MACA,SAASqB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAApB;AAAA,MACA,oBAAAc;AAAA,IAAA,IACEtB,GAAkB;AAAA,MACpB,aAAajG,EAAM;AAAA,MACnB,QAAQA,EAAM;AAAA,IAAA,CACf;AAGD,IAAAmF,GAAU,MAAM;AACd,MAAAsB,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,UAAMR,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAI,EAAE,GACdsH,IAAgBtH,EAAI,EAAK,GACzBuH,IAAiBvH,EAAI,EAAE,GACvBwH,IAAexH,EAAI,kBAAkB,GACrCyH,IAAezH,EAAI,EAAE,GAErB8F,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR,GAEKI,IAAcxI,EAAS,MACpBmI,EAAK,MAAM,KAAA,KAAUA,EAAK,MAAM,SAAS,GAAG,CACpD,8RAEoB,YAAY;AAC/B,MAAAjC,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AAEd,UAAI;AACF,cAAM4D,IAAY/D,EAAO,QAAQ;AACjC,gBAAQ,IAAI,8BAA8B+D,CAAS;AAEnD,cAAMxD,IAAW,MAAM,MAAMwD,GAAW;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO5B,EAAK;AAAA,UAAA,CACb;AAAA,QAAA,CACF;AAKD,YAHA,QAAQ,IAAI,4BAA4B5B,EAAS,MAAM,GACvD,QAAQ,IAAI,6BAA6B,OAAO,YAAYA,EAAS,QAAQ,QAAA,CAAS,CAAC,GAEnF,CAACA,EAAS,IAAI;AAChB,cAAII,IAAe,mBAAmBJ,EAAS,MAAM;AACrD,cAAI;AACF,kBAAMC,KAAY,MAAMD,EAAS,KAAA;AACjC,YAAAI,IAAeH,GAAU,WAAWA,GAAU,SAASG;AAAA,UACzD,QAAQ;AAEN,YAAAA,IADkB,MAAMJ,EAAS,KAAA,KACLI;AAAA,UAC9B;AACA,gBAAM,IAAI,MAAMA,CAAY;AAAA,QAC9B;AAEA,cAAMF,IAAS,MAAMF,EAAS,KAAA;AAC9B,gBAAQ,IAAI,+BAA+BE,CAAM,GAGjDkD,EAAc,QAAQ,IACtBG,EAAa,QAAQ3B,EAAK,OAC1ByB,EAAe,QAAQnD,EAAO,WAAW,sCAGrCA,EAAO,YACLA,EAAO,QAAQ,SAAS,yBAAyB,KAAKA,EAAO,QAAQ,SAAS,cAAc,IAC9FoD,EAAa,QAAQ,kBACZpD,EAAO,QAAQ,SAAS,iBAAiB,KAAKA,EAAO,QAAQ,SAAS,kBAAkB,IACjGoD,EAAa,QAAQ,qBAErBA,EAAa,QAAQ,aAKzB7H,EAAK,WAAW;AAAA,UACd,OAAOmG,EAAK;AAAA,UACZ,SAAS1B,EAAO,WAAW;AAAA,QAAA,CAC5B;AAAA,MACH,SAASC,GAAK;AACZ,gBAAQ,MAAM,kBAAkBA,CAAG;AAEnC,YAAIC,IAAe;AAEnB,YAAID,aAAe;AACjB,cAAIA,EAAI,QAAQ,SAAS,OAAO;AAC9B,YAAAC,IAAe;AAAA,mBACND,EAAI,QAAQ,SAAS,MAAM,GAAG;AACvC,kBAAMsD,IAAexC,EAAA;AACrB,YAAAb,IAAeqD,IACX,8DAA8DA,CAAY,MAC1E;AAAA,UACN;AACE,YAAArD,IAAeD,EAAI;AAIvB,QAAAP,EAAM,QAAQQ,GACd3E,EAAK,SAAS2E,CAAY;AAAA,MAC5B,UAAA;AACE,QAAAT,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,gBAEoB,MAAM;AACxB,MAAAyD,EAAc,QAAQ,IACtBC,EAAe,QAAQ,IACvBC,EAAa,QAAQ,oBACrBC,EAAa,QAAQ,IACrB3B,EAAK,QAAQ,IACbhC,EAAM,QAAQ;AAAA,IAChB,sBAE0B,OAAOU,MAAuB;AACtD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAahH,EAAM;AAAA,UACnB,QAAQA,EAAM;AAAA,QAAA,CACf;AAAA,MACH,SAAS6G,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,0BAA0BG,CAAU;AAC9F,QAAAV,EAAM,QAAQQ,GACd3E,EAAK,SAAS2E,CAAY;AAAA,MAC5B;AAAA,IACF;;;;;;;;;;;IAtTOpG,KAAA,EAAA,OAAM,qDAAA,GAGFC,KAAA,EAAA,OAAM,cAAA,GAELO,KAAA,EAAA,OAAM,wCAAA,GACPC,KAAA,EAAA,OAAM,qBAAA;;EACgB,OAAM;;;EAyBI,OAAM;GAUlC8B,KAAA,EAAA,OAAM,2CAAA;;EAEoB,OAAM;;;EAcO,OAAM;AAAA,EAAuB,SAAQ;;;EAInE,OAAM;GACVyG,KAAA,EAAA,OAAM,yCAAA,GAGVP,KAAA,EAAA,OAAM,cAAA;;EAKqB,OAAM;;;EAiCzB,OAAM;GACjBG,KAAA,EAAA,OAAM,cAAA,GACJM,KAAA,EAAA,OAAM,yBAAA,GAMNC,KAAA,EAAA,OAAM,cAAA,GAMVN,KAAA,EAAA,OAAM,mBAAA,GACNa,KAAA,EAAA,OAAM,2BAAA;;EAWmB,OAAM;GAC/BC,KAAA,EAAA,OAAM,2BAAA;;AAnIf,SAAAxJ,EAAA,GAAAC,EA8IM,OA9INJ,IA8IM;AAAA,IA7IJW,EAAA,iBAAA;AAAA,IACcL,wBAAdyC,EAmBSzC,EAAA,QAAA;AAAA,MAAA,KAAA;AAAA,MAnBoB,SAAQ;AAAA,IAAA,GAAA;AAAA,iBACnC,MAiBM;AAAA,QAjBNC,EAiBM,OAjBNN,IAiBM;AAAA,UAAAe,EAAA,CAAA,MAAAA,EAAA,CAAA,IAhBJT;AAAAA,YAAkD;AAAA,YAAA,EAA7C,OAAM,+BAAA;AAAA,YAA+B;AAAA,YAAE;AAAA;AAAA,UAAA;AAAA,UAC5CA;AAAAA,YAAyE;AAAA,YAAzEC;AAAAA,YAAyEa,EAApBf,EAAA,YAAY;AAAA,YAAA;AAAA;AAAA,UAAA;AAAA,UACjEC;AAAAA,YAAsD;AAAA,YAAtDE;AAAAA,YAAsDY,EAArBf,EAAA,cAAc;AAAA,YAAA;AAAA;AAAA,UAAA;AAAA,UACpCA,EAAA,gBAAAH,EAAA,GAAXC,EAEM,OAFNF,IAEM;AAAA,YADJK;AAAAA,cAAmC;AAAA,cAAA;AAAA,cAAAc,EAAxBf,EAAA,YAAY;AAAA,cAAA;AAAA;AAAA,YAAA;AAAA,UAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,UAEzBK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAT;AAAAA,YAEI;AAAA,YAAA,EAFD,OAAM,6BAAA;AAAA,YAA6B;AAAA,YAEtC;AAAA;AAAA,UAAA;AAAA,UACAuI,EAMWxI,EAAA,UAAA;AAAA,YALT,SAAQ;AAAA,YACR,cAAA;AAAA,YACC,SAAOA,EAAA;AAAA,UAAA,GAAA;AAAA,uBACT,MAEDU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAAF;AAAAA,gBAFC;AAAA,gBAED;AAAA;AAAA,cAAA;AAAA,YAAA,EAAA;AAAA;;;;;;;IAKJ,CAAA,MAAAX,EAAA,GAAAC;AAAAA,MAqHS4E;AAAAA,MAAA,EAAA,KAAA,EAAA;AAAA,MAAA;AAAA,QAtHTrE,EAAA,eAAA;AAAA,QACAmI,EAqHSxI,EAAA,QAAA,EArHM,SAAQ,SAAA,GAAQ;AAAA,UAAA,SAAA4C,EAC7B,MAAe;AAAA,YAAfvC,EAAA,UAAA;AAAA,YAAAK,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,cAGM;AAAA,cAAA,EAHD,OAAM,mBAAA;AAAA,cAAkB;AAAA,gBAC3BA,EAAqE,MAAA,EAAjE,OAAM,wCAAA,GAAwC,gBAAc;AAAA,gBAChEA,EAA0E,KAAA,EAAvE,OAAM,mBAAA,GAAmB,4CAA0C;AAAA,cAAA;AAAA;;;YAGxEI,EAAA,mBAAA;AAAA,YACWL,EAAA,kBAAkB,UAAAH,EAAA,GAA7BC,EAoCM,OApCNW,IAoCM;AAAA,eAAAZ,EAAA,EAAA,GAnCJC;AAAAA,gBAkCW4E;AAAAA,gBAAA;AAAA,gBAAAC,GAjCU3E,EAAA,kBAAgB,CAA5BwF,YADT/C,EAkCWzC,EAAA,UAAA;AAAA,kBAhCR,KAAKwF,EAAS;AAAA,kBACf,SAAQ;AAAA,kBACR,cAAA;AAAA,kBACC,UAAUxF,EAAA;AAAA,kBACV,SAAK,CAAAc,MAAEd,EAAA,kBAAkBwF,EAAS,EAAE;AAAA,kBACrC,OAAM;AAAA,gBAAA,GAAA;AAAA,6BAEN,MAuBM;AAAA,oBAvBNvF,EAuBM,OAvBNgC,IAuBM;AAAA,sBAtBJ5B,EAAA,0BAAA;AAAA,sBACWmF,EAAS,WAAA3F,EAAA,GAApBC,EAEM,OAFNoC,IAEM;AAAA,wBADJjC,EAAsG,OAAA;AAAA,0BAAhG,KAAKuF,EAAS;AAAA,0BAAU,KAAG,GAAKA,EAAS,eAAeA,EAAS,IAAI;AAAA,0BAAS,OAAM;AAAA,wBAAA,GAAA,MAAA,GAAArD,EAAA;AAAA,sBAG5E,CAAA,KAAAqD,EAAS,OAAE,YAAA3F,EAAA,GAA3BC;AAAAA,wBASM4E;AAAAA,wBAAA,EAAA,KAAA,EAAA;AAAA,wBAAA;AAAA,0BAVNrE,EAAA,2CAAA;AAAA,0BAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,4BASM;AAAA,4BAAA;AAAA,8BAToC,SAAQ;AAAA,8BAAY,OAAM;AAAA,4BAAA;AAAA;8BAClEA,EACgI,QAAA;AAAA,gCAD1H,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EAC8I,QAAA;AAAA,gCADxI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EACsI,QAAA;AAAA,gCADhI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA,8BACJA,EAC4I,QAAA;AAAA,gCADtI,MAAK;AAAA,gCACT,GAAE;AAAA,8BAAA,CAAA;AAAA;;;;;;;sBAEU,KAAAuF,EAAS,OAAE,YAAA3F,EAAA,GAA3BC,EAGM,OAHNsC,IAGM,CAAA,GAAA1B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFJT;AAAAA,0BACktB;AAAA,0BAAA,EAAhtB,GAAE,4sBAAA;AAAA,0BAA2sB;AAAA,0BAAA;AAAA;AAAA,wBAAA;AAAA,sBAAA,EAAA,CAAA,MAAAJ,EAAA,GAEjtBC,EAEM,OAFNoI,IAEM;AAAA,wBADJjI;AAAAA,0BAAiI;AAAA,0BAAjIyI;AAAAA,0BAAiI3H,GAAxEyE,EAAS,eAAeA,EAAS,MAAM,OAAM,GAAI,aAAW;AAAA,0BAAA;AAAA;AAAA,wBAAA;AAAA,sBAAA,CAAA;AAAA;oBAGzHvF;AAAAA,sBAA0F;AAAA,sBAA1FkI;AAAAA,sBAA0B,mBAAcpH,EAAGyE,EAAS,eAAeA,EAAS,IAAI;AAAA,sBAAA;AAAA;AAAA,oBAAA;AAAA,kBAAA,CAAA;AAAA;;;;;;;YAIpFnF,EAAA,WAAA;AAAA,YACWL,EAAA,kBAAkB,UAAAH,EAAA,GAA7BC,EAEM,OAFNsI,IAEM1H,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cADJT;AAAAA,gBAA8D;AAAA,gBAAA,EAAxD,OAAM,eAAA;AAAA,gBAAe;AAAA,gBAA4B;AAAA;AAAA,cAAA;AAAA,YAAA,EAAA,KAAAI,EAAA,QAAA,EAAA;AAAA,YAGzDA,EAAA,gBAAA;AAAA,YACAJ;AAAAA,cAyBO;AAAA,cAAA;AAAA,gBAzBA,UAAM0I,GAAU3I,EAAA,cAAY,CAAA,SAAA,CAAA;AAAA,gBAAE,OAAM;AAAA,cAAA;AAAA;gBACzCK,EAAA,SAAA;AAAA,gBACAJ,EAWM,OAAA,MAAA;AAAA,kBAVJuI,EASExI,EAAA,SAAA;AAAA,oBARA,IAAG;AAAA,oBAAA,YACMA,EAAA,KAAK;AAAA,oBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,QAAKc;AAAA,oBACnB,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,aAAY;AAAA,oBACZ,cAAa;AAAA,oBACb,UAAA;AAAA,oBACC,OAAOd,EAAA;AAAA,kBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;gBAIZwI,EASWxI,EAAA,UAAA;AAAA,kBART,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,cAAA;AAAA,kBACC,UAAUA,EAAA;AAAA,kBACV,SAASA,EAAA;AAAA,kBACV,gBAAa;AAAA,gBAAA,GAAA;AAAA,6BACd,MAEDU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAAAF;AAAAA,sBAFC;AAAA,sBAED;AAAA;AAAA,oBAAA;AAAA,kBAAA,EAAA;AAAA;;;;;;;YAGFH,EAAA,eAAA;AAAA,YACWL,EAAA,SAAAH,EAAA,GAAXC,EAWM,OAXNuI,IAWM;AAAA,cAVJpI,EASM,OATNqI,IASM;AAAA,gBARJrI,EAOM,OAPN2I,IAOM;AAAA,kBAAAlI,EAAA,CAAA,MAAAA,EAAA,CAAA,IANJT;AAAAA,oBAIM;AAAA,oBAAA;AAAA,sBAJD,OAAM;AAAA,sBAA+B,MAAK;AAAA,sBAAe,SAAQ;AAAA,oBAAA;AAAA;sBACpEA,EAEwB,QAAA;AAAA,wBAFlB,aAAU;AAAA,wBACd,GAAE;AAAA,wBACF,aAAU;AAAA,sBAAA,CAAA;AAAA;;;;kBAEdA;AAAAA,oBAAsC;AAAA,oBAAtC4I;AAAAA,oBAAsC9H,EAAZf,EAAA,KAAK;AAAA,oBAAA;AAAA;AAAA,kBAAA;AAAA,gBAAA,CAAA;AAAA;;YAKrCK,EAAA,gBAAA;AAAA,YACAJ,EASM,OATNsI,IASM;AAAA,cARJtI,EAOI,KAPJmJ,IAOI;AAAA,gBAAA1I,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,kBAPgC;AAAA,kBAElC;AAAA;AAAA,gBAAA;AAAA,gBAAAP,EAIS,UAAA;AAAA,kBAJD,MAAK;AAAA,kBACX,OAAM;AAAA,kBACL,SAAKS,uBAAEH,EAAA,MAAK,kBAAA;AAAA,gBAAA,GAAsB,WAErC;AAAA,cAAA,CAAA;AAAA;YAIJF,EAAA,aAAA;AAAA,YACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPNwJ,IAOM;AAAA,cANJrJ,EAKI,KALJoJ,IAKI;AAAA,gBAAA3I,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,kBALgC;AAAA,kBAElC;AAAA;AAAA,gBAAA;AAAA,gBAAAgI,EAESxI,EAAA,QAAA;AAAA,kBAFD,SAAQ;AAAA,kBAAW,MAAI,UAAYA,EAAA,gBAAA,CAAe;AAAA,gBAAA,GAAA;AAAA,6BAAM,MAEhEU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,oBAAAF;AAAAA,sBAFgE;AAAA,sBAEhE;AAAA;AAAA,oBAAA;AAAA,kBAAA,EAAA;AAAA;;;;;YAIJH,EAAA,qBAAA;AAAA,YACAmI,EAA+CxI,EAAA,sBAAA;AAAA,cAAxB,QAAQA,EAAA,MAAM;AAAA,YAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;ACiE3C,UAAMhB,IAAQC,GAIRkC,IAAOC,GAGP,EAAE,QAAA+D,GAAQ,iBAAAwB,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM,GAG3D,EAAE,aAAAuK,EAAA,IAAgBC,GAAA,GAGlBC,IAAuBjI,EAAI,EAAK,GAChCkI,IAAelI,EAAI,EAAK,GACxB6D,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAI,EAAE,GACdwF,IAAQxF,EAAI,EAAE,GAEd8F,IAAOC,EAAS;AAAA,MACpB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,IAAA,CACX,GAEKoC,IAAcpC,EAAS;AAAA,MAC3B,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,IAAA,CACX,GAGKI,IAAcxI,EAAS,MAAM;AACjC,YAAMyK,IAAoBtC,EAAK,SAAS,UAAUA,EAAK,SAAS,KAAA,GAC1DuC,IAAoBvC,EAAK,SAAS,UAAU,GAC5CwC,IAAgB,CAAC,CAAC9K,EAAM;AAE9B,aAAO4K,KAAqBC,KAAqBC;AAAA,IACnD,CAAC;AAGD,IAAArF;AAAA,MACE,MAAM6C,EAAK;AAAA,MACX,CAACL,MAAa;AACZ,QAAIA,KAAYA,EAAS,SAAS,IAChC0C,EAAY,WAAW,gDAEvBA,EAAY,WAAW;AAAA,MAE3B;AAAA,IAAA,GAIFlF;AAAA,MACE,MAAM6C,EAAK;AAAA,MACX,CAACyC,MAAa;AACZ,QAAIA,KAAYA,EAAS,SAAS,IAChCJ,EAAY,WAAW,gDAEvBA,EAAY,WAAW;AAAA,MAE3B;AAAA,IAAA;AAIF,UAAMK,IAAa7K,EAAS,OAAO;AAAA,MACjC,SAASH,EAAM,QAAQ,WAAW;AAAA,MAClC,aAAaA,EAAM,eAAe;AAAA,IAAA,EAClC;AAGF,IAAAmF,GAAU,MAAM;AACd,UAAInF,EAAM;AACR,YAAI;AACF,gBAAMiL,IAAQjL,EAAM,MAAM,MAAM,GAAG;AACnC,cAAIiL,EAAM,WAAW,GAAG;AACtB,kBAAMC,IAAU,KAAK,MAAM,KAAKD,EAAM,CAAC,CAAC,CAAC;AACzC,YAAIC,EAAQ,UACVlD,EAAM,QAAQkD,EAAQ;AAAA,UAE1B;AAAA,QACF,SAASrE,GAAK;AACZ,kBAAQ,KAAK,6CAA6CA,CAAG;AAAA,QAC/D;AAAA,IAEJ,CAAC;AAED,UAAMsE,IAAqB,MAAM;AAC/B,MAAIH,EAAW,MAAM,gBACnB,QAAQ,IAAI,4BAA4BA,EAAW,MAAM,WAAW,GACpE,OAAO,SAAS,OAAOA,EAAW,MAAM;AAAA,IAE5C,0PAE6B,YAAY;AACvC,UAAI,CAAChL,EAAM,OAAO;AAChB,QAAAsG,EAAM,QAAQ;AACd;AAAA,MACF;AASA,UANAA,EAAM,QAAQ,IACd,OAAO,KAAKqE,CAAW,EAAE,QAAQ,CAAAS,MAAO;AACtC,QAAAT,EAAYS,CAA+B,IAAI;AAAA,MACjD,CAAC,GAGG,CAACzC,EAAY,OAAO;AACtB,QAAArC,EAAM,QAAQ;AACd;AAAA,MACF;AAEA,MAAAD,EAAQ,QAAQ;AAEhB,UAAI;AACF,cAAMK,IAAW,MAAM,MAAM,GAAGsE,EAAW,MAAM,OAAO,sCAAsC;AAAA,UAC5F,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU;AAAA,YACnB,OAAOhL,EAAM;AAAA,YACb,UAAUsI,EAAK;AAAA,YACf,UAAUA,EAAK;AAAA,YACf,YAAYA,EAAK,aAAa;AAAA,YAC9B,WAAWA,EAAK,YAAY;AAAA,UAAA,CAC7B;AAAA,QAAA,CACF;AAED,YAAI,CAAC5B,EAAS,IAAI;AAChB,gBAAM2E,IAAY,MAAM3E,EAAS,KAAA;AACjC,gBAAM,IAAI,MAAM,oCAAoC2E,CAAS,EAAE;AAAA,QACjE;AAEA,cAAMzE,IAAuB,MAAMF,EAAS,KAAA;AAC5C,gBAAQ,IAAI,yBAAyBE,CAAM,GAGvCA,EAAO,gBAAgBA,EAAO,iBAAiBA,EAAO,QACxD2D,EAAY3D,CAAM,GAClB,QAAQ,IAAI,6CAA6CA,EAAO,KAAK,KAAK,KAE1E,QAAQ,KAAK,wDAAwD,GAGvE6D,EAAqB,QAAQ,IAC7BtI,EAAK,WAAWyE,CAAM,GAGtB,WAAW,MAAM;AACf,UAAAuE,EAAA;AAAA,QACF,GAAG,GAAI;AAAA,MACT,SAAStE,GAAK;AACZ,QAAIA,aAAe,QACbA,EAAI,QAAQ,SAAS,UAAU,KAAKA,EAAI,QAAQ,SAAS,KAAK,IAChEP,EAAM,QAAQ,gEACLO,EAAI,QAAQ,SAAS,aAAa,KAAKA,EAAI,QAAQ,SAAS,KAAK,KAC1EP,EAAM,QAAQ,mEACdoE,EAAa,QAAQ,IACrBvI,EAAK,eAAe,KAEpBmE,EAAM,QAAQO,EAAI,UAGpBP,EAAM,QAAQ,sDAEhBnE,EAAK,SAASmE,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAD,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;;;;;;;;;;;;;;;EAxXmC,OAAM;GAE9B1F,KAAA,EAAA,OAAM,cAAA,GAsBeO,KAAA,EAAA,OAAM,qDAAA,GAE3BC,KAAA,EAAA,OAAM,cAAA,GAsBQP,KAAA,EAAA,OAAM,qDAAA,GAGpBa,KAAA,EAAA,OAAM,mBAAA;;EAGS,OAAM;GACnByB,KAAA,EAAA,OAAM,2BAAA,GAAuDC,KAAA,EAAA,OAAM,+BAAA;;EAuF5C,OAAM;GAC/B+F,KAAA,EAAA,OAAM,2BAAA,GAeHQ,KAAA,EAAA,OAAM,qDAAA,GAETP,KAAA,EAAA,OAAM,cAAA;;;;;;MAjKf9H,EAAA,iBAAA;AAAA,MACWL,EAAA,wBAAAH,EAAA,GAAXC,EAqBM,OArBNJ,IAqBM;AAAA,QApBJ8I,EAmBSxI,EAAA,QAAA,EAnBD,SAAQ,SAAA,GAAQ;AAAA,UAAA,SAAA4C,EACtB,MAgBM;AAAA,YAhBN3C,EAgBM,OAhBNN,IAgBM;AAAA,cAAAe,EAAA,CAAA,MAAAA,EAAA,CAAA,IAfJT;AAAAA,gBAAkD;AAAA,gBAAA,EAA7C,OAAM,+BAAA;AAAA,gBAA+B;AAAA,gBAAE;AAAA;AAAA,cAAA;AAAA,cAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAC5CT;AAAAA,gBAA0E;AAAA,gBAAA,EAAtE,OAAM,wCAAA;AAAA,gBAAwC;AAAA,gBAAmB;AAAA;AAAA,cAAA;AAAA,cAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IACrET;AAAAA,gBAEI;AAAA,gBAAA,EAFD,OAAM,wBAAA;AAAA,gBAAwB;AAAA,gBAEjC;AAAA;AAAA,cAAA;AAAA,cAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,gBAEI;AAAA,gBAAA,EAFD,OAAM,gCAAA;AAAA,gBAAgC;AAAA,gBAEzC;AAAA;AAAA,cAAA;AAAA,cACAuI,EAMWxI,EAAA,UAAA;AAAA,gBALT,SAAQ;AAAA,gBACR,cAAA;AAAA,gBACC,SAAOA,EAAA;AAAA,cAAA,GAAA;AAAA,2BACT,MAEDU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAAF;AAAAA,oBAFC;AAAA,oBAED;AAAA;AAAA,kBAAA;AAAA,gBAAA,EAAA;AAAA;;;;YAEFgI,EAAwBxI,EAAA,oBAAA;AAAA,UAAA,CAAA;AAAA;;;YAKZA,EAAA,gBAAAH,EAAA,GAAhBC;AAAAA,QAqBM4E;AAAAA,QAAA,EAAA,KAAA,EAAA;AAAA,QAAA;AAAA,UAtBNrE,EAAA,uBAAA;AAAA,UACAJ,EAqBM,OArBNC,IAqBM;AAAA,YApBJsI,EAmBSxI,EAAA,QAAA,EAnBD,SAAQ,SAAA,GAAQ;AAAA,cAAA,SAAA4C,EACtB,MAgBM;AAAA,gBAhBN3C,EAgBM,OAhBNE,IAgBM;AAAA,kBAAAO,EAAA,EAAA,MAAAA,EAAA,EAAA,IAfJT;AAAAA,oBAA+C;AAAA,oBAAA,EAA1C,OAAM,6BAAA;AAAA,oBAA6B;AAAA,oBAAC;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IACzCT;AAAAA,oBAAmE;AAAA,oBAAA,EAA/D,OAAM,wCAAA;AAAA,oBAAwC;AAAA,oBAAY;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAC9DT;AAAAA,oBAEI;AAAA,oBAAA,EAFD,OAAM,wBAAA;AAAA,oBAAwB;AAAA,oBAEjC;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,oBAEI;AAAA,oBAAA,EAFD,OAAM,gCAAA;AAAA,oBAAgC;AAAA,oBAEzC;AAAA;AAAA,kBAAA;AAAA,kBACAuI,EAMWxI,EAAA,UAAA;AAAA,oBALT,SAAQ;AAAA,oBACR,cAAA;AAAA,oBACC,SAAKU,uBAAEH,EAAA,MAAK,kBAAA;AAAA,kBAAA,GAAA;AAAA,+BACd,MAEDG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,sBAAAF;AAAAA,wBAFC;AAAA,wBAED;AAAA;AAAA,sBAAA;AAAA,oBAAA,EAAA;AAAA;;;;gBAEFgI,EAAwBxI,EAAA,oBAAA;AAAA,cAAA,CAAA;AAAA;;;;;;;WAKZI,EAAA,SAAAP,EAAA,GAAhBC;AAAAA,QA2GM4E;AAAAA,QAAA,EAAA,KAAA,EAAA;AAAA,QAAA;AAAA,UA5GNrE,EAAA,qBAAA;AAAA,UACAJ,EA2GM,OA3GNL,IA2GM;AAAA,YA1GJ4I,EAwGSxI,EAAA,QAAA,EAxGD,SAAQ,SAAA,GAAQ;AAAA,cAAA,SAAA4C,EACtB,MAAe;AAAA,gBAAfvC,EAAA,UAAA;AAAA,gBACAJ,EAMM,OANNQ,IAMM;AAAA,kBAAAC,EAAA,EAAA,MAAAA,EAAA,EAAA,IALJT;AAAAA,oBAAiF;AAAA,oBAAA,EAA7E,OAAM,wCAAA;AAAA,oBAAwC;AAAA,oBAA0B;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAC5ET;AAAAA,oBAAkF;AAAA,oBAAA,EAA/E,OAAM,mBAAA;AAAA,oBAAmB;AAAA,oBAAkD;AAAA;AAAA,kBAAA;AAAA,kBACnED,EAAA,SAAAH,EAAA,GAAXC,EAEM,OAFNmC,IAEM;AAAA,oBADJhC,EAA2H,KAA3HiC,IAA2H;AAAA,sBAAAxB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,wBAAvF;AAAA,wBAAsB;AAAA;AAAA,sBAAA;AAAA,sBAAAP;AAAAA,wBAA6D;AAAA,wBAA7DkC;AAAAA,wBAA6DpB,EAAff,EAAA,KAAK;AAAA,wBAAA;AAAA;AAAA,sBAAA;AAAA,oBAAA,CAAA;AAAA;;gBAIjHK,EAAA,qBAAA;AAAA,gBACAJ;AAAAA,kBAqEO;AAAA,kBAAA;AAAA,oBArEA,UAAM0I,GAAU3I,EAAA,sBAAoB,CAAA,SAAA,CAAA;AAAA,oBAAE,OAAM;AAAA,kBAAA;AAAA;oBACjDK,EAAA,YAAA;AAAA,oBACAJ,EAWM,OAAA,MAAA;AAAA,sBAVJuI,EASExI,EAAA,SAAA;AAAA,wBARA,IAAG;AAAA,wBAAA,YACMA,EAAA,KAAK;AAAA,wBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,WAAQc;AAAA,wBACtB,MAAK;AAAA,wBACL,OAAM;AAAA,wBACN,aAAY;AAAA,wBACZ,cAAa;AAAA,wBACb,UAAA;AAAA,wBACC,OAAOd,EAAA,YAAY;AAAA,sBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;oBAIxBK,EAAA,cAAA;AAAA,oBACAJ,EAUM,OAAA,MAAA;AAAA,sBATJuI,EAQExI,EAAA,SAAA;AAAA,wBAPA,IAAG;AAAA,wBAAA,YACMA,EAAA,KAAK;AAAA,wBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,YAASc;AAAA,wBACvB,MAAK;AAAA,wBACL,OAAM;AAAA,wBACN,aAAY;AAAA,wBACZ,cAAa;AAAA,wBACZ,OAAOd,EAAA,YAAY;AAAA,sBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;oBAIxBK,EAAA,aAAA;AAAA,oBACAJ,EAUM,OAAA,MAAA;AAAA,sBATJuI,EAQExI,EAAA,SAAA;AAAA,wBAPA,IAAG;AAAA,wBAAA,YACMA,EAAA,KAAK;AAAA,wBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,WAAQc;AAAA,wBACtB,MAAK;AAAA,wBACL,OAAM;AAAA,wBACN,aAAY;AAAA,wBACZ,cAAa;AAAA,wBACZ,OAAOd,EAAA,YAAY;AAAA,sBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA;oBAIxBK,EAAA,YAAA;AAAA,oBACAJ,EAeM,OAAA,MAAA;AAAA,sBAdJuI,EAUExI,EAAA,SAAA;AAAA,wBATA,IAAG;AAAA,wBAAA,YACMA,EAAA,KAAK;AAAA,wBAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,WAAQc;AAAA,wBACtB,MAAK;AAAA,wBACL,OAAM;AAAA,wBACN,aAAY;AAAA,wBACZ,cAAa;AAAA,wBACb,UAAA;AAAA,wBACA,WAAU;AAAA,wBACT,OAAOd,EAAA,YAAY;AAAA,sBAAA,GAAA,MAAA,GAAA,CAAA,cAAA,OAAA,CAAA;AAAA,sBAEtBU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAT;AAAAA,wBAEM;AAAA,wBAAA,EAFD,OAAM,gCAAA;AAAA,wBAAgC;AAAA,wBAE3C;AAAA;AAAA,sBAAA;AAAA,oBAAA,CAAA;AAAA,oBAGFuI,EASWxI,EAAA,UAAA;AAAA,sBART,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,cAAA;AAAA,sBACC,UAAUA,aAAO,CAAKA,EAAA;AAAA,sBACtB,SAASA,EAAA;AAAA,sBACV,gBAAa;AAAA,oBAAA,GAAA;AAAA,iCACd,MAEDU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,wBAAAF;AAAAA,0BAFC;AAAA,0BAED;AAAA;AAAA,wBAAA;AAAA,sBAAA,EAAA;AAAA;;;;;;;gBAGFH,EAAA,eAAA;AAAA,gBAEQL,gBADRyC,EAOEzC,EAAA,SAAA;AAAA,kBAAA,KAAA;AAAA,kBALA,SAAQ;AAAA,kBACP,SAASA,EAAA;AAAA,kBACV,OAAM;AAAA,kBACN,aAAA;AAAA,kBACC,WAAOU,uBAAEV,EAAA,QAAK;AAAA,gBAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,gBAGjBA,EAAA,aAAA;AAAA,gBACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPNsC,IAOM;AAAA,kBANJnC,EAKI,KALJiI,IAKI;AAAA,oBAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,sBALgC;AAAA,sBAElC;AAAA;AAAA,oBAAA;AAAA,oBAAAgI,EAESxI,EAAA,QAAA;AAAA,sBAFD,SAAQ;AAAA,sBAAW,MAAI,UAAYA,EAAA,gBAAA,CAAe;AAAA,oBAAA,GAAA;AAAA,iCAAM,MAEhEU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,wBAAAF;AAAAA,0BAFgE;AAAA,0BAEhE;AAAA;AAAA,wBAAA;AAAA,sBAAA,EAAA;AAAA;;;;;gBAIJH,EAAA,qBAAA;AAAA,gBACAmI,EAA+CxI,EAAA,sBAAA;AAAA,kBAAxB,QAAQA,EAAA,MAAM;AAAA,gBAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;MAMzC,MAAAH,EAAA,GAAAC;AAAAA,QAqBM4E;AAAAA,QAAA,EAAA,KAAA,EAAA;AAAA,QAAA;AAAA,UAtBNrE,EAAA,kBAAA;AAAA,UACAJ,EAqBM,OArBNyI,IAqBM;AAAA,YApBJF,EAmBSxI,EAAA,QAAA,EAnBD,SAAQ,SAAA,GAAQ;AAAA,cAAA,SAAA4C,EACtB,MAgBM;AAAA,gBAhBN3C,EAgBM,OAhBNkI,IAgBM;AAAA,kBAAAzH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAfJT;AAAAA,oBAAmD;AAAA,oBAAA,EAA9C,OAAM,gCAAA;AAAA,oBAAgC;AAAA,oBAAE;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAC7CT;AAAAA,oBAAoE;AAAA,oBAAA,EAAhE,OAAM,wCAAA;AAAA,oBAAwC;AAAA,oBAAa;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAC/DT;AAAAA,oBAEI;AAAA,oBAAA,EAFD,OAAM,wBAAA;AAAA,oBAAwB;AAAA,oBAEjC;AAAA;AAAA,kBAAA;AAAA,kBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,oBAEI;AAAA,oBAAA,EAFD,OAAM,gCAAA;AAAA,oBAAgC;AAAA,oBAEzC;AAAA;AAAA,kBAAA;AAAA,kBACAuI,EAMWxI,EAAA,UAAA;AAAA,oBALT,SAAQ;AAAA,oBACR,cAAA;AAAA,oBACC,SAAKU,uBAAEH,EAAA,MAAK,oBAAA;AAAA,kBAAA,GAAA;AAAA,+BACd,MAEDG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,sBAAAF;AAAAA,wBAFC;AAAA,wBAED;AAAA;AAAA,sBAAA;AAAA,oBAAA,EAAA;AAAA;;;;gBAEFgI,EAAwBxI,EAAA,oBAAA;AAAA,cAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;AC8H9B,UAAMhB,IAAQC,GACRkC,IAAOC,GAGP,EAAE,iBAAAuF,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM,GAEnDqG,IAAU7D,EAAI,EAAK,GACnB8I,IAAqB9I,EAAI,EAAK,GAC9BuH,IAAiBvH,EAAI,EAAE,GACvBsE,IAAetE,EAAI,EAAE,GACrB+I,IAAiB/I,EAAI;AAAA,MACzB,EAAE,IAAI,KAAK,QAAQ,iBAAiB,UAAU,qBAAqB,YAAY,iBAAiB,SAAS,GAAA;AAAA,MACzG,EAAE,IAAI,KAAK,QAAQ,oBAAoB,UAAU,qBAAqB,YAAY,cAAc,SAAS,GAAA;AAAA,IAAM,CAChH,GAEK8F,IAAOC,EAAS;AAAA,MACpB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR,GAEKiD,IAAejD,EAAS;AAAA,MAC5B,SAAS;AAAA,MACT,KAAK;AAAA,MACL,SAAS;AAAA,IAAA,CACV,GAEKkD,IAASlD,EAAS;AAAA,MACtB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR,GAEKmD,IAAavL,EAAS,MACrBH,EAAM,OAETsI,EAAK,cAActI,EAAM,KAAK,aAC9BsI,EAAK,aAAatI,EAAM,KAAK,YAC7BsI,EAAK,UAAUtI,EAAM,KAAK,SAC1BsI,EAAK,WAAWtI,EAAM,KAAK,SAAS,MALd,EAOzB,GAEK2L,IAAsBxL,EAAS,MAEjCqL,EAAa,WACbA,EAAa,OACbA,EAAa,WACbA,EAAa,QAAQA,EAAa,WAClCA,EAAa,IAAI,UAAU,CAE9B,GAEKI,IAAc,CAAC1D,GAAoBC,MACnC,CAACD,KAAa,CAACC,IAAiB,MAC7B,GAAGD,IAAY,CAAC,KAAK,EAAE,GAAGC,IAAW,CAAC,KAAK,EAAE,GAAG,YAAA;AAIzD,IAAA1C,GAAM,MAAMzF,EAAM,MAAM,CAAC6L,MAAS;AAChC,MAAIA,MACFvD,EAAK,YAAYuD,EAAK,WACtBvD,EAAK,WAAWuD,EAAK,UACrBvD,EAAK,QAAQuD,EAAK,OAClBvD,EAAK,QAAQuD,EAAK,SAAS;AAAA,IAE/B,GAAG,EAAE,WAAW,IAAM;AAEtB,UAAMC,IAAgB,MAAM;AAC1B,MAAA/B,EAAe,QAAQ,IACvBjD,EAAa,QAAQ,IACrB,OAAO,KAAK2E,CAAM,EAAE,QAAQ,CAAAL,MAAO;AACjC,QAAAK,EAAOL,CAA0B,IAAI;AAAA,MACvC,CAAC;AAAA,IACH,6QAE4B,YAAY;AACtC,MAAAU,EAAA,GACAzF,EAAQ,QAAQ;AAEhB,UAAI;AAKF,cAAM,IAAI,QAAQ,CAAA0F,MAAW,WAAWA,GAAS,GAAI,CAAC;AAEtD,cAAMC,IAAc;AAAA,UAClB,GAAGhM,EAAM;AAAA,UACT,GAAGsI;AAAA,QAAA;AAGL,QAAAyB,EAAe,QAAQ,gCACvB5H,EAAK,mBAAmB6J,CAAW;AAAA,MACrC,QAAc;AACZ,QAAAlF,EAAa,QAAQ,4BACrB3E,EAAK,SAAS2E,EAAa,KAAK;AAAA,MAClC,UAAA;AACE,QAAAT,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,yBAE6B,YAAY;AACvC,UAAKsF,EAAoB,OAEzB;AAAA,QAAAG,EAAA,GACAzF,EAAQ,QAAQ;AAEhB,YAAI;AAKF,gBAAM,IAAI,QAAQ,CAAA0F,MAAW,WAAWA,GAAS,GAAI,CAAC,GAEtDhC,EAAe,QAAQ,iCACvBuB,EAAmB,QAAQ,IAC3BE,EAAa,UAAU,IACvBA,EAAa,MAAM,IACnBA,EAAa,UAAU;AAAA,QACzB,QAAc;AACZ,UAAA1E,EAAa,QAAQ;AAAA,QACvB,UAAA;AACE,UAAAT,EAAQ,QAAQ;AAAA,QAClB;AAAA;AAAA,IACF,sBAE0B,MAAM;AAG9B,MAAAlE,EAAK,SAAS,gDAAgD;AAAA,IAChE,oBAEwB,MAAM;AAC5B,MAAAA,EAAK,cAAc,CAACnC,EAAM,MAAM,UAAU;AAAA,IAC5C,iBAEqB,MAAM;AACzB,MAAIA,EAAM,SACRsI,EAAK,YAAYtI,EAAM,KAAK,WAC5BsI,EAAK,WAAWtI,EAAM,KAAK,UAC3BsI,EAAK,QAAQtI,EAAM,KAAK,OACxBsI,EAAK,QAAQtI,EAAM,KAAK,SAAS,KAEnC8L,EAAA,GACAR,EAAmB,QAAQ,IAC3BE,EAAa,UAAU,IACvBA,EAAa,MAAM,IACnBA,EAAa,UAAU;AAAA,IACzB;;;IAvcO9K,KAAA,EAAA,OAAM,4CAAA,GACJC,KAAA,EAAA,OAAM,cAAA,GAQJO,KAAA,EAAA,OAAM,kCAAA,GACJC,KAAA,EAAA,OAAM,iBAAA,GACJP,KAAA,EAAA,OAAM,sJAAA,GAuBRa,KAAA,EAAA,OAAM,wCAAA,GAEJwB,KAAA,EAAA,OAAM,YAAA;;EAkBoB,OAAM;;;EAkBP,OAAM;;;EAkBT,OAAM;;;EACQ,OAAM;;;EAmBpB,OAAM;GAK5B2G,KAAA,EAAA,OAAM,YAAA,GAIJC,KAAA,EAAA,OAAM,yCAAA,GACJN,KAAA,EAAA,OAAM,oCAAA;;EAcoB,OAAM;sBAkClCc,KAAA,EAAA,OAAM,+BAAA,GACJ4B,KAAA,EAAA,OAAM,oCAAA,GAGJC,KAAA,EAAA,OAAM,2BAAA,GAkBVC,KAAA,EAAA,OAAM,+BAAA,GACJC,KAAA,EAAA,OAAM,oCAAA,GAGJC,KAAA,EAAA,OAAM,2BAAA,GAedC,KAAA,EAAA,OAAM,mEAAA;;EAMc,OAAM;;;EAsBN,OAAM;GAC1BC,KAAA,EAAA,OAAM,gBAAA,GACJC,KAAA,EAAA,OAAM,yBAAA,GAINC,KAAA,EAAA,OAAM,cAAA;;EAKU,OAAM;GACxBC,KAAA,EAAA,OAAM,cAAA,GACJC,KAAA,EAAA,OAAM,yBAAA,GAINC,KAAA,EAAA,OAAM,cAAA;;EAMe,OAAM;GAC/BC,KAAA,EAAA,OAAM,2BAAA;;;AArQf,SAAAhM,EAAA,GAAAC,EAgRM,OAhRNJ,IAgRM;AAAA,IA/QJO,EA8QM,OA9QNN,IA8QM;AAAA,MA7QJU,EAAA,UAAA;AAAA,MAAAK,EAAA,EAAA,MAAAA,EAAA,EAAA,IACAT;AAAAA,QAGM;AAAA,QAAA,EAHD,OAAM,mBAAA;AAAA,QAAkB;AAAA,UAC3BA,EAAuE,MAAA,EAAnE,OAAM,wCAAA,GAAwC,kBAAgB;AAAA,UAClEA,EAA+E,KAAA,EAA5E,OAAM,mBAAA,GAAmB,iDAA+C;AAAA,QAAA;AAAA;;;MAG7EI,EAAA,yBAAA;AAAA,MACAJ,EAqBM,OArBNC,IAqBM;AAAA,QApBJD,EAaM,OAbNE,IAaM;AAAA,UAZJF;AAAAA,YAEM;AAAA,YAFNL;AAAAA,YAEMmB,EADDf,EAAA,YAAYI,EAAA,MAAM,WAAWA,QAAM,QAAQ,CAAA;AAAA,YAAA;AAAA;AAAA,UAAA;AAAA,UAEhDH,EAQS,UAAA;AAAA,YAPP,OAAM;AAAA,YACL,SAAOD,EAAA;AAAA,UAAA,GAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAERT;AAAAA,cAGM;AAAA,cAAA;AAAA,gBAHD,OAAM;AAAA,gBAAqB,MAAK;AAAA,gBAAO,QAAO;AAAA,gBAAe,SAAQ;AAAA,cAAA;AAAA;gBACxEA,EAA6O,QAAA;AAAA,kBAAvO,kBAAe;AAAA,kBAAQ,mBAAgB;AAAA,kBAAQ,gBAAa;AAAA,kBAAI,GAAE;AAAA,gBAAA,CAAA;AAAA,gBACxEA,EAA6G,QAAA;AAAA,kBAAvG,kBAAe;AAAA,kBAAQ,mBAAgB;AAAA,kBAAQ,gBAAa;AAAA,kBAAI,GAAE;AAAA,gBAAA,CAAA;AAAA;;;;;;QAI9EA,EAKS,UAAA;AAAA,UAJP,OAAM;AAAA,UACL,SAAOD,EAAA;AAAA,QAAA,GACT,gBAED;AAAA,MAAA,CAAA;AAAA,MAGFK,EAAA,gBAAA;AAAA,MACAJ;AAAAA,QAyMO;AAAA,QAAA;AAAA,UAzMA,UAAM0I,GAAU3I,EAAA,qBAAmB,CAAA,SAAA,CAAA;AAAA,UAAE,OAAM;AAAA,QAAA;AAAA;UAChDC,EA4KM,OA5KNQ,IA4KM;AAAA,YA3KJJ,EAAA,wBAAA;AAAA,YACAJ,EA4EM,OA5ENgC,IA4EM;AAAA,cAAAvB,EAAA,EAAA,MAAAA,EAAA,EAAA,IA3EJT;AAAAA,gBAAiF;AAAA,gBAAA,EAA7E,OAAM,8CAAA;AAAA,gBAA8C;AAAA,gBAAoB;AAAA;AAAA,cAAA;AAAA,cAE5EA,EAgBM,OAAA,MAAA;AAAA,gBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAfJT;AAAAA,kBAA8D;AAAA,kBAAA;AAAA,oBAAvD,KAAI;AAAA,oBAAY,OAAM;AAAA,kBAAA;AAAA,kBAAe;AAAA,kBAAU;AAAA;AAAA,gBAAA;AAAA,gBAAA6L,EACtD7L,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MACMd,OAAK,YAASc;AAAA,kBACvB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKf,EAAA;AAAA,oBAAA;AAAA,oBAAwDC,EAAA,OAAO,aAAS;AAAA,kBAAA,CAAA;AAAA,kBAI9E,aAAY;AAAA,kBACX,UAAUA,EAAA;AAAA,gBAAA,GAAA,MAAA,IAAAkC,EAAA,GAAA;AAAA,kBATF,CAAA6J,GAAA/L,EAAA,KAAK,SAAS;AAAA,gBAAA,CAAA;AAAA,gBAWhBA,EAAA,OAAO,aAAAH,EAAA,GAAhBC;AAAAA,kBAAuF;AAAA,kBAAvFqC;AAAA,kBAAuFpB,EAAvBf,SAAO,SAAS;AAAA,kBAAA;AAAA;AAAA,gBAAA,KAAAK,EAAA,QAAA,EAAA;AAAA;cAGlFJ,EAgBM,OAAA,MAAA;AAAA,gBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAfJT;AAAAA,kBAA4D;AAAA,kBAAA;AAAA,oBAArD,KAAI;AAAA,oBAAW,OAAM;AAAA,kBAAA;AAAA,kBAAe;AAAA,kBAAS;AAAA;AAAA,gBAAA;AAAA,gBAAA6L,EACpD7L,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MACMd,OAAK,WAAQc;AAAA,kBACtB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKf,EAAA;AAAA,oBAAA;AAAA,oBAAwDC,EAAA,OAAO,YAAQ;AAAA,kBAAA,CAAA;AAAA,kBAI7E,aAAY;AAAA,kBACX,UAAUA,EAAA;AAAA,gBAAA,GAAA,MAAA,IAAAoC,EAAA,GAAA;AAAA,kBATF,CAAA2J,GAAA/L,EAAA,KAAK,QAAQ;AAAA,gBAAA,CAAA;AAAA,gBAWfA,EAAA,OAAO,YAAAH,EAAA,GAAhBC;AAAAA,kBAAqF;AAAA,kBAArFoI;AAAA,kBAAqFnH,EAAtBf,SAAO,QAAQ;AAAA,kBAAA;AAAA;AAAA,gBAAA,KAAAK,EAAA,QAAA,EAAA;AAAA;cAGhFJ,EAmBM,OAAA,MAAA;AAAA,gBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAlBJT;AAAAA,kBAA6D;AAAA,kBAAA;AAAA,oBAAtD,KAAI;AAAA,oBAAQ,OAAM;AAAA,kBAAA;AAAA,kBAAe;AAAA,kBAAa;AAAA;AAAA,gBAAA;AAAA,gBAAA6L,EACrD7L,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MACMd,OAAK,QAAKc;AAAA,kBACnB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKf,EAAA;AAAA,oBAAA;AAAA,oBAAwDC,EAAA,OAAO,SAAK;AAAA,kBAAA,CAAA;AAAA,kBAI1E,aAAY;AAAA,kBACX,UAAUA,EAAA;AAAA,gBAAA,GAAA,MAAA,IAAA0I,EAAA,GAAA;AAAA,kBATF,CAAAqD,GAAA/L,EAAA,KAAK,KAAK;AAAA,gBAAA,CAAA;AAAA,gBAWZA,EAAA,OAAO,SAAAH,EAAA,GAAhBC;AAAAA,kBAA+E;AAAA,kBAA/EqI;AAAA,kBAA+EpH,EAAnBf,SAAO,KAAK;AAAA,kBAAA;AAAA;AAAA,gBAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,gBAC/DL,EAAA,KAAK,UAAUI,EAAA,MAAM,SAAAP,EAAA,GAA9BC,EAEI,KAFJsI,IAA0E,iDAE1E,KAAA/H,EAAA,QAAA,EAAA;AAAA;cAGFJ,EAeM,OAAA,MAAA;AAAA,gBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAdJT;AAAAA,kBAA4D;AAAA,kBAAA;AAAA,oBAArD,KAAI;AAAA,oBAAQ,OAAM;AAAA,kBAAA;AAAA,kBAAe;AAAA,kBAAY;AAAA;AAAA,gBAAA;AAAA,gBAAA6L,EACpD7L,EAWE,SAAA;AAAA,kBAVA,IAAG;AAAA,kBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MACMd,OAAK,QAAKc;AAAA,kBACnB,MAAK;AAAA,kBACL,cAAa;AAAA,kBACZ,OAAKf,EAAA;AAAA,oBAAA;AAAA,oBAAwDC,EAAA,OAAO,SAAK;AAAA,kBAAA,CAAA;AAAA,kBAI1E,aAAY;AAAA,kBACX,UAAUA,EAAA;AAAA,gBAAA,GAAA,MAAA,IAAAqI,EAAA,GAAA;AAAA,kBARF,CAAA0D,GAAA/L,EAAA,KAAK,KAAK;AAAA,gBAAA,CAAA;AAAA,gBAUZA,EAAA,OAAO,SAAAH,EAAA,GAAhBC;AAAAA,kBAA+E;AAAA,kBAA/EwI;AAAA,kBAA+EvH,EAAnBf,SAAO,KAAK;AAAA,kBAAA;AAAA;AAAA,gBAAA,KAAAK,EAAA,QAAA,EAAA;AAAA;;YAI5EA,EAAA,qBAAA;AAAA,YACAJ,EA0FM,OA1FN2I,IA0FM;AAAA,cAAAlI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAzFJT;AAAAA,gBAA8E;AAAA,gBAAA,EAA1E,OAAM,8CAAA;AAAA,gBAA8C;AAAA,gBAAiB;AAAA;AAAA,cAAA;AAAA,cAEzEI,EAAA,mBAAA;AAAA,cACAJ,EA8CM,OA9CN4I,IA8CM;AAAA,gBA7CJ5I,EAYM,OAZNsI,IAYM;AAAA,kBAAA7H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAXJT;AAAAA,oBAGM;AAAA,oBAAA;AAAA,oBAAA;AAAA,sBAFJA,EAAsD,MAAA,EAAlD,OAAM,+BAAA,GAA+B,UAAQ;AAAA,sBACjDA,EAAgE,KAAA,EAA7D,OAAM,2BAAA,GAA2B,0BAAwB;AAAA,oBAAA;AAAA;;;kBAE9DA;AAAAA,oBAMS;AAAA,oBAAA;AAAA,sBALP,MAAK;AAAA,sBACL,OAAM;AAAA,sBACL,SAAKS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAAEd,EAAA,qBAAkB,CAAIA,EAAA;AAAA,oBAAA;AAAA,sBAE3BA,EAAA,qBAAkB,WAAA,QAAA;AAAA,oBAAA;AAAA;AAAA,kBAAA;AAAA,gBAAA,CAAA;AAAA,gBAIdA,EAAA,sBAAAH,EAAA,GAAXC,EA8BM,OA9BNsJ,IA8BM;AAAA,kBAAA0C,EA7BJ7L;AAAAA,oBAME;AAAA,oBAAA;AAAA,sBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MALSd,eAAa,UAAOc;AAAA,sBAC7B,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,OAAM;AAAA,sBACN,cAAa;AAAA,oBAAA;AAAA;;;;oBAJJ,CAAAiL,GAAA/L,EAAA,aAAa,OAAO;AAAA,kBAAA,CAAA;AAAA,kBAM/B8L,EAAA7L;AAAAA,oBAME;AAAA,oBAAA;AAAA,sBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MALSd,eAAa,MAAGc;AAAA,sBACzB,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,OAAM;AAAA,sBACN,cAAa;AAAA,oBAAA;AAAA;;;;oBAJJ,CAAAiL,GAAA/L,EAAA,aAAa,GAAG;AAAA,kBAAA,CAAA;AAAA,kBAM3B8L,EAAA7L;AAAAA,oBAME;AAAA,oBAAA;AAAA,sBAAA,uBAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MALSd,eAAa,UAAOc;AAAA,sBAC7B,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,OAAM;AAAA,sBACN,cAAa;AAAA,oBAAA;AAAA;;;;oBAJJ,CAAAiL,GAAA/L,EAAA,aAAa,OAAO;AAAA,kBAAA,CAAA;AAAA,kBAM/BC,EAOS,UAAA;AAAA,oBANP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,SAAOD,EAAA;AAAA,oBACP,UAAQ,CAAGA,EAAA;AAAA,kBAAA,GACb,qBAED,GAAAsJ,EAAA;AAAA,gBAAA,CAAA,KAAAjJ,EAAA,QAAA,EAAA;AAAA;cAIJA,EAAA,6BAAA;AAAA,cACAJ,EAmBM,OAnBNoJ,IAmBM;AAAA,gBAlBJpJ,EAiBM,OAjBNgL,IAiBM;AAAA,kBAhBJhL,EAKM,OAAA,MAAA;AAAA,oBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAJJT;AAAAA,sBAAuE;AAAA,sBAAA,EAAnE,OAAM,+BAAA;AAAA,sBAA+B;AAAA,sBAAyB;AAAA;AAAA,oBAAA;AAAA,oBAClEA;AAAAA,sBAEI;AAAA,sBAFJiL;AAAA,sBAEInK,EADCX,QAAM,aAAU,YAAA,oCAAA;AAAA,sBAAA;AAAA;AAAA,oBAAA;AAAA,kBAAA,CAAA;AAAA,kBAGvBH;AAAAA,oBASS;AAAA,oBAAA;AAAA,sBARP,MAAK;AAAA,sBACJ,OAAKF,EAAA;AAAA,wBAAwBK,QAAM,aAAU,kBAAA;AAAA,wBAAA;AAAA;sBAI7C,SAAOJ,EAAA;AAAA,oBAAA;AAAA,oBAELe,EAAAX,EAAA,MAAM,aAAU,YAAA,QAAA;AAAA,oBAAA;AAAA;AAAA,kBAAA;AAAA,gBAAA,CAAA;AAAA;cAKzBC,EAAA,mBAAA;AAAA,cACAJ,EAcM,OAdNkL,IAcM;AAAA,gBAbJlL,EAYM,OAZNmL,IAYM;AAAA,kBAXJnL,EAGM,OAAA,MAAA;AAAA,oBAAAS,EAAA,EAAA,MAAAA,EAAA,EAAA,IAFJT;AAAAA,sBAA6D;AAAA,sBAAA,EAAzD,OAAM,+BAAA;AAAA,sBAA+B;AAAA,sBAAe;AAAA;AAAA,oBAAA;AAAA,oBACxDA;AAAAA,sBAAoF;AAAA,sBAApFoL;AAAA,sBAAoFtK,EAA7Cf,EAAA,eAAe,MAAM,IAAG;AAAA,sBAAiB;AAAA;AAAA,oBAAA;AAAA,kBAAA,CAAA;AAAA,kBAElFC,EAMS,UAAA;AAAA,oBALP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,SAAKS,uBAAEH,EAAA,MAAK,iBAAA;AAAA,kBAAA,GACd,UAED;AAAA,gBAAA,CAAA;AAAA;;;UAMRF,EAAA,kBAAA;AAAA,UACAJ,EAwBM,OAxBNqL,IAwBM;AAAA,YAvBJrL,EAaS,UAAA;AAAA,cAZP,MAAK;AAAA,cACJ,UAAUD,aAAO,CAAKA,EAAA;AAAA,cACvB,OAAM;AAAA,YAAA,GAAA;AAAA,cAEMA,EAAA,WAAAH,EAAA,GAAZC,EAMO,QANPkM,IAMOtL,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBALLT;AAAAA,kBAGM;AAAA,kBAAA;AAAA,oBAHD,OAAM;AAAA,oBAAuB,MAAK;AAAA,oBAAO,SAAQ;AAAA,kBAAA;AAAA;oBACpDA,EAA0F,UAAA;AAAA,sBAAlF,OAAM;AAAA,sBAAa,IAAG;AAAA,sBAAK,IAAG;AAAA,sBAAK,GAAE;AAAA,sBAAK,QAAO;AAAA,sBAAe,gBAAa;AAAA,oBAAA,CAAA;AAAA,oBACrFA,EAAsK,QAAA;AAAA,sBAAhK,OAAM;AAAA,sBAAa,MAAK;AAAA,sBAAe,GAAE;AAAA,oBAAA,CAAA;AAAA;;;;;kBAC3C;AAAA,kBAER;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA,MAAAJ,EAAA,GACAC,EAAgC,YAAnB,cAAY;AAAA,YAAA,GAAA,GAAAmM,EAAA;AAAA,YAG3BhM,EAOS,UAAA;AAAA,cANP,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAOD,EAAA;AAAA,cACP,UAAUA,EAAA;AAAA,YAAA,GACZ,YAED,GAAAkM,EAAA;AAAA,UAAA,CAAA;AAAA;;;;MAIJ7L,EAAA,0BAAA;AAAA,MACWL,EAAA,kBAAAH,EAAA,GAAXC,EASM,OATNqM,IASM;AAAA,QARJlM,EAOM,OAPNsL,IAOM;AAAA,UANJtL,EAKM,OALNuL,IAKM;AAAA,YAAA9K,EAAA,EAAA,MAAAA,EAAA,EAAA,IAJJT;AAAAA,cAEM;AAAA,cAAA;AAAA,gBAFD,OAAM;AAAA,gBAA+B,MAAK;AAAA,gBAAe,SAAQ;AAAA,cAAA;AAAA;gBACpEA,EAA6M,QAAA;AAAA,kBAAvM,aAAU;AAAA,kBAAU,GAAE;AAAA,kBAA2J,aAAU;AAAA,gBAAA,CAAA;AAAA;;;;YAEnMA;AAAAA,cAA+C;AAAA,cAA/CwL;AAAA,cAA+C1K,EAArBf,EAAA,cAAc;AAAA,cAAA;AAAA;AAAA,YAAA;AAAA,UAAA,CAAA;AAAA;;MAKnCA,EAAA,gBAAAH,EAAA,GAAXC,EASM,OATNsM,IASM;AAAA,QARJnM,EAOM,OAPNyL,IAOM;AAAA,UANJzL,EAKM,OALN0L,IAKM;AAAA,YAAAjL,EAAA,EAAA,MAAAA,EAAA,EAAA,IAJJT;AAAAA,cAEM;AAAA,cAAA;AAAA,gBAFD,OAAM;AAAA,gBAA+B,MAAK;AAAA,gBAAe,SAAQ;AAAA,cAAA;AAAA;gBACpEA,EAAkQ,QAAA;AAAA,kBAA5P,aAAU;AAAA,kBAAU,GAAE;AAAA,kBAAgN,aAAU;AAAA,gBAAA,CAAA;AAAA;;;;YAExPA;AAAAA,cAA6C;AAAA,cAA7C2L;AAAA,cAA6C7K,EAAnBf,EAAA,YAAY;AAAA,cAAA;AAAA;AAAA,YAAA;AAAA,UAAA,CAAA;AAAA;;MAK5CK,EAAA,aAAA;AAAA,MACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPNuM,IAOM;AAAA,QANJpM,EAKI,KALJ4L,IAKI;AAAA,UAAAnL,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAF;AAAAA,YALgC;AAAA,YAElC;AAAA;AAAA,UAAA;AAAA,UAAAgI,EAES8D,GAAA;AAAA,YAFD,SAAQ;AAAA,YAAW,MAAI,UAAYtM,EAAA,gBAAA,CAAe;AAAA,UAAA,GAAA;AAAA,uBAAM,MAEhEU,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,cAAAF;AAAAA,gBAFgE;AAAA,gBAEhE;AAAA;AAAA,cAAA;AAAA,YAAA,EAAA;AAAA;;;;;MAIJH,EAAA,qBAAA;AAAA,MACAmI,EAA+CxI,EAAA,sBAAA;AAAA,QAAxB,QAAQA,EAAA,MAAM;AAAA,MAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;;;;ACvM3C,UAAMhB,IAAQC,GACRkC,IAAOC,GAGP,EAAE,iBAAAuF,EAAA,IAAoB7B,EAAiB9F,EAAM,MAAM,GAEnDqG,IAAU7D,EAAI,EAAK,GACnB8D,IAAQ9D,EAAI,EAAE,GACd+K,IAAc/K,EAAI,EAAK,GAEvB8F,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR,oHAE2B,YAAY;AACtC,MAAAlC,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AAEd,UAAI;AAEF,gBAAQ,IAAI,2BAA2B,EAAE,OAAOgC,EAAK,OAAO,GAG5D,MAAM,IAAI,QAAQ,CAAAyD,MAAW,WAAWA,GAAS,GAAI,CAAC,GAEtDwB,EAAY,QAAQ,IACpBpL,EAAK,WAAWmG,EAAK,KAAK;AAAA,MAC5B,QAAc;AACZ,QAAAhC,EAAM,QAAQ,0DACdnE,EAAK,SAASmE,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAD,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;;;;;;;;;;;;;IAxGO3F,KAAA,EAAA,OAAM,qDAAA,GA8BFC,KAAA,EAAA,OAAM,mBAAA;;EAUmB,OAAM;GAC/BQ,KAAA,EAAA,OAAM,2BAAA;;AAzCf,SAAAN,EAAA,GAAAC,EAoDM,OApDNJ,IAoDM;AAAA,IAnDJ8I,EAkDSxI,EAAA,QAAA,EAlDD,SAAQ,SAAA,GAAQ;AAAA,MAAA,SAAA4C,EACtB,MAAe;AAAA,QAAfvC,EAAA,UAAA;AAAA,QAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,UAGM;AAAA,UAAA,EAHD,OAAM,mBAAA;AAAA,UAAkB;AAAA,YAC3BA,EAAqE,MAAA,EAAjE,OAAM,wCAAA,GAAwC,gBAAc;AAAA,YAChEA,EAAyG,KAAA,EAAtG,OAAM,mBAAA,GAAmB,2EAAyE;AAAA,UAAA;AAAA;;;QAGvGI,EAAA,cAAA;AAAA,QACAJ;AAAAA,UASO;AAAA,UAAA;AAAA,YATA,UAAM0I,GAAU3I,EAAA,qBAAmB,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;AAAA;YAChDwI,EAE2DxI,EAAA,SAAA;AAAA,cAFlD,IAAG;AAAA,cAAA,YAAiBA,EAAA,KAAK;AAAA,cAAA,uBAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAI,MAALd,OAAK,QAAKc;AAAA,cAAE,MAAK;AAAA,cAAQ,OAAM;AAAA,cAC1D,aAAY;AAAA,cAA2B,cAAa;AAAA,cAAQ,UAAA;AAAA,cAAU,UAAUd,EAAA,WAAWA,EAAA;AAAA,cAC1F,OAAOA,UAAK,4BAA+B;AAAA,YAAA,GAAA,MAAA,GAAA,CAAA,cAAA,YAAA,OAAA,CAAA;AAAA,YAE9CwI,EAGWxI,EAAA,UAAA;AAAA,cAHD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAUA,EAAA,WAAO,CAAKA,EAAA,KAAK,MAAM,UAAUA,EAAA;AAAA,cAC9F,SAASA,EAAA;AAAA,cAAU,gBAAc;AAAA,YAAA,GAAA;AAAA,yBAClC,MAAoD;AAAA,gBAAAQ;AAAAA,oBAAjDR,EAAA,cAAW,eAAA,iBAAA;AAAA,kBAAA;AAAA;AAAA,gBAAA;AAAA,cAAA,CAAA;AAAA;;;;;;;QAIlBK,EAAA,mBAAA;AAAA,QACeL,sBAAfyC,EAEiCzC,EAAA,SAAA;AAAA,UAAA,KAAA;AAAA,UAFL,SAAQ;AAAA,UACjC,SAAO,0DAA4DA,EAAA,KAAK,KAAK;AAAA,UAC9E,OAAM;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,QAERA,EAAA,iBAAA;AAAA,QACeL,gBAAfyC,EAC0BzC,EAAA,SAAA;AAAA,UAAA,KAAA;AAAA,UADJ,SAAQ;AAAA,UAAS,SAASA,EAAA;AAAA,UAAO,OAAM;AAAA,UAAuB,aAAA;AAAA,UACjF,WAAOU,uBAAEV,EAAA,QAAK;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,KAAAK,EAAA,QAAA,EAAA;AAAA,QAEjBA,EAAA,mBAAA;AAAA,QACAJ,EAOM,OAPNN,IAOM;AAAA,UANJ6I,EAKSxI,EAAA,QAAA;AAAA,YALA,SAAKU,uBAAEH,EAAA,MAAK,gBAAA;AAAA,YAAoB,OAAM;AAAA,UAAA,GAAA;AAAA,uBAC7C,MAEMG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAFNT;AAAAA,gBAEM;AAAA,gBAAA;AAAA,kBAFD,OAAM;AAAA,kBAAU,MAAK;AAAA,kBAAO,QAAO;AAAA,kBAAe,SAAQ;AAAA,gBAAA;AAAA;kBAC7DA,EAA4F,QAAA;AAAA,oBAAtF,kBAAe;AAAA,oBAAQ,mBAAgB;AAAA,oBAAQ,gBAAa;AAAA,oBAAI,GAAE;AAAA,kBAAA,CAAA;AAAA;;;;;gBACpE;AAAA,gBAER;AAAA;AAAA,cAAA;AAAA,YAAA,EAAA;AAAA;;;;QAGFI,EAAA,aAAA;AAAA,QACWL,EAAA,gBAAA,KAAeH,EAAA,GAA1BC,EAOM,OAPNI,IAOM;AAAA,UANJD,EAKI,KALJE,IAKI;AAAA,YAAAO,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAF;AAAAA,cALgC;AAAA,cAElC;AAAA;AAAA,YAAA;AAAA,YAAAgI,EAESxI,EAAA,QAAA;AAAA,cAFD,SAAQ;AAAA,cAAW,MAAI,UAAYA,EAAA,gBAAA,CAAe;AAAA,YAAA,GAAA;AAAA,yBAAM,MAEhEU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,gBAAAF;AAAAA,kBAFgE;AAAA,kBAEhE;AAAA;AAAA,gBAAA;AAAA,cAAA,EAAA;AAAA;;;;;QAIJH,EAAA,qBAAA;AAAA,QACAmI,EAA+CxI,EAAA,sBAAA;AAAA,UAAxB,QAAQA,EAAA,MAAM;AAAA,QAAA,GAAA,MAAA,GAAA,CAAA,QAAA,CAAA;AAAA;;;;;;;;;;;;;;IClDpCN,KAAA,EAAA,OAAM,qDAAA,GAMJC,KAAA,EAAA,OAAM,YAAA,GAkCJO,KAAA,EAAA,OAAM,kBAAA;;AAxCf,SAAAL,EAAA,GAAAC,EAwDM,OAxDNJ,IAwDM;AAAA,IAAAgB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAvDJT;AAAAA,MAGM;AAAA,MAAA,EAHD,OAAM,mBAAA;AAAA,MAAkB;AAAA,QAC3BA,EAA2E,MAAA,EAAvE,OAAM,mCAAA,GAAmC,2BAAyB;AAAA,QACtEA,EAA8D,KAAA,EAA3D,OAAM,qBAAA,GAAqB,8BAA4B;AAAA,MAAA;AAAA;;;IAG5DA,EAiDM,OAjDNN,IAiDM;AAAA,MAhDJU,EAAA,mBAAA;AAAA,MAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA8L,GAAA,oeAAA,CAAA;AAAA,MAYAnM,EAAA,aAAA;AAAA,MAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,QAKM;AAAA,QAAA;AAAA,QAAA;AAAA,UAJJA,EAA4F,SAAA,EAArF,OAAM,+CAAA,GAA+C,0BAAwB;AAAA,UACpFA,EAEM,OAAA,EAFD,OAAM,4DAAA,GAA4D,2CAEvE;AAAA,QAAA;AAAA;;;MAGFI,EAAA,2BAAA;AAAA,MAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IACAT;AAAAA,QASM;AAAA,QAAA;AAAA,QAAA;AAAA,UARJA,EAAqF,SAAA,EAA9E,OAAM,+CAAA,GAA+C,mBAAiB;AAAA,UAC7EA,EAKE,SAAA;AAAA,YAJA,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAM;AAAA,YACN,WAAU;AAAA,UAAA,CAAA;AAAA,UAEZA,EAA4F,KAAA,EAAzF,OAAM,6BAAA,GAA6B,oDAAkD;AAAA,QAAA;AAAA;;;MAG1FI,EAAA,WAAA;AAAA,MACAJ,EAcM,OAdNC,IAcM;AAAA,QAAAQ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAbJT;AAAAA,UAKS;AAAA,UAAA;AAAA,YAJP,MAAK;AAAA,YACL,OAAM;AAAA,UAAA;AAAA,UACP;AAAA,UAED;AAAA;AAAA,QAAA;AAAA,QACAA,EAMS,UAAA;AAAA,UALP,MAAK;AAAA,UACL,OAAM;AAAA,UACL,SAAKS,uBAAEH,EAAA,MAAK,MAAA;AAAA,QAAA,GACd,UAED;AAAA,MAAA,CAAA;AAAA;;;;;;;;;;;AChBR,UAAMvB,IAAQC,GAIRkC,IAAOC,GAEP,EAAE,iBAAAqL,GAAiB,MAAA5B,GAAM,SAAA6B,EAAA,IAAYlD,GAAA,6EAE5B,MAAM;AACnB,MAAArI,EAAK,kBAAkB;AAAA,IACzB;;;;;EA/C8B,OAAM;;;EAGJ,OAAM;;;SAHzBnB,EAAA,mBAAAH,EAAA,GAAXC,EAEM,OAFNJ,IAEM;AAAA,IADJY,EAAwCC,EAAA,QAAA,WAAA;AAAA,MAAjC,MAAMP,EAAA;AAAA,MAAO,SAASA,EAAA;AAAA,IAAA,CAAA;AAAA,QAEfI,EAAA,gBAAAP,EAAA,GAAhBC,EAmBM,OAnBNH,IAmBM;AAAA,IAlBJW,EAiBOC,EAAA,QAAA,YAAA,EAjBgB,QAAQP,EAAA,OAAA,GAA/B,MAiBO;AAAA,MAhBLK,EAAA,4BAAA;AAAA,MACAJ,EAcM,OAAA,EAdD,OAAM,mBAAA,GAAkB;AAAA,QAAAS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA8L,GAAA,qiBAAA,CAAA;AAAA,QAQ3BvM,EAKS,UAAA;AAAA,UAJN,SAAOD,EAAA;AAAA,UACR,OAAM;AAAA,QAAA,GACP,WAED;AAAA,MAAA,CAAA;AAAA;;;;;;;;;;;ACgCR,UAAMhB,IAAQC,GAIRkC,IAAOC,GAEP,EAAE,iBAAAqL,GAAiB,WAAAE,GAAW,MAAA9B,GAAM,SAAA6B,EAAA,IAAYlD,GAAA,2FAEvC,MAAM;AACnB,MAAArI,EAAK,iBAAiB;AAAA,IACxB,WAEe,MAAM;AACnB,MAAAA,EAAK,iBAAiB;AAAA,IACxB;;;;;EAjE6C,OAAM;;;EAGA,OAAM;GAG9CjB,KAAA,EAAA,OAAM,mBAAA,GAONC,KAAA,EAAA,OAAM,wBAAA;;EAUY,OAAM;;;AAvBrB,SAAA,CAAAH,EAAA,mBAAe,CAAKA,EAAA,aAAAH,KAAhCC,EAEM,OAFNJ,IAEM;AAAA,IADJY,EAA0CC,EAAA,QAAA,WAAA;AAAA,MAAnC,QAAQP,EAAA;AAAA,MAAS,QAAQA,EAAA;AAAA,IAAA,CAAA;AAAA,QAElBI,EAAA,gBAAgBJ,EAAA,mBAAAH,KAAhCC,EAmBM,OAnBNH,IAmBM;AAAA,IAlBJW,EAiBOC,EAAA,QAAA,YAAA;AAAA,MAjBgB,MAAMP,EAAA;AAAA,MAAO,SAASA,EAAA;AAAA,IAAA,GAA7C,MAiBO;AAAA,MAhBLK,EAAA,gDAAA;AAAA,MACAJ,EAcM,OAdNC,IAcM;AAAA,QAAAQ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAbJT;AAAAA,UAIM;AAAA,UAAA,EAJD,OAAM,sFAAA;AAAA,UAAqF;AAAA,YAC9FA,EAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAA2B,MAAK;AAAA,cAAO,QAAO;AAAA,cAAe,SAAQ;AAAA,YAAA,GAAA;AAAA,cAC9EA,EAAgJ,QAAA;AAAA,gBAA1I,kBAAe;AAAA,gBAAQ,mBAAgB;AAAA,gBAAQ,gBAAa;AAAA,gBAAI,GAAE;AAAA,cAAA,CAAA;AAAA;;;;;QAG5ES,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAT;AAAAA,UAA8E;AAAA,UAAA,EAA1E,OAAM,8CAAA;AAAA,UAA8C;AAAA,UAAiB;AAAA;AAAA,QAAA;AAAA,QACzEA;AAAAA,UAAqF;AAAA,UAArFE;AAAA,UAAiC,mCAA8BY,EAAGf,EAAA,MAAM,KAAK,IAAG;AAAA,UAAC;AAAA;AAAA,QAAA;AAAA,QACjFC,EAKS,UAAA;AAAA,UAJN,SAAKS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,IAAAkM,MAAE5M,EAAA,WAAAA,EAAA,QAAA,GAAA4M,CAAA;AAAA,UACR,OAAM;AAAA,QAAA,GACP,YAED;AAAA,MAAA,CAAA;AAAA;QAIU5M,EAAA,aAAAH,EAAA,GAAhBC,EAaM,OAbNF,IAaM;AAAA,IAZJU,EAWOC,yBAXP,MAWO;AAAA,MAVLF,EAAA,yBAAA;AAAA,MAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA8L,GAAA,gjBAAA,CAAA;AAAA;;;;;;;;;;;;;;;ACzBJ,SAAA3M,EAAA,GAAAC;AAAAA,IAsBM;AAAA,IAAA;AAAA,MArBJ,SAAQ;AAAA,MACR,OAAM;AAAA,MACL,OAAKC,EAAEK,EAAA,KAAK;AAAA,MACb,MAAK;AAAA,MACL,cAAW;AAAA,IAAA;AAAA;MAEXH;AAAAA,QAQI;AAAA,QAAA;AAAA,QAAA;AAAA,UAPFA,EAMO,QAAA;AAAA,YALL,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAA,EAAA,eAAA,mDAAA,eAAA,OAAA,aAAA,aAAA,MAAA,eAAA;AAAA,UAAA,GACD,UAED;AAAA,QAAA;AAAA;;;MAEFA;AAAAA,QAKI;AAAA,QAAA;AAAA,QAAA;AAAA,UAJFA,EAGE,QAAA;AAAA,YAFA,GAAE;AAAA,YACF,OAAA,EAAA,MAAA,gBAAA,aAAA,UAAA;AAAA,UAAA,CAAA;AAAA;;;;;;;;;;;;;;;;ACRR,UAAMjB,IAAQC;AAGd,IAAAkF,GAAU,MAAM;AACd,MAAA0I,GAAqB7N,EAAM,MAAM;AAAA,IACnC,CAAC,GAGD6N,GAAqB7N,EAAM,MAAM;;;;;;SAnB/BsB,EAAQC,EAAA,QAAA,SAAA;;;;;;;;;;;;;;ACiBV,UAAMvB,IAAQC,GAQR2B,IAAc;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAGAkM,IAAY3N,EAAS,MAAM,GAAGyB,EAAY5B,EAAM,IAAI,CAAC,IAAIA,EAAM,KAAK,EAAE,GACtE+N,IAAU5N,EAAS,MAAM,WAAW,GAEpC6N,IAAQ;AAAA,MACZ,KAAO,MAAMC,EAAE,KAAK;AAAA,QAClBA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,aAAa,MAAMA,EAAE,KAAK;AAAA,QACxBA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,QAAU,MAAMA,EAAE,QAAQ;AAAA,QACxB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,gBAAgB,MAAMA,EAAE,QAAQ;AAAA,QAC9B,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,SAAW,MAAMA,EAAE,KAAK;AAAA,QACtBA,EAAE,UAAU;AAAA,UACV,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,gBAAgB,MAAMA,EAAE,QAAQ;AAAA,QAC9B,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,MACD,YAAY,MAAMA,EAAE,QAAQ;AAAA,QAC1B,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,MACD,MAAQ,MAAMA,EAAE,QAAQ;AAAA,QACtB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,MAAQ,MAAMA,EAAE,QAAQ;AAAA,QACtB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,QAAU,MAAMA,EAAE,KAAK,EAAE,MAAM,kBAAkB;AAAA,QAC/CA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,QAAU,MAAMA,EAAE,QAAQ;AAAA,QACxB,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,IAAA,GAGGC,IAAgB/N,EAAS,MAAM;AACnC,YAAMgO,IAAOH,EAAMhO,EAAM,IAA0B;AACnD,aAAOmO,IAAOA,MAASF,EAAE,QAAQ,EAAE,GAAG,IAAI;AAAA,IAC5C,CAAC;;;;;cAxICnN,EAEM,OAAA;AAAA,IAFA,OAAKC,EAAEC,EAAA,SAAS;AAAA,IAAG,MAAMI,EAAA;AAAA,IAAO,QAAQA,EAAA;AAAA,IAAS,SAASJ,EAAA;AAAA,IAAU,eAAaI,EAAA;AAAA,EAAA,GAAA;AAAA,KACrFP,EAAA,GAAA4C,EAAiCC,GAAjB1C,EAAA,aAAa,CAAA;AAAA,EAAA,GAAA,IAAAN,EAAA;;uKCDpB0N,KAAe,CAACpG,MACR,6BACD,KAAKA,CAAK,GAIjBqG,KAAmB,CAACpG,MAI5B;AACH,QAAMwD,IAAmB,CAAA;AACzB,MAAI3C,IAAQ;AAEZ,EAAIb,EAAS,SAAS,IACpBwD,EAAO,KAAK,6CAA6C,IAEzD3C,KAAS,GAGN,QAAQ,KAAKb,CAAQ,IAGxBa,KAAS,IAFT2C,EAAO,KAAK,qDAAqD,GAK9D,QAAQ,KAAKxD,CAAQ,IAGxBa,KAAS,IAFT2C,EAAO,KAAK,qDAAqD,GAK9D,KAAK,KAAKxD,CAAQ,IAGrBa,KAAS,IAFT2C,EAAO,KAAK,2CAA2C,GAKpD,yBAAyB,KAAKxD,CAAQ,IAGzCa,KAAS,IAFT2C,EAAO,KAAK,sDAAsD;AAKpE,QAAM6C,IAAU7C,EAAO,WAAW;AAClC,MAAI8C,IAAyC;AAE7C,SAAIzF,KAAS,IACXyF,IAAW,WACFzF,KAAS,MAClByF,IAAW,WAGN,EAAE,SAAAD,GAAS,UAAAC,GAAU,QAAA9C,EAAA;AAC9B,GAGa+C,KAAc,CAACC,MACnBA,EAAK,OAAO,UAAU,GAIlBC,KAAe,CAACC,MACR,yBACD,KAAKA,EAAM,QAAQ,eAAe,EAAE,CAAC,GAI5CC,KAAa,CAAC1K,MAClBA,EAAM,OAAO,SAAS,GAIlB2K,KAAiB,CAAC5G,GAAkB6G,MACxC7G,MAAa6G,GAITlD,KAAc,CAAC1D,GAAoBC,MAA8B;AAC5E,QAAM4G,IAAQ7G,GAAW,OAAO,CAAC,EAAE,iBAAiB,IAC9C8G,IAAO7G,GAAU,OAAO,CAAC,EAAE,iBAAiB;AAClD,SAAO4G,IAAQC,KAAQ;AACzB,GAGaC,KAAa,CAACC,OACf,OAAOA,KAAS,WAAW,IAAI,KAAKA,CAAI,IAAIA,GAC7C,mBAAmB,SAAS;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,CACN,GAIUC,KAAW,CACtBC,GACAC,MACuC;AACvC,MAAIC;AACJ,SAAO,IAAI1B,MAAwB;AACjC,iBAAa0B,CAAO,GACpBA,IAAU,WAAW,MAAMF,EAAK,GAAGxB,CAAI,GAAGyB,CAAI;AAAA,EAChD;AACF;"}
|