{"version":3,"file":"AccessSection.mjs","sources":["../../../../../../../../web/src/adminPortal/memberManagement/AccessSection.tsx"],"sourcesContent":["import { RBACPolicyRole } from '@stytch/core';\nimport { B2BOrganizationsMembersUpdateOptions, Member, MemberRole } from '@stytch/core/public';\nimport React, { SetStateAction, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Autocomplete } from '../components/Autocomplete';\nimport { FlexBox } from '../components/FlexBox';\nimport { ListEditor } from '../components/ListEditor';\nimport { Modal, useModalState } from '../components/Modal';\nimport { SettingsContainer, useSettingsContainer } from '../components/SettingsContainer';\nimport { SettingsSection } from '../components/SettingsSection';\nimport { Switch } from '../components/Switch';\nimport { Typography } from '../components/Typography';\nimport { TableItemRenderer } from '../shared/components/types';\nimport { arraysHaveSameContents } from '../utils/arraysHaveSameContents';\nimport { ROLE_ID_STYTCH_MEMBER } from '../utils/roles';\nimport { useFormState } from '../utils/useFormState';\nimport { useMutateMember } from '../utils/useMutateMember';\nimport { useRbac } from '../utils/useRbac';\nimport { useRoleAutocomplete } from '../utils/useRoleAutocomplete';\nimport { useRoleDisplayInfo } from '../utils/useRoleDisplayInfo';\nimport { useRoles } from '../utils/useRoles';\nimport { useRoleSortFn } from '../utils/useRoleSortFn';\nimport { useSelf } from '../utils/useSelf';\nimport { useStateSliceSetter } from '../utils/useStateSliceSetter';\nimport { useMemberManagementRouterController } from './MemberManagementRouter';\n\ntype RoleSourceType = MemberRole['sources'][number]['type'];\n\ninterface AccessFormState {\n  isBreakglass: boolean;\n  isMfaEnrolled: boolean;\n  explicitRoleAssignments: string[];\n}\n\ninterface AccessSectionBodyProps {\n  localState: AccessFormState;\n  setLocalState: (state: SetStateAction<AccessFormState>) => void;\n  remoteState: AccessFormState;\n  implicitRoleAssignments: { role_id: string; sourceType: RoleSourceType }[];\n  showRoleAssignment: boolean;\n  isSelf: boolean;\n  orgRequiresMfa: boolean;\n}\n\nconst getRoleSourceTypeDisplayName = (sourceType: RoleSourceType) => {\n  switch (sourceType) {\n    case 'direct_assignment':\n      return 'Manual assignment';\n    case 'email_assignment':\n      return 'Email domain';\n    case 'sso_connection':\n      return 'SSO connection';\n    case 'sso_connection_group':\n      return 'SSO group';\n    case 'scim_connection_group':\n      return 'SCIM group';\n    default:\n      return sourceType;\n  }\n};\n\nconst roleAssignmentsRowKeyExtractor = (item: { role_id: string; sourceType: RoleSourceType }): string =>\n  `${item.role_id}-${item.sourceType}`;\n\nconst AccessSectionBody = ({\n  localState,\n  setLocalState,\n  remoteState,\n  implicitRoleAssignments,\n  showRoleAssignment,\n  isSelf,\n  orgRequiresMfa,\n}: AccessSectionBodyProps) => {\n  const { editing } = useSettingsContainer();\n\n  const { isMfaEnrolled, explicitRoleAssignments, isBreakglass } = editing ? localState : remoteState;\n\n  const handleIsMfaEnrolledChange = useStateSliceSetter(setLocalState, 'isMfaEnrolled');\n  const setIsBreakglass = useStateSliceSetter(setLocalState, 'isBreakglass');\n\n  const { open: openBreakGlassConfirmModal, ...breakGlassConfirmModalProps } = useModalState(() => {\n    setIsBreakglass(true);\n  });\n\n  const handleIsBreakglassChange = useCallback(\n    (value: boolean) => {\n      if (value) {\n        openBreakGlassConfirmModal();\n      } else {\n        setIsBreakglass(value);\n      }\n    },\n    [openBreakGlassConfirmModal, setIsBreakglass],\n  );\n\n  const { data: canUpdateMemberRolesPerm } = useRbac('stytch.member', 'update.settings.roles');\n  const { data: canUpdateMemberMfaEnrolledPerm } = useRbac('stytch.member', 'update.settings.mfa-enrolled');\n  const { data: canUpdateMemberBreakglassPerm } = useRbac('stytch.member', 'update.settings.is-breakglass');\n\n  const { data: canUpdateSelfMfaEnrolledPerm } = useRbac('stytch.self', 'update.settings.mfa-enrolled');\n\n  const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');\n\n  const canUpdateMfaEnrolled = canUpdateMemberMfaEnrolledPerm || (canUpdateSelfMfaEnrolledPerm && isSelf);\n  const canUpdateRoles = canUpdateMemberRolesPerm;\n  const canUpdateBreakglass = canUpdateMemberBreakglassPerm;\n\n  const sortRoles = useRoleSortFn();\n\n  const { selectItems: roleSelectItems, ...roleAutocompleteProps } = useRoleAutocomplete({\n    excludeStytchMember: true,\n    includeOrgRoles: canGetOrgCustomRoles,\n  });\n  const availableRoleSelectItems = roleSelectItems.filter((roleId) => !explicitRoleAssignments.includes(roleId));\n\n  const { getRoleIdDisplayName } = useRoleDisplayInfo(canGetOrgCustomRoles);\n\n  const stytchMemberRoleDisplayName = roleAutocompleteProps.getOptionLabel(ROLE_ID_STYTCH_MEMBER);\n\n  const combinedRoleAssignments = useMemo(() => {\n    return [\n      ...sortRoles(implicitRoleAssignments),\n      ...sortRoles(\n        explicitRoleAssignments.map((roleId) => ({ role_id: roleId, sourceType: 'direct_assignment' as const })),\n      ),\n    ];\n  }, [explicitRoleAssignments, implicitRoleAssignments, sortRoles]);\n\n  const [pendingAssignments, setPendingAssignments] = useState<string[]>([]);\n  const { open: openRoleAssignmentModal, ...roleAssignmentModalProps } = useModalState(() => {\n    setLocalState((state) => {\n      return {\n        ...state,\n        explicitRoleAssignments: Array.from(new Set([...state.explicitRoleAssignments, ...pendingAssignments])),\n      };\n    });\n  });\n\n  const roleAssignmentsItemRenderer: TableItemRenderer<(typeof combinedRoleAssignments)[number]>[] = useMemo(\n    () => [\n      {\n        title: 'Role',\n        getValue: (assignment) => <Typography variant=\"body2\">{getRoleIdDisplayName(assignment.role_id)}</Typography>,\n      },\n      {\n        title: 'Source',\n        getValue: (assignment) => (\n          <Typography variant=\"body2\">{getRoleSourceTypeDisplayName(assignment.sourceType)}</Typography>\n        ),\n      },\n    ],\n    [getRoleIdDisplayName],\n  );\n\n  const handleAddRoleAssignment = useCallback(() => {\n    setPendingAssignments([]);\n    openRoleAssignmentModal();\n  }, [openRoleAssignmentModal]);\n\n  const roleAssignmentsItemActionProps = useMemo(\n    () => (item: (typeof combinedRoleAssignments)[number]) =>\n      item.sourceType === 'direct_assignment'\n        ? {\n            warningAction: {\n              text: 'Revoke',\n              onClick: () => {\n                setLocalState((state) => {\n                  return {\n                    ...state,\n                    explicitRoleAssignments: state.explicitRoleAssignments.filter((roleId) => roleId !== item.role_id),\n                  };\n                });\n              },\n            },\n          }\n        : {},\n    [setLocalState],\n  );\n\n  return (\n    <FlexBox flexDirection=\"column\" gap={2}>\n      {editing && (\n        <Modal\n          {...breakGlassConfirmModalProps}\n          title=\"Exempt Member from primary auth requirements?\"\n          confirmButtonText=\"Allow\"\n          warning\n        >\n          <Typography>\n            Enabling this toggle will exempt the Member from your primary authentication policy if needed (e.g. to\n            update SSO configuration in the case of a lockout).\n          </Typography>\n        </Modal>\n      )}\n      {showRoleAssignment && (\n        <SettingsSection title=\"Role assignments\">\n          <Modal {...roleAssignmentModalProps} title=\"Add Role assignment\" confirmButtonText=\"Add Role\">\n            <FlexBox flexDirection=\"column\" gap={0.5}>\n              <Typography color=\"secondary\" variant=\"caption\">\n                Role\n              </Typography>\n              <Autocomplete\n                {...roleAutocompleteProps}\n                selectItems={availableRoleSelectItems}\n                value={pendingAssignments}\n                onChange={setPendingAssignments}\n                placeholder={pendingAssignments.length > 0 ? undefined : 'Select Role'}\n              />\n            </FlexBox>\n          </Modal>\n          <Typography variant=\"body2\">\n            All members are automatically assigned the {stytchMemberRoleDisplayName} Role.\n          </Typography>\n          <ListEditor\n            items={combinedRoleAssignments}\n            rowKeyExtractor={roleAssignmentsRowKeyExtractor}\n            itemRenderer={roleAssignmentsItemRenderer}\n            addButtonText=\"Add Role assignment\"\n            hideAddButton={availableRoleSelectItems.length === 0}\n            readOnly={!(editing && canUpdateRoles)}\n            onAdd={handleAddRoleAssignment}\n            getItemActionProps={roleAssignmentsItemActionProps}\n          />\n        </SettingsSection>\n      )}\n      <SettingsSection title=\"Require MFA\">\n        {orgRequiresMfa ? (\n          <Typography variant=\"body2\">MFA is required for all members.</Typography>\n        ) : (\n          <Switch\n            readOnly={!editing || !canUpdateMfaEnrolled}\n            checked={isMfaEnrolled}\n            onChange={handleIsMfaEnrolledChange}\n            label=\"Require MFA for this Member. When enabled, the Member will be required to set up and use MFA on each login.\"\n          />\n        )}\n      </SettingsSection>\n      <SettingsSection title=\"Exempt from primary auth requirements\">\n        <Switch\n          readOnly={!editing || !canUpdateBreakglass}\n          checked={isBreakglass}\n          onChange={handleIsBreakglassChange}\n          label=\"Exempt Member from your primary authentication policy\"\n        />\n      </SettingsSection>\n    </FlexBox>\n  );\n};\n\nconst rolesCanUpdateMemberRoles = (roleIds: string[], roles: RBACPolicyRole[]) => {\n  return Array.from(new Set(roleIds)).some((roleId) => {\n    const role = roles.find((role) => role.role_id === roleId);\n    return role?.permissions.some(\n      (permission) =>\n        permission.resource_id === 'stytch.member' &&\n        (permission.actions.includes('update.settings.roles') || permission.actions.includes('*')),\n    );\n  });\n};\n\nexport const AccessSection = ({ member, orgRequiresMfa }: { member: Member; orgRequiresMfa: boolean }) => {\n  const { isSelf } = useSelf();\n  const isMemberSelf = isSelf(member.member_id);\n  const { data: canUpdateMemberRolesPerm } = useRbac('stytch.member', 'update.settings.roles');\n  const { data: canUpdateMemberBreakglassPerm } = useRbac('stytch.member', 'update.settings.is-breakglass');\n  const { data: canUpdateMemberMfaEnrolledPerm } = useRbac('stytch.member', 'update.settings.mfa-enrolled');\n\n  const { data: canUpdateSelfMfaEnrolledPerm } = useRbac('stytch.self', 'update.settings.mfa-enrolled');\n\n  const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');\n\n  const canUpdateRoles = canUpdateMemberRolesPerm;\n  const canUpdateBreakglass = canUpdateMemberBreakglassPerm;\n  const canUpdateMfaEnrolled =\n    !orgRequiresMfa && (canUpdateMemberMfaEnrolledPerm || (canUpdateSelfMfaEnrolledPerm && isMemberSelf));\n\n  const isMemberDeleted = member.status === 'deleted';\n\n  const canEditSection = !isMemberDeleted && (canUpdateRoles || canUpdateBreakglass || canUpdateMfaEnrolled);\n  const showRoleAssignment = !isMemberDeleted;\n\n  const { explicitRoleAssignments, implicitRoleAssignments } = useMemo(() => {\n    return member.roles\n      .filter((role) => role.role_id !== ROLE_ID_STYTCH_MEMBER)\n      .reduce<{\n        explicitRoleAssignments: string[];\n        implicitRoleAssignments: { role_id: string; sourceType: RoleSourceType }[];\n      }>(\n        (acc, role) => {\n          const implicitAssignments = new Set(\n            role.sources.filter((source) => source.type !== 'direct_assignment').map((source) => source.type),\n          );\n          for (const sourceType of implicitAssignments) {\n            acc.implicitRoleAssignments.push({ role_id: role.role_id, sourceType });\n          }\n\n          const isExplicitAssignment = role.sources.some((source) => source.type === 'direct_assignment');\n          if (isExplicitAssignment) {\n            acc.explicitRoleAssignments.push(role.role_id);\n          }\n\n          return acc;\n        },\n        {\n          explicitRoleAssignments: [],\n          implicitRoleAssignments: [],\n        },\n      );\n  }, [member.roles]);\n\n  const remoteState = useMemo<AccessFormState>(\n    () => ({\n      isMfaEnrolled: member.mfa_enrolled,\n      explicitRoleAssignments,\n      isBreakglass: member.is_breakglass,\n    }),\n    [explicitRoleAssignments, member.is_breakglass, member.mfa_enrolled],\n  );\n\n  const { localState, setLocalState, editing, handleSetEditing } = useFormState({ remoteState });\n\n  const { mutate } = useMutateMember();\n\n  const lockoutConfirmDeferred = useRef<{ resolve: () => void; reject: () => void }>();\n\n  const {\n    open: openLockoutWarningModal,\n    close: closeLockoutWarningModal,\n    ...lockoutWarningModalProps\n  } = useModalState(() => {\n    lockoutConfirmDeferred.current?.resolve();\n    lockoutConfirmDeferred.current = undefined;\n  });\n  const handleLockoutWarningCancel = useCallback(() => {\n    lockoutConfirmDeferred.current?.reject();\n    lockoutConfirmDeferred.current = undefined;\n    closeLockoutWarningModal();\n  }, [closeLockoutWarningModal]);\n\n  const roles = useRoles(canGetOrgCustomRoles);\n\n  const handleSave = useCallback(async () => {\n    const memberOptions: B2BOrganizationsMembersUpdateOptions = {\n      member_id: member.member_id,\n    };\n\n    let shouldUpdate = false;\n    const setOption = <T extends keyof B2BOrganizationsMembersUpdateOptions>(\n      key: T,\n      value: B2BOrganizationsMembersUpdateOptions[T],\n    ) => {\n      memberOptions[key] = value;\n      shouldUpdate = true;\n    };\n\n    if (localState.isMfaEnrolled !== remoteState.isMfaEnrolled) {\n      setOption('mfa_enrolled', localState.isMfaEnrolled);\n    }\n    if (localState.isBreakglass !== remoteState.isBreakglass) {\n      setOption('is_breakglass', localState.isBreakglass);\n    }\n    if (!arraysHaveSameContents(localState.explicitRoleAssignments, remoteState.explicitRoleAssignments)) {\n      if (\n        isSelf(member.member_id) &&\n        roles &&\n        !rolesCanUpdateMemberRoles(\n          [...localState.explicitRoleAssignments, ...implicitRoleAssignments.map((role) => role.role_id)],\n          roles,\n        )\n      ) {\n        openLockoutWarningModal();\n        await new Promise<void>((resolve, reject) => {\n          lockoutConfirmDeferred.current = { resolve, reject };\n        });\n      }\n\n      setOption('roles', localState.explicitRoleAssignments);\n    }\n\n    if (shouldUpdate) {\n      await mutate(memberOptions);\n    }\n  }, [\n    implicitRoleAssignments,\n    isSelf,\n    localState.explicitRoleAssignments,\n    localState.isBreakglass,\n    localState.isMfaEnrolled,\n    member.member_id,\n    mutate,\n    openLockoutWarningModal,\n    remoteState.explicitRoleAssignments,\n    remoteState.isBreakglass,\n    remoteState.isMfaEnrolled,\n    roles,\n  ]);\n\n  const { useBlockNavigation } = useMemberManagementRouterController();\n\n  return (\n    <SettingsContainer\n      title=\"Access requirements & permissions\"\n      hasCTA={canEditSection}\n      onSave={handleSave}\n      useBlockNavigation={useBlockNavigation}\n      editing={editing}\n      setEditing={handleSetEditing}\n    >\n      <Modal\n        {...lockoutWarningModalProps}\n        close={handleLockoutWarningCancel}\n        title=\"Revoke Role assignments?\"\n        confirmButtonText=\"Revoke\"\n        warning\n      >\n        <Typography>\n          Changing your Role assignments will remove your permissions to manage members. You will not be able to edit\n          your Role assignments to reassign permissions.\n        </Typography>\n      </Modal>\n      <AccessSectionBody\n        remoteState={remoteState}\n        localState={localState}\n        setLocalState={setLocalState}\n        implicitRoleAssignments={implicitRoleAssignments}\n        showRoleAssignment={showRoleAssignment}\n        isSelf={isMemberSelf}\n        orgRequiresMfa={orgRequiresMfa}\n      />\n    </SettingsContainer>\n  );\n};\n"],"names":["getRoleSourceTypeDisplayName","sourceType","roleAssignmentsRowKeyExtractor","item","role_id","AccessSectionBody","localState","setLocalState","remoteState","implicitRoleAssignments","showRoleAssignment","isSelf","orgRequiresMfa","editing","useSettingsContainer","isMfaEnrolled","explicitRoleAssignments","isBreakglass","handleIsMfaEnrolledChange","useStateSliceSetter","setIsBreakglass","open","openBreakGlassConfirmModal","breakGlassConfirmModalProps","useModalState","handleIsBreakglassChange","useCallback","value","data","canUpdateMemberRolesPerm","useRbac","canUpdateMemberMfaEnrolledPerm","canUpdateMemberBreakglassPerm","canUpdateSelfMfaEnrolledPerm","canGetOrgCustomRoles","canUpdateMfaEnrolled","canUpdateRoles","canUpdateBreakglass","sortRoles","useRoleSortFn","selectItems","roleSelectItems","roleAutocompleteProps","useRoleAutocomplete","excludeStytchMember","includeOrgRoles","availableRoleSelectItems","filter","roleId","includes","getRoleIdDisplayName","useRoleDisplayInfo","stytchMemberRoleDisplayName","getOptionLabel","ROLE_ID_STYTCH_MEMBER","combinedRoleAssignments","useMemo","map","pendingAssignments","setPendingAssignments","useState","openRoleAssignmentModal","roleAssignmentModalProps","state","Array","from","Set","roleAssignmentsItemRenderer","title","getValue","assignment","React","Typography","variant","handleAddRoleAssignment","roleAssignmentsItemActionProps","warningAction","text","onClick","FlexBox","flexDirection","gap","Modal","confirmButtonText","warning","SettingsSection","color","Autocomplete","onChange","placeholder","length","undefined","ListEditor","items","rowKeyExtractor","itemRenderer","addButtonText","hideAddButton","readOnly","onAdd","getItemActionProps","Switch","checked","label","rolesCanUpdateMemberRoles","roleIds","roles","some","role","find","permissions","permission","resource_id","actions","AccessSection","member","useSelf","isMemberSelf","member_id","isMemberDeleted","status","canEditSection","reduce","acc","implicitAssignments","sources","source","type","push","isExplicitAssignment","mfa_enrolled","is_breakglass","handleSetEditing","useFormState","mutate","useMutateMember","lockoutConfirmDeferred","useRef","openLockoutWarningModal","close","closeLockoutWarningModal","lockoutWarningModalProps","current","resolve","handleLockoutWarningCancel","reject","useRoles","handleSave","memberOptions","shouldUpdate","setOption","key","arraysHaveSameContents","Promise","useBlockNavigation","useMemberManagementRouterController","SettingsContainer","hasCTA","onSave","setEditing"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAMA,+BAA+B,CAACC,UAAAA,GAAAA;IACpC,OAAQA,UAAAA;QACN,KAAK,mBAAA;YACH,OAAO,mBAAA;QACT,KAAK,kBAAA;YACH,OAAO,cAAA;QACT,KAAK,gBAAA;YACH,OAAO,gBAAA;QACT,KAAK,sBAAA;YACH,OAAO,WAAA;QACT,KAAK,uBAAA;YACH,OAAO,YAAA;AACT,QAAA;YACE,OAAOA,UAAAA;AACX;AACF,CAAA;AAEA,MAAMC,8BAAAA,GAAiC,CAACC,IAAAA,GACtC,CAAA,EAAGA,IAAAA,CAAKC,OAAO,CAAC,CAAC,EAAED,IAAAA,CAAKF,UAAU,CAAA,CAAE;AAEtC,MAAMI,oBAAoB,CAAC,EACzBC,UAAU,EACVC,aAAa,EACbC,WAAW,EACXC,uBAAuB,EACvBC,kBAAkB,EAClBC,MAAM,EACNC,cAAc,EACS,GAAA;IACvB,MAAM,EAAEC,OAAO,EAAE,GAAGC,oBAAAA,EAAAA;IAEpB,MAAM,EAAEC,aAAa,EAAEC,uBAAuB,EAAEC,YAAY,EAAE,GAAGJ,OAAAA,GAAUP,UAAAA,GAAaE,WAAAA;IAExF,MAAMU,yBAAAA,GAA4BC,oBAAoBZ,aAAAA,EAAe,eAAA,CAAA;IACrE,MAAMa,eAAAA,GAAkBD,oBAAoBZ,aAAAA,EAAe,cAAA,CAAA;AAE3D,IAAA,MAAM,EAAEc,IAAAA,EAAMC,0BAA0B,EAAE,GAAGC,2BAAAA,EAA6B,GAAGC,aAAAA,CAAc,IAAA;QACzFJ,eAAAA,CAAgB,IAAA,CAAA;AAClB,IAAA,CAAA,CAAA;IAEA,MAAMK,wBAAAA,GAA2BC,EAC/B,CAACC,KAAAA,GAAAA;AACC,QAAA,IAAIA,KAAAA,EAAO;AACTL,YAAAA,0BAAAA,EAAAA;QACF,CAAA,MAAO;YACLF,eAAAA,CAAgBO,KAAAA,CAAAA;AAClB,QAAA;IACF,CAAA,EACA;AAACL,QAAAA,0BAAAA;AAA4BF,QAAAA;AAAgB,KAAA,CAAA;AAG/C,IAAA,MAAM,EAAEQ,IAAAA,EAAMC,wBAAwB,EAAE,GAAGC,QAAQ,eAAA,EAAiB,uBAAA,CAAA;AACpE,IAAA,MAAM,EAAEF,IAAAA,EAAMG,8BAA8B,EAAE,GAAGD,QAAQ,eAAA,EAAiB,8BAAA,CAAA;AAC1E,IAAA,MAAM,EAAEF,IAAAA,EAAMI,6BAA6B,EAAE,GAAGF,QAAQ,eAAA,EAAiB,+BAAA,CAAA;AAEzE,IAAA,MAAM,EAAEF,IAAAA,EAAMK,4BAA4B,EAAE,GAAGH,QAAQ,aAAA,EAAe,8BAAA,CAAA;AAEtE,IAAA,MAAM,EAAEF,IAAAA,EAAMM,oBAAoB,EAAE,GAAGJ,QAAQ,yBAAA,EAA2B,KAAA,CAAA;IAE1E,MAAMK,oBAAAA,GAAuBJ,kCAAmCE,4BAAAA,IAAgCtB,MAAAA;AAChG,IAAA,MAAMyB,cAAAA,GAAiBP,wBAAAA;AACvB,IAAA,MAAMQ,mBAAAA,GAAsBL,6BAAAA;AAE5B,IAAA,MAAMM,SAAAA,GAAYC,aAAAA,EAAAA;AAElB,IAAA,MAAM,EAAEC,WAAAA,EAAaC,eAAe,EAAE,GAAGC,qBAAAA,EAAuB,GAAGC,mBAAAA,CAAoB;QACrFC,mBAAAA,EAAqB,IAAA;QACrBC,eAAAA,EAAiBX;AACnB,KAAA,CAAA;IACA,MAAMY,wBAAAA,GAA2BL,gBAAgBM,MAAM,CAAC,CAACC,MAAAA,GAAW,CAAChC,uBAAAA,CAAwBiC,QAAQ,CAACD,MAAAA,CAAAA,CAAAA;AAEtG,IAAA,MAAM,EAAEE,oBAAoB,EAAE,GAAGC,kBAAAA,CAAmBjB,oBAAAA,CAAAA;IAEpD,MAAMkB,2BAAAA,GAA8BV,qBAAAA,CAAsBW,cAAc,CAACC,qBAAAA,CAAAA;AAEzE,IAAA,MAAMC,0BAA0BC,CAAAA,CAAQ,IAAA;QACtC,OAAO;eACFlB,SAAAA,CAAU7B,uBAAAA,CAAAA;AACV6B,YAAAA,GAAAA,SAAAA,CACDtB,uBAAAA,CAAwByC,GAAG,CAAC,CAACT,UAAY;oBAAE5C,OAAAA,EAAS4C,MAAAA;oBAAQ/C,UAAAA,EAAY;iBAA6B,CAAA,CAAA;AAExG,SAAA;IACH,CAAA,EAAG;AAACe,QAAAA,uBAAAA;AAAyBP,QAAAA,uBAAAA;AAAyB6B,QAAAA;AAAU,KAAA,CAAA;AAEhE,IAAA,MAAM,CAACoB,kBAAAA,EAAoBC,qBAAAA,CAAsB,GAAGC,EAAmB,EAAE,CAAA;AACzE,IAAA,MAAM,EAAEvC,IAAAA,EAAMwC,uBAAuB,EAAE,GAAGC,wBAAAA,EAA0B,GAAGtC,aAAAA,CAAc,IAAA;AACnFjB,QAAAA,aAAAA,CAAc,CAACwD,KAAAA,GAAAA;YACb,OAAO;AACL,gBAAA,GAAGA,KAAK;AACR/C,gBAAAA,uBAAAA,EAAyBgD,KAAAA,CAAMC,IAAI,CAAC,IAAIC,GAAAA,CAAI;AAAIH,oBAAAA,GAAAA,KAAAA,CAAM/C,uBAAuB;AAAK0C,oBAAAA,GAAAA;AAAmB,iBAAA,CAAA;AACvG,aAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;IAEA,MAAMS,2BAAAA,GAA6FX,EACjG,IAAM;AACJ,YAAA;gBACEY,KAAAA,EAAO,MAAA;gBACPC,QAAAA,EAAU,CAACC,2BAAeC,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA;wBAAWC,OAAAA,EAAQ;AAASvB,qBAAAA,EAAAA,oBAAAA,CAAqBoB,WAAWlE,OAAO,CAAA;AAChG,aAAA;AACA,YAAA;gBACEgE,KAAAA,EAAO,QAAA;gBACPC,QAAAA,EAAU,CAACC,2BACTC,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA;wBAAWC,OAAAA,EAAQ;AAASzE,qBAAAA,EAAAA,4BAAAA,CAA6BsE,WAAWrE,UAAU,CAAA;AAEnF;SACD,EACD;AAACiD,QAAAA;AAAqB,KAAA,CAAA;AAGxB,IAAA,MAAMwB,0BAA0BhD,CAAAA,CAAY,IAAA;AAC1CiC,QAAAA,qBAAAA,CAAsB,EAAE,CAAA;AACxBE,QAAAA,uBAAAA,EAAAA;IACF,CAAA,EAAG;AAACA,QAAAA;AAAwB,KAAA,CAAA;IAE5B,MAAMc,8BAAAA,GAAiCnB,EACrC,IAAM,CAACrD,OACLA,IAAAA,CAAKF,UAAU,KAAK,mBAAA,GAChB;gBACE2E,aAAAA,EAAe;oBACbC,IAAAA,EAAM,QAAA;oBACNC,OAAAA,EAAS,IAAA;AACPvE,wBAAAA,aAAAA,CAAc,CAACwD,KAAAA,GAAAA;4BACb,OAAO;AACL,gCAAA,GAAGA,KAAK;gCACR/C,uBAAAA,EAAyB+C,KAAAA,CAAM/C,uBAAuB,CAAC+B,MAAM,CAAC,CAACC,MAAAA,GAAWA,MAAAA,KAAW7C,IAAAA,CAAKC,OAAO;AACnG,6BAAA;AACF,wBAAA,CAAA,CAAA;AACF,oBAAA;AACF;AACF,aAAA,GACA,EAAC,EACP;AAACG,QAAAA;AAAc,KAAA,CAAA;AAGjB,IAAA,qBACEgE,EAAA,CAAA,aAAA,CAACQ,OAAAA,EAAAA;QAAQC,aAAAA,EAAc,QAAA;QAASC,GAAAA,EAAK;AAClCpE,KAAAA,EAAAA,OAAAA,kBACC0D,EAAA,CAAA,aAAA,CAACW,KAAAA,EAAAA;AACE,QAAA,GAAG3D,2BAA2B;QAC/B6C,KAAAA,EAAM,+CAAA;QACNe,iBAAAA,EAAkB,OAAA;QAClBC,OAAAA,EAAAA;qBAEAb,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA,IAAAA,EAAW,4JAAA,CAAA,CAAA,EAMf9D,kBAAAA,kBACC6D,EAAA,CAAA,aAAA,CAACc,eAAAA,EAAAA;QAAgBjB,KAAAA,EAAM;qBACrBG,EAAA,CAAA,aAAA,CAACW,KAAAA,EAAAA;AAAO,QAAA,GAAGpB,wBAAwB;QAAEM,KAAAA,EAAM,qBAAA;QAAsBe,iBAAAA,EAAkB;qBACjFZ,EAAA,CAAA,aAAA,CAACQ,OAAAA,EAAAA;QAAQC,aAAAA,EAAc,QAAA;QAASC,GAAAA,EAAK;qBACnCV,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA;QAAWc,KAAAA,EAAM,WAAA;QAAYb,OAAAA,EAAQ;AAAU,KAAA,EAAA,MAAA,CAAA,gBAGhDF,EAAA,CAAA,aAAA,CAACgB,YAAAA,EAAAA;AACE,QAAA,GAAG7C,qBAAqB;QACzBF,WAAAA,EAAaM,wBAAAA;QACbnB,KAAAA,EAAO+B,kBAAAA;QACP8B,QAAAA,EAAU7B,qBAAAA;AACV8B,QAAAA,WAAAA,EAAa/B,kBAAAA,CAAmBgC,MAAM,GAAG,CAAA,GAAIC,SAAAA,GAAY;wBAI/DpB,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA;QAAWC,OAAAA,EAAQ;OAAQ,6CAAA,EACkBrB,2BAAAA,EAA4B,yBAE1EmB,EAAA,CAAA,aAAA,CAACqB,UAAAA,EAAAA;QACCC,KAAAA,EAAOtC,uBAAAA;QACPuC,eAAAA,EAAiB5F,8BAAAA;QACjB6F,YAAAA,EAAc5B,2BAAAA;QACd6B,aAAAA,EAAc,qBAAA;QACdC,aAAAA,EAAenD,wBAAAA,CAAyB4C,MAAM,KAAK,CAAA;QACnDQ,QAAAA,EAAU,EAAErF,OAAAA,IAAWuB,cAAa,CAAA;QACpC+D,KAAAA,EAAOzB,uBAAAA;QACP0B,kBAAAA,EAAoBzB;uBAI1BJ,EAAA,CAAA,aAAA,CAACc,eAAAA,EAAAA;QAAgBjB,KAAAA,EAAM;AACpBxD,KAAAA,EAAAA,cAAAA,iBACC2D,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA;QAAWC,OAAAA,EAAQ;AAAQ,KAAA,EAAA,kCAAA,CAAA,iBAE5BF,EAAA,CAAA,aAAA,CAAC8B,MAAAA,EAAAA;QACCH,QAAAA,EAAU,CAACrF,WAAW,CAACsB,oBAAAA;QACvBmE,OAAAA,EAASvF,aAAAA;QACTyE,QAAAA,EAAUtE,yBAAAA;QACVqF,KAAAA,EAAM;uBAIZhC,EAAA,CAAA,aAAA,CAACc,eAAAA,EAAAA;QAAgBjB,KAAAA,EAAM;qBACrBG,EAAA,CAAA,aAAA,CAAC8B,MAAAA,EAAAA;QACCH,QAAAA,EAAU,CAACrF,WAAW,CAACwB,mBAAAA;QACvBiE,OAAAA,EAASrF,YAAAA;QACTuE,QAAAA,EAAU/D,wBAAAA;QACV8E,KAAAA,EAAM;;AAKhB,CAAA;AAEA,MAAMC,yBAAAA,GAA4B,CAACC,OAAAA,EAAmBC,KAAAA,GAAAA;IACpD,OAAO1C,KAAAA,CAAMC,IAAI,CAAC,IAAIC,IAAIuC,OAAAA,CAAAA,CAAAA,CAAUE,IAAI,CAAC,CAAC3D,MAAAA,GAAAA;QACxC,MAAM4D,IAAAA,GAAOF,MAAMG,IAAI,CAAC,CAACD,IAAAA,GAASA,IAAAA,CAAKxG,OAAO,KAAK4C,MAAAA,CAAAA;QACnD,OAAO4D,IAAAA,EAAME,YAAYH,IAAAA,CACvB,CAACI,aACCA,UAAAA,CAAWC,WAAW,KAAK,eAAA,KAC1BD,WAAWE,OAAO,CAAChE,QAAQ,CAAC,uBAAA,CAAA,IAA4B8D,WAAWE,OAAO,CAAChE,QAAQ,CAAC,GAAA,CAAG,CAAA,CAAA;AAE9F,IAAA,CAAA,CAAA;AACF,CAAA;MAEaiE,aAAAA,GAAgB,CAAC,EAAEC,MAAM,EAAEvG,cAAc,EAA+C,GAAA;IACnG,MAAM,EAAED,MAAM,EAAE,GAAGyG,OAAAA,EAAAA;IACnB,MAAMC,YAAAA,GAAe1G,MAAAA,CAAOwG,MAAAA,CAAOG,SAAS,CAAA;AAC5C,IAAA,MAAM,EAAE1F,IAAAA,EAAMC,wBAAwB,EAAE,GAAGC,QAAQ,eAAA,EAAiB,uBAAA,CAAA;AACpE,IAAA,MAAM,EAAEF,IAAAA,EAAMI,6BAA6B,EAAE,GAAGF,QAAQ,eAAA,EAAiB,+BAAA,CAAA;AACzE,IAAA,MAAM,EAAEF,IAAAA,EAAMG,8BAA8B,EAAE,GAAGD,QAAQ,eAAA,EAAiB,8BAAA,CAAA;AAE1E,IAAA,MAAM,EAAEF,IAAAA,EAAMK,4BAA4B,EAAE,GAAGH,QAAQ,aAAA,EAAe,8BAAA,CAAA;AAEtE,IAAA,MAAM,EAAEF,IAAAA,EAAMM,oBAAoB,EAAE,GAAGJ,QAAQ,yBAAA,EAA2B,KAAA,CAAA;AAE1E,IAAA,MAAMM,cAAAA,GAAiBP,wBAAAA;AACvB,IAAA,MAAMQ,mBAAAA,GAAsBL,6BAAAA;AAC5B,IAAA,MAAMG,uBACJ,CAACvB,cAAAA,KAAmBmB,8BAAAA,IAAmCE,gCAAgCoF,YAAY,CAAA;IAErG,MAAME,eAAAA,GAAkBJ,MAAAA,CAAOK,MAAM,KAAK,SAAA;AAE1C,IAAA,MAAMC,iBAAiB,CAACF,eAAAA,KAAoBnF,cAAAA,IAAkBC,uBAAuBF,oBAAmB,CAAA;AACxG,IAAA,MAAMzB,qBAAqB,CAAC6G,eAAAA;AAE5B,IAAA,MAAM,EAAEvG,uBAAuB,EAAEP,uBAAuB,EAAE,GAAG+C,CAAAA,CAAQ,IAAA;AACnE,QAAA,OAAO2D,MAAAA,CAAOT,KAAK,CAChB3D,MAAM,CAAC,CAAC6D,IAAAA,GAASA,IAAAA,CAAKxG,OAAO,KAAKkD,qBAAAA,CAAAA,CAClCoE,MAAM,CAIL,CAACC,GAAAA,EAAKf,IAAAA,GAAAA;AACJ,YAAA,MAAMgB,sBAAsB,IAAI1D,GAAAA,CAC9B0C,KAAKiB,OAAO,CAAC9E,MAAM,CAAC,CAAC+E,SAAWA,MAAAA,CAAOC,IAAI,KAAK,mBAAA,CAAA,CAAqBtE,GAAG,CAAC,CAACqE,MAAAA,GAAWA,OAAOC,IAAI,CAAA,CAAA;YAElG,KAAK,MAAM9H,cAAc2H,mBAAAA,CAAqB;gBAC5CD,GAAAA,CAAIlH,uBAAuB,CAACuH,IAAI,CAAC;AAAE5H,oBAAAA,OAAAA,EAASwG,KAAKxG,OAAO;AAAEH,oBAAAA;AAAW,iBAAA,CAAA;AACvE,YAAA;YAEA,MAAMgI,oBAAAA,GAAuBrB,IAAAA,CAAKiB,OAAO,CAAClB,IAAI,CAAC,CAACmB,MAAAA,GAAWA,MAAAA,CAAOC,IAAI,KAAK,mBAAA,CAAA;AAC3E,YAAA,IAAIE,oBAAAA,EAAsB;AACxBN,gBAAAA,GAAAA,CAAI3G,uBAAuB,CAACgH,IAAI,CAACpB,KAAKxG,OAAO,CAAA;AAC/C,YAAA;YAEA,OAAOuH,GAAAA;QACT,CAAA,EACA;AACE3G,YAAAA,uBAAAA,EAAyB,EAAE;AAC3BP,YAAAA,uBAAAA,EAAyB;AAC3B,SAAA,CAAA;IAEN,CAAA,EAAG;AAAC0G,QAAAA,MAAAA,CAAOT;AAAM,KAAA,CAAA;IAEjB,MAAMlG,WAAAA,GAAcgD,CAAAA,CAClB,KAAO;AACLzC,YAAAA,aAAAA,EAAeoG,OAAOe,YAAY;AAClClH,YAAAA,uBAAAA;AACAC,YAAAA,YAAAA,EAAckG,OAAOgB;AACvB,SAAA,CAAA,EACA;AAACnH,QAAAA,uBAAAA;AAAyBmG,QAAAA,MAAAA,CAAOgB,aAAa;AAAEhB,QAAAA,MAAAA,CAAOe;AAAa,KAAA,CAAA;IAGtE,MAAM,EAAE5H,UAAU,EAAEC,aAAa,EAAEM,OAAO,EAAEuH,gBAAgB,EAAE,GAAGC,YAAAA,CAAa;AAAE7H,QAAAA;AAAY,KAAA,CAAA;IAE5F,MAAM,EAAE8H,MAAM,EAAE,GAAGC,eAAAA,EAAAA;AAEnB,IAAA,MAAMC,sBAAAA,GAAyBC,CAAAA,EAAAA;IAE/B,MAAM,EACJpH,IAAAA,EAAMqH,uBAAuB,EAC7BC,KAAAA,EAAOC,wBAAwB,EAC/B,GAAGC,wBAAAA,EACJ,GAAGrH,aAAAA,CAAc,IAAA;AAChBgH,QAAAA,sBAAAA,CAAuBM,OAAO,EAAEC,OAAAA,EAAAA;AAChCP,QAAAA,sBAAAA,CAAuBM,OAAO,GAAGnD,SAAAA;AACnC,IAAA,CAAA,CAAA;AACA,IAAA,MAAMqD,6BAA6BtH,CAAAA,CAAY,IAAA;AAC7C8G,QAAAA,sBAAAA,CAAuBM,OAAO,EAAEG,MAAAA,EAAAA;AAChCT,QAAAA,sBAAAA,CAAuBM,OAAO,GAAGnD,SAAAA;AACjCiD,QAAAA,wBAAAA,EAAAA;IACF,CAAA,EAAG;AAACA,QAAAA;AAAyB,KAAA,CAAA;AAE7B,IAAA,MAAMlC,QAAQwC,QAAAA,CAAShH,oBAAAA,CAAAA;AAEvB,IAAA,MAAMiH,aAAazH,CAAAA,CAAY,UAAA;AAC7B,QAAA,MAAM0H,aAAAA,GAAsD;AAC1D9B,YAAAA,SAAAA,EAAWH,OAAOG;AACpB,SAAA;AAEA,QAAA,IAAI+B,YAAAA,GAAe,KAAA;QACnB,MAAMC,SAAAA,GAAY,CAChBC,GAAAA,EACA5H,KAAAA,GAAAA;YAEAyH,aAAa,CAACG,IAAI,GAAG5H,KAAAA;YACrB0H,YAAAA,GAAe,IAAA;AACjB,QAAA,CAAA;AAEA,QAAA,IAAI/I,UAAAA,CAAWS,aAAa,KAAKP,WAAAA,CAAYO,aAAa,EAAE;YAC1DuI,SAAAA,CAAU,cAAA,EAAgBhJ,WAAWS,aAAa,CAAA;AACpD,QAAA;AACA,QAAA,IAAIT,UAAAA,CAAWW,YAAY,KAAKT,WAAAA,CAAYS,YAAY,EAAE;YACxDqI,SAAAA,CAAU,eAAA,EAAiBhJ,WAAWW,YAAY,CAAA;AACpD,QAAA;AACA,QAAA,IAAI,CAACuI,sBAAAA,CAAuBlJ,UAAAA,CAAWU,uBAAuB,EAAER,WAAAA,CAAYQ,uBAAuB,CAAA,EAAG;AACpG,YAAA,IACEL,OAAOwG,MAAAA,CAAOG,SAAS,CAAA,IACvBZ,KAAAA,IACA,CAACF,yBAAAA,CACC;AAAIlG,gBAAAA,GAAAA,UAAAA,CAAWU,uBAAuB;AAAKP,gBAAAA,GAAAA,uBAAAA,CAAwBgD,GAAG,CAAC,CAACmD,IAAAA,GAASA,KAAKxG,OAAO;AAAE,aAAA,EAC/FsG,KAAAA,CAAAA,EAEF;AACAgC,gBAAAA,uBAAAA,EAAAA;gBACA,MAAM,IAAIe,OAAAA,CAAc,CAACV,OAAAA,EAASE,MAAAA,GAAAA;AAChCT,oBAAAA,sBAAAA,CAAuBM,OAAO,GAAG;AAAEC,wBAAAA,OAAAA;AAASE,wBAAAA;AAAO,qBAAA;AACrD,gBAAA,CAAA,CAAA;AACF,YAAA;YAEAK,SAAAA,CAAU,OAAA,EAAShJ,WAAWU,uBAAuB,CAAA;AACvD,QAAA;AAEA,QAAA,IAAIqI,YAAAA,EAAc;AAChB,YAAA,MAAMf,MAAAA,CAAOc,aAAAA,CAAAA;AACf,QAAA;IACF,CAAA,EAAG;AACD3I,QAAAA,uBAAAA;AACAE,QAAAA,MAAAA;AACAL,QAAAA,UAAAA,CAAWU,uBAAuB;AAClCV,QAAAA,UAAAA,CAAWW,YAAY;AACvBX,QAAAA,UAAAA,CAAWS,aAAa;AACxBoG,QAAAA,MAAAA,CAAOG,SAAS;AAChBgB,QAAAA,MAAAA;AACAI,QAAAA,uBAAAA;AACAlI,QAAAA,WAAAA,CAAYQ,uBAAuB;AACnCR,QAAAA,WAAAA,CAAYS,YAAY;AACxBT,QAAAA,WAAAA,CAAYO,aAAa;AACzB2F,QAAAA;AACD,KAAA,CAAA;IAED,MAAM,EAAEgD,kBAAkB,EAAE,GAAGC,mCAAAA,EAAAA;AAE/B,IAAA,qBACEpF,EAAA,CAAA,aAAA,CAACqF,iBAAAA,EAAAA;QACCxF,KAAAA,EAAM,mCAAA;QACNyF,MAAAA,EAAQpC,cAAAA;QACRqC,MAAAA,EAAQX,UAAAA;QACRO,kBAAAA,EAAoBA,kBAAAA;QACpB7I,OAAAA,EAASA,OAAAA;QACTkJ,UAAAA,EAAY3B;qBAEZ7D,EAAA,CAAA,aAAA,CAACW,KAAAA,EAAAA;AACE,QAAA,GAAG2D,wBAAwB;QAC5BF,KAAAA,EAAOK,0BAAAA;QACP5E,KAAAA,EAAM,0BAAA;QACNe,iBAAAA,EAAkB,QAAA;QAClBC,OAAAA,EAAAA;qBAEAb,EAAA,CAAA,aAAA,CAACC,UAAAA,EAAAA,IAAAA,EAAW,8KAKdD,EAAA,CAAA,aAAA,CAAClE,iBAAAA,EAAAA;QACCG,WAAAA,EAAaA,WAAAA;QACbF,UAAAA,EAAYA,UAAAA;QACZC,aAAAA,EAAeA,aAAAA;QACfE,uBAAAA,EAAyBA,uBAAAA;QACzBC,kBAAAA,EAAoBA,kBAAAA;QACpBC,MAAAA,EAAQ0G,YAAAA;QACRzG,cAAAA,EAAgBA;;AAIxB;;;;"}