@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.cjs.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":"4bAwCA,MAAMA,EAAQC,EASRC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAc,CAAC,uBAAuB,EAEtCC,EAAiB,CACrB,QAAS,8CACT,MAAO,wCACP,QAAS,iDACT,KAAM,0CAAA,EAGR,MAAO,CACL,GAAGD,EACHC,EAAeL,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACZ,CAAC,EAEKM,EAAeH,EAAAA,SAAS,IAQrB,CACL,2BARqB,CACrB,QAAS,iBACT,MAAO,eACP,QAAS,kBACT,KAAM,eAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKO,EAAiBJ,EAAAA,SAAS,IAQvB,CACL,UARqB,CACrB,QAAS,iBACT,MAAO,eACP,QAAS,kBACT,KAAM,eAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKQ,EAAiBL,EAAAA,SAAS,IAQvB,CACL,2GARqB,CACrB,QAAS,sCACT,MAAO,kCACP,QAAS,wCACT,KAAM,mCAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKS,EAAWN,EAAAA,SAAS,KACV,CACZ,QAAS,wIACT,MAAO,0NACP,QAAS,oNACT,KAAM,kIAAA,GAGKH,EAAM,OAAO,CAC3B,8OAlHQU,EAAA,CAAA,MAAM,kBAAA,EACJC,EAAA,CAAA,MAAM,eAAA,KACJ,MAAM,UAAU,KAAK,eAAe,QAAQ,YAAY,cAAY,gBAKtEC,EAAA,CAAA,MAAM,aAAA,WAOa,MAAM,yCAflC,OAAAC,EAAAA,UAAA,EAAAC,EAAAA,mBA0BM,MAAA,CA1BA,MAAKC,EAAAA,eAAEC,EAAA,YAAY,EAAE,KAAK,OAAA,GAC9BC,EAAAA,mBAwBM,MAxBNP,EAwBM,CAvBJO,EAAAA,mBAIM,MAJNN,EAIM,EAAAE,EAAAA,YAHJC,EAAAA,mBAEM,MAFNI,EAEM,CADJD,EAAAA,mBAA8D,OAAA,CAAxD,YAAU,UAAW,EAAGD,EAAA,SAAU,YAAU,SAAA,EAAA,KAAA,EAAAG,CAAA,OAItDF,EAAAA,mBAKM,MALNL,EAKM,CAJMQ,EAAA,OAAAP,EAAAA,UAAA,EAAVC,EAAAA,mBAAuD,KAAA,CAAA,IAAA,EAArC,MAAKC,EAAAA,eAAEC,EAAA,YAAY,CAAA,oBAAKI,EAAA,KAAK,EAAA,CAAA,GAAAC,EAAAA,mBAAA,OAAA,EAAA,EAC/CJ,EAAAA,mBAEM,MAAA,CAFA,MAAKF,EAAAA,eAAEC,EAAA,cAAc,CAAA,GACzBM,EAAAA,WAA0BC,sBAA1B,IAA0B,CAAAC,EAAAA,kCAAjBJ,EAAA,OAAO,EAAA,CAAA,CAAA,CAAA,QAITA,EAAA,aAAAP,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATNW,EASM,CARJR,EAAAA,mBAOS,SAAA,CAPD,KAAK,SAAU,MAAKF,EAAAA,eAAEC,EAAA,cAAc,EAAG,QAAKU,eAAEH,EAAA,MAAK,SAAA,EAAA,eACzDN,EAAAA,mBAAoC,OAAA,CAA9B,MAAM,SAAA,EAAU,UAAO,EAAA,EAC7BA,EAAAA,mBAIM,MAAA,CAJD,MAAM,UAAU,KAAK,eAAe,QAAQ,WAAA,GAC/CA,EAAAA,mBAEwB,OAAA,CAFlB,YAAU,UACd,EAAE,qMACF,YAAU,SAAA,CAAA,slBCQxB,MAAMjB,EAAQC,EAaR0B,EAAgBxB,EAAAA,SAAS,IAAM,CACnC,MAAMC,EAAc,CAClB,4OAAA,EAIIwB,EAAc,CAClB,GAAI,+BACJ,GAAI,iCACJ,GAAI,gCAAA,EAIAvB,EAAiB,CACrB,QAAS,2DACT,UAAW,8CACX,MAAO,8DACP,QAAS,kFAAA,EAILwB,EAAe7B,EAAM,UAAY,SAAW,GAElD,MAAO,CACL,GAAGI,EACHwB,EAAY5B,EAAM,IAAI,EACtBK,EAAeL,EAAM,OAAO,EAC5B6B,CAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,+IAtEwB,MAAM,oDAQd,MAAM,wFATrBf,EAAAA,mBAaS,SAAA,CAbA,KAAMM,EAAA,KAAO,SAAUA,EAAA,UAAYA,EAAA,QAAU,MAAKL,EAAAA,eAAEC,EAAA,aAAa,EAAG,QAAKU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,QAAUO,CAAM,EAAA,EAAA,CAC3FV,EAAA,SAAAP,EAAAA,UAAA,EAAZC,EAAAA,mBAOO,OAPPH,GAOO,CAAAe,EAAA,CAAA,IAAAA,EAAA,CAAA,EANLT,EAAAA,mBAIM,MAAA,CAJD,MAAM,uBAAuB,KAAK,OAAO,QAAQ,WAAA,GACpDA,EAAAA,mBAA2F,SAAA,CAAnF,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,OAAO,eAAe,eAAa,GAAA,CAAA,EACrFA,EAAAA,mBAC4H,OAAA,CADtH,MAAM,aAAa,KAAK,eAC5B,EAAE,qHAAA,CAAA,QAENA,EAAAA,mBAA8C,OAAA,KAAAc,kBAArCX,EAAA,aAAW,YAAA,EAAA,CAAA,CAAA,CAAA,IAAAP,EAAAA,UAAA,EAEtBC,qBAGO,OAHPI,GAGO,CAFLI,aAAoBC,EAAA,OAAA,MAAA,EACpBD,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,0WCad,MAAMvB,EAAQC,EAMR+B,EAAc7B,EAAAA,SAAS,IAAM,CACjC,MAAMC,EAAc,CAAC,iCAAiC,EAGhDC,EAAiB,CACrB,QAAS,aACT,OAAQ,+BACR,QAAS,YAAA,EAIL4B,EAAiB,CACrB,GAAI,MACJ,GAAI,MACJ,GAAI,KAAA,EAIAC,EAAgB,CACpB,KAAM,GACN,GAAI,YACJ,GAAI,YACJ,GAAI,WAAA,EAGN,MAAO,CACL,GAAG9B,EACHC,EAAeL,EAAM,OAAO,EAC5BiC,EAAejC,EAAM,OAAO,EAC5BkC,EAAclC,EAAM,MAAM,CAAA,EAC1B,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,sHA5DgC,MAAM,sCAI9BW,GAAA,CAAA,MAAM,WAAA,YAIkB,MAAM,+DATrC,OAAAE,EAAAA,UAAA,EAAAC,EAAAA,mBAYM,MAAA,CAZA,MAAKC,EAAAA,eAAEC,EAAA,WAAW,CAAA,GACXO,EAAA,OAAM,QAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAAsBC,EAAA,OAAA,QAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,EAGxBJ,EAAAA,mBAEM,MAFNN,GAEM,CADJW,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,EAGCA,EAAA,OAAM,QAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNI,GAEM,CADJI,aAAsBC,EAAA,OAAA,QAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,qoBC4C5B,MAAMrB,EAAQC,EAKRkC,EAAOC,EAMPC,EAAQC,EAAAA,SAAA,EACRC,EAAeC,EAAAA,IAAI,EAAK,EACxBC,EAAUD,EAAAA,IAAI,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EAAE,EAEhEE,EAAevC,EAAAA,SAAS,IACxBH,EAAM,OAAS,WACVuC,EAAa,MAAQ,OAAS,WAEhCvC,EAAM,IACd,EAEK2C,EAAexC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAc,CAClB,wMAAA,EAIIwB,EAAc,CAClB,GAAI,oBACJ,GAAI,sBACJ,GAAI,qBAAA,EAIAgB,EAAe5C,EAAM,MACvB,yEACA,GAGE6C,EAAcR,EAAM,KAAU,QAAU,GACxCS,EAAkB9C,EAAM,OAAS,WAAa,QAAU,GAE9D,MAAO,CACL,GAAGI,EACHwB,EAAY5B,EAAM,IAAI,EACtB4C,EACAC,EACAC,CAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,+FAEoBC,GAAiB,CACpC,MAAMC,EAASD,EAAM,OACrBZ,EAAK,oBAAqBa,EAAO,KAAK,CACxC,2BAEiC,IAAM,CACrCT,EAAa,MAAQ,CAACA,EAAa,KACrC,mFAjHO7B,GAAA,CAAA,MAAM,WAAA,uBAGe,MAAM,gBAGzBS,GAAA,CAAA,MAAM,UAAA,wFASkB,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,uBAIvE,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,uBAQ7C,MAAM,kFAMnB,MAAM,kCACE,MAAM,kDAlChC,OAAAN,YAAA,EAAAC,qBAmCM,MAnCNJ,GAmCM,CAlCSU,uBAAbN,EAAAA,mBAGQ,QAAA,CAAA,IAAA,EAHa,IAAKE,EAAA,QAAS,MAAM,yCAAA,EAAA,mBACpCe,kBAAAX,EAAA,KAAK,EAAG,IACX,CAAA,EAAYA,EAAA,UAAAP,YAAA,EAAZC,qBAAmD,OAAnDI,GAA2C,GAAC,GAAAG,qBAAA,OAAA,EAAA,0CAG9CJ,EAAAA,mBAwBM,MAxBNE,GAwBM,CAvBJF,EAAAA,mBAEkE,QAAA,CAF1D,GAAID,EAAA,QAAU,KAAMA,EAAA,aAAe,MAAOI,EAAA,WAAa,YAAaA,EAAA,YAAc,SAAUA,EAAA,SACjG,SAAUA,EAAA,SAAW,aAAcA,EAAA,aAAe,MAAKL,EAAAA,eAAEC,EAAA,YAAY,EAAG,QAAOA,EAAA,YAC/E,OAAIU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,OAASO,CAAM,GAAI,QAAKJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,QAAUO,CAAM,EAAA,EAAA,KAAA,GAAAlB,EAAA,EAE7DS,EAAAA,mBAAA,8BAAA,EACcD,EAAA,OAAI,0BAAlBN,EAAAA,mBAYS,SAAA,CAAA,IAAA,EAZ0B,KAAK,SACtC,MAAM,4MACL,QAAOE,EAAA,wBAAA,EAAA,CACGA,EAAA,cAAAH,YAAA,EAAXC,EAAAA,mBAGM,MAHNW,GAGMC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBAC4L,OAAA,CADtL,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAChE,EAAE,qLAAA,UAEN,EAAA,IAAAJ,EAAAA,YAAAC,EAAAA,mBAIM,MAJNmC,GAIMvB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAHJT,EAAAA,mBAA6G,OAAA,CAAvG,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kCAAA,WACxEA,EAAAA,mBACgI,OAAA,CAD1H,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAChE,EAAE,yHAAA,kDAIRI,EAAAA,mBAAA,aAAA,EACWE,EAAA,OAAM,MAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNoC,GAEM,CADJ5B,aAAoBC,EAAA,OAAA,MAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,IAIxBA,EAAAA,mBAAA,8BAAA,EACSD,EAAA,OAAAP,EAAAA,UAAA,EAATC,EAAAA,mBAA4D,IAA5DqC,GAA4DpB,EAAAA,gBAAZX,EAAA,KAAK,EAAA,CAAA,GACvCA,EAAA,UAAAP,EAAAA,UAAA,EAAdC,EAAAA,mBAAwE,IAAxEsC,GAAwErB,EAAAA,gBAAfX,EAAA,QAAQ,EAAA,CAAA,GAAAC,EAAAA,mBAAA,OAAA,EAAA,2eCjBrE,MAAMrB,EAAQC,EAORkC,EAAOC,EAIPiB,EAAMlD,EAAAA,SAAS,IACfH,EAAM,GAAW,cACjBA,EAAM,KAAa,IAChB,QACR,EAEKsD,EAAYnD,EAAAA,SAAS,IAAM,CAC/B,MAAMoD,EAAiC,CAAA,EAEvC,OAAIvD,EAAM,GACRuD,EAAU,GAAQvD,EAAM,GACfA,EAAM,MACfuD,EAAU,KAAUvD,EAAM,KACtBA,EAAM,WACRuD,EAAU,OAAY,SACtBA,EAAU,IAAS,wBAGrBA,EAAU,KAAU,SAGlBvD,EAAM,WACRuD,EAAU,SAAc,GACxBA,EAAU,eAAe,EAAI,IAGxBA,CACT,CAAC,EAEKC,EAAcrD,EAAAA,SAAS,IAAM,CACjC,MAAMC,EAAc,CAClB,gOAAA,EAIIwB,EAAc,CAClB,GAAI,UACJ,GAAI,UACJ,GAAI,WAAA,EAIAvB,EAAiB,CACrB,QAAS,0CACT,UAAW,oCACX,MAAO,wEACP,UAAW,6FAAA,EAGb,MAAO,CACL,GAAGD,EACHwB,EAAY5B,EAAM,IAAI,EACtBK,EAAeL,EAAM,OAAO,CAAA,EAC5B,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,gEAEoB+C,GAAsB,CACpC/C,EAAM,UACTmC,EAAK,QAASY,CAAK,CAEvB,iIAxFEU,cAEYC,EAAAA,wBAFI1C,EAAA,GAAG,EAAnB2C,EAAAA,WAEY,CAFU,MAAO3C,EAAA,WAAA,EAAqBA,EAAA,UAAS,CAAG,QAAOA,EAAA,WAAA,CAAW,EAAA,CAAA,QAAA4C,EAAAA,QAC9E,IAAQ,CAARtC,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,uUCuCZ,MAAMvB,EAAQC,EACRkC,EAAOC,EAEPyB,EAAarB,EAAAA,IAAmB,EAAE,EAClCsB,EAAiBtB,EAAAA,IAAI,CACzB,MAAO,MACP,KAAM,MACN,QAAS,GAAA,CACV,EAED,IAAIuB,EAAkB,GAClBC,EAAc,GAElB,MAAMC,EAAiB,MAAOC,EAAeC,IAAkB,CACzDH,IAEJ7B,EAAK,oBAAqB+B,CAAK,EAC/B,MAAME,WAAA,EACNC,EAAwBF,CAAK,EAC/B,EAEME,EAA0B,MAAOC,GAAqB,CAC1D,GAAI,CAACT,EAAW,MAAMS,CAAQ,GAAKA,IAAaP,EAAiB,OAEjEC,EAAc,GACd,MAAMO,EAASV,EAAW,MAAMS,CAAQ,EAClCE,EAAYD,EAAO,cAEzB,GAAI,CAACC,EAAW,OAEhB,MAAMC,EAAUF,EAAO,sBAAA,EACjBG,EAAgBF,EAAU,sBAAA,EAC1BG,EAAUF,EAAQ,KAAOC,EAAc,KACvCE,EAAWH,EAAQ,MAEzB,GAAIV,IAAoB,GAAI,CAE1BD,EAAe,MAAQ,CACrB,MAAO,GAAGc,CAAQ,KAClB,KAAM,GAAGD,CAAO,KAChB,QAAS,GAAA,EAEXZ,EAAkBO,EAClBN,EAAc,GACd,MACF,CAGA,MAAMa,EADahB,EAAW,MAAME,CAAe,EACpB,sBAAA,EACzBe,EAAcD,EAAY,KAAOH,EAAc,KAC/CK,EAAeF,EAAY,MAG3BG,EAAgBV,EAAWP,EAC3BkB,EAAcD,EAAgBF,EAAcH,EAC5CO,EAAeF,EAChBL,EAAUC,EAAYE,EACtBA,EAAcC,EAAgBJ,EAGnCb,EAAe,MAAQ,CACrB,MAAO,GAAGoB,CAAY,KACtB,KAAM,GAAGD,CAAW,KACpB,QAAS,GAAA,EAIX,WAAW,IAAM,CACfnB,EAAe,MAAQ,CACrB,MAAO,GAAGc,CAAQ,KAClB,KAAM,GAAGD,CAAO,KAChB,QAAS,GAAA,EAEXZ,EAAkBO,EAClB,WAAW,IAAM,CACfN,EAAc,EAChB,EAAG,GAAG,CACR,EAAG,GAAG,CACR,EAGAmB,EAAAA,UAAU,SAAY,CACpB,MAAMf,WAAA,EACN,MAAMgB,EAAcpF,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,EAC1EoF,IAAgB,IAClBf,EAAwBe,CAAW,CAEvC,CAAC,EAGD,MAAME,EAAiBnF,EAAAA,SAAS,IAC9BH,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,CAAA,EAItD,CAAE,WAAAuF,CAAA,EAAeC,EAAAA,OAAOxF,CAAK,EACnCyF,EAAAA,MAAMF,EAAY,SAAY,CAC5B,MAAMnB,WAAA,EACN,MAAMgB,EAAcpF,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,EAC1EoF,IAAgB,IAClBf,EAAwBe,CAAW,CAEvC,CAAC,kUA9IM1E,GAAA,CAAA,MAAM,UAAA,MAEJ,MAAM,4CAA4C,KAAK,wFAF9D,OAAAG,YAAA,EAAAC,qBAoBM,MApBNJ,GAoBM,CAnBJW,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAiBM,MAjBNN,GAiBM,EAAAE,EAAAA,UAAA,EAAA,EAhBJC,EAAAA,mBAUS4E,EAAAA,SAAA,KAAAC,EAAAA,WAVsBvE,EAAA,KAAI,CAAnBiE,EAAKlB,mBAArBrD,EAAAA,mBAUS,SAAA,CAV6B,IAAKuE,EAAI,MAAA,QAAA,GAAO,IAAI,aAAc,MAAKtE,EAAAA,eAAA,CAAA,qPAA4RC,EAAA,aAAeqE,EAAI,MAAA,mBAAA,qBAOxX,gBAAerE,eAAeqE,EAAI,MAAQ,gBAAa,YAAcA,EAAI,KAAK,GAAK,GAAE,OAASA,EAAI,KAAK,GACzG,KAAK,MAAO,QAAKvD,GAAEd,EAAA,eAAeqE,EAAI,MAAOlB,CAAK,CAAA,EAAApC,EAAAA,gBAC/CsD,EAAI,KAAK,EAAA,GAAAnE,EAAA,EAAA,QAGdG,EAAAA,mBAAA,iCAAA,EACAJ,EAAAA,mBAE4B,MAAA,CAD1B,MAAM,kIACL,MAAK2E,EAAAA,eAAE5E,EAAA,cAAc,CAAA,oJCnB9B6E,GAAe,ujvDCCRnF,GAAA,CAAA,MAAM,oFAAoF,mBAA/F,OAAAG,EAAAA,UAAA,EAAAC,EAAAA,mBAEM,MAFNJ,GAEMgB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAAyE,MAAA,CAApE,IAAA4E,GAA8C,MAAM,uLCwCtD,SAASC,EAAkBC,EAAoC,GAAI,CACxE,KAAM,CAAE,OAAAC,CAAA,EAAWC,mBAAA,EAEbC,EAAY1D,EAAAA,IAAqB,EAAE,EACnC2D,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAmB,IAAI,EAE/B6D,EAAmBlG,EAAAA,SAAS,IAChC+F,EAAU,MAAM,OAAOI,GAAYA,EAAS,OAAO,CAAA,EAG/CC,EAAiB,SAAY,CACjCJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KAEd,GAAI,CACF,MAAMI,EAAW,MAAM,MAAMR,EAAO,gBAAgB,EAAG,CACrD,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,CAClB,CACD,EAED,GAAI,CAACQ,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAiC,MAAMF,EAAS,KAAA,EAEtD,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,iCAAiC,EAG5ER,EAAU,MAAQQ,EAAO,MAAQ,CAAA,CACnC,OAASC,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,kCAC1DP,EAAM,MAAQQ,CAChB,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,EAEMU,EAAqB,MACzBC,EACAC,IACoB,CACpB,MAAMC,EAAgB,CAAE,GAAGjB,EAAS,GAAGgB,CAAA,EAGjCE,EAAS,IAAI,gBAEfD,EAAc,aAChBC,EAAO,OAAO,eAAgBD,EAAc,WAAW,EAGrDA,EAAc,QAAUA,EAAc,OAAO,OAAS,GACxDC,EAAO,OAAO,SAAUD,EAAc,OAAO,KAAK,GAAG,CAAC,EAGxD,MAAME,EAAcD,EAAO,SAAA,EACrBE,EAAcnB,EAAO,eAAe,EAAE,QAAQ,gBAAiBc,CAAU,EACzEM,EAAUF,EAAc,GAAGC,CAAW,IAAID,CAAW,GAAKC,EAEhE,GAAI,CACF,MAAMX,EAAW,MAAM,MAAMY,EAAS,CACpC,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,CAClB,CACD,EAED,GAAI,CAACZ,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAuC,MAAMF,EAAS,KAAA,EAE5D,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,8BAA8B,EAGzE,OAAOA,EAAO,KAAK,OACrB,OAASC,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,+BAC1D,MAAM,IAAI,MAAMC,CAAY,CAC9B,CACF,EAEMS,EAAqB,MACzBP,EACAC,IACG,CACH,GAAI,CACF,MAAMO,EAAU,MAAMT,EAAmBC,EAAYC,CAAa,EAClE,OAAO,SAAS,KAAOO,CACzB,OAASX,EAAK,CACZ,MAAAP,EAAM,MAAQO,aAAe,MAAQA,EAAI,QAAU,uCAC7CA,CACR,CACF,EAEMY,EAAmBT,GAChBZ,EAAU,MAAM,KAAKI,GAAYA,EAAS,KAAOQ,CAAU,EAG9DU,EAAmBlB,GAAoC,CAE3D,GAAIA,EAAS,QACX,OAAOA,EAAS,QAIlB,OAAQA,EAAS,GAAG,YAAA,EAAY,CAC9B,IAAK,SACH,MAAO,63BACT,IAAK,SACH,MAAO,6iCACT,IAAK,YACL,IAAK,QACH,MAAO,6VACT,IAAK,UACH,MAAO,izBACT,QAEE,MAAO,oSAAA,CAEb,EAEA,MAAO,CACL,UAAWnG,EAAAA,SAAS,IAAM+F,EAAU,KAAK,EACzC,iBAAAG,EACA,QAASlG,EAAAA,SAAS,IAAMgG,EAAQ,KAAK,EACrC,MAAOhG,EAAAA,SAAS,IAAMiG,EAAM,KAAK,EACjC,eAAAG,EACA,mBAAAM,EACA,mBAAAQ,EACA,gBAAAE,EACA,gBAAAC,CAAA,CAEJ,6SCJA,MAAMxH,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA4D,CAAA,EAAWC,mBAAiBjG,EAAM,MAAM,EAG1C,CACJ,iBAAAqG,EACA,QAASoB,EACT,MAAOC,EACP,eAAAnB,EACA,mBAAAc,EACA,gBAAAG,CAAA,EACE1B,EAAkB,CACpB,YAAa9F,EAAM,WAAA,CACpB,EAGDmF,EAAAA,UAAU,IAAM,CACdoB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAGD,MAAMgB,EAAmBxH,EAAAA,SAAS,IAEzBkG,EAAiB,KACzB,EAGKuB,EAAU,CACd,MAAM,OAAOC,EAAeC,EAAkB,CAC5C,MAAMtB,EAAW,MAAM,MAAMR,EAAO,QAAQ,EAAG,CAC7C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAE,MAAA6B,EAAO,SAAAC,EAAU,CAAA,CACzC,EAED,GAAI,CAACtB,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAS,MAAMF,EAAS,KAAA,EAC9B,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,gBAAgB,EAG3D,OAAOA,EAAO,IAChB,EAEA,MAAM,OAAOmB,EAAeC,EAAkBC,EAAmBC,EAAkB,CACjF,MAAMxB,EAAW,MAAM,MAAMR,EAAO,QAAQ,EAAG,CAC7C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAE,MAAA6B,EAAO,SAAAC,EAAU,UAAAC,EAAW,SAAAC,EAAU,CAAA,CAC9D,EAED,GAAI,CAACxB,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAS,MAAMF,EAAS,KAAA,EAC9B,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,gBAAgB,EAG3D,OAAOA,EAAO,IAChB,EAEA,MAAM,qBAAqBmB,EAAe,CAGxC,MAAM,IAAI,MAAM,yFAAyF,CAuB3G,CAAA,EAGII,EAAczF,EAAAA,IAAIxC,EAAM,IAAI,EAC5BmG,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAI,EAAE,EACd0F,EAA2B1F,EAAAA,IAAI,EAAK,EAEpC2F,EAAOC,EAAAA,SAAS,CACpB,UAAW,GACX,SAAU,GACV,MAAO,GACP,SAAU,GACV,gBAAiB,EAAA,CAClB,EAEKC,EAAWlI,EAAAA,SAAS,IAAM8H,EAAY,QAAU,QAAQ,EACxDK,EAAkBnI,EAAAA,SAAS,IAAM8H,EAAY,QAAU,gBAAgB,EAEvEM,EAAkBpI,EAAAA,SAAS,IACxBgI,EAAK,WAAaA,EAAK,eAC/B,EAEKK,EAAcrI,EAAAA,SAAS,IACvBmI,EAAgB,MACXH,EAAK,MAAM,KAAA,GAAU,CAACD,EAAyB,MAGpDG,EAAS,MACJF,EAAK,MAAM,KAAA,EAGbA,EAAK,MAAM,KAAA,GAAUA,EAAK,QAClC,EAGKM,EAA4B,CAChC,KAAM,CACJ,MAAO,OACP,MAAO,iBACP,QAAS,aACT,UAAW,eACX,MAAO,EAAA,EAET,OAAQ,CACN,MAAO,SACP,MAAO,oBACP,QAAS,gBACT,UAAW,kBACX,MAAO,EAAA,EAET,OAAQ,CACN,MAAO,SACP,MAAO,qBACP,QAAS,iBACT,UAAW,mBACX,MAAO,GAAA,CACT,EAGIC,EAAuBZ,GAAqB,CAChD,IAAIa,EAAQ,EAERb,EAAS,QAAU,IAAGa,GAAS,GAC/Bb,EAAS,QAAU,KAAIa,GAAS,GAChC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,eAAe,KAAKb,CAAQ,IAAGa,GAAS,GAE5C,MAAMC,EAASD,GAAS,EAAIF,EAA0B,KAClDE,GAAS,EAAIF,EAA0B,OACvCA,EAA0B,OAE9B,MAAO,CAAE,MAAAE,EAAO,GAAGC,CAAA,CACrB,EAEMC,EAAa,SAAY,CAC7B1C,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CACF,GAAIkC,EAAgB,MAElB,MAAMV,EAAQ,qBAAqBO,EAAK,KAAK,EAC7CD,EAAyB,MAAQ,GACjC/F,EAAK,sBAAuBgG,EAAK,KAAK,UAC7BE,EAAS,MAAO,CAEzB,MAAM7B,EAAW,MAAMoB,EAAQ,OAC7BO,EAAK,MACLA,EAAK,SACLA,EAAK,UACLA,EAAK,QAAA,EAEPhG,EAAK,UAAWqE,EAAS,IAAI,CAC/B,KAAO,CAEL,MAAMA,EAAW,MAAMoB,EAAQ,OAAOO,EAAK,MAAOA,EAAK,QAAQ,EAC/DhG,EAAK,UAAWqE,EAAS,IAAI,CAC/B,CACF,OAASG,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,+BAC1DP,EAAM,MAAQQ,EACdzE,EAAK,QAASyE,CAAY,CAC5B,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,EAEM2C,EAAkB,MAAOhC,GAAuB,CACpD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAa9G,EAAM,WAAA,CACpB,CACH,OAAS2G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,aAAa0B,EAAS,MAAQ,UAAY,SAAS,SAASvB,CAAU,GAChIV,EAAM,MAAQQ,EACdzE,EAAK,QAASyE,CAAY,CAC5B,CACF,EAGAnB,EAAAA,MAAM,IAAMzF,EAAM,KAAO+I,GAAY,CACnCd,EAAY,MAAQc,CACtB,CAAC,EAGDtD,QAAMwC,EAAcc,GAAY,CAC9B3C,EAAM,MAAQ,GACd8B,EAAyB,MAAQ,GAEjCC,EAAK,UAAY,GACjBA,EAAK,SAAW,GAChBA,EAAK,MAAQ,GACbA,EAAK,SAAW,GAChBA,EAAK,gBAAkB,GACvBhG,EAAK,eAAgB4G,CAAO,CAC9B,CAAC,6mBAvaMrI,GAAA,CAAA,MAAM,oDAAA,EAGFC,GAAA,CAAA,MAAM,kBAAA,MAiBoB,IAAI,OAAO,MAAM,YAUW,IAAI,QAAQ,MAAM,kBAUlEC,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,aAKnEuC,GAAA,CAAA,MAAM,sEAAA,EACVC,GAAA,CAAA,MAAM,wCAAA,EAGV4F,GAAA,CAAA,MAAM,aAAA,MASyC,IAAI,UAAU,MAAM,qBACrEC,GAAA,CAAA,MAAM,cAAA,EAMTC,GAAA,CAAA,MAAM,WAAA,EAOmCC,GAAA,CAAA,IAAI,kBAAA,EACvCC,GAAA,CAAA,MAAM,wCAAA,MAqCW,IAAI,YAAY,MAAM,oBAe/CC,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,2BA9If,OAAAzI,YAAA,EAAAC,qBAyJM,MAzJNJ,GAyJM,CAxJJ6I,EAAAA,YAuJSvI,EAAA,OAAA,CAvJD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EACAJ,EAAAA,mBAaM,MAbNN,GAaM,CAZJ4I,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,OAAO,KAAK,QAAA,EAAA,mBAC3B,IAEK,EAAA3I,EAAAA,UAAA,EAFLC,EAAAA,mBAEK,KAAA,CAFA,IAAKE,EAAA,YAAa,MAAM,uCAAA,EACxBe,EAAAA,gBAAAf,EAAA,gBAAe,iBAAsBA,EAAA,SAAQ,iBAAA,cAAA,EAAA,CAAA,EAAA,CAAA,QAGpDuI,EAAAA,YAMaC,EAAAA,WAAA,CAND,KAAK,OAAO,KAAK,QAAA,EAAA,mBAC3B,IAII,EAAA3I,EAAAA,UAAA,EAJJC,EAAAA,mBAII,IAAA,CAJA,IAAKE,EAAA,YAAa,MAAM,kBAAA,EACvBe,EAAAA,gBAAAf,EAAA,gBAAe,4EAAkFA,EAAA,SAAA,6CAAA,qCAAA,gBAO1GK,EAAAA,mBAAA,8CAAA,EACAkI,EAAAA,YAOaC,EAAAA,WAAA,CAPD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAKM,CALMxI,EAAA,iDAAAH,EAAAA,UAAA,EAAZC,EAAAA,mBAKM,MALNI,GAKM,CAJJqI,cAGKvI,EAAA,OAAA,CAAA,WAHYA,EAAA,YAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAAd,EAAA,YAAWc,GAAG,KAAM,CAAA,CAAA,MAAA,UAAA,MAAA,QAAA,uEAOzCT,EAAAA,mBAAA,kDAAA,EACAkI,EAAAA,YAyCaC,EAAAA,WAAA,CAzCD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAuCM,CAAA,CAvCMxI,EAAA,iBAAmBA,EAAA,kBAAkB,QAAAH,EAAAA,YAAjDC,EAAAA,mBAuCM,MAvCNK,GAuCM,EAAAN,EAAAA,UAAA,EAAA,EAtCJC,EAAAA,mBAqCW4E,EAAAA,SAAA,KAAAC,EAAAA,WApCU3E,EAAA,iBAAZsF,kBADT7C,EAAAA,YAqCWzC,EAAA,SAAA,CAnCR,IAAKsF,EAAS,GACf,QAAQ,UACR,aAAA,GACC,SAAUtF,EAAA,aACV,QAAKc,GAAEd,EAAA,gBAAgBsF,EAAS,EAAE,EACnC,MAAM,iBAAA,EAAA,mBAEN,IAwBM,CAxBNrF,EAAAA,mBAwBM,MAxBNL,GAwBM,CAvBJS,EAAAA,mBAAA,0BAAA,EACWiF,EAAS,SAAAzF,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNW,GAEM,CADJR,EAAAA,mBAAsG,MAAA,CAAhG,IAAKqF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAArD,EAAA,CAG5E,CAAA,GAAAqD,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAqF,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNoC,GAGM,CAAA,GAAAxB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAGjtBC,EAAAA,mBAEM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAHNrE,EAAAA,mBAAA,oCAAA,EACAJ,EAAAA,mBAEM,MAFNkC,GAEM,CADJlC,EAAAA,mBAAiI,OAAjImC,GAAiIrB,mBAAxEuE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,YAGzHrF,EAAAA,mBAEO,OAFP+H,GAA0B,kBACVjH,EAAAA,gBAAGuE,EAAS,aAAeA,EAAS,KAAK,OAAM,CAAA,EAAI,YAAA,EAAgBA,EAAS,KAAK,MAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,uFAM5GjF,EAAAA,mBAAA,0CAAA,EACAkI,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAEM,CAAA,CAFMxI,EAAA,iBAAmBA,EAAA,kBAAkB,QAAAH,EAAAA,YAAjDC,EAAAA,mBAEM,MAFN2I,GAEM,CADJxI,EAAAA,mBAA6F,OAA7FgI,GAA2B,MAAGlH,EAAAA,gBAAGf,EAAA,SAAQ,iBAAA,SAAA,EAAkC,cAAW,CAAA,CAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,UAI1FA,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAmCO,OAAA,CAnCA,SAAMyI,EAAAA,cAAU1I,EAAA,WAAU,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACvCC,EAAAA,mBAqBM,MArBNiI,GAqBM,CApBJ7H,EAAAA,mBAAA,SAAA,EACAkI,cACkFvI,EAAA,QAAA,CAAA,WADhEA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAAgB,YAAY,mBAAmB,SAAA,GAC9F,aAAa,QAAS,MAAOd,EAAA,OAAK,CAAKA,EAAA,KAAK,MAAK,oBAAA,EAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEnDK,EAAAA,mBAAA,2BAAA,EACAkI,EAAAA,YAcaC,EAAAA,WAAA,CAdD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAYM,CAAA,CAZMxI,EAAA,iBAAe,CAAKA,EAAA,UAAAH,EAAAA,YAAhCC,EAAAA,mBAYM,MAZNqI,GAYM,CAXJlI,EAAAA,mBAKM,MALNmI,GAKM,CAAA1H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAJJT,EAAAA,mBAA+D,OAAA,CAAzD,MAAM,mCAAA,EAAoC,WAAQ,EAAA,GACxDsI,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,KAAM,QAAKU,eAAEV,EAAA,YAAW,iBAAA,EAAA,mBAAqB,IAE5EU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF4E,qBAE5E,EAAA,CAAA,EAAA,iBAGF+H,cAGmEvI,EAAA,QAAA,CAAA,WAHjDA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GAAE,KAAK,WACpC,YAAY,sBAAsB,SAAA,GAClC,aAAa,mBACZ,MAAOd,EAAA,OAAK,CAAKA,EAAA,KAAK,SAAQ,uBAAA,EAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,+CAKvCuI,cAUWvI,EAAA,SAAA,CAVD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,WAAO,CAAKA,EAAA,YAAc,QAASA,EAAA,QAChG,eAAcA,EAAA,gBAAe,kBAAuBA,EAAA,SAAQ,wBAAA,eAAA,EAAA,mBAC7D,IAOE,CAAAQ,EAAAA,gBAPCO,EAAAA,gBAAAf,EAAA,gBAA+BA,EAAA,yBAAA,aAAA,kBAAuGA,EAAA,SAAA,kBAAA,SAAA,0DAW7IK,EAAAA,mBAAA,sCAAA,EACAkI,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,SAAS,KAAK,QAAA,EAAA,mBAC7B,IAEiC,CAFlBxI,EAAA,iBAAmBA,0CAAlCyC,EAAAA,YAEiCzC,EAAA,QAAA,CAF2B,IAAI,gBAAgB,QAAQ,UACrF,QAAO,0DAA4DA,EAAA,KAAK,KAAK,GAC9E,MAAM,sBAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,UAGVA,EAAAA,mBAAA,yCAAA,EACAkI,EAAAA,YASaC,EAAAA,WAAA,CATD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAOM,CAPKxI,EAAA,iBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAOM,MAPN6I,GAOM,CANJJ,cAKSvI,EAAA,OAAA,CALA,QAAKU,eAAEV,EAAA,YAAW,UAAa,MAAM,gCAAA,EAAA,mBAC5C,IAEMU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFNT,EAAAA,mBAEM,MAAA,CAFD,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GAC7DA,EAAAA,mBAA4F,OAAA,CAAtF,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,iBAAA,CAAA,yBACpE,oBAER,EAAA,CAAA,EAAA,2DAIJI,EAAAA,mBAAA,eAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPNoI,GAOM,CANJpI,EAAAA,mBAKI,IALJqI,GAKI,CAAA5H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,wdC9B9B,MAAMhB,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA4D,CAAA,EAAWC,mBAAiBjG,EAAM,MAAM,EAG1C,CACJ,iBAAAqG,EACA,QAASoB,EACT,MAAOC,EACP,eAAAnB,EACA,mBAAAc,CAAA,EACEvB,EAAkB,CACpB,YAAa9F,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,EAGDmF,EAAAA,UAAU,IAAM,CACdoB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAED,MAAMR,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAI,EAAE,EAEd2F,EAAOC,EAAAA,SAAS,CACpB,MAAO,GACP,SAAU,EAAA,CACX,wJAEoB,SAAY,CAC/BjC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CAEF,QAAQ,IAAI,mBAAoB+B,CAAI,EACpChG,EAAK,UAAW,CAAE,MAAOgG,EAAK,MAAO,CACvC,MAAc,CACZ/B,EAAM,MAAQ,4BACdjE,EAAK,QAASiE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,oBAE0B,MAAOW,GAAuB,CACtD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAa9G,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,CACH,OAAS2G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,0BAA0BG,CAAU,GAC9FV,EAAM,MAAQQ,EACdzE,EAAK,QAASyE,CAAY,CAC5B,CACF,iOAzLOlG,GAAA,CAAA,MAAM,oDAAA,YAS8B,MAAM,kBAIlCQ,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,uBAInE,MAAM,wEACVgC,GAAA,CAAA,MAAM,wCAAA,EAGVC,GAAA,CAAA,MAAM,aAAA,YAKqB,MAAM,qBAMpC6F,GAAA,CAAA,MAAM,WAAA,EAMFS,GAAA,CAAA,MAAM,wCAAA,EAsBZR,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,EASNC,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,2BAvFf,OAAAvI,YAAA,EAAAC,qBAkGM,MAlGNJ,GAkGM,CAjGJ6I,EAAAA,YAgGSvI,EAAA,OAAA,CAhGD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAmE,KAAA,CAA/D,MAAM,uCAAA,EAAwC,cAAY,EAC9DA,EAAAA,mBAAmE,IAAA,CAAhE,MAAM,kBAAA,EAAmB,qCAAmC,CAAA,OAGjEI,EAAAA,mBAAA,mBAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBA8BM,MA9BNH,GA8BM,EAAAE,EAAAA,UAAA,EAAA,EA7BJC,EAAAA,mBA4BW4E,EAAAA,SAAA,KAAAC,EAAAA,WA5BkB3E,EAAA,iBAAZsF,kBAAjB7C,EAAAA,YA4BWzC,EAAA,SAAA,CA5BqC,IAAKsF,EAAS,GAAI,QAAQ,UAAU,aAAA,GACjF,SAAUtF,EAAA,aACV,QAAKc,GAAEd,EAAA,kBAAkBsF,EAAS,EAAE,EAAG,MAAM,iBAAA,EAAA,mBAC9C,IAuBM,CAvBNrF,EAAAA,mBAuBM,MAvBNC,GAuBM,CAtBJG,EAAAA,mBAAA,0BAAA,EACWiF,EAAS,SAAAzF,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNK,GAEM,CADJF,EAAAA,mBAAsG,MAAA,CAAhG,IAAKqF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAA1F,EAAA,CAG5E,CAAA,GAAA0F,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAqF,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNW,GAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAEjtBC,EAAAA,mBAEM,MAFNmC,GAEM,CADJhC,EAAAA,mBAAiI,OAAjIiC,GAAiInB,mBAAxEuE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,KAGzHrF,EAAAA,mBAA0F,OAA1FkC,GAA0B,iBAAcpB,EAAAA,gBAAGuE,EAAS,aAAeA,EAAS,IAAI,EAAA,CAAA,CAAA,CAAA,+EAIpFjF,EAAAA,mBAAA,WAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAEM,MAFNsC,GAEM1B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAAuD,OAAA,CAAjD,MAAM,cAAA,EAAe,wBAAqB,EAAA,CAAA,EAAA,GAAAI,EAAAA,mBAAA,OAAA,EAAA,EAGlDA,EAAAA,mBAAA,uBAAA,EACAJ,EAAAA,mBAsBO,OAAA,CAtBA,SAAMyI,EAAAA,cAAU1I,EAAA,aAAY,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACzCC,EAAAA,mBAeM,MAfN+H,GAeM,CAdJO,cAE6DvI,EAAA,QAAA,CAFpD,GAAG,QAAA,WAAiBA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAC1D,YAAY,2BAA2B,aAAa,QAAQ,SAAA,GAC3D,MAAOd,QAAK,4BAAiC,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEhDC,EAAAA,mBASM,MAAA,KAAA,CARJA,EAAAA,mBAKM,MALNwI,GAKM,CAAA/H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAJJT,EAAAA,mBAAkE,OAAA,CAA5D,MAAM,sCAAA,EAAuC,WAAQ,EAAA,GAC3DsI,cAESvI,EAAA,OAAA,CAFA,QAAKU,eAAEH,EAAA,MAAK,iBAAA,GAAqB,MAAM,SAAA,EAAA,mBAAU,IAE1DG,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF0D,qBAE1D,EAAA,CAAA,EAAA,iBAEF+H,cACsGvI,EAAA,QAAA,CAD7F,GAAG,WAAA,WAAoBA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GAAE,KAAK,WAAW,YAAY,sBACzE,aAAa,mBAAmB,SAAA,GAAU,MAAOd,QAAK,4BAAiC,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,MAI7FuI,cAGWvI,EAAA,SAAA,CAHD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,EAAA,SAAO,CAAKA,EAAA,KAAK,OAAK,CAAKA,EAAA,KAAK,SAC7F,QAASA,EAAA,QAAU,eAAc,eAAA,EAAA,mBAAiB,IAErDU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFqD,YAErD,EAAA,CAAA,EAAA,8CAGFH,EAAAA,mBAAA,eAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAOM,MAPNgI,GAOM,CANJhI,EAAAA,mBAKI,IALJiI,GAKI,CAAAxH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,2BAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFA,QAAKU,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAA,mBAAsB,IAE3CG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2C,YAE3C,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPNkI,GAOM,CANJlI,EAAAA,mBAKI,IALJmI,GAKI,CAAA1H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,gbC6C9B,MAAMhB,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA4D,CAAA,EAAWC,mBAAiBjG,EAAM,MAAM,EAG1C,CACJ,iBAAAqG,EACA,QAASoB,EACT,MAAOC,EACP,eAAAnB,EACA,mBAAAc,CAAA,EACEvB,EAAkB,CACpB,YAAa9F,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,EAGDmF,EAAAA,UAAU,IAAM,CACdoB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAED,MAAMR,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAI,EAAE,EAEd2F,EAAOC,EAAAA,SAAS,CACpB,MAAO,EAAA,CACR,EAEKI,EAAcrI,EAAAA,SAAS,IACpBgI,EAAK,MAAM,KAAA,GAAUA,EAAK,MAAM,SAAS,GAAG,CACpD,sKAEoB,SAAY,CAC/BhC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CAEF,QAAQ,IAAI,8BAA+B,CAAE,MAAO+B,EAAK,MAAO,EAChEhG,EAAK,UAAW,CACd,MAAOgG,EAAK,KAAA,CACb,CACH,MAAc,CACZ/B,EAAM,MAAQ,4BACdjE,EAAK,QAASiE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,oBAE0B,MAAOW,GAAuB,CACtD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAa9G,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,CACH,OAAS2G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,0BAA0BG,CAAU,GAC9FV,EAAM,MAAQQ,EACdzE,EAAK,QAASyE,CAAY,CAC5B,CACF,yMAlNOlG,GAAA,CAAA,MAAM,oDAAA,YAS8B,MAAM,kBAUlCQ,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,uBAInE,MAAM,wEACVgC,GAAA,CAAA,MAAM,wCAAA,EAGVC,GAAA,CAAA,MAAM,aAAA,YAKqB,MAAM,+BAiCzB,MAAM,wBACjBsG,GAAA,CAAA,MAAM,aAAA,EACJR,GAAA,CAAA,MAAM,wBAAA,EAMNC,GAAA,CAAA,MAAM,aAAA,EAMVC,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,EAWNO,GAAA,CAAA,MAAM,kBAAA,EACNN,GAAA,CAAA,MAAM,0BAAA,2BA5Gf,OAAAxI,YAAA,EAAAC,qBAuHM,MAvHNJ,GAuHM,CAtHJ6I,EAAAA,YAqHSvI,EAAA,OAAA,CArHD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAqE,KAAA,CAAjE,MAAM,uCAAA,EAAwC,gBAAc,EAChEA,EAAAA,mBAA0E,IAAA,CAAvE,MAAM,kBAAA,EAAmB,4CAA0C,CAAA,OAGxEI,EAAAA,mBAAA,mBAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAoCM,MApCNH,GAoCM,EAAAE,EAAAA,UAAA,EAAA,EAnCJC,EAAAA,mBAkCW4E,EAAAA,SAAA,KAAAC,EAAAA,WAjCU3E,EAAA,iBAAZsF,kBADT7C,EAAAA,YAkCWzC,EAAA,SAAA,CAhCR,IAAKsF,EAAS,GACf,QAAQ,UACR,aAAA,GACC,SAAUtF,EAAA,aACV,QAAKc,GAAEd,EAAA,kBAAkBsF,EAAS,EAAE,EACrC,MAAM,iBAAA,EAAA,mBAEN,IAuBM,CAvBNrF,EAAAA,mBAuBM,MAvBNC,GAuBM,CAtBJG,EAAAA,mBAAA,0BAAA,EACWiF,EAAS,SAAAzF,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNK,GAEM,CADJF,EAAAA,mBAAsG,MAAA,CAAhG,IAAKqF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAA1F,EAAA,CAG5E,CAAA,GAAA0F,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAqF,EAAS,KAAE,UAAAzF,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNW,GAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAEjtBC,EAAAA,mBAEM,MAFNmC,GAEM,CADJhC,EAAAA,mBAAiI,OAAjIiC,GAAiInB,mBAAxEuE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,KAGzHrF,EAAAA,mBAA0F,OAA1FkC,GAA0B,iBAAcpB,EAAAA,gBAAGuE,EAAS,aAAeA,EAAS,IAAI,EAAA,CAAA,CAAA,CAAA,+EAIpFjF,EAAAA,mBAAA,WAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAEM,MAFNsC,GAEM1B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAA8D,OAAA,CAAxD,MAAM,cAAA,EAAe,+BAA4B,EAAA,CAAA,EAAA,GAAAI,EAAAA,mBAAA,OAAA,EAAA,EAGzDA,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAyBO,OAAA,CAzBA,SAAMyI,EAAAA,cAAU1I,EAAA,aAAY,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACzCK,EAAAA,mBAAA,SAAA,EACAJ,EAAAA,mBAWM,MAAA,KAAA,CAVJsI,cASEvI,EAAA,QAAA,CARA,GAAG,QAAA,WACMA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GACnB,KAAK,QACL,MAAM,gBACN,YAAY,2BACZ,aAAa,QACb,SAAA,GACC,MAAOd,EAAA,KAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIZuI,cASWvI,EAAA,SAAA,CART,KAAK,SACL,QAAQ,UACR,aAAA,GACC,SAAUA,EAAA,QACV,QAASA,EAAA,QACV,eAAa,uBAAA,EAAA,mBACd,IAEDU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFC,oBAED,EAAA,CAAA,EAAA,6CAGFH,EAAAA,mBAAA,eAAA,EACWL,EAAA,OAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAWM,MAXNkI,GAWM,CAVJ/H,EAAAA,mBASM,MATNwI,GASM,CARJxI,EAAAA,mBAOM,MAPNgI,GAOM,CAAAvH,EAAA,CAAA,IAAAA,EAAA,CAAA,EANJT,EAAAA,mBAIM,MAAA,CAJD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAEwB,OAAA,CAFlB,YAAU,UACd,EAAE,gNACF,YAAU,SAAA,CAAA,QAEdA,EAAAA,mBAAsC,IAAtCiI,GAAsCnH,EAAAA,gBAAZf,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,uCAKrCK,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBASM,MATNkI,GASM,CARJlI,EAAAA,mBAOI,IAPJmI,GAOI,CAAA1H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAAA,gBAPgC,6BAElC,EAAA,GAAAP,EAAAA,mBAIS,SAAA,CAJD,KAAK,SACX,MAAM,uFACL,QAAKS,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAsB,WAErC,CAAA,CAAA,IAIJF,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPN0I,GAOM,CANJ1I,EAAAA,mBAKI,IALJoI,GAKI,CAAA3H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,mBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,ycCsF9B,MAAMhB,EAAQC,EAIRkC,EAAOC,EAGP,CAAE,OAAA4D,CAAA,EAAWC,mBAAiBjG,EAAM,MAAM,EAG1C4J,EAAuBpH,EAAAA,IAAI,EAAK,EAChCqH,EAAerH,EAAAA,IAAI,EAAK,EACxB2D,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAI,EAAE,EACdqF,EAAQrF,EAAAA,IAAI,EAAE,EAEd2F,EAAOC,EAAAA,SAAS,CACpB,SAAU,GACV,UAAW,GACX,SAAU,GACV,SAAU,EAAA,CACX,EAEK0B,EAAc1B,EAAAA,SAAS,CAC3B,SAAU,GACV,UAAW,GACX,SAAU,GACV,SAAU,EAAA,CACX,EAGKI,EAAcrI,EAAAA,SAAS,IAAM,CACjC,MAAM4J,EAAoB5B,EAAK,SAAS,QAAUA,EAAK,SAAS,KAAA,EAC1D6B,EAAoB7B,EAAK,SAAS,QAAU,EAC5C8B,EAAgB,CAAC,CAACjK,EAAM,MAE9B,OAAO+J,GAAqBC,GAAqBC,CACnD,CAAC,EAGDxE,EAAAA,MACE,IAAM0C,EAAK,SACVL,GAAa,CACRA,GAAYA,EAAS,OAAS,EAChCgC,EAAY,SAAW,8CAEvBA,EAAY,SAAW,EAE3B,CAAA,EAIFrE,EAAAA,MACE,IAAM0C,EAAK,SACV+B,GAAa,CACRA,GAAYA,EAAS,OAAS,EAChCJ,EAAY,SAAW,8CAEvBA,EAAY,SAAW,EAE3B,CAAA,EAIF,MAAMK,EAAahK,EAAAA,SAAS,KAAO,CACjC,QAASH,EAAM,QAAQ,SAAW,wBAClC,YAAaA,EAAM,aAAe,uBAAA,EAClC,EAGFmF,EAAAA,UAAU,IAAM,CACd,GAAInF,EAAM,MACR,GAAI,CACF,MAAMoK,EAAQpK,EAAM,MAAM,MAAM,GAAG,EACnC,GAAIoK,EAAM,SAAW,EAAG,CACtB,MAAMC,EAAU,KAAK,MAAM,KAAKD,EAAM,CAAC,CAAC,CAAC,EACrCC,EAAQ,QACVxC,EAAM,MAAQwC,EAAQ,MAE1B,CACF,OAAS1D,EAAK,CACZ,QAAQ,KAAK,4CAA6CA,CAAG,CAC/D,CAEJ,CAAC,EAED,MAAM2D,EAAqB,IAAM,CAC3BH,EAAW,MAAM,cACnB,QAAQ,IAAI,2BAA4BA,EAAW,MAAM,WAAW,EACpE,OAAO,SAAS,KAAOA,EAAW,MAAM,YAE5C,uLAE6B,SAAY,CACvC,GAAI,CAACnK,EAAM,MAAO,CAChBoG,EAAM,MAAQ,iCACd,MACF,CASA,GANAA,EAAM,MAAQ,GACd,OAAO,KAAK0D,CAAW,EAAE,QAAQS,GAAO,CACtCT,EAAYS,CAA+B,EAAI,EACjD,CAAC,EAGG,CAAC/B,EAAY,MAAO,CACtBpC,EAAM,MAAQ,+CACd,MACF,CAEAD,EAAQ,MAAQ,GAEhB,GAAI,CACF,MAAMK,EAAW,MAAM,MAAM,GAAG2D,EAAW,MAAM,OAAO,qCAAsC,CAC5F,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,MAAOnK,EAAM,MACb,SAAUmI,EAAK,SACf,SAAUA,EAAK,SACf,WAAYA,EAAK,WAAa,KAC9B,UAAWA,EAAK,UAAY,IAAA,CAC7B,CAAA,CACF,EAED,GAAI,CAAC3B,EAAS,GAAI,CAChB,MAAMgE,EAAY,MAAMhE,EAAS,KAAA,EACjC,MAAM,IAAI,MAAM,oCAAoCgE,CAAS,EAAE,CACjE,CAEA,MAAM9D,EAAS,MAAMF,EAAS,KAAA,EAC9B,QAAQ,IAAI,wBAAyBE,CAAM,EAE3CkD,EAAqB,MAAQ,GAC7BzH,EAAK,UAAWuE,CAAM,EAGtB,WAAW,IAAM,CACf4D,EAAA,CACF,EAAG,GAAI,CACT,OAAS3D,EAAK,CACRA,aAAe,MACbA,EAAI,QAAQ,SAAS,UAAU,GAAKA,EAAI,QAAQ,SAAS,KAAK,EAChEP,EAAM,MAAQ,8DACLO,EAAI,QAAQ,SAAS,aAAa,GAAKA,EAAI,QAAQ,SAAS,KAAK,GAC1EP,EAAM,MAAQ,kEACdyD,EAAa,MAAQ,GACrB1H,EAAK,eAAe,GAEpBiE,EAAM,MAAQO,EAAI,QAGpBP,EAAM,MAAQ,qDAEhBjE,EAAK,QAASiE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,2OA3WmC,MAAM,sDAE9BxF,GAAA,CAAA,MAAM,aAAA,EAsBeO,GAAA,CAAA,MAAM,oDAAA,EAE3BC,GAAA,CAAA,MAAM,aAAA,EAsBQP,GAAA,CAAA,MAAM,oDAAA,EAGpBa,GAAA,CAAA,MAAM,kBAAA,YAGS,MAAM,QACnByB,GAAA,CAAA,MAAM,0BAAA,EAAuDC,GAAA,CAAA,MAAM,8BAAA,EAuFrEC,GAAA,CAAA,MAAM,kBAAA,EACN4F,GAAA,CAAA,MAAM,0BAAA,EAeHS,GAAA,CAAA,MAAM,oDAAA,EAETR,GAAA,CAAA,MAAM,aAAA,sFAjKf5H,EAAAA,mBAAA,iBAAA,EACWL,EAAA,sBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAqBM,MArBNJ,GAqBM,CApBJ6I,EAAAA,YAmBSvI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNN,GAgBM,CAAAe,EAAA,CAAA,IAAAA,EAAA,CAAA,EAfJT,EAAAA,mBAAkD,MAAA,CAA7C,MAAM,8BAAA,EAA+B,KAAE,EAAA,GAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAC5CT,EAAAA,mBAA0E,KAAA,CAAtE,MAAM,uCAAA,EAAwC,sBAAmB,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACrET,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,gDAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,yDAEzC,EAAA,GACAsI,cAMWvI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAOA,EAAA,kBAAA,EAAA,mBACT,IAEDU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFC,oBAED,EAAA,CAAA,EAAA,iBAEF+H,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,WAKZA,EAAA,cAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAqBM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAtBNrE,EAAAA,mBAAA,uBAAA,EACAJ,EAAAA,mBAqBM,MArBNC,GAqBM,CApBJqI,EAAAA,YAmBSvI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNE,GAgBM,CAAAO,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA+C,MAAA,CAA1C,MAAM,4BAAA,EAA6B,IAAC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACzCT,EAAAA,mBAAmE,KAAA,CAA/D,MAAM,uCAAA,EAAwC,eAAY,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC9DT,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,sDAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,mEAEzC,EAAA,GACAsI,cAMWvI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAKU,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAA,mBACd,IAEDG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,qBAED,EAAA,CAAA,EAAA,kBAEF+H,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,kBAKZI,EAAA,OAAAP,EAAAA,UAAA,EAAhBC,EAAAA,mBA2GM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CA5GNrE,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBA2GM,MA3GNL,GA2GM,CA1GJ2I,EAAAA,YAwGSvI,EAAA,OAAA,CAxGD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EACAJ,EAAAA,mBAMM,MANNQ,GAMM,CAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EALJT,EAAAA,mBAAiF,KAAA,CAA7E,MAAM,uCAAA,EAAwC,6BAA0B,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC5ET,EAAAA,mBAAkF,IAAA,CAA/E,MAAM,kBAAA,EAAmB,qDAAkD,EAAA,GACnED,EAAA,OAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNmC,GAEM,CADJhC,EAAAA,mBAA2H,IAA3HiC,GAA2H,CAAAxB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBAAvF,yBAAsB,EAAA,GAAAP,EAAAA,mBAA6D,OAA7DkC,GAA6DpB,EAAAA,gBAAff,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,uCAIjHK,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBAqEO,OAAA,CArEA,SAAMyI,EAAAA,cAAU1I,EAAA,qBAAoB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACjDK,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAWM,MAAA,KAAA,CAVJsI,cASEvI,EAAA,QAAA,CARA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,OACL,MAAM,WACN,YAAY,oBACZ,aAAa,WACb,SAAA,GACC,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,cAAA,EACAJ,EAAAA,mBAUM,MAAA,KAAA,CATJsI,cAQEvI,EAAA,QAAA,CAPA,GAAG,YAAA,WACMA,EAAA,KAAK,UAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,UAASc,GACvB,KAAK,OACL,MAAM,wBACN,YAAY,wBACZ,aAAa,aACZ,MAAOd,EAAA,YAAY,SAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAUM,MAAA,KAAA,CATJsI,cAQEvI,EAAA,QAAA,CAPA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,OACL,MAAM,uBACN,YAAY,uBACZ,aAAa,cACZ,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAeM,MAAA,KAAA,CAdJsI,cAUEvI,EAAA,QAAA,CATA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,WACL,MAAM,WACN,YAAY,2BACZ,aAAa,eACb,SAAA,GACA,UAAU,IACT,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEtBU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAAA,EAAgC,gDAE3C,EAAA,EAAA,CAAA,EAGFsI,cASWvI,EAAA,SAAA,CART,KAAK,SACL,QAAQ,UACR,aAAA,GACC,SAAUA,WAAO,CAAKA,EAAA,YACtB,QAASA,EAAA,QACV,eAAa,qBAAA,EAAA,mBACd,IAEDU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,0BAED,EAAA,CAAA,EAAA,8CAGFH,EAAAA,mBAAA,eAAA,EAEQL,uBADRyC,EAAAA,YAOEzC,EAAA,QAAA,CAAA,IAAA,EALA,QAAQ,QACP,QAASA,EAAA,MACV,MAAM,uBACN,YAAA,GACC,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAGjBA,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPNmC,GAOM,CANJnC,EAAAA,mBAKI,IALJ+H,GAKI,CAAAtH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,eAM5B,IAAAH,EAAAA,UAAA,EAAAC,EAAAA,mBAqBM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAtBNrE,EAAAA,mBAAA,kBAAA,EACAJ,EAAAA,mBAqBM,MArBNwI,GAqBM,CApBJF,EAAAA,YAmBSvI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNgI,GAgBM,CAAAvH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAAmD,MAAA,CAA9C,MAAM,+BAAA,EAAgC,KAAE,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC7CT,EAAAA,mBAAoE,KAAA,CAAhE,MAAM,uCAAA,EAAwC,gBAAa,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC/DT,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,wCAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,qFAEzC,EAAA,GACAsI,cAMWvI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAKU,eAAEH,EAAA,MAAK,oBAAA,EAAA,EAAA,mBACd,IAEDG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,uBAED,EAAA,CAAA,EAAA,kBAEF+H,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,gXC4H9B,MAAMhB,EAAQC,EACRkC,EAAOC,EAEP+D,EAAU3D,EAAAA,IAAI,EAAK,EACnBiI,EAAqBjI,EAAAA,IAAI,EAAK,EAC9BkI,EAAiBlI,EAAAA,IAAI,EAAE,EACvBoE,EAAepE,EAAAA,IAAI,EAAE,EACrBmI,EAAiBnI,EAAAA,IAAI,CACzB,CAAE,GAAI,IAAK,OAAQ,gBAAiB,SAAU,oBAAqB,WAAY,gBAAiB,QAAS,EAAA,EACzG,CAAE,GAAI,IAAK,OAAQ,mBAAoB,SAAU,oBAAqB,WAAY,aAAc,QAAS,EAAA,CAAM,CAChH,EAEK2F,EAAOC,EAAAA,SAAS,CACpB,UAAW,GACX,SAAU,GACV,MAAO,GACP,MAAO,EAAA,CACR,EAEKwC,EAAexC,EAAAA,SAAS,CAC5B,QAAS,GACT,IAAK,GACL,QAAS,EAAA,CACV,EAEKyC,EAASzC,EAAAA,SAAS,CACtB,UAAW,GACX,SAAU,GACV,MAAO,GACP,MAAO,EAAA,CACR,EAEK0C,EAAa3K,EAAAA,SAAS,IACrBH,EAAM,KAETmI,EAAK,YAAcnI,EAAM,KAAK,WAC9BmI,EAAK,WAAanI,EAAM,KAAK,UAC7BmI,EAAK,QAAUnI,EAAM,KAAK,OAC1BmI,EAAK,SAAWnI,EAAM,KAAK,OAAS,IALd,EAOzB,EAEK+K,EAAsB5K,EAAAA,SAAS,IAEjCyK,EAAa,SACbA,EAAa,KACbA,EAAa,SACbA,EAAa,MAAQA,EAAa,SAClCA,EAAa,IAAI,QAAU,CAE9B,EAEKI,EAAc,CAACjD,EAAoBC,IACnC,CAACD,GAAa,CAACC,EAAiB,IAC7B,GAAGD,IAAY,CAAC,GAAK,EAAE,GAAGC,IAAW,CAAC,GAAK,EAAE,GAAG,YAAA,EAIzDvC,EAAAA,MAAM,IAAMzF,EAAM,KAAOiL,GAAS,CAC5BA,IACF9C,EAAK,UAAY8C,EAAK,UACtB9C,EAAK,SAAW8C,EAAK,SACrB9C,EAAK,MAAQ8C,EAAK,MAClB9C,EAAK,MAAQ8C,EAAK,OAAS,GAE/B,EAAG,CAAE,UAAW,GAAM,EAEtB,MAAMC,EAAgB,IAAM,CAC1BR,EAAe,MAAQ,GACvB9D,EAAa,MAAQ,GACrB,OAAO,KAAKiE,CAAM,EAAE,QAAQN,GAAO,CACjCM,EAAON,CAA0B,EAAI,EACvC,CAAC,CACH,wNAE4B,SAAY,CACtCW,EAAA,EACA/E,EAAQ,MAAQ,GAEhB,GAAI,CAKF,MAAM,IAAI,QAAQgF,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtD,MAAMC,EAAc,CAClB,GAAGpL,EAAM,KACT,GAAGmI,CAAA,EAGLuC,EAAe,MAAQ,+BACvBvI,EAAK,kBAAmBiJ,CAAW,CACrC,MAAc,CACZxE,EAAa,MAAQ,2BACrBzE,EAAK,QAASyE,EAAa,KAAK,CAClC,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,uBAE6B,SAAY,CACvC,GAAK4E,EAAoB,MAEzB,CAAAG,EAAA,EACA/E,EAAQ,MAAQ,GAEhB,GAAI,CAKF,MAAM,IAAI,QAAQgF,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtDT,EAAe,MAAQ,gCACvBD,EAAmB,MAAQ,GAC3BG,EAAa,QAAU,GACvBA,EAAa,IAAM,GACnBA,EAAa,QAAU,EACzB,MAAc,CACZhE,EAAa,MAAQ,2BACvB,QAAA,CACET,EAAQ,MAAQ,EAClB,EACF,oBAE0B,IAAM,CAG9BhE,EAAK,QAAS,gDAAgD,CAChE,kBAEwB,IAAM,CAC5BA,EAAK,aAAc,CAACnC,EAAM,MAAM,UAAU,CAC5C,eAEqB,IAAM,CACrBA,EAAM,OACRmI,EAAK,UAAYnI,EAAM,KAAK,UAC5BmI,EAAK,SAAWnI,EAAM,KAAK,SAC3BmI,EAAK,MAAQnI,EAAM,KAAK,MACxBmI,EAAK,MAAQnI,EAAM,KAAK,OAAS,IAEnCkL,EAAA,EACAT,EAAmB,MAAQ,GAC3BG,EAAa,QAAU,GACvBA,EAAa,IAAM,GACnBA,EAAa,QAAU,EACzB,0GAlcOlK,GAAA,CAAA,MAAM,2CAAA,EACJC,GAAA,CAAA,MAAM,aAAA,EAQJO,GAAA,CAAA,MAAM,iCAAA,EACJC,GAAA,CAAA,MAAM,gBAAA,EACJP,GAAA,CAAA,MAAM,qJAAA,EAuBRa,GAAA,CAAA,MAAM,uCAAA,EAEJwB,GAAA,CAAA,MAAM,WAAA,4BAkBoB,MAAM,uDAkBP,MAAM,uDAkBT,MAAM,uCACQ,MAAM,0DAmBpB,MAAM,6BAK5B0G,GAAA,CAAA,MAAM,WAAA,EAIJN,GAAA,CAAA,MAAM,wCAAA,EACJC,GAAA,CAAA,MAAM,mCAAA,YAcoB,MAAM,6BAkClC+B,GAAA,CAAA,MAAM,8BAAA,EACJC,GAAA,CAAA,MAAM,mCAAA,EAGJC,GAAA,CAAA,MAAM,0BAAA,EAkBVC,GAAA,CAAA,MAAM,8BAAA,EACJC,GAAA,CAAA,MAAM,mCAAA,EAGJC,GAAA,CAAA,MAAM,0BAAA,EAedC,GAAA,CAAA,MAAM,kEAAA,4BAMc,MAAM,+EAsBN,MAAM,wBAC1BC,GAAA,CAAA,MAAM,eAAA,EACJC,GAAA,CAAA,MAAM,wBAAA,EAINC,GAAA,CAAA,MAAM,aAAA,YAKU,MAAM,wBACxBC,GAAA,CAAA,MAAM,aAAA,EACJC,GAAA,CAAA,MAAM,wBAAA,EAINC,GAAA,CAAA,MAAM,aAAA,EAMVC,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,gEArQf,OAAAtL,YAAA,EAAAC,qBAgRM,MAhRNJ,GAgRM,CA/QJO,EAAAA,mBA8QM,MA9QNN,GA8QM,CA7QJU,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAuE,KAAA,CAAnE,MAAM,uCAAA,EAAwC,kBAAgB,EAClEA,EAAAA,mBAA+E,IAAA,CAA5E,MAAM,kBAAA,EAAmB,iDAA+C,CAAA,OAG7EI,EAAAA,mBAAA,yBAAA,EACAJ,EAAAA,mBAqBM,MArBNC,GAqBM,CApBJD,EAAAA,mBAaM,MAbNE,GAaM,CAZJF,EAAAA,mBAEM,MAFNL,GAEMmB,kBADDf,EAAA,YAAYI,EAAA,MAAM,UAAWA,QAAM,QAAQ,CAAA,EAAA,CAAA,EAEhDH,EAAAA,mBAQS,SAAA,CAPP,MAAM,+IACL,QAAOD,EAAA,iBAAA,EAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAERT,EAAAA,mBAGM,MAAA,CAHD,MAAM,qBAAqB,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GACxEA,EAAAA,mBAA6O,OAAA,CAAvO,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kKAAA,CAAA,EACxEA,EAAAA,mBAA6G,OAAA,CAAvG,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kCAAA,CAAA,YAI9EA,EAAAA,mBAKS,SAAA,CAJP,MAAM,kGACL,QAAOD,EAAA,iBAAA,EACT,gBAED,CAAA,CAAA,EAGFK,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAyMO,OAAA,CAzMA,SAAMyI,EAAAA,cAAU1I,EAAA,oBAAmB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GAChDC,EAAAA,mBA4KM,MA5KNQ,GA4KM,CA3KJJ,EAAAA,mBAAA,wBAAA,EACAJ,EAAAA,mBA4EM,MA5ENgC,GA4EM,CAAAvB,EAAA,EAAA,IAAAA,EAAA,EAAA,EA3EJT,EAAAA,mBAAiF,KAAA,CAA7E,MAAM,6CAAA,EAA8C,uBAAoB,EAAA,GAE5EA,EAAAA,mBAgBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA8D,QAAA,CAAvD,IAAI,YAAY,MAAM,cAAA,EAAe,aAAU,EAAA,GAAAmL,EAAAA,eACtDnL,EAAAA,mBAYE,QAAA,CAXA,GAAG,YAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,UAASc,GACvB,KAAK,OACL,SAAA,GACA,aAAa,aACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,WAAS,aAAA,CAAA,EAI9E,YAAY,wBACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAkC,EAAA,EAAA,CATF,CAAAmJ,EAAAA,WAAArL,EAAA,KAAK,SAAS,CAAA,CAAA,EAWhBA,EAAA,OAAO,WAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAAuF,IAAvFqC,GAAuFpB,kBAAvBf,SAAO,SAAS,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,IAGlFJ,EAAAA,mBAgBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA4D,QAAA,CAArD,IAAI,WAAW,MAAM,cAAA,EAAe,YAAS,EAAA,GAAAmL,EAAAA,eACpDnL,EAAAA,mBAYE,QAAA,CAXA,GAAG,WAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,SAAQc,GACtB,KAAK,OACL,SAAA,GACA,aAAa,cACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,UAAQ,aAAA,CAAA,EAI7E,YAAY,uBACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAoC,EAAA,EAAA,CATF,CAAAiJ,EAAAA,WAAArL,EAAA,KAAK,QAAQ,CAAA,CAAA,EAWfA,EAAA,OAAO,UAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAAqF,IAArFkI,GAAqFjH,kBAAtBf,SAAO,QAAQ,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,IAGhFJ,EAAAA,mBAmBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAlBJT,EAAAA,mBAA6D,QAAA,CAAtD,IAAI,QAAQ,MAAM,cAAA,EAAe,gBAAa,EAAA,GAAAmL,EAAAA,eACrDnL,EAAAA,mBAYE,QAAA,CAXA,GAAG,QAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,MAAKc,GACnB,KAAK,QACL,SAAA,GACA,aAAa,QACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,OAAK,aAAA,CAAA,EAI1E,YAAY,2BACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAyI,EAAA,EAAA,CATF,CAAA4C,EAAAA,WAAArL,EAAA,KAAK,KAAK,CAAA,CAAA,EAWZA,EAAA,OAAO,OAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAA+E,IAA/EmI,GAA+ElH,kBAAnBf,SAAO,KAAK,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAC/DL,EAAA,KAAK,QAAUI,EAAA,MAAM,OAAAP,EAAAA,UAAA,EAA9BC,EAAAA,mBAEI,IAFJoI,GAA0E,iDAE1E,GAAA7H,EAAAA,mBAAA,OAAA,EAAA,IAGFJ,EAAAA,mBAeM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAdJT,EAAAA,mBAA4D,QAAA,CAArD,IAAI,QAAQ,MAAM,cAAA,EAAe,eAAY,EAAA,GAAAmL,EAAAA,eACpDnL,EAAAA,mBAWE,QAAA,CAVA,GAAG,QAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,MAAKc,GACnB,KAAK,MACL,aAAa,MACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,OAAK,aAAA,CAAA,EAI1E,YAAY,0BACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAmI,EAAA,EAAA,CARF,CAAAkD,EAAAA,WAAArL,EAAA,KAAK,KAAK,CAAA,CAAA,EAUZA,EAAA,OAAO,OAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAA+E,IAA/EsI,GAA+ErH,kBAAnBf,SAAO,KAAK,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,MAI5EA,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBA0FM,MA1FN0I,GA0FM,CAAAjI,EAAA,EAAA,IAAAA,EAAA,EAAA,EAzFJT,EAAAA,mBAA8E,KAAA,CAA1E,MAAM,6CAAA,EAA8C,oBAAiB,EAAA,GAEzEI,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBA8CM,MA9CNoI,GA8CM,CA7CJpI,EAAAA,mBAYM,MAZNqI,GAYM,CAAA5H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAXJT,EAAAA,mBAGM,MAAA,KAAA,CAFJA,EAAAA,mBAAsD,KAAA,CAAlD,MAAM,8BAAA,EAA+B,UAAQ,EACjDA,EAAAA,mBAAgE,IAAA,CAA7D,MAAM,0BAAA,EAA2B,0BAAwB,CAAA,OAE9DA,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,0CACL,QAAKS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEd,EAAA,mBAAkB,CAAIA,EAAA,mBAAA,oBAE3BA,EAAA,mBAAkB,SAAA,QAAA,EAAA,CAAA,CAAA,CAAA,EAIdA,EAAA,oBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBA8BM,MA9BNwL,GA8BM,CAAAF,EAAAA,eA7BJnL,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,QAAOc,GAC7B,KAAK,WACL,YAAY,mBACZ,MAAM,eACN,aAAa,kBAAA,aAJJ,CAAAuK,EAAAA,WAAArL,EAAA,aAAa,OAAO,CAAA,CAAA,EAM/BoL,EAAAA,eAAAnL,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,IAAGc,GACzB,KAAK,WACL,YAAY,eACZ,MAAM,eACN,aAAa,cAAA,aAJJ,CAAAuK,EAAAA,WAAArL,EAAA,aAAa,GAAG,CAAA,CAAA,EAM3BoL,EAAAA,eAAAnL,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,QAAOc,GAC7B,KAAK,WACL,YAAY,uBACZ,MAAM,eACN,aAAa,cAAA,aAJJ,CAAAuK,EAAAA,WAAArL,EAAA,aAAa,OAAO,CAAA,CAAA,EAM/BC,EAAAA,mBAOS,SAAA,CANP,KAAK,SACL,MAAM,wCACL,QAAOD,EAAA,qBACP,SAAQ,CAAGA,EAAA,mBAAA,EACb,oBAED,EAAAuL,EAAA,CAAA,CAAA,GAAAlL,EAAAA,mBAAA,OAAA,EAAA,IAIJA,EAAAA,mBAAA,6BAAA,EACAJ,EAAAA,mBAmBM,MAnBNoK,GAmBM,CAlBJpK,EAAAA,mBAiBM,MAjBNqK,GAiBM,CAhBJrK,EAAAA,mBAKM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAAuE,KAAA,CAAnE,MAAM,8BAAA,EAA+B,4BAAyB,EAAA,GAClEA,EAAAA,mBAEI,IAFJsK,GAEIxJ,EAAAA,gBADCX,QAAM,WAAU,UAAA,oCAAA,EAAA,CAAA,CAAA,CAAA,EAGvBH,EAAAA,mBASS,SAAA,CARP,KAAK,SACJ,MAAKF,EAAAA,eAAA,CAAwBK,QAAM,WAAU,gBAAA,cAAA,8BAI7C,QAAOJ,EAAA,eAAA,EAELe,EAAAA,gBAAAX,EAAA,MAAM,WAAU,UAAA,QAAA,EAAA,CAAA,CAAA,CAAA,IAKzBC,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBAcM,MAdNuK,GAcM,CAbJvK,EAAAA,mBAYM,MAZNwK,GAYM,CAXJxK,EAAAA,mBAGM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAFJT,EAAAA,mBAA6D,KAAA,CAAzD,MAAM,8BAAA,EAA+B,kBAAe,EAAA,GACxDA,EAAAA,mBAAoF,IAApFyK,GAAoF3J,EAAAA,gBAA7Cf,EAAA,eAAe,MAAM,EAAG,oBAAiB,CAAA,CAAA,CAAA,EAElFC,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,0CACL,QAAKS,eAAEH,EAAA,MAAK,iBAAA,EAAA,EACd,UAED,CAAA,CAAA,QAMRF,EAAAA,mBAAA,kBAAA,EACAJ,EAAAA,mBAwBM,MAxBN0K,GAwBM,CAvBJ1K,EAAAA,mBAaS,SAAA,CAZP,KAAK,SACJ,SAAUD,WAAO,CAAKA,EAAA,WACvB,MAAM,aAAA,EAAA,CAEMA,EAAA,SAAAH,YAAA,EAAZC,EAAAA,mBAMO,OANP0L,GAMO9K,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CALLT,EAAAA,mBAGM,MAAA,CAHD,MAAM,uBAAuB,KAAK,OAAO,QAAQ,WAAA,GACpDA,EAAAA,mBAA0F,SAAA,CAAlF,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,OAAO,eAAe,eAAa,GAAA,CAAA,EACrFA,EAAAA,mBAAsK,OAAA,CAAhK,MAAM,aAAa,KAAK,eAAe,EAAE,qHAAA,CAAA,yBAC3C,sBAER,EAAA,CAAA,EAAA,IAAAJ,EAAAA,UAAA,EACAC,EAAAA,mBAAgC,UAAnB,cAAY,EAAA,EAAA,EAAA2L,EAAA,EAG3BxL,EAAAA,mBAOS,SAAA,CANP,KAAK,SACL,MAAM,gBACL,QAAOD,EAAA,aACP,SAAUA,EAAA,OAAA,EACZ,WAED,EAAA0L,EAAA,CAAA,CAAA,OAIJrL,EAAAA,mBAAA,0BAAA,EACWL,EAAA,gBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATN6L,GASM,CARJ1L,EAAAA,mBAOM,MAPN2K,GAOM,CANJ3K,EAAAA,mBAKM,MALN4K,GAKM,CAAAnK,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAA6M,OAAA,CAAvM,YAAU,UAAU,EAAE,2JAA2J,YAAU,SAAA,CAAA,QAEnMA,EAAAA,mBAA+C,IAA/C6K,GAA+C/J,EAAAA,gBAArBf,EAAA,cAAc,EAAA,CAAA,CAAA,CAAA,uCAKnCA,EAAA,cAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATN8L,GASM,CARJ3L,EAAAA,mBAOM,MAPN8K,GAOM,CANJ9K,EAAAA,mBAKM,MALN+K,GAKM,CAAAtK,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAAkQ,OAAA,CAA5P,YAAU,UAAU,EAAE,gNAAgN,YAAU,SAAA,CAAA,QAExPA,EAAAA,mBAA6C,IAA7CgL,GAA6ClK,EAAAA,gBAAnBf,EAAA,YAAY,EAAA,CAAA,CAAA,CAAA,uCAK5CK,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPNiL,GAOM,CANJjL,EAAAA,mBAKI,IALJkL,GAKI,CAAAzK,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,EAAAA,YAESsD,EAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DnL,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,6RC5M9B,MAAMmB,EAAOC,EAEP+D,EAAU3D,EAAAA,IAAI,EAAK,EACnB4D,EAAQ5D,EAAAA,IAAI,EAAE,EACdsK,EAActK,EAAAA,IAAI,EAAK,EAEvB2F,EAAOC,EAAAA,SAAS,CACpB,MAAO,EAAA,CACR,uEAE2B,SAAY,CACtCjC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CAEF,QAAQ,IAAI,0BAA2B,CAAE,MAAO+B,EAAK,MAAO,EAG5D,MAAM,IAAI,QAAQgD,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtD2B,EAAY,MAAQ,GACpB3K,EAAK,UAAWgG,EAAK,KAAK,CAC5B,MAAc,CACZ/B,EAAM,MAAQ,yDACdjE,EAAK,QAASiE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,iOA/FOzF,GAAA,CAAA,MAAM,oDAAA,EA8BFC,GAAA,CAAA,MAAM,kBAAA,EAUNO,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,2BAzCf,OAAAN,YAAA,EAAAC,qBAoDM,MApDNJ,GAoDM,CAnDJ6I,EAAAA,YAkDSvI,EAAA,OAAA,CAlDD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAqE,KAAA,CAAjE,MAAM,uCAAA,EAAwC,gBAAc,EAChEA,EAAAA,mBAAyG,IAAA,CAAtG,MAAM,kBAAA,EAAmB,2EAAyE,CAAA,OAGvGI,EAAAA,mBAAA,cAAA,EACAJ,EAAAA,mBASO,OAAA,CATA,SAAMyI,EAAAA,cAAU1I,EAAA,oBAAmB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GAChDuI,cAE2DvI,EAAA,QAAA,CAFlD,GAAG,QAAA,WAAiBA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAC1D,YAAY,2BAA2B,aAAa,QAAQ,SAAA,GAAU,SAAUd,EAAA,SAAWA,EAAA,YAC1F,MAAOA,QAAK,0BAA+B,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,WAAA,OAAA,CAAA,EAE9CuI,cAGWvI,EAAA,SAAA,CAHD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,EAAA,SAAO,CAAKA,EAAA,KAAK,MAAM,QAAUA,EAAA,YAC9F,QAASA,EAAA,QAAU,eAAc,iBAAA,EAAA,mBAClC,IAAoD,CAAAQ,EAAAA,kCAAjDR,EAAA,YAAW,aAAA,iBAAA,EAAA,CAAA,CAAA,CAAA,sCAIlBK,EAAAA,mBAAA,mBAAA,EACeL,6BAAfyC,EAAAA,YAEiCzC,EAAA,QAAA,CAAA,IAAA,EAFL,QAAQ,UACjC,QAAO,0DAA4DA,EAAA,KAAK,KAAK,GAC9E,MAAM,sBAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAERA,EAAAA,mBAAA,iBAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBAOM,MAPNN,GAOM,CANJ4I,cAKSvI,EAAA,OAAA,CALA,QAAKU,eAAEH,EAAA,MAAK,gBAAA,GAAoB,MAAM,gCAAA,EAAA,mBAC7C,IAEMG,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNT,EAAAA,mBAEM,MAAA,CAFD,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GAC7DA,EAAAA,mBAA4F,OAAA,CAAtF,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,iBAAA,CAAA,yBACpE,oBAER,EAAA,CAAA,EAAA,iBAGFI,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAOM,MAPNC,GAOM,CANJD,EAAAA,mBAKI,IALJE,GAKI,CAAAO,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAA+H,cAESvI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,2BAAA,EAAA,mBAA4B,IAE3DU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF2D,oBAE3D,EAAA,CAAA,EAAA,mBAIJH,EAAAA,mBAAA,qBAAA,EACAkI,EAAAA,YAAwBvI,EAAA,oBAAA,CAAA,CAAA,iXClDvBN,GAAA,CAAA,MAAM,oDAAA,EAMJC,GAAA,CAAA,MAAM,WAAA,EAkCJO,GAAA,CAAA,MAAM,iBAAA,2BAxCf,OAAAL,YAAA,EAAAC,qBAwDM,MAxDNJ,GAwDM,CAAAgB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAvDJT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAA2E,KAAA,CAAvE,MAAM,kCAAA,EAAmC,2BAAyB,EACtEA,EAAAA,mBAA8D,IAAA,CAA3D,MAAM,oBAAA,EAAqB,8BAA4B,CAAA,OAG5DA,EAAAA,mBAiDM,MAjDNN,GAiDM,CAhDJU,EAAAA,mBAAA,mBAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAqL,oBAAA,meAAA,CAAA,GAYA1L,EAAAA,mBAAA,aAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBAKM,MAAA,KAAA,CAJJA,EAAAA,mBAA4F,QAAA,CAArF,MAAM,8CAAA,EAA+C,0BAAwB,EACpFA,EAAAA,mBAEM,MAAA,CAFD,MAAM,2DAAA,EAA4D,2CAEvE,CAAA,OAGFI,EAAAA,mBAAA,2BAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,KAAA,CARJA,EAAAA,mBAAqF,QAAA,CAA9E,MAAM,8CAAA,EAA+C,mBAAiB,EAC7EA,EAAAA,mBAKE,QAAA,CAJA,KAAK,OACL,YAAY,qBACZ,MAAM,qIACN,UAAU,GAAA,CAAA,EAEZA,EAAAA,mBAA4F,IAAA,CAAzF,MAAM,4BAAA,EAA6B,oDAAkD,CAAA,OAG1FI,EAAAA,mBAAA,WAAA,EACAJ,EAAAA,mBAcM,MAdNC,GAcM,CAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAbJT,EAAAA,mBAKS,SAAA,CAJP,KAAK,SACL,MAAM,yKAAA,EACP,eAED,EAAA,GACAA,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,oKACL,QAAKS,eAAEH,EAAA,MAAK,MAAA,EAAA,EACd,UAED,CAAA,CAAA,2TChBR,MAAMvB,EAAQC,EAIRkC,EAAOC,EAEP,CAAE,gBAAA4K,EAAiB,KAAA/B,EAAM,QAAAgC,CAAA,EAAYC,EAAAA,eAAA,8DAE5B,IAAM,CACnB/K,EAAK,kBAAkB,CACzB,6FA/C8B,MAAM,6BAGJ,MAAM,mDAHzBnB,EAAA,iBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAAwCC,EAAA,OAAA,UAAA,CAAjC,KAAMP,EAAA,KAAO,QAASA,EAAA,OAAA,CAAA,KAEfI,EAAA,cAAAP,EAAAA,UAAA,EAAhBC,EAAAA,mBAmBM,MAnBNH,GAmBM,CAlBJW,aAiBOC,EAAA,OAAA,WAAA,CAjBgB,OAAQP,EAAA,MAAA,EAA/B,IAiBO,CAhBLK,EAAAA,mBAAA,4BAAA,EACAJ,EAAAA,mBAcM,MAAA,CAdD,MAAM,kBAAA,EAAkB,CAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAqL,oBAAA,oiBAAA,CAAA,GAQ3B9L,EAAAA,mBAKS,SAAA,CAJN,QAAOD,EAAA,OACR,MAAM,+BAAA,EACP,WAED,CAAA,CAAA,uWCgCR,MAAMhB,EAAQC,EAIRkC,EAAOC,EAEP,CAAE,gBAAA4K,EAAiB,UAAAG,EAAW,KAAAlC,EAAM,QAAAgC,CAAA,EAAYC,EAAAA,eAAA,0EAEvC,IAAM,CACnB/K,EAAK,iBAAiB,CACxB,SAEe,IAAM,CACnBA,EAAK,iBAAiB,CACxB,6FAjE6C,MAAM,6BAGA,MAAM,mBAG9CjB,GAAA,CAAA,MAAM,kBAAA,EAONC,GAAA,CAAA,MAAM,uBAAA,YAUY,MAAM,0CAvBrB,MAAA,CAAAH,EAAA,iBAAe,CAAKA,EAAA,WAAAH,EAAAA,YAAhCC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAA0CC,EAAA,OAAA,UAAA,CAAnC,OAAQP,EAAA,OAAS,OAAQA,EAAA,MAAA,CAAA,KAElBI,EAAA,cAAgBJ,EAAA,iBAAAH,EAAAA,YAAhCC,EAAAA,mBAmBM,MAnBNH,GAmBM,CAlBJW,aAiBOC,EAAA,OAAA,WAAA,CAjBgB,KAAMP,EAAA,KAAO,QAASA,EAAA,OAAA,EAA7C,IAiBO,CAhBLK,EAAAA,mBAAA,gDAAA,EACAJ,EAAAA,mBAcM,MAdNC,GAcM,CAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAbJT,EAAAA,mBAIM,MAAA,CAJD,MAAM,qFAAA,EAAqF,CAC9FA,EAAAA,mBAEM,MAAA,CAFD,MAAM,2BAA2B,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,EAAA,CAC9EA,EAAAA,mBAAgJ,OAAA,CAA1I,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,qEAAA,CAAA,UAG5ES,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAT,EAAAA,mBAA8E,KAAA,CAA1E,MAAM,6CAAA,EAA8C,oBAAiB,EAAA,GACzEA,EAAAA,mBAAqF,IAArFE,GAAiC,iCAA8BY,EAAAA,gBAAGf,EAAA,MAAM,KAAK,EAAG,IAAC,CAAA,EACjFC,EAAAA,mBAKS,SAAA,CAJN,QAAKS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAA0L,IAAEpM,EAAA,SAAAA,EAAA,QAAA,GAAAoM,CAAA,GACR,MAAM,iCAAA,EACP,YAED,CAAA,CAAA,OAIUpM,EAAA,WAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAaM,MAbNF,GAaM,CAZJU,EAAAA,WAWOC,sBAXP,IAWO,CAVLF,EAAAA,mBAAA,yBAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAqL,EAAAA,kBAAA,+iBAAA,CAAA,oaCzBJ,OAAAlM,EAAAA,UAAA,EAAAC,EAAAA,mBAsBM,MAAA,CArBJ,QAAQ,iBACR,MAAM,6BACL,MAAKC,EAAAA,eAAEK,EAAA,KAAK,EACb,KAAK,MACL,aAAW,uBAAA,eAEXH,EAAAA,mBAQI,IAAA,KAAA,CAPFA,EAAAA,mBAMO,OAAA,CALL,EAAE,UACF,EAAE,UACF,MAAA,CAAA,cAAA,kDAAA,cAAA,MAAA,YAAA,YAAA,KAAA,cAAA,CAAA,EACD,UAED,CAAA,MAEFA,EAAAA,mBAKI,IAAA,KAAA,CAJFA,EAAAA,mBAGE,OAAA,CAFA,EAAE,kpFACF,MAAA,CAAA,KAAA,eAAA,YAAA,SAAA,CAAA,CAAA,sRCRR,MAAMjB,EAAQC,EAGdkF,EAAAA,UAAU,IAAM,CACdkI,EAAAA,qBAAqBrN,EAAM,MAAM,CACnC,CAAC,EAGDqN,EAAAA,qBAAqBrN,EAAM,MAAM,oIAnB/BsB,aAAQC,EAAA,OAAA,SAAA,ofCiBV,MAAMvB,EAAQC,EAQR2B,EAAc,CAClB,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,SAAA,EAGA0L,EAAYnN,EAAAA,SAAS,IAAM,GAAGyB,EAAY5B,EAAM,IAAI,CAAC,IAAIA,EAAM,KAAK,EAAE,EACtEuN,EAAUpN,WAAS,IAAM,WAAW,EAEpCqN,EAAQ,CACZ,IAAO,IAAMC,EAAAA,EAAE,IAAK,CAClBA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,kCAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,yHAAA,CACJ,CAAA,CACF,EACD,YAAa,IAAMA,EAAAA,EAAE,IAAK,CACxBA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,qLAAA,CACJ,CAAA,CACF,EACD,OAAU,IAAMA,EAAAA,EAAE,OAAQ,CACxB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,kKAAA,CACJ,EACD,eAAgB,IAAMA,EAAAA,EAAE,OAAQ,CAC9B,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,iBAAA,CACJ,EACD,QAAW,IAAMA,EAAAA,EAAE,IAAK,CACtBA,EAAAA,EAAE,SAAU,CACV,MAAO,aACP,GAAI,KACJ,GAAI,KACJ,EAAG,KACH,OAAQ,eACR,eAAgB,GAAA,CACjB,EACDA,EAAAA,EAAE,OAAQ,CACR,MAAO,aACP,KAAM,eACN,EAAG,qHAAA,CACJ,CAAA,CACF,EACD,eAAgB,IAAMA,EAAAA,EAAE,OAAQ,CAC9B,YAAa,UACb,EAAG,2JACH,YAAa,SAAA,CACd,EACD,WAAY,IAAMA,EAAAA,EAAE,OAAQ,CAC1B,YAAa,UACb,EAAG,gNACH,YAAa,SAAA,CACd,EACD,KAAQ,IAAMA,EAAAA,EAAE,OAAQ,CACtB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,sGAAA,CACJ,EACD,KAAQ,IAAMA,EAAAA,EAAE,OAAQ,CACtB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,qEAAA,CACJ,EACD,OAAU,IAAMA,EAAAA,EAAE,IAAK,CAAE,KAAM,gBAAkB,CAC/CA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,yHAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,uIAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,+HAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,qIAAA,CACJ,CAAA,CACF,EACD,OAAU,IAAMA,EAAAA,EAAE,OAAQ,CACxB,YAAa,UACb,EAAG,mtBACH,YAAa,SAAA,CACd,CAAA,EAGGC,EAAgBvN,EAAAA,SAAS,IAAM,CACnC,MAAMwN,EAAOH,EAAMxN,EAAM,IAA0B,EACnD,OAAO2N,EAAOA,IAASF,EAAAA,EAAE,OAAQ,CAAE,EAAG,GAAI,CAC5C,CAAC,qPAxIC3M,EAAAA,mBAEM,MAAA,CAFA,MAAKC,EAAAA,eAAEC,EAAA,SAAS,EAAG,KAAMI,EAAA,KAAO,OAAQA,EAAA,OAAS,QAASJ,EAAA,QAAU,cAAaI,EAAA,UAAA,EAAA,EACrFP,EAAAA,UAAA,EAAA4C,EAAAA,YAAiCC,EAAAA,wBAAjB1C,EAAA,aAAa,CAAA,EAAA,EAAA,GAAAN,EAAA,kJCDpBkN,GAAgB/F,GACR,6BACD,KAAKA,CAAK,EAIjBgG,GAAoB/F,GAI5B,CACH,MAAM+C,EAAmB,CAAA,EACzB,IAAIlC,EAAQ,EAERb,EAAS,OAAS,EACpB+C,EAAO,KAAK,6CAA6C,EAEzDlC,GAAS,EAGN,QAAQ,KAAKb,CAAQ,EAGxBa,GAAS,EAFTkC,EAAO,KAAK,qDAAqD,EAK9D,QAAQ,KAAK/C,CAAQ,EAGxBa,GAAS,EAFTkC,EAAO,KAAK,qDAAqD,EAK9D,KAAK,KAAK/C,CAAQ,EAGrBa,GAAS,EAFTkC,EAAO,KAAK,2CAA2C,EAKpD,yBAAyB,KAAK/C,CAAQ,EAGzCa,GAAS,EAFTkC,EAAO,KAAK,sDAAsD,EAKpE,MAAMiD,EAAUjD,EAAO,SAAW,EAClC,IAAIkD,EAAyC,OAE7C,OAAIpF,GAAS,EACXoF,EAAW,SACFpF,GAAS,IAClBoF,EAAW,UAGN,CAAE,QAAAD,EAAS,SAAAC,EAAU,OAAAlD,CAAA,CAC9B,EAGamD,GAAeC,GACnBA,EAAK,OAAO,QAAU,EAIlBC,GAAgBC,GACR,yBACD,KAAKA,EAAM,QAAQ,cAAe,EAAE,CAAC,EAI5CC,GAAclK,GAClBA,EAAM,OAAO,OAAS,EAIlBmK,GAAiB,CAACvG,EAAkBwG,IACxCxG,IAAawG,EAITtD,GAAc,CAACjD,EAAoBC,IAA8B,CAC5E,MAAMuG,EAAQxG,GAAW,OAAO,CAAC,EAAE,eAAiB,GAC9CyG,EAAOxG,GAAU,OAAO,CAAC,EAAE,eAAiB,GAClD,OAAOuG,EAAQC,GAAQ,GACzB,EAGaC,GAAcC,IACf,OAAOA,GAAS,SAAW,IAAI,KAAKA,CAAI,EAAIA,GAC7C,mBAAmB,QAAS,CACnC,KAAM,UACN,MAAO,OACP,IAAK,SAAA,CACN,EAIUC,GAAW,CACtBC,EACAC,IACuC,CACvC,IAAIC,EACJ,MAAO,IAAI1B,IAAwB,CACjC,aAAa0B,CAAO,EACpBA,EAAU,WAAW,IAAMF,EAAK,GAAGxB,CAAI,EAAGyB,CAAI,CAChD,CACF"}
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.cjs.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":"4bAwCA,MAAMA,EAAQC,EASRC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAc,CAAC,uBAAuB,EAEtCC,EAAiB,CACrB,QAAS,8CACT,MAAO,wCACP,QAAS,iDACT,KAAM,0CAAA,EAGR,MAAO,CACL,GAAGD,EACHC,EAAeL,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACZ,CAAC,EAEKM,EAAeH,EAAAA,SAAS,IAQrB,CACL,2BARqB,CACrB,QAAS,iBACT,MAAO,eACP,QAAS,kBACT,KAAM,eAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKO,EAAiBJ,EAAAA,SAAS,IAQvB,CACL,UARqB,CACrB,QAAS,iBACT,MAAO,eACP,QAAS,kBACT,KAAM,eAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKQ,EAAiBL,EAAAA,SAAS,IAQvB,CACL,2GARqB,CACrB,QAAS,sCACT,MAAO,kCACP,QAAS,wCACT,KAAM,mCAAA,EAKSH,EAAM,OAAO,CAAA,EAC5B,KAAK,GAAG,CACX,EAEKS,EAAWN,EAAAA,SAAS,KACV,CACZ,QAAS,wIACT,MAAO,0NACP,QAAS,oNACT,KAAM,kIAAA,GAGKH,EAAM,OAAO,CAC3B,8OAlHQU,EAAA,CAAA,MAAM,kBAAA,EACJC,EAAA,CAAA,MAAM,eAAA,KACJ,MAAM,UAAU,KAAK,eAAe,QAAQ,YAAY,cAAY,gBAKtEC,EAAA,CAAA,MAAM,aAAA,WAOa,MAAM,yCAflC,OAAAC,EAAAA,UAAA,EAAAC,EAAAA,mBA0BM,MAAA,CA1BA,MAAKC,EAAAA,eAAEC,EAAA,YAAY,EAAE,KAAK,OAAA,GAC9BC,EAAAA,mBAwBM,MAxBNP,EAwBM,CAvBJO,EAAAA,mBAIM,MAJNN,EAIM,EAAAE,EAAAA,YAHJC,EAAAA,mBAEM,MAFNI,EAEM,CADJD,EAAAA,mBAA8D,OAAA,CAAxD,YAAU,UAAW,EAAGD,EAAA,SAAU,YAAU,SAAA,EAAA,KAAA,EAAAG,CAAA,OAItDF,EAAAA,mBAKM,MALNL,EAKM,CAJMQ,EAAA,OAAAP,EAAAA,UAAA,EAAVC,EAAAA,mBAAuD,KAAA,CAAA,IAAA,EAArC,MAAKC,EAAAA,eAAEC,EAAA,YAAY,CAAA,oBAAKI,EAAA,KAAK,EAAA,CAAA,GAAAC,EAAAA,mBAAA,OAAA,EAAA,EAC/CJ,EAAAA,mBAEM,MAAA,CAFA,MAAKF,EAAAA,eAAEC,EAAA,cAAc,CAAA,GACzBM,EAAAA,WAA0BC,sBAA1B,IAA0B,CAAAC,EAAAA,kCAAjBJ,EAAA,OAAO,EAAA,CAAA,CAAA,CAAA,QAITA,EAAA,aAAAP,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATNW,EASM,CARJR,EAAAA,mBAOS,SAAA,CAPD,KAAK,SAAU,MAAKF,EAAAA,eAAEC,EAAA,cAAc,EAAG,QAAKU,eAAEH,EAAA,MAAK,SAAA,EAAA,eACzDN,EAAAA,mBAAoC,OAAA,CAA9B,MAAM,SAAA,EAAU,UAAO,EAAA,EAC7BA,EAAAA,mBAIM,MAAA,CAJD,MAAM,UAAU,KAAK,eAAe,QAAQ,WAAA,GAC/CA,EAAAA,mBAEwB,OAAA,CAFlB,YAAU,UACd,EAAE,qMACF,YAAU,SAAA,CAAA,slBCQxB,MAAMjB,EAAQC,EAaR0B,EAAgBxB,EAAAA,SAAS,IAAM,CACnC,MAAMC,EAAc,CAClB,4OAAA,EAIIwB,EAAc,CAClB,GAAI,+BACJ,GAAI,iCACJ,GAAI,gCAAA,EAIAvB,EAAiB,CACrB,QAAS,2DACT,UAAW,8CACX,MAAO,8DACP,QAAS,kFAAA,EAILwB,EAAe7B,EAAM,UAAY,SAAW,GAElD,MAAO,CACL,GAAGI,EACHwB,EAAY5B,EAAM,IAAI,EACtBK,EAAeL,EAAM,OAAO,EAC5B6B,CAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,+IAtEwB,MAAM,oDAQd,MAAM,wFATrBf,EAAAA,mBAaS,SAAA,CAbA,KAAMM,EAAA,KAAO,SAAUA,EAAA,UAAYA,EAAA,QAAU,MAAKL,EAAAA,eAAEC,EAAA,aAAa,EAAG,QAAKU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,QAAUO,CAAM,EAAA,EAAA,CAC3FV,EAAA,SAAAP,EAAAA,UAAA,EAAZC,EAAAA,mBAOO,OAPPH,GAOO,CAAAe,EAAA,CAAA,IAAAA,EAAA,CAAA,EANLT,EAAAA,mBAIM,MAAA,CAJD,MAAM,uBAAuB,KAAK,OAAO,QAAQ,WAAA,GACpDA,EAAAA,mBAA2F,SAAA,CAAnF,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,OAAO,eAAe,eAAa,GAAA,CAAA,EACrFA,EAAAA,mBAC4H,OAAA,CADtH,MAAM,aAAa,KAAK,eAC5B,EAAE,qHAAA,CAAA,QAENA,EAAAA,mBAA8C,OAAA,KAAAc,kBAArCX,EAAA,aAAW,YAAA,EAAA,CAAA,CAAA,CAAA,IAAAP,EAAAA,UAAA,EAEtBC,qBAGO,OAHPI,GAGO,CAFLI,aAAoBC,EAAA,OAAA,MAAA,EACpBD,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,0WCad,MAAMvB,EAAQC,EAMR+B,EAAc7B,EAAAA,SAAS,IAAM,CACjC,MAAMC,EAAc,CAAC,iCAAiC,EAGhDC,EAAiB,CACrB,QAAS,aACT,OAAQ,+BACR,QAAS,YAAA,EAIL4B,EAAiB,CACrB,GAAI,MACJ,GAAI,MACJ,GAAI,KAAA,EAIAC,EAAgB,CACpB,KAAM,GACN,GAAI,YACJ,GAAI,YACJ,GAAI,WAAA,EAGN,MAAO,CACL,GAAG9B,EACHC,EAAeL,EAAM,OAAO,EAC5BiC,EAAejC,EAAM,OAAO,EAC5BkC,EAAclC,EAAM,MAAM,CAAA,EAC1B,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,sHA5DgC,MAAM,sCAI9BW,GAAA,CAAA,MAAM,WAAA,YAIkB,MAAM,+DATrC,OAAAE,EAAAA,UAAA,EAAAC,EAAAA,mBAYM,MAAA,CAZA,MAAKC,EAAAA,eAAEC,EAAA,WAAW,CAAA,GACXO,EAAA,OAAM,QAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAAsBC,EAAA,OAAA,QAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,EAGxBJ,EAAAA,mBAEM,MAFNN,GAEM,CADJW,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,EAGCA,EAAA,OAAM,QAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNI,GAEM,CADJI,aAAsBC,EAAA,OAAA,QAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,qoBC4C5B,MAAMrB,EAAQC,EAKRkC,EAAOC,EAMPC,EAAQC,EAAAA,SAAA,EACRC,EAAeC,EAAAA,IAAI,EAAK,EACxBC,EAAUD,EAAAA,IAAI,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EAAE,EAEhEE,EAAevC,EAAAA,SAAS,IACxBH,EAAM,OAAS,WACVuC,EAAa,MAAQ,OAAS,WAEhCvC,EAAM,IACd,EAEK2C,EAAexC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAc,CAClB,wMAAA,EAIIwB,EAAc,CAClB,GAAI,oBACJ,GAAI,sBACJ,GAAI,qBAAA,EAIAgB,EAAe5C,EAAM,MACvB,yEACA,GAGE6C,EAAcR,EAAM,KAAU,QAAU,GACxCS,EAAkB9C,EAAM,OAAS,WAAa,QAAU,GAE9D,MAAO,CACL,GAAGI,EACHwB,EAAY5B,EAAM,IAAI,EACtB4C,EACAC,EACAC,CAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,+FAEoBC,GAAiB,CACpC,MAAMC,EAASD,EAAM,OACrBZ,EAAK,oBAAqBa,EAAO,KAAK,CACxC,2BAEiC,IAAM,CACrCT,EAAa,MAAQ,CAACA,EAAa,KACrC,mFAjHO7B,GAAA,CAAA,MAAM,WAAA,uBAGe,MAAM,gBAGzBS,GAAA,CAAA,MAAM,UAAA,wFASkB,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,uBAIvE,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,uBAQ7C,MAAM,kFAMnB,MAAM,kCACE,MAAM,kDAlChC,OAAAN,YAAA,EAAAC,qBAmCM,MAnCNJ,GAmCM,CAlCSU,uBAAbN,EAAAA,mBAGQ,QAAA,CAAA,IAAA,EAHa,IAAKE,EAAA,QAAS,MAAM,yCAAA,EAAA,mBACpCe,kBAAAX,EAAA,KAAK,EAAG,IACX,CAAA,EAAYA,EAAA,UAAAP,YAAA,EAAZC,qBAAmD,OAAnDI,GAA2C,GAAC,GAAAG,qBAAA,OAAA,EAAA,0CAG9CJ,EAAAA,mBAwBM,MAxBNE,GAwBM,CAvBJF,EAAAA,mBAEkE,QAAA,CAF1D,GAAID,EAAA,QAAU,KAAMA,EAAA,aAAe,MAAOI,EAAA,WAAa,YAAaA,EAAA,YAAc,SAAUA,EAAA,SACjG,SAAUA,EAAA,SAAW,aAAcA,EAAA,aAAe,MAAKL,EAAAA,eAAEC,EAAA,YAAY,EAAG,QAAOA,EAAA,YAC/E,OAAIU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,OAASO,CAAM,GAAI,QAAKJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEP,EAAA,MAAK,QAAUO,CAAM,EAAA,EAAA,KAAA,GAAAlB,EAAA,EAE7DS,EAAAA,mBAAA,8BAAA,EACcD,EAAA,OAAI,0BAAlBN,EAAAA,mBAYS,SAAA,CAAA,IAAA,EAZ0B,KAAK,SACtC,MAAM,4MACL,QAAOE,EAAA,wBAAA,EAAA,CACGA,EAAA,cAAAH,YAAA,EAAXC,EAAAA,mBAGM,MAHNW,GAGMC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBAC4L,OAAA,CADtL,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAChE,EAAE,qLAAA,UAEN,EAAA,IAAAJ,EAAAA,YAAAC,EAAAA,mBAIM,MAJNmC,GAIMvB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAHJT,EAAAA,mBAA6G,OAAA,CAAvG,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kCAAA,WACxEA,EAAAA,mBACgI,OAAA,CAD1H,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAChE,EAAE,yHAAA,kDAIRI,EAAAA,mBAAA,aAAA,EACWE,EAAA,OAAM,MAAAV,EAAAA,UAAA,EAAjBC,EAAAA,mBAEM,MAFNoC,GAEM,CADJ5B,EAAAA,WAAoBC,EAAA,OAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA,GAAAF,EAAAA,mBAAA,OAAA,EAAA,IAIxBA,EAAAA,mBAAA,8BAAA,EACSD,EAAA,OAAAP,EAAAA,UAAA,EAATC,EAAAA,mBAA4D,IAA5DqC,GAA4DpB,EAAAA,gBAAZX,EAAA,KAAK,EAAA,CAAA,GACvCA,EAAA,UAAAP,EAAAA,UAAA,EAAdC,EAAAA,mBAAwE,IAAxEsC,GAAwErB,EAAAA,gBAAfX,EAAA,QAAQ,EAAA,CAAA,GAAAC,EAAAA,mBAAA,OAAA,EAAA,2gBCjBrE,MAAMrB,EAAQC,EAORkC,EAAOC,EAIPiB,EAAMlD,EAAAA,SAAS,IACfH,EAAM,GAAW,cACjBA,EAAM,KAAa,IAChB,QACR,EAEKsD,EAAYnD,EAAAA,SAAS,IAAM,CAC/B,MAAMoD,EAAiC,CAAA,EAEvC,OAAIvD,EAAM,GACRuD,EAAU,GAAQvD,EAAM,GACfA,EAAM,MACfuD,EAAU,KAAUvD,EAAM,KACtBA,EAAM,WACRuD,EAAU,OAAY,SACtBA,EAAU,IAAS,wBAGrBA,EAAU,KAAU,SAGlBvD,EAAM,WACRuD,EAAU,SAAc,GACxBA,EAAU,eAAe,EAAI,IAGxBA,CACT,CAAC,EAEKC,EAAcrD,EAAAA,SAAS,IAAM,CACjC,MAAMC,EAAc,CAClB,gOAAA,EAIIwB,EAAc,CAClB,GAAI,UACJ,GAAI,UACJ,GAAI,WAAA,EAIAvB,EAAiB,CACrB,QAAS,0CACT,UAAW,oCACX,MAAO,wEACP,UAAW,6FAAA,EAGb,MAAO,CACL,GAAGD,EACHwB,EAAY5B,EAAM,IAAI,EACtBK,EAAeL,EAAM,OAAO,CAAA,EAC5B,OAAO,OAAO,EAAE,KAAK,GAAG,CAC5B,CAAC,gEAEoB+C,GAAsB,CACpC/C,EAAM,UACTmC,EAAK,QAASY,CAAK,CAEvB,iIAxFEU,cAEYC,EAAAA,wBAFI1C,EAAA,GAAG,EAAnB2C,EAAAA,WAEY,CAFU,MAAO3C,EAAA,WAAA,EAAqBA,EAAA,UAAS,CAAG,QAAOA,EAAA,WAAA,CAAW,EAAA,CAAA,QAAA4C,EAAAA,QAC9E,IAAQ,CAARtC,aAAQC,EAAA,OAAA,SAAA,CAAA,CAAA,uUCuCZ,MAAMvB,EAAQC,EACRkC,EAAOC,EAEPyB,EAAarB,EAAAA,IAAmB,EAAE,EAClCsB,EAAiBtB,EAAAA,IAAI,CACzB,MAAO,MACP,KAAM,MACN,QAAS,GAAA,CACV,EAED,IAAIuB,EAAkB,GAClBC,EAAc,GAElB,MAAMC,EAAiB,MAAOC,EAAeC,IAAkB,CACzDH,IAEJ7B,EAAK,oBAAqB+B,CAAK,EAC/B,MAAME,WAAA,EACNC,EAAwBF,CAAK,EAC/B,EAEME,EAA0B,MAAOC,GAAqB,CAC1D,GAAI,CAACT,EAAW,MAAMS,CAAQ,GAAKA,IAAaP,EAAiB,OAEjEC,EAAc,GACd,MAAMO,EAASV,EAAW,MAAMS,CAAQ,EAClCE,EAAYD,EAAO,cAEzB,GAAI,CAACC,EAAW,OAEhB,MAAMC,EAAUF,EAAO,sBAAA,EACjBG,EAAgBF,EAAU,sBAAA,EAC1BG,EAAUF,EAAQ,KAAOC,EAAc,KACvCE,EAAWH,EAAQ,MAEzB,GAAIV,IAAoB,GAAI,CAE1BD,EAAe,MAAQ,CACrB,MAAO,GAAGc,CAAQ,KAClB,KAAM,GAAGD,CAAO,KAChB,QAAS,GAAA,EAEXZ,EAAkBO,EAClBN,EAAc,GACd,MACF,CAGA,MAAMa,EADahB,EAAW,MAAME,CAAe,EACpB,sBAAA,EACzBe,EAAcD,EAAY,KAAOH,EAAc,KAC/CK,EAAeF,EAAY,MAG3BG,EAAgBV,EAAWP,EAC3BkB,EAAcD,EAAgBF,EAAcH,EAC5CO,EAAeF,EAChBL,EAAUC,EAAYE,EACtBA,EAAcC,EAAgBJ,EAGnCb,EAAe,MAAQ,CACrB,MAAO,GAAGoB,CAAY,KACtB,KAAM,GAAGD,CAAW,KACpB,QAAS,GAAA,EAIX,WAAW,IAAM,CACfnB,EAAe,MAAQ,CACrB,MAAO,GAAGc,CAAQ,KAClB,KAAM,GAAGD,CAAO,KAChB,QAAS,GAAA,EAEXZ,EAAkBO,EAClB,WAAW,IAAM,CACfN,EAAc,EAChB,EAAG,GAAG,CACR,EAAG,GAAG,CACR,EAGAmB,EAAAA,UAAU,SAAY,CACpB,MAAMf,WAAA,EACN,MAAMgB,EAAcpF,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,EAC1EoF,IAAgB,IAClBf,EAAwBe,CAAW,CAEvC,CAAC,EAGD,MAAME,EAAiBnF,EAAAA,SAAS,IAC9BH,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,CAAA,EAItD,CAAE,WAAAuF,CAAA,EAAeC,EAAAA,OAAOxF,CAAK,EACnCyF,EAAAA,MAAMF,EAAY,SAAY,CAC5B,MAAMnB,WAAA,EACN,MAAMgB,EAAcpF,EAAM,KAAK,aAAiBqF,EAAI,QAAUrF,EAAM,UAAU,EAC1EoF,IAAgB,IAClBf,EAAwBe,CAAW,CAEvC,CAAC,kUA9IM1E,GAAA,CAAA,MAAM,UAAA,MAEJ,MAAM,4CAA4C,KAAK,wFAF9D,OAAAG,YAAA,EAAAC,qBAoBM,MApBNJ,GAoBM,CAnBJW,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAiBM,MAjBNN,GAiBM,EAAAE,EAAAA,UAAA,EAAA,EAhBJC,EAAAA,mBAUS4E,EAAAA,SAAA,KAAAC,EAAAA,WAVsBvE,EAAA,KAAI,CAAnBiE,EAAKlB,mBAArBrD,EAAAA,mBAUS,SAAA,CAV6B,IAAKuE,EAAI,MAAA,QAAA,GAAO,IAAI,aAAc,MAAKtE,EAAAA,eAAA,CAAA,qPAA4RC,EAAA,aAAeqE,EAAI,MAAA,mBAAA,qBAOxX,gBAAerE,eAAeqE,EAAI,MAAQ,gBAAa,YAAcA,EAAI,KAAK,GAAK,GAAE,OAASA,EAAI,KAAK,GACzG,KAAK,MAAO,QAAKvD,GAAEd,EAAA,eAAeqE,EAAI,MAAOlB,CAAK,CAAA,EAAApC,EAAAA,gBAC/CsD,EAAI,KAAK,EAAA,GAAAnE,EAAA,EAAA,QAGdG,EAAAA,mBAAA,iCAAA,EACAJ,EAAAA,mBAE4B,MAAA,CAD1B,MAAM,kIACL,MAAK2E,EAAAA,eAAE5E,EAAA,cAAc,CAAA,yQCL9B,MAAMhB,EAAQC,EAGR,CAAE,OAAA4F,CAAA,EAAWC,mBAAiB9F,EAAM,MAAM,EAG1C+F,EAAsB5F,EAAAA,SAAS,IACnB0F,EAAO,MAAM,UACV,6BACpB,6HCvBDG,GAAe,2jvDDCmB,MAAM,sHAA3BhF,EAAA,qBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNJ,GAEMgB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAAyE,MAAA,CAApE,IAAA+E,GAA8C,MAAM,aAAA,2MEwCtD,SAASC,EAAkBC,EAAoC,GAAI,CACxE,KAAM,CAAE,OAAAC,CAAA,EAAWL,mBAAA,EAEbM,EAAY5D,EAAAA,IAAqB,EAAE,EACnC6D,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAmB,IAAI,EAE/B+D,EAAmBpG,EAAAA,SAAS,IAChCiG,EAAU,MAAM,OAAOI,GAAYA,EAAS,OAAO,CAAA,EAG/CC,EAAiB,SAAY,CACjCJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KAEd,GAAI,CACF,MAAMI,EAAW,MAAM,MAAMP,EAAO,gBAAgB,EAAG,CACrD,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,CAClB,CACD,EAED,GAAI,CAACO,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAiC,MAAMF,EAAS,KAAA,EAEtD,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,iCAAiC,EAG5ER,EAAU,MAAQQ,EAAO,MAAQ,CAAA,CACnC,OAASC,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,kCAC1DP,EAAM,MAAQQ,CAChB,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,EAEMU,EAAqB,MACzBC,EACAC,IACoB,CACpB,MAAMC,EAAgB,CAAE,GAAGhB,EAAS,GAAGe,CAAA,EAGjCE,EAAS,IAAI,gBAEfD,EAAc,aAChBC,EAAO,OAAO,eAAgBD,EAAc,WAAW,EAGrDA,EAAc,QAAUA,EAAc,OAAO,OAAS,GACxDC,EAAO,OAAO,SAAUD,EAAc,OAAO,KAAK,GAAG,CAAC,EAGxD,MAAME,EAAcD,EAAO,SAAA,EACrBE,EAAclB,EAAO,eAAe,EAAE,QAAQ,gBAAiBa,CAAU,EACzEM,EAAUF,EAAc,GAAGC,CAAW,IAAID,CAAW,GAAKC,EAEhE,GAAI,CACF,MAAMX,EAAW,MAAM,MAAMY,EAAS,CACpC,OAAQ,MACR,QAAS,CACP,eAAgB,kBAAA,CAClB,CACD,EAED,GAAI,CAACZ,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAEA,MAAME,EAAuC,MAAMF,EAAS,KAAA,EAE5D,GAAI,CAACE,EAAO,QACV,MAAM,IAAI,MAAMA,EAAO,OAAO,SAAW,8BAA8B,EAGzE,OAAOA,EAAO,KAAK,OACrB,OAASC,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,+BAC1D,MAAM,IAAI,MAAMC,CAAY,CAC9B,CACF,EAEMS,EAAqB,MACzBP,EACAC,IACG,CACH,GAAI,CACF,MAAMO,EAAU,MAAMT,EAAmBC,EAAYC,CAAa,EAClE,OAAO,SAAS,KAAOO,CACzB,OAASX,EAAK,CACZ,MAAAP,EAAM,MAAQO,aAAe,MAAQA,EAAI,QAAU,uCAC7CA,CACR,CACF,EAEMY,EAAmBT,GAChBZ,EAAU,MAAM,KAAKI,GAAYA,EAAS,KAAOQ,CAAU,EAG9DU,EAAmBlB,GAAoC,CAE3D,GAAIA,EAAS,QACX,OAAOA,EAAS,QAIlB,OAAQA,EAAS,GAAG,YAAA,EAAY,CAC9B,IAAK,SACH,MAAO,63BACT,IAAK,SACH,MAAO,6iCACT,IAAK,YACL,IAAK,QACH,MAAO,6VACT,IAAK,UACH,MAAO,izBACT,QAEE,MAAO,oSAAA,CAEb,EAEA,MAAO,CACL,UAAWrG,EAAAA,SAAS,IAAMiG,EAAU,KAAK,EACzC,iBAAAG,EACA,QAASpG,EAAAA,SAAS,IAAMkG,EAAQ,KAAK,EACrC,MAAOlG,EAAAA,SAAS,IAAMmG,EAAM,KAAK,EACjC,eAAAG,EACA,mBAAAM,EACA,mBAAAQ,EACA,gBAAAE,EACA,gBAAAC,CAAA,CAEJ,6SCJA,MAAM1H,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA+D,EAAQ,gBAAAwB,CAAA,EAAoB7B,EAAAA,iBAAiB9F,EAAM,MAAM,EAEjE,QAAQ,IAAI,iBAAkB2H,GAAiB,EAG/C,KAAM,CACJ,iBAAApB,EACA,QAASqB,EACT,MAAOC,EACP,eAAApB,EACA,mBAAAc,EACA,gBAAAG,CAAA,EACEzB,EAAkB,CACpB,YAAajG,EAAM,WAAA,CACpB,EAGDmF,EAAAA,UAAU,IAAM,CACdsB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAGD,MAAMiB,EAAmB3H,EAAAA,SAAS,IAEzBoG,EAAiB,KACzB,EAGKwB,EAAU,CACd,MAAM,OAAOC,EAAeC,EAAkB,CAC5C,MAAMvB,EAAW,MAAM,MAAMP,EAAO,QAAQ,EAAG,CAC7C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAE,MAAA6B,EAAO,SAAAC,EAAU,CAAA,CACzC,EAED,GAAI,CAACvB,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAIA,OAFe,MAAMA,EAAS,KAAA,CAGhC,EAEA,MAAM,OAAOsB,EAAeC,EAAkBC,EAAmBC,EAAkB,CACjF,MAAMzB,EAAW,MAAM,MAAMP,EAAO,QAAQ,EAAG,CAC7C,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAE,MAAA6B,EAAO,SAAAC,EAAU,UAAAC,EAAW,SAAAC,EAAU,CAAA,CAC9D,EAED,GAAI,CAACzB,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAA,EAAG,EACxD,MAAM,IAAI,MAAMC,EAAU,OAAO,SAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC/F,CAIA,OAFe,MAAMA,EAAS,KAAA,GAEhB,OAChB,EAEA,MAAM,qBAAqBsB,EAAe,CAGxC,MAAM,IAAI,MAAM,yFAAyF,CAuB3G,CAAA,EAGII,EAAc5F,EAAAA,IAAIxC,EAAM,IAAI,EAC5BqG,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAI,EAAE,EACd6F,EAA2B7F,EAAAA,IAAI,EAAK,EAEpC8F,EAAOC,EAAAA,SAAS,CACpB,UAAW,GACX,SAAU,GACV,MAAO,GACP,SAAU,GACV,gBAAiB,EAAA,CAClB,EAEKC,EAAWrI,EAAAA,SAAS,IAAMiI,EAAY,QAAU,QAAQ,EACxDK,EAAkBtI,EAAAA,SAAS,IAAMiI,EAAY,QAAU,gBAAgB,EAEvEM,EAAkBvI,EAAAA,SAAS,IACxBmI,EAAK,WAAaA,EAAK,eAC/B,EAEKK,EAAcxI,EAAAA,SAAS,IACvBsI,EAAgB,MACXH,EAAK,MAAM,KAAA,GAAU,CAACD,EAAyB,MAGpDG,EAAS,MACJF,EAAK,MAAM,KAAA,EAGbA,EAAK,MAAM,KAAA,GAAUA,EAAK,QAClC,EAGKM,EAA4B,CAChC,KAAM,CACJ,MAAO,OACP,MAAO,iBACP,QAAS,aACT,UAAW,eACX,MAAO,EAAA,EAET,OAAQ,CACN,MAAO,SACP,MAAO,oBACP,QAAS,gBACT,UAAW,kBACX,MAAO,EAAA,EAET,OAAQ,CACN,MAAO,SACP,MAAO,qBACP,QAAS,iBACT,UAAW,mBACX,MAAO,GAAA,CACT,EAGIC,EAAuBZ,GAAqB,CAChD,IAAIa,EAAQ,EAERb,EAAS,QAAU,IAAGa,GAAS,GAC/Bb,EAAS,QAAU,KAAIa,GAAS,GAChC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,QAAQ,KAAKb,CAAQ,IAAGa,GAAS,GACjC,eAAe,KAAKb,CAAQ,IAAGa,GAAS,GAE5C,MAAMjD,EAASiD,GAAS,EAAIF,EAA0B,KAClDE,GAAS,EAAIF,EAA0B,OACvCA,EAA0B,OAE9B,MAAO,CAAE,MAAAE,EAAO,GAAGjD,CAAA,CACrB,EAEMkD,EAAa,SAAY,CAC7B1C,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CACF,GAAImC,EAAgB,MAElB,MAAMV,EAAQ,qBAAqBO,EAAK,KAAK,EAC7CD,EAAyB,MAAQ,GACjClG,EAAK,sBAAuBmG,EAAK,KAAK,UAC7BE,EAAS,MAAO,CAEzB,MAAM9B,EAAW,MAAMqB,EAAQ,OAC7BO,EAAK,MACLA,EAAK,SACLA,EAAK,UACLA,EAAK,QAAA,EAEPnG,EAAK,UAAWuE,EAAS,IAAI,CAC/B,KAAO,CAEL,MAAMA,EAAW,MAAMqB,EAAQ,OAAOO,EAAK,MAAOA,EAAK,QAAQ,EAC/DnG,EAAK,UAAWuE,EAAS,IAAI,CAC/B,CACF,OAASG,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,+BAC1DP,EAAM,MAAQQ,EACd3E,EAAK,QAAS2E,CAAY,CAC5B,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,EAEM2C,EAAkB,MAAOhC,GAAuB,CACpD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAahH,EAAM,WAAA,CACpB,CACH,OAAS6G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,aAAa2B,EAAS,MAAQ,UAAY,SAAS,SAASxB,CAAU,GAChIV,EAAM,MAAQQ,EACd3E,EAAK,QAAS2E,CAAY,CAC5B,CACF,EAGArB,EAAAA,MAAM,IAAMzF,EAAM,KAAOiJ,GAAY,CACnCb,EAAY,MAAQa,CACtB,CAAC,EAGDxD,QAAM2C,EAAca,GAAY,CAC9B3C,EAAM,MAAQ,GACd+B,EAAyB,MAAQ,GAEjCC,EAAK,UAAY,GACjBA,EAAK,SAAW,GAChBA,EAAK,MAAQ,GACbA,EAAK,SAAW,GAChBA,EAAK,gBAAkB,GACvBnG,EAAK,eAAgB8G,CAAO,CAC9B,CAAC,+nBAnaMvI,GAAA,CAAA,MAAM,oDAAA,EAGFC,GAAA,CAAA,MAAM,kBAAA,MAiBoB,IAAI,OAAO,MAAM,YAUW,IAAI,QAAQ,MAAM,kBAUlEC,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,aAKnEuC,GAAA,CAAA,MAAM,sEAAA,EACVC,GAAA,CAAA,MAAM,wCAAA,EAGV8F,GAAA,CAAA,MAAM,aAAA,MASyC,IAAI,UAAU,MAAM,qBACrEC,GAAA,CAAA,MAAM,cAAA,EAMTC,GAAA,CAAA,MAAM,WAAA,EAOmCC,GAAA,CAAA,IAAI,kBAAA,EACvCC,GAAA,CAAA,MAAM,wCAAA,MAqCW,IAAI,YAAY,MAAM,8BAetB,MAAM,oBAC/BC,GAAA,CAAA,MAAM,0BAAA,2BA9If,OAAA1I,YAAA,EAAAC,qBAyJM,MAzJNJ,GAyJM,CAxJJ8I,EAAAA,YAuJSxI,EAAA,OAAA,CAvJD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EACAJ,EAAAA,mBAaM,MAbNN,GAaM,CAZJ6I,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,OAAO,KAAK,QAAA,EAAA,mBAC3B,IAEK,EAAA5I,EAAAA,UAAA,EAFLC,EAAAA,mBAEK,KAAA,CAFA,IAAKE,EAAA,YAAa,MAAM,uCAAA,EACxBe,EAAAA,gBAAAf,EAAA,gBAAe,iBAAsBA,EAAA,SAAQ,iBAAA,cAAA,EAAA,CAAA,EAAA,CAAA,QAGpDwI,EAAAA,YAMaC,EAAAA,WAAA,CAND,KAAK,OAAO,KAAK,QAAA,EAAA,mBAC3B,IAII,EAAA5I,EAAAA,UAAA,EAJJC,EAAAA,mBAII,IAAA,CAJA,IAAKE,EAAA,YAAa,MAAM,kBAAA,EACvBe,EAAAA,gBAAAf,EAAA,gBAAe,4EAAkFA,EAAA,SAAA,6CAAA,qCAAA,gBAO1GK,EAAAA,mBAAA,8CAAA,EACAmI,EAAAA,YAOaC,EAAAA,WAAA,CAPD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAKM,CALMzI,EAAA,iDAAAH,EAAAA,UAAA,EAAZC,EAAAA,mBAKM,MALNI,GAKM,CAJJsI,cAGKxI,EAAA,OAAA,CAAA,WAHYA,EAAA,YAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAAd,EAAA,YAAWc,GAAG,KAAM,CAAA,CAAA,MAAA,UAAA,MAAA,QAAA,uEAOzCT,EAAAA,mBAAA,kDAAA,EACAmI,EAAAA,YAyCaC,EAAAA,WAAA,CAzCD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAuCM,CAAA,CAvCMzI,EAAA,iBAAmBA,EAAA,kBAAkB,QAAAH,EAAAA,YAAjDC,EAAAA,mBAuCM,MAvCNK,GAuCM,EAAAN,EAAAA,UAAA,EAAA,EAtCJC,EAAAA,mBAqCW4E,EAAAA,SAAA,KAAAC,EAAAA,WApCU3E,EAAA,iBAAZwF,kBADT/C,EAAAA,YAqCWzC,EAAA,SAAA,CAnCR,IAAKwF,EAAS,GACf,QAAQ,UACR,aAAA,GACC,SAAUxF,EAAA,aACV,QAAKc,GAAEd,EAAA,gBAAgBwF,EAAS,EAAE,EACnC,MAAM,iBAAA,EAAA,mBAEN,IAwBM,CAxBNvF,EAAAA,mBAwBM,MAxBNL,GAwBM,CAvBJS,EAAAA,mBAAA,0BAAA,EACWmF,EAAS,SAAA3F,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNW,GAEM,CADJR,EAAAA,mBAAsG,MAAA,CAAhG,IAAKuF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAAvD,EAAA,CAG5E,CAAA,GAAAuD,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAuF,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNoC,GAGM,CAAA,GAAAxB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAGjtBC,EAAAA,mBAEM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAHNrE,EAAAA,mBAAA,oCAAA,EACAJ,EAAAA,mBAEM,MAFNkC,GAEM,CADJlC,EAAAA,mBAAiI,OAAjImC,GAAiIrB,mBAAxEyE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,YAGzHvF,EAAAA,mBAEO,OAFPiI,GAA0B,kBACVnH,EAAAA,gBAAGyE,EAAS,aAAeA,EAAS,KAAK,OAAM,CAAA,EAAI,YAAA,EAAgBA,EAAS,KAAK,MAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,uFAM5GnF,EAAAA,mBAAA,0CAAA,EACAmI,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAEM,CAAA,CAFMzI,EAAA,iBAAmBA,EAAA,kBAAkB,QAAAH,EAAAA,YAAjDC,EAAAA,mBAEM,MAFN4I,GAEM,CADJzI,EAAAA,mBAA6F,OAA7FkI,GAA2B,MAAGpH,EAAAA,gBAAGf,EAAA,SAAQ,iBAAA,SAAA,EAAkC,cAAW,CAAA,CAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,UAI1FA,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAmCO,OAAA,CAnCA,SAAM0I,EAAAA,cAAU3I,EAAA,WAAU,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACvCC,EAAAA,mBAqBM,MArBNmI,GAqBM,CApBJ/H,EAAAA,mBAAA,SAAA,EACAmI,cACkFxI,EAAA,QAAA,CAAA,WADhEA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAAgB,YAAY,mBAAmB,SAAA,GAC9F,aAAa,QAAS,MAAOd,EAAA,OAAK,CAAKA,EAAA,KAAK,MAAK,oBAAA,EAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEnDK,EAAAA,mBAAA,2BAAA,EACAmI,EAAAA,YAcaC,EAAAA,WAAA,CAdD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAYM,CAAA,CAZMzI,EAAA,iBAAe,CAAKA,EAAA,UAAAH,EAAAA,YAAhCC,EAAAA,mBAYM,MAZNuI,GAYM,CAXJpI,EAAAA,mBAKM,MALNqI,GAKM,CAAA5H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAJJT,EAAAA,mBAA+D,OAAA,CAAzD,MAAM,mCAAA,EAAoC,WAAQ,EAAA,GACxDuI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAU,KAAK,KAAM,QAAKU,eAAEV,EAAA,YAAW,iBAAA,EAAA,mBAAqB,IAE5EU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF4E,qBAE5E,EAAA,CAAA,EAAA,iBAGFgI,cAGmExI,EAAA,QAAA,CAAA,WAHjDA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GAAE,KAAK,WACpC,YAAY,sBAAsB,SAAA,GAClC,aAAa,mBACZ,MAAOd,EAAA,OAAK,CAAKA,EAAA,KAAK,SAAQ,uBAAA,EAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,+CAKvCwI,cAUWxI,EAAA,SAAA,CAVD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,WAAO,CAAKA,EAAA,YAAc,QAASA,EAAA,QAChG,eAAcA,EAAA,gBAAe,kBAAuBA,EAAA,SAAQ,wBAAA,eAAA,EAAA,mBAC7D,IAOE,CAAAQ,EAAAA,gBAPCO,EAAAA,gBAAAf,EAAA,gBAA+BA,EAAA,yBAAA,aAAA,kBAAuGA,EAAA,SAAA,kBAAA,SAAA,0DAW7IK,EAAAA,mBAAA,sCAAA,EACAmI,EAAAA,YAIaC,EAAAA,WAAA,CAJD,KAAK,SAAS,KAAK,QAAA,EAAA,mBAC7B,IAEiC,CAFlBzI,EAAA,iBAAmBA,0CAAlCyC,EAAAA,YAEiCzC,EAAA,QAAA,CAF2B,IAAI,gBAAgB,QAAQ,UACrF,QAAO,0DAA4DA,EAAA,KAAK,KAAK,GAC9E,MAAM,sBAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,UAGVA,EAAAA,mBAAA,yCAAA,EACAmI,EAAAA,YASaC,EAAAA,WAAA,CATD,KAAK,cAAc,KAAK,QAAA,EAAA,mBAClC,IAOM,CAPKzI,EAAA,iBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAOM,MAPN8I,GAOM,CANJJ,cAKSxI,EAAA,OAAA,CALA,QAAKU,eAAEV,EAAA,YAAW,UAAa,MAAM,gCAAA,EAAA,mBAC5C,IAEMU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFNT,EAAAA,mBAEM,MAAA,CAFD,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GAC7DA,EAAAA,mBAA4F,OAAA,CAAtF,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,iBAAA,CAAA,yBACpE,oBAER,EAAA,CAAA,EAAA,2DAIJI,EAAAA,mBAAA,eAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPN+I,GAOM,CANJ5I,EAAAA,mBAKI,IALJsI,GAKI,CAAA7H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAW,KAAI,UAAYA,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,gEAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,0dC9B3C,MAAMhB,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA+D,EAAQ,gBAAAwB,CAAA,EAAoB7B,EAAAA,iBAAiB9F,EAAM,MAAM,EAG3D,CACJ,iBAAAuG,EACA,QAASqB,EACT,MAAOC,EACP,eAAApB,EACA,mBAAAc,CAAA,EACEtB,EAAkB,CACpB,YAAajG,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,EAGDmF,EAAAA,UAAU,IAAM,CACdsB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAED,MAAMR,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAI,EAAE,EAEd8F,EAAOC,EAAAA,SAAS,CACpB,MAAO,GACP,SAAU,EAAA,CACX,0KAEoB,SAAY,CAC/BlC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CAEF,QAAQ,IAAI,mBAAoBgC,CAAI,EACpCnG,EAAK,UAAW,CAAE,MAAOmG,EAAK,MAAO,CACvC,MAAc,CACZhC,EAAM,MAAQ,4BACdnE,EAAK,QAASmE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,oBAE0B,MAAOW,GAAuB,CACtD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAahH,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,CACH,OAAS6G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,0BAA0BG,CAAU,GAC9FV,EAAM,MAAQQ,EACd3E,EAAK,QAAS2E,CAAY,CAC5B,CACF,iOAzLOpG,GAAA,CAAA,MAAM,oDAAA,YAS8B,MAAM,kBAIlCQ,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,uBAInE,MAAM,wEACVgC,GAAA,CAAA,MAAM,wCAAA,EAGVC,GAAA,CAAA,MAAM,aAAA,YAKqB,MAAM,qBAMpC+F,GAAA,CAAA,MAAM,WAAA,EAMFQ,GAAA,CAAA,MAAM,wCAAA,EAsBZP,GAAA,CAAA,MAAM,kBAAA,EACNC,GAAA,CAAA,MAAM,0BAAA,YASmB,MAAM,oBAC/BE,GAAA,CAAA,MAAM,0BAAA,2BAvFf,OAAAzI,YAAA,EAAAC,qBAkGM,MAlGNJ,GAkGM,CAjGJ8I,EAAAA,YAgGSxI,EAAA,OAAA,CAhGD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAmE,KAAA,CAA/D,MAAM,uCAAA,EAAwC,cAAY,EAC9DA,EAAAA,mBAAmE,IAAA,CAAhE,MAAM,kBAAA,EAAmB,qCAAmC,CAAA,OAGjEI,EAAAA,mBAAA,mBAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBA8BM,MA9BNH,GA8BM,EAAAE,EAAAA,UAAA,EAAA,EA7BJC,EAAAA,mBA4BW4E,EAAAA,SAAA,KAAAC,EAAAA,WA5BkB3E,EAAA,iBAAZwF,kBAAjB/C,EAAAA,YA4BWzC,EAAA,SAAA,CA5BqC,IAAKwF,EAAS,GAAI,QAAQ,UAAU,aAAA,GACjF,SAAUxF,EAAA,aACV,QAAKc,GAAEd,EAAA,kBAAkBwF,EAAS,EAAE,EAAG,MAAM,iBAAA,EAAA,mBAC9C,IAuBM,CAvBNvF,EAAAA,mBAuBM,MAvBNC,GAuBM,CAtBJG,EAAAA,mBAAA,0BAAA,EACWmF,EAAS,SAAA3F,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNK,GAEM,CADJF,EAAAA,mBAAsG,MAAA,CAAhG,IAAKuF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAA5F,EAAA,CAG5E,CAAA,GAAA4F,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAuF,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNW,GAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAEjtBC,EAAAA,mBAEM,MAFNmC,GAEM,CADJhC,EAAAA,mBAAiI,OAAjIiC,GAAiInB,mBAAxEyE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,KAGzHvF,EAAAA,mBAA0F,OAA1FkC,GAA0B,iBAAcpB,EAAAA,gBAAGyE,EAAS,aAAeA,EAAS,IAAI,EAAA,CAAA,CAAA,CAAA,+EAIpFnF,EAAAA,mBAAA,WAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAEM,MAFNsC,GAEM1B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAAuD,OAAA,CAAjD,MAAM,cAAA,EAAe,wBAAqB,EAAA,CAAA,EAAA,GAAAI,EAAAA,mBAAA,OAAA,EAAA,EAGlDA,EAAAA,mBAAA,uBAAA,EACAJ,EAAAA,mBAsBO,OAAA,CAtBA,SAAM0I,EAAAA,cAAU3I,EAAA,aAAY,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACzCC,EAAAA,mBAeM,MAfNiI,GAeM,CAdJM,cAE6DxI,EAAA,QAAA,CAFpD,GAAG,QAAA,WAAiBA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAC1D,YAAY,2BAA2B,aAAa,QAAQ,SAAA,GAC3D,MAAOd,QAAK,4BAAiC,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEhDC,EAAAA,mBASM,MAAA,KAAA,CARJA,EAAAA,mBAKM,MALNyI,GAKM,CAAAhI,EAAA,CAAA,IAAAA,EAAA,CAAA,EAJJT,EAAAA,mBAAkE,OAAA,CAA5D,MAAM,sCAAA,EAAuC,WAAQ,EAAA,GAC3DuI,cAESxI,EAAA,OAAA,CAFA,QAAKU,eAAEH,EAAA,MAAK,iBAAA,GAAqB,MAAM,SAAA,EAAA,mBAAU,IAE1DG,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAF0D,qBAE1D,EAAA,CAAA,EAAA,iBAEFgI,cACsGxI,EAAA,QAAA,CAD7F,GAAG,WAAA,WAAoBA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GAAE,KAAK,WAAW,YAAY,sBACzE,aAAa,mBAAmB,SAAA,GAAU,MAAOd,QAAK,4BAAiC,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,MAI7FwI,cAGWxI,EAAA,SAAA,CAHD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,EAAA,SAAO,CAAKA,EAAA,KAAK,OAAK,CAAKA,EAAA,KAAK,SAC7F,QAASA,EAAA,QAAU,eAAc,eAAA,EAAA,mBAAiB,IAErDU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFqD,YAErD,EAAA,CAAA,EAAA,8CAGFH,EAAAA,mBAAA,eAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAOM,MAPNkI,GAOM,CANJlI,EAAAA,mBAKI,IALJmI,GAKI,CAAA1H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,2BAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFA,QAAKU,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAA,mBAAsB,IAE3CG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAF2C,YAE3C,EAAA,CAAA,EAAA,oBAIJH,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPNuI,GAOM,CANJpI,EAAAA,mBAKI,IALJqI,GAKI,CAAA5H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAW,KAAI,UAAYA,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,gEAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,kbCoE3C,MAAMhB,EAAQC,EAKRkC,EAAOC,EAGP,CAAE,OAAA+D,EAAQ,gBAAAwB,CAAA,EAAoB7B,EAAAA,iBAAiB9F,EAAM,MAAM,EAG3D,CACJ,iBAAAuG,EACA,QAASqB,EACT,MAAOC,EACP,eAAApB,EACA,mBAAAc,CAAA,EACEtB,EAAkB,CACpB,YAAajG,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,EAGDmF,EAAAA,UAAU,IAAM,CACdsB,EAAA,EAAiB,MAAMI,GAAO,CAC5B,QAAQ,KAAK,mCAAoCA,CAAG,CACtD,CAAC,CACH,CAAC,EAED,MAAMR,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAI,EAAE,EACdsH,EAAgBtH,EAAAA,IAAI,EAAK,EACzBuH,EAAiBvH,EAAAA,IAAI,EAAE,EACvBwH,EAAexH,EAAAA,IAAI,kBAAkB,EACrCyH,EAAezH,EAAAA,IAAI,EAAE,EAErB8F,EAAOC,EAAAA,SAAS,CACpB,MAAO,EAAA,CACR,EAEKI,EAAcxI,EAAAA,SAAS,IACpBmI,EAAK,MAAM,KAAA,GAAUA,EAAK,MAAM,SAAS,GAAG,CACpD,uPAEoB,SAAY,CAC/BjC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CACF,MAAM4D,EAAY/D,EAAO,QAAQ,EACjC,QAAQ,IAAI,6BAA8B+D,CAAS,EAEnD,MAAMxD,EAAW,MAAM,MAAMwD,EAAW,CACtC,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,MAAO5B,EAAK,KAAA,CACb,CAAA,CACF,EAKD,GAHA,QAAQ,IAAI,2BAA4B5B,EAAS,MAAM,EACvD,QAAQ,IAAI,4BAA6B,OAAO,YAAYA,EAAS,QAAQ,QAAA,CAAS,CAAC,EAEnF,CAACA,EAAS,GAAI,CAChB,IAAII,EAAe,mBAAmBJ,EAAS,MAAM,IACrD,GAAI,CACF,MAAMC,EAAY,MAAMD,EAAS,KAAA,EACjCI,EAAeH,EAAU,SAAWA,EAAU,OAASG,CACzD,MAAQ,CAENA,EADkB,MAAMJ,EAAS,KAAA,GACLI,CAC9B,CACA,MAAM,IAAI,MAAMA,CAAY,CAC9B,CAEA,MAAMF,EAAS,MAAMF,EAAS,KAAA,EAC9B,QAAQ,IAAI,8BAA+BE,CAAM,EAGjDkD,EAAc,MAAQ,GACtBG,EAAa,MAAQ3B,EAAK,MAC1ByB,EAAe,MAAQnD,EAAO,SAAW,qCAGrCA,EAAO,UACLA,EAAO,QAAQ,SAAS,yBAAyB,GAAKA,EAAO,QAAQ,SAAS,cAAc,EAC9FoD,EAAa,MAAQ,gBACZpD,EAAO,QAAQ,SAAS,iBAAiB,GAAKA,EAAO,QAAQ,SAAS,kBAAkB,EACjGoD,EAAa,MAAQ,mBAErBA,EAAa,MAAQ,YAKzB7H,EAAK,UAAW,CACd,MAAOmG,EAAK,MACZ,QAAS1B,EAAO,SAAW,oCAAA,CAC5B,CACH,OAASC,EAAK,CACZ,QAAQ,MAAM,iBAAkBA,CAAG,EAEnC,IAAIC,EAAe,+CAEnB,GAAID,aAAe,MACjB,GAAIA,EAAI,QAAQ,SAAS,OAAO,EAC9BC,EAAe,4GACND,EAAI,QAAQ,SAAS,MAAM,EAAG,CACvC,MAAMsD,EAAexC,EAAA,EACrBb,EAAeqD,EACX,8DAA8DA,CAAY,IAC1E,6CACN,MACErD,EAAeD,EAAI,QAIvBP,EAAM,MAAQQ,EACd3E,EAAK,QAAS2E,CAAY,CAC5B,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,cAEoB,IAAM,CACxByD,EAAc,MAAQ,GACtBC,EAAe,MAAQ,GACvBC,EAAa,MAAQ,mBACrBC,EAAa,MAAQ,GACrB3B,EAAK,MAAQ,GACbhC,EAAM,MAAQ,EAChB,oBAE0B,MAAOU,GAAuB,CACtD,GAAI,CACF,MAAMO,EAAmBP,EAAY,CACnC,YAAahH,EAAM,YACnB,OAAQA,EAAM,WAAA,CACf,CACH,OAAS6G,EAAK,CACZ,MAAMC,EAAeD,aAAe,MAAQA,EAAI,QAAU,0BAA0BG,CAAU,GAC9FV,EAAM,MAAQQ,EACd3E,EAAK,QAAS2E,CAAY,CAC5B,CACF,yMAtTOpG,GAAA,CAAA,MAAM,oDAAA,EAGFC,GAAA,CAAA,MAAM,aAAA,EAELO,GAAA,CAAA,MAAM,uCAAA,EACPC,GAAA,CAAA,MAAM,oBAAA,YACgB,MAAM,wCAyBI,MAAM,kBAUlC8B,GAAA,CAAA,MAAM,0CAAA,YAEoB,MAAM,sCAcO,MAAM,uBAAuB,QAAQ,uBAInE,MAAM,wEACVyG,GAAA,CAAA,MAAM,wCAAA,EAGVP,GAAA,CAAA,MAAM,aAAA,YAKqB,MAAM,+BAiCzB,MAAM,wBACjBG,GAAA,CAAA,MAAM,aAAA,EACJM,GAAA,CAAA,MAAM,wBAAA,EAMNC,GAAA,CAAA,MAAM,aAAA,EAMVN,GAAA,CAAA,MAAM,kBAAA,EACNa,GAAA,CAAA,MAAM,0BAAA,YAWmB,MAAM,oBAC/BC,GAAA,CAAA,MAAM,0BAAA,2BAnIf,OAAAxJ,YAAA,EAAAC,qBA8IM,MA9INJ,GA8IM,CA7IJW,EAAAA,mBAAA,iBAAA,EACcL,+BAAdyC,EAAAA,YAmBSzC,EAAA,OAAA,CAAA,IAAA,EAnBoB,QAAQ,QAAA,EAAA,mBACnC,IAiBM,CAjBNC,EAAAA,mBAiBM,MAjBNN,GAiBM,CAAAe,EAAA,CAAA,IAAAA,EAAA,CAAA,EAhBJT,EAAAA,mBAAkD,MAAA,CAA7C,MAAM,8BAAA,EAA+B,KAAE,EAAA,GAC5CA,EAAAA,mBAAyE,KAAzEC,GAAyEa,EAAAA,gBAApBf,EAAA,YAAY,EAAA,CAAA,EACjEC,EAAAA,mBAAsD,IAAtDE,GAAsDY,EAAAA,gBAArBf,EAAA,cAAc,EAAA,CAAA,EACpCA,EAAA,cAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNF,GAEM,CADJK,EAAAA,mBAAmC,SAAA,KAAAc,EAAAA,gBAAxBf,EAAA,YAAY,EAAA,CAAA,CAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEzBK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,4BAAA,EAA6B,mGAEtC,EAAA,GACAuI,cAMWxI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAOA,EAAA,WAAA,EAAA,mBACT,IAEDU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFC,sBAED,EAAA,CAAA,EAAA,sBAKJ,CAAA,IAAAX,EAAAA,UAAA,EAAAC,EAAAA,mBAqHS4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAtHTrE,EAAAA,mBAAA,eAAA,EACAmI,EAAAA,YAqHSxI,EAAA,OAAA,CArHM,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QAC7B,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAqE,KAAA,CAAjE,MAAM,uCAAA,EAAwC,gBAAc,EAChEA,EAAAA,mBAA0E,IAAA,CAAvE,MAAM,kBAAA,EAAmB,4CAA0C,CAAA,OAGxEI,EAAAA,mBAAA,mBAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAoCM,MApCNW,GAoCM,EAAAZ,EAAAA,UAAA,EAAA,EAnCJC,EAAAA,mBAkCW4E,EAAAA,SAAA,KAAAC,EAAAA,WAjCU3E,EAAA,iBAAZwF,kBADT/C,EAAAA,YAkCWzC,EAAA,SAAA,CAhCR,IAAKwF,EAAS,GACf,QAAQ,UACR,aAAA,GACC,SAAUxF,EAAA,aACV,QAAKc,GAAEd,EAAA,kBAAkBwF,EAAS,EAAE,EACrC,MAAM,iBAAA,EAAA,mBAEN,IAuBM,CAvBNvF,EAAAA,mBAuBM,MAvBNgC,GAuBM,CAtBJ5B,EAAAA,mBAAA,0BAAA,EACWmF,EAAS,SAAA3F,EAAAA,UAAA,EAApBC,EAAAA,mBAEM,MAFNoC,GAEM,CADJjC,EAAAA,mBAAsG,MAAA,CAAhG,IAAKuF,EAAS,QAAU,IAAG,GAAKA,EAAS,aAAeA,EAAS,IAAI,QAAS,MAAM,SAAA,EAAA,KAAA,EAAArD,EAAA,CAG5E,CAAA,GAAAqD,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBASM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAVNrE,EAAAA,mBAAA,2CAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,CAToC,QAAQ,YAAY,MAAM,SAAA,GAClEA,EAAAA,mBACgI,OAAA,CAD1H,KAAK,UACT,EAAE,yHAAA,CAAA,EACJA,EAAAA,mBAC8I,OAAA,CADxI,KAAK,UACT,EAAE,uIAAA,CAAA,EACJA,EAAAA,mBACsI,OAAA,CADhI,KAAK,UACT,EAAE,+HAAA,CAAA,EACJA,EAAAA,mBAC4I,OAAA,CADtI,KAAK,UACT,EAAE,qIAAA,CAAA,aAEU,GAAAuF,EAAS,KAAE,UAAA3F,EAAAA,UAAA,EAA3BC,EAAAA,mBAGM,MAHNsC,GAGM,CAAA,GAAA1B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAAAA,mBACktB,OAAA,CAAhtB,EAAE,2sBAAA,EAA2sB,KAAA,EAAA,CAAA,EAAA,CAAA,IAAAJ,EAAAA,UAAA,EAEjtBC,EAAAA,mBAEM,MAFNoI,GAEM,CADJjI,EAAAA,mBAAiI,OAAjIyI,GAAiI3H,mBAAxEyE,EAAS,aAAeA,EAAS,MAAM,OAAM,GAAI,aAAW,EAAA,CAAA,CAAA,CAAA,KAGzHvF,EAAAA,mBAA0F,OAA1FkI,GAA0B,iBAAcpH,EAAAA,gBAAGyE,EAAS,aAAeA,EAAS,IAAI,EAAA,CAAA,CAAA,CAAA,+EAIpFnF,EAAAA,mBAAA,WAAA,EACWL,EAAA,kBAAkB,QAAAH,EAAAA,UAAA,EAA7BC,EAAAA,mBAEM,MAFNsI,GAEM1H,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJT,EAAAA,mBAA8D,OAAA,CAAxD,MAAM,cAAA,EAAe,+BAA4B,EAAA,CAAA,EAAA,GAAAI,EAAAA,mBAAA,OAAA,EAAA,EAGzDA,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAyBO,OAAA,CAzBA,SAAM0I,EAAAA,cAAU3I,EAAA,aAAY,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACzCK,EAAAA,mBAAA,SAAA,EACAJ,EAAAA,mBAWM,MAAA,KAAA,CAVJuI,cASExI,EAAA,QAAA,CARA,GAAG,QAAA,WACMA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GACnB,KAAK,QACL,MAAM,gBACN,YAAY,2BACZ,aAAa,QACb,SAAA,GACC,MAAOd,EAAA,KAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIZwI,cASWxI,EAAA,SAAA,CART,KAAK,SACL,QAAQ,UACR,aAAA,GACC,SAAUA,EAAA,QACV,QAASA,EAAA,QACV,eAAa,uBAAA,EAAA,mBACd,IAEDU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFC,oBAED,EAAA,CAAA,EAAA,6CAGFH,EAAAA,mBAAA,eAAA,EACWL,EAAA,OAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAWM,MAXNuI,GAWM,CAVJpI,EAAAA,mBASM,MATNqI,GASM,CARJrI,EAAAA,mBAOM,MAPN2I,GAOM,CAAAlI,EAAA,CAAA,IAAAA,EAAA,CAAA,EANJT,EAAAA,mBAIM,MAAA,CAJD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAEwB,OAAA,CAFlB,YAAU,UACd,EAAE,gNACF,YAAU,SAAA,CAAA,QAEdA,EAAAA,mBAAsC,IAAtC4I,GAAsC9H,EAAAA,gBAAZf,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,uCAKrCK,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBASM,MATNsI,GASM,CARJtI,EAAAA,mBAOI,IAPJmJ,GAOI,CAAA1I,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBAPgC,6BAElC,EAAA,GAAAP,EAAAA,mBAIS,SAAA,CAJD,KAAK,SACX,MAAM,uFACL,QAAKS,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAsB,WAErC,CAAA,CAAA,IAIJF,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPNwJ,GAOM,CANJrJ,EAAAA,mBAKI,IALJoJ,GAKI,CAAA3I,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAW,KAAI,UAAYA,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,gEAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,mdCiE3C,MAAMhB,EAAQC,EAIRkC,EAAOC,EAGP,CAAE,OAAA+D,EAAQ,gBAAAwB,CAAA,EAAoB7B,EAAAA,iBAAiB9F,EAAM,MAAM,EAG3D,CAAE,YAAAuK,CAAA,EAAgBC,iBAAA,EAGlBC,EAAuBjI,EAAAA,IAAI,EAAK,EAChCkI,EAAelI,EAAAA,IAAI,EAAK,EACxB6D,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAI,EAAE,EACdwF,EAAQxF,EAAAA,IAAI,EAAE,EAEd8F,EAAOC,EAAAA,SAAS,CACpB,SAAU,GACV,UAAW,GACX,SAAU,GACV,SAAU,EAAA,CACX,EAEKoC,EAAcpC,EAAAA,SAAS,CAC3B,SAAU,GACV,UAAW,GACX,SAAU,GACV,SAAU,EAAA,CACX,EAGKI,EAAcxI,EAAAA,SAAS,IAAM,CACjC,MAAMyK,EAAoBtC,EAAK,SAAS,QAAUA,EAAK,SAAS,KAAA,EAC1DuC,EAAoBvC,EAAK,SAAS,QAAU,EAC5CwC,EAAgB,CAAC,CAAC9K,EAAM,MAE9B,OAAO4K,GAAqBC,GAAqBC,CACnD,CAAC,EAGDrF,EAAAA,MACE,IAAM6C,EAAK,SACVL,GAAa,CACRA,GAAYA,EAAS,OAAS,EAChC0C,EAAY,SAAW,8CAEvBA,EAAY,SAAW,EAE3B,CAAA,EAIFlF,EAAAA,MACE,IAAM6C,EAAK,SACVyC,GAAa,CACRA,GAAYA,EAAS,OAAS,EAChCJ,EAAY,SAAW,8CAEvBA,EAAY,SAAW,EAE3B,CAAA,EAIF,MAAMK,EAAa7K,EAAAA,SAAS,KAAO,CACjC,QAASH,EAAM,QAAQ,SAAW,wBAClC,YAAaA,EAAM,aAAe,uBAAA,EAClC,EAGFmF,EAAAA,UAAU,IAAM,CACd,GAAInF,EAAM,MACR,GAAI,CACF,MAAMiL,EAAQjL,EAAM,MAAM,MAAM,GAAG,EACnC,GAAIiL,EAAM,SAAW,EAAG,CACtB,MAAMC,EAAU,KAAK,MAAM,KAAKD,EAAM,CAAC,CAAC,CAAC,EACrCC,EAAQ,QACVlD,EAAM,MAAQkD,EAAQ,MAE1B,CACF,OAASrE,EAAK,CACZ,QAAQ,KAAK,4CAA6CA,CAAG,CAC/D,CAEJ,CAAC,EAED,MAAMsE,EAAqB,IAAM,CAC3BH,EAAW,MAAM,cACnB,QAAQ,IAAI,2BAA4BA,EAAW,MAAM,WAAW,EACpE,OAAO,SAAS,KAAOA,EAAW,MAAM,YAE5C,uNAE6B,SAAY,CACvC,GAAI,CAAChL,EAAM,MAAO,CAChBsG,EAAM,MAAQ,iCACd,MACF,CASA,GANAA,EAAM,MAAQ,GACd,OAAO,KAAKqE,CAAW,EAAE,QAAQS,GAAO,CACtCT,EAAYS,CAA+B,EAAI,EACjD,CAAC,EAGG,CAACzC,EAAY,MAAO,CACtBrC,EAAM,MAAQ,+CACd,MACF,CAEAD,EAAQ,MAAQ,GAEhB,GAAI,CACF,MAAMK,EAAW,MAAM,MAAM,GAAGsE,EAAW,MAAM,OAAO,qCAAsC,CAC5F,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,MAAOhL,EAAM,MACb,SAAUsI,EAAK,SACf,SAAUA,EAAK,SACf,WAAYA,EAAK,WAAa,KAC9B,UAAWA,EAAK,UAAY,IAAA,CAC7B,CAAA,CACF,EAED,GAAI,CAAC5B,EAAS,GAAI,CAChB,MAAM2E,EAAY,MAAM3E,EAAS,KAAA,EACjC,MAAM,IAAI,MAAM,oCAAoC2E,CAAS,EAAE,CACjE,CAEA,MAAMzE,EAAuB,MAAMF,EAAS,KAAA,EAC5C,QAAQ,IAAI,wBAAyBE,CAAM,EAGvCA,EAAO,cAAgBA,EAAO,eAAiBA,EAAO,MACxD2D,EAAY3D,CAAM,EAClB,QAAQ,IAAI,4CAA6CA,EAAO,KAAK,KAAK,GAE1E,QAAQ,KAAK,wDAAwD,EAGvE6D,EAAqB,MAAQ,GAC7BtI,EAAK,UAAWyE,CAAM,EAGtB,WAAW,IAAM,CACfuE,EAAA,CACF,EAAG,GAAI,CACT,OAAStE,EAAK,CACRA,aAAe,MACbA,EAAI,QAAQ,SAAS,UAAU,GAAKA,EAAI,QAAQ,SAAS,KAAK,EAChEP,EAAM,MAAQ,8DACLO,EAAI,QAAQ,SAAS,aAAa,GAAKA,EAAI,QAAQ,SAAS,KAAK,GAC1EP,EAAM,MAAQ,kEACdoE,EAAa,MAAQ,GACrBvI,EAAK,eAAe,GAEpBmE,EAAM,MAAQO,EAAI,QAGpBP,EAAM,MAAQ,qDAEhBnE,EAAK,QAASmE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,2OAxXmC,MAAM,sDAE9B1F,GAAA,CAAA,MAAM,aAAA,EAsBeO,GAAA,CAAA,MAAM,oDAAA,EAE3BC,GAAA,CAAA,MAAM,aAAA,EAsBQP,GAAA,CAAA,MAAM,oDAAA,EAGpBa,GAAA,CAAA,MAAM,kBAAA,YAGS,MAAM,QACnByB,GAAA,CAAA,MAAM,0BAAA,EAAuDC,GAAA,CAAA,MAAM,8BAAA,YAuF5C,MAAM,oBAC/B+F,GAAA,CAAA,MAAM,0BAAA,EAeHQ,GAAA,CAAA,MAAM,oDAAA,EAETP,GAAA,CAAA,MAAM,aAAA,sFAjKf9H,EAAAA,mBAAA,iBAAA,EACWL,EAAA,sBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAqBM,MArBNJ,GAqBM,CApBJ8I,EAAAA,YAmBSxI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNN,GAgBM,CAAAe,EAAA,CAAA,IAAAA,EAAA,CAAA,EAfJT,EAAAA,mBAAkD,MAAA,CAA7C,MAAM,8BAAA,EAA+B,KAAE,EAAA,GAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAC5CT,EAAAA,mBAA0E,KAAA,CAAtE,MAAM,uCAAA,EAAwC,sBAAmB,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACrET,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,gDAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,yDAEzC,EAAA,GACAuI,cAMWxI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAOA,EAAA,kBAAA,EAAA,mBACT,IAEDU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFC,oBAED,EAAA,CAAA,EAAA,iBAEFgI,EAAAA,YAAwBxI,EAAA,oBAAA,CAAA,CAAA,WAKZA,EAAA,cAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAqBM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAtBNrE,EAAAA,mBAAA,uBAAA,EACAJ,EAAAA,mBAqBM,MArBNC,GAqBM,CApBJsI,EAAAA,YAmBSxI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNE,GAgBM,CAAAO,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA+C,MAAA,CAA1C,MAAM,4BAAA,EAA6B,IAAC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACzCT,EAAAA,mBAAmE,KAAA,CAA/D,MAAM,uCAAA,EAAwC,eAAY,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC9DT,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,sDAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,mEAEzC,EAAA,GACAuI,cAMWxI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAKU,eAAEH,EAAA,MAAK,kBAAA,EAAA,EAAA,mBACd,IAEDG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,qBAED,EAAA,CAAA,EAAA,kBAEFgI,EAAAA,YAAwBxI,EAAA,oBAAA,CAAA,CAAA,kBAKZI,EAAA,OAAAP,EAAAA,UAAA,EAAhBC,EAAAA,mBA2GM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CA5GNrE,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBA2GM,MA3GNL,GA2GM,CA1GJ4I,EAAAA,YAwGSxI,EAAA,OAAA,CAxGD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EACAJ,EAAAA,mBAMM,MANNQ,GAMM,CAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EALJT,EAAAA,mBAAiF,KAAA,CAA7E,MAAM,uCAAA,EAAwC,6BAA0B,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC5ET,EAAAA,mBAAkF,IAAA,CAA/E,MAAM,kBAAA,EAAmB,qDAAkD,EAAA,GACnED,EAAA,OAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNmC,GAEM,CADJhC,EAAAA,mBAA2H,IAA3HiC,GAA2H,CAAAxB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBAAvF,yBAAsB,EAAA,GAAAP,EAAAA,mBAA6D,OAA7DkC,GAA6DpB,EAAAA,gBAAff,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,uCAIjHK,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBAqEO,OAAA,CArEA,SAAM0I,EAAAA,cAAU3I,EAAA,qBAAoB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GACjDK,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAWM,MAAA,KAAA,CAVJuI,cASExI,EAAA,QAAA,CARA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,OACL,MAAM,WACN,YAAY,oBACZ,aAAa,WACb,SAAA,GACC,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,cAAA,EACAJ,EAAAA,mBAUM,MAAA,KAAA,CATJuI,cAQExI,EAAA,QAAA,CAPA,GAAG,YAAA,WACMA,EAAA,KAAK,UAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,UAASc,GACvB,KAAK,OACL,MAAM,wBACN,YAAY,wBACZ,aAAa,aACZ,MAAOd,EAAA,YAAY,SAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,aAAA,EACAJ,EAAAA,mBAUM,MAAA,KAAA,CATJuI,cAQExI,EAAA,QAAA,CAPA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,OACL,MAAM,uBACN,YAAY,uBACZ,aAAa,cACZ,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,IAIxBK,EAAAA,mBAAA,YAAA,EACAJ,EAAAA,mBAeM,MAAA,KAAA,CAdJuI,cAUExI,EAAA,QAAA,CATA,GAAG,WAAA,WACMA,EAAA,KAAK,SAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,SAAQc,GACtB,KAAK,WACL,MAAM,WACN,YAAY,2BACZ,aAAa,eACb,SAAA,GACA,UAAU,IACT,MAAOd,EAAA,YAAY,QAAA,EAAA,KAAA,EAAA,CAAA,aAAA,OAAA,CAAA,EAEtBU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAAA,EAAgC,gDAE3C,EAAA,EAAA,CAAA,EAGFuI,cASWxI,EAAA,SAAA,CART,KAAK,SACL,QAAQ,UACR,aAAA,GACC,SAAUA,WAAO,CAAKA,EAAA,YACtB,QAASA,EAAA,QACV,eAAa,qBAAA,EAAA,mBACd,IAEDU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,0BAED,EAAA,CAAA,EAAA,8CAGFH,EAAAA,mBAAA,eAAA,EAEQL,uBADRyC,EAAAA,YAOEzC,EAAA,QAAA,CAAA,IAAA,EALA,QAAQ,QACP,QAASA,EAAA,MACV,MAAM,uBACN,YAAA,GACC,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAGjBA,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPNsC,GAOM,CANJnC,EAAAA,mBAKI,IALJiI,GAKI,CAAAxH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAW,KAAI,UAAYA,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,gEAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,iBAMzC,IAAAH,EAAAA,UAAA,EAAAC,EAAAA,mBAqBM4E,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAtBNrE,EAAAA,mBAAA,kBAAA,EACAJ,EAAAA,mBAqBM,MArBNyI,GAqBM,CApBJF,EAAAA,YAmBSxI,EAAA,OAAA,CAnBD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAgBM,CAhBN3C,EAAAA,mBAgBM,MAhBNkI,GAgBM,CAAAzH,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAAmD,MAAA,CAA9C,MAAM,+BAAA,EAAgC,KAAE,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC7CT,EAAAA,mBAAoE,KAAA,CAAhE,MAAM,uCAAA,EAAwC,gBAAa,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAC/DT,EAAAA,mBAEI,IAAA,CAFD,MAAM,uBAAA,EAAwB,wCAEjC,EAAA,GAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAEI,IAAA,CAFD,MAAM,+BAAA,EAAgC,qFAEzC,EAAA,GACAuI,cAMWxI,EAAA,SAAA,CALT,QAAQ,UACR,aAAA,GACC,QAAKU,eAAEH,EAAA,MAAK,oBAAA,EAAA,EAAA,mBACd,IAEDG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFC,uBAED,EAAA,CAAA,EAAA,kBAEFgI,EAAAA,YAAwBxI,EAAA,oBAAA,CAAA,CAAA,iZC8H9B,MAAMhB,EAAQC,EACRkC,EAAOC,EAGP,CAAE,gBAAAuF,CAAA,EAAoB7B,mBAAiB9F,EAAM,MAAM,EAEnDqG,EAAU7D,EAAAA,IAAI,EAAK,EACnB8I,EAAqB9I,EAAAA,IAAI,EAAK,EAC9BuH,EAAiBvH,EAAAA,IAAI,EAAE,EACvBsE,EAAetE,EAAAA,IAAI,EAAE,EACrB+I,EAAiB/I,EAAAA,IAAI,CACzB,CAAE,GAAI,IAAK,OAAQ,gBAAiB,SAAU,oBAAqB,WAAY,gBAAiB,QAAS,EAAA,EACzG,CAAE,GAAI,IAAK,OAAQ,mBAAoB,SAAU,oBAAqB,WAAY,aAAc,QAAS,EAAA,CAAM,CAChH,EAEK8F,EAAOC,EAAAA,SAAS,CACpB,UAAW,GACX,SAAU,GACV,MAAO,GACP,MAAO,EAAA,CACR,EAEKiD,EAAejD,EAAAA,SAAS,CAC5B,QAAS,GACT,IAAK,GACL,QAAS,EAAA,CACV,EAEKkD,EAASlD,EAAAA,SAAS,CACtB,UAAW,GACX,SAAU,GACV,MAAO,GACP,MAAO,EAAA,CACR,EAEKmD,EAAavL,EAAAA,SAAS,IACrBH,EAAM,KAETsI,EAAK,YAActI,EAAM,KAAK,WAC9BsI,EAAK,WAAatI,EAAM,KAAK,UAC7BsI,EAAK,QAAUtI,EAAM,KAAK,OAC1BsI,EAAK,SAAWtI,EAAM,KAAK,OAAS,IALd,EAOzB,EAEK2L,EAAsBxL,EAAAA,SAAS,IAEjCqL,EAAa,SACbA,EAAa,KACbA,EAAa,SACbA,EAAa,MAAQA,EAAa,SAClCA,EAAa,IAAI,QAAU,CAE9B,EAEKI,EAAc,CAAC1D,EAAoBC,IACnC,CAACD,GAAa,CAACC,EAAiB,IAC7B,GAAGD,IAAY,CAAC,GAAK,EAAE,GAAGC,IAAW,CAAC,GAAK,EAAE,GAAG,YAAA,EAIzD1C,EAAAA,MAAM,IAAMzF,EAAM,KAAO6L,GAAS,CAC5BA,IACFvD,EAAK,UAAYuD,EAAK,UACtBvD,EAAK,SAAWuD,EAAK,SACrBvD,EAAK,MAAQuD,EAAK,MAClBvD,EAAK,MAAQuD,EAAK,OAAS,GAE/B,EAAG,CAAE,UAAW,GAAM,EAEtB,MAAMC,EAAgB,IAAM,CAC1B/B,EAAe,MAAQ,GACvBjD,EAAa,MAAQ,GACrB,OAAO,KAAK2E,CAAM,EAAE,QAAQL,GAAO,CACjCK,EAAOL,CAA0B,EAAI,EACvC,CAAC,CACH,0OAE4B,SAAY,CACtCU,EAAA,EACAzF,EAAQ,MAAQ,GAEhB,GAAI,CAKF,MAAM,IAAI,QAAQ0F,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtD,MAAMC,EAAc,CAClB,GAAGhM,EAAM,KACT,GAAGsI,CAAA,EAGLyB,EAAe,MAAQ,+BACvB5H,EAAK,kBAAmB6J,CAAW,CACrC,MAAc,CACZlF,EAAa,MAAQ,2BACrB3E,EAAK,QAAS2E,EAAa,KAAK,CAClC,QAAA,CACET,EAAQ,MAAQ,EAClB,CACF,uBAE6B,SAAY,CACvC,GAAKsF,EAAoB,MAEzB,CAAAG,EAAA,EACAzF,EAAQ,MAAQ,GAEhB,GAAI,CAKF,MAAM,IAAI,QAAQ0F,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtDhC,EAAe,MAAQ,gCACvBuB,EAAmB,MAAQ,GAC3BE,EAAa,QAAU,GACvBA,EAAa,IAAM,GACnBA,EAAa,QAAU,EACzB,MAAc,CACZ1E,EAAa,MAAQ,2BACvB,QAAA,CACET,EAAQ,MAAQ,EAClB,EACF,oBAE0B,IAAM,CAG9BlE,EAAK,QAAS,gDAAgD,CAChE,kBAEwB,IAAM,CAC5BA,EAAK,aAAc,CAACnC,EAAM,MAAM,UAAU,CAC5C,eAEqB,IAAM,CACrBA,EAAM,OACRsI,EAAK,UAAYtI,EAAM,KAAK,UAC5BsI,EAAK,SAAWtI,EAAM,KAAK,SAC3BsI,EAAK,MAAQtI,EAAM,KAAK,MACxBsI,EAAK,MAAQtI,EAAM,KAAK,OAAS,IAEnC8L,EAAA,EACAR,EAAmB,MAAQ,GAC3BE,EAAa,QAAU,GACvBA,EAAa,IAAM,GACnBA,EAAa,QAAU,EACzB,0GAvcO9K,GAAA,CAAA,MAAM,2CAAA,EACJC,GAAA,CAAA,MAAM,aAAA,EAQJO,GAAA,CAAA,MAAM,iCAAA,EACJC,GAAA,CAAA,MAAM,gBAAA,EACJP,GAAA,CAAA,MAAM,qJAAA,EAuBRa,GAAA,CAAA,MAAM,uCAAA,EAEJwB,GAAA,CAAA,MAAM,WAAA,4BAkBoB,MAAM,uDAkBP,MAAM,uDAkBT,MAAM,uCACQ,MAAM,0DAmBpB,MAAM,6BAK5B2G,GAAA,CAAA,MAAM,WAAA,EAIJC,GAAA,CAAA,MAAM,wCAAA,EACJN,GAAA,CAAA,MAAM,mCAAA,YAcoB,MAAM,6BAkClCc,GAAA,CAAA,MAAM,8BAAA,EACJ4B,GAAA,CAAA,MAAM,mCAAA,EAGJC,GAAA,CAAA,MAAM,0BAAA,EAkBVC,GAAA,CAAA,MAAM,8BAAA,EACJC,GAAA,CAAA,MAAM,mCAAA,EAGJC,GAAA,CAAA,MAAM,0BAAA,EAedC,GAAA,CAAA,MAAM,kEAAA,4BAMc,MAAM,+EAsBN,MAAM,wBAC1BC,GAAA,CAAA,MAAM,eAAA,EACJC,GAAA,CAAA,MAAM,wBAAA,EAINC,GAAA,CAAA,MAAM,aAAA,YAKU,MAAM,wBACxBC,GAAA,CAAA,MAAM,aAAA,EACJC,GAAA,CAAA,MAAM,wBAAA,EAINC,GAAA,CAAA,MAAM,aAAA,YAMe,MAAM,oBAC/BC,GAAA,CAAA,MAAM,0BAAA,gEArQf,OAAAhM,YAAA,EAAAC,qBAgRM,MAhRNJ,GAgRM,CA/QJO,EAAAA,mBA8QM,MA9QNN,GA8QM,CA7QJU,EAAAA,mBAAA,UAAA,EAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAuE,KAAA,CAAnE,MAAM,uCAAA,EAAwC,kBAAgB,EAClEA,EAAAA,mBAA+E,IAAA,CAA5E,MAAM,kBAAA,EAAmB,iDAA+C,CAAA,OAG7EI,EAAAA,mBAAA,yBAAA,EACAJ,EAAAA,mBAqBM,MArBNC,GAqBM,CApBJD,EAAAA,mBAaM,MAbNE,GAaM,CAZJF,EAAAA,mBAEM,MAFNL,GAEMmB,kBADDf,EAAA,YAAYI,EAAA,MAAM,UAAWA,QAAM,QAAQ,CAAA,EAAA,CAAA,EAEhDH,EAAAA,mBAQS,SAAA,CAPP,MAAM,+IACL,QAAOD,EAAA,iBAAA,EAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAERT,EAAAA,mBAGM,MAAA,CAHD,MAAM,qBAAqB,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GACxEA,EAAAA,mBAA6O,OAAA,CAAvO,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kKAAA,CAAA,EACxEA,EAAAA,mBAA6G,OAAA,CAAvG,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,kCAAA,CAAA,YAI9EA,EAAAA,mBAKS,SAAA,CAJP,MAAM,kGACL,QAAOD,EAAA,iBAAA,EACT,gBAED,CAAA,CAAA,EAGFK,EAAAA,mBAAA,gBAAA,EACAJ,EAAAA,mBAyMO,OAAA,CAzMA,SAAM0I,EAAAA,cAAU3I,EAAA,oBAAmB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GAChDC,EAAAA,mBA4KM,MA5KNQ,GA4KM,CA3KJJ,EAAAA,mBAAA,wBAAA,EACAJ,EAAAA,mBA4EM,MA5ENgC,GA4EM,CAAAvB,EAAA,EAAA,IAAAA,EAAA,EAAA,EA3EJT,EAAAA,mBAAiF,KAAA,CAA7E,MAAM,6CAAA,EAA8C,uBAAoB,EAAA,GAE5EA,EAAAA,mBAgBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA8D,QAAA,CAAvD,IAAI,YAAY,MAAM,cAAA,EAAe,aAAU,EAAA,GAAA6L,EAAAA,eACtD7L,EAAAA,mBAYE,QAAA,CAXA,GAAG,YAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,UAASc,GACvB,KAAK,OACL,SAAA,GACA,aAAa,aACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,WAAS,aAAA,CAAA,EAI9E,YAAY,wBACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAkC,EAAA,EAAA,CATF,CAAA6J,EAAAA,WAAA/L,EAAA,KAAK,SAAS,CAAA,CAAA,EAWhBA,EAAA,OAAO,WAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAAuF,IAAvFqC,GAAuFpB,kBAAvBf,SAAO,SAAS,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,IAGlFJ,EAAAA,mBAgBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAfJT,EAAAA,mBAA4D,QAAA,CAArD,IAAI,WAAW,MAAM,cAAA,EAAe,YAAS,EAAA,GAAA6L,EAAAA,eACpD7L,EAAAA,mBAYE,QAAA,CAXA,GAAG,WAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,SAAQc,GACtB,KAAK,OACL,SAAA,GACA,aAAa,cACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,UAAQ,aAAA,CAAA,EAI7E,YAAY,uBACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAoC,EAAA,EAAA,CATF,CAAA2J,EAAAA,WAAA/L,EAAA,KAAK,QAAQ,CAAA,CAAA,EAWfA,EAAA,OAAO,UAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAAqF,IAArFoI,GAAqFnH,kBAAtBf,SAAO,QAAQ,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,IAGhFJ,EAAAA,mBAmBM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAlBJT,EAAAA,mBAA6D,QAAA,CAAtD,IAAI,QAAQ,MAAM,cAAA,EAAe,gBAAa,EAAA,GAAA6L,EAAAA,eACrD7L,EAAAA,mBAYE,QAAA,CAXA,GAAG,QAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,MAAKc,GACnB,KAAK,QACL,SAAA,GACA,aAAa,QACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,OAAK,aAAA,CAAA,EAI1E,YAAY,2BACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAA0I,EAAA,EAAA,CATF,CAAAqD,EAAAA,WAAA/L,EAAA,KAAK,KAAK,CAAA,CAAA,EAWZA,EAAA,OAAO,OAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAA+E,IAA/EqI,GAA+EpH,kBAAnBf,SAAO,KAAK,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAC/DL,EAAA,KAAK,QAAUI,EAAA,MAAM,OAAAP,EAAAA,UAAA,EAA9BC,EAAAA,mBAEI,IAFJsI,GAA0E,iDAE1E,GAAA/H,EAAAA,mBAAA,OAAA,EAAA,IAGFJ,EAAAA,mBAeM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAdJT,EAAAA,mBAA4D,QAAA,CAArD,IAAI,QAAQ,MAAM,cAAA,EAAe,eAAY,EAAA,GAAA6L,EAAAA,eACpD7L,EAAAA,mBAWE,QAAA,CAVA,GAAG,QAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GACMd,OAAK,MAAKc,GACnB,KAAK,MACL,aAAa,MACZ,MAAKf,EAAAA,eAAA,CAAA,eAAwDC,EAAA,OAAO,OAAK,aAAA,CAAA,EAI1E,YAAY,0BACX,SAAUA,EAAA,OAAA,EAAA,KAAA,GAAAqI,EAAA,EAAA,CARF,CAAA0D,EAAAA,WAAA/L,EAAA,KAAK,KAAK,CAAA,CAAA,EAUZA,EAAA,OAAO,OAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAA+E,IAA/EwI,GAA+EvH,kBAAnBf,SAAO,KAAK,EAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,MAI5EA,EAAAA,mBAAA,qBAAA,EACAJ,EAAAA,mBA0FM,MA1FN2I,GA0FM,CAAAlI,EAAA,EAAA,IAAAA,EAAA,EAAA,EAzFJT,EAAAA,mBAA8E,KAAA,CAA1E,MAAM,6CAAA,EAA8C,oBAAiB,EAAA,GAEzEI,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBA8CM,MA9CN4I,GA8CM,CA7CJ5I,EAAAA,mBAYM,MAZNsI,GAYM,CAAA7H,EAAA,EAAA,IAAAA,EAAA,EAAA,EAXJT,EAAAA,mBAGM,MAAA,KAAA,CAFJA,EAAAA,mBAAsD,KAAA,CAAlD,MAAM,8BAAA,EAA+B,UAAQ,EACjDA,EAAAA,mBAAgE,IAAA,CAA7D,MAAM,0BAAA,EAA2B,0BAAwB,CAAA,OAE9DA,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,0CACL,QAAKS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAAEd,EAAA,mBAAkB,CAAIA,EAAA,mBAAA,oBAE3BA,EAAA,mBAAkB,SAAA,QAAA,EAAA,CAAA,CAAA,CAAA,EAIdA,EAAA,oBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBA8BM,MA9BNsJ,GA8BM,CAAA0C,EAAAA,eA7BJ7L,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,QAAOc,GAC7B,KAAK,WACL,YAAY,mBACZ,MAAM,eACN,aAAa,kBAAA,aAJJ,CAAAiL,EAAAA,WAAA/L,EAAA,aAAa,OAAO,CAAA,CAAA,EAM/B8L,EAAAA,eAAA7L,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,IAAGc,GACzB,KAAK,WACL,YAAY,eACZ,MAAM,eACN,aAAa,cAAA,aAJJ,CAAAiL,EAAAA,WAAA/L,EAAA,aAAa,GAAG,CAAA,CAAA,EAM3B8L,EAAAA,eAAA7L,EAAAA,mBAME,QAAA,CAAA,sBAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GALSd,eAAa,QAAOc,GAC7B,KAAK,WACL,YAAY,uBACZ,MAAM,eACN,aAAa,cAAA,aAJJ,CAAAiL,EAAAA,WAAA/L,EAAA,aAAa,OAAO,CAAA,CAAA,EAM/BC,EAAAA,mBAOS,SAAA,CANP,KAAK,SACL,MAAM,wCACL,QAAOD,EAAA,qBACP,SAAQ,CAAGA,EAAA,mBAAA,EACb,oBAED,EAAAsJ,EAAA,CAAA,CAAA,GAAAjJ,EAAAA,mBAAA,OAAA,EAAA,IAIJA,EAAAA,mBAAA,6BAAA,EACAJ,EAAAA,mBAmBM,MAnBNoJ,GAmBM,CAlBJpJ,EAAAA,mBAiBM,MAjBNgL,GAiBM,CAhBJhL,EAAAA,mBAKM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAAuE,KAAA,CAAnE,MAAM,8BAAA,EAA+B,4BAAyB,EAAA,GAClEA,EAAAA,mBAEI,IAFJiL,GAEInK,EAAAA,gBADCX,QAAM,WAAU,UAAA,oCAAA,EAAA,CAAA,CAAA,CAAA,EAGvBH,EAAAA,mBASS,SAAA,CARP,KAAK,SACJ,MAAKF,EAAAA,eAAA,CAAwBK,QAAM,WAAU,gBAAA,cAAA,8BAI7C,QAAOJ,EAAA,eAAA,EAELe,EAAAA,gBAAAX,EAAA,MAAM,WAAU,UAAA,QAAA,EAAA,CAAA,CAAA,CAAA,IAKzBC,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBAcM,MAdNkL,GAcM,CAbJlL,EAAAA,mBAYM,MAZNmL,GAYM,CAXJnL,EAAAA,mBAGM,MAAA,KAAA,CAAAS,EAAA,EAAA,IAAAA,EAAA,EAAA,EAFJT,EAAAA,mBAA6D,KAAA,CAAzD,MAAM,8BAAA,EAA+B,kBAAe,EAAA,GACxDA,EAAAA,mBAAoF,IAApFoL,GAAoFtK,EAAAA,gBAA7Cf,EAAA,eAAe,MAAM,EAAG,oBAAiB,CAAA,CAAA,CAAA,EAElFC,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,0CACL,QAAKS,eAAEH,EAAA,MAAK,iBAAA,EAAA,EACd,UAED,CAAA,CAAA,QAMRF,EAAAA,mBAAA,kBAAA,EACAJ,EAAAA,mBAwBM,MAxBNqL,GAwBM,CAvBJrL,EAAAA,mBAaS,SAAA,CAZP,KAAK,SACJ,SAAUD,WAAO,CAAKA,EAAA,WACvB,MAAM,aAAA,EAAA,CAEMA,EAAA,SAAAH,YAAA,EAAZC,EAAAA,mBAMO,OANPkM,GAMOtL,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CALLT,EAAAA,mBAGM,MAAA,CAHD,MAAM,uBAAuB,KAAK,OAAO,QAAQ,WAAA,GACpDA,EAAAA,mBAA0F,SAAA,CAAlF,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,OAAO,eAAe,eAAa,GAAA,CAAA,EACrFA,EAAAA,mBAAsK,OAAA,CAAhK,MAAM,aAAa,KAAK,eAAe,EAAE,qHAAA,CAAA,yBAC3C,sBAER,EAAA,CAAA,EAAA,IAAAJ,EAAAA,UAAA,EACAC,EAAAA,mBAAgC,UAAnB,cAAY,EAAA,EAAA,EAAAmM,EAAA,EAG3BhM,EAAAA,mBAOS,SAAA,CANP,KAAK,SACL,MAAM,gBACL,QAAOD,EAAA,aACP,SAAUA,EAAA,OAAA,EACZ,WAED,EAAAkM,EAAA,CAAA,CAAA,OAIJ7L,EAAAA,mBAAA,0BAAA,EACWL,EAAA,gBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATNqM,GASM,CARJlM,EAAAA,mBAOM,MAPNsL,GAOM,CANJtL,EAAAA,mBAKM,MALNuL,GAKM,CAAA9K,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAA6M,OAAA,CAAvM,YAAU,UAAU,EAAE,2JAA2J,YAAU,SAAA,CAAA,QAEnMA,EAAAA,mBAA+C,IAA/CwL,GAA+C1K,EAAAA,gBAArBf,EAAA,cAAc,EAAA,CAAA,CAAA,CAAA,uCAKnCA,EAAA,cAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBASM,MATNsM,GASM,CARJnM,EAAAA,mBAOM,MAPNyL,GAOM,CANJzL,EAAAA,mBAKM,MALN0L,GAKM,CAAAjL,EAAA,EAAA,IAAAA,EAAA,EAAA,EAJJT,EAAAA,mBAEM,MAAA,CAFD,MAAM,+BAA+B,KAAK,eAAe,QAAQ,WAAA,GACpEA,EAAAA,mBAAkQ,OAAA,CAA5P,YAAU,UAAU,EAAE,gNAAgN,YAAU,SAAA,CAAA,QAExPA,EAAAA,mBAA6C,IAA7C2L,GAA6C7K,EAAAA,gBAAnBf,EAAA,YAAY,EAAA,CAAA,CAAA,CAAA,uCAK5CK,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPNuM,GAOM,CANJpM,EAAAA,mBAKI,IALJ4L,GAKI,CAAAnL,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,EAAAA,YAES8D,EAAA,CAFD,QAAQ,UAAW,KAAI,UAAYtM,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,gEAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,wUCvM3C,MAAMhB,EAAQC,EACRkC,EAAOC,EAGP,CAAE,gBAAAuF,CAAA,EAAoB7B,mBAAiB9F,EAAM,MAAM,EAEnDqG,EAAU7D,EAAAA,IAAI,EAAK,EACnB8D,EAAQ9D,EAAAA,IAAI,EAAE,EACd+K,EAAc/K,EAAAA,IAAI,EAAK,EAEvB8F,EAAOC,EAAAA,SAAS,CACpB,MAAO,EAAA,CACR,iGAE2B,SAAY,CACtClC,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,GAEd,GAAI,CAEF,QAAQ,IAAI,0BAA2B,CAAE,MAAOgC,EAAK,MAAO,EAG5D,MAAM,IAAI,QAAQyD,GAAW,WAAWA,EAAS,GAAI,CAAC,EAEtDwB,EAAY,MAAQ,GACpBpL,EAAK,UAAWmG,EAAK,KAAK,CAC5B,MAAc,CACZhC,EAAM,MAAQ,yDACdnE,EAAK,QAASmE,EAAM,KAAK,CAC3B,QAAA,CACED,EAAQ,MAAQ,EAClB,CACF,iOAxGO3F,GAAA,CAAA,MAAM,oDAAA,EA8BFC,GAAA,CAAA,MAAM,kBAAA,YAUmB,MAAM,oBAC/BQ,GAAA,CAAA,MAAM,0BAAA,2BAzCf,OAAAN,YAAA,EAAAC,qBAoDM,MApDNJ,GAoDM,CAnDJ8I,EAAAA,YAkDSxI,EAAA,OAAA,CAlDD,QAAQ,QAAA,EAAQ,CAAA,QAAA4C,EAAAA,QACtB,IAAe,CAAfvC,EAAAA,mBAAA,UAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAAqE,KAAA,CAAjE,MAAM,uCAAA,EAAwC,gBAAc,EAChEA,EAAAA,mBAAyG,IAAA,CAAtG,MAAM,kBAAA,EAAmB,2EAAyE,CAAA,OAGvGI,EAAAA,mBAAA,cAAA,EACAJ,EAAAA,mBASO,OAAA,CATA,SAAM0I,EAAAA,cAAU3I,EAAA,oBAAmB,CAAA,SAAA,CAAA,EAAE,MAAM,WAAA,GAChDwI,cAE2DxI,EAAA,QAAA,CAFlD,GAAG,QAAA,WAAiBA,EAAA,KAAK,MAAA,sBAAAU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAI,GAALd,OAAK,MAAKc,GAAE,KAAK,QAAQ,MAAM,gBAC1D,YAAY,2BAA2B,aAAa,QAAQ,SAAA,GAAU,SAAUd,EAAA,SAAWA,EAAA,YAC1F,MAAOA,QAAK,0BAA+B,MAAA,EAAA,KAAA,EAAA,CAAA,aAAA,WAAA,OAAA,CAAA,EAE9CwI,cAGWxI,EAAA,SAAA,CAHD,KAAK,SAAS,QAAQ,UAAU,aAAA,GAAY,SAAUA,EAAA,SAAO,CAAKA,EAAA,KAAK,MAAM,QAAUA,EAAA,YAC9F,QAASA,EAAA,QAAU,eAAc,iBAAA,EAAA,mBAClC,IAAoD,CAAAQ,EAAAA,kCAAjDR,EAAA,YAAW,aAAA,iBAAA,EAAA,CAAA,CAAA,CAAA,sCAIlBK,EAAAA,mBAAA,mBAAA,EACeL,6BAAfyC,EAAAA,YAEiCzC,EAAA,QAAA,CAAA,IAAA,EAFL,QAAQ,UACjC,QAAO,0DAA4DA,EAAA,KAAK,KAAK,GAC9E,MAAM,sBAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAERA,EAAAA,mBAAA,iBAAA,EACeL,uBAAfyC,EAAAA,YAC0BzC,EAAA,QAAA,CAAA,IAAA,EADJ,QAAQ,QAAS,QAASA,EAAA,MAAO,MAAM,uBAAuB,YAAA,GACjF,UAAOU,eAAEV,EAAA,MAAK,GAAA,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAAK,EAAAA,mBAAA,OAAA,EAAA,EAEjBA,EAAAA,mBAAA,mBAAA,EACAJ,EAAAA,mBAOM,MAPNN,GAOM,CANJ6I,cAKSxI,EAAA,OAAA,CALA,QAAKU,eAAEH,EAAA,MAAK,gBAAA,GAAoB,MAAM,gCAAA,EAAA,mBAC7C,IAEMG,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNT,EAAAA,mBAEM,MAAA,CAFD,MAAM,UAAU,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,GAC7DA,EAAAA,mBAA4F,OAAA,CAAtF,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,iBAAA,CAAA,yBACpE,oBAER,EAAA,CAAA,EAAA,iBAGFI,EAAAA,mBAAA,aAAA,EACWL,EAAA,gBAAA,GAAeH,EAAAA,UAAA,EAA1BC,EAAAA,mBAOM,MAPNI,GAOM,CANJD,EAAAA,mBAKI,IALJE,GAKI,CAAAO,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAF,EAAAA,gBALgC,eAElC,EAAA,GAAAgI,cAESxI,EAAA,OAAA,CAFD,QAAQ,UAAW,KAAI,UAAYA,EAAA,gBAAA,CAAe,EAAA,EAAA,mBAAM,IAEhEU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAAF,EAAAA,gBAFgE,oBAEhE,EAAA,CAAA,EAAA,+DAIJH,EAAAA,mBAAA,qBAAA,EACAmI,cAA+CxI,EAAA,qBAAA,CAAxB,OAAQA,EAAA,MAAM,MAAA,EAAA,KAAA,EAAA,CAAA,QAAA,CAAA,mXClDpCN,GAAA,CAAA,MAAM,oDAAA,EAMJC,GAAA,CAAA,MAAM,WAAA,EAkCJO,GAAA,CAAA,MAAM,iBAAA,2BAxCf,OAAAL,YAAA,EAAAC,qBAwDM,MAxDNJ,GAwDM,CAAAgB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAvDJT,EAAAA,mBAGM,MAAA,CAHD,MAAM,kBAAA,EAAkB,CAC3BA,EAAAA,mBAA2E,KAAA,CAAvE,MAAM,kCAAA,EAAmC,2BAAyB,EACtEA,EAAAA,mBAA8D,IAAA,CAA3D,MAAM,oBAAA,EAAqB,8BAA4B,CAAA,OAG5DA,EAAAA,mBAiDM,MAjDNN,GAiDM,CAhDJU,EAAAA,mBAAA,mBAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA8L,oBAAA,meAAA,CAAA,GAYAnM,EAAAA,mBAAA,aAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBAKM,MAAA,KAAA,CAJJA,EAAAA,mBAA4F,QAAA,CAArF,MAAM,8CAAA,EAA+C,0BAAwB,EACpFA,EAAAA,mBAEM,MAAA,CAFD,MAAM,2DAAA,EAA4D,2CAEvE,CAAA,OAGFI,EAAAA,mBAAA,2BAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EACAT,EAAAA,mBASM,MAAA,KAAA,CARJA,EAAAA,mBAAqF,QAAA,CAA9E,MAAM,8CAAA,EAA+C,mBAAiB,EAC7EA,EAAAA,mBAKE,QAAA,CAJA,KAAK,OACL,YAAY,qBACZ,MAAM,qIACN,UAAU,GAAA,CAAA,EAEZA,EAAAA,mBAA4F,IAAA,CAAzF,MAAM,4BAAA,EAA6B,oDAAkD,CAAA,OAG1FI,EAAAA,mBAAA,WAAA,EACAJ,EAAAA,mBAcM,MAdNC,GAcM,CAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAbJT,EAAAA,mBAKS,SAAA,CAJP,KAAK,SACL,MAAM,yKAAA,EACP,eAED,EAAA,GACAA,EAAAA,mBAMS,SAAA,CALP,KAAK,SACL,MAAM,oKACL,QAAKS,eAAEH,EAAA,MAAK,MAAA,EAAA,EACd,UAED,CAAA,CAAA,2TChBR,MAAMvB,EAAQC,EAIRkC,EAAOC,EAEP,CAAE,gBAAAqL,EAAiB,KAAA5B,EAAM,QAAA6B,CAAA,EAAYlD,EAAAA,eAAA,8DAE5B,IAAM,CACnBrI,EAAK,kBAAkB,CACzB,6FA/C8B,MAAM,6BAGJ,MAAM,mDAHzBnB,EAAA,iBAAAH,EAAAA,UAAA,EAAXC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAAwCC,EAAA,OAAA,UAAA,CAAjC,KAAMP,EAAA,KAAO,QAASA,EAAA,OAAA,CAAA,KAEfI,EAAA,cAAAP,EAAAA,UAAA,EAAhBC,EAAAA,mBAmBM,MAnBNH,GAmBM,CAlBJW,aAiBOC,EAAA,OAAA,WAAA,CAjBgB,OAAQP,EAAA,MAAA,EAA/B,IAiBO,CAhBLK,EAAAA,mBAAA,4BAAA,EACAJ,EAAAA,mBAcM,MAAA,CAdD,MAAM,kBAAA,EAAkB,CAAAS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA8L,oBAAA,oiBAAA,CAAA,GAQ3BvM,EAAAA,mBAKS,SAAA,CAJN,QAAOD,EAAA,OACR,MAAM,+BAAA,EACP,WAED,CAAA,CAAA,uWCgCR,MAAMhB,EAAQC,EAIRkC,EAAOC,EAEP,CAAE,gBAAAqL,EAAiB,UAAAE,EAAW,KAAA9B,EAAM,QAAA6B,CAAA,EAAYlD,EAAAA,eAAA,0EAEvC,IAAM,CACnBrI,EAAK,iBAAiB,CACxB,SAEe,IAAM,CACnBA,EAAK,iBAAiB,CACxB,6FAjE6C,MAAM,6BAGA,MAAM,mBAG9CjB,GAAA,CAAA,MAAM,kBAAA,EAONC,GAAA,CAAA,MAAM,uBAAA,YAUY,MAAM,0CAvBrB,MAAA,CAAAH,EAAA,iBAAe,CAAKA,EAAA,WAAAH,EAAAA,YAAhCC,EAAAA,mBAEM,MAFNJ,GAEM,CADJY,aAA0CC,EAAA,OAAA,UAAA,CAAnC,OAAQP,EAAA,OAAS,OAAQA,EAAA,MAAA,CAAA,KAElBI,EAAA,cAAgBJ,EAAA,iBAAAH,EAAAA,YAAhCC,EAAAA,mBAmBM,MAnBNH,GAmBM,CAlBJW,aAiBOC,EAAA,OAAA,WAAA,CAjBgB,KAAMP,EAAA,KAAO,QAASA,EAAA,OAAA,EAA7C,IAiBO,CAhBLK,EAAAA,mBAAA,gDAAA,EACAJ,EAAAA,mBAcM,MAdNC,GAcM,CAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAbJT,EAAAA,mBAIM,MAAA,CAJD,MAAM,qFAAA,EAAqF,CAC9FA,EAAAA,mBAEM,MAAA,CAFD,MAAM,2BAA2B,KAAK,OAAO,OAAO,eAAe,QAAQ,WAAA,EAAA,CAC9EA,EAAAA,mBAAgJ,OAAA,CAA1I,iBAAe,QAAQ,kBAAgB,QAAQ,eAAa,IAAI,EAAE,qEAAA,CAAA,UAG5ES,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAT,EAAAA,mBAA8E,KAAA,CAA1E,MAAM,6CAAA,EAA8C,oBAAiB,EAAA,GACzEA,EAAAA,mBAAqF,IAArFE,GAAiC,iCAA8BY,EAAAA,gBAAGf,EAAA,MAAM,KAAK,EAAG,IAAC,CAAA,EACjFC,EAAAA,mBAKS,SAAA,CAJN,QAAKS,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,IAAAkM,IAAE5M,EAAA,SAAAA,EAAA,QAAA,GAAA4M,CAAA,GACR,MAAM,iCAAA,EACP,YAED,CAAA,CAAA,OAIU5M,EAAA,WAAAH,EAAAA,UAAA,EAAhBC,EAAAA,mBAaM,MAbNF,GAaM,CAZJU,EAAAA,WAWOC,sBAXP,IAWO,CAVLF,EAAAA,mBAAA,yBAAA,EAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA8L,EAAAA,kBAAA,+iBAAA,CAAA,oaCzBJ,OAAA3M,EAAAA,UAAA,EAAAC,EAAAA,mBAsBM,MAAA,CArBJ,QAAQ,iBACR,MAAM,6BACL,MAAKC,EAAAA,eAAEK,EAAA,KAAK,EACb,KAAK,MACL,aAAW,uBAAA,eAEXH,EAAAA,mBAQI,IAAA,KAAA,CAPFA,EAAAA,mBAMO,OAAA,CALL,EAAE,UACF,EAAE,UACF,MAAA,CAAA,cAAA,kDAAA,cAAA,MAAA,YAAA,YAAA,KAAA,cAAA,CAAA,EACD,UAED,CAAA,MAEFA,EAAAA,mBAKI,IAAA,KAAA,CAJFA,EAAAA,mBAGE,OAAA,CAFA,EAAE,kpFACF,MAAA,CAAA,KAAA,eAAA,YAAA,SAAA,CAAA,CAAA,sRCRR,MAAMjB,EAAQC,EAGdkF,EAAAA,UAAU,IAAM,CACd0I,EAAAA,qBAAqB7N,EAAM,MAAM,CACnC,CAAC,EAGD6N,EAAAA,qBAAqB7N,EAAM,MAAM,oIAnB/BsB,aAAQC,EAAA,OAAA,SAAA,ofCiBV,MAAMvB,EAAQC,EAQR2B,EAAc,CAClB,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,SAAA,EAGAkM,EAAY3N,EAAAA,SAAS,IAAM,GAAGyB,EAAY5B,EAAM,IAAI,CAAC,IAAIA,EAAM,KAAK,EAAE,EACtE+N,EAAU5N,WAAS,IAAM,WAAW,EAEpC6N,EAAQ,CACZ,IAAO,IAAMC,EAAAA,EAAE,IAAK,CAClBA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,kCAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,yHAAA,CACJ,CAAA,CACF,EACD,YAAa,IAAMA,EAAAA,EAAE,IAAK,CACxBA,EAAAA,EAAE,OAAQ,CACR,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,qLAAA,CACJ,CAAA,CACF,EACD,OAAU,IAAMA,EAAAA,EAAE,OAAQ,CACxB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,kKAAA,CACJ,EACD,eAAgB,IAAMA,EAAAA,EAAE,OAAQ,CAC9B,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,iBAAA,CACJ,EACD,QAAW,IAAMA,EAAAA,EAAE,IAAK,CACtBA,EAAAA,EAAE,SAAU,CACV,MAAO,aACP,GAAI,KACJ,GAAI,KACJ,EAAG,KACH,OAAQ,eACR,eAAgB,GAAA,CACjB,EACDA,EAAAA,EAAE,OAAQ,CACR,MAAO,aACP,KAAM,eACN,EAAG,qHAAA,CACJ,CAAA,CACF,EACD,eAAgB,IAAMA,EAAAA,EAAE,OAAQ,CAC9B,YAAa,UACb,EAAG,2JACH,YAAa,SAAA,CACd,EACD,WAAY,IAAMA,EAAAA,EAAE,OAAQ,CAC1B,YAAa,UACb,EAAG,gNACH,YAAa,SAAA,CACd,EACD,KAAQ,IAAMA,EAAAA,EAAE,OAAQ,CACtB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,sGAAA,CACJ,EACD,KAAQ,IAAMA,EAAAA,EAAE,OAAQ,CACtB,iBAAkB,QAClB,kBAAmB,QACnB,eAAgB,IAChB,EAAG,qEAAA,CACJ,EACD,OAAU,IAAMA,EAAAA,EAAE,IAAK,CAAE,KAAM,gBAAkB,CAC/CA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,yHAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,uIAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,+HAAA,CACJ,EACDA,EAAAA,EAAE,OAAQ,CACR,KAAM,UACN,EAAG,qIAAA,CACJ,CAAA,CACF,EACD,OAAU,IAAMA,EAAAA,EAAE,OAAQ,CACxB,YAAa,UACb,EAAG,mtBACH,YAAa,SAAA,CACd,CAAA,EAGGC,EAAgB/N,EAAAA,SAAS,IAAM,CACnC,MAAMgO,EAAOH,EAAMhO,EAAM,IAA0B,EACnD,OAAOmO,EAAOA,IAASF,EAAAA,EAAE,OAAQ,CAAE,EAAG,GAAI,CAC5C,CAAC,qPAxICnN,EAAAA,mBAEM,MAAA,CAFA,MAAKC,EAAAA,eAAEC,EAAA,SAAS,EAAG,KAAMI,EAAA,KAAO,OAAQA,EAAA,OAAS,QAASJ,EAAA,QAAU,cAAaI,EAAA,UAAA,EAAA,EACrFP,EAAAA,UAAA,EAAA4C,EAAAA,YAAiCC,EAAAA,wBAAjB1C,EAAA,aAAa,CAAA,EAAA,EAAA,GAAAN,EAAA,kJCDpB0N,GAAgBpG,GACR,6BACD,KAAKA,CAAK,EAIjBqG,GAAoBpG,GAI5B,CACH,MAAMwD,EAAmB,CAAA,EACzB,IAAI3C,EAAQ,EAERb,EAAS,OAAS,EACpBwD,EAAO,KAAK,6CAA6C,EAEzD3C,GAAS,EAGN,QAAQ,KAAKb,CAAQ,EAGxBa,GAAS,EAFT2C,EAAO,KAAK,qDAAqD,EAK9D,QAAQ,KAAKxD,CAAQ,EAGxBa,GAAS,EAFT2C,EAAO,KAAK,qDAAqD,EAK9D,KAAK,KAAKxD,CAAQ,EAGrBa,GAAS,EAFT2C,EAAO,KAAK,2CAA2C,EAKpD,yBAAyB,KAAKxD,CAAQ,EAGzCa,GAAS,EAFT2C,EAAO,KAAK,sDAAsD,EAKpE,MAAM6C,EAAU7C,EAAO,SAAW,EAClC,IAAI8C,EAAyC,OAE7C,OAAIzF,GAAS,EACXyF,EAAW,SACFzF,GAAS,IAClByF,EAAW,UAGN,CAAE,QAAAD,EAAS,SAAAC,EAAU,OAAA9C,CAAA,CAC9B,EAGa+C,GAAeC,GACnBA,EAAK,OAAO,QAAU,EAIlBC,GAAgBC,GACR,yBACD,KAAKA,EAAM,QAAQ,cAAe,EAAE,CAAC,EAI5CC,GAAc1K,GAClBA,EAAM,OAAO,OAAS,EAIlB2K,GAAiB,CAAC5G,EAAkB6G,IACxC7G,IAAa6G,EAITlD,GAAc,CAAC1D,EAAoBC,IAA8B,CAC5E,MAAM4G,EAAQ7G,GAAW,OAAO,CAAC,EAAE,eAAiB,GAC9C8G,EAAO7G,GAAU,OAAO,CAAC,EAAE,eAAiB,GAClD,OAAO4G,EAAQC,GAAQ,GACzB,EAGaC,GAAcC,IACf,OAAOA,GAAS,SAAW,IAAI,KAAKA,CAAI,EAAIA,GAC7C,mBAAmB,QAAS,CACnC,KAAM,UACN,MAAO,OACP,IAAK,SAAA,CACN,EAIUC,GAAW,CACtBC,EACAC,IACuC,CACvC,IAAIC,EACJ,MAAO,IAAI1B,IAAwB,CACjC,aAAa0B,CAAO,EACpBA,EAAU,WAAW,IAAMF,EAAK,GAAGxB,CAAI,EAAGyB,CAAI,CAChD,CACF"}
|