jbrowse-plugin-protein3d 0.4.12 → 0.4.13
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/LaunchProteinView/components/LaunchSettingsDialog.d.ts +5 -0
- package/dist/LaunchProteinView/components/LaunchSettingsDialog.js +23 -0
- package/dist/LaunchProteinView/components/ProteinViewActions.js +13 -2
- package/dist/LaunchProteinView/utils/launchViewUtils.d.ts +2 -1
- package/dist/LaunchProteinView/utils/launchViewUtils.js +7 -2
- package/dist/LaunchProteinView/utils/sideBySide.d.ts +11 -0
- package/dist/LaunchProteinView/utils/sideBySide.js +33 -0
- package/dist/LaunchProteinViewExtensionPoint/index.js +9 -2
- package/dist/config.json +1 -1
- package/dist/jbrowse-plugin-protein3d.umd.production.min.js +15 -15
- package/dist/jbrowse-plugin-protein3d.umd.production.min.js.map +4 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/LaunchProteinView/components/LaunchSettingsDialog.tsx +63 -0
- package/src/LaunchProteinView/components/ProteinViewActions.tsx +21 -1
- package/src/LaunchProteinView/utils/launchViewUtils.ts +10 -1
- package/src/LaunchProteinView/utils/sideBySide.ts +55 -0
- package/src/LaunchProteinViewExtensionPoint/index.ts +17 -1
- package/src/version.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["global-externals:@jbrowse/core/Plugin", "global-externals:react", "global-externals:mobx-react", "global-externals:@jbrowse/core/util", "global-externals:tss-react/mui", "../src/ProteinView/loadMolstar.ts", "../src/ProteinView/util.ts", "../node_modules/.pnpm/g2p_mapper@2.1.5/node_modules/g2p_mapper/src/index.ts", "global-externals:mobx", "../src/mappings.ts", "../src/Protein1DViewRegistry/index.ts", "../src/LaunchProteinView/utils/util.ts", "global-externals:@jbrowse/core/pluggableElementTypes/AdapterType", "global-externals:@jbrowse/core/configuration", "global-externals:@jbrowse/core/data_adapters/BaseAdapter", "global-externals:@jbrowse/core/util/io", "global-externals:@jbrowse/core/util/rxjs", "../src/AlphaFoldConfidenceAdapter/AlphaFoldConfidenceAdapter.ts", "../src/AlphaMissensePathogenicityAdapter/AlphaMissensePathogenicityAdapter.ts", "global-externals:@mui/material/utils", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/utils/createSvgIcon.js", "global-externals:react/jsx-runtime", "global-externals:@jbrowse/core/ui", "global-externals:@mui/material", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/util.ts", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/pairwise.ts", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/index.ts", "../src/LaunchProteinView/components/proteinAssemblySetup.ts", "../src/LaunchProteinView/components/proteinTrackSetup.ts", "../src/LaunchProteinView/components/launchProteinAnnotationView.ts", "../src/LaunchProteinView/utils/launchViewUtils.ts", "../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.7/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js", "../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.7/node_modules/use-sync-external-store/shim/index.js", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/events.mjs", "../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/config-context-12s-CCVTDPOP.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/constants.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/types.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/index.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/index/index.mjs", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Help.js", "../src/LaunchProteinView/components/HelpDialog.tsx", "global-externals:@jbrowse/core/pluggableElementTypes", "global-externals:@jbrowse/core/util/types/mst", "global-externals:@jbrowse/mobx-state-tree", "../src/ProteinView/applyColorTheme.ts", "../src/ProteinView/applyLociInteractivity.ts", "../src/ProteinView/constants.ts", "../src/ProteinView/highlightResidueRange.ts", "../src/ProteinView/proteinToGenomeMapping.ts", "../src/ProteinView/residueTracks.ts", "../src/ProteinView/components/ManualAlignmentDialog.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Tune.js", "global-externals:@mui/material/Checkbox", "global-externals:@mui/material/IconButton", "global-externals:@mui/material/ListItemIcon", "global-externals:@mui/material/ListItemText", "global-externals:@mui/material/Menu", "global-externals:@mui/material/MenuItem", "global-externals:@mui/material/TextField", "global-externals:@mui/material/Tooltip", "../src/ProteinView/components/AddStructureDialog.tsx", "../src/ProteinView/components/HeaderStructureInfo.tsx", "../src/ProteinView/components/ProteinAlignmentHelpDialog.tsx", "../src/ProteinView/components/ProteinAlignmentHelpButton.tsx", "../src/ProteinView/hooks/useUniProtFeatures.ts", "../src/ProteinView/components/FeatureBar.tsx", "../src/ProteinView/components/FeatureTypeLabel.tsx", "../src/ProteinView/components/HoverMarker.tsx", "../src/ProteinView/components/ProteinFeatureTrack.tsx", "../src/ProteinView/components/ResidueValueTrack.tsx", "../src/ProteinView/components/SplitString.tsx", "../src/ProteinView/hooks/useProteinFeatureTrackData.ts", "../src/ProteinView/components/ProteinAlignment.tsx", "../src/ProteinView/components/ProteinViewHeader.tsx", "../src/ProteinView/css/molstar.ts", "../src/ProteinView/useProteinView.ts", "../src/ProteinView/components/ProteinView.tsx", "../src/UniProtVariationAdapter/UniProtVariationAdapter.ts", "../src/index.ts", "../src/AddHighlightModel/index.tsx", "../src/AddHighlightModel/HighlightComponents.tsx", "../src/AddHighlightModel/GenomeMouseoverHighlight.tsx", "../src/AddHighlightModel/Highlight.tsx", "../src/AddHighlightModel/util.ts", "../src/AddHighlightModel/GenomeTo1DProteinHoverHighlight.tsx", "../src/AddHighlightModel/Protein1DToGenomeHoverHighlight.tsx", "../src/AddHighlightModel/ProteinToGenomeHighlight.tsx", "../src/AddHighlightModel/ProteinToGenomeHighlightInner.tsx", "../src/AddHighlightModel/ProteinToMsaHoverSync.tsx", "../src/AddHighlightModel/msaRowMatch.ts", "../src/AlphaFoldConfidenceAdapter/index.ts", "../src/AlphaFoldConfidenceAdapter/configSchema.ts", "../src/AlphaMissensePathogenicityAdapter/index.ts", "../src/AlphaMissensePathogenicityAdapter/configSchema.ts", "../src/LaunchProteinView/index.ts", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Add.js", "../src/LaunchProteinView/components/LaunchProteinViewDialog.tsx", "../src/LaunchProteinView/components/AlphaFoldDBSearch.tsx", "../src/LaunchProteinView/components/AlphaFoldDBSearchStatus.tsx", "../src/LaunchProteinView/components/IsoformSequencesToggle.tsx", "../src/LaunchProteinView/components/MSATable.tsx", "../src/LaunchProteinView/components/Checkbox2.tsx", "../src/components/ExternalLink.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/OpenInNew.js", "../src/LaunchProteinView/components/IdentifierSelector.tsx", "../src/LaunchProteinView/components/ProteinViewActions.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/ArrowDropDown.js", "../src/LaunchProteinView/components/LaunchOptionsDialog.tsx", "../src/LaunchProteinView/components/SequenceMismatchNotice.tsx", "../src/LaunchProteinView/components/AlignmentSettingsButton.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Settings.js", "../src/ProteinView/types.ts", "../src/LaunchProteinView/utils/launchHelpers.ts", "../src/LaunchProteinView/components/SequenceSearchStatus.tsx", "../src/LaunchProteinView/components/TranscriptSelector.tsx", "../src/LaunchProteinView/components/UniProtIdInput.tsx", "../src/LaunchProteinView/components/UniProtResultsTable.tsx", "../src/LaunchProteinView/hooks/useAlphaFoldDBSearch.ts", "../src/LaunchProteinView/hooks/useStructureFileSequence.ts", "../src/LaunchProteinView/hooks/swrOptions.ts", "../src/ProteinView/structurePipeline.ts", "../src/ProteinView/addStructureFromData.ts", "../src/ProteinView/addStructureFromURL.ts", "../src/ProteinView/extractStructureSequences.ts", "../src/ProteinView/withTemporaryMolstarPlugin.ts", "../src/LaunchProteinView/hooks/useAlphaFoldData.ts", "../src/LaunchProteinView/hooks/useAlphaFoldSequenceSearch.ts", "../src/fetchUtils.ts", "../src/LaunchProteinView/utils/md5.ts", "../src/LaunchProteinView/hooks/useDebouncedValue.ts", "../src/LaunchProteinView/hooks/useIsoformProteinSequences.ts", "../src/LaunchProteinView/utils/calculateProteinSequence.ts", "../src/LaunchProteinView/hooks/useTranscriptSelection.ts", "../src/LaunchProteinView/hooks/useTranscriptIsoformSelection.ts", "../src/LaunchProteinView/hooks/useUniProtSearch.ts", "../src/LaunchProteinView/services/lookupMethods.ts", "../src/LaunchProteinView/utils/getSearchDescription.ts", "../src/LaunchProteinView/components/FoldseekSearch.tsx", "../src/LaunchProteinView/components/FoldseekDatabaseSelector.tsx", "../src/LaunchProteinView/services/foldseekApi.ts", "../src/LaunchProteinView/components/FoldseekResultsTable.tsx", "../src/LaunchProteinView/components/FoldseekActionMenu.tsx", "../src/LaunchProteinView/utils/caCoordsToPdb.ts", "../src/LaunchProteinView/hooks/useFoldseekSearch.ts", "../src/LaunchProteinView/components/HelpButton.tsx", "../src/LaunchProteinView/components/TabPanel.tsx", "../src/LaunchProteinView/components/UserProvidedStructure.tsx", "../src/LaunchProteinView/components/StructureSourcePicker.tsx", "../src/LaunchProteinView/hooks/useLocalStorage.ts", "../src/LaunchProteinViewExtensionPoint/resolveShortLaunch.ts", "../src/LaunchProteinViewExtensionPoint/index.ts", "../src/ProteinView/index.ts", "../src/ProteinView/model.ts", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Visibility.js", "../src/ProteinView/extractPerResidueConfidence.ts", "../src/ProteinView/loadStructureData.ts", "../src/ProteinView/structureLoader.ts", "../src/ProteinView/structureModel.ts", "../src/ProteinView/coordinates.ts", "../src/ProteinView/pairwiseAlignment.ts", "../src/ProteinView/proteinAbbreviationMapping.ts", "../src/ProteinView/subscribeMolstarInteraction.ts", "../src/ProteinView/superposeStructures.ts", "../src/UniProtVariationAdapter/index.ts", "../src/UniProtVariationAdapter/configSchema.ts", "../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/Plugin\"];", "module.exports = JBrowseExports[\"react\"];", "module.exports = JBrowseExports[\"mobx-react\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util\"];", "module.exports = JBrowseExports[\"tss-react/mui\"];", "\n var src = typeof document !== 'undefined'\n ? document.currentScript?.src\n : undefined;\n var base = src ? src.replace(/\\/[^/]*$/, '/') : '';\n var cached;\n export default function loadMolstar() {\n if (!cached) {\n cached = import(base + 'molstar-chunk.js').catch(function(e) {\n cached = undefined;\n throw e;\n });\n }\n return cached;\n }\n ", "import loadMolstar from './loadMolstar'\n\nimport type { Structure } from 'molstar/lib/mol-model/structure'\n\ninterface HoveredState {\n hoverPosition: {\n coord: number\n refName: string\n }\n}\n\nexport function checkHovered(hovered: unknown): hovered is HoveredState {\n return (\n !!hovered &&\n typeof hovered === 'object' &&\n 'hoverPosition' in hovered &&\n !!hovered.hoverPosition &&\n typeof hovered.hoverPosition === 'object' &&\n 'coord' in hovered.hoverPosition &&\n 'refName' in hovered.hoverPosition\n )\n}\n\nexport async function getMolstarStructureSelection({\n structure,\n selectedResidue,\n}: {\n structure: Structure\n selectedResidue: number\n}) {\n const { Script } = await loadMolstar()\n return Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.rel.eq([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n selectedResidue,\n ]),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n}\n\nexport function invertMap(arg: Record<number, number>): Record<number, number> {\n return Object.fromEntries(Object.entries(arg).map(([a, b]) => [b, +a]))\n}\n", "export interface Feat {\n refName: string\n start: number\n end: number\n type?: string\n strand?: number\n phase?: number\n subfeatures?: Feat[]\n}\n\nexport function genomeToTranscriptSeqMapping(feature: Feat) {\n const strand = feature.strand\n const refName = feature.refName\n\n if (strand !== -1 && strand !== 1) {\n throw new Error(`Invalid strand value: ${strand}. Expected 1 or -1.`)\n }\n if (!refName) {\n throw new Error('refName is required')\n }\n\n // GFF3 files can repeat CDS rows; dedupe on start/end, keeping the first.\n const uniqueCds = new Map<string, Feat>()\n for (const f of feature.subfeatures ?? []) {\n if (f.type === 'CDS' && f.start < f.end) {\n const key = `${f.start}-${f.end}`\n if (!uniqueCds.has(key)) {\n uniqueCds.set(key, f)\n }\n }\n }\n const cds = [...uniqueCds.values()].sort(\n (a, b) => strand * (a.start - b.start),\n )\n\n const g2p: Record<number, number> = {}\n const p2g: Record<number, number> = {}\n const p2gCodon: Record<number, number[]> = {}\n\n if (cds.length !== 0) {\n // Phase: number of bases at the start of the first CDS that complete a\n // codon begun outside this transcript. Per-segment phase is assumed\n // consistent with running the counter through all bases.\n const firstPhase = cds[0]?.phase ?? 0\n let proteinCounter = (3 - firstPhase) % 3\n let lastProteinPos = -1\n\n for (const f of cds) {\n const length = f.end - f.start\n for (let i = 0; i < length; i++) {\n const genomePos = strand === 1 ? f.start + i : f.end - 1 - i\n const proteinPos = Math.floor(proteinCounter++ / 3)\n g2p[genomePos] = proteinPos\n if (proteinPos !== lastProteinPos) {\n p2g[proteinPos] = genomePos\n p2gCodon[proteinPos] = [genomePos]\n lastProteinPos = proteinPos\n } else {\n p2gCodon[proteinPos]!.push(genomePos)\n }\n }\n }\n }\n\n return { g2p, p2g, p2gCodon, refName, strand }\n}\n\n/**\n * Genomic range [start, end) covering the codon at `proteinPos`.\n * On the reverse strand p2g stores the highest coordinate of the codon, so\n * the range extends from genomePos-2 to genomePos+1.\n *\n * Caveat: assumes the codon's three bases are contiguous in genome\n * coordinates. Codons that span an exon boundary, or split codons at the\n * start of a CDS (phase != 0), will produce a range that includes intronic\n * or out-of-CDS positions. Use `getCodonRanges` with `p2gCodon` to handle\n * those cases correctly.\n */\nexport function getCodonRange(\n p2g: Record<number, number>,\n proteinPos: number,\n strand: number,\n) {\n const genomePos = p2g[proteinPos]\n if (genomePos !== undefined) {\n if (strand === 1) {\n return [genomePos, genomePos + 3] as const\n } else {\n return [genomePos - 2, genomePos + 1] as const\n }\n }\n return undefined\n}\n\n/**\n * One or more genomic [start, end) ranges covering the codon at `proteinPos`,\n * derived from the full set of genomic positions in `p2gCodon`. Returns\n * multiple ranges when the codon spans an exon boundary. Ranges are sorted\n * ascending and use 0-based half-open coordinates regardless of strand.\n * Returns undefined if `proteinPos` is unknown.\n */\nexport function getCodonRanges(\n p2gCodon: Record<number, number[]>,\n proteinPos: number,\n) {\n const positions = p2gCodon[proteinPos]\n if (positions === undefined) {\n return undefined\n }\n const sorted = [...positions].sort((a, b) => a - b)\n const ranges: [number, number][] = []\n for (const pos of sorted) {\n const last = ranges.at(-1)\n if (last?.[1] === pos) {\n last[1] = pos + 1\n } else {\n ranges.push([pos, pos + 1])\n }\n }\n return ranges\n}\n", "module.exports = JBrowseExports[\"mobx\"];", "import { genomeToTranscriptSeqMapping as g2p } from 'g2p_mapper'\n\nimport type { Feature } from '@jbrowse/core/util'\nexport interface AlignmentRow {\n id: string\n seq: string\n}\nexport interface PairwiseAlignment {\n consensus: string\n alns: readonly [AlignmentRow, AlignmentRow]\n}\n\nexport function structureSeqVsTranscriptSeqMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n const structureSeq = pairwiseAlignment.alns[1].seq\n const transcriptSeq = pairwiseAlignment.alns[0].seq\n if (structureSeq.length !== transcriptSeq.length) {\n throw new Error('mismatched length')\n }\n\n let j = 0\n let k = 0\n const structureSeqToTranscriptSeqPosition: Record<number, number> = {}\n const transcriptSeqToStructureSeqPosition: Record<number, number> = {}\n\n for (let i = 0; i < structureSeq.length; i++) {\n const c1 = structureSeq[i]\n const c2 = transcriptSeq[i]\n\n if (c2 === '-') {\n j++\n } else if (c1 === '-') {\n k++\n } else {\n structureSeqToTranscriptSeqPosition[j] = k\n transcriptSeqToStructureSeqPosition[k] = j\n k++\n j++\n }\n }\n\n return {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n }\n}\n\nfunction seqPositionToAlignmentMap(seq: string) {\n const map: Record<number, number> = {}\n for (let i = 0, j = 0; i < seq.length; i++) {\n if (seq[i] !== '-') {\n map[j] = i\n j++\n }\n }\n return map\n}\n\nexport function structurePositionToAlignmentMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n return seqPositionToAlignmentMap(pairwiseAlignment.alns[1].seq)\n}\n\nexport function transcriptPositionToAlignmentMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n return seqPositionToAlignmentMap(pairwiseAlignment.alns[0].seq)\n}\n\n// see similar function in msaview plugin\nexport function genomeToTranscriptSeqMapping(feature: Feature) {\n return g2p(feature.toJSON())\n}\n", "import { SimpleFeature } from '@jbrowse/core/util'\nimport { getCodonRange } from 'g2p_mapper'\nimport { action, computed, makeObservable, observable } from 'mobx'\n\nimport { genomeToTranscriptSeqMapping } from '../mappings'\n\nimport type { SimpleFeatureSerialized } from '@jbrowse/core/util'\n\nexport interface Protein1DViewInfo {\n viewId: string\n connectedViewId: string\n feature: SimpleFeatureSerialized\n uniprotId: string\n}\n\ninterface GenomeToTranscriptMapping {\n p2g: Record<number, number>\n g2p: Record<number, number>\n strand: number\n refName: string\n}\n\ninterface SessionWithViews {\n views: { id: string }[]\n}\n\nclass Protein1DViewRegistry {\n views = observable.map<string, Protein1DViewInfo>()\n\n constructor() {\n makeObservable(this, {\n register: action,\n unregister: action,\n cleanupStaleViews: action,\n entries: computed,\n })\n }\n\n register(info: Protein1DViewInfo) {\n this.views.set(info.viewId, info)\n }\n\n unregister(viewId: string) {\n this.views.delete(viewId)\n }\n\n cleanupStaleViews(session: SessionWithViews) {\n const activeViewIds = new Set(session.views.map(v => v.id))\n for (const viewId of this.views.keys()) {\n if (!activeViewIds.has(viewId)) {\n this.views.delete(viewId)\n }\n }\n }\n\n get(viewId: string) {\n return this.views.get(viewId)\n }\n\n getByUniprotId(uniprotId: string, session?: SessionWithViews) {\n if (session) {\n this.cleanupStaleViews(session)\n }\n for (const info of this.views.values()) {\n if (info.uniprotId === uniprotId) {\n return info\n }\n }\n return undefined\n }\n\n get entries() {\n return [...this.views.values()]\n }\n\n getGenomeHighlightForProteinPosition(\n uniprotId: string,\n proteinPos: number,\n session?: SessionWithViews,\n ): { refName: string; start: number; end: number } | undefined {\n const info = this.getByUniprotId(uniprotId, session)\n if (!info) {\n return undefined\n }\n\n const feature = new SimpleFeature(info.feature)\n const mapping = genomeToTranscriptSeqMapping(feature) as\n | GenomeToTranscriptMapping\n | undefined\n if (!mapping) {\n return undefined\n }\n\n const { p2g, strand, refName } = mapping\n const result = getCodonRange(p2g, proteinPos, strand)\n if (!result) {\n return undefined\n }\n\n const [start, end] = result\n return { refName, start, end }\n }\n}\n\nexport const protein1DViewRegistry = new Protein1DViewRegistry()\n", "import type { Feature } from '@jbrowse/core/util'\n\nexport function stripStopCodon(seq: string) {\n return seq.replaceAll('*', '')\n}\n\nexport function getTranscriptFeatures(feature: Feature) {\n // check if we are looking at a 'two-level' or 'three-level' feature by\n // finding exon/CDS subfeatures. we want to select from transcript names\n const subfeatures = feature.get('subfeatures') ?? []\n\n // Check for mRNA/transcript subfeatures (three-level: gene \u2192 mRNA \u2192 CDS)\n const transcripts = subfeatures.filter(\n (f: Feature) => f.get('type') === 'mRNA' || f.get('type') === 'transcript',\n )\n if (transcripts.length > 0) {\n return transcripts\n }\n\n // Has direct CDS/exon children, treat feature itself as the transcript\n // (two-level: gene \u2192 CDS or mRNA \u2192 CDS)\n return [feature]\n}\n\nexport function stripTrailingVersion(s?: string) {\n return s?.replace(/\\.[^./]+$/, '')\n}\n\nexport function getId(val?: Feature): string {\n return val === undefined ? '' : val.id()\n}\n\nexport function getTranscriptDisplayName(val?: Feature): string {\n return val === undefined ? '' : (val.get('name') ?? val.get('id') ?? '')\n}\n\nexport function getGeneDisplayName(val?: Feature): string {\n return val === undefined\n ? ''\n : (val.get('gene_name') ?? val.get('name') ?? val.get('id') ?? '')\n}\n\nexport function getUniProtIdFromFeature(f?: Feature): string | undefined {\n if (!f) {\n return undefined\n }\n return f.get('uniprot') ?? f.get('uniprotId') ?? f.get('uniprotid')\n}\n\n// Ensembl ID patterns - covers human (ENS), mouse (ENSMUS), zebrafish (ENSDAR), etc.\nconst ensemblGenePattern = /^ENS[A-Z]*G\\d+/i\nconst ensemblTranscriptPattern = /^ENS[A-Z]*T\\d+/i\nconst ensemblProteinPattern = /^ENS[A-Z]*P\\d+/i\n\n// NCBI RefSeq ID patterns\nconst refSeqTranscriptPattern = /^[NX][MR]_\\d+/i\nconst refSeqProteinPattern = /^[NX]P_\\d+/i\n\n// CCDS pattern\nconst ccdsPattern = /^CCDS\\d+/i\n\n// HGNC pattern (HGNC:12345)\nconst hgncPattern = /^HGNC:\\d+/i\n\n/**\n * Check if an ID is a recognized database identifier that UniProt can map\n */\nexport function isRecognizedDatabaseId(id: string) {\n return (\n ensemblGenePattern.test(id) ||\n ensemblTranscriptPattern.test(id) ||\n ensemblProteinPattern.test(id) ||\n refSeqTranscriptPattern.test(id) ||\n refSeqProteinPattern.test(id) ||\n ccdsPattern.test(id) ||\n hgncPattern.test(id)\n )\n}\n\n/**\n * Get the database type for a recognized ID (used for UniProt xref queries)\n */\nexport function getDatabaseTypeForId(id: string): string | undefined {\n if (\n ensemblGenePattern.test(id) ||\n ensemblTranscriptPattern.test(id) ||\n ensemblProteinPattern.test(id)\n ) {\n return 'ensembl'\n }\n if (refSeqTranscriptPattern.test(id) || refSeqProteinPattern.test(id)) {\n return 'refseq'\n }\n if (ccdsPattern.test(id)) {\n return 'ccds'\n }\n if (hgncPattern.test(id)) {\n return 'hgnc'\n }\n return undefined\n}\n\n/**\n * Parse dbxref attribute which can have formats like:\n * - \"GeneID:1234,HGNC:HGNC:5678\"\n * - \"Dbxref=GeneID:1234\"\n * - Array of strings\n */\nfunction parseDbxref(dbxref: unknown): string[] {\n if (!dbxref) {\n return []\n }\n if (Array.isArray(dbxref)) {\n return dbxref.flatMap(item =>\n typeof item === 'string' ? item.split(',') : [],\n )\n }\n if (typeof dbxref === 'string') {\n return dbxref.split(',').map(s => s.trim())\n }\n return []\n}\n\n/**\n * Extract recognized database IDs from dbxref entries\n * Returns IDs without their database prefix where applicable\n */\nfunction extractIdsFromDbxref(dbxrefEntries: string[]): string[] {\n const ids: string[] = []\n for (const entry of dbxrefEntries) {\n // Handle formats like \"Ensembl:ENST00000123456\" or \"RefSeq:NM_001234\"\n const parts = entry.split(':')\n const lastPart = parts[parts.length - 1]\n if (lastPart && isRecognizedDatabaseId(lastPart)) {\n ids.push(lastPart)\n }\n // Also check if the whole entry is a recognized ID\n if (isRecognizedDatabaseId(entry)) {\n ids.push(entry)\n }\n // Handle HGNC format \"HGNC:HGNC:12345\" -> \"HGNC:12345\"\n if (entry.startsWith('HGNC:HGNC:')) {\n ids.push(entry.replace('HGNC:HGNC:', 'HGNC:'))\n } else if (entry.startsWith('HGNC:') && /^HGNC:\\d+$/.test(entry)) {\n ids.push(entry)\n }\n }\n return [...new Set(ids)]\n}\n\n// New helper function to extract recognized DB IDs\nexport function findRecognizedDbIds(f?: Feature): string[] {\n if (!f) {\n return []\n }\n\n const recognizedIds: string[] = []\n\n // Check various feature attributes for recognized IDs\n const attributesToCheck = [\n f.get('ID'),\n f.get('id'),\n f.get('name'),\n f.get('Name'),\n f.get('transcript_id'),\n f.get('protein_id'),\n f.get('protAcc'), // RefSeq protein accession\n f.get('mrnaAcc'), // RefSeq mRNA accession\n ]\n\n for (const attr of attributesToCheck) {\n if (typeof attr === 'string') {\n const stripped = attr.replace(/\\.[^./]+$/, '') // Strip version\n if (isRecognizedDatabaseId(stripped)) {\n recognizedIds.push(stripped)\n }\n }\n }\n\n // Handle HGNC attribute which may be just the number (e.g., \"10848\" instead of \"HGNC:10848\")\n const hgnc = f.get('hgnc') ?? f.get('HGNC')\n if (typeof hgnc === 'string' || typeof hgnc === 'number') {\n const hgncStr = String(hgnc)\n if (/^\\d+$/.test(hgncStr)) {\n recognizedIds.push(`HGNC:${hgncStr}`)\n } else if (hgncPattern.test(hgncStr)) {\n recognizedIds.push(hgncStr)\n }\n }\n\n // Parse dbxref for additional IDs\n const dbxref = f.get('Dbxref') ?? f.get('dbxref') ?? f.get('db_xref')\n const dbxrefIds = extractIdsFromDbxref(parseDbxref(dbxref))\n for (const id of dbxrefIds) {\n recognizedIds.push(id)\n }\n\n return [...new Set(recognizedIds)]\n}\n\nexport interface FeatureIdentifiers {\n recognizedIds: string[]\n uniprotId?: string\n geneId?: string\n geneName?: string\n}\n\n/**\n * Extract all useful identifiers from a feature for UniProt lookup.\n * If the feature is a gene, prioritizes identifiers from its first transcript.\n * Otherwise, extracts identifiers from the feature itself.\n * geneId and geneName are always extracted from the parent feature 'f'.\n */\nexport function extractFeatureIdentifiers(f?: Feature): FeatureIdentifiers {\n if (!f) {\n return { recognizedIds: [] }\n }\n\n let featureToProcess = f // Default to the parent feature\n\n // If the feature is a gene, try to get identifiers from its first transcript.\n if (f.get('type') === 'gene') {\n const transcripts = getTranscriptFeatures(f)\n if (transcripts.length > 0) {\n featureToProcess = transcripts[0]! // Prioritize the first transcript (length > 0 checked above)\n }\n // If no transcripts found, featureToProcess remains the parent gene 'f'.\n }\n\n // --- Extracting Recognized IDs and UniProt ID from featureToProcess ---\n const recognizedIds = findRecognizedDbIds(featureToProcess)\n\n // Handle UniProt ID from feature attributes (trust that it's valid if present)\n const uniprotIdAttr =\n featureToProcess.get('uniprot') ??\n featureToProcess.get('uniprotId') ??\n featureToProcess.get('uniprotid') ??\n featureToProcess.get('UniProt')\n const uniprotId =\n typeof uniprotIdAttr === 'string' && uniprotIdAttr.length > 0\n ? uniprotIdAttr\n : undefined\n\n // --- Get gene ID and name as fallbacks from the original parent feature 'f' ---\n // This assumes gene_id and gene_name are attributes of the parent gene, not the transcript.\n const geneId = f.get('gene_id') ?? f.get('ID')\n const geneName =\n f.get('gene_name') ?? f.get('gene') ?? f.get('name') ?? f.get('Name')\n\n return {\n recognizedIds: [...new Set(recognizedIds)], // Ensure unique IDs\n uniprotId,\n geneId: typeof geneId === 'string' ? geneId : undefined,\n geneName: typeof geneName === 'string' ? geneName : undefined,\n }\n}\n\nexport function selectBestTranscript({\n options,\n isoformSequences,\n structureSequence,\n}: {\n options: Feature[]\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n structureSequence: string | undefined\n}) {\n const exactMatch = options.find(\n f =>\n structureSequence &&\n stripStopCodon(isoformSequences[f.id()]?.seq ?? '') === structureSequence,\n )\n const longestWithData = options\n .filter(f => !!isoformSequences[f.id()])\n .toSorted(\n (a, b) =>\n isoformSequences[b.id()]!.seq.length -\n isoformSequences[a.id()]!.seq.length,\n )[0]\n return exactMatch ?? longestWithData\n}\n", "module.exports = JBrowseExports[\"@jbrowse/core/pluggableElementTypes/AdapterType\"];", "module.exports = JBrowseExports[\"@jbrowse/core/configuration\"];", "module.exports = JBrowseExports[\"@jbrowse/core/data_adapters/BaseAdapter\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/io\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/rxjs\"];", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2 } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\nexport default class AlphaFoldConfidenceAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats:\n | Promise<{ uniqueId: string; start: number; end: number; score: number }[]>\n | undefined\n\n private async loadDataP() {\n const scores = JSON.parse(\n await openLocation(this.getConf('location')).readFile('utf8'),\n ) as { residueNumber: number[]; confidenceScore: number[] }\n\n return scores.residueNumber.map((value, idx) => ({\n uniqueId: `feat-${idx}`,\n start: value,\n end: value + 1,\n score: scores.confidenceScore[idx]!,\n }))\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(new SimpleFeature({ ...f, refName }))\n }\n }\n observer.complete()\n })\n }\n\n public freeResources(): void {}\n}\n", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2, max, min } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\nexport interface AlphaMissenseRow {\n uniqueId: string\n start: number\n end: number\n score: number\n ref: string\n variant: string\n am_class: string\n}\n\n/**\n * Parses AlphaMissense CSV text (protein_variant,score,am_class). The\n * protein_variant column looks like \"V123L\": a ref AA, a 1-based residue\n * coordinate, and a variant AA. Rows that don't parse to a numeric coordinate\n * are skipped rather than emitted as bogus position-0 features.\n */\nexport function parseAlphaMissense(text: string): AlphaMissenseRow[] {\n return text\n .split('\\n')\n .slice(1)\n .map(f => f.trim())\n .filter(f => !!f)\n .flatMap((row, idx) => {\n const [protein_variant = '', score, am_class] = row.split(',')\n const ref = protein_variant[0]\n const variant = protein_variant.at(-1)\n const coord = +protein_variant.slice(1, -1)\n return ref !== undefined &&\n variant !== undefined &&\n !Number.isNaN(coord) &&\n score !== undefined &&\n am_class !== undefined\n ? [\n {\n uniqueId: `feat-${idx}`,\n ref,\n variant,\n start: coord,\n end: coord + 1,\n score: +score,\n am_class,\n },\n ]\n : []\n })\n}\n\nexport default class AlphaMissensePathogenicityAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats: Promise<AlphaMissenseRow[]> | undefined\n\n private async loadDataP() {\n const scores = await openLocation(this.getConf('location')).readFile('utf8')\n return parseAlphaMissense(scores)\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getGlobalStats(_opts?: BaseOptions) {\n const data = await this.loadData()\n const scores = data.map(s => s.score)\n return { scoreMin: min(scores), scoreMax: max(scores) }\n }\n\n // always render bigwig instead of calculating a feature density for it\n async getMultiRegionFeatureDensityStats(_regions: Region[]) {\n return { featureDensity: 0 }\n }\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(\n new SimpleFeature({\n ...f,\n refName,\n source: f.variant,\n }),\n )\n }\n }\n observer.complete()\n })\n }\n\n public async getSources() {\n const sources = new Set<string>()\n const data = await this.loadData()\n for (const f of data) {\n sources.add(f.variant)\n }\n return [...sources].map(s => ({\n name: s,\n __name: s,\n }))\n }\n\n public freeResources(): void {}\n}\n", "module.exports = JBrowseExports[\"@mui/material/utils\"];", "'use client';\n\nexport { createSvgIcon as default } from '@mui/material/utils';", "module.exports = JBrowseExports[\"react/jsx-runtime\"];", "module.exports = JBrowseExports[\"@jbrowse/core/ui\"];", "module.exports = JBrowseExports[\"@mui/material\"];", "export function parseVersion(line: string) {\n const res = /\\(?(\\d+(\\.\\d+)+)\\)?/.exec(line)\n return res && res.length > 1 ? res[1] : ''\n}\nexport function parseHeader(info: string) {\n const knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign']\n\n if (!knownHeaders.some(l => info.startsWith(l))) {\n console.warn(\n `${info} is not a known CLUSTAL header: ${knownHeaders.join(\n ',',\n )}, proceeding but could indicate an issue`,\n )\n }\n const version = parseVersion(info)\n return { info, version }\n}\n\nexport function getFirstNonEmptyLine(arr: Iterator<string>): string {\n // There should be two blank lines after the header line\n let line = arr.next()\n while (!line.done && line.value.trim() === '') {\n line = arr.next()\n }\n return line.value!\n}\n\nexport function getSeqBounds(line: string) {\n const fields = line.split(/\\s+/)\n const temp = line.slice(fields[0]!.length)\n const s = fields[0]!.length + temp.indexOf(fields[1]!)\n const e = s + fields[1]!.length\n return [s, e] as const\n}\n\n// Use the first block to get the sequence identifiers\nexport function parseBlock(arr: Iterator<string>) {\n let line = getFirstNonEmptyLine(arr)\n const block = []\n let consensusLine = ''\n if (!line) {\n return undefined\n }\n\n while (line) {\n if (line.startsWith(' ')) {\n consensusLine = line\n } else {\n block.push(line)\n }\n line = arr.next().value\n }\n const [start, end] = getSeqBounds(block[0]!)\n const fields = block.map(s => s.split(/\\s+/))\n const ids = fields.map(s => s[0]!)\n const seqs = block.map(s => s.slice(start, end))\n let consensus = consensusLine.slice(start, end)\n\n // handle if the consensus trailing whitespace got trimmed\n const remainder = seqs[0]!.length - consensus.length\n if (remainder) {\n consensus += ' '.repeat(remainder)\n }\n return {\n ids,\n seqs,\n consensus,\n }\n}\n\nexport function parseBlocks(arr: Iterator<string>) {\n let block\n const res = parseBlock(arr)\n if (res !== undefined) {\n while ((block = parseBlock(arr))) {\n for (let i = 0; i < block.seqs.length; i++) {\n res.seqs[i] += block.seqs[i]!\n }\n res.consensus += block.consensus\n }\n }\n return res\n}\n", "import { getFirstNonEmptyLine } from './util.ts'\n\nfunction isRulerLine(line: string) {\n const trimmed = line.trim()\n if (!trimmed) {\n return false\n }\n const fields = trimmed.split(/\\s+/)\n return fields.every(f => /^\\d+$/.test(f))\n}\n\nfunction isSequenceLine(line: string) {\n const trimmed = line.trim()\n return /^\\w+\\s+/.test(trimmed) && !isRulerLine(line)\n}\n\nfunction hasPositionNumbers(fields: string[]) {\n return fields.length >= 3 && /^\\d+$/.test(fields[1]!)\n}\n\nfunction getSeqBounds(line: string, seqIndex: number) {\n const trimmed = line.trim()\n const fields = trimmed.split(/\\s+/)\n const seq = fields[seqIndex]!\n const seqStart = line.indexOf(\n seq,\n line.indexOf(fields[0]!) + fields[0]!.length,\n )\n return [seqStart, seqStart + seq.length] as const\n}\n\n// Use the first block to get the sequence identifiers\nexport function parsePairwiseBlock(arr: Iterator<string>) {\n let line = getFirstNonEmptyLine(arr)\n const block: string[] = []\n let consensusLine = ''\n if (!line) {\n return undefined\n }\n\n while (line) {\n if (isRulerLine(line)) {\n // skip position ruler lines\n } else if (isSequenceLine(line)) {\n block.push(line)\n } else {\n consensusLine = line\n }\n line = arr.next().value\n }\n\n if (block.length === 0) {\n return undefined\n }\n\n const fields = block.map(s => s.trim().split(/\\s+/))\n const firstField = fields[0]\n if (!firstField) {\n return undefined\n }\n const seqIndex = hasPositionNumbers(firstField) ? 2 : 1\n const [start, end] = getSeqBounds(block[0]!, seqIndex)\n const ids = fields.map(s => s[0]!)\n const seqs = fields.map(s => s[seqIndex]!)\n let consensus = consensusLine.slice(start, end)\n\n // handle if the consensus trailing whitespace got trimmed\n const firstSeq = seqs[0]\n if (firstSeq) {\n const remainder = firstSeq.length - consensus.length\n if (remainder > 0) {\n consensus += ' '.repeat(remainder)\n }\n }\n return {\n ids,\n seqs,\n consensus,\n }\n}\n\nexport function parsePairwiseBlocks(arr: Iterator<string>) {\n let block\n const res = parsePairwiseBlock(arr)\n if (res !== undefined) {\n while ((block = parsePairwiseBlock(arr))) {\n for (let i = 0; i < block.seqs.length; i++) {\n res.seqs[i] += block.seqs[i]!\n }\n res.consensus += block.consensus\n }\n }\n return res\n}\n", "import { parsePairwiseBlocks } from './pairwise.ts'\nimport { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util.ts'\n\nexport function parseClustalIter(arr: Iterator<string>) {\n const line = getFirstNonEmptyLine(arr)\n if (!line) {\n throw new Error('Empty file received')\n }\n const header = parseHeader(line)\n\n const res = parseBlocks(arr)\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n if (consensus.length !== alns[0]!.seq.length) {\n throw new Error(\n `Consensus length != sequence length. Con ${consensus.length} seq ${alns[0]!.seq.length}`,\n )\n }\n\n return { consensus, alns, header }\n}\n\nexport interface Row {\n id: string\n seq: string\n}\n\nexport function parse(contents: string) {\n const iter = contents.split('\\n')[Symbol.iterator]()\n return parseClustalIter(iter)\n}\n\nexport function parsePairwise(contents: string) {\n const filtered = contents\n .split('\\n')\n .filter(f => !f.startsWith('#'))\n .join('\\n')\n\n const res = parsePairwiseBlocks(filtered.split('\\n')[Symbol.iterator]())\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n const firstAln = alns[0]\n if (!firstAln) {\n throw new Error('No alignments found')\n }\n if (consensus.length !== firstAln.seq.length) {\n throw new Error(\n `Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`,\n )\n }\n if (alns.length !== 2) {\n throw new Error(\n `Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`,\n )\n }\n return {\n consensus,\n alns: alns as [Row, Row],\n }\n}\n", "import type { SessionWithAddTracks } from '@jbrowse/core/util'\n\n/**\n * Sets up a temporary assembly for a protein sequence from UniProt\n */\nexport function setupProteinAssembly(\n session: SessionWithAddTracks,\n uniprotId: string,\n) {\n session.addTemporaryAssembly?.({\n name: uniprotId,\n sequence: {\n type: 'ReferenceSequenceTrack',\n trackId: `${uniprotId}-ReferenceSequenceTrack`,\n sequenceType: 'pep',\n adapter: {\n type: 'UnindexedFastaAdapter',\n rewriteRefNames: \"jexl:split(refName,'|')[1]\",\n fastaLocation: {\n uri: `https://rest.uniprot.org/uniprotkb/${uniprotId}.fasta`,\n },\n },\n },\n })\n}\n", "import type { SessionWithAddTracks } from '@jbrowse/core/util'\n\n/**\n * Fetches UniProt GFF data and extracts unique feature types\n */\nexport async function fetchUniProtFeatureTypes(\n uniprotId: string,\n): Promise<string[]> {\n const url = `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff`\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} fetching ${url}`)\n }\n const data = await res.text()\n\n return [\n ...new Set(\n data\n .split('\\n')\n .filter(f => !f.startsWith('#'))\n .map(f => f.trim())\n .filter(f => !!f)\n .map(f => f.split('\\t')[2]!),\n ),\n ]\n}\n\n/**\n * Adds UniProt feature tracks for each feature type\n */\nexport function addUniProtFeatureTracks({\n session,\n uniprotId,\n featureTypes,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n featureTypes: string[]\n}) {\n featureTypes.forEach(type => {\n const trackId = `${uniprotId}-${type}`\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId,\n name: type,\n adapter: {\n type: 'Gff3Adapter',\n gffLocation: {\n uri: `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff`,\n },\n },\n assemblyNames: [uniprotId],\n displays: [\n {\n displayId: `${trackId}-LinearBasicDisplay`,\n type: 'LinearBasicDisplay',\n jexlFilters: [`get(feature,'type')=='${type}'`],\n },\n ],\n })\n })\n}\n\n/**\n * Adds antigen annotation track from EBI\n */\nexport function addAntigenTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId: `${uniprotId}-Antigen`,\n name: 'Antigen',\n adapter: {\n type: 'Gff3Adapter',\n gffLocation: {\n uri: `https://www.ebi.ac.uk/proteins/api/antigen/${uniprotId}?format=gff`,\n },\n },\n assemblyNames: [uniprotId],\n })\n}\n\n/**\n * Adds variation track from EBI\n */\nexport function addVariationTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId: `${uniprotId}-Variation`,\n name: 'Variation',\n adapter: {\n type: 'UniProtVariationAdapter',\n location: {\n uri: `https://www.ebi.ac.uk/proteins/api/variation/${uniprotId}.json`,\n },\n },\n assemblyNames: [uniprotId],\n })\n}\n\n/**\n * Adds AlphaFold confidence track\n */\nexport function addAlphaFoldConfidenceTrack({\n session,\n uniprotId,\n confidenceUrl,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n confidenceUrl: string | undefined\n}) {\n if (confidenceUrl) {\n session.addTrackConf({\n type: 'QuantitativeTrack',\n trackId: `${uniprotId}-AlphaFold-confidence`,\n name: 'AlphaFold confidence',\n adapter: {\n type: 'AlphaFoldConfidenceAdapter',\n location: {\n uri: confidenceUrl,\n },\n },\n assemblyNames: [uniprotId],\n })\n }\n}\n\n/**\n * Adds AlphaMissense pathogenicity scores track\n */\nexport function addAlphaMissenseTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'MultiQuantitativeTrack',\n trackId: `${uniprotId}-AlphaMissense-scores`,\n name: 'AlphaMissense scores',\n assemblyNames: [uniprotId],\n adapter: {\n type: 'AlphaMissensePathogenicityAdapter',\n location: {\n uri: `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-aa-substitutions.csv`,\n },\n },\n displays: [\n {\n type: 'MultiLinearWiggleDisplay',\n displayId: `${uniprotId}-AlphaMissense-scores-MultiLinearWiggleDisplay`,\n defaultRendering: 'multirowdensity',\n renderers: {\n MultiDensityRenderer: {\n type: 'MultiDensityRenderer',\n bicolorPivotValue: 0.5,\n posColor: 'red',\n negColor: 'blue',\n },\n },\n },\n ],\n })\n}\n\n/**\n * Adds all protein annotation tracks for a given UniProt ID\n */\nexport async function addAllProteinTracks({\n session,\n uniprotId,\n confidenceUrl,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n confidenceUrl: string | undefined\n}) {\n const featureTypes = await fetchUniProtFeatureTypes(uniprotId)\n addUniProtFeatureTracks({\n session,\n uniprotId,\n featureTypes,\n })\n addAntigenTrack({\n session,\n uniprotId,\n })\n addVariationTrack({\n session,\n uniprotId,\n })\n addAlphaFoldConfidenceTrack({\n session,\n uniprotId,\n confidenceUrl,\n })\n addAlphaMissenseTrack({\n session,\n uniprotId,\n })\n}\n", "import { setupProteinAssembly } from './proteinAssemblySetup'\nimport { addAllProteinTracks } from './proteinTrackSetup'\nimport { protein1DViewRegistry } from '../../Protein1DViewRegistry'\nimport { formatViewName } from '../utils/launchViewUtils'\n\nimport type { Feature, SessionWithAddTracks } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport async function launchProteinAnnotationView({\n session,\n feature,\n selectedTranscript,\n uniprotId,\n confidenceUrl,\n connectedViewId,\n}: {\n session: SessionWithAddTracks\n feature: Feature\n selectedTranscript?: Feature\n uniprotId: string\n confidenceUrl?: string\n connectedViewId?: string\n}) {\n setupProteinAssembly(session, uniprotId)\n\n await addAllProteinTracks({\n session,\n uniprotId,\n confidenceUrl,\n })\n\n const view = session.addView('LinearGenomeView', {\n type: 'LinearGenomeView',\n displayName: formatViewName(\n 'Protein view',\n feature,\n selectedTranscript,\n uniprotId,\n ),\n }) as LinearGenomeViewModel\n\n // Register for linked highlighting between 1D and 3D views\n if (connectedViewId && selectedTranscript) {\n protein1DViewRegistry.register({\n viewId: view.id,\n connectedViewId,\n feature: selectedTranscript.toJSON(),\n uniprotId,\n })\n }\n\n await view.navToLocString(uniprotId, uniprotId)\n}\n", "import { isSessionWithAddTracks } from '@jbrowse/core/util'\n\ndeclare global {\n interface Window {\n JBrowsePluginMsaView?: unknown\n }\n}\n\nimport { getGeneDisplayName, getTranscriptDisplayName } from './util'\nimport { launchProteinAnnotationView } from '../components/launchProteinAnnotationView'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport const ALPHAFOLD_VERSION = 'v6'\n\nexport function getAlphaFoldStructureUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-model_${version}.cif`\n}\n\nexport function getAlphaFoldConfidenceUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-confidence_${version}.json`\n}\n\nexport function getAlphaFoldMsaUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/msa/AF-${uniprotId}-F1-msa_${version}.a3m`\n}\n\nexport function getPdbStructureUrl(pdbId: string) {\n return `https://files.rcsb.org/download/${pdbId}.cif`\n}\n\n// Foldseek targets may contain a description after the ID separated by a\n// space, e.g. \"AF-P16442-F1-model_v6 Histo-blood group ABO transferase\".\nfunction extractTargetId(target: string) {\n return target.split(' ')[0]!\n}\n\nexport function getUniprotIdFromAlphaFoldTarget(target: string) {\n // Handles both \"AF-P16442-F1-model_v6\" and full URLs like\n // \"https://alphafold.ebi.ac.uk/files/AF-P16442-F1-model_v6.cif\"\n const match = /AF-([A-Z0-9]+)-F\\d+/.exec(extractTargetId(target))\n return match?.[1]\n}\n\nexport function getStructureUrlFromTarget(target: string, db: string) {\n const targetId = extractTargetId(target)\n if (targetId.startsWith('AF-')) {\n return `https://alphafold.ebi.ac.uk/files/${targetId}.cif`\n }\n if (db === 'pdb100') {\n const pdbId = targetId.split('_')[0]!\n if (pdbId.length === 4) {\n return getPdbStructureUrl(pdbId)\n }\n }\n return undefined\n}\n\nexport function getConfidenceUrlFromTarget(target: string) {\n const targetId = extractTargetId(target)\n if (targetId.startsWith('AF-')) {\n const confidenceId = targetId.replace('-model_', '-confidence_')\n return `https://alphafold.ebi.ac.uk/files/${confidenceId}.json`\n }\n return undefined\n}\n\ninterface LaunchViewParams {\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n uniprotId?: string\n}\n\nexport function formatViewName(\n prefix: string,\n feature: Feature,\n selectedTranscript?: Feature,\n uniprotId?: string,\n) {\n return [\n ...new Set([\n prefix,\n uniprotId,\n getGeneDisplayName(feature),\n getTranscriptDisplayName(selectedTranscript),\n ]),\n ]\n .filter(s => !!s)\n .join(' - ')\n}\n\nexport function launch3DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n url,\n data,\n userProvidedTranscriptSequence,\n alignmentAlgorithm,\n displayName,\n connectedMsaViewId,\n}: LaunchViewParams & {\n url?: string\n data?: string\n userProvidedTranscriptSequence?: string\n alignmentAlgorithm?: string\n displayName?: string\n connectedMsaViewId?: string\n}) {\n const snap = {\n type: 'ProteinView',\n alignmentAlgorithm,\n connectedMsaViewId,\n structures: [\n {\n url,\n data,\n userProvidedTranscriptSequence: userProvidedTranscriptSequence ?? '',\n feature: selectedTranscript?.toJSON(),\n connectedViewId: view.id,\n },\n ],\n displayName:\n displayName ??\n formatViewName('Protein view', feature, selectedTranscript, uniprotId),\n }\n return session.addView('ProteinView', snap)\n}\n\nexport async function launch1DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n confidenceUrl,\n}: LaunchViewParams & {\n confidenceUrl?: string\n}) {\n if (!uniprotId || !isSessionWithAddTracks(session)) {\n return\n }\n await launchProteinAnnotationView({\n session,\n selectedTranscript,\n feature,\n uniprotId,\n confidenceUrl,\n connectedViewId: view.id,\n })\n}\n\n// CROSS-REPO DEPENDENCY: the 'MsaView' view type is registered by\n// jbrowse-plugin-msaview, which wraps the `react-msaview` library. The `init`\n// keys below (msaUrl, colorSchemeName) and the connected* props are a runtime\n// contract with that plugin's model \u2014 they are NOT type-checked here because we\n// only depend on it at runtime (gated by hasMsaViewPlugin()). If react-msaview\n// renames these, the launch silently degrades. Keep in step with that repo.\nexport function launchMsaView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n displayName,\n}: LaunchViewParams & { displayName?: string }) {\n if (!uniprotId) {\n return undefined\n }\n return session.addView('MsaView', {\n type: 'MsaView',\n displayName:\n displayName ??\n formatViewName('MSA view', feature, selectedTranscript, uniprotId),\n connectedViewId: view.id,\n connectedFeature: selectedTranscript?.toJSON(),\n init: {\n msaUrl: getAlphaFoldMsaUrl(uniprotId),\n colorSchemeName: 'percent_identity',\n },\n })\n}\n\nexport function hasMsaViewPlugin() {\n return window.JBrowsePluginMsaView !== undefined\n}\n\nexport function launch3DProteinViewWithMsa(\n params: LaunchViewParams & {\n url?: string\n data?: string\n userProvidedTranscriptSequence?: string\n alignmentAlgorithm?: string\n displayName?: string\n },\n) {\n const { uniprotId } = params\n if (!uniprotId) {\n return undefined\n }\n const msaView = launchMsaView(params)\n return launch3DProteinView({\n ...params,\n connectedMsaViewId: msaView?.id,\n })\n}\n", "/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n", "const FOCUS_EVENT = 0;\nconst RECONNECT_EVENT = 1;\nconst MUTATE_EVENT = 2;\nconst ERROR_REVALIDATE_EVENT = 3;\n\nexport { ERROR_REVALIDATE_EVENT, FOCUS_EVENT, MUTATE_EVENT, RECONNECT_EVENT };\n", "var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n", "'use client';\nimport React, { useEffect, useLayoutEffect, createContext, useContext, useMemo, useRef, createElement } from 'react';\nimport * as revalidateEvents from './events.mjs';\nimport { dequal } from 'dequal/lite';\n\n// Global state used to deduplicate requests and store listeners\nconst SWRGlobalState = new WeakMap();\n\n// Shared state between server components and client components\nconst noop = ()=>{};\n// Using noop() as the undefined value as undefined can be replaced\n// by something else. Prettier ignore and extra parentheses are necessary here\n// to ensure that tsc doesn't remove the __NOINLINE__ comment.\n// prettier-ignore\nconst UNDEFINED = /*#__NOINLINE__*/ noop();\nconst OBJECT = Object;\nconst isUndefined = (v)=>v === UNDEFINED;\nconst isFunction = (v)=>typeof v == 'function';\nconst mergeObjects = (a, b)=>({\n ...a,\n ...b\n });\nconst isPromiseLike = (x)=>isFunction(x.then);\n\nconst EMPTY_CACHE = {};\nconst INITIAL_CACHE = {};\nconst STR_UNDEFINED = 'undefined';\n// NOTE: Use the function to guarantee it's re-evaluated between jsdom and node runtime for tests.\nconst isWindowDefined = typeof window != STR_UNDEFINED;\nconst isDocumentDefined = typeof document != STR_UNDEFINED;\nconst isLegacyDeno = isWindowDefined && 'Deno' in window;\nconst hasRequestAnimationFrame = ()=>isWindowDefined && typeof window['requestAnimationFrame'] != STR_UNDEFINED;\nconst createCacheHelper = (cache, key)=>{\n const state = SWRGlobalState.get(cache);\n return [\n // Getter\n ()=>!isUndefined(key) && cache.get(key) || EMPTY_CACHE,\n // Setter\n (info)=>{\n if (!isUndefined(key)) {\n const prev = cache.get(key);\n // Before writing to the store, we keep the value in the initial cache\n // if it's not there yet.\n if (!(key in INITIAL_CACHE)) {\n INITIAL_CACHE[key] = prev;\n }\n state[5](key, mergeObjects(prev, info), prev || EMPTY_CACHE);\n }\n },\n // Subscriber\n state[6],\n // Get server cache snapshot\n ()=>{\n if (!isUndefined(key)) {\n // If the cache was updated on the client, we return the stored initial value.\n if (key in INITIAL_CACHE) return INITIAL_CACHE[key];\n }\n // If we haven't done any client-side updates, we return the current value.\n return !isUndefined(key) && cache.get(key) || EMPTY_CACHE;\n }\n ];\n} // export { UNDEFINED, OBJECT, isUndefined, isFunction, mergeObjects, isPromiseLike }\n;\n\n/**\n * Due to the bug https://bugs.chromium.org/p/chromium/issues/detail?id=678075,\n * it's not reliable to detect if the browser is currently online or offline\n * based on `navigator.onLine`.\n * As a workaround, we always assume it's online on the first load, and change\n * the status upon `online` or `offline` events.\n */ let online = true;\nconst isOnline = ()=>online;\n// For node and React Native, `add/removeEventListener` doesn't exist on window.\nconst [onWindowEvent, offWindowEvent] = isWindowDefined && window.addEventListener ? [\n window.addEventListener.bind(window),\n window.removeEventListener.bind(window)\n] : [\n noop,\n noop\n];\nconst isVisible = ()=>{\n const visibilityState = isDocumentDefined && document.visibilityState;\n return isUndefined(visibilityState) || visibilityState !== 'hidden';\n};\nconst initFocus = (callback)=>{\n // focus revalidate\n if (isDocumentDefined) {\n document.addEventListener('visibilitychange', callback);\n }\n onWindowEvent('focus', callback);\n return ()=>{\n if (isDocumentDefined) {\n document.removeEventListener('visibilitychange', callback);\n }\n offWindowEvent('focus', callback);\n };\n};\nconst initReconnect = (callback)=>{\n // revalidate on reconnected\n const onOnline = ()=>{\n online = true;\n callback();\n };\n // nothing to revalidate, just update the status\n const onOffline = ()=>{\n online = false;\n };\n onWindowEvent('online', onOnline);\n onWindowEvent('offline', onOffline);\n return ()=>{\n offWindowEvent('online', onOnline);\n offWindowEvent('offline', onOffline);\n };\n};\nconst preset = {\n isOnline,\n isVisible\n};\nconst defaultConfigOptions = {\n initFocus,\n initReconnect\n};\n\nconst IS_REACT_LEGACY = !React.useId;\nconst IS_SERVER = !isWindowDefined || isLegacyDeno;\n// Polyfill requestAnimationFrame\nconst rAF = (f)=>hasRequestAnimationFrame() ? window['requestAnimationFrame'](f) : setTimeout(f, 1);\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser.\nconst useIsomorphicLayoutEffect = IS_SERVER ? useEffect : useLayoutEffect;\n// This assignment is to extend the Navigator type to use effectiveType.\nconst navigatorConnection = typeof navigator !== 'undefined' && navigator.connection;\n// Adjust the config based on slow connection status (<= 70Kbps).\nconst slowConnection = !IS_SERVER && navigatorConnection && ([\n 'slow-2g',\n '2g'\n].includes(navigatorConnection.effectiveType) || navigatorConnection.saveData);\n\n// use WeakMap to store the object->key mapping\n// so the objects can be garbage collected.\n// WeakMap uses a hashtable under the hood, so the lookup\n// complexity is almost O(1).\nconst table = new WeakMap();\nconst getTypeName = (value)=>OBJECT.prototype.toString.call(value);\nconst isObjectTypeName = (typeName, type)=>typeName === `[object ${type}]`;\n// counter of the key\nlet counter = 0;\n// A stable hash implementation that supports:\n// - Fast and ensures unique hash properties\n// - Handles unserializable values\n// - Handles object key ordering\n// - Generates short results\n//\n// This is not a serialization function, and the result is not guaranteed to be\n// parsable.\nconst stableHash = (arg)=>{\n const type = typeof arg;\n const typeName = getTypeName(arg);\n const isDate = isObjectTypeName(typeName, 'Date');\n const isRegex = isObjectTypeName(typeName, 'RegExp');\n const isPlainObject = isObjectTypeName(typeName, 'Object');\n let result;\n let index;\n if (OBJECT(arg) === arg && !isDate && !isRegex) {\n // Object/function, not null/date/regexp. Use WeakMap to store the id first.\n // If it's already hashed, directly return the result.\n result = table.get(arg);\n if (result) return result;\n // Store the hash first for circular reference detection before entering the\n // recursive `stableHash` calls.\n // For other objects like set and map, we use this id directly as the hash.\n result = ++counter + '~';\n table.set(arg, result);\n if (Array.isArray(arg)) {\n // Array.\n result = '@';\n for(index = 0; index < arg.length; index++){\n result += stableHash(arg[index]) + ',';\n }\n table.set(arg, result);\n }\n if (isPlainObject) {\n // Object, sort keys.\n result = '#';\n const keys = OBJECT.keys(arg).sort();\n while(!isUndefined(index = keys.pop())){\n if (!isUndefined(arg[index])) {\n result += index + ':' + stableHash(arg[index]) + ',';\n }\n }\n table.set(arg, result);\n }\n } else {\n result = isDate ? arg.toJSON() : type == 'symbol' ? arg.toString() : type == 'string' ? JSON.stringify(arg) : '' + arg;\n }\n return result;\n};\n\nconst serialize = (key)=>{\n if (isFunction(key)) {\n try {\n key = key();\n } catch (err) {\n // dependencies not ready\n key = '';\n }\n }\n // Use the original key as the argument of fetcher. This can be a string or an\n // array of values.\n const args = key;\n // If key is not falsy, or not an empty array, hash it.\n key = typeof key == 'string' ? key : (Array.isArray(key) ? key.length : key) ? stableHash(key) : '';\n return [\n key,\n args\n ];\n};\n\n// Global timestamp.\nlet __timestamp = 0;\nconst getTimestamp = ()=>++__timestamp;\n\nasync function internalMutate(...args) {\n const [cache, _key, _data, _opts] = args;\n // When passing as a boolean, it's explicitly used to disable/enable\n // revalidation.\n const options = mergeObjects({\n populateCache: true,\n throwOnError: true\n }, typeof _opts === 'boolean' ? {\n revalidate: _opts\n } : _opts || {});\n let populateCache = options.populateCache;\n const rollbackOnErrorOption = options.rollbackOnError;\n let optimisticData = options.optimisticData;\n const rollbackOnError = (error)=>{\n return typeof rollbackOnErrorOption === 'function' ? rollbackOnErrorOption(error) : rollbackOnErrorOption !== false;\n };\n const throwOnError = options.throwOnError;\n // If the second argument is a key filter, return the mutation results for all\n // filtered keys.\n if (isFunction(_key)) {\n const keyFilter = _key;\n const matchedKeys = [];\n const it = cache.keys();\n for (const key of it){\n if (// Skip the special useSWRInfinite and useSWRSubscription keys.\n !/^\\$(inf|sub)\\$/.test(key) && keyFilter(cache.get(key)._k)) {\n matchedKeys.push(key);\n }\n }\n return Promise.all(matchedKeys.map(mutateByKey));\n }\n return mutateByKey(_key);\n async function mutateByKey(_k) {\n // Serialize key\n const [key] = serialize(_k);\n if (!key) return;\n const [get, set] = createCacheHelper(cache, key);\n const [EVENT_REVALIDATORS, MUTATION, FETCH, PRELOAD] = SWRGlobalState.get(cache);\n const startRevalidate = ()=>{\n const revalidators = EVENT_REVALIDATORS[key];\n const revalidate = isFunction(options.revalidate) ? options.revalidate(get().data, _k) : options.revalidate !== false;\n if (revalidate) {\n // Invalidate the key by deleting the concurrent request markers so new\n // requests will not be deduped.\n delete FETCH[key];\n delete PRELOAD[key];\n if (revalidators && revalidators[0]) {\n return revalidators[0](revalidateEvents.MUTATE_EVENT).then(()=>get().data);\n }\n }\n return get().data;\n };\n // If there is no new data provided, revalidate the key with current state.\n if (args.length < 3) {\n // Revalidate and broadcast state.\n return startRevalidate();\n }\n let data = _data;\n let error;\n let isError = false;\n // Update global timestamps.\n const beforeMutationTs = getTimestamp();\n MUTATION[key] = [\n beforeMutationTs,\n 0\n ];\n const hasOptimisticData = !isUndefined(optimisticData);\n const state = get();\n // `displayedData` is the current value on screen. It could be the optimistic value\n // that is going to be overridden by a `committedData`, or get reverted back.\n // `committedData` is the validated value that comes from a fetch or mutation.\n const displayedData = state.data;\n const currentData = state._c;\n const committedData = isUndefined(currentData) ? displayedData : currentData;\n // Do optimistic data update.\n if (hasOptimisticData) {\n optimisticData = isFunction(optimisticData) ? optimisticData(committedData, displayedData) : optimisticData;\n // When we set optimistic data, backup the current committedData data in `_c`.\n set({\n data: optimisticData,\n _c: committedData\n });\n }\n if (isFunction(data)) {\n // `data` is a function, call it passing current cache value.\n try {\n data = data(committedData);\n } catch (err) {\n // If it throws an error synchronously, we shouldn't update the cache.\n error = err;\n isError = true;\n }\n }\n // `data` is a promise/thenable, resolve the final data first.\n if (data && isPromiseLike(data)) {\n // This means that the mutation is async, we need to check timestamps to\n // avoid race conditions.\n data = await data.catch((err)=>{\n error = err;\n isError = true;\n });\n // Check if other mutations have occurred since we've started this mutation.\n // If there's a race we don't update cache or broadcast the change,\n // just return the data.\n if (beforeMutationTs !== MUTATION[key][0]) {\n if (isError) throw error;\n return data;\n } else if (isError && hasOptimisticData && rollbackOnError(error)) {\n // Rollback. Always populate the cache in this case but without\n // transforming the data.\n populateCache = true;\n // Reset data to be the latest committed data, and clear the `_c` value.\n set({\n data: committedData,\n _c: UNDEFINED\n });\n }\n }\n // If we should write back the cache after request.\n if (populateCache) {\n if (!isError) {\n // Transform the result into data.\n if (isFunction(populateCache)) {\n const populateCachedData = populateCache(data, committedData);\n set({\n data: populateCachedData,\n error: UNDEFINED,\n _c: UNDEFINED\n });\n } else {\n // Only update cached data and reset the error if there's no error. Data can be `undefined` here.\n set({\n data,\n error: UNDEFINED,\n _c: UNDEFINED\n });\n }\n }\n }\n // Reset the timestamp to mark the mutation has ended.\n MUTATION[key][1] = getTimestamp();\n // Update existing SWR Hooks' internal states:\n Promise.resolve(startRevalidate()).then(()=>{\n // The mutation and revalidation are ended, we can clear it since the data is\n // not an optimistic value anymore.\n set({\n _c: UNDEFINED\n });\n });\n // Throw error or return data\n if (isError) {\n if (throwOnError) throw error;\n return;\n }\n return data;\n }\n}\n\nconst revalidateAllKeys = (revalidators, type)=>{\n for(const key in revalidators){\n if (revalidators[key][0]) revalidators[key][0](type);\n }\n};\nconst initCache = (provider, options)=>{\n // The global state for a specific provider will be used to deduplicate\n // requests and store listeners. As well as a mutate function that is bound to\n // the cache.\n // The provider's global state might be already initialized. Let's try to get the\n // global state associated with the provider first.\n if (!SWRGlobalState.has(provider)) {\n const opts = mergeObjects(defaultConfigOptions, options);\n // If there's no global state bound to the provider, create a new one with the\n // new mutate function.\n const EVENT_REVALIDATORS = Object.create(null);\n const mutate = internalMutate.bind(UNDEFINED, provider);\n let unmount = noop;\n const subscriptions = Object.create(null);\n const subscribe = (key, callback)=>{\n const subs = subscriptions[key] || [];\n subscriptions[key] = subs;\n subs.push(callback);\n return ()=>subs.splice(subs.indexOf(callback), 1);\n };\n const setter = (key, value, prev)=>{\n provider.set(key, value);\n const subs = subscriptions[key];\n if (subs) {\n for (const fn of subs){\n fn(value, prev);\n }\n }\n };\n const initProvider = ()=>{\n if (!SWRGlobalState.has(provider)) {\n // Update the state if it's new, or if the provider has been extended.\n SWRGlobalState.set(provider, [\n EVENT_REVALIDATORS,\n Object.create(null),\n Object.create(null),\n Object.create(null),\n mutate,\n setter,\n subscribe\n ]);\n if (!IS_SERVER) {\n // When listening to the native events for auto revalidations,\n // we intentionally put a delay (setTimeout) here to make sure they are\n // fired after immediate JavaScript executions, which can be\n // React's state updates.\n // This avoids some unnecessary revalidations such as\n // https://github.com/vercel/swr/issues/1680.\n const releaseFocus = opts.initFocus(setTimeout.bind(UNDEFINED, revalidateAllKeys.bind(UNDEFINED, EVENT_REVALIDATORS, revalidateEvents.FOCUS_EVENT)));\n const releaseReconnect = opts.initReconnect(setTimeout.bind(UNDEFINED, revalidateAllKeys.bind(UNDEFINED, EVENT_REVALIDATORS, revalidateEvents.RECONNECT_EVENT)));\n unmount = ()=>{\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n releaseFocus && releaseFocus();\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n releaseReconnect && releaseReconnect();\n // When un-mounting, we need to remove the cache provider from the state\n // storage too because it's a side-effect. Otherwise, when re-mounting we\n // will not re-register those event listeners.\n SWRGlobalState.delete(provider);\n };\n }\n }\n };\n initProvider();\n // This is a new provider, we need to initialize it and setup DOM events\n // listeners for `focus` and `reconnect` actions.\n // We might want to inject an extra layer on top of `provider` in the future,\n // such as key serialization, auto GC, etc.\n // For now, it's just a `Map` interface without any modifications.\n return [\n provider,\n mutate,\n initProvider,\n unmount\n ];\n }\n return [\n provider,\n SWRGlobalState.get(provider)[4]\n ];\n};\n\n// error retry\nconst onErrorRetry = (_, __, config, revalidate, opts)=>{\n const maxRetryCount = config.errorRetryCount;\n const currentRetryCount = opts.retryCount;\n // Exponential backoff\n const timeout = ~~((Math.random() + 0.5) * (1 << (currentRetryCount < 8 ? currentRetryCount : 8))) * config.errorRetryInterval;\n if (!isUndefined(maxRetryCount) && currentRetryCount > maxRetryCount) {\n return;\n }\n setTimeout(revalidate, timeout, opts);\n};\nconst compare = dequal;\n// Default cache provider\nconst [cache, mutate] = initCache(new Map());\n// Default config\nconst defaultConfig = mergeObjects({\n // events\n onLoadingSlow: noop,\n onSuccess: noop,\n onError: noop,\n onErrorRetry,\n onDiscarded: noop,\n // switches\n revalidateOnFocus: true,\n revalidateOnReconnect: true,\n revalidateIfStale: true,\n shouldRetryOnError: true,\n // timeouts\n errorRetryInterval: slowConnection ? 10000 : 5000,\n focusThrottleInterval: 5 * 1000,\n dedupingInterval: 2 * 1000,\n loadingTimeout: slowConnection ? 5000 : 3000,\n // providers\n compare,\n isPaused: ()=>false,\n cache,\n mutate,\n fallback: {}\n}, // use web preset by default\npreset);\n\nconst mergeConfigs = (a, b)=>{\n // Need to create a new object to avoid mutating the original here.\n const v = mergeObjects(a, b);\n // If two configs are provided, merge their `use` and `fallback` options.\n if (b) {\n const { use: u1, fallback: f1 } = a;\n const { use: u2, fallback: f2 } = b;\n if (u1 && u2) {\n v.use = u1.concat(u2);\n }\n if (f1 && f2) {\n v.fallback = mergeObjects(f1, f2);\n }\n }\n return v;\n};\n\nconst SWRConfigContext = createContext({});\nconst SWRConfig = (props)=>{\n const { value } = props;\n const parentConfig = useContext(SWRConfigContext);\n const isFunctionalConfig = isFunction(value);\n const config = useMemo(()=>isFunctionalConfig ? value(parentConfig) : value, [\n isFunctionalConfig,\n parentConfig,\n value\n ]);\n // Extend parent context values and middleware.\n const extendedConfig = useMemo(()=>isFunctionalConfig ? config : mergeConfigs(parentConfig, config), [\n isFunctionalConfig,\n parentConfig,\n config\n ]);\n // Should not use the inherited provider.\n const provider = config && config.provider;\n // initialize the cache only on first access.\n const cacheContextRef = useRef(UNDEFINED);\n if (provider && !cacheContextRef.current) {\n cacheContextRef.current = initCache(provider(extendedConfig.cache || cache), config);\n }\n const cacheContext = cacheContextRef.current;\n // Override the cache if a new provider is given.\n if (cacheContext) {\n extendedConfig.cache = cacheContext[0];\n extendedConfig.mutate = cacheContext[1];\n }\n // Unsubscribe events.\n useIsomorphicLayoutEffect(()=>{\n if (cacheContext) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n cacheContext[2] && cacheContext[2]();\n return cacheContext[3];\n }\n }, []);\n return createElement(SWRConfigContext.Provider, mergeObjects(props, {\n value: extendedConfig\n }));\n};\n\nexport { noop as A, isPromiseLike as B, IS_SERVER as I, OBJECT as O, SWRConfigContext as S, UNDEFINED as U, isFunction as a, SWRGlobalState as b, cache as c, defaultConfig as d, isUndefined as e, mergeConfigs as f, SWRConfig as g, initCache as h, isWindowDefined as i, mutate as j, compare as k, stableHash as l, mergeObjects as m, internalMutate as n, getTimestamp as o, preset as p, defaultConfigOptions as q, IS_REACT_LEGACY as r, serialize as s, rAF as t, useIsomorphicLayoutEffect as u, slowConnection as v, isDocumentDefined as w, isLegacyDeno as x, hasRequestAnimationFrame as y, createCacheHelper as z };\n", "const INFINITE_PREFIX = '$inf$';\n\nexport { INFINITE_PREFIX };\n", "\n", "import { i as isWindowDefined, a as isFunction, S as SWRConfigContext, m as mergeObjects, d as defaultConfig, s as serialize, b as SWRGlobalState, c as cache, e as isUndefined, I as IS_SERVER, f as mergeConfigs } from './config-context-12s-CCVTDPOP.mjs';\nexport { r as IS_REACT_LEGACY, O as OBJECT, g as SWRConfig, U as UNDEFINED, k as compare, z as createCacheHelper, q as defaultConfigOptions, o as getTimestamp, y as hasRequestAnimationFrame, h as initCache, n as internalMutate, w as isDocumentDefined, x as isLegacyDeno, B as isPromiseLike, j as mutate, A as noop, p as preset, t as rAF, v as slowConnection, l as stableHash, u as useIsomorphicLayoutEffect } from './config-context-12s-CCVTDPOP.mjs';\nimport * as revalidateEvents from './events.mjs';\nexport { revalidateEvents };\nimport { INFINITE_PREFIX } from './constants.mjs';\nexport { INFINITE_PREFIX } from './constants.mjs';\nimport React, { useContext, useMemo } from 'react';\nexport * from './types.mjs';\n\n// @ts-expect-error\nconst enableDevtools = isWindowDefined && window.__SWR_DEVTOOLS_USE__;\nconst use = enableDevtools ? window.__SWR_DEVTOOLS_USE__ : [];\nconst setupDevTools = ()=>{\n if (enableDevtools) {\n // @ts-expect-error\n window.__SWR_DEVTOOLS_REACT__ = React;\n }\n};\n\nconst normalize = (args)=>{\n return isFunction(args[1]) ? [\n args[0],\n args[1],\n args[2] || {}\n ] : [\n args[0],\n null,\n (args[1] === null ? args[2] : args[1]) || {}\n ];\n};\n\nconst useSWRConfig = ()=>{\n const parentConfig = useContext(SWRConfigContext);\n const mergedConfig = useMemo(()=>mergeObjects(defaultConfig, parentConfig), [\n parentConfig\n ]);\n return mergedConfig;\n};\n\nconst preload = (key_, fetcher)=>{\n // preload should be a no-op on the server\n if (IS_SERVER) {\n return undefined;\n }\n const [key, fnArg] = serialize(key_);\n const [, , , PRELOAD] = SWRGlobalState.get(cache);\n // Prevent preload to be called multiple times before used.\n if (PRELOAD[key]) return PRELOAD[key];\n const req = fetcher(fnArg);\n PRELOAD[key] = req;\n return req;\n};\nconst middleware = (useSWRNext)=>(key_, fetcher_, config)=>{\n // fetcher might be a sync function, so this should not be an async function\n const fetcher = fetcher_ && ((...args)=>{\n const [key] = serialize(key_);\n const [, , , PRELOAD] = SWRGlobalState.get(cache);\n if (key.startsWith(INFINITE_PREFIX)) {\n // we want the infinite fetcher to be called.\n // handling of the PRELOAD cache happens there.\n return fetcher_(...args);\n }\n const req = PRELOAD[key];\n if (isUndefined(req)) return fetcher_(...args);\n delete PRELOAD[key];\n return req;\n });\n return useSWRNext(key_, fetcher, config);\n };\n\nconst BUILT_IN_MIDDLEWARE = use.concat(middleware);\n\n// It's tricky to pass generic types as parameters, so we just directly override\n// the types here.\nconst withArgs = (hook)=>{\n return function useSWRArgs(...args) {\n // Get the default and inherited configuration.\n const fallbackConfig = useSWRConfig();\n // Normalize arguments.\n const [key, fn, _config] = normalize(args);\n // Merge configurations.\n const config = mergeConfigs(fallbackConfig, _config);\n // Apply middleware\n let next = hook;\n const { use } = config;\n const middleware = (use || []).concat(BUILT_IN_MIDDLEWARE);\n for(let i = middleware.length; i--;){\n next = middleware[i](next);\n }\n return next(key, fn || config.fetcher || null, config);\n };\n};\n\n// Add a callback function to a list of keyed callback functions and return\n// the unsubscribe function.\nconst subscribeCallback = (key, callbacks, callback)=>{\n const keyedRevalidators = callbacks[key] || (callbacks[key] = []);\n keyedRevalidators.push(callback);\n return ()=>{\n const index = keyedRevalidators.indexOf(callback);\n if (index >= 0) {\n // O(1): faster than splice\n keyedRevalidators[index] = keyedRevalidators[keyedRevalidators.length - 1];\n keyedRevalidators.pop();\n }\n };\n};\n\n// Create a custom hook with a middleware\nconst withMiddleware = (useSWR, middleware)=>{\n return (...args)=>{\n const [key, fn, config] = normalize(args);\n const uses = (config.use || []).concat(middleware);\n return useSWR(key, fn, {\n ...config,\n use: uses\n });\n };\n};\n\nsetupDevTools();\n\nexport { IS_SERVER, SWRGlobalState, cache, defaultConfig, isFunction, isUndefined, isWindowDefined, mergeConfigs, mergeObjects, normalize, preload, serialize, subscribeCallback, useSWRConfig, withArgs, withMiddleware };\n", "import React, { useRef, useMemo, useCallback, useDebugValue } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { UNDEFINED as UNDEFINED$1, OBJECT as OBJECT$1, SWRConfig as SWRConfig$1, defaultConfig, withArgs, SWRGlobalState, serialize as serialize$1, createCacheHelper, isUndefined as isUndefined$1, isPromiseLike, IS_SERVER, noop as noop$1, getTimestamp, isFunction as isFunction$1, revalidateEvents, internalMutate, useIsomorphicLayoutEffect, subscribeCallback, rAF, IS_REACT_LEGACY, mergeObjects } from '../_internal/index.mjs';\nexport { mutate, preload, useSWRConfig } from '../_internal/index.mjs';\n\n// Shared state between server components and client components\nconst noop = ()=>{};\n// Using noop() as the undefined value as undefined can be replaced\n// by something else. Prettier ignore and extra parentheses are necessary here\n// to ensure that tsc doesn't remove the __NOINLINE__ comment.\n// prettier-ignore\nconst UNDEFINED = /*#__NOINLINE__*/ noop();\nconst OBJECT = Object;\nconst isUndefined = (v)=>v === UNDEFINED;\nconst isFunction = (v)=>typeof v == 'function';\n\n// use WeakMap to store the object->key mapping\n// so the objects can be garbage collected.\n// WeakMap uses a hashtable under the hood, so the lookup\n// complexity is almost O(1).\nconst table = new WeakMap();\nconst getTypeName = (value)=>OBJECT.prototype.toString.call(value);\nconst isObjectTypeName = (typeName, type)=>typeName === `[object ${type}]`;\n// counter of the key\nlet counter = 0;\n// A stable hash implementation that supports:\n// - Fast and ensures unique hash properties\n// - Handles unserializable values\n// - Handles object key ordering\n// - Generates short results\n//\n// This is not a serialization function, and the result is not guaranteed to be\n// parsable.\nconst stableHash = (arg)=>{\n const type = typeof arg;\n const typeName = getTypeName(arg);\n const isDate = isObjectTypeName(typeName, 'Date');\n const isRegex = isObjectTypeName(typeName, 'RegExp');\n const isPlainObject = isObjectTypeName(typeName, 'Object');\n let result;\n let index;\n if (OBJECT(arg) === arg && !isDate && !isRegex) {\n // Object/function, not null/date/regexp. Use WeakMap to store the id first.\n // If it's already hashed, directly return the result.\n result = table.get(arg);\n if (result) return result;\n // Store the hash first for circular reference detection before entering the\n // recursive `stableHash` calls.\n // For other objects like set and map, we use this id directly as the hash.\n result = ++counter + '~';\n table.set(arg, result);\n if (Array.isArray(arg)) {\n // Array.\n result = '@';\n for(index = 0; index < arg.length; index++){\n result += stableHash(arg[index]) + ',';\n }\n table.set(arg, result);\n }\n if (isPlainObject) {\n // Object, sort keys.\n result = '#';\n const keys = OBJECT.keys(arg).sort();\n while(!isUndefined(index = keys.pop())){\n if (!isUndefined(arg[index])) {\n result += index + ':' + stableHash(arg[index]) + ',';\n }\n }\n table.set(arg, result);\n }\n } else {\n result = isDate ? arg.toJSON() : type == 'symbol' ? arg.toString() : type == 'string' ? JSON.stringify(arg) : '' + arg;\n }\n return result;\n};\n\nconst serialize = (key)=>{\n if (isFunction(key)) {\n try {\n key = key();\n } catch (err) {\n // dependencies not ready\n key = '';\n }\n }\n // Use the original key as the argument of fetcher. This can be a string or an\n // array of values.\n const args = key;\n // If key is not falsy, or not an empty array, hash it.\n key = typeof key == 'string' ? key : (Array.isArray(key) ? key.length : key) ? stableHash(key) : '';\n return [\n key,\n args\n ];\n};\n\nconst unstable_serialize = (key)=>serialize(key)[0];\n\n/// <reference types=\"react/experimental\" />\nconst use = React.use || // This extra generic is to avoid TypeScript mixing up the generic and JSX sytax\n// and emitting an error.\n// We assume that this is only for the `use(thenable)` case, not `use(context)`.\n// https://github.com/facebook/react/blob/aed00dacfb79d17c53218404c52b1c7aa59c4a89/packages/react-server/src/ReactFizzThenable.js#L45\n((thenable)=>{\n switch(thenable.status){\n case 'pending':\n throw thenable;\n case 'fulfilled':\n return thenable.value;\n case 'rejected':\n throw thenable.reason;\n default:\n thenable.status = 'pending';\n thenable.then((v)=>{\n thenable.status = 'fulfilled';\n thenable.value = v;\n }, (e)=>{\n thenable.status = 'rejected';\n thenable.reason = e;\n });\n throw thenable;\n }\n});\nconst WITH_DEDUPE = {\n dedupe: true\n};\nconst resolvedUndef = Promise.resolve(UNDEFINED$1);\nconst sub = ()=>noop$1;\n/**\n * The core implementation of the useSWR hook.\n *\n * This is the main handler function that implements all SWR functionality including\n * data fetching, caching, revalidation, error handling, and state management.\n * It manages the complete lifecycle of SWR requests from initialization through\n * cleanup.\n *\n * Key responsibilities:\n * - Key serialization and normalization\n * - Cache state management and synchronization\n * - Automatic and manual revalidation\n * - Error handling and retry logic\n * - Suspense integration\n * - Loading state management\n * - Effect cleanup and memory management\n *\n * @template Data - The type of data returned by the fetcher\n * @template Error - The type of error that can be thrown\n *\n * @param _key - The SWR key (string, array, object, function, or falsy)\n * @param fetcher - The fetcher function to retrieve data, or null to disable fetching\n * @param config - Complete SWR configuration object with both public and internal options\n *\n * @returns SWRResponse object containing data, error, mutate function, and loading states\n *\n * @internal This is the internal implementation. Use `useSWR` instead.\n */ const useSWRHandler = (_key, fetcher, config)=>{\n const { cache, compare, suspense, fallbackData, revalidateOnMount, revalidateIfStale, refreshInterval, refreshWhenHidden, refreshWhenOffline, keepPreviousData, strictServerPrefetchWarning } = config;\n const [EVENT_REVALIDATORS, MUTATION, FETCH, PRELOAD] = SWRGlobalState.get(cache);\n // `key` is the identifier of the SWR internal state,\n // `fnArg` is the argument/arguments parsed from the key, which will be passed\n // to the fetcher.\n // All of them are derived from `_key`.\n const [key, fnArg] = serialize$1(_key);\n // If it's the initial render of this hook.\n const initialMountedRef = useRef(false);\n // If the hook is unmounted already. This will be used to prevent some effects\n // to be called after unmounting.\n const unmountedRef = useRef(false);\n // Refs to keep the key and config.\n const keyRef = useRef(key);\n const fetcherRef = useRef(fetcher);\n const configRef = useRef(config);\n const getConfig = ()=>configRef.current;\n const isActive = ()=>getConfig().isVisible() && getConfig().isOnline();\n const [getCache, setCache, subscribeCache, getInitialCache] = createCacheHelper(cache, key);\n const stateDependencies = useRef({}).current;\n // Resolve the fallback data from either the inline option, or the global provider.\n // If it's a promise, we simply let React suspend and resolve it for us.\n const fallback = isUndefined$1(fallbackData) ? isUndefined$1(config.fallback) ? UNDEFINED$1 : config.fallback[key] : fallbackData;\n const isEqual = (prev, current)=>{\n for(const _ in stateDependencies){\n const t = _;\n if (t === 'data') {\n if (!compare(prev[t], current[t])) {\n if (!isUndefined$1(prev[t])) {\n return false;\n }\n if (!compare(returnedData, current[t])) {\n return false;\n }\n }\n } else {\n if (current[t] !== prev[t]) {\n return false;\n }\n }\n }\n return true;\n };\n const isInitialMount = !initialMountedRef.current;\n const getSnapshot = useMemo(()=>{\n const cachedData = getCache();\n const initialData = getInitialCache();\n const getSelectedCache = (state)=>{\n // We only select the needed fields from the state.\n const snapshot = mergeObjects(state);\n delete snapshot._k;\n const shouldStartRequest = (()=>{\n if (!key) return false;\n if (!fetcher) return false;\n // If it's paused, we skip revalidation.\n if (getConfig().isPaused()) return false;\n // If `revalidateOnMount` is set, we take the value directly.\n if (isInitialMount && !isUndefined$1(revalidateOnMount)) return revalidateOnMount;\n const data = !isUndefined$1(fallback) ? fallback : snapshot.data;\n if (suspense) return isUndefined$1(data) || revalidateIfStale;\n return isUndefined$1(data) || revalidateIfStale;\n })();\n if (!shouldStartRequest) {\n return snapshot;\n }\n return {\n isValidating: true,\n isLoading: true,\n ...snapshot\n };\n };\n const clientSnapshot = getSelectedCache(cachedData);\n const serverSnapshot = cachedData === initialData ? clientSnapshot : getSelectedCache(initialData);\n // To make sure that we are returning the same object reference to avoid\n // unnecessary re-renders, we keep the previous snapshot and use deep\n // comparison to check if we need to return a new one.\n let memorizedSnapshot = clientSnapshot;\n return [\n ()=>{\n const newSnapshot = getSelectedCache(getCache());\n const compareResult = isEqual(newSnapshot, memorizedSnapshot);\n if (compareResult) {\n // Mentally, we should always return the `memorizedSnapshot` here\n // as there's no change between the new and old snapshots.\n // However, since the `isEqual` function only compares selected fields,\n // the values of the unselected fields might be changed. That's\n // simply because we didn't track them.\n // To support the case in https://github.com/vercel/swr/pull/2576,\n // we need to update these fields in the `memorizedSnapshot` too\n // with direct mutations to ensure the snapshot is always up-to-date\n // even for the unselected fields, but only trigger re-renders when\n // the selected fields are changed.\n memorizedSnapshot.data = newSnapshot.data;\n memorizedSnapshot.isLoading = newSnapshot.isLoading;\n memorizedSnapshot.isValidating = newSnapshot.isValidating;\n memorizedSnapshot.error = newSnapshot.error;\n return memorizedSnapshot;\n } else {\n memorizedSnapshot = newSnapshot;\n return newSnapshot;\n }\n },\n ()=>serverSnapshot\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n cache,\n key\n ]);\n // Get the current state that SWR should return.\n const cached = useSyncExternalStore(useCallback((callback)=>subscribeCache(key, (current, prev)=>{\n if (!isEqual(prev, current)) callback();\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n cache,\n key\n ]), getSnapshot[0], getSnapshot[1]);\n const hasRevalidator = EVENT_REVALIDATORS[key] && EVENT_REVALIDATORS[key].length > 0;\n const cachedData = cached.data;\n const data = isUndefined$1(cachedData) ? fallback && isPromiseLike(fallback) ? use(fallback) : fallback : cachedData;\n const error = cached.error;\n // Use a ref to store previously returned data. Use the initial data as its initial value.\n const laggyDataRef = useRef(data);\n const returnedData = keepPreviousData ? isUndefined$1(cachedData) ? isUndefined$1(laggyDataRef.current) ? data : laggyDataRef.current : cachedData : data;\n const hasKeyButNoData = key && isUndefined$1(data);\n const hydrationRef = useRef(null);\n // Note: the conditionally hook call is fine because the environment\n // `IS_SERVER` never changes.\n // @ts-expect-error -- use hydrationRef directly\n !IS_SERVER && // getServerSnapshot is only called during hydration\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSyncExternalStore(sub, ()=>{\n hydrationRef.current = false;\n return hydrationRef;\n }, ()=>{\n hydrationRef.current = true;\n return hydrationRef;\n });\n const isHydration = hydrationRef.current;\n // During the initial SSR render, warn if the key has no data pre-fetched via:\n // - fallback data\n // - preload calls\n // - initial data from the cache provider\n // We only warn once for each key during Hydration.\n if (strictServerPrefetchWarning && isHydration && !suspense && hasKeyButNoData) {\n console.warn(`Missing pre-initiated data for serialized key \"${key}\" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set \"strictServerPrefetchWarning: false\" to disable this warning.`);\n }\n // Resolve the default validating state:\n // If it's able to validate, and it should revalidate when mount, this will be true.\n // - Suspense mode and there's stale data for the initial render.\n // - Not suspense mode and there is no fallback data and `revalidateIfStale` is enabled.\n // - `revalidateIfStale` is enabled but `data` is not defined.\n const shouldDoInitialRevalidation = (()=>{\n if (!key || !fetcher) return false;\n // If it's paused, we skip revalidation.\n if (getConfig().isPaused()) return false;\n // if a key already has revalidators and also has error, we should not trigger revalidation\n if (hasRevalidator && !isUndefined$1(error)) return false;\n // If `revalidateOnMount` is set, we take the value directly.\n if (isInitialMount && !isUndefined$1(revalidateOnMount)) return revalidateOnMount;\n // Under suspense mode, it will always fetch on render if there is no\n // stale data so no need to revalidate immediately mount it again.\n // If data exists, only revalidate if `revalidateIfStale` is true.\n if (suspense) return isUndefined$1(data) ? false : revalidateIfStale;\n // If there is no stale data, we need to revalidate when mount;\n // If `revalidateIfStale` is set to true, we will always revalidate.\n return isUndefined$1(data) || revalidateIfStale;\n })();\n const defaultValidatingState = isInitialMount && shouldDoInitialRevalidation;\n const isValidating = isUndefined$1(cached.isValidating) ? defaultValidatingState : cached.isValidating;\n const isLoading = isUndefined$1(cached.isLoading) ? defaultValidatingState : cached.isLoading;\n // The revalidation function is a carefully crafted wrapper of the original\n // `fetcher`, to correctly handle the many edge cases.\n const revalidate = useCallback(async (revalidateOpts)=>{\n const currentFetcher = fetcherRef.current;\n if (!key || !currentFetcher || unmountedRef.current || getConfig().isPaused()) {\n return false;\n }\n let newData;\n let startAt;\n let loading = true;\n const opts = revalidateOpts || {};\n // If there is no ongoing concurrent request, or `dedupe` is not set, a\n // new request should be initiated.\n const shouldStartNewRequest = !FETCH[key] || !opts.dedupe;\n /*\n For React 17\n Do unmount check for calls:\n If key has changed during the revalidation, or the component has been\n unmounted, old dispatch and old event callbacks should not take any\n effect\n\n For React 18\n only check if key has changed\n https://github.com/reactwg/react-18/discussions/82\n */ const callbackSafeguard = ()=>{\n if (IS_REACT_LEGACY) {\n return !unmountedRef.current && key === keyRef.current && initialMountedRef.current;\n }\n return key === keyRef.current;\n };\n // The final state object when the request finishes.\n const finalState = {\n isValidating: false,\n isLoading: false\n };\n const finishRequestAndUpdateState = ()=>{\n setCache(finalState);\n };\n const cleanupState = ()=>{\n // Check if it's still the same request before deleting it.\n const requestInfo = FETCH[key];\n if (requestInfo && requestInfo[1] === startAt) {\n delete FETCH[key];\n }\n };\n // Start fetching. Change the `isValidating` state, update the cache.\n const initialState = {\n isValidating: true\n };\n // It is in the `isLoading` state, if and only if there is no cached data.\n // This bypasses fallback data and laggy data.\n if (isUndefined$1(getCache().data)) {\n initialState.isLoading = true;\n }\n try {\n if (shouldStartNewRequest) {\n setCache(initialState);\n // If no cache is being rendered currently (it shows a blank page),\n // we trigger the loading slow event.\n if (config.loadingTimeout && isUndefined$1(getCache().data)) {\n setTimeout(()=>{\n if (loading && callbackSafeguard()) {\n getConfig().onLoadingSlow(key, config);\n }\n }, config.loadingTimeout);\n }\n // Start the request and save the timestamp.\n // Key must be truthy if entering here.\n FETCH[key] = [\n currentFetcher(fnArg),\n getTimestamp()\n ];\n }\n // Wait until the ongoing request is done. Deduplication is also\n // considered here.\n ;\n [newData, startAt] = FETCH[key];\n newData = await newData;\n if (shouldStartNewRequest) {\n // If the request isn't interrupted, clean it up after the\n // deduplication interval.\n setTimeout(cleanupState, config.dedupingInterval);\n }\n // If there're other ongoing request(s), started after the current one,\n // we need to ignore the current one to avoid possible race conditions:\n // req1------------------>res1 (current one)\n // req2---------------->res2\n // the request that fired later will always be kept.\n // The timestamp maybe be `undefined` or a number\n if (!FETCH[key] || FETCH[key][1] !== startAt) {\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onDiscarded(key);\n }\n }\n return false;\n }\n // Clear error.\n finalState.error = UNDEFINED$1;\n // If there're other mutations(s), that overlapped with the current revalidation:\n // case 1:\n // req------------------>res\n // mutate------>end\n // case 2:\n // req------------>res\n // mutate------>end\n // case 3:\n // req------------------>res\n // mutate-------...---------->\n // we have to ignore the revalidation result (res) because it's no longer fresh.\n // meanwhile, a new revalidation should be triggered when the mutation ends.\n const mutationInfo = MUTATION[key];\n if (!isUndefined$1(mutationInfo) && // case 1\n (startAt <= mutationInfo[0] || // case 2\n startAt <= mutationInfo[1] || // case 3\n mutationInfo[1] === 0)) {\n finishRequestAndUpdateState();\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onDiscarded(key);\n }\n }\n return false;\n }\n // Deep compare with the latest state to avoid extra re-renders.\n // For local state, compare and assign.\n const cacheData = getCache().data;\n // Since the compare fn could be custom fn\n // cacheData might be different from newData even when compare fn returns True\n finalState.data = compare(cacheData, newData) ? cacheData : newData;\n // Trigger the successful callback if it's the original request.\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onSuccess(newData, key, config);\n }\n }\n } catch (err) {\n cleanupState();\n const currentConfig = getConfig();\n const { shouldRetryOnError } = currentConfig;\n // Not paused, we continue handling the error. Otherwise, discard it.\n if (!currentConfig.isPaused()) {\n // Get a new error, don't use deep comparison for errors.\n finalState.error = err;\n // Error event and retry logic. Only for the actual request, not\n // deduped ones.\n if (shouldStartNewRequest && callbackSafeguard()) {\n currentConfig.onError(err, key, currentConfig);\n if (shouldRetryOnError === true || isFunction$1(shouldRetryOnError) && shouldRetryOnError(err)) {\n if (!getConfig().revalidateOnFocus || !getConfig().revalidateOnReconnect || isActive()) {\n // If it's inactive, stop. It will auto-revalidate when\n // refocusing or reconnecting.\n // When retrying, deduplication is always enabled.\n currentConfig.onErrorRetry(err, key, currentConfig, (_opts)=>{\n const revalidators = EVENT_REVALIDATORS[key];\n if (revalidators && revalidators[0]) {\n revalidators[0](revalidateEvents.ERROR_REVALIDATE_EVENT, _opts);\n }\n }, {\n retryCount: (opts.retryCount || 0) + 1,\n dedupe: true\n });\n }\n }\n }\n }\n }\n // Mark loading as stopped.\n loading = false;\n // Update the current hook's state.\n finishRequestAndUpdateState();\n return true;\n }, // `setState` is immutable, and `eventsCallback`, `fnArg`, and\n // `keyValidating` are depending on `key`, so we can exclude them from\n // the deps array.\n //\n // FIXME:\n // `fn` and `config` might be changed during the lifecycle,\n // but they might be changed every render like this.\n // `useSWR('key', () => fetch('/api/'), { suspense: true })`\n // So we omit the values from the deps array\n // even though it might cause unexpected behaviors.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n key,\n cache\n ]);\n // Similar to the global mutate but bound to the current cache and key.\n // `cache` isn't allowed to change during the lifecycle.\n const boundMutate = useCallback(// Use callback to make sure `keyRef.current` returns latest result every time\n (...args)=>{\n return internalMutate(cache, keyRef.current, ...args);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n []);\n // The logic for updating refs.\n useIsomorphicLayoutEffect(()=>{\n fetcherRef.current = fetcher;\n configRef.current = config;\n // Handle laggy data updates. If there's cached data of the current key,\n // it'll be the correct reference.\n if (!isUndefined$1(cachedData)) {\n laggyDataRef.current = cachedData;\n }\n });\n // After mounted or key changed.\n useIsomorphicLayoutEffect(()=>{\n if (!key) return;\n const softRevalidate = revalidate.bind(UNDEFINED$1, WITH_DEDUPE);\n let nextFocusRevalidatedAt = 0;\n if (getConfig().revalidateOnFocus) {\n const initNow = Date.now();\n nextFocusRevalidatedAt = initNow + getConfig().focusThrottleInterval;\n }\n // Expose revalidators to global event listeners. So we can trigger\n // revalidation from the outside.\n const onRevalidate = (type, opts = {})=>{\n if (type == revalidateEvents.FOCUS_EVENT) {\n const now = Date.now();\n if (getConfig().revalidateOnFocus && now > nextFocusRevalidatedAt && isActive()) {\n nextFocusRevalidatedAt = now + getConfig().focusThrottleInterval;\n softRevalidate();\n }\n } else if (type == revalidateEvents.RECONNECT_EVENT) {\n if (getConfig().revalidateOnReconnect && isActive()) {\n softRevalidate();\n }\n } else if (type == revalidateEvents.MUTATE_EVENT) {\n return revalidate();\n } else if (type == revalidateEvents.ERROR_REVALIDATE_EVENT) {\n return revalidate(opts);\n }\n return;\n };\n const unsubEvents = subscribeCallback(key, EVENT_REVALIDATORS, onRevalidate);\n // Mark the component as mounted and update corresponding refs.\n unmountedRef.current = false;\n keyRef.current = key;\n initialMountedRef.current = true;\n // Keep the original key in the cache.\n setCache({\n _k: fnArg\n });\n // Trigger a revalidation\n if (shouldDoInitialRevalidation) {\n // Performance optimization: if a request is already in progress for this key,\n // skip the revalidation to avoid redundant work\n if (!FETCH[key]) {\n if (isUndefined$1(data) || IS_SERVER) {\n // Revalidate immediately.\n softRevalidate();\n } else {\n // Delay the revalidate if we have data to return so we won't block\n // rendering.\n rAF(softRevalidate);\n }\n }\n }\n return ()=>{\n // Mark it as unmounted.\n unmountedRef.current = true;\n unsubEvents();\n };\n }, [\n key\n ]);\n // Polling\n useIsomorphicLayoutEffect(()=>{\n let timer;\n function next() {\n // Use the passed interval\n // ...or invoke the function with the updated data to get the interval\n const interval = isFunction$1(refreshInterval) ? refreshInterval(getCache().data) : refreshInterval;\n // We only start the next interval if `refreshInterval` is not 0, and:\n // - `force` is true, which is the start of polling\n // - or `timer` is not 0, which means the effect wasn't canceled\n if (interval && timer !== -1) {\n timer = setTimeout(execute, interval);\n }\n }\n function execute() {\n // Check if it's OK to execute:\n // Only revalidate when the page is visible, online, and not errored.\n if (!getCache().error && (refreshWhenHidden || getConfig().isVisible()) && (refreshWhenOffline || getConfig().isOnline())) {\n revalidate(WITH_DEDUPE).then(next);\n } else {\n // Schedule the next interval to check again.\n next();\n }\n }\n next();\n return ()=>{\n if (timer) {\n clearTimeout(timer);\n timer = -1;\n }\n };\n }, [\n refreshInterval,\n refreshWhenHidden,\n refreshWhenOffline,\n key\n ]);\n // Display debug info in React DevTools.\n useDebugValue(returnedData);\n // In Suspense mode, we can't return the empty `data` state.\n // If there is an `error`, the `error` needs to be thrown to the error boundary.\n // If there is no `error`, the `revalidation` promise needs to be thrown to\n // the suspense boundary.\n if (suspense) {\n // SWR should throw when trying to use Suspense on the server with React 18,\n // without providing any fallback data. This causes hydration errors. See:\n // https://github.com/vercel/swr/issues/1832\n if (!IS_REACT_LEGACY && IS_SERVER && hasKeyButNoData) {\n throw new Error('Fallback data is required when using Suspense in SSR.');\n }\n // Always update fetcher and config refs even with the Suspense mode.\n if (hasKeyButNoData) {\n fetcherRef.current = fetcher;\n configRef.current = config;\n unmountedRef.current = false;\n }\n const req = PRELOAD[key];\n const mutateReq = !isUndefined$1(req) && hasKeyButNoData ? boundMutate(req) : resolvedUndef;\n use(mutateReq);\n if (!isUndefined$1(error) && hasKeyButNoData) {\n throw error;\n }\n const revalidation = hasKeyButNoData ? revalidate(WITH_DEDUPE) : resolvedUndef;\n if (!isUndefined$1(returnedData) && hasKeyButNoData) {\n // @ts-ignore modify react promise status\n revalidation.status = 'fulfilled';\n // @ts-ignore modify react promise value\n revalidation.value = true;\n }\n use(revalidation);\n }\n const swrResponse = {\n mutate: boundMutate,\n get data () {\n stateDependencies.data = true;\n return returnedData;\n },\n get error () {\n stateDependencies.error = true;\n return error;\n },\n get isValidating () {\n stateDependencies.isValidating = true;\n return isValidating;\n },\n get isLoading () {\n stateDependencies.isLoading = true;\n return isLoading;\n }\n };\n return swrResponse;\n};\nconst SWRConfig = OBJECT$1.defineProperty(SWRConfig$1, 'defaultValue', {\n value: defaultConfig\n});\n/**\n * A hook to fetch data.\n *\n * @see {@link https://swr.vercel.app}\n *\n * @example\n * ```jsx\n * import useSWR from 'swr'\n * function Profile() {\n * const { data, error, isLoading } = useSWR('/api/user', fetcher)\n * if (error) return <div>failed to load</div>\n * if (isLoading) return <div>loading...</div>\n * return <div>hello {data.name}!</div>\n * }\n * ```\n */ const useSWR = withArgs(useSWRHandler);\n\n// useSWR\n\nexport { SWRConfig, useSWR as default, unstable_serialize };\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25\"\n}), 'Help');", "import React from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n Divider,\n Typography,\n} from '@mui/material'\n\nimport type { TypographyProps } from '@mui/material'\n\nfunction Typography2({ children }: TypographyProps) {\n return <Typography style={{ margin: 4 }}>{children}</Typography>\n}\nexport default function HelpDialog({\n handleClose,\n}: {\n handleClose: () => void\n}) {\n return (\n <Dialog open maxWidth=\"lg\" onClose={handleClose} title=\"Help\">\n <DialogContent>\n <Typography2>\n The procedure for the protein lookup is as follows:\n <ul>\n <li>\n (Automatic lookup) Searches UniProt for the transcript ID or gene\n name to retrieve the UniProt ID, which is then used to lookup the\n structure in AlphaFoldDB\n </li>\n <li>\n (Manual) Allows you to choose your own structure file from your\n local machine (e.g. a PDB file predicted by e.g. ColabFold) or\n supply a specific URL\n </li>\n <li>\n The residues from the structure are downloaded, and then you can\n choose the transcript isoform from the selected gene that best\n represents the structure. Asterisks are displayed if there is an\n exact sequence match\n </li>\n <li>\n The residues from the structure are finally aligned to the to the\n selected transcript's protein sequence representation, and\n this creates a mapping from the reference genome coordinates to\n positions in the 3-D structure\n </li>\n <li>\n Finally the molstar panel is opened, and this contains many\n specialized features features, plus additional mouseover and\n selection features supplied by the plugin to connect mouse click\n actions and mouse hover with coordinates on the linear genome view\n </li>\n </ul>\n </Typography2>\n <Typography2>\n If you run into challenges with this workflow e.g. your transcripts\n are not being found in UniProt then you can use the Manual import\n form, or contact colin.diesh@gmail.com for troubleshooting\n </Typography2>\n </DialogContent>\n <Divider />\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n", "module.exports = JBrowseExports[\"@jbrowse/core/pluggableElementTypes\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/types/mst\"];", "module.exports = JBrowseExports[\"mobx-state-tree\"];", "import type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { ColorTheme } from 'molstar/lib/mol-theme/color'\n\n/**\n * Color schemes offered in the protein view menu. The `value`s are molstar\n * color-theme names: all are built-in except `plddt-confidence`, which is\n * registered by the MAQualityAssessment behavior (see useProteinView) and reads\n * the per-residue pLDDT scores parsed from AlphaFold mmCIF files.\n */\nexport const COLOR_SCHEMES = [\n { value: 'default', label: 'Default (element/chain)' },\n { value: 'plddt-confidence', label: 'pLDDT confidence (AlphaFold)' },\n { value: 'chain-id', label: 'Chain' },\n { value: 'secondary-structure', label: 'Secondary structure' },\n { value: 'hydrophobicity', label: 'Hydrophobicity (Kyte-Doolittle)' },\n { value: 'residue-name', label: 'Residue type' },\n { value: 'uncertainty', label: 'B-factor / uncertainty' },\n { value: 'molecule-type', label: 'Molecule type' },\n] as const\n\nexport type ProteinColorScheme = (typeof COLOR_SCHEMES)[number]['value']\n\nexport const COLOR_SCHEME_VALUES = COLOR_SCHEMES.map(s => s.value)\n\nexport async function applyColorTheme({\n plugin,\n colorScheme,\n}: {\n plugin: PluginContext\n colorScheme: ProteinColorScheme\n}) {\n const { structures } = plugin.managers.structure.hierarchy.current\n for (const structure of structures) {\n // molstar types `color` against its statically-generated built-in theme\n // union, which excludes extension themes like 'plddt-confidence'. Its own\n // API doc says to widen the name here; ProteinColorScheme keeps it\n // constrained to schemes we actually expose.\n await plugin.managers.structure.component.updateRepresentationsTheme(\n structure.components,\n { color: colorScheme as ColorTheme.BuiltIn | 'default' },\n )\n }\n}\n", "import loadMolstar from './loadMolstar'\nimport { getMolstarStructureSelection } from './util'\n\nimport type {\n Structure,\n StructureElement,\n} from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype InteractivityMode = 'highlight' | 'select' | 'clear'\n\nfunction clearLoci(plugin: PluginContext) {\n plugin.managers.interactivity.lociHighlights.clearHighlights()\n plugin.managers.interactivity.lociSelects.deselectAll()\n}\n\nfunction applyLoci(\n plugin: PluginContext,\n loci: StructureElement.Loci,\n mode: 'highlight' | 'select',\n) {\n if (mode === 'highlight') {\n plugin.managers.interactivity.lociHighlights.clearHighlights()\n plugin.managers.interactivity.lociHighlights.highlight({ loci })\n } else {\n plugin.managers.interactivity.lociSelects.deselectAll()\n plugin.managers.interactivity.lociSelects.select({ loci })\n }\n}\n\nexport async function applyLociInteractivityMultiple({\n structure,\n residues,\n plugin,\n mode,\n}: {\n structure: Structure\n residues: number[]\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear' || residues.length === 0) {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection, Script } = await loadMolstar()\n\n const sel = Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.logic.or(\n residues.map(residue =>\n Q.core.rel.eq([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n residue,\n ]),\n ),\n ),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n\nexport async function applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear') {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection, Script } = await loadMolstar()\n const sel = Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.logic.and([\n Q.core.rel.gre([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n startResidue,\n ]),\n Q.core.rel.lte([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n endResidue,\n ]),\n ]),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n\nexport async function applyLociInteractivitySingle({\n structure,\n selectedResidue,\n plugin,\n mode,\n}: {\n structure: Structure\n selectedResidue: number\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear') {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection } = await loadMolstar()\n const sel = await getMolstarStructureSelection({\n structure,\n selectedResidue: selectedResidue + 1,\n })\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n", "export const CHAR_WIDTH = 6\nexport const ROW_HEIGHT = 14\nexport const COMPACT_TRACK_HEIGHT = 8\nexport const COMPACT_TRACK_GAP = 1\nexport const NORMAL_TRACK_HEIGHT = 12\nexport const NORMAL_TRACK_GAP = 2\nexport const LABEL_WIDTH = 50\n\nexport const HOVER_MARKER_COLOR = 'rgba(255, 105, 180, 0.5)'\nexport const SELECTED_BORDER = '2px solid #333'\nexport const HOVERED_BORDER = '1px solid black'\nexport const HIDE_BUTTON_COLOR = '#999'\n", "import { applyLociInteractivity } from './applyLociInteractivity'\n\nimport type { Structure } from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport default async function highlightResidueRange({\n structure,\n startResidue,\n endResidue,\n plugin,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n}) {\n await applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode: 'highlight',\n })\n}\n\nexport async function selectResidueRange({\n structure,\n startResidue,\n endResidue,\n plugin,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n}) {\n await applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode: 'select',\n })\n}\n", "import { getSession } from '@jbrowse/core/util'\nimport { getCodonRange } from 'g2p_mapper'\n\nimport type { PairwiseAlignment } from '../mappings'\nimport type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ninterface GenomeToTranscriptSeqMapping {\n p2g: Record<number, number>\n strand: number\n refName: string\n}\n\n/**\n * Minimal model shape needed to map structure positions to genome coords.\n */\ninterface ProteinGenomeMappingModel {\n genomeToTranscriptSeqMapping: GenomeToTranscriptSeqMapping | undefined\n pairwiseAlignment: PairwiseAlignment | undefined\n structureSeqToTranscriptSeqPosition: Record<number, number> | undefined\n}\n\ntype NavigateToProteinPositionModel = IAnyStateTreeNode &\n ProteinGenomeMappingModel & {\n connectedView: LinearGenomeViewModel | undefined\n }\n\ntype ClickProteinToGenomeModel = NavigateToProteinPositionModel & {\n zoomToBaseLevel: boolean\n setClickedStructureRange: (range?: { start: number; end: number }) => void\n}\n\n/**\n * Maps a protein structure position to genome coordinates\n * @returns [start, end] tuple of genome coordinates, or undefined if mapping fails\n */\nexport function proteinToGenomeMapping({\n model,\n structureSeqPos,\n}: {\n structureSeqPos: number\n model: ProteinGenomeMappingModel\n}) {\n const {\n genomeToTranscriptSeqMapping,\n pairwiseAlignment,\n structureSeqToTranscriptSeqPosition,\n } = model\n\n if (!genomeToTranscriptSeqMapping || !pairwiseAlignment) {\n return undefined\n }\n\n const { p2g, strand } = genomeToTranscriptSeqMapping\n const transcriptPos = structureSeqToTranscriptSeqPosition?.[structureSeqPos]\n\n if (transcriptPos === undefined) {\n return undefined\n }\n\n return getCodonRange(p2g, transcriptPos, strand)\n}\n\n/**\n * Maps a protein structure range to genome coordinates\n * @returns [start, end] tuple of genome coordinates spanning the full range, or undefined if mapping fails\n */\nexport function proteinRangeToGenomeMapping({\n model,\n structureSeqPos,\n structureSeqEndPos,\n}: {\n structureSeqPos: number\n structureSeqEndPos: number\n model: ProteinGenomeMappingModel\n}) {\n let minStart: number | undefined\n let maxEnd: number | undefined\n for (let pos = structureSeqPos; pos < structureSeqEndPos; pos++) {\n const result = proteinToGenomeMapping({ structureSeqPos: pos, model })\n if (result) {\n const [s, e] = result\n if (minStart === undefined || s < minStart) {\n minStart = s\n }\n if (maxEnd === undefined || e > maxEnd) {\n maxEnd = e\n }\n }\n }\n if (minStart !== undefined && maxEnd !== undefined) {\n return [minStart, maxEnd] as const\n }\n return undefined\n}\n\nexport async function navigateToProteinPosition({\n model,\n structureSeqPos,\n structureSeqEndPos,\n zoomToBaseLevel,\n}: {\n structureSeqPos: number\n structureSeqEndPos?: number\n model: NavigateToProteinPositionModel\n zoomToBaseLevel: boolean\n}) {\n const session = getSession(model)\n const { connectedView, genomeToTranscriptSeqMapping } = model\n if (!genomeToTranscriptSeqMapping || !connectedView) {\n return\n }\n const { strand, refName } = genomeToTranscriptSeqMapping\n const assemblyName = connectedView.assemblyNames[0]\n if (!assemblyName) {\n return\n }\n\n const result =\n structureSeqEndPos !== undefined\n ? proteinRangeToGenomeMapping({\n structureSeqPos,\n structureSeqEndPos,\n model,\n })\n : proteinToGenomeMapping({ structureSeqPos, model })\n\n if (!result) {\n return\n }\n const [start, end] = result\n\n if (zoomToBaseLevel) {\n await connectedView.navToLocString(\n `${refName}:${start}-${end}${strand === -1 ? '[rev]' : ''}`,\n undefined,\n 0.2,\n )\n } else {\n const { assemblyManager } = session\n const assembly = assemblyManager.get(assemblyName)\n const canonicalRefName = assembly?.getCanonicalRefName(refName) ?? refName\n connectedView.centerAt(start, canonicalRefName)\n }\n}\n\nexport async function clickProteinToGenome({\n model,\n structureSeqPos,\n structureSeqEndPos,\n}: {\n structureSeqPos: number\n structureSeqEndPos?: number\n model: ClickProteinToGenomeModel\n}) {\n model.setClickedStructureRange({\n start: structureSeqPos,\n end: structureSeqEndPos ?? structureSeqPos + 1,\n })\n await navigateToProteinPosition({\n model,\n structureSeqPos,\n structureSeqEndPos,\n zoomToBaseLevel: model.zoomToBaseLevel,\n })\n}\n", "// Kyte-Doolittle hydropathy index. Positive = hydrophobic, negative =\n// hydrophilic. Residues absent from the table (X, gaps, non-standard) map to\n// undefined so they render as gaps in the track.\nconst KYTE_DOOLITTLE: Record<string, number> = {\n I: 4.5,\n V: 4.2,\n L: 3.8,\n F: 2.8,\n C: 2.5,\n M: 1.9,\n A: 1.8,\n G: -0.4,\n T: -0.7,\n S: -0.8,\n W: -0.9,\n Y: -1.3,\n P: -1.6,\n H: -3.2,\n E: -3.5,\n Q: -3.5,\n D: -3.5,\n N: -3.5,\n K: -3.9,\n R: -4.5,\n}\n\nexport const KYTE_DOOLITTLE_MIN = -4.5\nexport const KYTE_DOOLITTLE_MAX = 4.5\n\nexport function kyteDoolittleScores(seq: string): (number | undefined)[] {\n return Array.from(seq, aa => KYTE_DOOLITTLE[aa])\n}\n\n/**\n * AlphaFold pLDDT confidence palette (matches molstar's plddt-confidence\n * color theme): very low (<=50) orange, low (<=70) yellow, confident (<=90)\n * light blue, very high (>90) blue.\n */\nexport function plddtColor(score: number): string {\n return score < 0\n ? '#cccccc'\n : score <= 50\n ? '#ff7d45'\n : score <= 70\n ? '#ffdb13'\n : score <= 90\n ? '#65cbf3'\n : '#0053d6'\n}\n\n/**\n * Diverging hydrophobicity color: hydrophobic (high Kyte-Doolittle) toward\n * orange, hydrophilic (low) toward blue, near-neutral white.\n */\nexport function hydrophobicityColor(score: number): string {\n const t = Math.max(\n 0,\n Math.min(\n 1,\n (score - KYTE_DOOLITTLE_MIN) / (KYTE_DOOLITTLE_MAX - KYTE_DOOLITTLE_MIN),\n ),\n )\n // t=0 hydrophilic (blue 51,102,204) -> t=1 hydrophobic (orange 230,140,40)\n const r = Math.round(51 + (230 - 51) * t)\n const g = Math.round(102 + (140 - 102) * t)\n const b = Math.round(204 + (40 - 204) * t)\n return `rgb(${r}, ${g}, ${b})`\n}\n\n/**\n * Maps per-structure-residue values (indexed by 0-based structure sequence\n * position) onto alignment columns via structurePositionToAlignmentMap.\n * Residues with no value or no alignment column (gaps) are dropped.\n */\nexport function mapResidueValuesToColumns(\n values: (number | undefined)[],\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n): { col: number; value: number }[] {\n return structurePositionToAlignmentMap\n ? values.flatMap((value, structurePos) => {\n const col = structurePositionToAlignmentMap[structurePos]\n return value !== undefined && col !== undefined ? [{ col, value }] : []\n })\n : []\n}\n", "import React, { useState } from 'react'\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n Typography,\n} from '@mui/material'\nimport { parsePairwise } from 'clustal-js'\nimport { observer } from 'mobx-react'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst ManualAlignmentDialog = observer(function ManualAlignmentDialog({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [alignment, setAlignment] = useState('')\n const [parseError, setParseError] = useState<string>()\n const { showManualAlignmentDialog, primaryStructure } = model\n\n const handleClose = () => {\n setAlignment('')\n setParseError(undefined)\n model.setShowManualAlignmentDialog(false)\n }\n\n const handleApply = () => {\n if (!alignment.trim()) {\n return\n }\n try {\n const parsed = parsePairwise(alignment.trim())\n if (!primaryStructure) {\n setParseError('No structure loaded to apply alignment to')\n return\n }\n primaryStructure.setAlignment(parsed)\n handleClose()\n } catch (e) {\n setParseError(`Failed to parse alignment: ${e}`)\n }\n }\n\n if (!showManualAlignmentDialog) {\n return null\n }\n\n return (\n <Dialog open onClose={handleClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Import Manual Alignment</DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Paste a pre-computed alignment in Clustal format. The first sequence\n should be the transcript and the second should be the structure.\n </Typography>\n <TextField\n multiline\n rows={12}\n fullWidth\n placeholder={`Example:\ntranscript MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG\n |||||||||||||||||||||||||||||||||||||\nstructure MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG`}\n value={alignment}\n onChange={e => {\n setAlignment(e.target.value)\n setParseError(undefined)\n }}\n slotProps={{\n htmlInput: { style: { fontFamily: 'monospace', fontSize: 12 } },\n }}\n />\n {parseError ? (\n <Typography color=\"error\" variant=\"body2\" sx={{ mt: 1 }}>\n {parseError}\n </Typography>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose}>Cancel</Button>\n <Button\n onClick={handleApply}\n variant=\"contained\"\n color=\"primary\"\n disabled={!alignment.trim()}\n >\n Apply Alignment\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default ManualAlignmentDialog\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 17v2h6v-2zM3 5v2h10V5zm10 16v-2h8v-2h-8v-2h-2v6zM7 9v2H3v2h4v2h2V9zm14 4v-2H11v2zm-6-4h2V7h4V5h-4V3h-2z\"\n}), 'Tune');", "module.exports = JBrowseExports[\"@mui/material/Checkbox\"];", "module.exports = JBrowseExports[\"@mui/material/IconButton\"];", "module.exports = JBrowseExports[\"@mui/material/ListItemIcon\"];", "module.exports = JBrowseExports[\"@mui/material/ListItemText\"];", "module.exports = JBrowseExports[\"@mui/material/Menu\"];", "module.exports = JBrowseExports[\"@mui/material/MenuItem\"];", "module.exports = JBrowseExports[\"@mui/material/TextField\"];", "module.exports = JBrowseExports[\"@mui/material/Tooltip\"];", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport {\n getAlphaFoldStructureUrl,\n getPdbStructureUrl,\n} from '../../LaunchProteinView/utils/launchViewUtils'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst AddStructureDialog = observer(function AddStructureDialog({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [file, setFile] = useState<File>()\n const [pdbId, setPdbId] = useState('')\n const [uniprotId, setUniprotId] = useState('')\n const [choice, setChoice] = useState('pdb')\n const [structureURL, setStructureURL] = useState('')\n const [error, setError] = useState<unknown>()\n const { showAddStructureDialog } = model\n\n const handleClose = () => {\n setFile(undefined)\n setPdbId('')\n setUniprotId('')\n setStructureURL('')\n setError(undefined)\n model.setShowAddStructureDialog(false)\n }\n\n const handleAdd = async () => {\n try {\n let url: string | undefined\n let data: string | undefined\n\n if (choice === 'pdb' && pdbId) {\n url = getPdbStructureUrl(pdbId)\n } else if (choice === 'uniprot' && uniprotId) {\n url = getAlphaFoldStructureUrl(uniprotId.toUpperCase())\n } else if (choice === 'url' && structureURL) {\n url = structureURL\n } else if (choice === 'file' && file) {\n data = await file.text()\n }\n\n if (url !== undefined || data !== undefined) {\n await model.addStructureAndSuperpose({ url, data })\n handleClose()\n }\n } catch (e) {\n console.error(e)\n setError(e)\n }\n }\n\n if (!showAddStructureDialog) {\n return null\n }\n\n const canAdd =\n (choice === 'url' && structureURL !== '') ||\n (choice === 'file' && file !== undefined) ||\n (choice === 'pdb' && pdbId !== '') ||\n (choice === 'uniprot' && uniprotId !== '')\n\n return (\n <Dialog open onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Add Structure</DialogTitle>\n <DialogContent>\n {error ? <ErrorMessage error={error} /> : null}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Add another structure to superpose on the existing structure(s).\n </Typography>\n\n <FormControl component=\"fieldset\" sx={{ mb: 2 }}>\n <RadioGroup\n value={choice}\n onChange={event => {\n setChoice(event.target.value)\n }}\n >\n <FormControlLabel value=\"pdb\" control={<Radio />} label=\"PDB ID\" />\n <FormControlLabel\n value=\"uniprot\"\n control={<Radio />}\n label=\"UniProt ID (AlphaFold)\"\n />\n <FormControlLabel value=\"url\" control={<Radio />} label=\"URL\" />\n <FormControlLabel value=\"file\" control={<Radio />} label=\"File\" />\n </RadioGroup>\n </FormControl>\n\n {choice === 'pdb' ? (\n <TextField\n fullWidth\n value={pdbId}\n onChange={event => {\n setPdbId(event.target.value.toUpperCase())\n }}\n label=\"PDB ID (e.g. 1CRN)\"\n placeholder=\"Enter PDB ID\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'uniprot' ? (\n <TextField\n fullWidth\n value={uniprotId}\n onChange={event => {\n setUniprotId(event.target.value.toUpperCase())\n }}\n label=\"UniProt ID (e.g. P04637)\"\n placeholder=\"Enter UniProt ID\"\n helperText=\"Will fetch the AlphaFold v6 predicted structure\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'url' ? (\n <TextField\n fullWidth\n label=\"Structure URL\"\n value={structureURL}\n onChange={event => {\n setStructureURL(event.target.value)\n }}\n placeholder=\"https://files.rcsb.org/download/1CRN.cif\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'file' ? (\n <div style={{ marginBottom: 16 }}>\n <Button variant=\"outlined\" component=\"label\">\n {file ? file.name : 'Choose File'}\n <input\n type=\"file\"\n hidden\n accept=\".pdb,.cif,.mmcif,.ent\"\n onChange={({ target }) => {\n const f = target.files?.[0]\n if (f) {\n setFile(f)\n }\n }}\n />\n </Button>\n {file ? (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n Selected: {file.name}\n </Typography>\n ) : null}\n </div>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n Tip: Structures will be automatically superposed using TM-align. For\n manual control, use the Mol* controls (\uD83D\uDD27 wrench icon).\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose}>Cancel</Button>\n <Button\n onClick={() => {\n void handleAdd()\n }}\n variant=\"contained\"\n color=\"primary\"\n disabled={!canAdd}\n >\n Add Structure\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default AddStructureDialog\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinViewModel,\n} from '../model'\n\nconst HeaderStructureInfo = observer(function HeaderStructureInfo({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { structures } = model\n const hoverText = structures\n .map(\n (structure: JBrowsePluginProteinStructureModel) => structure.hoverString,\n )\n .filter(Boolean)\n .join(' ')\n return (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: 12,\n }}\n title={hoverText}\n >\n {/* nbsp keeps the line height stable when there is no hover */}\n {hoverText ? `Hover: ${hoverText}` : '\u00A0'}\n </div>\n )\n})\n\nexport default HeaderStructureInfo\n", "import React from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport { Button, DialogActions, DialogContent, Typography } from '@mui/material'\n\nimport type { TypographyProps } from '@mui/material'\n\nfunction Typography2({ children }: TypographyProps) {\n return (\n <Typography\n style={{\n margin: 4,\n marginBottom: 12,\n }}\n >\n {children}\n </Typography>\n )\n}\nexport default function ProteinAlignmentHelpDialog({\n handleClose,\n}: {\n handleClose: () => void\n}) {\n return (\n <Dialog open maxWidth=\"lg\" onClose={handleClose} title=\"Protein alignment\">\n <DialogContent>\n <Typography2>\n This panel shows the computed pairwise alignment of the reference\n genome sequence to the structure sequence. The structure file (PDB\n file, mmCIF file, etc) has a stored representation of the e.g. amino\n acid sequence but the sequence in the structure file can differ from\n the sequence from the gene on the genome browser\n </Typography2>\n <Typography2>\n In order to resolve this, we align the two sequences together (using\n EMBOSS needle) to get pairwise alignment of the genome's\n representation of the protein and the structure file's\n representation of the protein.\n </Typography2>\n <Typography2>\n If you need a 100% fidelity protein, you can do a folding with e.g.\n AlphaFold to make sure the structure you are using matches exactly the\n sequence of the transcript\n </Typography2>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n handleClose()\n }}\n variant=\"contained\"\n color=\"primary\"\n >\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n", "import React, { lazy } from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport Help from '@mui/icons-material/Help'\nimport { IconButton } from '@mui/material'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\n// icons\n\nconst ProteinAlignmentHelpDialog = lazy(\n () => import('./ProteinAlignmentHelpDialog'),\n)\n\nexport default function ProteinAlignmentHelpButton({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <IconButton\n style={{ float: 'right' }}\n onClick={() => {\n getSession(model).queueDialog(handleClose => [\n ProteinAlignmentHelpDialog,\n { handleClose },\n ])\n }}\n >\n <Help />\n </IconButton>\n )\n}\n", "import useSWR from 'swr'\n\nexport interface UniProtFeature {\n type: string\n start: number\n end: number\n description: string\n id?: string\n uniqueId: string\n}\n\nconst featureColors: Record<string, string> = {\n Domain: '#1f77b4',\n 'DNA binding': '#ff7f0e',\n Region: '#2ca02c',\n 'Zinc finger': '#d62728',\n 'Coiled coil': '#9467bd',\n Motif: '#8c564b',\n 'Compositional bias': '#e377c2',\n Repeat: '#7f7f7f',\n Transmembrane: '#bcbd22',\n Intramembrane: '#17becf',\n 'Topological domain': '#aec7e8',\n Signal: '#ffbb78',\n 'Signal peptide': '#ffbb78',\n Propeptide: '#98df8a',\n 'Transit peptide': '#ff9896',\n Chain: '#c5b0d5',\n 'Disulfide bond': '#c49c94',\n 'Active site': '#f7b6d2',\n 'Binding site': '#c7c7c7',\n Site: '#dbdb8d',\n 'Modified residue': '#9edae5',\n Glycosylation: '#393b79',\n Lipidation: '#637939',\n 'Cross-link': '#8c6d31',\n 'Alternative sequence': '#e7969c',\n 'Natural variant': '#de9ed6',\n Mutagenesis: '#ad494a',\n 'Sequence conflict': '#b5cf6b',\n Helix: '#e7ba52',\n 'Beta strand': '#6b6ecf',\n Turn: '#d6616b',\n 'Initiator methionine': '#ce6dbd',\n Peptide: '#6baed6',\n 'Calcium binding': '#fd8d3c',\n 'Nucleotide binding': '#74c476',\n}\n\nexport function getFeatureColor(type: string) {\n return featureColors[type] ?? '#999999'\n}\n\nasync function fetchUniProtFeatures(url: string): Promise<UniProtFeature[]> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} fetching ${url}`)\n }\n const text = await res.text()\n\n const features: UniProtFeature[] = []\n for (const line of text.split('\\n')) {\n if (line.startsWith('#') || !line.trim()) {\n continue\n }\n const parts = line.split('\\t')\n if (parts.length < 9) {\n continue\n }\n const type = parts[2]\n const start = Number.parseInt(parts[3] ?? '0', 10)\n const end = Number.parseInt(parts[4] ?? '0', 10)\n const attributes = parts[8] ?? ''\n\n let description = ''\n let id: string | undefined\n for (const attr of attributes.split(';')) {\n const [key, value] = attr.split('=')\n if (key === 'Note') {\n description = decodeURIComponent(value ?? '')\n } else if (key === 'ID') {\n id = value\n }\n }\n\n if (type) {\n const uniqueId = `${type}-${start}-${end}-${features.length}`\n features.push({\n type,\n start,\n end,\n description,\n id,\n uniqueId,\n })\n }\n }\n\n return features\n}\n\nexport default function useUniProtFeatures(uniprotId: string | undefined) {\n const { data, error, isLoading } = useSWR(\n uniprotId ? `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff` : null,\n fetchUniProtFeatures,\n )\n\n return {\n features: data,\n error,\n isLoading,\n }\n}\n", "import React, { useState } from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, HOVERED_BORDER, SELECTED_BORDER } from '../constants'\nimport { selectResidueRange } from '../highlightResidueRange'\nimport { getFeatureColor } from '../hooks/useUniProtFeatures'\nimport { clickProteinToGenome } from '../proteinToGenomeMapping'\n\nimport type { UniProtFeature } from '../hooks/useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction getFeatureAlignmentRange(\n feature: UniProtFeature,\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n) {\n const startAlignmentPos = structurePositionToAlignmentMap?.[feature.start - 1]\n const endAlignmentPos = structurePositionToAlignmentMap?.[feature.end - 1]\n return startAlignmentPos !== undefined && endAlignmentPos !== undefined\n ? { start: startAlignmentPos, end: endAlignmentPos }\n : undefined\n}\n\nfunction getFeatureGeometry(\n feature: UniProtFeature,\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n) {\n const startAlnPos =\n structurePositionToAlignmentMap?.[feature.start - 1] ?? feature.start - 1\n const endAlnPos =\n structurePositionToAlignmentMap?.[feature.end - 1] ?? feature.end - 1\n return {\n left: startAlnPos * CHAR_WIDTH,\n width: Math.max((endAlnPos - startAlnPos + 1) * CHAR_WIDTH, 3),\n }\n}\n\nfunction FeatureTooltipContent({ feature }: { feature: UniProtFeature }) {\n return (\n <div>\n <div>\n <strong>{feature.type}</strong>\n </div>\n <div>\n Position: {feature.start}-{feature.end}\n </div>\n {feature.description ? <div>{feature.description}</div> : null}\n </div>\n )\n}\n\nconst FeatureBar = observer(function FeatureBar({\n feature,\n model,\n}: {\n feature: UniProtFeature\n model: JBrowsePluginProteinStructureModel\n}) {\n const [isHovered, setIsHovered] = useState(false)\n const {\n molstarPluginContext,\n selectedFeatureId,\n structurePositionToAlignmentMap,\n } = model\n const isSelected = selectedFeatureId === feature.uniqueId\n\n const handleMouseEnter = () => {\n setIsHovered(true)\n const range = getFeatureAlignmentRange(\n feature,\n structurePositionToAlignmentMap,\n )\n if (range) {\n model.setAlignmentHoverRange(range)\n }\n }\n\n const handleMouseLeave = () => {\n setIsHovered(false)\n model.setAlignmentHoverRange(undefined)\n }\n\n const handleClick = () => {\n const structure = model.molstarStructure\n const newSelected = !isSelected\n\n if (structure && molstarPluginContext) {\n if (newSelected) {\n selectResidueRange({\n structure,\n startResidue: feature.start,\n endResidue: feature.end,\n plugin: molstarPluginContext,\n }).catch((e: unknown) => {\n console.error(e)\n model.setError(e)\n })\n } else {\n molstarPluginContext.managers.interactivity.lociSelects.deselectAll()\n }\n }\n\n if (newSelected) {\n model.setSelectedFeatureId(feature.uniqueId)\n clickProteinToGenome({\n model,\n structureSeqPos: feature.start - 1,\n structureSeqEndPos: feature.end,\n }).catch((e: unknown) => {\n console.error(e)\n model.setError(e)\n })\n } else {\n model.setSelectedFeatureId(undefined)\n model.setClickedStructureRange(undefined)\n }\n }\n\n const { left, width } = getFeatureGeometry(\n feature,\n structurePositionToAlignmentMap,\n )\n const color = getFeatureColor(feature.type)\n\n return (\n <Tooltip title={<FeatureTooltipContent feature={feature} />} followCursor>\n <div\n onClick={() => {\n handleClick()\n }}\n onMouseEnter={() => {\n handleMouseEnter()\n }}\n onMouseLeave={() => {\n handleMouseLeave()\n }}\n style={{\n position: 'absolute',\n left,\n top: 0,\n width,\n height: model.trackHeight,\n backgroundColor: color,\n opacity: isHovered || isSelected ? 0.9 : 0.6,\n cursor: 'pointer',\n borderRadius: 2,\n border: isSelected\n ? SELECTED_BORDER\n : isHovered\n ? HOVERED_BORDER\n : 'none',\n boxSizing: 'border-box',\n }}\n />\n </Tooltip>\n )\n})\n\nexport default FeatureBar\n", "import React from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { HIDE_BUTTON_COLOR } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst FeatureTypeLabel = observer(function FeatureTypeLabel({\n type,\n labelWidth,\n model,\n}: {\n type: string\n labelWidth: number\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <Tooltip title={type} placement=\"left\">\n <div\n style={{\n height: model.trackHeight + model.trackGap,\n width: labelWidth - 4,\n fontSize: 9,\n fontFamily: 'monospace',\n textAlign: 'right',\n paddingRight: 4,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n }}\n >\n <span\n onClick={e => {\n e.stopPropagation()\n model.hideFeatureType(type)\n }}\n style={{\n cursor: 'pointer',\n color: HIDE_BUTTON_COLOR,\n fontWeight: 'bold',\n fontSize: 8,\n lineHeight: 1,\n }}\n title={`Hide ${type} track`}\n >\n x\n </span>\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {type}\n </span>\n </div>\n </Tooltip>\n )\n})\n\nexport default FeatureTypeLabel\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, HOVER_MARKER_COLOR } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst HoverMarker = observer(function HoverMarker({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n const { alignmentHoverPos } = model\n\n if (alignmentHoverPos === undefined) {\n return null\n }\n\n return (\n <div\n style={{\n position: 'absolute',\n left: alignmentHoverPos * CHAR_WIDTH,\n top: 0,\n bottom: 0,\n width: CHAR_WIDTH,\n backgroundColor: HOVER_MARKER_COLOR,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n />\n )\n})\n\nexport default HoverMarker\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\nimport FeatureBar from './FeatureBar'\nimport FeatureTypeLabel from './FeatureTypeLabel'\nimport HoverMarker from './HoverMarker'\n\nimport type { FeatureTrackData } from '../hooks/useProteinFeatureTrackData'\nimport type { UniProtFeature } from '../hooks/useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction getVisibleTypes(\n featureTypes: string[],\n hiddenFeatureTypes: Set<string>,\n) {\n return featureTypes.filter(type => !hiddenFeatureTypes.has(type))\n}\n\nconst FeatureTypeTrackContent = observer(function FeatureTypeTrackContent({\n features,\n model,\n sequenceLength,\n}: {\n features: UniProtFeature[]\n model: JBrowsePluginProteinStructureModel\n sequenceLength: number\n}) {\n return (\n <div\n style={{\n position: 'relative',\n height: model.trackHeight,\n width: sequenceLength * CHAR_WIDTH,\n marginBottom: model.trackGap,\n }}\n >\n {features.map(feature => (\n <FeatureBar key={feature.uniqueId} feature={feature} model={model} />\n ))}\n <HoverMarker model={model} />\n </div>\n )\n})\n\nexport const ProteinFeatureTrackLabels = observer(\n function ProteinFeatureTrackLabels({\n data,\n labelWidth,\n model,\n }: {\n data: FeatureTrackData\n labelWidth: number\n model: JBrowsePluginProteinStructureModel\n }) {\n const { hiddenFeatureTypes } = model\n const visibleTypes = getVisibleTypes(data.featureTypes, hiddenFeatureTypes)\n return (\n <>\n {visibleTypes.map(type => (\n <FeatureTypeLabel\n key={type}\n type={type}\n labelWidth={labelWidth}\n model={model}\n />\n ))}\n </>\n )\n },\n)\n\nexport const ProteinFeatureTrackContent = observer(\n function ProteinFeatureTrackContent({\n data,\n model,\n }: {\n data: FeatureTrackData\n model: JBrowsePluginProteinStructureModel\n }) {\n const { hiddenFeatureTypes } = model\n const visibleTypes = getVisibleTypes(data.featureTypes, hiddenFeatureTypes)\n\n return (\n <div\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const alignmentPos = Math.floor(x / CHAR_WIDTH)\n if (alignmentPos >= 0 && alignmentPos < data.sequenceLength) {\n model.hoverAlignmentPosition(alignmentPos)\n }\n }}\n onMouseLeave={() => {\n model.setHoveredPosition(undefined)\n }}\n >\n {visibleTypes.map(type => (\n <FeatureTypeTrackContent\n key={type}\n features={data.groupedFeatures[type]!}\n model={model}\n sequenceLength={data.sequenceLength}\n />\n ))}\n </div>\n )\n },\n)\n", "import React from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nexport interface ResidueCell {\n col: number\n value: number\n}\n\n/**\n * A per-residue scalar track (e.g. pLDDT, hydrophobicity) rendered as colored\n * cells aligned to the pairwise-alignment columns, matching the UniProt feature\n * tracks. Hovering drives the same structure hover as the feature tracks.\n */\nconst ResidueValueTrack = observer(function ResidueValueTrack({\n cells,\n colorFor,\n formatValue,\n sequenceLength,\n model,\n}: {\n cells: ResidueCell[]\n colorFor: (value: number) => string\n formatValue: (value: number) => string\n sequenceLength: number\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <div\n style={{\n position: 'relative',\n height: model.trackHeight,\n width: sequenceLength * CHAR_WIDTH,\n marginBottom: model.trackGap,\n }}\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const alignmentPos = Math.floor((e.clientX - rect.left) / CHAR_WIDTH)\n if (alignmentPos >= 0 && alignmentPos < sequenceLength) {\n model.hoverAlignmentPosition(alignmentPos)\n }\n }}\n onMouseLeave={() => {\n model.setHoveredPosition(undefined)\n }}\n >\n {cells.map(cell => (\n <Tooltip key={cell.col} title={formatValue(cell.value)} followCursor>\n <div\n style={{\n position: 'absolute',\n left: cell.col * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height: model.trackHeight,\n backgroundColor: colorFor(cell.value),\n }}\n />\n </Tooltip>\n ))}\n </div>\n )\n})\n\nexport default ResidueValueTrack\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst CharacterSpans = observer(function CharacterSpans({\n str,\n}: {\n str: string\n}) {\n return str.split('').map((char, i) => (\n <span\n key={i}\n style={{\n position: 'absolute',\n left: i * CHAR_WIDTH,\n width: CHAR_WIDTH,\n }}\n >\n {char === ' ' ? '\\u00A0' : char}\n </span>\n ))\n})\n\nconst MatchOverlays = observer(function MatchOverlays({\n model,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n height: number\n}) {\n const { showHighlight, alignmentMatchSet } = model\n return !showHighlight || !alignmentMatchSet\n ? null\n : [...alignmentMatchSet].map(i => (\n <span\n key={i}\n style={{\n position: 'absolute',\n left: i * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height,\n background: '#33ff19a0',\n pointerEvents: 'none',\n }}\n />\n ))\n})\n\nconst HoverHighlight = observer(function HoverHighlight({\n model,\n strLength,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n strLength: number\n height: number\n}) {\n const { alignmentHoverPos } = model\n const showHoverHighlight =\n alignmentHoverPos !== undefined &&\n alignmentHoverPos >= 0 &&\n alignmentHoverPos < strLength\n\n return !showHoverHighlight ? null : (\n <span\n style={{\n position: 'absolute',\n left: alignmentHoverPos * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height,\n background: '#f698',\n pointerEvents: 'none',\n }}\n />\n )\n})\n\nconst RangeHighlight = observer(function RangeHighlight({\n range,\n strLength,\n background,\n border,\n height,\n}: {\n range: { start: number; end: number } | undefined\n strLength: number\n background: string\n border?: string\n height: number\n}) {\n if (!range) {\n return null\n }\n const { start, end } = range\n const clampedStart = Math.max(0, start)\n const clampedEnd = Math.min(strLength - 1, end)\n if (clampedStart > clampedEnd) {\n return null\n }\n const width = (clampedEnd - clampedStart + 1) * CHAR_WIDTH\n\n return (\n <span\n style={{\n position: 'absolute',\n left: clampedStart * CHAR_WIDTH,\n top: 0,\n width,\n height,\n background,\n border,\n boxSizing: 'border-box',\n pointerEvents: 'none',\n }}\n />\n )\n})\n\nexport const AlignmentHighlights = observer(function AlignmentHighlights({\n model,\n strLength,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n strLength: number\n height: number\n}) {\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: strLength * CHAR_WIDTH,\n height,\n pointerEvents: 'none',\n }}\n >\n <MatchOverlays model={model} height={height} />\n <RangeHighlight\n range={model.clickAlignmentRange}\n strLength={strLength}\n background=\"rgba(0, 120, 255, 0.3)\"\n border=\"1px solid rgba(0, 120, 255, 0.6)\"\n height={height}\n />\n <RangeHighlight\n range={model.alignmentHoverRange}\n strLength={strLength}\n background=\"rgba(255, 165, 0, 0.4)\"\n height={height}\n />\n <HoverHighlight model={model} strLength={strLength} height={height} />\n </div>\n )\n})\n\nconst SplitString = observer(function SplitString({\n model,\n str,\n}: {\n model: JBrowsePluginProteinStructureModel\n str: string\n}) {\n return (\n <span\n style={{\n position: 'relative',\n display: 'inline-block',\n width: str.length * CHAR_WIDTH,\n height: '1em',\n }}\n onMouseMove={(e: React.MouseEvent<HTMLSpanElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const index = Math.floor(x / CHAR_WIDTH)\n if (index >= 0 && index < str.length) {\n model.hoverAlignmentPosition(index)\n }\n }}\n onClick={(e: React.MouseEvent<HTMLSpanElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const index = Math.floor(x / CHAR_WIDTH)\n if (index >= 0 && index < str.length) {\n model.clickAlignmentPosition(index)\n }\n }}\n >\n <CharacterSpans str={str} />\n </span>\n )\n})\n\nexport default SplitString\n", "import useUniProtFeatures from './useUniProtFeatures'\n\nimport type { UniProtFeature } from './useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\ntype FeaturesByType = Record<string, UniProtFeature[]>\n\nexport interface FeatureTrackData {\n featureTypes: string[]\n groupedFeatures: FeaturesByType\n sequenceLength: number\n}\n\nfunction groupFeaturesByType(features: UniProtFeature[]): FeaturesByType {\n const grouped: FeaturesByType = {}\n for (const feature of features) {\n grouped[feature.type] ??= []\n grouped[feature.type]!.push(feature)\n }\n return grouped\n}\n\nexport default function useProteinFeatureTrackData(\n model: JBrowsePluginProteinStructureModel,\n uniprotId: string | undefined,\n): {\n data: FeatureTrackData | undefined\n isLoading: boolean\n error: unknown\n} {\n const { features, isLoading, error } = useUniProtFeatures(uniprotId)\n const { pairwiseAlignment } = model\n\n if (!uniprotId || isLoading || error || !features || !pairwiseAlignment) {\n return { data: undefined, isLoading, error }\n }\n\n const sequenceLength = pairwiseAlignment.alns[0].seq.length\n const groupedFeatures = groupFeaturesByType(features)\n const featureTypes = Object.keys(groupedFeatures)\n\n return {\n data: { featureTypes, groupedFeatures, sequenceLength },\n isLoading: false,\n error: undefined,\n }\n}\n", "import React, { useEffect, useRef } from 'react'\n\nimport { Tooltip, Typography } from '@mui/material'\nimport { autorun } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, LABEL_WIDTH, ROW_HEIGHT } from '../constants'\nimport ProteinAlignmentHelpButton from './ProteinAlignmentHelpButton'\nimport {\n ProteinFeatureTrackContent,\n ProteinFeatureTrackLabels,\n} from './ProteinFeatureTrack'\nimport ResidueValueTrack from './ResidueValueTrack'\nimport SplitString, { AlignmentHighlights } from './SplitString'\nimport useProteinFeatureTrackData from '../hooks/useProteinFeatureTrackData'\nimport { hydrophobicityColor, plddtColor } from '../residueTracks'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction GutterLabel({\n label,\n title,\n height,\n}: {\n label: string\n title: string\n height: number\n}) {\n return (\n <Tooltip title={title} placement=\"left\">\n <div\n style={{\n height,\n fontSize: 9,\n fontFamily: 'monospace',\n textAlign: 'right',\n paddingRight: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </div>\n </Tooltip>\n )\n}\n\nconst ProteinAlignment = observer(function ProteinAlignment({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n const {\n pairwiseAlignment,\n showHighlight,\n showProteinTracks,\n uniprotId,\n confidenceCells,\n hydrophobicityCells,\n } = model\n const containerRef = useRef<HTMLDivElement>(null)\n const {\n data: featureData,\n isLoading: featureLoading,\n error: featureError,\n } = useProteinFeatureTrackData(model, uniprotId)\n\n useEffect(\n () =>\n autorun(() => {\n const container = containerRef.current\n if (\n model.autoScrollAlignment &&\n !model.isMouseInAlignment &&\n model.alignmentHoverPos !== undefined &&\n container\n ) {\n container.scrollTo({\n left:\n model.alignmentHoverPos * CHAR_WIDTH - container.clientWidth / 2,\n behavior: 'smooth',\n })\n }\n }),\n [model],\n )\n\n if (!pairwiseAlignment) {\n return <div>No pairwiseAlignment</div>\n }\n\n const a0 = pairwiseAlignment.alns[0].seq\n const a1 = pairwiseAlignment.alns[1].seq\n const con = pairwiseAlignment.consensus\n\n return (\n <div>\n <ProteinAlignmentHelpButton model={model} />\n\n <Typography>\n Alignment of the protein structure file's sequence with the\n selected transcript's sequence.{' '}\n {showHighlight ? 'Green is the aligned portion' : null}\n </Typography>\n <div\n style={{\n display: 'flex',\n fontSize: 9,\n fontFamily: 'monospace',\n cursor: 'pointer',\n margin: 8,\n paddingBottom: 8,\n }}\n onMouseEnter={() => {\n model.setIsMouseInAlignment(true)\n }}\n onMouseLeave={() => {\n model.setIsMouseInAlignment(false)\n model.setHoveredPosition(undefined)\n }}\n >\n <div\n style={{\n flexShrink: 0,\n width: LABEL_WIDTH,\n textAlign: 'right',\n paddingRight: 4,\n }}\n >\n <div style={{ height: ROW_HEIGHT }}>\n <Tooltip title=\"This is the sequence of the protein from the reference genome transcript\">\n <span>GENOME</span>\n </Tooltip>\n </div>\n <div style={{ height: ROW_HEIGHT }}> </div>\n <div style={{ height: ROW_HEIGHT }}>\n <Tooltip title=\"This is the sequence of the protein from the structure file\">\n <span>STRUCT</span>\n </Tooltip>\n </div>\n {showProteinTracks ? (\n featureLoading ? (\n <div style={{ height: ROW_HEIGHT, fontSize: 8, color: '#666' }}>\n Loading...\n </div>\n ) : featureError ? (\n <Tooltip\n title={\n featureError instanceof Error\n ? featureError.message\n : 'Error loading features'\n }\n >\n <div style={{ height: ROW_HEIGHT, fontSize: 8, color: 'red' }}>\n Error\n </div>\n </Tooltip>\n ) : featureData ? (\n <ProteinFeatureTrackLabels\n data={featureData}\n labelWidth={LABEL_WIDTH}\n model={model}\n />\n ) : null\n ) : null}\n {showProteinTracks && confidenceCells.length > 0 ? (\n <GutterLabel\n label=\"pLDDT\"\n title=\"AlphaFold per-residue confidence (pLDDT)\"\n height={model.trackHeight + model.trackGap}\n />\n ) : null}\n {showProteinTracks && hydrophobicityCells.length > 0 ? (\n <GutterLabel\n label=\"hydro\"\n title=\"Kyte-Doolittle hydrophobicity (orange hydrophobic, blue hydrophilic)\"\n height={model.trackHeight + model.trackGap}\n />\n ) : null}\n </div>\n <div\n ref={containerRef}\n style={{\n overflow: 'auto',\n whiteSpace: 'nowrap',\n flex: 1,\n paddingBottom: 10,\n backgroundColor: 'white',\n }}\n >\n <div style={{ position: 'relative' }}>\n <AlignmentHighlights\n model={model}\n strLength={a0.length}\n height={ROW_HEIGHT * 3}\n />\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={a0} />\n </div>\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={con} />\n </div>\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={a1} />\n </div>\n </div>\n {showProteinTracks && featureData ? (\n <ProteinFeatureTrackContent data={featureData} model={model} />\n ) : null}\n {showProteinTracks && confidenceCells.length > 0 ? (\n <ResidueValueTrack\n cells={confidenceCells}\n colorFor={plddtColor}\n formatValue={v => `pLDDT ${v.toFixed(0)}`}\n sequenceLength={a0.length}\n model={model}\n />\n ) : null}\n {showProteinTracks && hydrophobicityCells.length > 0 ? (\n <ResidueValueTrack\n cells={hydrophobicityCells}\n colorFor={hydrophobicityColor}\n formatValue={v => `Kyte-Doolittle ${v.toFixed(1)}`}\n sequenceLength={a0.length}\n model={model}\n />\n ) : null}\n </div>\n </div>\n </div>\n )\n})\n\nexport default ProteinAlignment\n", "import React, { useState } from 'react'\n\nimport { LoadingEllipses } from '@jbrowse/core/ui'\nimport TuneIcon from '@mui/icons-material/Tune'\nimport Checkbox from '@mui/material/Checkbox'\nimport IconButton from '@mui/material/IconButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport Menu from '@mui/material/Menu'\nimport MenuItem from '@mui/material/MenuItem'\nimport TextField from '@mui/material/TextField'\nimport Tooltip from '@mui/material/Tooltip'\nimport { observer } from 'mobx-react'\n\nimport AddStructureDialog from './AddStructureDialog'\nimport HeaderStructureInfo from './HeaderStructureInfo'\nimport ProteinAlignment from './ProteinAlignment'\nimport { COLOR_SCHEMES } from '../applyColorTheme'\n\nimport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinViewModel,\n} from '../model'\n\nconst ColorSchemeSelect = observer(function ColorSchemeSelect({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n return (\n <TextField\n select\n size=\"small\"\n label=\"Color\"\n value={model.colorScheme}\n onChange={event => {\n const scheme = COLOR_SCHEMES.find(s => s.value === event.target.value)\n if (scheme) {\n model.setColorScheme(scheme.value)\n }\n }}\n slotProps={{ select: { native: false } }}\n sx={{ minWidth: 180 }}\n >\n {COLOR_SCHEMES.map(scheme => (\n <MenuItem key={scheme.value} value={scheme.value}>\n {scheme.label}\n </MenuItem>\n ))}\n </TextField>\n )\n})\n\nfunction ToggleMenuItem({\n checked,\n label,\n onToggle,\n}: {\n checked: boolean\n label: string\n onToggle: () => void\n}) {\n return (\n <MenuItem\n onClick={() => {\n onToggle()\n }}\n dense\n >\n <ListItemIcon>\n <Checkbox checked={checked} size=\"small\" edge=\"start\" disableRipple />\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n}\n\nfunction getDisplayToggles(model: JBrowsePluginProteinViewModel) {\n return [\n {\n label: 'Show alignment',\n checked: model.showAlignment,\n onToggle: () => {\n model.setShowAlignment(!model.showAlignment)\n },\n },\n {\n label: 'Show features',\n checked: model.showProteinTracks,\n onToggle: () => {\n model.setShowProteinTracks(!model.showProteinTracks)\n },\n },\n {\n label: 'Auto-scroll features',\n checked: model.autoScrollAlignment,\n onToggle: () => {\n model.setAutoScrollAlignment(!model.autoScrollAlignment)\n },\n },\n {\n label: 'Compact tracks',\n checked: model.compactTracks,\n onToggle: () => {\n model.setCompactTracks(!model.compactTracks)\n },\n },\n ]\n}\n\nconst DisplaySettingsMenu = observer(function DisplaySettingsMenu({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n return (\n <>\n <Tooltip title=\"Display settings\">\n <IconButton\n size=\"small\"\n onClick={event => {\n setAnchorEl(event.currentTarget)\n }}\n >\n <TuneIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => {\n setAnchorEl(null)\n }}\n >\n {getDisplayToggles(model).map(toggle => (\n <ToggleMenuItem\n key={toggle.label}\n checked={toggle.checked}\n label={toggle.label}\n onToggle={toggle.onToggle}\n />\n ))}\n </Menu>\n </>\n )\n})\n\nconst ProteinViewHeader = observer(function ProteinViewHeader({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { structures, showAlignment } = model\n return (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <HeaderStructureInfo model={model} />\n <div\n style={{\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <ColorSchemeSelect model={model} />\n <DisplaySettingsMenu model={model} />\n </div>\n </div>\n {showAlignment\n ? structures\n .filter(s => s.pairwiseAlignment || s.alignmentPending)\n .map((structure: JBrowsePluginProteinStructureModel, idx) => (\n <div key={idx}>\n {structure.pairwiseAlignment ? (\n <ProteinAlignment model={structure} />\n ) : (\n <LoadingEllipses message=\"Loading pairwise alignment\" />\n )}\n </div>\n ))\n : null}\n <AddStructureDialog model={model} />\n </div>\n )\n})\n\nexport default ProteinViewHeader\n", "export default `\n.msp-plugin{font-family:Helvetica Neue,Segoe UI,Helvetica,Source Sans Pro,Arial,sans-serif;font-size:14px;line-height:1.42857143;position:absolute;inset:0}.msp-plugin *{box-sizing:border-box}.msp-plugin [hidden],.msp-plugin template{display:none}.msp-plugin a{background-color:transparent}.msp-plugin a:active,.msp-plugin a:hover{outline:0}.msp-plugin abbr[title]{border-bottom:1px dotted}.msp-plugin b,.msp-plugin strong{font-weight:700}.msp-plugin small{font-size:80%}.msp-plugin img{border:0}.msp-plugin svg:not(:root){overflow:hidden}.msp-plugin button,.msp-plugin input,.msp-plugin optgroup,.msp-plugin select,.msp-plugin textarea{color:inherit;font:inherit;margin:0}.msp-plugin button{overflow:visible}.msp-plugin button,.msp-plugin select{text-transform:none}.msp-plugin button,.msp-plugin html input[type=button],.msp-plugin input[type=reset],.msp-plugin input[type=submit]{-webkit-appearance:button;cursor:pointer}.msp-plugin button[disabled],.msp-plugin html input[disabled]{cursor:default}.msp-plugin button::-moz-focus-inner,.msp-plugin input::-moz-focus-inner{border:0;padding:0}.msp-plugin input{line-height:normal}.msp-plugin input[type=checkbox],.msp-plugin input[type=radio]{box-sizing:border-box;padding:0}.msp-plugin input[type=number]::-webkit-inner-spin-button,.msp-plugin input[type=number]::-webkit-outer-spin-button{height:auto}.msp-plugin textarea{overflow:auto}.msp-plugin .msp-layout-expanded,.msp-plugin .msp-layout-standard{inset:0}.msp-plugin .msp-layout-standard{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-region{overflow:hidden}.msp-plugin .msp-layout-static,.msp-plugin .msp-layout-scrollable{position:absolute}.msp-plugin .msp-scrollable{overflow-y:auto}.msp-plugin .msp-scrollable-container{position:absolute;inset:0;overflow-y:auto}.msp-plugin .msp-layout-static{overflow:hidden}.msp-plugin .msp-layout-top .msp-layout-static,.msp-plugin .msp-layout-main .msp-layout-static,.msp-plugin .msp-layout-bottom .msp-layout-static,.msp-plugin .msp-layout-right .msp-layout-static{inset:0}.msp-plugin .msp-layout-right .msp-layout-scrollable{inset:43px 0 0}.msp-plugin .msp-layout-left .msp-layout-static{inset:0}.msp-plugin .msp-layout-standard-outside{position:absolute}.msp-plugin .msp-layout-standard-outside .msp-layout-main{position:absolute;inset:0}.msp-plugin .msp-layout-standard-outside .msp-layout-top{position:absolute;right:0;height:97px;top:-97px;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;top:-97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-right{position:absolute;width:50%;right:0;bottom:-295px;height:295px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-left{position:absolute;width:50%;left:0;bottom:-295px;height:295px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-outside .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-outside .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-landscape{position:absolute}.msp-plugin .msp-layout-standard-landscape .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-standard-landscape .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-top .msp-layout-main{top:0}.msp-plugin .msp-layout-standard-portrait{position:absolute}.msp-plugin .msp-layout-standard-portrait .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-standard-portrait .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-portrait .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-portrait .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}.msp-plugin .msp-layout-standard-reactive{position:absolute}@media(orientation:landscape),(min-width:1000px){.msp-plugin .msp-layout-standard-reactive .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-standard-reactive .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-main{top:0}}@media(orientation:portrait)and (max-width:1000px){.msp-plugin .msp-layout-standard-reactive .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-standard-reactive .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}}.msp-plugin .msp-layout-expanded{position:fixed}@media(orientation:landscape){.msp-plugin .msp-layout-expanded .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-expanded .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-main{top:0}}@media(orientation:portrait){.msp-plugin .msp-layout-expanded .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-expanded .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}}.msp-plugin ::-webkit-scrollbar{width:10px;height:10px}.msp-plugin ::-webkit-scrollbar-track{border-radius:0;background-color:#e9e6e0}.msp-plugin ::-webkit-scrollbar-thumb{border-radius:10px;background-color:#beb7a4;border:solid 1px transparent;background-clip:content-box}.msp-plugin .msp-form-control,.msp-plugin .msp-control-row select,.msp-plugin .msp-control-row button,.msp-plugin .msp-control-row input[type=text],.msp-plugin .msp-btn{display:block;width:100%;background:#f3f2ee;border:none;padding:0 10px;line-height:30px;height:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-box-shadow:none;box-shadow:none;background-image:none}.msp-plugin .msp-form-control::-moz-placeholder,.msp-plugin .msp-control-row select::-moz-placeholder,.msp-plugin .msp-control-row button::-moz-placeholder,.msp-plugin .msp-control-row input[type=text]::-moz-placeholder,.msp-plugin .msp-btn::-moz-placeholder{color:#9c835f;opacity:1}.msp-plugin .msp-form-control:-ms-input-placeholder,.msp-plugin .msp-control-row select:-ms-input-placeholder,.msp-plugin .msp-control-row button:-ms-input-placeholder,.msp-plugin .msp-control-row input[type=text]:-ms-input-placeholder,.msp-plugin .msp-btn:-ms-input-placeholder{color:#9c835f}.msp-plugin .msp-form-control::-webkit-input-placeholder,.msp-plugin .msp-control-row select::-webkit-input-placeholder,.msp-plugin .msp-control-row button::-webkit-input-placeholder,.msp-plugin .msp-control-row input[type=text]::-webkit-input-placeholder,.msp-plugin .msp-btn::-webkit-input-placeholder{color:#9c835f}.msp-plugin .msp-form-control:hover,.msp-plugin .msp-control-row select:hover,.msp-plugin .msp-control-row button:hover,.msp-plugin .msp-control-row input[type=text]:hover,.msp-plugin .msp-btn:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-form-control:active,.msp-plugin .msp-control-row select:active,.msp-plugin .msp-control-row button:active,.msp-plugin .msp-control-row input[type=text]:active,.msp-plugin .msp-btn:active,.msp-plugin .msp-form-control:focus,.msp-plugin .msp-control-row select:focus,.msp-plugin .msp-control-row button:focus,.msp-plugin .msp-control-row input[type=text]:focus,.msp-plugin .msp-btn:focus{color:#332b1f;background-color:#f3f2ee;border:none;outline-offset:0;outline:none}.msp-plugin .msp-form-control[disabled],.msp-plugin .msp-control-row select[disabled],.msp-plugin .msp-control-row button[disabled],.msp-plugin .msp-control-row input[disabled][type=text],.msp-plugin [disabled].msp-btn,.msp-plugin .msp-form-control[readonly],.msp-plugin .msp-control-row select[readonly],.msp-plugin .msp-control-row button[readonly],.msp-plugin .msp-control-row input[readonly][type=text],.msp-plugin [readonly].msp-btn,fieldset[disabled] .msp-plugin .msp-form-control,fieldset[disabled] .msp-plugin .msp-control-row select,fieldset[disabled] .msp-plugin .msp-control-row button,fieldset[disabled] .msp-plugin .msp-control-row input[type=text],fieldset[disabled] .msp-plugin .msp-btn{background:#eeece7;opacity:.35}.msp-plugin .msp-btn,.msp-plugin .msp-control-row button{display:inline-block;margin-bottom:0;text-align:center;touch-action:manipulation;cursor:pointer;background-image:none;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0 10px;line-height:32px;border:none;-moz-box-sizing:border-box;box-sizing:border-box}.msp-plugin .msp-btn[disabled],.msp-plugin .msp-control-row button[disabled]{background:#eeece7;opacity:.35}.msp-plugin .msp-btn-block,.msp-plugin .msp-control-row button{display:block;width:100%}.msp-plugin .msp-btn,.msp-plugin .msp-control-row button,.msp-plugin .msp-btn:active,.msp-plugin .msp-btn-link:focus,.msp-plugin .msp-btn:hover{outline:none}.msp-plugin .msp-material-icon svg{display:inline-flex;vertical-align:middle;font-size:1.2em;margin-bottom:3px;fill:currentColor;width:1em;height:1em;flex-shrink:0;user-select:none}.msp-plugin .msp-btn-block>.msp-material-icon,.msp-plugin .msp-control-row button>.msp-material-icon{margin-left:0;margin-right:.4em}.msp-plugin .msp-btn-childless>.msp-material-icon{margin-left:0;margin-right:0}.msp-plugin .msp-btn-icon{border:none;height:32px;width:32px;line-height:32px;padding:0;text-align:center}.msp-plugin .msp-btn-icon:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-btn-icon[disabled],.msp-plugin .msp-btn-icon[disabled]:hover,.msp-plugin .msp-btn-icon[disabled]:active{color:#9c835f}.msp-plugin .msp-btn-icon-small{border:none;height:32px;width:20px;line-height:32px;padding:0;text-align:center}.msp-plugin .msp-btn-icon-small:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-btn-icon-small[disabled],.msp-plugin .msp-btn-icon-small[disabled]:hover,.msp-plugin .msp-btn-icon-small[disabled]:active{color:#9c835f}.msp-plugin .msp-btn-link{font-weight:400;border-radius:0}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:active,.msp-plugin .msp-btn-link.active,.msp-plugin .msp-btn-link[disabled],fieldset[disabled] .msp-plugin .msp-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:hover,.msp-plugin .msp-btn-link:focus,.msp-plugin .msp-btn-link:active{border-color:transparent}.msp-plugin .msp-btn-link:hover,.msp-plugin .msp-btn-link:focus{text-decoration:none;background-color:transparent}.msp-plugin .msp-btn-link[disabled]:hover,.msp-plugin .msp-btn-link[disabled]:focus,fieldset[disabled] .msp-plugin .msp-btn-link:hover,fieldset[disabled] .msp-plugin .msp-btn-link:focus{text-decoration:none}.msp-plugin .msp-btn-link .msp-icon{font-size:100%}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:active,.msp-plugin .msp-btn-link:focus{color:#332b1f;text-decoration:none}.msp-plugin .msp-btn-link:hover{color:#ae5d04;text-decoration:none}.msp-plugin .msp-btn-link-toggle-on{color:#332b1f}.msp-plugin .msp-btn-link-toggle-off,.msp-plugin .msp-btn-link-toggle-off:active,.msp-plugin .msp-btn-link-toggle-off:focus{color:#9c835f!important}.msp-plugin .msp-btn-link-toggle-on:hover{color:#ae5d04!important}.msp-plugin .msp-btn-link-toggle-off:hover{color:#dc9c56!important}.msp-plugin .msp-btn-action,.msp-plugin .msp-btn-action:active,.msp-plugin .msp-btn-action:focus{color:#332b1f;background:#f3f2ee}.msp-plugin .msp-btn-action:hover{color:#ae5d04;background:#f9f8f6}.msp-plugin .msp-btn-action[disabled],.msp-plugin .msp-btn-action[disabled]:hover,.msp-plugin .msp-btn-action[disabled]:active,.msp-plugin .msp-btn-action[disabled]:focus{color:#362e21}.msp-plugin .msp-btn-commit-on,.msp-plugin .msp-btn-commit-on:active,.msp-plugin .msp-btn-commit-on:focus{color:#974102;background:#f2f1ed}.msp-plugin .msp-btn-commit-on:hover{color:#ae5d04;background:#f8f7f4}.msp-plugin .msp-btn-commit-on[disabled],.msp-plugin .msp-btn-commit-on[disabled]:hover,.msp-plugin .msp-btn-commit-on[disabled]:active,.msp-plugin .msp-btn-commit-on[disabled]:focus{color:#9c4302}.msp-plugin .msp-btn-commit-off,.msp-plugin .msp-btn-commit-off:active,.msp-plugin .msp-btn-commit-off:focus{color:#332b1f;background:#f6f5f3}.msp-plugin .msp-btn-commit-off:hover{color:#ae5d04;background:#fcfbfa}.msp-plugin .msp-btn-commit-off[disabled],.msp-plugin .msp-btn-commit-off[disabled]:hover,.msp-plugin .msp-btn-commit-off[disabled]:active,.msp-plugin .msp-btn-commit-off[disabled]:focus{color:#362e21}.msp-plugin .msp-btn-remove:hover{color:#f2f4f7}.msp-plugin .msp-btn-commit-on:hover{color:#fc6c03}.msp-plugin .msp-select-toggle:after{content:\"\";position:absolute;right:.75rem;top:50%;transform:translateY(-50%);width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:7px solid #ae5d04;opacity:0;pointer-events:none}.msp-plugin .msp-select-toggle:hover:after{opacity:1}.msp-plugin .msp-btn-action{height:32px;line-height:32px}.msp-plugin input[type=file]{display:block}.msp-plugin input[type=range]{display:block;width:100%}.msp-plugin select[multiple],.msp-plugin select[size],.msp-plugin textarea.msp-form-control,.msp-plugin textarea.msp-btn{height:auto}.msp-plugin .msp-control-top-offset{margin-top:1px}.msp-plugin .msp-btn-commit{text-align:right;padding:0 10px 0 0;line-height:32px;border:none;overflow:hidden;font-weight:700}.msp-plugin .msp-btn-commit .msp-icon{display:block-inline;line-height:32px;width:32px;text-align:center}.msp-plugin select.msp-form-control,.msp-plugin .msp-control-row select,.msp-plugin select.msp-btn{background:none;background-color:#f3f2ee;background-size:8px 12px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right 10px center;padding-right:24px}.msp-plugin select.msp-form-control:-moz-focusring,.msp-plugin .msp-control-row select:-moz-focusring,.msp-plugin select.msp-btn:-moz-focusring{color:transparent;text-shadow:0 0 0 #332b1f}.msp-plugin .msp-default-bg{background:#eeece7}.msp-plugin .msp-transparent-bg{background:transparent}.msp-plugin .msp-no-hover-outline:hover{color:#ae5d04;background-color:inherit;border:none;outline-offset:0!important;outline:none!important}.msp-plugin .msp-icon-inline{margin-right:8px}.msp-plugin .msp-control-row{position:relative;height:32px;background:#eeece7;margin-top:1px}.msp-plugin .msp-control-row>span.msp-control-row-label,.msp-plugin .msp-control-row>button.msp-control-button-label{line-height:32px;display:block;width:120px;text-align:right;padding:0 10px;color:#63533c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-control-row>button.msp-control-button-label{background:#eeece7;cursor:pointer}.msp-plugin .msp-control-row .msp-control-current{background:#eeece7}.msp-plugin .msp-control-row>div.msp-control-row-ctrl{position:absolute;inset:0 0 0 120px}.msp-plugin .msp-control-row>div.msp-control-row-text{position:absolute;inset:0 0 0 120px;display:flex;align-items:center;padding:0 10px}.msp-plugin .msp-control-row>div{background:#f3f2ee}.msp-plugin .msp-control-row>.msp-flex-row,.msp-plugin .msp-control-row>.msp-state-image-row{background:#eeece7}.msp-plugin .msp-control-label-short>span{width:80px!important}.msp-plugin .msp-control-label-short>div:nth-child(2){left:80px!important}.msp-plugin .msp-control-col-2{float:left;width:50%}.msp-plugin .msp-control-twoline{height:64px!important}.msp-plugin .msp-control-group{position:relative}.msp-plugin .msp-toggle-button .msp-icon{display:inline-block;margin-right:6px}.msp-plugin .msp-toggle-button>div>button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-slider>div:first-child{position:absolute;inset:0 62px 0 18px;display:flex}.msp-plugin .msp-slider>div:last-child{position:absolute;height:32px;line-height:32px;text-align:center;right:0;width:50px;top:0;bottom:0}.msp-plugin .msp-slider-no-input>div:first-child{right:18px}.msp-plugin .msp-slider-no-input>div:last-child{visibility:hidden;width:0}.msp-plugin .msp-slider input[type=text]{padding-right:6px;padding-left:4px;font-size:80%;text-align:right}.msp-plugin .msp-slider2>div:first-child{position:absolute;height:32px;line-height:32px;text-align:center;left:0;width:25px;top:0;bottom:0;font-size:80%}.msp-plugin .msp-slider2>div:nth-child(2){position:absolute;inset:0 37px 0 35px;display:flex}.msp-plugin .msp-slider2>div:last-child{position:absolute;height:32px;line-height:32px;text-align:center;right:0;width:25px;top:0;bottom:0;font-size:80%}.msp-plugin .msp-slider2 input[type=text]{padding-right:4px;padding-left:4px;font-size:80%;text-align:center}.msp-plugin .msp-toggle-color-picker button{border:10px solid rgb(243.2865853659,241.9085365854,238.4634146341)!important;margin:0;text-align:center;padding-right:10px;padding-left:10px}.msp-plugin .msp-toggle-color-picker button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-toggle-color-picker .msp-color-picker{position:absolute;z-index:100000;background:#eeece7;border-top:1px solid #eeece7;padding-bottom:5px;width:100%}.msp-plugin .msp-toggle-color-picker-above .msp-color-picker{top:-85px;height:85px}.msp-plugin .msp-toggle-color-picker-below .msp-color-picker{top:32px;height:80px}.msp-plugin .msp-control-offset{padding-left:10px}.msp-plugin .msp-accent-offset{padding-left:1px;margin-left:8px;border-left:2px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-control-group-wrapper{margin-bottom:0;margin-top:1px}.msp-plugin .msp-control-group-header{background:#eeece7}.msp-plugin .msp-control-group-header>button,.msp-plugin .msp-control-group-header div{padding-left:4px;text-align:left;height:24px!important;line-height:24px!important;font-size:85%!important;background:#eeece7!important;color:#63533c}.msp-plugin .msp-control-group-header .msp-icon{height:24px!important;line-height:24px!important}.msp-plugin .msp-control-group-header>span{padding-left:5px;line-height:21.3333333333px;font-size:70%;background:#eeece7;color:#63533c}.msp-plugin .msp-control-current{background:#eeece7}.msp-plugin .msp-control-group-footer{background:#e3e0d8;height:5px;font-size:1px;margin-top:1px}.msp-plugin .msp-control-group-expander{display:block;position:absolute;line-height:32px;padding:0;left:0;top:0;width:120px;text-align:left;background:transparent}.msp-plugin .msp-control-group-expander .msp-icon{line-height:29px;width:31px;text-align:center;font-size:100%}.msp-plugin .msp-plugin-layout_controls{position:absolute;left:10px;top:10px}.msp-plugin .msp-plugin-layout_controls>button:first-child{margin-right:6px}.msp-plugin .msp-empty-control{display:none}.msp-plugin .msp-control .msp-btn-block,.msp-plugin .msp-control .msp-control-row button,.msp-plugin .msp-control-row .msp-control button{margin-bottom:0;margin-top:0}.msp-plugin .msp-row-text{height:32px;position:relative;background:#eeece7;margin-top:1px}.msp-plugin .msp-row-text>div{line-height:32px;text-align:center;color:#63533c}.msp-plugin .msp-help span{display:none}.msp-plugin .msp-help:hover span{display:inline-block;background:linear-gradient(#eeece7,#eeece7cc)}.msp-plugin .msp-help-text{position:relative;background:#eeece7;margin-top:1px}.msp-plugin .msp-help-text>div{padding:5px 10px;text-align:left;color:#63533c}.msp-plugin .msp-help-text>p{padding:5px 10px;text-align:left;color:#63533c}.msp-plugin .msp-help-description{font-style:italic}.msp-plugin .msp-help-legend{padding-top:10px}.msp-plugin .msp-scale-legend>div{width:100%;height:30px}.msp-plugin .msp-scale-legend>div>span{padding:5px;color:#fff;font-weight:700;background-color:#0003}.msp-plugin .msp-table-legend>div{margin-right:5px;display:inline-flex}.msp-plugin .msp-table-legend>div .msp-table-legend-color{width:30px;height:20px}.msp-plugin .msp-table-legend>div .msp-table-legend-text{margin:0 5px}.msp-plugin .msp-image-preview{position:relative;background:#eeece7;margin-top:1px;padding:10px}.msp-plugin .msp-image-preview canvas{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.msp-plugin .msp-image-preview>span{margin-top:6px;display:block;text-align:center;font-size:80%;line-height:15px}.msp-plugin .msp-copy-image-wrapper{position:relative}.msp-plugin .msp-copy-image-wrapper div{font-weight:700;padding:3px;margin:1px 0;width:100%;background:#f3f2ee;text-align:center}.msp-plugin .msp-copy-image-wrapper img{margin-top:1px}.msp-plugin .msp-control-text-area-wrapper,.msp-plugin .msp-text-area-wrapper{position:relative}.msp-plugin .msp-control-text-area-wrapper textarea,.msp-plugin .msp-text-area-wrapper textarea{border:none;width:100%;height:100%;background:#f3f2ee;padding:5px 10px;resize:none;font-size:12px;line-height:16px}.msp-plugin .msp-control-text-area-wrapper{height:64px!important}.msp-plugin .msp-text-area-wrapper{height:96px!important}.msp-plugin .msp-help-row{position:relative;height:32px;background:#eeece7;margin-top:1px;display:table;width:100%}.msp-plugin .msp-help-row>span{width:120px;text-align:right;padding:3px 10px;color:#63533c;display:table-cell;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-help-row>div{background:#f3f2ee;position:relative;padding:3px 10px;display:table-cell}.msp-plugin .msp-canvas{width:100%;height:100%;background-color:#f3f2ee}.msp-plugin .msp-canvas text{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.msp-plugin .msp-canvas circle{stroke:#000;stroke-width:10;stroke-opacity:.3}.msp-plugin .msp-canvas circle:hover{fill:#ae5d04;stroke:#000;stroke-width:10px}.msp-plugin .msp-canvas .info{fill:#fff;stroke:#000;stroke-width:3}.msp-plugin .msp-canvas .show{visibility:visible}.msp-plugin .msp-canvas .hide{visibility:hidden}.msp-plugin .msp-canvas .delete-button rect{fill:#ed4337;stroke:#000}.msp-plugin .msp-canvas .delete-button text{stroke:#fff;fill:#fff}.msp-plugin .msp-canvas .delete-button:hover{stroke:#000;stroke-width:3;fill:#ff6961}.msp-plugin .msp-canvas .infoCircle:hover{fill:#4c66b2}.msp-plugin .msp-canvas:focus{outline:none}.msp-plugin .msp-log-wrap{position:absolute;inset:0;overflow:hidden}.msp-plugin .msp-log{position:absolute;inset:0 -20px 0 0;overflow-y:scroll;overflow-x:hidden;font-size:90%;background:#e0ddd4}.msp-plugin .msp-log{font-size:90%}.msp-plugin .msp-log ul{padding:0;margin:0}.msp-plugin .msp-log{color:#433829}.msp-plugin .msp-log li{clear:both;margin:0;background:#eeece7;position:relative}.msp-plugin .msp-log li:not(:last-child){border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-log .msp-log-entry{margin-left:110px;background:#ebe8e3;padding:3px 25px 3px 10px}.msp-plugin .msp-log .msp-log-timestamp{padding:3px 10px;float:left;text-align:right;width:110px;color:#726046;font-size:100%}.msp-plugin .msp-log .msp-log-timestamp small{font-size:100%}.msp-plugin .msp-log .label{margin-top:-3px;font-size:7pt}.msp-plugin .msp-log-entry-badge{position:absolute;left:0;top:0;bottom:0;width:6px}.msp-plugin .msp-log-entry-message{background:#0cca5d}.msp-plugin .msp-log-entry-info{background:#5e3673}.msp-plugin .msp-log-entry-error{background:#fd354b}.msp-plugin .msp-log-entry-warning{background:#fcc937}.msp-plugin .msp-slider-base{position:relative;height:14px;padding:5px 0;width:100%;border-radius:6px;align-self:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.msp-plugin .msp-slider-base *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.msp-plugin .msp-slider-base-rail{position:absolute;width:100%;background-color:#e0ddd4;height:4px;border-radius:2px}.msp-plugin .msp-slider-base-track{position:absolute;left:0;height:4px;border-radius:6px;background-color:tint(#332b1f,60%)}.msp-plugin .msp-slider-base-handle{position:absolute;margin-left:-11px;margin-top:-9px;width:22px;height:22px;cursor:pointer;border-radius:50%;background-color:#332b1f;border:4px solid rgb(224.2548780488,220.637804878,211.5951219512)}.msp-plugin .msp-slider-base-handle:hover{background-color:#ae5d04}.msp-plugin .msp-slider-base-mark{position:absolute;top:18px;left:0;width:100%;font-size:12px}.msp-plugin .msp-slider-base-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:#999}.msp-plugin .msp-slider-base-mark-text-active{color:#666}.msp-plugin .msp-slider-base-step{position:absolute;width:100%;height:4px;background:transparent}.msp-plugin .msp-slider-base-dot{position:absolute;bottom:-2px;margin-left:-4px;width:8px;height:8px;border:2px solid #e9e9e9;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.msp-plugin .msp-slider-base-dot:first-child{margin-left:-4px}.msp-plugin .msp-slider-base-dot:last-child{margin-left:-4px}.msp-plugin .msp-slider-base-dot-active{border-color:tint(#332b1f,50%)}.msp-plugin .msp-slider-base-disabled{background:#eeece7;opacity:.35}.msp-plugin .msp-slider-base-disabled .msp-slider-base-handle,.msp-plugin .msp-slider-base-disabled .msp-slider-base-dot{cursor:not-allowed}.msp-plugin .msp-slider-base-disabled .msp-slider-base-mark-text,.msp-plugin .msp-slider-base-disabled .msp-slider-base-dot{cursor:not-allowed!important}.msp-plugin .msp-markdown table{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-collapse:collapse}.msp-plugin .msp-markdown th{text-align:left}.msp-plugin .msp-markdown th,.msp-plugin .msp-markdown td{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);padding:4px 8px}.msp-plugin .msp-markdown img{max-width:100%;height:auto}.msp-plugin .msp-description{padding:10px;font-size:85%;background:#eeece7;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;font-weight:light;cursor:default}.msp-plugin .msp-description:not(:first-child){border-top:1px solid rgb(224.2548780488,220.637804878,211.5951219512)}.msp-plugin .msp-color-picker input{color:#000!important}.msp-plugin .msp-no-webgl{position:absolute;width:100%;height:100%;left:0;top:0;display:table;text-align:center;background:#eeece7}.msp-plugin .msp-no-webgl>div b{font-size:120%}.msp-plugin .msp-no-webgl>div{display:table-cell;vertical-align:middle;text-align:center;width:100%;height:100%}.msp-plugin .msp-loader-msp-btn-file{position:relative;overflow:hidden}.msp-plugin .msp-loader-msp-btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;outline:none;background:#fff;cursor:inherit;display:block}.msp-plugin .msp-controls-section{margin-bottom:10px}.msp-plugin .msp-combined-color-button{border:4px solid rgb(243.2865853659,241.9085365854,238.4634146341)!important;margin:0;text-align:center;padding-right:10px;padding-left:10px}.msp-plugin .msp-combined-color-button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-combined-color-swatch{width:100%;display:grid;grid-gap:1px;grid-template-columns:repeat(6,auto)}.msp-plugin .msp-combined-color-swatch .msp-btn:hover,.msp-plugin .msp-combined-color-swatch .msp-control-row button:hover,.msp-plugin .msp-control-row .msp-combined-color-swatch button:hover{outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-action-select{position:relative}.msp-plugin .msp-action-select select{padding-left:42px}.msp-plugin .msp-action-select option:first-child{color:#63533c}.msp-plugin .msp-action-select>.msp-icon{display:block;top:0;left:10px;position:absolute;line-height:32px}.msp-plugin .msp-simple-help-section{height:28px;line-height:28px;margin-top:5px;margin-bottom:5px;padding:0 10px;font-weight:500;background:#eeece7;color:#332b1f}.msp-plugin .msp-left-panel-controls-buttons{position:absolute;width:32px;top:0;bottom:0;padding-top:10px;background:#eeece7}.msp-plugin .msp-left-panel-controls-buttons-bottom{position:absolute;bottom:0}.msp-plugin .msp-left-panel-controls-button-data-dirty{position:absolute;width:6px;height:6px;background:#e98b39;border-radius:3px;right:6px;bottom:6px}.msp-plugin .msp-left-panel-controls .msp-scrollable-container{left:33px}.msp-plugin .msp-mapped-parameter-group{position:relative}.msp-plugin .msp-mapped-parameter-group>.msp-control-row:first-child>div:nth-child(2){right:33px}.msp-plugin .msp-mapped-parameter-group>button:first-child{right:33px}.msp-plugin .msp-mapped-parameter-group>.msp-btn-icon{position:absolute;right:0;width:32px;top:0;padding:0}.msp-plugin .msp-shape-filled{fill:#332b1f;stroke:#332b1f}.msp-plugin .msp-shape-empty{fill:none;stroke:#332b1f}.msp-plugin .msp-no-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.msp-plugin .msp-25-lower-contrast-text{color:#826e4f}.msp-plugin .msp-expandable-group-color-stripe{position:absolute;left:0;top:30px;width:120px;height:2px}.msp-plugin .msp-section-header{height:32px;line-height:32px;margin-top:10px;margin-bottom:10px;text-align:right;padding:0 10px;font-weight:700;background:#eeece7;overflow:hidden;cursor:default}.msp-plugin .msp-section-header>.msp-icon{display:block;float:left}.msp-plugin .msp-section-header>small{font-weight:400}.msp-plugin .msp-current-header{height:32px;line-height:32px;margin-bottom:10px;text-align:center;font-weight:700;background:#eeece7}.msp-plugin .msp-flex-row,.msp-plugin .msp-state-image-row{margin-top:1px;background:#eeece7;display:flex;flex-direction:row;width:inherit;height:32px}.msp-plugin .msp-flex-row>.msp-flex-item,.msp-plugin .msp-state-image-row>.msp-flex-item{margin:0 1px 0 0;flex:1 1 auto;overflow:hidden}.msp-plugin .msp-flex-row>.msp-flex-item:last-child,.msp-plugin .msp-state-image-row>.msp-flex-item:last-child{margin-right:0}.msp-plugin .msp-flex-row>select,.msp-plugin .msp-state-image-row>select,.msp-plugin .msp-flex-row>button,.msp-plugin .msp-state-image-row>button{margin:0 1px 0 0;flex:1 1 auto;height:32px;overflow:hidden}.msp-plugin .msp-flex-row .msp-btn-icon,.msp-plugin .msp-state-image-row .msp-btn-icon,.msp-plugin .msp-flex-row .msp-btn-icon-small,.msp-plugin .msp-state-image-row .msp-btn-icon-small{flex:0 0 32px;max-width:32px}.msp-plugin .msp-flex-row>select,.msp-plugin .msp-state-image-row>select{background:none}.msp-plugin .msp-flex-row>select>option[value=_],.msp-plugin .msp-state-image-row>select>option[value=_]{display:none}.msp-plugin .msp-flex-row>select:last-child,.msp-plugin .msp-state-image-row>select:last-child,.msp-plugin .msp-flex-row>button:last-child,.msp-plugin .msp-state-image-row>button:last-child{margin-right:0}.msp-plugin .msp-flex-row>button.msp-control-button-label,.msp-plugin .msp-state-image-row>button.msp-control-button-label{background:#eeece7}.msp-plugin .msp-state-list{list-style:none}.msp-plugin .msp-state-list>li{position:relative;overflow:hidden}.msp-plugin .msp-state-list>li>button:first-child{text-align:left;border-left:10px solid rgb(212.6243902439,207.6390243902,195.1756097561)!important}.msp-plugin .msp-state-list>li>div{position:absolute;right:0;top:0}.msp-plugin .msp-state-image-row{height:96px;margin-top:0}.msp-plugin .msp-state-image-row>button{height:96px;padding:0}.msp-plugin .msp-state-image-row>button>img{min-height:96px;width:inherit;transform:translateY(-50%);top:50%;position:relative}.msp-plugin .msp-tree-row{position:relative;margin-top:0;margin-bottom:1px;background:transparent}.msp-plugin .msp-tree-row-current .msp-btn-tree-label>span{font-weight:700}.msp-plugin .msp-tree-row-current .msp-btn-tree-label{border-radius:0!important}.msp-plugin .msp-tree-row .msp-btn-tree-label{text-align:left;border-radius:0 0 0 8px;border-left-width:4px;border-left-style:solid}.msp-plugin .msp-tree-row .msp-btn-tree-label>small{color:#726046}.msp-plugin .msp-tree-updates-wrapper .msp-control-group-header:last-child{margin-bottom:1px}.msp-plugin .msp-viewport-top-left-controls{position:absolute;left:10px;top:10px}.msp-plugin .msp-viewport-top-left-controls .msp-traj-controls{line-height:32px;float:left;margin-right:10px;background-color:#f3f2ee}.msp-plugin .msp-viewport-top-left-controls .msp-traj-controls>span{color:#332b1f;margin-left:10px;margin-right:10px;font-size:85%;display:inline-block}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls{line-height:32px;float:left;margin-right:10px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls>button{background-color:#f3f2ee}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls>select{display:inline-block;width:200px;margin-right:10px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-animation-slider{position:relative;display:inline-block;width:120px;line-height:32px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-animation-button{margin-left:10px}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls{line-height:32px;float:left;margin-right:10px;position:relative}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls>div:first-child{position:relative;display:inline-block}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls>div:first-child>button{position:relative}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls .msp-animation-viewport-controls-select{width:290px;position:absolute;left:0;margin-top:10px;background:#e0ddd4;z-index:10001}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls .msp-animation-viewport-controls-select .msp-control-row:first-child{margin-top:0}.msp-plugin .msp-selection-viewport-controls{position:relative;margin:10px auto 0;width:430px}.msp-plugin .msp-selection-viewport-controls-actions{position:absolute;width:100%;top:32px;background:#e0ddd4}.msp-plugin .msp-selection-viewport-controls>.msp-flex-row .msp-btn,.msp-plugin .msp-selection-viewport-controls>.msp-state-image-row .msp-btn,.msp-plugin .msp-selection-viewport-controls>.msp-flex-row .msp-control-row button,.msp-plugin .msp-control-row .msp-selection-viewport-controls>.msp-flex-row button,.msp-plugin .msp-selection-viewport-controls>.msp-state-image-row .msp-control-row button,.msp-plugin .msp-control-row .msp-selection-viewport-controls>.msp-state-image-row button{padding:0 5px}.msp-plugin .msp-selection-viewport-controls select.msp-form-control,.msp-plugin .msp-selection-viewport-controls select.msp-btn,.msp-plugin .msp-selection-viewport-controls .msp-control-row select,.msp-plugin .msp-control-row .msp-selection-viewport-controls select{padding:0 5px;text-align:center;background:#f3f2ee;flex:0 0 80px;text-overflow:ellipsis}.msp-plugin .msp-param-object-list-item{margin-top:1px;position:relative}.msp-plugin .msp-param-object-list-item>button{text-align:left}.msp-plugin .msp-param-object-list-item>button>span{font-weight:700}.msp-plugin .msp-param-object-list-item>div{position:absolute;right:0;top:0}.msp-plugin .msp-state-actions .msp-transform-wrapper:last-child{margin-bottom:10px}.msp-plugin .msp-button-row{display:flex;flex-direction:row;height:32px;width:inherit}.msp-plugin .msp-button-row>button{margin:0 1px 0 0;flex:1 1 auto;height:32px;text-align-last:center;background:none;padding:0 10px;overflow:hidden}.msp-plugin .msp-action-menu-options-no-header,.msp-plugin .msp-action-menu-options .msp-control-group-children{max-height:300px;overflow:hidden;overflow-y:auto}.msp-plugin .msp-action-menu-options .msp-control-row,.msp-plugin .msp-action-menu-options button,.msp-plugin .msp-action-menu-options .msp-icon,.msp-plugin .msp-action-menu-options .msp-flex-row,.msp-plugin .msp-action-menu-options .msp-state-image-row{height:24px;line-height:24px}.msp-plugin .msp-action-menu-options button{text-align:left}.msp-plugin .msp-action-menu-options .msp-action-menu-button{margin-top:1px;display:flex}.msp-plugin .msp-action-menu-options .msp-action-menu-button .msp-icon{margin-right:6px}.msp-plugin .msp-representation-entry{position:relative}.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-btn,.msp-plugin .msp-control-row .msp-representation-entry>.msp-control-group-header>button{font-weight:700}.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-icon,.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-btn-link{line-height:24px;height:24px}.msp-plugin .msp-control-group-presets-wrapper{position:absolute;right:0;top:0}.msp-plugin .msp-control-group-presets-wrapper .msp-control-group-header{background:transparent}.msp-plugin .msp-control-group-presets-wrapper button{background:transparent!important}.msp-plugin .msp-parameter-matrix input{flex:1 1 auto;min-width:0}.msp-plugin .msp-btn-apply-simple{text-align:left}.msp-plugin .msp-btn-apply-simple .msp-icon{margin-right:10px}.msp-plugin .msp-type-class-Root{border-left-color:#eeece7}.msp-plugin .msp-type-class-Group{border-left-color:#e98b39}.msp-plugin .msp-type-class-Data{border-left-color:#bfc8c9}.msp-plugin .msp-type-class-Object{border-left-color:#54d98c}.msp-plugin .msp-type-class-Representation3D{border-left-color:#4aa3df}.msp-plugin .msp-type-class-Behavior{border-left-color:#b07cc6}.msp-plugin .msp-accent-color-cyan{color:#bfc8c9}.msp-plugin .msp-accent-bg-cyan{background:#bfc8c9}.msp-plugin .msp-transform-header-brand-cyan{border-bottom:1px solid rgb(190.5846153846,200.3076923077,200.9153846154)}.msp-plugin .msp-transform-header-brand-cyan:active,.msp-plugin .msp-transform-header-brand-cyan:focus{border-bottom:1px solid rgb(190.5846153846,200.3076923077,200.9153846154)}.msp-plugin .msp-accent-color-red{color:#ef8b80}.msp-plugin .msp-accent-bg-red{background:#ef8b80}.msp-plugin .msp-transform-header-brand-red{border-bottom:1px solid rgb(239.3835616438,138.5273972603,128.1164383562)}.msp-plugin .msp-transform-header-brand-red:active,.msp-plugin .msp-transform-header-brand-red:focus{border-bottom:1px solid rgb(239.3835616438,138.5273972603,128.1164383562)}.msp-plugin .msp-accent-color-gray{color:#46637f}.msp-plugin .msp-accent-bg-gray{background:#46637f}.msp-plugin .msp-transform-header-brand-gray{border-bottom:1px solid rgb(70.1643835616,98.5,126.8356164384)}.msp-plugin .msp-transform-header-brand-gray:active,.msp-plugin .msp-transform-header-brand-gray:focus{border-bottom:1px solid rgb(70.1643835616,98.5,126.8356164384)}.msp-plugin .msp-accent-color-green{color:#54d98c}.msp-plugin .msp-accent-bg-green{background:#54d98c}.msp-plugin .msp-transform-header-brand-green{border-bottom:1px solid rgb(84.456,216.544,140.468)}.msp-plugin .msp-transform-header-brand-green:active,.msp-plugin .msp-transform-header-brand-green:focus{border-bottom:1px solid rgb(84.456,216.544,140.468)}.msp-plugin .msp-accent-color-purple{color:#b07cc6}.msp-plugin .msp-accent-bg-purple{background:#b07cc6}.msp-plugin .msp-transform-header-brand-purple{border-bottom:1px solid rgb(176.3389121339,124.4225941423,197.5774058577)}.msp-plugin .msp-transform-header-brand-purple:active,.msp-plugin .msp-transform-header-brand-purple:focus{border-bottom:1px solid rgb(176.3389121339,124.4225941423,197.5774058577)}.msp-plugin .msp-accent-color-blue{color:#4aa3df}.msp-plugin .msp-accent-bg-blue{background:#4aa3df}.msp-plugin .msp-transform-header-brand-blue{border-bottom:1px solid rgb(73.6589958159,162.989539749,222.8410041841)}.msp-plugin .msp-transform-header-brand-blue:active,.msp-plugin .msp-transform-header-brand-blue:focus{border-bottom:1px solid rgb(73.6589958159,162.989539749,222.8410041841)}.msp-plugin .msp-accent-color-orange{color:#e98b39}.msp-plugin .msp-accent-bg-orange{background:#e98b39}.msp-plugin .msp-transform-header-brand-orange{border-bottom:1px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-transform-header-brand-orange:active,.msp-plugin .msp-transform-header-brand-orange:focus{border-bottom:1px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-volume-channel-inline-controls>:first-child{position:absolute;left:0;top:0;height:32px;right:32px}.msp-plugin .msp-volume-channel-inline-controls .msp-slider>div:first-child{right:42px}.msp-plugin .msp-volume-channel-inline-controls .msp-slider>div:last-child{width:30px}.msp-plugin .msp-volume-channel-inline-controls>button{position:absolute;right:0;width:32px;top:0;padding:0}.msp-plugin .msp-volume-channel-inline-controls>button .msp-material-icon{margin-right:0}.msp-plugin .msp-list-unstyled{padding-left:0;list-style:none}.msp-plugin .msp-drag-drop-overlay{border:12px dashed #332b1f;background:#0000005c;display:flex;align-items:center;justify-content:center;position:absolute;inset:0;font-size:48px;font-weight:700}.msp-plugin .msp-task-state{line-height:32px}.msp-plugin .msp-task-state>span{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-overlay-tasks{position:absolute;display:flex;inset:0;height:100%;width:100%;z-index:1000;justify-content:center;align-items:center;background:#00000040}.msp-plugin .msp-overlay-tasks .msp-task-state>div{height:32px;margin-top:1px;position:relative;width:100%;background:#eeece7}.msp-plugin .msp-overlay-tasks .msp-task-state>div>div{height:32px;line-height:32px;display:inline-block;padding:0 10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;white-space:nowrap;background:#eeece7;position:absolute}.msp-plugin .msp-overlay-tasks .msp-task-state>div>button{display:inline-block;margin-top:-3px}.msp-plugin .msp-background-tasks{position:absolute;left:0;bottom:0;z-index:1000}.msp-plugin .msp-background-tasks .msp-task-state>div{height:32px;margin-top:1px;position:relative;width:100%;background:#eeece7}.msp-plugin .msp-background-tasks .msp-task-state>div>div{height:32px;line-height:32px;display:inline-block;padding:0 10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;white-space:nowrap;background:#eeece7;position:absolute}.msp-plugin .msp-background-tasks .msp-task-state>div>button{display:inline-block;margin-top:-3px}.msp-plugin .msp-viewport{position:absolute;inset:0;background:#eeece7}.msp-plugin .msp-viewport .msp-btn-link{background:#0003}.msp-plugin .msp-viewport-expanded{position:fixed;z-index:1000}.msp-plugin .msp-viewport-controls{position:absolute;right:10px;top:10px;width:32px}.msp-plugin .msp-viewport-controls-buttons{text-align:right;position:relative}.msp-plugin .msp-viewport-controls-buttons>div{position:relative;margin-bottom:4px}.msp-plugin .msp-viewport-controls-buttons button{padding:0;text-align:center;width:32px;position:relative}.msp-plugin .msp-viewport-controls-buttons .msp-btn-link-toggle-off{color:#9c835f}.msp-plugin .msp-viewport-controls-buttons .msp-btn-link:hover{color:#ae5d04}.msp-plugin .msp-semi-transparent-background{background:#eeece7;opacity:.5;position:absolute;top:0;left:0;width:100%;height:100%}.msp-plugin .msp-hover-box-wrapper{position:relative}.msp-plugin .msp-hover-box-wrapper .msp-hover-box-body{visibility:hidden;position:absolute;right:36px;top:0;width:100px;background-color:#eeece7}.msp-plugin .msp-hover-box-wrapper .msp-hover-box-spacer{visibility:hidden;position:absolute;right:32px;top:0;width:4px;height:32px}.msp-plugin .msp-hover-box-wrapper:hover .msp-hover-box-body,.msp-plugin .msp-hover-box-wrapper:hover .msp-hover-box-spacer{visibility:visible}.msp-plugin .msp-viewport-controls-panel{width:290px;top:0;right:36px;position:absolute;background:#e0ddd4}.msp-plugin .msp-viewport-controls-panel .msp-control-group-wrapper:first-child{padding-top:0}.msp-plugin .msp-viewport-controls-panel .msp-viewport-controls-panel-controls{overflow-y:auto;max-height:400px}.msp-plugin .msp-highlight-toast-wrapper{position:absolute;right:10px;bottom:10px;max-width:95%;z-index:10000;pointer-events:none}.msp-plugin .msp-highlight-toast-wrapper .msp-toast-container{pointer-events:initial}.msp-plugin .msp-highlight-info{color:#ae5d04;padding:3px 10px;background:#eeece7;opacity:90%;max-width:400px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-highlight-markdown-row{padding-left:10px}.msp-plugin .msp-highlight-simple-row{text-align:right}.msp-plugin .msp-highlight-info-hr{margin-inline:0px;margin-block:3px;border:none;height:1px;background-color:#ae5d04}.msp-plugin .msp-highlight-info-additional{font-size:85%;display:inline-block;color:#fa911e}.msp-plugin .msp-snapshot-description-wrapper{background:#eeece780;position:absolute;left:0;top:42px;padding:6.6px 10px;max-height:224px;overflow:hidden;overflow-y:auto;width:max-content;max-width:400px}.msp-plugin .msp-snapshot-description-wrapper a{text-decoration:underline;cursor:pointer;color:#332b1f}.msp-plugin .msp-snapshot-description-wrapper ul,.msp-plugin .msp-snapshot-description-wrapper ol{padding-left:14px}.msp-plugin .msp-sequence{position:absolute;inset:0;background:#eeece7}.msp-plugin .msp-sequence-select{position:relative;height:24px;width:100%;margin-bottom:1px;background:#e0ddd4;text-align:left}.msp-plugin .msp-sequence-select>span{display:inline-block;line-height:24px;padding:0 10px;font-size:85%;font-weight:700;cursor:default}.msp-plugin .msp-sequence-select>select{display:inline-block;max-width:120px;width:auto;text-overflow:ellipsis;font-size:85%;height:24px;line-height:24px;background-size:6px 8px;background-color:#e0ddd4}.msp-plugin .msp-sequence-wrapper{word-break:break-word;padding:10px 10px 3px;user-select:none}.msp-plugin .msp-sequence-wrapper-non-empty{font-size:85%;line-height:180%;font-family:Courier New,monospace;background:#f3f2ee;width:100%;overflow-y:auto;overflow-x:hidden;position:absolute;inset:25px 0 0}.msp-plugin .msp-sequence-chain-label{margin-left:10px;margin-top:10px;user-select:none;color:#ae5d04;font-size:90%;line-height:90%;padding-left:.2em}.msp-plugin .msp-sequence-wrapper span{cursor:pointer}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-long{margin:0 .2em}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-long-begin{margin:0 .2em 0 0}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-focused{font-weight:700;text-decoration:underline}.msp-plugin .msp-sequence-wrapper .msp-sequence-label{color:#ae5d04;font-size:90%;line-height:90%;padding-bottom:1em;padding-left:.2em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number{color:#ae5d04;word-break:keep-all;cursor:default;position:relative;top:-1.1em;left:3.1em;padding:0;margin-left:-3em;font-size:80%;pointer-events:none}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-long{left:3.3em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-long-negative{left:2.7em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-negative{left:2.5em}.msp-plugin .msp-sequence-wrapper .msp-sequence-present{color:#332b1f}.msp-plugin .msp-sequence-wrapper .msp-sequence-missing{color:#b4a184;cursor:default}.msp-plugin .msp-transformer .msp-entity-badge{position:absolute;top:0;right:0;height:32px;line-height:32px;width:32px}.msp-plugin .msp-layout-right,.msp-plugin .msp-layout-left{background:#e0ddd4}.msp-plugin .msp-transformer-wrapper{position:relative}.msp-plugin .msp-transformer-wrapper .msp-entity-badge{left:0;top:0}.msp-plugin .msp-transformer-wrapper:first-child .msp-panel-description-content{top:33px}.msp-plugin .msp-transformer-wrapper:not(:first-child) .msp-panel-description-content{bottom:33px}.msp-plugin .msp-transform-wrapper{margin-bottom:10px}.msp-plugin .msp-transform-wrapper-collapsed,.msp-plugin .msp-transform-update-wrapper,.msp-plugin .msp-transform-update-wrapper-collapsed{margin-bottom:1px}.msp-plugin .msp-transform-update-wrapper>.msp-transform-header>button,.msp-plugin .msp-transform-update-wrapper-collapsed>.msp-transform-header>button{text-align:left;padding-left:32px;line-height:24px;background:#e9e6e0}.msp-plugin .msp-transform-wrapper>.msp-transform-header>button{text-align:left;background:#eeece7;font-weight:700;padding-right:5px}.msp-plugin .msp-transform-header{position:relative}.msp-plugin .msp-transform-header>button>small{font-weight:400;float:right}.msp-plugin .msp-transform-header>button>span:first-child{margin-right:10px}.msp-plugin .msp-transform-header>button:hover{color:#63533c}.msp-plugin .msp-transform-header-brand{margin-bottom:-1px}.msp-plugin .msp-transform-header-brand svg{fill:#332b1f;stroke:#332b1f}.msp-plugin .msp-transform-default-params{background:#eeece7;position:absolute;left:0;top:0;width:32px;padding:0}.msp-plugin .msp-transform-default-params:hover{background:#fff}.msp-plugin .msp-transform-apply-wrap{position:relative;margin-top:1px;width:100%;height:32px}.msp-plugin .msp-transform-refresh{width:87px;margin-left:33px;background:#eeece7;text-align:right}.msp-plugin .msp-transform-apply{display:block;position:absolute;left:120px;right:0;top:0}.msp-plugin .msp-transform-apply-wider{margin-left:33px}.msp-plugin .msp-data-beh{margin:10px 0!important}.msp-plugin .msp-toast-container{position:relative;z-index:1001}.msp-plugin .msp-toast-container .msp-toast-entry{color:#332b1f;background:#e0ddd4;position:relative;float:right;min-height:32px;margin-top:10px;border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);display:table}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-title{height:100%;line-height:32px;padding:0 10px;background:#eeece7;font-weight:700;display:table-cell;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;font-weight:light;cursor:pointer}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message{padding:3px 42px 3px 10px;display:table-cell}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a{text-decoration:none;color:#974102;font-weight:700}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:hover{text-decoration:underline;color:#fc6c03}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:active,.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:focus{color:#974102;outline-offset:0;outline:none}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-hide{position:absolute;width:42px;right:0;top:0;bottom:0}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-hide .msp-btn-icon{background:transparent;position:absolute;inset:1px 0 0;width:100%;text-align:right;padding-right:5px}.msp-plugin .msp-logo{display:block;position:absolute;bottom:10px;right:10px;height:32px;width:100px;background-repeat:no-repeat;background-position:bottom right;background-size:auto;background-image:url(data:image/png;base64,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)}.msp-plugin .msp-plugin-content{color:#332b1f}.msp-plugin .msp-plugin-init-error{white-space:pre;margin:10px}.msp-plugin .msp-svg-text{fill:#332b1f}.msp-plugin{background:#eeece7}\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n/*# sourceMappingURL=molstar.css.map */\n`\n", "import { useEffect, useRef, useState } from 'react'\n\nimport { isAlive } from '@jbrowse/mobx-state-tree'\n\nimport loadMolstar from './loadMolstar'\n\nimport type { JBrowsePluginProteinViewModel } from './model'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport default function useProteinView({\n showControls,\n model,\n}: {\n showControls: boolean\n model?: JBrowsePluginProteinViewModel\n}) {\n const parentRef = useRef<HTMLDivElement>(null)\n const pluginRef = useRef<PluginContext | null>(null)\n const [error, setError] = useState<unknown>()\n const [loading, setLoading] = useState(true)\n\n // Create the Mol* plugin once on mount. showControls is intentionally NOT a\n // dependency: toggling it is applied at runtime in the effect below via\n // Layout.Update, rather than tearing down and rebuilding the entire WebGL\n // plugin (which leaks a GPU context and reloads every structure each toggle).\n useEffect(() => {\n const state: {\n cancelled: boolean\n plugin?: PluginContext\n host?: HTMLDivElement\n } = { cancelled: false }\n void (async () => {\n try {\n if (!parentRef.current) {\n return\n }\n const {\n GeometryExport,\n MAQualityAssessment,\n PluginConfig,\n PluginSpec,\n DefaultPluginUISpec,\n createPluginUI,\n renderReact18,\n } = await loadMolstar()\n\n const host = document.createElement('div')\n parentRef.current.append(host)\n state.host = host\n const defaultSpec = DefaultPluginUISpec()\n const created = await createPluginUI({\n target: host,\n render: renderReact18,\n spec: {\n ...DefaultPluginUISpec(),\n behaviors: [\n ...defaultSpec.behaviors,\n PluginSpec.Behavior(GeometryExport),\n // Parses per-residue pLDDT from AlphaFold mmCIF and registers the\n // 'plddt-confidence' color theme used by the color-scheme menu.\n PluginSpec.Behavior(MAQualityAssessment),\n ],\n layout: {\n initial: {\n controlsDisplay: 'reactive',\n showControls,\n },\n },\n config: [[PluginConfig.Viewport.ShowExpand, false]],\n },\n })\n await created.initialized\n if (state.cancelled) {\n created.dispose()\n host.remove()\n } else {\n state.plugin = created\n pluginRef.current = created\n model?.setMolstarPluginContext(created)\n }\n } catch (e) {\n console.error(e)\n setError(e)\n } finally {\n setLoading(false)\n }\n })()\n return () => {\n state.cancelled = true\n pluginRef.current = null\n // Drop the stale reference before disposing so model autoruns don't act\n // on a torn-down plugin.\n if (model && isAlive(model)) {\n model.setMolstarPluginContext(undefined)\n }\n // dispose() (not unmount()) is what frees the WebGL context, canvas3d and\n // GPU buffers; unmount() is a no-op on the createPluginUI path. Mirrors\n // Mol*'s own Viewer.dispose().\n state.plugin?.dispose()\n state.host?.remove()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Show/hide the Mol* controls panel at runtime without rebuilding the plugin.\n useEffect(() => {\n const state = { cancelled: false }\n void (async () => {\n const plugin = pluginRef.current\n if (plugin) {\n const { PluginCommands } = await loadMolstar()\n if (!state.cancelled) {\n await PluginCommands.Layout.Update(plugin, {\n state: { showControls },\n })\n }\n }\n })()\n return () => {\n state.cancelled = true\n }\n }, [showControls])\n\n return { parentRef, error, loading }\n}\n", "import React from 'react'\n\nimport { ErrorMessage, LoadingEllipses, ResizeHandle } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n\nimport ManualAlignmentDialog from './ManualAlignmentDialog'\nimport ProteinViewHeader from './ProteinViewHeader'\nimport css from '../css/molstar'\nimport useProteinView from '../useProteinView'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst style = document.createElement('style')\nstyle.append(css)\ndocument.head.append(style)\n\nconst ProteinView = observer(function ProteinView({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { showControls } = model\n const { parentRef, error, loading } = useProteinView({\n showControls,\n model,\n })\n\n if (error) {\n return <ErrorMessage error={error} />\n }\n return (\n <ProteinViewContainer\n model={model}\n parentRef={parentRef}\n loading={loading}\n />\n )\n})\n\nconst ProteinViewContainer = observer(function ProteinViewContainer({\n model,\n parentRef,\n loading,\n}: {\n model: JBrowsePluginProteinViewModel\n parentRef?: React.RefObject<HTMLDivElement | null>\n loading?: boolean\n}) {\n const { width, height, error, structures } = model\n\n // Capture/automation signal: the structure has finished loading and no\n // pairwise alignment is still pending, so the view is painted in its settled\n // state. Lets screenshot/e2e tooling wait deterministically instead of\n // guessing a fixed settle time.\n const ready = !loading && structures.every(s => !s.alignmentPending)\n\n return (\n <div\n style={{ background: '#ccc' }}\n data-testid={ready ? 'protein-view-ready' : 'protein-view-loading'}\n >\n {error ? <ErrorMessage error={error} /> : null}\n {loading ? (\n <LoadingEllipses message=\"Loading protein viewer\" />\n ) : (\n <ProteinViewHeader model={model} />\n )}\n <div\n ref={parentRef}\n style={{\n position: 'relative',\n width,\n height,\n }}\n />\n <ResizeHandle\n style={{ height: 4, background: 'grey' }}\n onDrag={delta => {\n return model.setHeight(model.height + delta)\n }}\n />\n <ManualAlignmentDialog model={model} />\n </div>\n )\n})\n\nexport default ProteinView\n", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2 } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\ninterface UniProtVariantFeature {\n begin: string\n end: string\n wildType: string\n mutatedType: string\n xrefs: {\n name: string\n id: string\n url: string\n alternativeUrl: string\n }[]\n predictions?: {\n score: number\n }[]\n descriptions?: {\n value: string\n }[]\n populationFrequencies?: {\n frequency?: number\n }[]\n}\n\nexport default class UniProtVariationAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats:\n | Promise<{ uniqueId: string; start: number; end: number }[]>\n | undefined\n\n private async loadDataP() {\n const { features } = JSON.parse(\n await openLocation(this.getConf('location')).readFile('utf8'),\n ) as { features: UniProtVariantFeature[] }\n\n const scoreField = this.getConf('scoreField')\n\n return features.map(({ begin, end, ...rest }, idx) => ({\n ...rest,\n uniqueId: `feat-${idx}`,\n start: +begin,\n end: +end + 1,\n score:\n scoreField === 'population_frequency'\n ? rest.populationFrequencies?.[0]?.frequency\n : scoreField === 'variant_impact_score'\n ? rest.predictions?.[0]?.score\n : undefined,\n description: rest.descriptions?.map(d => d.value).join(','),\n name: [\n rest.mutatedType\n ? `${rest.wildType}->${rest.mutatedType}`\n : `${rest.wildType}->del`,\n ],\n }))\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(new SimpleFeature({ ...f, refName }))\n }\n }\n observer.complete()\n })\n }\n\n public freeResources(): void {}\n}\n", "import Plugin from '@jbrowse/core/Plugin'\n\nimport AddHighlightModelF from './AddHighlightModel'\nimport AlphaFoldConfidenceAdapterF from './AlphaFoldConfidenceAdapter'\nimport AlphaMissensePathogenicityAdapterF from './AlphaMissensePathogenicityAdapter'\nimport LaunchProteinViewF from './LaunchProteinView'\nimport LaunchProteinViewExtensionPointF from './LaunchProteinViewExtensionPoint'\nimport ProteinViewF from './ProteinView'\nimport UniProtVariationAdapterF from './UniProtVariationAdapter'\nimport { version } from './version'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default class ProteinViewer extends Plugin {\n name = 'ProteinViewer'\n version = version\n\n install(pluginManager: PluginManager) {\n ProteinViewF(pluginManager)\n LaunchProteinViewF(pluginManager)\n LaunchProteinViewExtensionPointF(pluginManager)\n AddHighlightModelF(pluginManager)\n AlphaFoldConfidenceAdapterF(pluginManager)\n AlphaMissensePathogenicityAdapterF(pluginManager)\n UniProtVariationAdapterF(pluginManager)\n }\n\n configure(_pluginManager: PluginManager) {}\n}\n", "import React from 'react'\n\nimport HighlightComponents from './HighlightComponents'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function AddHighlightModelF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LinearGenomeView-TracksContainerComponent',\n // @ts-expect-error\n (rest: React.ReactNode[], { model }: { model: LinearGenomeViewModel }) => {\n return [\n ...rest,\n <HighlightComponents\n key=\"highlight_protein_viewer_protein3d\"\n model={model}\n />,\n ]\n },\n )\n}\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport GenomeMouseoverHighlight from './GenomeMouseoverHighlight'\nimport GenomeTo1DProteinHoverHighlight from './GenomeTo1DProteinHoverHighlight'\nimport Protein1DToGenomeHoverHighlight from './Protein1DToGenomeHoverHighlight'\nimport {\n ProteinToGenomeClickHighlight,\n ProteinToGenomeHoverHighlight,\n} from './ProteinToGenomeHighlight'\nimport ProteinToMsaHoverSync from './ProteinToMsaHoverSync'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst HighlightComponents = observer(function Highlight({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n return (\n <>\n <ProteinToGenomeClickHighlight model={model} />\n <ProteinToGenomeHoverHighlight model={model} />\n <Protein1DToGenomeHoverHighlight model={model} />\n <GenomeTo1DProteinHoverHighlight model={model} />\n <GenomeMouseoverHighlight model={model} />\n <ProteinToMsaHoverSync model={model} />\n </>\n )\n})\n\nexport default HighlightComponents\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { checkHovered } from '../ProteinView/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst GenomeMouseoverHighlight = observer(function GenomeMouseoverHighlight({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const session = getSession(model)\n const { views, hovered } = session\n if (checkHovered(hovered) && views.some(s => s.type === 'ProteinView')) {\n const { assemblyNames } = model\n const { coord, refName } = hovered.hoverPosition\n return (\n <Highlight\n model={model}\n start={coord - 1}\n end={coord}\n refName={refName}\n assemblyName={assemblyNames[0]!}\n />\n )\n }\n return null\n})\n\nexport default GenomeMouseoverHighlight\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport { useStyles } from './util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst Highlight = observer(function Highlight({\n assemblyName,\n start,\n end,\n refName,\n model,\n}: {\n model: LinearGenomeViewModel\n assemblyName: string\n start: number\n end: number\n refName: string\n}) {\n const { cx, classes } = useStyles()\n const { assemblyManager } = getSession(model)\n const { offsetPx } = model\n const assembly = assemblyManager.get(assemblyName)\n const ref = assembly?.getCanonicalRefName(refName) ?? refName\n const s = model.bpToPx({ refName: ref, coord: start })\n const e = model.bpToPx({ refName: ref, coord: end })\n if (s && e) {\n const width = Math.max(Math.abs(e.offsetPx - s.offsetPx), 3)\n const left = Math.min(s.offsetPx, e.offsetPx) - offsetPx\n return (\n <div\n className={cx(\n classes.highlight,\n width <= 3 ? classes.thinborder : undefined,\n )}\n style={{ left, width }}\n />\n )\n } else {\n return null\n }\n})\n\nexport default Highlight\n", "import { makeStyles } from 'tss-react/mui'\n\nimport type { JBrowsePluginProteinViewModel } from '../ProteinView/model'\nimport type { AbstractSessionModel } from '@jbrowse/core/util'\n\nexport const useStyles = makeStyles()({\n highlight: {\n height: '100%',\n background: 'rgba(255,255,0,0.2)',\n border: '1px solid rgba(50,50,0,0.2)',\n position: 'absolute',\n zIndex: 99,\n textAlign: 'center',\n pointerEvents: 'none',\n overflow: 'hidden',\n },\n thinborder: {\n border: '1px solid black',\n },\n})\n\nexport function getProteinView(\n session: AbstractSessionModel,\n): JBrowsePluginProteinViewModel | undefined {\n const view = session.views.find(v => v.type === 'ProteinView')\n return view as JBrowsePluginProteinViewModel | undefined\n}\n", "import React from 'react'\n\nimport { SimpleFeature, getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { protein1DViewRegistry } from '../Protein1DViewRegistry'\nimport { checkHovered } from '../ProteinView/util'\nimport { genomeToTranscriptSeqMapping } from '../mappings'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst GenomeTo1DProteinHoverHighlight = observer(\n function GenomeTo1DProteinHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n const session = getSession(model)\n const { hovered } = session\n const { assemblyNames, id: viewId } = model\n\n const assemblyName = assemblyNames[0]\n if (!assemblyName) {\n return null\n }\n\n const protein1DInfo = protein1DViewRegistry.get(viewId)\n if (!protein1DInfo) {\n return null\n }\n\n if (!checkHovered(hovered)) {\n return null\n }\n\n const { coord } = hovered.hoverPosition\n\n const feature = new SimpleFeature(protein1DInfo.feature)\n const mapping = genomeToTranscriptSeqMapping(feature)\n const { g2p } = mapping\n const proteinPos = g2p[coord - 1]\n if (proteinPos === undefined) {\n return null\n }\n\n return (\n <Highlight\n model={model}\n start={proteinPos}\n end={proteinPos + 1}\n refName={protein1DInfo.uniprotId}\n assemblyName={protein1DInfo.uniprotId}\n />\n )\n },\n)\n\nexport default GenomeTo1DProteinHoverHighlight\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { protein1DViewRegistry } from '../Protein1DViewRegistry'\nimport { checkHovered } from '../ProteinView/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst Protein1DToGenomeHoverHighlight = observer(\n function Protein1DToGenomeHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n const session = getSession(model)\n const { hovered } = session\n const { assemblyNames, id: viewId } = model\n\n if (!checkHovered(hovered)) {\n return null\n }\n\n const { coord, refName } = hovered.hoverPosition\n const protein1DInfo = protein1DViewRegistry.getByUniprotId(refName, session)\n\n if (protein1DInfo?.connectedViewId !== viewId) {\n return null\n }\n\n const assemblyName = assemblyNames[0]\n if (!assemblyName) {\n return null\n }\n\n const genomeHighlight =\n protein1DViewRegistry.getGenomeHighlightForProteinPosition(\n refName,\n coord - 1,\n session,\n )\n\n if (!genomeHighlight) {\n return null\n }\n\n return (\n <Highlight\n model={model}\n start={genomeHighlight.start}\n end={genomeHighlight.end}\n refName={genomeHighlight.refName}\n assemblyName={assemblyName}\n />\n )\n },\n)\n\nexport default Protein1DToGenomeHoverHighlight\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport ProteinToGenomeHighlightInner from './ProteinToGenomeHighlightInner'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport const ProteinToGenomeClickHighlight = observer(\n function ProteinToGenomeClickHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n return (\n <ProteinToGenomeHighlightInner\n model={model}\n field=\"clickGenomeHighlights\"\n />\n )\n },\n)\n\nexport const ProteinToGenomeHoverHighlight = observer(\n function ProteinToGenomeHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n return (\n <ProteinToGenomeHighlightInner\n model={model}\n field=\"hoverGenomeHighlights\"\n />\n )\n },\n)\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { getProteinView } from './util'\n\nimport type { JBrowsePluginProteinStructureModel } from '../ProteinView/model'\nimport type { Region } from '@jbrowse/core/util/types'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ntype HighlightField = 'clickGenomeHighlights' | 'hoverGenomeHighlights'\n\nconst ProteinToGenomeHighlightInner = observer(\n function ProteinToGenomeHighlightInner({\n model,\n field,\n }: {\n model: LinearGenomeViewModel\n field: HighlightField\n }) {\n const session = getSession(model)\n const { assemblyManager } = session\n const { assemblyNames } = model\n const proteinView = getProteinView(session)\n const assemblyName = assemblyNames[0]\n const assembly = assemblyName\n ? assemblyManager.get(assemblyName)\n : undefined\n return assembly && assemblyName ? (\n <>\n {proteinView?.structures.flatMap(\n (structure: JBrowsePluginProteinStructureModel, idx: number) =>\n structure[field].map((r: Region, idx2: number) => (\n <Highlight\n key={`${r.refName}-${r.start}-${r.end}-${idx}-${idx2}`}\n start={r.start}\n end={r.end}\n refName={r.refName}\n assemblyName={assemblyName}\n model={model}\n />\n )),\n )}\n </>\n ) : null\n },\n)\n\nexport default ProteinToGenomeHighlightInner\n", "import { useEffect } from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { autorun, untracked } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport { findStructureRowName } from './msaRowMatch'\nimport { getProteinView } from './util'\nimport { stripStopCodon } from '../LaunchProteinView/utils/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\n// CROSS-REPO DEPENDENCY: react-msaview (https://github.com/GMOD/react-msaview)\n//\n// This file reaches into the live MsaView model exposed by the `react-msaview`\n// library (via the jbrowse-plugin-msaview wrapper) to drive a bidirectional\n// hover highlight between a 3D structure and its alignment. The member names\n// below are part of react-msaview's public model API \u2014 see\n// react-msaview/packages/lib/src/model.ts (`mouseCol`, `setMousePos`). If those\n// names change there, this sync silently stops working, so the two repos must\n// be kept in step.\n//\n// NOTE on coordinates: `mouseCol` is an MSA *visible column* (accounts for both\n// alignment gaps and hidden gappy columns), whereas `structureSeqHoverPos` is an\n// ungapped residue index in the structure's sequence. We translate across gaps\n// with react-msaview's `visibleColToSeqPos(rowName, col)` /\n// `seqPosToVisibleCol(rowName, seqPos)`, anchoring the structure to its MSA row\n// by matching sequences (see findStructureRowName). When the row can't be\n// resolved (MSA not loaded, no matching row) we fall back to the 1:1 mapping,\n// which is correct when the structure's row has no gaps and no columns hidden.\ninterface MsaView {\n id: string\n type: string\n mouseCol?: number\n setMousePos?: (col?: number, row?: number) => void\n rowMap?: Map<string, string>\n seqPosToVisibleCol?: (rowName: string, seqPos: number) => number | undefined\n visibleColToSeqPos?: (\n rowName: string,\n visibleCol: number,\n ) => number | undefined\n}\n\nconst ProteinToMsaHoverSync = observer(function ProteinToMsaHoverSync({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const session = getSession(model)\n const { views } = session\n\n const proteinView = getProteinView(session)\n\n const connectedMsaViewId = proteinView?.connectedMsaViewId\n const msaView = connectedMsaViewId\n ? (views.find(f => f.id === connectedMsaViewId) as MsaView | undefined)\n : undefined\n\n useEffect(() => {\n if (!proteinView || !msaView) {\n return\n }\n\n const disposers: (() => void)[] = []\n\n // Resolve which MSA row corresponds to the structure once the MSA loads.\n // Recomputes only when the alignment rows or structure sequence change, not\n // on every hover, so the per-hover conversions below stay cheap.\n let structureRowName: string | undefined\n disposers.push(\n autorun(() => {\n const seq = proteinView.primaryStructure?.structureSequences?.[0]\n structureRowName = findStructureRowName(\n msaView.rowMap,\n seq === undefined ? undefined : stripStopCodon(seq),\n )\n }),\n )\n\n if (msaView.setMousePos) {\n const { setMousePos } = msaView\n disposers.push(\n autorun(() => {\n const structure = proteinView.primaryStructure\n if (structure) {\n const seqPos = structure.structureSeqHoverPos\n const col =\n seqPos !== undefined &&\n structureRowName !== undefined &&\n msaView.seqPosToVisibleCol\n ? msaView.seqPosToVisibleCol(structureRowName, seqPos)\n : seqPos\n setMousePos(col)\n }\n }),\n )\n }\n\n disposers.push(\n autorun(() => {\n const col = msaView.mouseCol\n const structure = proteinView.primaryStructure\n if (structure) {\n const hasFeatureHoverRange = untracked(\n () => !!structure.alignmentHoverRange,\n )\n if (!hasFeatureHoverRange) {\n const structureSeqPos =\n col !== undefined &&\n structureRowName !== undefined &&\n msaView.visibleColToSeqPos\n ? msaView.visibleColToSeqPos(structureRowName, col)\n : col\n structure.setHoveredPosition(\n structureSeqPos === undefined ? undefined : { structureSeqPos },\n )\n }\n }\n }),\n )\n\n return () => {\n disposers.forEach(d => {\n d()\n })\n }\n }, [proteinView, msaView])\n\n return null\n})\n\nexport default ProteinToMsaHoverSync\n", "/** Removes alignment gap characters ('-' and '.') from an MSA row sequence. */\nexport function ungap(seq: string) {\n return seq.replace(/[-.]/g, '')\n}\n\n/**\n * Finds the MSA row whose ungapped sequence equals the structure's sequence.\n * For AlphaFold structures the structure sequence is the same UniProt sequence\n * as the MSA query row, so this anchors the structure to its alignment row\n * independent of row naming/ordering. Returns undefined when no row matches\n * (e.g. MSA not yet loaded), letting callers fall back to a 1:1 mapping.\n */\nexport function findStructureRowName(\n rowMap: Map<string, string> | undefined,\n structureSeq: string | undefined,\n): string | undefined {\n return rowMap && structureSeq\n ? [...rowMap].find(([, seq]) => ungap(seq) === structureSeq)?.[0]\n : undefined\n}\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function AlphaFoldConfidenceAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'AlphaFoldConfidenceAdapter',\n displayName: 'AlphaFoldConfidence adapter',\n configSchema,\n getAdapterClass: () =>\n import('./AlphaFoldConfidenceAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config AlphaFoldConfidenceAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst AlphaFoldConfidenceAdapter: AnyConfigurationSchemaType =\n ConfigurationSchema(\n 'AlphaFoldConfidenceAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bed.gz',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n )\nexport default AlphaFoldConfidenceAdapter\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function AlphaMissensePathogenicityAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'AlphaMissensePathogenicityAdapter',\n displayName: 'AlphaMissensePathogenicity adapter',\n configSchema,\n getAdapterClass: () =>\n import('./AlphaMissensePathogenicityAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config AlphaMissensePathogenicityAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst AlphaMissensePathogenicityAdapter: AnyConfigurationSchemaType =\n ConfigurationSchema(\n 'AlphaMissensePathogenicityAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bed.gz',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n )\nexport default AlphaMissensePathogenicityAdapter\n", "import { getContainingTrack, getSession } from '@jbrowse/core/util'\nimport AddIcon from '@mui/icons-material/Add'\n\nimport LaunchProteinViewDialog from './components/LaunchProteinViewDialog'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { PluggableElementType } from '@jbrowse/core/pluggableElementTypes'\nimport type DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport type { MenuItem } from '@jbrowse/core/ui'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { IAnyModelType } from '@jbrowse/mobx-state-tree'\n\nfunction isDisplay(elt: { name: string }): elt is DisplayType {\n return elt.name === 'LinearBasicDisplay'\n}\n\nfunction extendStateModel(stateModel: IAnyModelType) {\n return stateModel.views(\n (self: {\n contextMenuItems: () => MenuItem[]\n contextMenuFeature?: Feature\n }) => {\n const superContextMenuItems = self.contextMenuItems\n return {\n contextMenuItems() {\n const feature = self.contextMenuFeature\n const showProteinMenuItem =\n feature !== undefined &&\n ['gene', 'mRNA', 'transcript'].includes(feature.get('type'))\n return [\n ...superContextMenuItems(),\n ...(showProteinMenuItem\n ? [\n {\n label: 'Launch protein view',\n icon: AddIcon,\n onClick: () => {\n const track = getContainingTrack(self)\n const session = getSession(track)\n session.queueDialog(handleClose => [\n LaunchProteinViewDialog,\n { model: track, handleClose, feature },\n ])\n },\n },\n ]\n : []),\n ]\n },\n }\n },\n )\n}\n\nexport default function LaunchProteinViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-extendPluggableElement',\n (elt: PluggableElementType) => {\n if (isDisplay(elt)) {\n elt.stateModel = extendStateModel(elt.stateModel)\n }\n return elt\n },\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z\"\n}), 'Add');", "import React, { useState } from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport { getContainingView, getSession } from '@jbrowse/core/util'\nimport { Tab, Tabs } from '@mui/material'\n\nimport AlphaFoldDBSearch from './AlphaFoldDBSearch'\nimport FoldseekSearch from './FoldseekSearch'\nimport HelpButton from './HelpButton'\nimport TabPanel from './TabPanel'\nimport UserProvidedStructure from './UserProvidedStructure'\nimport { DEFAULT_ALIGNMENT_ALGORITHM } from '../../ProteinView/types'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractTrackModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function LaunchProteinViewDialog({\n handleClose,\n feature,\n model,\n}: {\n handleClose: () => void\n feature: Feature\n model: AbstractTrackModel\n}) {\n const [choice, setChoice] = useState(0)\n const [alignmentAlgorithm, setAlignmentAlgorithm] =\n useLocalStorage<AlignmentAlgorithm>(\n 'jbrowse-protein3d-alignment-algorithm',\n DEFAULT_ALIGNMENT_ALGORITHM,\n )\n const session = getSession(model)\n const view = getContainingView(model) as LinearGenomeViewModel\n\n return (\n <Dialog\n maxWidth=\"xl\"\n title=\"Launch protein view\"\n titleNode={\n <>\n Launch protein view <HelpButton />\n </>\n }\n open\n onClose={handleClose}\n >\n <Tabs\n value={choice}\n onChange={(_, val) => {\n setChoice(val)\n }}\n >\n <Tab value={0} label=\"AlphaFoldDB search\" />\n <Tab value={1} label=\"Foldseek search\" />\n <Tab value={2} label=\"Open file manually\" />\n </Tabs>\n <TabPanel value={choice} index={0}>\n <AlphaFoldDBSearch\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={setAlignmentAlgorithm}\n />\n </TabPanel>\n <TabPanel value={choice} index={1}>\n <FoldseekSearch\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n />\n </TabPanel>\n <TabPanel value={choice} index={2}>\n <UserProvidedStructure\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={setAlignmentAlgorithm}\n />\n </TabPanel>\n </Dialog>\n )\n}\n", "import React from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport { DialogActions, DialogContent, Typography } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport AlphaFoldDBSearchStatus from './AlphaFoldDBSearchStatus'\nimport IdentifierSelector from './IdentifierSelector'\nimport ProteinViewActions from './ProteinViewActions'\nimport SequenceSearchStatus from './SequenceSearchStatus'\nimport TranscriptSelector from './TranscriptSelector'\nimport UniProtIdInput from './UniProtIdInput'\nimport UniProtResultsTable from './UniProtResultsTable'\nimport ExternalLink from '../../components/ExternalLink'\nimport useAlphaFoldDBSearch from '../hooks/useAlphaFoldDBSearch'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n dialogContent: {\n width: '80em',\n '& > *': {\n marginBottom: 20,\n },\n '& > *:last-child': {\n marginBottom: 0,\n },\n },\n selectorsRow: {\n display: 'flex',\n flexDirection: 'row',\n gap: 20,\n alignItems: 'flex-start',\n },\n})\n\nconst AlphaFoldDBSearch = observer(function AlphaFoldDBSearch({\n feature,\n session,\n view,\n handleClose,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n handleClose: () => void\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n const { classes } = useStyles()\n\n const state = useAlphaFoldDBSearch({ feature, view })\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {state.error ? <ErrorMessage error={state.error} /> : null}\n\n <UniProtIdInput\n lookupMode={state.lookupMode}\n onLookupModeChange={state.setLookupMode}\n manualUniprotId={state.manualUniprotId}\n onManualUniprotIdChange={state.setManualUniprotId}\n featureUniprotId={state.featureUniprotId}\n hasProteinSequence={!!state.userSelectedProteinSequence?.seq}\n sequenceSearchType={state.sequenceSearchType}\n onSequenceSearchTypeChange={state.setSequenceSearchType}\n endContent={\n state.showIdentifierSelector ? (\n <IdentifierSelector\n recognizedIds={state.recognizedIds}\n geneName={state.geneName}\n selectedId={state.selectedQueryId}\n onSelectedIdChange={state.setSelectedQueryId}\n />\n ) : null\n }\n />\n\n {state.loadingStatuses.map(status => (\n <LoadingEllipses key={status} variant=\"subtitle2\" message={status} />\n ))}\n\n {state.showUniprotResults && (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Searched UniProt by {state.searchDescription}\n </Typography>\n <UniProtResultsTable\n entries={state.uniprotEntries}\n selectedAccession={state.selectedTableAccession}\n onSelect={state.setSelectedUniprotId}\n />\n <Typography variant=\"body2\" color=\"textSecondary\">\n If you don't see the entry you're looking for, try a different\n identifier above or search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">\n UniProt\n </ExternalLink>{' '}\n directly and use \"Enter manually\".\n </Typography>\n </>\n )}\n\n {state.showNoResults && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n No UniProt entries found for {state.searchDescriptionOr}. Try a\n different identifier above, or search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">UniProt</ExternalLink>{' '}\n directly and use \"Enter manually\" above, or use \"Search sequence\n against AlphaFoldDB API\" if available.\n </Typography>\n )}\n\n {state.showStructureSelectors && (\n <>\n <div className={classes.selectorsRow}>\n <TranscriptSelector\n val={state.userSelection}\n setVal={state.setUserSelection}\n structureSequence={state.structureSequence}\n feature={feature}\n isoforms={state.transcriptOptions}\n isoformSequences={state.isoformSequences!}\n />\n </div>\n {state.showSequenceSearchStatus && (\n <SequenceSearchStatus\n isLoading={state.isSequenceSearchLoading}\n uniprotId={state.uniprotId}\n url={state.url}\n hasProteinSequence={!!state.userSelectedProteinSequence}\n sequenceSearchType={state.sequenceSearchType}\n />\n )}\n {state.showAlphaFoldDBSearchStatus && (\n <AlphaFoldDBSearchStatus\n uniprotId={state.uniprotId}\n selectedTranscript={state.selectedTranscript}\n structureSequence={state.structureSequence}\n isoformSequences={state.isoformSequences!}\n url={state.url}\n />\n )}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <ProteinViewActions\n handleClose={handleClose}\n uniprotId={state.uniprotId}\n userSelectedProteinSequence={state.userSelectedProteinSequence}\n selectedTranscript={state.selectedTranscript}\n url={state.url}\n confidenceUrl={state.confidenceUrl}\n feature={feature}\n view={view}\n session={session}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n sequencesMatch={state.sequencesMatch}\n isLoading={state.isLoading}\n error={state.error}\n />\n </DialogActions>\n </>\n )\n})\n\nexport default AlphaFoldDBSearch\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport IsoformSequencesToggle from './IsoformSequencesToggle'\nimport ExternalLink from '../../components/ExternalLink'\nimport { getTranscriptDisplayName } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nfunction NotFound({ uniprotId }: { uniprotId: string }) {\n return (\n <Typography>\n No structure found for this UniProtID in AlphaFoldDB{' '}\n <ExternalLink\n href={`https://alphafold.ebi.ac.uk/search/text/${uniprotId}`}\n >\n (search for results)\n </ExternalLink>\n </Typography>\n )\n}\n\nexport default function AlphaFoldDBSearchStatus({\n uniprotId,\n selectedTranscript,\n structureSequence,\n isoformSequences,\n url,\n}: {\n uniprotId?: string\n selectedTranscript?: Feature\n structureSequence?: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n url?: string\n}) {\n return uniprotId ? (\n <>\n <div>\n <Typography>\n UniProt link:{' '}\n <ExternalLink\n href={`https://www.uniprot.org/uniprotkb/${uniprotId}/entry`}\n >\n {uniprotId}\n </ExternalLink>\n </Typography>\n <Typography>\n AlphaFoldDB link: <ExternalLink href={url}>{url}</ExternalLink>\n </Typography>\n </div>\n {structureSequence ? (\n <IsoformSequencesToggle\n structureSequence={structureSequence}\n structureName={uniprotId}\n isoformSequences={isoformSequences}\n />\n ) : (\n <NotFound uniprotId={uniprotId} />\n )}\n </>\n ) : (\n <Typography>\n Searching{' '}\n {selectedTranscript\n ? getTranscriptDisplayName(selectedTranscript)\n : 'transcript'}{' '}\n for UniProt ID\n </Typography>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { Button } from '@mui/material'\n\nimport MSATable from './MSATable'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function IsoformSequencesToggle({\n structureSequence,\n structureName,\n isoformSequences,\n}: {\n structureSequence: string\n structureName: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n}) {\n const [show, setShow] = useState(false)\n return (\n <div style={{ margin: 10 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setShow(!show)\n }}\n >\n {show\n ? 'Hide all isoform protein sequences'\n : 'Show all isoform protein sequences'}\n </Button>\n {show ? (\n <MSATable\n structureSequence={structureSequence}\n structureName={structureName}\n isoformSequences={isoformSequences}\n />\n ) : null}\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { max } from '@jbrowse/core/util'\nimport { TextField } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport Checkbox2 from './Checkbox2'\nimport { getTranscriptDisplayName, stripStopCodon } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nconst useStyles = makeStyles()({\n textAreaFont: {\n fontFamily: 'Courier New',\n whiteSpace: 'pre',\n },\n})\n\nexport default function MSATable({\n structureName,\n structureSequence,\n isoformSequences,\n}: {\n structureName: string\n structureSequence: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n}) {\n const { classes } = useStyles()\n const [showInFastaFormat, setShowInFastaFormat] = useState(false)\n const removedStars = Object.fromEntries(\n Object.entries(isoformSequences).map(([key, val]) => [\n key,\n { ...val, seq: stripStopCodon(val.seq) },\n ]),\n )\n const exactMatchIsoformAndStructureSeq = Object.entries(removedStars).find(\n ([_, val]) => structureSequence === val.seq,\n )\n const sname = `${structureName} (structure residues)`\n const maxKeyLen = max([\n sname.length,\n ...Object.entries(removedStars).map(\n ([_, val]) => getTranscriptDisplayName(val.feature).length,\n ),\n ])\n\n return (\n <>\n <Checkbox2\n onChange={event => {\n setShowInFastaFormat(event.target.checked)\n }}\n label=\"Show in FASTA format?\"\n checked={showInFastaFormat}\n />\n <TextField\n variant=\"outlined\"\n multiline\n minRows={5}\n maxRows={10}\n fullWidth\n value={\n showInFastaFormat\n ? [\n `>${sname}\\n${structureSequence}`,\n ...Object.values(removedStars).map(\n ({ feature, seq }) =>\n `>${getTranscriptDisplayName(feature)}\\n${seq}`,\n ),\n ].join('\\n')\n : [\n `${sname.padEnd(maxKeyLen)}${exactMatchIsoformAndStructureSeq ? '*' : ' '} ${structureSequence}`,\n exactMatchIsoformAndStructureSeq\n ? `${getTranscriptDisplayName(exactMatchIsoformAndStructureSeq[1].feature).padEnd(maxKeyLen)}* ${exactMatchIsoformAndStructureSeq[1].seq}`\n : undefined,\n ...Object.entries(removedStars)\n .filter(([k]) => k !== exactMatchIsoformAndStructureSeq?.[0])\n .map(\n ([_, val]) =>\n `${getTranscriptDisplayName(val.feature).padEnd(maxKeyLen)} ${val.seq}`,\n ),\n ]\n .filter(f => !!f)\n .join('\\n')\n }\n slotProps={{\n input: {\n readOnly: true,\n classes: {\n input: classes.textAreaFont,\n },\n },\n }}\n />\n </>\n )\n}\n", "import React from 'react'\n\nimport { Checkbox, FormControlLabel } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nconst useStyles = makeStyles()({\n block: {\n display: 'block',\n },\n})\n\nexport default function Checkbox2({\n checked,\n disabled,\n label,\n onChange,\n}: {\n checked: boolean\n disabled?: boolean\n label: string\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n}) {\n const { classes } = useStyles()\n return (\n <FormControlLabel\n disabled={disabled}\n className={classes.block}\n control={<Checkbox checked={checked} onChange={onChange} />}\n label={label}\n />\n )\n}\n", "import React from 'react'\n\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\nimport { Link } from '@mui/material'\n\nimport type { LinkProps } from '@mui/material'\n\nexport default function ExternalLink(props: LinkProps) {\n const { children, ...rest } = props\n return (\n <Link {...rest} target=\"_blank\" rel=\"noreferrer\">\n {children} <OpenInNewIcon fontSize=\"small\" />\n </Link>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z\"\n}), 'OpenInNew');", "import React, { useState } from 'react'\n\nimport {\n Button,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n} from '@mui/material'\n\nimport { getDatabaseTypeForId } from '../utils/util'\n\ninterface IdentifierSelectorProps {\n recognizedIds: string[]\n geneName?: string\n selectedId: string\n onSelectedIdChange: (id: string) => void\n}\n\nfunction getIdLabel(id: string): string {\n const dbType = getDatabaseTypeForId(id)\n if (dbType === 'refseq') {\n if (id.startsWith('NM_') || id.startsWith('XM_')) {\n return `${id} (RefSeq mRNA)`\n }\n if (id.startsWith('NR_') || id.startsWith('XR_')) {\n return `${id} (RefSeq ncRNA)`\n }\n if (id.startsWith('NP_') || id.startsWith('XP_')) {\n return `${id} (RefSeq protein)`\n }\n return `${id} (RefSeq)`\n }\n if (dbType === 'ensembl') {\n if (id.includes('G')) {\n return `${id} (Ensembl gene)`\n }\n if (id.includes('T')) {\n return `${id} (Ensembl transcript)`\n }\n if (id.includes('P')) {\n return `${id} (Ensembl protein)`\n }\n return `${id} (Ensembl)`\n }\n if (dbType === 'hgnc') {\n return `${id} (HGNC)`\n }\n if (dbType === 'ccds') {\n return `${id} (CCDS)`\n }\n return id\n}\n\nexport default function IdentifierSelector({\n recognizedIds,\n geneName,\n selectedId,\n onSelectedIdChange,\n}: IdentifierSelectorProps) {\n const [expanded, setExpanded] = useState(false)\n\n // Build list of selectable options\n const options: { value: string; label: string }[] = [\n { value: 'auto', label: 'Auto (try all)' },\n ...recognizedIds.map(id => ({ value: id, label: getIdLabel(id) })),\n ]\n\n if (geneName) {\n options.push({\n value: `gene:${geneName}`,\n label: `${geneName} (gene name)`,\n })\n }\n\n if (recognizedIds.length === 0 && !geneName) {\n return null\n }\n\n if (!expanded) {\n return (\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={() => {\n setExpanded(true)\n }}\n >\n Choose identifier to query...\n </Button>\n )\n }\n\n return (\n <FormControl size=\"small\">\n <InputLabel>Query UniProt by</InputLabel>\n <Select\n value={selectedId}\n label=\"Query UniProt by\"\n onChange={e => {\n onSelectedIdChange(e.target.value)\n }}\n >\n {options.map(opt => (\n <MenuItem key={opt.value} value={opt.value}>\n {opt.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'\nimport { Button, ButtonGroup, Typography } from '@mui/material'\n\nimport LaunchOptionsDialog from './LaunchOptionsDialog'\nimport SequenceMismatchNotice from './SequenceMismatchNotice'\nimport { getLaunchMissingReasons, safeLaunch } from '../utils/launchHelpers'\nimport {\n hasMsaViewPlugin,\n launch1DProteinView,\n launch3DProteinView,\n launch3DProteinViewWithMsa,\n launchMsaView,\n} from '../utils/launchViewUtils'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ninterface ProteinViewActionsProps {\n handleClose: () => void\n uniprotId?: string\n userSelectedProteinSequence?: { seq: string }\n selectedTranscript?: Feature\n url?: string\n confidenceUrl?: string\n feature: Feature\n view: LinearGenomeViewModel\n session: AbstractSessionModel\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n sequencesMatch?: boolean\n isLoading?: boolean\n /**\n * Real error from the lookup/data pipeline. When present, \"No UniProt ID\n * found\" is suppressed so it doesn't compete with the actual error message\n * shown above by <ErrorMessage>.\n */\n error?: unknown\n}\n\nexport default function ProteinViewActions({\n handleClose,\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n url,\n confidenceUrl,\n feature,\n view,\n session,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n sequencesMatch,\n isLoading,\n error,\n}: ProteinViewActionsProps) {\n const [dialogOpen, setDialogOpen] = useState(false)\n const [launchError, setLaunchError] = useState<unknown>()\n // Disable launch while loading \u2014 SWR's keepPreviousData would otherwise let\n // a user click Launch on stale results (wrong UniProt ID) during a refetch.\n const canLaunch =\n !isLoading &&\n !!uniprotId &&\n !!userSelectedProteinSequence &&\n !!selectedTranscript\n\n const missingReasons = getLaunchMissingReasons({\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n isLoading,\n error,\n })\n\n const closeMenu = () => {\n setDialogOpen(false)\n }\n\n const baseParams = {\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n }\n const launch3DParams = {\n ...baseParams,\n url,\n userProvidedTranscriptSequence: userSelectedProteinSequence?.seq,\n alignmentAlgorithm,\n }\n\n const runLaunch = (fn: () => void | Promise<void>) => () => {\n closeMenu()\n void safeLaunch(fn, handleClose, setLaunchError)\n }\n\n const handleLaunch3DView = runLaunch(() => {\n launch3DProteinView(launch3DParams)\n })\n\n const handleLaunch1DView = runLaunch(async () => {\n await launch1DProteinView({ ...baseParams, confidenceUrl })\n })\n\n const handleLaunchMsa = runLaunch(() => {\n launchMsaView(baseParams)\n })\n\n const handleLaunch3DWithMsa = runLaunch(() => {\n launch3DProteinViewWithMsa(launch3DParams)\n })\n\n const launchOptions = [\n {\n key: '3d',\n title: 'Launch 3D protein structure view',\n description:\n 'View protein structure with genome-to-structure coordinate mapping',\n onClick: handleLaunch3DView,\n },\n {\n key: '1d',\n title: 'Launch 1D protein annotation view',\n description: 'View protein features and annotations as a linear track',\n onClick: handleLaunch1DView,\n },\n ...(hasMsaViewPlugin()\n ? [\n {\n key: 'msa',\n title: 'Launch MSA view',\n description: 'View AlphaFold a3m multiple sequence alignment',\n onClick: handleLaunchMsa,\n },\n {\n key: '3d-msa',\n title: 'Launch 3D structure + MSA view',\n description: 'Launch both views with AlphaFold a3m MSA',\n onClick: handleLaunch3DWithMsa,\n },\n ]\n : []),\n ]\n\n return (\n <>\n {launchError ? <ErrorMessage error={launchError} /> : null}\n {sequencesMatch === false ? (\n <SequenceMismatchNotice\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n />\n ) : null}\n <Button\n variant=\"contained\"\n color=\"secondary\"\n size=\"small\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n {!canLaunch && missingReasons.length > 0 ? (\n <Typography variant=\"body2\" color=\"error\" sx={{ mr: 2 }}>\n {missingReasons.join('. ')}\n </Typography>\n ) : null}\n <ButtonGroup variant=\"contained\" color=\"primary\" size=\"small\">\n <Button disabled={!canLaunch} onClick={handleLaunch3DView}>\n Launch\n </Button>\n <Button\n disabled={!canLaunch}\n onClick={() => {\n setDialogOpen(true)\n }}\n aria-label=\"More launch options\"\n >\n <ArrowDropDownIcon />\n </Button>\n </ButtonGroup>\n <LaunchOptionsDialog\n open={dialogOpen}\n onClose={closeMenu}\n options={launchOptions}\n />\n </>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m7 10 5 5 5-5z\"\n}), 'ArrowDropDown');", "import React from 'react'\n\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n MenuItem,\n MenuList,\n Typography,\n} from '@mui/material'\n\ninterface LaunchOption {\n key: string\n title: string\n description: string\n onClick: () => void\n}\n\nexport default function LaunchOptionsDialog({\n open,\n onClose,\n options,\n}: {\n open: boolean\n onClose: () => void\n options: LaunchOption[]\n}) {\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogTitle>Launch options</DialogTitle>\n <DialogContent>\n <MenuList>\n {options.map(opt => (\n <MenuItem key={opt.key} onClick={opt.onClick}>\n <div>\n <Typography variant=\"body1\">{opt.title}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {opt.description}\n </Typography>\n </div>\n </MenuItem>\n ))}\n </MenuList>\n </DialogContent>\n </Dialog>\n )\n}\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport AlignmentSettingsButton from './AlignmentSettingsButton'\nimport {\n ALIGNMENT_ALGORITHM_LABELS,\n type AlignmentAlgorithm,\n} from '../../ProteinView/types'\n\nexport default function SequenceMismatchNotice({\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n return (\n <Typography\n variant=\"body2\"\n sx={{ mr: 2, display: 'flex', alignItems: 'center' }}\n >\n Transcript and structure sequences differ, will run{' '}\n {ALIGNMENT_ALGORITHM_LABELS[alignmentAlgorithm] ?? alignmentAlgorithm}{' '}\n alignment\n <AlignmentSettingsButton\n value={alignmentAlgorithm}\n onChange={onAlignmentAlgorithmChange}\n />\n </Typography>\n )\n}\n", "import React, { useState } from 'react'\n\nimport SettingsIcon from '@mui/icons-material/Settings'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n FormLabel,\n IconButton,\n Radio,\n RadioGroup,\n Tab,\n Tabs,\n TextField,\n Typography,\n} from '@mui/material'\nimport { parsePairwise } from 'clustal-js'\n\nimport { ALIGNMENT_ALGORITHMS } from '../../ProteinView/types'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { PairwiseAlignment } from '../../mappings'\n\ninterface AlignmentSettingsButtonProps {\n value: AlignmentAlgorithm\n onChange: (algorithm: AlignmentAlgorithm) => void\n onManualAlignment?: (alignment: PairwiseAlignment) => void\n}\n\nexport default function AlignmentSettingsButton({\n value,\n onChange,\n onManualAlignment,\n}: AlignmentSettingsButtonProps) {\n const [open, setOpen] = useState(false)\n const [tabValue, setTabValue] = useState(0)\n const [tempAlgorithm, setTempAlgorithm] = useState<AlignmentAlgorithm>(value)\n const [manualAlignment, setManualAlignment] = useState('')\n const [parseError, setParseError] = useState<string>()\n\n const handleOpen = () => {\n setTempAlgorithm(value)\n setManualAlignment('')\n setParseError(undefined)\n setTabValue(0)\n setOpen(true)\n }\n\n const handleSave = () => {\n if (tabValue === 0) {\n onChange(tempAlgorithm)\n } else if (tabValue === 1 && manualAlignment.trim() && onManualAlignment) {\n try {\n const parsed = parsePairwise(manualAlignment.trim())\n onManualAlignment(parsed)\n } catch (e) {\n setParseError(`Failed to parse alignment: ${e}`)\n return\n }\n }\n setOpen(false)\n }\n\n const handleCancel = () => {\n setTempAlgorithm(value)\n setManualAlignment('')\n setParseError(undefined)\n setOpen(false)\n }\n\n return (\n <>\n <IconButton onClick={handleOpen} size=\"small\" title=\"Alignment settings\">\n <SettingsIcon />\n </IconButton>\n\n <Dialog open={open} onClose={handleCancel} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Alignment Settings</DialogTitle>\n <DialogContent>\n <Tabs\n value={tabValue}\n onChange={(_, val) => {\n setTabValue(val)\n }}\n sx={{ mb: 2 }}\n >\n <Tab label=\"Automatic\" />\n <Tab label=\"Manual\" disabled={!onManualAlignment} />\n </Tabs>\n\n {tabValue === 0 ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Choose the algorithm for aligning transcript sequences to\n protein structures.\n </Typography>\n\n <FormControl component=\"fieldset\">\n <FormLabel component=\"legend\">Algorithm</FormLabel>\n <RadioGroup\n value={tempAlgorithm}\n onChange={event => {\n setTempAlgorithm(event.target.value as AlignmentAlgorithm)\n }}\n >\n <FormControlLabel\n value={ALIGNMENT_ALGORITHMS.SMITH_WATERMAN}\n control={<Radio />}\n label=\"Smith-Waterman (local alignment)\"\n />\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ ml: 4, mt: -1, mb: 1 }}\n >\n Finds best matching region. Recommended for most use cases.\n </Typography>\n\n <FormControlLabel\n value={ALIGNMENT_ALGORITHMS.NEEDLEMAN_WUNSCH}\n control={<Radio />}\n label=\"Needleman-Wunsch (global alignment)\"\n />\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ ml: 4, mt: -1, mb: 1 }}\n >\n End-to-end alignment. Use when sequences should align\n completely.\n </Typography>\n </RadioGroup>\n </FormControl>\n </>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Paste a pre-computed alignment in Clustal format. The first\n sequence should be the transcript and the second should be the\n structure.\n </Typography>\n <TextField\n multiline\n rows={10}\n fullWidth\n placeholder={`Example:\na MKAAYLSMFGKEDHKPFGD\n |||||||||||||||||||\nb MKAAYLSMFGKEDHKPFGD`}\n value={manualAlignment}\n onChange={e => {\n setManualAlignment(e.target.value)\n setParseError(undefined)\n }}\n sx={{ fontFamily: 'monospace', fontSize: 12 }}\n />\n {parseError ? (\n <Typography color=\"error\" variant=\"body2\" sx={{ mt: 1 }}>\n {parseError}\n </Typography>\n ) : null}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleCancel}>Cancel</Button>\n <Button\n onClick={handleSave}\n variant=\"contained\"\n color=\"primary\"\n disabled={tabValue === 1 && !manualAlignment.trim()}\n >\n {tabValue === 0 ? 'Save' : 'Apply Alignment'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6\"\n}), 'Settings');", "export type AlignmentAlgorithm = 'needleman_wunsch' | 'smith_waterman'\n\nexport const ALIGNMENT_ALGORITHMS = {\n NEEDLEMAN_WUNSCH: 'needleman_wunsch',\n SMITH_WATERMAN: 'smith_waterman',\n} as const\n\nexport const DEFAULT_ALIGNMENT_ALGORITHM: AlignmentAlgorithm = 'smith_waterman'\n\nconst ALIGNMENT_ALGORITHM_VALUES: AlignmentAlgorithm[] = [\n 'needleman_wunsch',\n 'smith_waterman',\n]\n\nexport function coerceAlignmentAlgorithm(value: string): AlignmentAlgorithm {\n return (\n ALIGNMENT_ALGORITHM_VALUES.find(v => v === value) ??\n DEFAULT_ALIGNMENT_ALGORITHM\n )\n}\n\nexport const ALIGNMENT_ALGORITHM_LABELS: Record<string, string> = {\n needleman_wunsch: 'Needleman-Wunsch',\n smith_waterman: 'Smith-Waterman',\n}\n", "/**\n * Run a launch fn (sync or async) and surface any thrown error via onError.\n * Used to wrap `session.addView(...)` calls so MST validation errors don't\n * fall silently into the React error boundary.\n */\nexport async function safeLaunch(\n fn: () => void | Promise<void>,\n onSuccess?: () => void,\n onError?: (e: unknown) => void,\n) {\n try {\n await fn()\n onSuccess?.()\n } catch (e) {\n console.error(e)\n onError?.(e)\n }\n}\n\ninterface LaunchRequirements {\n uniprotId?: string\n userSelectedProteinSequence?: { seq: string }\n selectedTranscript?: unknown\n isLoading?: boolean\n /**\n * If a real error already surfaced (e.g. from UniProt lookup), suppress the\n * derived \"No UniProt ID found\" reason \u2014 the underlying error is already\n * shown via <ErrorMessage> and the duplicate hint is misleading.\n */\n error?: unknown\n}\n\n/**\n * Compute user-facing reasons the Launch button is disabled. Suppressed\n * while loading or while a real upstream error is being displayed.\n */\nexport function getLaunchMissingReasons({\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n isLoading,\n error,\n}: LaunchRequirements): string[] {\n if (isLoading || error) {\n return []\n }\n return [\n !uniprotId && 'No UniProt ID found',\n !userSelectedProteinSequence &&\n 'Could not compute protein sequence (feature may be missing CDS subfeatures)',\n !selectedTranscript && 'No transcript selected',\n ].filter((s): s is string => typeof s === 'string')\n}\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport type { SequenceSearchType } from '../hooks/useAlphaFoldSequenceSearch'\n\ninterface SequenceSearchStatusProps {\n isLoading: boolean\n uniprotId?: string\n url?: string\n hasProteinSequence: boolean\n sequenceSearchType: SequenceSearchType\n}\n\nexport default function SequenceSearchStatus({\n isLoading,\n uniprotId,\n url,\n hasProteinSequence,\n sequenceSearchType,\n}: SequenceSearchStatusProps) {\n return isLoading ? null : !uniprotId && hasProteinSequence ? (\n <Typography color=\"warning.main\">\n No AlphaFold structure found for this sequence (searched by{' '}\n {sequenceSearchType === 'md5' ? 'MD5 checksum' : 'full sequence'})\n </Typography>\n ) : uniprotId ? (\n <Typography color=\"success.main\">\n Found AlphaFold structure: {uniprotId}\n {url ? (\n <>\n {' '}\n -{' '}\n <a href={url} target=\"_blank\" rel=\"noreferrer\">\n {url}\n </a>\n </>\n ) : null}\n </Typography>\n ) : null\n}\n", "import React from 'react'\n\nimport { MenuItem, TextField } from '@mui/material'\n\nimport {\n getGeneDisplayName,\n getTranscriptDisplayName,\n stripStopCodon,\n} from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function TranscriptSelector({\n val,\n setVal,\n isoforms,\n isoformSequences,\n structureSequence,\n feature,\n disabled,\n}: {\n isoforms: Feature[]\n feature: Feature\n val: string | undefined\n setVal: (str: string) => void\n structureSequence?: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n disabled?: boolean\n}) {\n const geneName = getGeneDisplayName(feature)\n const matches: Feature[] = []\n const nonMatches: Feature[] = []\n const noData: Feature[] = []\n\n for (const f of isoforms) {\n const entry = isoformSequences[f.id()]\n if (!entry) {\n noData.push(f)\n } else if (\n structureSequence &&\n stripStopCodon(entry.seq) === structureSequence\n ) {\n matches.push(f)\n } else {\n nonMatches.push(f)\n }\n }\n\n const byLengthDesc = (a: Feature, b: Feature) =>\n isoformSequences[b.id()]!.seq.length - isoformSequences[a.id()]!.seq.length\n\n return (\n <TextField\n value={val ?? ''}\n onChange={event => {\n setVal(event.target.value)\n }}\n label=\"Choose transcript isoform\"\n select\n disabled={disabled}\n >\n {matches.toSorted(byLengthDesc).map(f => (\n <MenuItem value={f.id()} key={f.id()}>\n {geneName} - {getTranscriptDisplayName(f)} (\n {isoformSequences[f.id()]!.seq.length}aa) (matches structure residues)\n </MenuItem>\n ))}\n {nonMatches.toSorted(byLengthDesc).map(f => (\n <MenuItem value={f.id()} key={f.id()}>\n {geneName} - {getTranscriptDisplayName(f)} (\n {isoformSequences[f.id()]!.seq.length}aa)\n </MenuItem>\n ))}\n {noData.map(f => (\n <MenuItem value={f.id()} key={f.id()} disabled>\n {geneName} - {getTranscriptDisplayName(f)} (no data)\n </MenuItem>\n ))}\n </TextField>\n )\n}\n", "import React from 'react'\n\nimport {\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\n\nimport ExternalLink from '../../components/ExternalLink'\n\nimport type { SequenceSearchType } from '../hooks/useAlphaFoldSequenceSearch'\n\nexport type LookupMode = 'auto' | 'manual' | 'feature' | 'sequence'\n\ninterface UniProtIdInputProps {\n lookupMode: LookupMode\n onLookupModeChange: (mode: LookupMode) => void\n manualUniprotId: string\n onManualUniprotIdChange: (id: string) => void\n featureUniprotId?: string\n hasProteinSequence?: boolean\n sequenceSearchType?: SequenceSearchType\n onSequenceSearchTypeChange?: (type: SequenceSearchType) => void\n endContent?: React.ReactNode\n}\n\nexport default function UniProtIdInput({\n lookupMode,\n onLookupModeChange,\n manualUniprotId,\n onManualUniprotIdChange,\n featureUniprotId,\n hasProteinSequence,\n sequenceSearchType,\n onSequenceSearchTypeChange,\n endContent,\n}: UniProtIdInputProps) {\n return (\n <>\n <div style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>\n <FormControl component=\"fieldset\">\n <RadioGroup\n row\n value={lookupMode}\n onChange={event => {\n onLookupModeChange(event.target.value as LookupMode)\n }}\n >\n {featureUniprotId && (\n <FormControlLabel\n value=\"feature\"\n control={<Radio />}\n label={`From feature (${featureUniprotId})`}\n />\n )}\n <FormControlLabel\n value=\"auto\"\n control={<Radio />}\n label=\"Auto-detect using UniProt ID mapping API\"\n />\n <FormControlLabel\n value=\"manual\"\n control={<Radio />}\n label=\"Enter manually\"\n />\n {hasProteinSequence && (\n <FormControlLabel\n value=\"sequence\"\n control={<Radio />}\n label=\"Search sequence against AlphaFoldDB API\"\n />\n )}\n </RadioGroup>\n </FormControl>\n {endContent}\n </div>\n\n {lookupMode === 'manual' && (\n <div>\n <TextField\n label=\"UniProt ID\"\n variant=\"outlined\"\n placeholder=\"e.g. P68871\"\n size=\"small\"\n value={manualUniprotId}\n onChange={e => {\n onManualUniprotIdChange(e.target.value)\n }}\n />\n </div>\n )}\n\n {lookupMode === 'sequence' &&\n sequenceSearchType &&\n onSequenceSearchTypeChange && (\n <div>\n <FormControl component=\"fieldset\">\n <RadioGroup\n row\n value={sequenceSearchType}\n onChange={event => {\n onSequenceSearchTypeChange(\n event.target.value as SequenceSearchType,\n )\n }}\n >\n <FormControlLabel\n value=\"md5\"\n control={<Radio />}\n label=\"Exact match\"\n />\n <FormControlLabel\n value=\"sequence\"\n control={<Radio />}\n label=\"Fuzzy match\"\n />\n </RadioGroup>\n </FormControl>\n <Typography variant=\"body2\" color=\"text.secondary\">\n May not find the canonical UniProt entry.\n </Typography>\n </div>\n )}\n\n {lookupMode === 'manual' && !manualUniprotId && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">UniProt</ExternalLink>\n {' or '}\n <ExternalLink href=\"https://alphafold.ebi.ac.uk/\">\n AlphaFoldDB\n </ExternalLink>\n </Typography>\n )}\n </>\n )\n}\n", "import React from 'react'\n\nimport {\n Chip,\n Paper,\n Radio,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport ExternalLink from '../../components/ExternalLink'\n\nimport type { UniProtEntry } from '../services/lookupMethods'\n\nconst useStyles = makeStyles()({\n tableContainer: {\n maxHeight: 200,\n },\n headerCell: {\n fontWeight: 'bold',\n backgroundColor: '#f5f5f5',\n },\n selectedRow: {\n backgroundColor: '#e3f2fd',\n },\n clickableRow: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '#f5f5f5',\n },\n },\n reviewedChip: {\n backgroundColor: '#4caf50',\n color: 'white',\n fontSize: '0.7rem',\n height: 20,\n },\n unreviewedChip: {\n backgroundColor: '#ff9800',\n color: 'white',\n fontSize: '0.7rem',\n height: 20,\n },\n})\n\ninterface UniProtResultsTableProps {\n entries: UniProtEntry[]\n selectedAccession?: string\n onSelect: (accession: string) => void\n}\n\nexport default function UniProtResultsTable({\n entries,\n selectedAccession,\n onSelect,\n}: UniProtResultsTableProps) {\n const { classes, cx } = useStyles()\n\n return entries.length === 0 ? null : (\n <div>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Found {entries.length} UniProt entries. Select one:\n </Typography>\n <TableContainer component={Paper} className={classes.tableContainer}>\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell} padding=\"checkbox\" />\n <TableCell className={classes.headerCell}>Accession</TableCell>\n <TableCell className={classes.headerCell}>Gene</TableCell>\n <TableCell className={classes.headerCell}>Organism</TableCell>\n <TableCell className={classes.headerCell}>Protein</TableCell>\n <TableCell className={classes.headerCell}>Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {entries.map(entry => (\n <TableRow\n key={entry.accession}\n onClick={() => {\n onSelect(entry.accession)\n }}\n className={cx(\n classes.clickableRow,\n selectedAccession === entry.accession && classes.selectedRow,\n )}\n >\n <TableCell padding=\"checkbox\">\n <Radio\n checked={selectedAccession === entry.accession}\n size=\"small\"\n />\n </TableCell>\n <TableCell>\n <ExternalLink\n href={`https://www.uniprot.org/uniprotkb/${entry.accession}`}\n >\n {entry.accession}\n </ExternalLink>\n </TableCell>\n <TableCell>{entry.geneName ?? '-'}</TableCell>\n <TableCell>{entry.organismName ?? '-'}</TableCell>\n <TableCell>\n {entry.proteinName\n ? entry.proteinName.length > 40\n ? `${entry.proteinName.slice(0, 40)}...`\n : entry.proteinName\n : '-'}\n </TableCell>\n <TableCell>\n <Chip\n label={entry.isReviewed ? 'Reviewed' : 'Unreviewed'}\n size=\"small\"\n className={\n entry.isReviewed\n ? classes.reviewedChip\n : classes.unreviewedChip\n }\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n", "import { useState } from 'react'\n\nimport useAlphaFoldData from './useAlphaFoldData'\nimport useAlphaFoldSequenceSearch from './useAlphaFoldSequenceSearch'\nimport useDebouncedValue from './useDebouncedValue'\nimport useTranscriptIsoformSelection from './useTranscriptIsoformSelection'\nimport useUniProtSearch from './useUniProtSearch'\nimport getSearchDescription from '../utils/getSearchDescription'\nimport { extractFeatureIdentifiers, stripStopCodon } from '../utils/util'\n\nimport type { SequenceSearchType } from './useAlphaFoldSequenceSearch'\nimport type { LookupMode } from '../components/UniProtIdInput'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function useAlphaFoldDBSearch({\n feature,\n view,\n}: {\n feature: Feature\n view: LinearGenomeViewModel\n}) {\n const [lookupMode, setLookupMode] = useState<LookupMode>('auto')\n const [manualUniprotId, setManualUniprotId] = useState('')\n const geneIds = extractFeatureIdentifiers(feature)\n const [selectedQueryId, setSelectedQueryId] = useState('auto')\n const [sequenceSearchType, setSequenceSearchType] =\n useState<SequenceSearchType>('md5')\n const [selectedUniprotId, setSelectedUniprotId] = useState<string>()\n\n const featureUniprotId = geneIds.uniprotId\n\n const effectiveLookupMode =\n lookupMode === 'auto' && featureUniprotId ? 'feature' : lookupMode\n const isSequenceMode = effectiveLookupMode === 'sequence'\n const isAutoMode = effectiveLookupMode === 'auto'\n\n const {\n entries: uniprotEntries,\n isLoading: isLookupLoading,\n error: lookupError,\n } = useUniProtSearch({\n recognizedIds: geneIds.recognizedIds,\n geneId: geneIds.geneId,\n geneName: geneIds.geneName,\n selectedQueryId,\n enabled: isAutoMode,\n })\n\n // Debounce manual entry so fetches don't fire on every keystroke and\n // pollute the SWR cache with partial-ID 404s.\n const debouncedManualUniprotId = useDebouncedValue(manualUniprotId, 400)\n\n const autoUniprotId = uniprotEntries[0]?.accession\n const uniprotId =\n effectiveLookupMode === 'feature'\n ? featureUniprotId\n : isAutoMode\n ? (selectedUniprotId ?? autoUniprotId)\n : effectiveLookupMode === 'manual'\n ? debouncedManualUniprotId\n : undefined\n\n const {\n isLoading: isAlphaFoldLoading,\n isValidating: isAlphaFoldValidating,\n error: alphaFoldError,\n url: alphaFoldUrl,\n confidenceUrl: alphaFoldConfidenceUrl,\n structureSequence: alphaFoldStructureSequence,\n } = useAlphaFoldData({\n uniprotId: isSequenceMode ? undefined : uniprotId,\n })\n\n const {\n transcripts: transcriptOptions,\n isoformSequences,\n isLoading: isIsoformLoading,\n error: isoformError,\n selectedTranscriptId: effectiveTranscriptId,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: userSelectedProteinSequence,\n } = useTranscriptIsoformSelection({\n feature,\n view,\n structureSequence: alphaFoldStructureSequence,\n resetKey: uniprotId,\n })\n\n const {\n uniprotId: seqSearchUniprotId,\n cifUrl: seqSearchUrl,\n plddtDocUrl: seqSearchConfidenceUrl,\n structureSequence: seqSearchStructureSequence,\n isLoading: isSequenceSearchLoading,\n isValidating: isSequenceSearchValidating,\n error: sequenceSearchError,\n } = useAlphaFoldSequenceSearch({\n sequence: userSelectedProteinSequence?.seq,\n searchType: sequenceSearchType,\n enabled: isSequenceMode,\n })\n\n // Merge alphafold / sequence-search results\n const finalUrl = isSequenceMode ? seqSearchUrl : alphaFoldUrl\n const finalConfidenceUrl = isSequenceMode\n ? seqSearchConfidenceUrl\n : alphaFoldConfidenceUrl\n const finalStructureSequence = isSequenceMode\n ? seqSearchStructureSequence\n : alphaFoldStructureSequence\n const finalUniprotId = isSequenceMode ? seqSearchUniprotId : uniprotId\n\n // While a structure fetch is in flight, finalStructureSequence may still be\n // the previous selection's sequence (keepPreviousData). Comparing that stale\n // sequence to the freshly-selected transcript would give a wrong match, so\n // the match is treated as unknown until the fetch settles.\n const isStructureValidating = isSequenceMode\n ? isSequenceSearchValidating\n : isAlphaFoldValidating\n\n const loadingStatuses = [\n isLookupLoading && 'Looking up UniProt ID',\n isIsoformLoading && 'Loading protein sequences from transcript isoforms',\n !isSequenceMode && isAlphaFoldLoading && 'Fetching AlphaFold structure URL',\n isSequenceMode &&\n isSequenceSearchLoading &&\n 'Searching AlphaFoldDB by sequence',\n ].filter((s): s is string => !!s)\n const isLoading = loadingStatuses.length > 0\n\n // Only show errors once all loading is done \u2014 the synchronous\n // effectiveLookupMode and autoTranscriptId computations prevent the\n // one-frame gaps that previously caused brief error flashes\n const rawError =\n isoformError ?? lookupError ?? alphaFoldError ?? sequenceSearchError\n const error = isLoading ? undefined : rawError\n\n return {\n lookupMode: effectiveLookupMode,\n setLookupMode,\n manualUniprotId,\n setManualUniprotId,\n selectedQueryId,\n setSelectedQueryId,\n sequenceSearchType,\n setSequenceSearchType,\n selectedUniprotId,\n setSelectedUniprotId,\n userSelection: effectiveTranscriptId,\n setUserSelection,\n\n transcriptOptions,\n selectedTranscript,\n isoformSequences,\n userSelectedProteinSequence,\n uniprotEntries,\n\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n featureUniprotId,\n\n uniprotId: finalUniprotId,\n url: finalUrl,\n confidenceUrl: finalConfidenceUrl,\n structureSequence: finalStructureSequence,\n\n error,\n loadingStatuses,\n isSequenceSearchLoading,\n\n showIdentifierSelector:\n isAutoMode && (geneIds.recognizedIds.length > 0 || !!geneIds.geneName),\n showStructureSelectors:\n !!isoformSequences &&\n !!selectedTranscript &&\n (isSequenceMode || !!(finalStructureSequence && finalUniprotId)),\n sequencesMatch:\n !isStructureValidating &&\n userSelectedProteinSequence?.seq &&\n finalStructureSequence\n ? stripStopCodon(userSelectedProteinSequence.seq) ===\n finalStructureSequence\n : undefined,\n\n searchDescription: getSearchDescription({\n selectedQueryId,\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n }),\n searchDescriptionOr: getSearchDescription({\n selectedQueryId,\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n joinWord: 'or',\n }),\n\n selectedTableAccession: selectedUniprotId ?? autoUniprotId,\n\n showUniprotResults:\n !!isoformSequences &&\n isAutoMode &&\n (uniprotEntries.length > 0 || isLookupLoading),\n showNoResults:\n !!isoformSequences &&\n isAutoMode &&\n !isLookupLoading &&\n uniprotEntries.length === 0,\n showSequenceSearchStatus: isSequenceMode,\n showAlphaFoldDBSearchStatus:\n !!finalStructureSequence && !!finalUniprotId && !isSequenceMode,\n isLoading,\n }\n}\n", "import useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { addStructureFromData } from '../../ProteinView/addStructureFromData'\nimport { addStructureFromURL } from '../../ProteinView/addStructureFromURL'\nimport { extractStructureSequences } from '../../ProteinView/extractStructureSequences'\nimport { withTemporaryMolstarPlugin } from '../../ProteinView/withTemporaryMolstarPlugin'\n\ntype StructureFormat = 'pdb' | 'mmcif'\n\nfunction detectStructureFormat(fileName: string): StructureFormat {\n const dot = fileName.lastIndexOf('.')\n const ext = dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : ''\n if (ext === 'cif' || ext === 'mmcif' || ext === 'bcif') {\n return 'mmcif'\n }\n return 'pdb'\n}\n\nasync function fetchSequences({ file, url }: { file?: File; url?: string }) {\n return withTemporaryMolstarPlugin(async plugin => {\n const { model } = file\n ? await addStructureFromData({\n data: await file.text(),\n plugin,\n format: detectStructureFormat(file.name),\n })\n : await addStructureFromURL({ url: url!, plugin })\n return extractStructureSequences(model)\n })\n}\n\n// Extract protein sequences from a structure given either a local File or a\n// remote URL (exactly one is expected). Used directly for user-provided\n// structures and wrapped by useAlphaFoldData for AlphaFoldDB URLs.\nexport default function useStructureFileSequence({\n file,\n url,\n}: {\n file?: File\n url?: string\n}) {\n const key = file\n ? (['structure-file', file.name, file.size, file.lastModified] as const)\n : url\n ? (['structure-url', url] as const)\n : null\n const { data, error, isLoading, isValidating } = useSWR<string[] | undefined>(\n key,\n async () => {\n const seq = await fetchSequences({ file, url })\n if (!seq) {\n throw new Error('no sequences detected in file')\n }\n return seq\n },\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n // isValidating distinguishes \"fetching for the current key\" from the stale\n // data keepPreviousData keeps around during a key change. Consumers comparing\n // this sequence against another need it to avoid matching against stale data.\n return { error, isLoading, isValidating, sequences: data }\n}\n", "// Shared SWR config for one-shot fetches that should never auto-revalidate\n// (structure files, computed protein sequences). keepPreviousData is opt-in\n// per-hook since it avoids result flicker when the key changes.\nexport const STATIC_SWR_OPTIONS = {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n revalidateIfStale: false,\n} as const\n", "import type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { StructureRepresentationPresetProvider } from 'molstar/lib/mol-plugin-state/builder/structure/representation-preset'\nimport type { StateObjectSelector } from 'molstar/lib/mol-state'\n\nexport interface LoadStructureOptions {\n representationParams?: StructureRepresentationPresetProvider.CommonParams\n}\n\nexport async function applyStructurePreset({\n plugin,\n trajectory,\n options,\n}: {\n plugin: PluginContext\n trajectory: StateObjectSelector\n options?: LoadStructureOptions\n}) {\n const model = await plugin.builders.structure.createModel(trajectory)\n\n await plugin.builders.structure.hierarchy.applyPreset(\n trajectory,\n 'all-models',\n {\n useDefaultIfSingleModel: true,\n representationPresetParams: options?.representationParams,\n },\n )\n return { model }\n}\n", "import { applyStructurePreset } from './structurePipeline'\n\nimport type { LoadStructureOptions } from './structurePipeline'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { BuiltInTrajectoryFormat } from 'molstar/lib/mol-plugin-state/formats/trajectory'\n\nexport async function addStructureFromData({\n data,\n format = 'pdb',\n options,\n plugin,\n}: {\n data: string\n format?: BuiltInTrajectoryFormat\n options?: LoadStructureOptions & { label?: string; dataLabel?: string }\n plugin: PluginContext\n}) {\n const _data = await plugin.builders.data.rawData({\n data,\n label: options?.dataLabel,\n })\n\n const trajectory = await plugin.builders.structure.parseTrajectory(\n _data,\n format,\n )\n return applyStructurePreset({ plugin, trajectory, options })\n}\n\nexport { type LoadStructureOptions } from './structurePipeline'\n", "import { applyStructurePreset } from './structurePipeline'\n\nimport type { LoadStructureOptions } from './structurePipeline'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { BuiltInTrajectoryFormat } from 'molstar/lib/mol-plugin-state/formats/trajectory'\n\nexport async function addStructureFromURL({\n url,\n format = 'mmcif',\n isBinary,\n options,\n plugin,\n}: {\n url: string\n format?: BuiltInTrajectoryFormat\n isBinary?: boolean\n options?: LoadStructureOptions & { label?: string }\n plugin: PluginContext\n}) {\n const data = await plugin.builders.data.download(\n {\n url,\n isBinary,\n },\n {\n state: {\n isGhost: true,\n },\n },\n )\n\n const trajectory = await plugin.builders.structure.parseTrajectory(\n data,\n format,\n )\n return applyStructurePreset({ plugin, trajectory, options })\n}\n\nexport { type LoadStructureOptions } from './structurePipeline'\n", "interface StructureModel {\n obj?: {\n data: {\n sequence: {\n sequences: readonly {\n sequence: {\n label: {\n toArray(): ArrayLike<string>\n }\n }\n }[]\n }\n }\n }\n}\n\nexport function extractStructureSequences(\n model: StructureModel,\n): string[] | undefined {\n return model.obj?.data.sequence.sequences.map(s =>\n Array.from(s.sequence.label.toArray()).join(''),\n )\n}\n", "import loadMolstar from './loadMolstar'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport async function withTemporaryMolstarPlugin<T>(\n callback: (plugin: PluginContext) => Promise<T>,\n) {\n const { createPluginUI, renderReact18 } = await loadMolstar()\n const ret = document.createElement('div')\n const plugin = await createPluginUI({\n target: ret,\n render: renderReact18,\n })\n\n try {\n return await callback(plugin)\n } finally {\n plugin.unmount()\n ret.remove()\n }\n}\n", "import useStructureFileSequence from './useStructureFileSequence'\nimport {\n getAlphaFoldConfidenceUrl,\n getAlphaFoldStructureUrl,\n} from '../utils/launchViewUtils'\n\nexport default function useAlphaFoldData({\n uniprotId,\n}: {\n uniprotId?: string\n}) {\n const url = uniprotId ? getAlphaFoldStructureUrl(uniprotId) : undefined\n const confidenceUrl = uniprotId\n ? getAlphaFoldConfidenceUrl(uniprotId)\n : undefined\n\n const { sequences, isLoading, isValidating, error } =\n useStructureFileSequence({ url })\n\n return {\n isLoading,\n isValidating,\n error,\n url,\n confidenceUrl,\n structureSequence: sequences?.[0],\n }\n}\n", "import { useMemo } from 'react'\n\nimport useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { jsonfetch } from '../../fetchUtils'\nimport { md5 } from '../utils/md5'\nimport { stripStopCodon } from '../utils/util'\n\nexport type SequenceSearchType = 'md5' | 'sequence'\n\ninterface SequenceSummaryResponse {\n entryId?: string\n uniprotAccession?: string\n uniprotId?: string\n uniprotDescription?: string\n taxId?: number\n organismScientificName?: string\n uniprotStart?: number\n uniprotEnd?: number\n modelUrl?: string\n cifUrl?: string\n plddtDocUrl?: string\n sequence?: string\n}\n\nexport default function useAlphaFoldSequenceSearch({\n sequence,\n searchType,\n enabled = true,\n}: {\n sequence?: string\n searchType: SequenceSearchType\n enabled?: boolean\n}) {\n const searchValue = useMemo(() => {\n if (!sequence) {\n return undefined\n }\n const cleanSeq = stripStopCodon(sequence.toUpperCase())\n return searchType === 'md5' ? md5(cleanSeq) : cleanSeq\n }, [sequence, searchType])\n\n const { data, error, isLoading, isValidating } =\n useSWR<SequenceSummaryResponse>(\n enabled && searchValue\n ? `https://alphafold.ebi.ac.uk/api/sequence/summary?id=${encodeURIComponent(searchValue)}&type=${searchType}`\n : null,\n jsonfetch,\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return {\n isLoading,\n isValidating,\n result: data,\n uniprotId: data?.uniprotAccession,\n cifUrl: data?.cifUrl,\n plddtDocUrl: data?.plddtDocUrl,\n structureSequence: data?.sequence,\n error,\n }\n}\n", "export async function myfetch(url: string, args?: RequestInit) {\n const response = await fetch(url, args)\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} fetching ${url} ${await response.text()}`,\n )\n }\n\n return response\n}\n\nexport async function jsonfetch<T = unknown>(\n url: string,\n args?: RequestInit,\n): Promise<T> {\n const response = await myfetch(url, args)\n return response.json()\n}\n\nfunction abortError(signal: AbortSignal) {\n return signal.reason instanceof Error\n ? signal.reason\n : new Error('Aborted', { cause: signal.reason })\n}\n\nexport function timeout(time: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal))\n } else {\n const id = setTimeout(resolve, time)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(id)\n reject(abortError(signal))\n },\n { once: true },\n )\n }\n })\n}\n", "// MD5 implementation based on RFC 1321\n// Adapted from public domain implementations\n\nfunction safeAdd(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\nfunction bitRotateLeft(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\nfunction md5cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n}\n\nfunction md5ff(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n}\n\nfunction md5gg(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n}\n\nfunction md5hh(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\n}\n\nfunction md5ii(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n}\n\nfunction binlMd5(x: number[], len: number) {\n x[len >> 5]! |= 0x80 << (len % 32)\n x[(((len + 64) >>> 9) << 4) + 14] = len\n\n let a = 1732584193\n let b = -271733879\n let c = -1732584194\n let d = 271733878\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a\n const oldb = b\n const oldc = c\n const oldd = d\n\n a = md5ff(a, b, c, d, x[i] ?? 0, 7, -680876936)\n d = md5ff(d, a, b, c, x[i + 1] ?? 0, 12, -389564586)\n c = md5ff(c, d, a, b, x[i + 2] ?? 0, 17, 606105819)\n b = md5ff(b, c, d, a, x[i + 3] ?? 0, 22, -1044525330)\n a = md5ff(a, b, c, d, x[i + 4] ?? 0, 7, -176418897)\n d = md5ff(d, a, b, c, x[i + 5] ?? 0, 12, 1200080426)\n c = md5ff(c, d, a, b, x[i + 6] ?? 0, 17, -1473231341)\n b = md5ff(b, c, d, a, x[i + 7] ?? 0, 22, -45705983)\n a = md5ff(a, b, c, d, x[i + 8] ?? 0, 7, 1770035416)\n d = md5ff(d, a, b, c, x[i + 9] ?? 0, 12, -1958414417)\n c = md5ff(c, d, a, b, x[i + 10] ?? 0, 17, -42063)\n b = md5ff(b, c, d, a, x[i + 11] ?? 0, 22, -1990404162)\n a = md5ff(a, b, c, d, x[i + 12] ?? 0, 7, 1804603682)\n d = md5ff(d, a, b, c, x[i + 13] ?? 0, 12, -40341101)\n c = md5ff(c, d, a, b, x[i + 14] ?? 0, 17, -1502002290)\n b = md5ff(b, c, d, a, x[i + 15] ?? 0, 22, 1236535329)\n\n a = md5gg(a, b, c, d, x[i + 1] ?? 0, 5, -165796510)\n d = md5gg(d, a, b, c, x[i + 6] ?? 0, 9, -1069501632)\n c = md5gg(c, d, a, b, x[i + 11] ?? 0, 14, 643717713)\n b = md5gg(b, c, d, a, x[i] ?? 0, 20, -373897302)\n a = md5gg(a, b, c, d, x[i + 5] ?? 0, 5, -701558691)\n d = md5gg(d, a, b, c, x[i + 10] ?? 0, 9, 38016083)\n c = md5gg(c, d, a, b, x[i + 15] ?? 0, 14, -660478335)\n b = md5gg(b, c, d, a, x[i + 4] ?? 0, 20, -405537848)\n a = md5gg(a, b, c, d, x[i + 9] ?? 0, 5, 568446438)\n d = md5gg(d, a, b, c, x[i + 14] ?? 0, 9, -1019803690)\n c = md5gg(c, d, a, b, x[i + 3] ?? 0, 14, -187363961)\n b = md5gg(b, c, d, a, x[i + 8] ?? 0, 20, 1163531501)\n a = md5gg(a, b, c, d, x[i + 13] ?? 0, 5, -1444681467)\n d = md5gg(d, a, b, c, x[i + 2] ?? 0, 9, -51403784)\n c = md5gg(c, d, a, b, x[i + 7] ?? 0, 14, 1735328473)\n b = md5gg(b, c, d, a, x[i + 12] ?? 0, 20, -1926607734)\n\n a = md5hh(a, b, c, d, x[i + 5] ?? 0, 4, -378558)\n d = md5hh(d, a, b, c, x[i + 8] ?? 0, 11, -2022574463)\n c = md5hh(c, d, a, b, x[i + 11] ?? 0, 16, 1839030562)\n b = md5hh(b, c, d, a, x[i + 14] ?? 0, 23, -35309556)\n a = md5hh(a, b, c, d, x[i + 1] ?? 0, 4, -1530992060)\n d = md5hh(d, a, b, c, x[i + 4] ?? 0, 11, 1272893353)\n c = md5hh(c, d, a, b, x[i + 7] ?? 0, 16, -155497632)\n b = md5hh(b, c, d, a, x[i + 10] ?? 0, 23, -1094730640)\n a = md5hh(a, b, c, d, x[i + 13] ?? 0, 4, 681279174)\n d = md5hh(d, a, b, c, x[i] ?? 0, 11, -358537222)\n c = md5hh(c, d, a, b, x[i + 3] ?? 0, 16, -722521979)\n b = md5hh(b, c, d, a, x[i + 6] ?? 0, 23, 76029189)\n a = md5hh(a, b, c, d, x[i + 9] ?? 0, 4, -640364487)\n d = md5hh(d, a, b, c, x[i + 12] ?? 0, 11, -421815835)\n c = md5hh(c, d, a, b, x[i + 15] ?? 0, 16, 530742520)\n b = md5hh(b, c, d, a, x[i + 2] ?? 0, 23, -995338651)\n\n a = md5ii(a, b, c, d, x[i] ?? 0, 6, -198630844)\n d = md5ii(d, a, b, c, x[i + 7] ?? 0, 10, 1126891415)\n c = md5ii(c, d, a, b, x[i + 14] ?? 0, 15, -1416354905)\n b = md5ii(b, c, d, a, x[i + 5] ?? 0, 21, -57434055)\n a = md5ii(a, b, c, d, x[i + 12] ?? 0, 6, 1700485571)\n d = md5ii(d, a, b, c, x[i + 3] ?? 0, 10, -1894986606)\n c = md5ii(c, d, a, b, x[i + 10] ?? 0, 15, -1051523)\n b = md5ii(b, c, d, a, x[i + 1] ?? 0, 21, -2054922799)\n a = md5ii(a, b, c, d, x[i + 8] ?? 0, 6, 1873313359)\n d = md5ii(d, a, b, c, x[i + 15] ?? 0, 10, -30611744)\n c = md5ii(c, d, a, b, x[i + 6] ?? 0, 15, -1560198380)\n b = md5ii(b, c, d, a, x[i + 13] ?? 0, 21, 1309151649)\n a = md5ii(a, b, c, d, x[i + 4] ?? 0, 6, -145523070)\n d = md5ii(d, a, b, c, x[i + 11] ?? 0, 10, -1120210379)\n c = md5ii(c, d, a, b, x[i + 2] ?? 0, 15, 718787259)\n b = md5ii(b, c, d, a, x[i + 9] ?? 0, 21, -343485551)\n\n a = safeAdd(a, olda)\n b = safeAdd(b, oldb)\n c = safeAdd(c, oldc)\n d = safeAdd(d, oldd)\n }\n return [a, b, c, d]\n}\n\nfunction binl2hex(binarray: number[]) {\n const hexTab = '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hexTab.charAt((binarray[i >> 2]! >> ((i % 4) * 8 + 4)) & 0xf) +\n hexTab.charAt((binarray[i >> 2]! >> ((i % 4) * 8)) & 0xf)\n }\n return str\n}\n\nfunction str2binl(str: string) {\n const bin: number[] = []\n const mask = (1 << 8) - 1\n for (let i = 0; i < str.length * 8; i += 8) {\n bin[i >> 5] =\n (bin[i >> 5] ?? 0) | ((str.charCodeAt(i / 8) & mask) << (i % 32))\n }\n return bin\n}\n\nexport function md5(str: string) {\n return binl2hex(binlMd5(str2binl(str), str.length * 8))\n}\n", "import { useEffect, useState } from 'react'\n\n/**\n * Returns `value` after it has been stable for `delayMs`. Used to throttle\n * network fetches keyed off a fast-changing input (e.g. text fields) without\n * having to debounce the input handler itself.\n */\nexport default function useDebouncedValue<T>(value: T, delayMs = 300): T {\n const [debounced, setDebounced] = useState(value)\n useEffect(() => {\n const t = setTimeout(() => {\n setDebounced(value)\n }, delayMs)\n return () => {\n clearTimeout(t)\n }\n }, [value, delayMs])\n return debounced\n}\n", "import { getSession } from '@jbrowse/core/util'\nimport useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { fetchProteinSeq } from '../utils/calculateProteinSequence'\nimport { getTranscriptFeatures } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function useIsoformProteinSequences({\n feature,\n view,\n}: {\n feature: Feature\n view?: { assemblyNames?: string[] }\n}) {\n const { data, error, isLoading } = useSWR<\n Record<string, { feature: Feature; seq: string }>\n >(\n ['isoform-sequences', feature.id(), view?.assemblyNames?.[0]],\n async () => {\n const transcripts = getTranscriptFeatures(feature)\n const errors: unknown[] = []\n const results = await Promise.all(\n transcripts.map(async f => {\n try {\n const seq = await fetchProteinSeq({\n session: getSession(view),\n assemblyName: view?.assemblyNames?.[0],\n feature: f,\n })\n return seq ? ([f.id(), { feature: f, seq }] as const) : undefined\n } catch (e) {\n console.error('[useIsoformProteinSequences] error for', f.id(), e)\n errors.push(e)\n return undefined\n }\n }),\n )\n const entries = results.filter(r => r !== undefined)\n // If every transcript fetch failed, surface the underlying error rather\n // than silently returning {} \u2014 otherwise the UI shows the misleading\n // \"feature may be missing CDS subfeatures\" hint with no actual cause.\n if (\n entries.length === 0 &&\n errors.length === transcripts.length &&\n errors.length > 0\n ) {\n throw errors[0]\n }\n return Object.fromEntries(entries)\n },\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return { isLoading, isoformSequences: data, error }\n}\n", "import { getConf } from '@jbrowse/core/configuration'\nimport {\n defaultCodonTable,\n generateCodonTable,\n revcom,\n} from '@jbrowse/core/util'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\n\nexport interface Feat {\n start: number\n end: number\n type: string\n}\n\nexport function stitch(subfeats: Feat[], sequence: string) {\n return subfeats.map(sub => sequence.slice(sub.start, sub.end)).join('')\n}\n\nexport function calculateProteinSequence({\n cds,\n sequence,\n codonTable,\n}: {\n cds: Feat[]\n sequence: string\n codonTable: Record<string, string>\n}) {\n const str = stitch(cds, sequence)\n let protein = ''\n for (let i = 0; i < str.length; i += 3) {\n // use & symbol for undefined codon, or partial slice\n protein += codonTable[str.slice(i, i + 3)] ?? '&'\n }\n return protein\n}\n\nexport function revlist(list: Feat[], seqlen: number) {\n return list\n .map(sub => ({\n ...sub,\n start: seqlen - sub.end,\n end: seqlen - sub.start,\n }))\n .toSorted((a, b) => a.start - b.start)\n}\n\nfunction getItemId(feat: Feat) {\n return `${feat.start}-${feat.end}`\n}\n\nexport function dedupe(list: Feat[]) {\n return list.filter(\n (item, pos, ary) => !pos || getItemId(item) !== getItemId(ary[pos - 1]!),\n )\n}\n\nexport function getProteinSequence({\n feature,\n seq,\n}: {\n seq: string\n feature: Feature\n}) {\n const featureStart = feature.get('start')\n const strand = feature.get('strand')\n const subfeatures = feature.get('subfeatures') ?? []\n const cds = dedupe(\n subfeatures\n .toSorted((a, b) => a.get('start') - b.get('start'))\n .map(sub => ({\n start: sub.get('start') - featureStart,\n end: sub.get('end') - featureStart,\n type: sub.get('type'),\n }))\n .filter(f => f.type === 'CDS'),\n )\n\n return calculateProteinSequence({\n cds: strand === -1 ? revlist(cds, seq.length) : cds,\n sequence: strand === -1 ? revcom(seq) : seq,\n codonTable: generateCodonTable(defaultCodonTable),\n })\n}\n\nexport async function fetchProteinSeq({\n feature,\n session,\n assemblyName,\n}: {\n feature: Feature\n session: AbstractSessionModel\n assemblyName: string | undefined\n}) {\n const start = feature.get('start')\n const end = feature.get('end')\n const refName = feature.get('refName')\n const { assemblyManager, rpcManager } = session\n const assembly = assemblyName\n ? await assemblyManager.waitForAssembly(assemblyName)\n : undefined\n if (!assembly) {\n throw new Error('assembly not found')\n }\n const sessionId = 'getSequence'\n const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {\n adapterConfig: getConf(assembly, ['sequence', 'adapter']),\n sessionId,\n regions: [\n {\n start,\n end,\n refName: assembly.getCanonicalRefName(refName),\n assemblyName,\n },\n ],\n })\n\n const [feat] = feats as Feature[]\n const seq = feat?.get('seq') as string | undefined\n return seq ? getProteinSequence({ seq, feature }) : undefined\n}\n", "import { useMemo, useState } from 'react'\n\nimport { selectBestTranscript } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function useTranscriptSelection({\n options,\n isoformSequences,\n structureSequence,\n resetKey,\n}: {\n options: Feature[]\n isoformSequences?: Record<string, { feature: Feature; seq: string }>\n structureSequence?: string\n // When this value changes the manual selection is cleared, falling back to\n // the recomputed auto-selection (e.g. after the user picks a different\n // UniProt entry, which yields a different structure).\n resetKey?: string\n}) {\n const [userSelection, setUserSelection] = useState<string>()\n const [prevResetKey, setPrevResetKey] = useState(resetKey)\n if (resetKey !== prevResetKey) {\n setPrevResetKey(resetKey)\n setUserSelection(undefined)\n }\n\n const autoSelection = useMemo(\n () =>\n isoformSequences !== undefined\n ? selectBestTranscript({\n options,\n isoformSequences,\n structureSequence,\n })?.id()\n : undefined,\n [options, structureSequence, isoformSequences],\n )\n\n return { userSelection: userSelection ?? autoSelection, setUserSelection }\n}\n", "import useIsoformProteinSequences from './useIsoformProteinSequences'\nimport useTranscriptSelection from './useTranscriptSelection'\nimport { getId, getTranscriptFeatures } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\n// Bundles the transcript-isoform wiring shared by all three launch tabs:\n// list transcripts, fetch their protein sequences, auto/manually select one,\n// and resolve the selection back to its feature + sequence.\nexport default function useTranscriptIsoformSelection({\n feature,\n view,\n structureSequence,\n resetKey,\n}: {\n feature: Feature\n view?: { assemblyNames?: string[] }\n structureSequence?: string\n resetKey?: string\n}) {\n const transcripts = getTranscriptFeatures(feature)\n const { isoformSequences, isLoading, error } = useIsoformProteinSequences({\n feature,\n view,\n })\n const { userSelection, setUserSelection } = useTranscriptSelection({\n options: transcripts,\n isoformSequences,\n structureSequence,\n resetKey,\n })\n const selectedTranscript = transcripts.find(f => getId(f) === userSelection)\n const selectedIsoform = userSelection\n ? isoformSequences?.[userSelection]\n : undefined\n\n return {\n transcripts,\n isoformSequences,\n isLoading,\n error,\n selectedTranscriptId: userSelection,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform,\n }\n}\n", "import useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { searchUniProtEntries } from '../services/lookupMethods'\nimport { isRecognizedDatabaseId } from '../utils/util'\n\nimport type { UniProtEntry } from '../services/lookupMethods'\n\nexport default function useUniProtSearch({\n recognizedIds = [],\n geneId,\n geneName,\n selectedQueryId = 'auto',\n enabled = true,\n}: {\n recognizedIds?: string[]\n geneId?: string\n geneName?: string\n selectedQueryId?: string\n enabled?: boolean\n}) {\n // Determine what to search based on selectedQueryId\n let idsToSearch: string[] = []\n let geneNameToSearch: string | undefined\n\n if (selectedQueryId === 'auto') {\n idsToSearch = recognizedIds\n geneNameToSearch = geneName\n } else if (selectedQueryId.startsWith('gene:')) {\n geneNameToSearch = selectedQueryId.replace('gene:', '')\n } else if (isRecognizedDatabaseId(selectedQueryId)) {\n idsToSearch = [selectedQueryId]\n }\n\n const hasValidId =\n idsToSearch.some(id => isRecognizedDatabaseId(id)) ||\n Boolean(geneNameToSearch)\n\n const { data, error, isLoading } = useSWR<UniProtEntry[]>(\n enabled && hasValidId\n ? [\n 'uniprotSearch',\n selectedQueryId,\n idsToSearch.join(','),\n geneNameToSearch,\n ]\n : null,\n async () =>\n searchUniProtEntries({\n recognizedIds: idsToSearch,\n geneId,\n geneName: geneNameToSearch,\n }),\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return {\n entries: data ?? [],\n isLoading,\n error,\n hasValidId,\n }\n}\n", "import { jsonfetch } from '../../fetchUtils'\nimport {\n getDatabaseTypeForId,\n isRecognizedDatabaseId,\n stripTrailingVersion,\n} from '../utils/util'\n\ninterface UniProtApiResult {\n results: {\n entryType: string\n primaryAccession: string\n uniProtkbId?: string\n genes?: {\n geneName?: {\n value: string\n }\n }[]\n organism?: {\n taxonId: number\n scientificName?: string\n commonName?: string\n }\n proteinDescription?: {\n recommendedName?: {\n fullName?: {\n value: string\n }\n }\n }\n }[]\n}\n\nexport interface UniProtEntry {\n accession: string\n id?: string\n geneName?: string\n organismName?: string\n proteinName?: string\n isReviewed: boolean\n}\n\nconst UNIPROT_FIELDS =\n 'accession,id,gene_names,organism_name,protein_name,reviewed'\n\nfunction mapApiResultToEntry(\n result: UniProtApiResult['results'][0],\n): UniProtEntry {\n return {\n accession: result.primaryAccession,\n id: result.uniProtkbId,\n geneName: result.genes?.[0]?.geneName?.value,\n organismName:\n result.organism?.commonName ?? result.organism?.scientificName,\n proteinName: result.proteinDescription?.recommendedName?.fullName?.value,\n isReviewed: result.entryType === 'UniProtKB reviewed (Swiss-Prot)',\n }\n}\n\n/**\n * Build UniProt xref query for a recognized database ID\n */\nfunction buildXrefQuery(id: string): string | undefined {\n const dbType = getDatabaseTypeForId(id)\n switch (dbType) {\n case 'ensembl':\n return `xref:ensembl-${id}`\n case 'refseq':\n return `xref:refseq-${id}`\n case 'ccds':\n return `xref:ccds-${id}`\n case 'hgnc':\n return `xref:hgnc-${id.replace('HGNC:', '')}`\n default:\n return undefined\n }\n}\n\nasync function searchUniProt(\n query: string,\n size = 10,\n): Promise<UniProtEntry[]> {\n const url = `https://rest.uniprot.org/uniprotkb/search?query=${encodeURIComponent(query)}&fields=${UNIPROT_FIELDS}&size=${size}`\n const data = await jsonfetch<UniProtApiResult>(url)\n return data.results.map(mapApiResultToEntry)\n}\n\ninterface SearchByXrefResult {\n entries: UniProtEntry[]\n error: unknown\n}\n\nasync function searchByXref(id: string): Promise<SearchByXrefResult> {\n const query = buildXrefQuery(id)\n if (!query) {\n return { entries: [], error: undefined }\n }\n try {\n return { entries: await searchUniProt(query), error: undefined }\n } catch (e) {\n console.error(`xref search failed for ${id}:`, e)\n return { entries: [], error: e }\n }\n}\n\nfunction deduplicateEntries(entries: UniProtEntry[]) {\n const seen = new Set<string>()\n const result: UniProtEntry[] = []\n for (const entry of entries) {\n if (!seen.has(entry.accession)) {\n seen.add(entry.accession)\n result.push(entry)\n }\n }\n return result\n}\n\nexport async function searchUniProtEntries({\n recognizedIds = [],\n geneId,\n geneName,\n organismId = 9606,\n}: {\n recognizedIds?: string[]\n geneId?: string\n geneName?: string\n organismId?: number\n}) {\n const idsToSearch = new Set(recognizedIds)\n const strippedGeneId = geneId ? stripTrailingVersion(geneId) : undefined\n if (strippedGeneId && isRecognizedDatabaseId(strippedGeneId)) {\n idsToSearch.add(strippedGeneId)\n }\n\n const xrefResults = await Promise.all([...idsToSearch].map(searchByXref))\n let entries = deduplicateEntries(xrefResults.flatMap(r => r.entries))\n const xrefErrors = xrefResults.filter(r => r.error !== undefined)\n\n // Fallback: if no reviewed entries found, try gene name search\n let geneNameError: unknown\n if (!entries.some(e => e.isReviewed) && geneName) {\n try {\n const query = `gene:${geneName}+AND+organism_id:${organismId}+AND+reviewed:true`\n const geneNameResults = await searchUniProt(query, 5)\n entries = deduplicateEntries([...entries, ...geneNameResults])\n } catch (e) {\n console.error(`gene name search failed for ${geneName}:`, e)\n geneNameError = e\n }\n }\n\n // If we got no entries but every attempted lookup failed, surface the\n // underlying error rather than silently returning []. Otherwise consumers\n // see \"No UniProt ID found\" with no indication that the network failed.\n if (entries.length === 0) {\n const attempted = idsToSearch.size + (geneName ? 1 : 0)\n const failed = xrefErrors.length + (geneNameError ? 1 : 0)\n if (attempted > 0 && attempted === failed) {\n throw (geneNameError ?? xrefErrors[0]?.error) as Error\n }\n }\n\n return entries.toSorted((a, b) => Number(b.isReviewed) - Number(a.isReviewed))\n}\n", "export default function getSearchDescription({\n selectedQueryId,\n recognizedIds,\n geneName,\n joinWord = 'and',\n}: {\n selectedQueryId: string\n recognizedIds: string[]\n geneName?: string\n joinWord?: 'and' | 'or'\n}) {\n if (selectedQueryId === 'auto') {\n return [\n recognizedIds.length > 0\n ? `database ID${recognizedIds.length > 1 ? 's' : ''} \"${recognizedIds.join('\", \"')}\"`\n : undefined,\n geneName ? `gene name \"${geneName}\"` : undefined,\n ]\n .filter(Boolean)\n .join(` ${joinWord} `)\n }\n if (selectedQueryId.startsWith('gene:')) {\n return `gene name \"${selectedQueryId.replace('gene:', '')}\"`\n }\n return `database ID \"${selectedQueryId}\"`\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n TextField,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport FoldseekDatabaseSelector from './FoldseekDatabaseSelector'\nimport FoldseekResultsTable from './FoldseekResultsTable'\nimport TranscriptSelector from './TranscriptSelector'\nimport useFoldseekSearch from '../hooks/useFoldseekSearch'\nimport useTranscriptIsoformSelection from '../hooks/useTranscriptIsoformSelection'\nimport { DEFAULT_DATABASES } from '../services/foldseekApi'\nimport { stripStopCodon } from '../utils/util'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n dialogContent: {\n width: '80em',\n display: 'flex',\n flexDirection: 'column',\n gap: 20,\n },\n sequenceInput: {\n fontFamily: 'monospace',\n },\n di3Section: {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n },\n})\n\nconst FoldseekSearch = observer(function FoldseekSearch({\n feature,\n session,\n view,\n handleClose,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n handleClose: () => void\n}) {\n const { classes } = useStyles()\n\n const [userEditedSequence, setUserEditedSequence] = useState<\n string | undefined\n >()\n const [selectedDatabases, setSelectedDatabases] = useState(DEFAULT_DATABASES)\n\n const {\n results,\n cleanedAaSequence,\n di3Sequence,\n isLoading,\n isPredicting,\n error,\n statusMessage,\n predictStructure,\n search,\n reset,\n } = useFoldseekSearch()\n\n const {\n transcripts,\n isoformSequences,\n isLoading: isLoadingIsoforms,\n error: isoformError,\n selectedTranscriptId: effectiveSelectedTranscriptId,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: selectedIsoformData,\n } = useTranscriptIsoformSelection({ feature, view })\n\n const cleanedSequence = selectedIsoformData\n ? stripStopCodon(selectedIsoformData.seq)\n : ''\n const sequence = userEditedSequence ?? cleanedSequence\n\n const setUserSelectionWithReset = (id: string | undefined) => {\n setUserSelection(id)\n setUserEditedSequence(undefined)\n }\n\n const canPredict = sequence.trim().length > 0 && !isPredicting && !isLoading\n const canSearch =\n !!cleanedAaSequence &&\n !!di3Sequence &&\n selectedDatabases.length > 0 &&\n !isLoading\n\n const combinedError = error ?? isoformError\n const isBusy = isLoading || isPredicting\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {combinedError && !isLoadingIsoforms ? (\n <ErrorMessage error={combinedError} />\n ) : null}\n\n {isLoadingIsoforms ? (\n <LoadingEllipses\n variant=\"subtitle2\"\n message=\"Loading transcript sequences\"\n />\n ) : null}\n\n {isoformSequences ? (\n <>\n <TranscriptSelector\n val={effectiveSelectedTranscriptId}\n setVal={setUserSelectionWithReset}\n isoforms={transcripts}\n isoformSequences={isoformSequences}\n feature={feature}\n disabled={isBusy}\n />\n <TextField\n label=\"Protein sequence (amino acids)\"\n multiline\n rows={4}\n value={sequence}\n onChange={e => {\n setUserEditedSequence(e.target.value)\n }}\n placeholder={`MKTVRQERLKSIVRILERSKEPVSGAQLAEEL...`}\n disabled={isBusy}\n InputProps={{\n className: classes.sequenceInput,\n }}\n />\n </>\n ) : null}\n\n {di3Sequence ? (\n <div className={classes.di3Section}>\n <Typography variant=\"subtitle2\">\n 3Di structural alphabet (used for searching):\n </Typography>\n <TextField\n multiline\n rows={4}\n value={di3Sequence}\n InputProps={{\n className: classes.sequenceInput,\n readOnly: true,\n }}\n />\n </div>\n ) : null}\n\n <FoldseekDatabaseSelector\n selected={selectedDatabases}\n onChange={setSelectedDatabases}\n disabled={isBusy}\n />\n\n {statusMessage ? (\n <LoadingEllipses variant=\"subtitle2\" message={statusMessage} />\n ) : null}\n\n {results ? (\n <FoldseekResultsTable\n results={results}\n session={session}\n view={view}\n feature={feature}\n selectedTranscript={selectedTranscript}\n userProvidedTranscriptSequence={sequence}\n onClose={handleClose}\n />\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n {results ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n reset()\n }}\n >\n New search\n </Button>\n ) : null}\n {!di3Sequence ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canPredict}\n onClick={() => {\n void predictStructure(sequence.trim())\n }}\n >\n {isPredicting ? 'Predicting...' : 'Predict 3Di structure'}\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canSearch}\n onClick={() => {\n void search(cleanedAaSequence!, di3Sequence, selectedDatabases)\n }}\n >\n {isLoading ? 'Searching...' : 'Search Foldseek'}\n </Button>\n )}\n </DialogActions>\n </>\n )\n})\n\nexport default FoldseekSearch\n", "import React from 'react'\n\nimport {\n Button,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport {\n FOLDSEEK_DATABASES,\n type FoldseekDatabaseId,\n} from '../services/foldseekApi'\n\nconst useStyles = makeStyles()({\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n },\n buttons: {\n display: 'flex',\n gap: 4,\n },\n checkboxGroup: {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 0,\n },\n})\n\nexport default function FoldseekDatabaseSelector({\n selected,\n onChange,\n disabled,\n}: {\n selected: FoldseekDatabaseId[]\n onChange: (databases: FoldseekDatabaseId[]) => void\n disabled?: boolean\n}) {\n const { classes } = useStyles()\n\n return (\n <div className={classes.root}>\n <div className={classes.header}>\n <Typography variant=\"subtitle2\">Databases to search:</Typography>\n <div className={classes.buttons}>\n <Button\n size=\"small\"\n onClick={() => {\n onChange(FOLDSEEK_DATABASES.map(db => db.id))\n }}\n disabled={disabled}\n >\n Select all\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n onChange([])\n }}\n disabled={disabled}\n >\n Clear\n </Button>\n </div>\n </div>\n <FormGroup className={classes.checkboxGroup}>\n {FOLDSEEK_DATABASES.map(db => (\n <FormControlLabel\n key={db.id}\n control={\n <Checkbox\n size=\"small\"\n checked={selected.includes(db.id)}\n onChange={() => {\n if (selected.includes(db.id)) {\n onChange(selected.filter(id => id !== db.id))\n } else {\n onChange([...selected, db.id])\n }\n }}\n disabled={disabled}\n />\n }\n label={db.label}\n />\n ))}\n </FormGroup>\n </div>\n )\n}\n", "import { jsonfetch, timeout } from '../../fetchUtils'\n\nexport const FOLDSEEK_DATABASES = [\n { id: 'pdb100', label: 'PDB (100% redundancy)' },\n { id: 'afdb-swissprot', label: 'AlphaFold DB (Swiss-Prot)' },\n { id: 'afdb50', label: 'AlphaFold DB (50% redundancy)' },\n { id: 'afdb-proteome', label: 'AlphaFold DB (Proteomes)' },\n { id: 'cath50', label: 'CATH (50% redundancy)' },\n { id: 'mgnify_esm30', label: 'MGnify ESM30' },\n { id: 'bfmd', label: 'BFMD' },\n { id: 'gmgcl_id', label: 'GMGCL' },\n] as const\n\nexport type FoldseekDatabaseId = (typeof FOLDSEEK_DATABASES)[number]['id']\n\nexport const DEFAULT_DATABASES: FoldseekDatabaseId[] = [\n 'pdb100',\n 'afdb-swissprot',\n]\n\nexport interface FoldseekTicketResponse {\n id: string\n status: 'PENDING' | 'RUNNING' | 'COMPLETE' | 'ERROR'\n error?: string\n}\n\nexport interface FoldseekAlignment {\n target: string\n seqId?: number\n alnLength?: number\n mismatches?: number\n gapsopened?: number\n qStartPos?: number\n qEndPos?: number\n qLen?: number\n qAln?: string\n dbStartPos?: number\n dbEndPos?: number\n dbLen?: number\n dbAln?: string\n prob?: number\n eval?: number\n score?: number\n tCa?: string\n tSeq?: string\n taxId?: number\n taxName?: string\n query?: string\n}\n\nexport interface FoldseekDatabaseResult {\n db: string\n alignments?: FoldseekAlignment[][]\n}\n\nexport interface FoldseekResult {\n query: {\n header: string\n sequence: string\n }\n results: FoldseekDatabaseResult[]\n}\n\nexport async function predict3Di({\n aaSequence,\n signal,\n}: {\n aaSequence: string\n signal?: AbortSignal\n}) {\n // Clean the sequence - remove FASTA header, whitespace, stop codons, and non-AA chars\n const cleanSequence = aaSequence\n .split('\\n')\n .filter(line => !line.startsWith('>'))\n .join('')\n .replace(/\\s/g, '')\n .replace(/\\*/g, '') // Remove stop codons before querying 3Di\n .toUpperCase()\n .replace(/[^ACDEFGHIKLMNPQRSTVWY]/g, '') // Keep only valid amino acids\n\n const response = await fetch(\n `https://3di.foldseek.com/predict/${encodeURIComponent(cleanSequence)}`,\n { signal },\n )\n if (!response.ok) {\n throw new Error(\n `3Di prediction failed: ${response.status} ${await response.text()}`,\n )\n }\n const di3Sequence = await response.text()\n // Remove any quotes, slashes, or whitespace from the response\n const cleanDi3 = di3Sequence\n .replace(/^[\"'/\\s]+/, '')\n .replace(/[\"'/\\s]+$/, '')\n .trim()\n return { aaSequence: cleanSequence, di3Sequence: cleanDi3 }\n}\n\nexport async function submitFoldseekSearch({\n aaSequence,\n di3Sequence,\n databases,\n signal,\n}: {\n aaSequence: string\n di3Sequence: string\n databases: FoldseekDatabaseId[]\n signal?: AbortSignal\n}) {\n // Submit both AA and 3Di sequences (with trailing newline like working example)\n const fastaContent = `>query\\n${aaSequence}\\n>3DI\\n${di3Sequence}\\n`\n const params = new URLSearchParams()\n params.append('q', fastaContent)\n params.append('mode', '3diaa')\n params.append('email', '')\n for (const db of databases) {\n params.append('database[]', db)\n }\n\n const response = await fetch('https://search.foldseek.com/api/ticket', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n signal,\n })\n\n // Read the body as text first so a non-JSON error page (e.g. a gateway/500\n // HTML response) surfaces the real status instead of an opaque JSON\n // SyntaxError that hides it.\n const text = await response.text()\n if (!response.ok) {\n throw new Error(`Foldseek submission failed: ${response.status} ${text}`)\n }\n\n return JSON.parse(text) as FoldseekTicketResponse\n}\n\nexport async function pollFoldseekStatus({\n ticketId,\n signal,\n}: {\n ticketId: string\n signal?: AbortSignal\n}) {\n // Use the /tickets endpoint (plural) with POST\n const params = new URLSearchParams()\n params.append('tickets[]', ticketId)\n\n const response = await fetch('https://search.foldseek.com/api/tickets', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n signal,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to poll ticket status: ${response.status}`)\n }\n\n const results = (await response.json()) as FoldseekTicketResponse[]\n\n // Return the first (and only) result\n const result = results[0]\n if (!result) {\n throw new Error('No ticket status returned')\n }\n return result\n}\n\ninterface FoldseekApiResponse {\n mode: string\n queries: { header: string; sequence: string }[]\n results: {\n db: string\n alignments: FoldseekAlignment[][]\n taxonomyreports: unknown[]\n }[]\n}\n\nexport async function getFoldseekResults({\n ticketId,\n signal,\n}: {\n ticketId: string\n signal?: AbortSignal\n}): Promise<FoldseekApiResponse> {\n return jsonfetch<FoldseekApiResponse>(\n `https://search.foldseek.com/api/result/${ticketId}/0`,\n { signal },\n )\n}\n\nexport async function waitForFoldseekResults({\n ticketId,\n onStatusChange,\n signal,\n}: {\n ticketId: string\n onStatusChange?: (status: string) => void\n signal?: AbortSignal\n}) {\n const maxAttempts = 180\n let attempts = 0\n\n while (attempts < maxAttempts) {\n if (signal?.aborted) {\n throw signal.reason\n }\n const status = await pollFoldseekStatus({ ticketId, signal })\n\n if (status.status === 'ERROR') {\n console.error('[Foldseek] Search error:', status)\n throw new Error(\n `Foldseek search failed: ${status.error ?? 'Unknown error'}`,\n )\n }\n\n if (status.status === 'COMPLETE') {\n onStatusChange?.('Fetching results...')\n const apiResponse = await getFoldseekResults({ ticketId, signal })\n\n // Transform API response to our format\n const results: FoldseekResult = {\n query: apiResponse.queries[0] ?? { header: '', sequence: '' },\n results: apiResponse.results.map(r => ({\n db: r.db,\n alignments: r.alignments,\n })),\n }\n\n return results\n }\n\n onStatusChange?.(\n `Search ${status.status.toLowerCase()}... (${attempts + 1}s)`,\n )\n await timeout(1000, signal)\n attempts++\n }\n\n throw new Error('Foldseek search timed out')\n}\n", "import React from 'react'\n\nimport {\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport FoldseekActionMenu from './FoldseekActionMenu'\nimport { getStructureUrlFromTarget } from '../utils/launchViewUtils'\n\nimport type { FlattenedHit } from './FoldseekActionMenu'\nimport type { FoldseekResult } from '../services/foldseekApi'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n },\n tableContainer: {\n maxHeight: 400,\n },\n headerCell: {\n fontWeight: 'bold',\n backgroundColor: '#f5f5f5',\n },\n noResults: {\n padding: 16,\n textAlign: 'center',\n },\n})\n\nfunction flattenResults(results: FoldseekResult): FlattenedHit[] {\n const hits = results.results.flatMap(dbResult =>\n (dbResult.alignments ?? []).flat().map(alignment => ({\n ...alignment,\n db: dbResult.db,\n structureUrl: getStructureUrlFromTarget(alignment.target, dbResult.db),\n })),\n )\n hits.sort((a, b) => (a.eval ?? Infinity) - (b.eval ?? Infinity))\n return hits.slice(0, 100)\n}\n\nexport default function FoldseekResultsTable({\n results,\n session,\n view,\n feature,\n selectedTranscript,\n userProvidedTranscriptSequence,\n onClose,\n}: {\n results: FoldseekResult\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n userProvidedTranscriptSequence?: string\n onClose: () => void\n}) {\n const { classes } = useStyles()\n const flatHits = flattenResults(results)\n\n if (flatHits.length === 0) {\n return (\n <Paper className={classes.noResults}>\n <Typography>No similar structures found</Typography>\n </Paper>\n )\n }\n\n return (\n <div className={classes.root}>\n <Typography variant=\"subtitle2\">\n Found {flatHits.length} similar structures\n </Typography>\n <TableContainer component={Paper} className={classes.tableContainer}>\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell}>Database</TableCell>\n <TableCell className={classes.headerCell}>Target</TableCell>\n <TableCell className={classes.headerCell}>Organism</TableCell>\n <TableCell className={classes.headerCell}>Prob</TableCell>\n <TableCell className={classes.headerCell}>Seq. Id.</TableCell>\n <TableCell className={classes.headerCell}>Coverage</TableCell>\n <TableCell className={classes.headerCell}>E-value</TableCell>\n <TableCell className={classes.headerCell}>Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {flatHits.map((hit, idx) => (\n <TableRow key={`${hit.db}-${hit.target}-${idx}`}>\n <TableCell>{hit.db}</TableCell>\n <TableCell>{hit.target}</TableCell>\n <TableCell>{hit.taxName ?? '-'}</TableCell>\n <TableCell>\n {hit.prob != null ? `${(hit.prob * 100).toFixed(1)}%` : '-'}\n </TableCell>\n <TableCell>\n {hit.seqId != null ? `${hit.seqId.toFixed(1)}%` : '-'}\n </TableCell>\n <TableCell>\n {hit.alnLength != null && hit.qLen != null\n ? `${((hit.alnLength / hit.qLen) * 100).toFixed(1)}%`\n : '-'}\n </TableCell>\n <TableCell>\n {hit.eval != null ? hit.eval.toExponential(2) : '-'}\n </TableCell>\n <TableCell>\n <FoldseekActionMenu\n hit={hit}\n session={session}\n view={view}\n feature={feature}\n selectedTranscript={selectedTranscript}\n userProvidedTranscriptSequence={\n userProvidedTranscriptSequence\n }\n onClose={onClose}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport { Button, Menu, MenuItem } from '@mui/material'\n\nimport { caCoordsToPdb, hasValidCaCoords } from '../utils/caCoordsToPdb'\nimport { safeLaunch } from '../utils/launchHelpers'\nimport {\n getConfidenceUrlFromTarget,\n getUniprotIdFromAlphaFoldTarget,\n hasMsaViewPlugin,\n launch1DProteinView,\n launch3DProteinView,\n launchMsaView,\n} from '../utils/launchViewUtils'\n\nimport type { FoldseekAlignment } from '../services/foldseekApi'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport interface FlattenedHit extends FoldseekAlignment {\n db: string\n structureUrl?: string\n}\n\nexport default function FoldseekActionMenu({\n hit,\n session,\n view,\n feature,\n selectedTranscript,\n userProvidedTranscriptSequence,\n onClose,\n}: {\n hit: FlattenedHit\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n userProvidedTranscriptSequence?: string\n onClose: () => void\n}) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const [launchError, setLaunchError] = useState<unknown>()\n const open = Boolean(anchorEl)\n\n const uniprotId = getUniprotIdFromAlphaFoldTarget(hit.target)\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleMenuClose = () => {\n setAnchorEl(null)\n }\n\n const baseParams = { session, view, feature, selectedTranscript, uniprotId }\n\n const runLaunch = (fn: () => void | Promise<void>) => () => {\n handleMenuClose()\n void safeLaunch(fn, onClose, setLaunchError)\n }\n\n const handleLaunch3D = runLaunch(() => {\n // Use tCa coordinates to generate PDB data if no URL is available\n const pdbData =\n !hit.structureUrl && hasValidCaCoords(hit.tCa, hit.tSeq)\n ? caCoordsToPdb(hit.tCa!, hit.tSeq!, 'A', hit.target)\n : undefined\n launch3DProteinView({\n ...baseParams,\n url: hit.structureUrl,\n data: pdbData,\n userProvidedTranscriptSequence,\n })\n })\n\n const handleLaunch1D = runLaunch(async () => {\n await launch1DProteinView({\n ...baseParams,\n confidenceUrl: getConfidenceUrlFromTarget(hit.target),\n })\n })\n\n const handleLaunchMSA = runLaunch(() => {\n launchMsaView(baseParams)\n })\n\n const canLoad = hit.structureUrl ?? hasValidCaCoords(hit.tCa, hit.tSeq)\n if (!canLoad) {\n return <span>-</span>\n }\n\n return (\n <>\n {launchError ? <ErrorMessage error={launchError} /> : null}\n <Button size=\"small\" variant=\"outlined\" onClick={handleClick}>\n Load\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleMenuClose}>\n <MenuItem onClick={handleLaunch3D}>Launch 3D protein view</MenuItem>\n {uniprotId ? (\n <MenuItem onClick={handleLaunch1D}>\n Launch 1D protein annotation view\n </MenuItem>\n ) : null}\n {uniprotId && hasMsaViewPlugin() ? (\n <MenuItem onClick={handleLaunchMSA}>\n Launch MSA view (AlphaFoldDB a3m)\n </MenuItem>\n ) : null}\n </Menu>\n </>\n )\n}\n", "// 3-letter amino acid codes\nconst AA_3LETTER: Record<string, string> = {\n A: 'ALA',\n C: 'CYS',\n D: 'ASP',\n E: 'GLU',\n F: 'PHE',\n G: 'GLY',\n H: 'HIS',\n I: 'ILE',\n K: 'LYS',\n L: 'LEU',\n M: 'MET',\n N: 'ASN',\n P: 'PRO',\n Q: 'GLN',\n R: 'ARG',\n S: 'SER',\n T: 'THR',\n V: 'VAL',\n W: 'TRP',\n Y: 'TYR',\n X: 'UNK', // Unknown\n}\n\nfunction padLeft(str: string, len: number) {\n return str.padStart(len, ' ')\n}\n\nfunction padRight(str: string, len: number) {\n return str.padEnd(len, ' ')\n}\n\nfunction formatCoord(val: number) {\n return val.toFixed(3).padStart(8, ' ')\n}\n\n/**\n * Convert Foldseek tCa coordinates and tSeq to PDB format\n * tCa is a comma-separated string of x,y,z triplets\n * tSeq is the amino acid sequence\n */\nexport function caCoordsToPdb(\n tCa: string,\n tSeq: string,\n chainId = 'A',\n title?: string,\n) {\n const coords = tCa.split(',').map(Number)\n const lines: string[] = []\n\n // Add header\n if (title) {\n lines.push(`TITLE ${title}`)\n }\n lines.push('REMARK 1 Generated from Foldseek C\u03B1 coordinates')\n\n let atomNum = 1\n let resNum = 1\n\n for (let i = 0; i < coords.length - 2; i += 3) {\n const x = coords[i]\n const y = coords[i + 1]\n const z = coords[i + 2]\n const aa = tSeq[resNum - 1] ?? 'X'\n const resName = AA_3LETTER[aa] ?? 'UNK'\n\n if (x === undefined || y === undefined || z === undefined) {\n break\n }\n\n // PDB ATOM record format\n // Columns: 1-6 \"ATOM \", 7-11 serial, 13-16 name, 17 altLoc, 18-20 resName,\n // 22 chainID, 23-26 resSeq, 27 iCode, 31-38 x, 39-46 y, 47-54 z,\n // 55-60 occupancy, 61-66 tempFactor, 77-78 element\n const line =\n 'ATOM ' +\n padLeft(String(atomNum), 5) +\n ' CA ' +\n padRight(resName, 3) +\n ' ' +\n chainId +\n padLeft(String(resNum), 4) +\n ' ' +\n formatCoord(x) +\n formatCoord(y) +\n formatCoord(z) +\n ' 1.00 0.00 C'\n\n lines.push(line)\n atomNum++\n resNum++\n }\n\n lines.push('END')\n\n return lines.join('\\n')\n}\n\n/**\n * Check if a hit has valid tCa data that can be converted to PDB\n */\nexport function hasValidCaCoords(tCa?: string, tSeq?: string) {\n if (!tCa || !tSeq) {\n return false\n }\n const coords = tCa.split(',')\n // Need at least 3 coordinates (x,y,z for one residue) and matching sequence\n return coords.length >= 3 && tSeq.length > 0\n}\n", "import { useEffect, useRef, useState } from 'react'\n\nimport {\n DEFAULT_DATABASES,\n predict3Di,\n submitFoldseekSearch,\n waitForFoldseekResults,\n} from '../services/foldseekApi'\n\nimport type {\n FoldseekDatabaseId,\n FoldseekResult,\n} from '../services/foldseekApi'\n\nexport default function useFoldseekSearch() {\n const [results, setResults] = useState<FoldseekResult>()\n const [predictData, setPredictData] = useState<{\n aaSequence: string\n di3Sequence: string\n }>()\n const [isLoading, setIsLoading] = useState(false)\n const [isPredicting, setIsPredicting] = useState(false)\n const [error, setError] = useState<unknown>()\n const [statusMessage, setStatusMessage] = useState('')\n\n // Aborts the in-flight request (3Di prediction or the up-to-3-minute Foldseek\n // poll) when the dialog closes/unmounts, so it stops hitting the external API\n // and stops updating dead state.\n const abortRef = useRef<AbortController | null>(null)\n useEffect(() => {\n return () => {\n abortRef.current?.abort()\n }\n }, [])\n\n const startOperation = () => {\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n return controller.signal\n }\n\n const predictStructure = async (aaSequence: string) => {\n const signal = startOperation()\n setIsPredicting(true)\n setError(undefined)\n setStatusMessage('Predicting 3Di structure...')\n try {\n const result = await predict3Di({ aaSequence, signal })\n setPredictData(result)\n return result\n } catch (e) {\n if (!signal.aborted) {\n console.error(e)\n setError(e)\n }\n return undefined\n } finally {\n if (!signal.aborted) {\n setIsPredicting(false)\n setStatusMessage('')\n }\n }\n }\n\n const search = async (\n aaSeq: string,\n di3Seq: string,\n databases: FoldseekDatabaseId[] = DEFAULT_DATABASES,\n ) => {\n const signal = startOperation()\n setIsLoading(true)\n setError(undefined)\n setStatusMessage('Submitting search...')\n try {\n const ticket = await submitFoldseekSearch({\n aaSequence: aaSeq,\n di3Sequence: di3Seq,\n databases,\n signal,\n })\n const result = await waitForFoldseekResults({\n ticketId: ticket.id,\n onStatusChange: setStatusMessage,\n signal,\n })\n setResults(result)\n return result\n } catch (e) {\n if (!signal.aborted) {\n console.error(e)\n setError(e)\n }\n return undefined\n } finally {\n if (!signal.aborted) {\n setIsLoading(false)\n setStatusMessage('')\n }\n }\n }\n\n const reset = () => {\n abortRef.current?.abort()\n setResults(undefined)\n setPredictData(undefined)\n setError(undefined)\n setStatusMessage('')\n }\n\n return {\n results,\n cleanedAaSequence: predictData?.aaSequence,\n di3Sequence: predictData?.di3Sequence,\n isLoading,\n isPredicting,\n error,\n statusMessage,\n predictStructure,\n search,\n reset,\n }\n}\n", "import React, { Suspense, lazy, useState } from 'react'\n\nimport Help from '@mui/icons-material/Help'\nimport { IconButton } from '@mui/material'\n// icons\n\n// lazies\nconst HelpDialog = lazy(() => import('./HelpDialog'))\n\nexport default function HelpButton() {\n const [show, setShow] = useState(false)\n return (\n <>\n <IconButton\n onClick={() => {\n setShow(true)\n }}\n >\n <Help />\n </IconButton>\n {show ? (\n <Suspense fallback={null}>\n <HelpDialog\n handleClose={() => {\n setShow(false)\n }}\n />\n </Suspense>\n ) : null}\n </>\n )\n}\n", "import React from 'react'\n\n// this is from MUI example\nexport default function TabPanel({\n children,\n value,\n index,\n ...other\n}: {\n children?: React.ReactNode\n index: number\n value: number\n}) {\n return (\n <div role=\"tabpanel\" hidden={value !== index} {...other}>\n {value === index && <div>{children}</div>}\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport { Button, DialogActions, DialogContent } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport IsoformSequencesToggle from './IsoformSequencesToggle'\nimport SequenceMismatchNotice from './SequenceMismatchNotice'\nimport StructureSourcePicker from './StructureSourcePicker'\nimport TranscriptSelector from './TranscriptSelector'\nimport ExternalLink from '../../components/ExternalLink'\nimport useStructureFileSequence from '../hooks/useStructureFileSequence'\nimport useTranscriptIsoformSelection from '../hooks/useTranscriptIsoformSelection'\nimport { launch3DProteinView } from '../utils/launchViewUtils'\nimport {\n getGeneDisplayName,\n getTranscriptDisplayName,\n stripStopCodon,\n} from '../utils/util'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()(theme => ({\n dialogContent: {\n marginTop: theme.spacing(6),\n width: '80em',\n },\n textAreaFont: {\n fontFamily: 'Courier New',\n },\n}))\n\ntype LGV = LinearGenomeViewModel\n\nfunction HelpText() {\n return (\n <div style={{ marginBottom: 20 }}>\n Manually supply a protein structure (PDB, mmCIF, etc) for a given\n transcript. You can open the file from the result of running, for example,{' '}\n <ExternalLink href=\"https://github.com/sokrypton/ColabFold\">\n ColabFold\n </ExternalLink>\n . This plugin will align the protein sequence calculated from the genome\n to the protein sequence embedded in the structure file which allows for\n slight differences in these two representations.\n </div>\n )\n}\n\nconst UserProvidedStructure = observer(function UserProvidedStructure({\n feature,\n session,\n view,\n handleClose,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LGV\n handleClose: () => void\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n const { classes } = useStyles()\n const [file, setFile] = useState<File>()\n const [pdbId, setPdbId] = useState('')\n const [choice, setChoice] = useState('file')\n const [submitError, setSubmitError] = useState<unknown>()\n const [structureURL, setStructureURL] = useState('')\n\n const activeFile = choice === 'file' ? file : undefined\n const activeURL = choice === 'file' ? '' : structureURL\n\n const { sequences: structureSequences, error: fileError } =\n useStructureFileSequence({ file: activeFile, url: activeURL })\n\n const structureName =\n activeFile?.name ?? activeURL.slice(activeURL.lastIndexOf('/') + 1)\n const structureSequence = structureSequences?.[0]\n\n const {\n transcripts: options,\n isoformSequences,\n selectedTranscriptId: userSelection,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: protein,\n error: isoformError,\n } = useTranscriptIsoformSelection({ feature, view, structureSequence })\n\n const error = isoformError ?? submitError ?? fileError\n\n const canLaunch =\n !!(activeURL || activeFile) && !!protein && !!selectedTranscript\n const sequencesDiffer =\n !!protein?.seq &&\n !!structureSequence &&\n stripStopCodon(protein.seq) !== structureSequence\n\n const handleLaunch = async () => {\n if (!protein || !selectedTranscript) {\n return\n }\n try {\n const structureData = activeFile ? await activeFile.text() : undefined\n const url = activeURL ? activeURL : undefined\n launch3DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n url,\n data: structureData,\n userProvidedTranscriptSequence: protein.seq,\n alignmentAlgorithm,\n displayName: `Protein view ${getGeneDisplayName(feature)} - ${getTranscriptDisplayName(selectedTranscript)}`,\n })\n handleClose()\n } catch (e) {\n console.error(e)\n setSubmitError(e)\n }\n }\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {error ? <ErrorMessage error={error} /> : null}\n <HelpText />\n\n <StructureSourcePicker\n choice={choice}\n setChoice={setChoice}\n structureURL={structureURL}\n setStructureURL={setStructureURL}\n setFile={setFile}\n pdbId={pdbId}\n setPdbId={setPdbId}\n />\n <div style={{ margin: 20 }}>\n {isoformSequences ? (\n structureSequence ? (\n <>\n <TranscriptSelector\n val={userSelection}\n setVal={setUserSelection}\n structureSequence={structureSequence}\n isoforms={options}\n feature={feature}\n isoformSequences={isoformSequences}\n />\n <IsoformSequencesToggle\n structureSequence={structureSequence}\n structureName={structureName}\n isoformSequences={isoformSequences}\n />\n </>\n ) : null\n ) : (\n <LoadingEllipses title=\"Loading protein sequences\" variant=\"h6\" />\n )}\n </div>\n </DialogContent>\n <DialogActions>\n {sequencesDiffer ? (\n <SequenceMismatchNotice\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n />\n ) : null}\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canLaunch}\n onClick={() => {\n void handleLaunch()\n }}\n >\n Launch 3-D protein structure view\n </Button>\n </DialogActions>\n </>\n )\n})\n\nexport default UserProvidedStructure\n", "import React from 'react'\n\nimport {\n Button,\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\n\nimport HelpButton from './HelpButton'\nimport { getPdbStructureUrl } from '../utils/launchViewUtils'\n\nexport default function StructureSourcePicker({\n choice,\n setChoice,\n structureURL,\n setStructureURL,\n setFile,\n pdbId,\n setPdbId,\n}: {\n choice: string\n setChoice: (c: string) => void\n structureURL: string\n setStructureURL: (url: string) => void\n setFile: (f: File) => void\n pdbId: string\n setPdbId: (id: string) => void\n}) {\n return (\n <div style={{ display: 'flex', margin: 30 }}>\n <Typography>\n Open your structure file <HelpButton />\n </Typography>\n\n <FormControl component=\"fieldset\">\n <RadioGroup\n value={choice}\n onChange={event => {\n setChoice(event.target.value)\n }}\n >\n <FormControlLabel value=\"url\" control={<Radio />} label=\"URL\" />\n <FormControlLabel value=\"file\" control={<Radio />} label=\"File\" />\n <FormControlLabel value=\"pdb\" control={<Radio />} label=\"PDB ID\" />\n </RadioGroup>\n </FormControl>\n\n {choice === 'url' ? (\n <div>\n <Typography>Open a PDB/mmCIF/etc. file from remote URL</Typography>\n <TextField\n label=\"URL\"\n value={structureURL}\n onChange={event => {\n setStructureURL(event.target.value)\n }}\n />\n </div>\n ) : null}\n\n {choice === 'file' ? (\n <div style={{ paddingTop: 20 }}>\n <Typography>\n Open a PDB/mmCIF/etc. file from your local drive\n </Typography>\n <Button variant=\"outlined\" component=\"label\">\n Choose File\n <input\n type=\"file\"\n hidden\n onChange={({ target }) => {\n const f = target.files?.[0]\n if (f) {\n setFile(f)\n }\n }}\n />\n </Button>\n </div>\n ) : null}\n\n {choice === 'pdb' ? (\n <TextField\n value={pdbId}\n onChange={event => {\n const s = event.target.value\n setPdbId(s)\n setStructureURL(getPdbStructureUrl(s))\n }}\n label=\"PDB ID\"\n />\n ) : null}\n </div>\n )\n}\n", "import { useState } from 'react'\n\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => void] {\n const [value, setValue] = useState<T>(() => {\n const stored = localStorage.getItem(key)\n if (stored) {\n try {\n return JSON.parse(stored) as T\n } catch {\n return defaultValue\n }\n }\n return defaultValue\n })\n\n function setValueAndStore(newValue: T) {\n setValue(newValue)\n localStorage.setItem(key, JSON.stringify(newValue))\n }\n\n return [value, setValueAndStore]\n}\n", "import { readConfObject } from '@jbrowse/core/configuration'\nimport { parseLocString } from '@jbrowse/core/util'\n\nimport { fetchProteinSeq } from '../LaunchProteinView/utils/calculateProteinSequence'\nimport { getAlphaFoldStructureUrl } from '../LaunchProteinView/utils/launchViewUtils'\nimport {\n getTranscriptFeatures,\n stripTrailingVersion,\n} from '../LaunchProteinView/utils/util'\n\nimport type {\n AbstractSessionModel,\n Feature,\n SimpleFeatureSerialized,\n} from '@jbrowse/core/util'\n\nexport interface ConnectedViewSpec {\n loc?: string\n assembly?: string\n tracks?: (string | Record<string, unknown>)[]\n}\n\nexport interface ResolvedShortLaunch {\n url: string\n feature: SimpleFeatureSerialized\n userProvidedTranscriptSequence: string\n}\n\nfunction getTrackId(track: string | Record<string, unknown>) {\n if (typeof track === 'string') {\n return track\n }\n const { trackId } = track\n return typeof trackId === 'string' ? trackId : undefined\n}\n\nfunction transcriptMatches(transcript: Feature, transcriptId: string) {\n const target = stripTrailingVersion(transcriptId)\n return [transcript.get('name'), transcript.get('id'), transcript.id()].some(\n candidate =>\n typeof candidate === 'string' &&\n (candidate === transcriptId ||\n stripTrailingVersion(candidate) === target),\n )\n}\n\n/**\n * Headless counterpart of the interactive AlphaFoldDBSearch \u2192 TranscriptSelector\n * flow. Given a `uniprotId`, a `transcriptId`, and a connected genome view spec,\n * it derives the three things a ProteinView structure needs: the AlphaFold\n * structure URL, the transcript `feature` (for the genome\u2194protein mapping), and\n * the translated protein sequence (for the alignment). Every failure throws with\n * a descriptive message so the caller can surface it \u2014 nothing degrades silently\n * to an unlinked structure.\n */\nexport async function resolveShortLaunch({\n session,\n uniprotId,\n transcriptId,\n connectedView,\n}: {\n session: AbstractSessionModel\n uniprotId: string\n transcriptId?: string\n connectedView?: ConnectedViewSpec\n}): Promise<ResolvedShortLaunch> {\n if (!transcriptId) {\n throw new Error('transcriptId is required to launch from a uniprotId')\n }\n const assemblyName = connectedView?.assembly\n const loc = connectedView?.loc\n const trackSpecs = connectedView?.tracks ?? []\n if (!assemblyName || !loc) {\n throw new Error(\n 'connectedView with assembly + loc is required to launch from a uniprotId',\n )\n }\n\n const assembly = await session.assemblyManager.waitForAssembly(assemblyName)\n if (!assembly) {\n throw new Error(`assembly \"${assemblyName}\" not found`)\n }\n\n const parsed = parseLocString(loc, refName => assembly.isValidRefName(refName))\n if (parsed.start === undefined || parsed.end === undefined) {\n throw new Error(`could not parse a start-end region from loc \"${loc}\"`)\n }\n const region = {\n assemblyName,\n refName: assembly.getCanonicalRefName(parsed.refName) ?? parsed.refName,\n start: parsed.start,\n end: parsed.end,\n }\n\n const trackIds = trackSpecs.map(getTrackId).filter(t => t !== undefined)\n const tracksById = session.getTracksById()\n const sessionId = 'getFeatures'\n const transcripts: Feature[] = []\n for (const trackId of trackIds) {\n const trackConf = tracksById[trackId]\n if (!trackConf) {\n continue\n }\n const feats = (await session.rpcManager.call(sessionId, 'CoreGetFeatures', {\n adapterConfig: readConfObject(trackConf, 'adapter'),\n sessionId,\n regions: [region],\n })) as Feature[]\n for (const feat of feats) {\n transcripts.push(...getTranscriptFeatures(feat))\n }\n }\n\n const transcript = transcripts.find(f => transcriptMatches(f, transcriptId))\n if (!transcript) {\n throw new Error(\n `transcript \"${transcriptId}\" not found at ${loc} in tracks [${trackIds.join(', ')}]`,\n )\n }\n const hasCds = (transcript.get('subfeatures') ?? []).some(\n (sub: Feature) => sub.get('type') === 'CDS',\n )\n if (!hasCds) {\n throw new Error(`transcript \"${transcriptId}\" has no CDS subfeatures`)\n }\n\n const userProvidedTranscriptSequence = await fetchProteinSeq({\n session,\n assemblyName,\n feature: transcript,\n })\n if (!userProvidedTranscriptSequence) {\n throw new Error(\n `could not translate a protein sequence for \"${transcriptId}\"`,\n )\n }\n\n return {\n url: getAlphaFoldStructureUrl(uniprotId),\n feature: transcript.toJSON(),\n userProvidedTranscriptSequence,\n }\n}\n", "import { type ConnectedViewSpec, resolveShortLaunch } from './resolveShortLaunch'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { AbstractSessionModel } from '@jbrowse/core/util'\n\nexport default function LaunchProteinViewExtensionPointF(\n pluginManager: PluginManager,\n) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-ProteinView',\n // LaunchView extension points are typed as transformers `(extendee, props)\n // => extendee`, but in practice JBrowse invokes them as side-effect\n // handlers and ignores the return value. Casting away the signature\n // mismatch rather than fabricating a fake return.\n // @ts-expect-error\n async ({\n session,\n url,\n uniprotId,\n transcriptId,\n userProvidedTranscriptSequence,\n feature,\n connectedViewId,\n connectedView,\n alignmentAlgorithm,\n displayName,\n height,\n showControls,\n showHighlight,\n zoomToBaseLevel,\n }: {\n session: AbstractSessionModel\n url?: string\n uniprotId?: string\n transcriptId?: string\n userProvidedTranscriptSequence?: string\n feature?: Record<string, unknown>\n connectedViewId?: string\n connectedView?: ConnectedViewSpec\n alignmentAlgorithm?: string\n displayName?: string\n height?: number\n showControls?: boolean\n showHighlight?: boolean\n zoomToBaseLevel?: boolean\n }) => {\n // Short-URL form: `uniprotId` + `transcriptId` + `connectedView` (no\n // explicit `url`/`feature`/sequence). Derive the structure URL, the\n // transcript feature, and the translated sequence from the connected\n // track. Failures surface via notify and abort \u2014 we never leave a\n // half-wired view (see agent-docs/urlparam_plan.md).\n let resolved\n if (!url && uniprotId) {\n try {\n resolved = await resolveShortLaunch({\n session,\n uniprotId,\n transcriptId,\n connectedView,\n })\n } catch (e) {\n console.error(e)\n session.notify(`Could not launch protein view: ${e}`, 'error')\n return\n }\n }\n\n const finalUrl = url ?? resolved?.url\n if (!finalUrl) {\n throw new Error(\n 'No url or uniprotId provided when launching protein view',\n )\n }\n\n // A session spec launches each view independently with an auto-generated\n // id, so it cannot pre-compute a connectedViewId to cross-reference. When\n // `connectedView` is supplied we create the LinearGenomeView here and wire\n // its id, letting a single spec entry produce a connected genome+protein\n // pair (e.g. hover a variant to highlight the residue).\n const resolvedConnectedViewId =\n connectedViewId ??\n (connectedView\n ? session.addView('LinearGenomeView', {\n type: 'LinearGenomeView',\n init: connectedView,\n }).id\n : undefined)\n\n session.addView('ProteinView', {\n type: 'ProteinView',\n alignmentAlgorithm,\n displayName,\n height,\n showControls,\n showHighlight,\n zoomToBaseLevel,\n structures: [\n {\n url: finalUrl,\n userProvidedTranscriptSequence:\n resolved?.userProvidedTranscriptSequence ??\n userProvidedTranscriptSequence ??\n '',\n feature: resolved?.feature ?? feature,\n connectedViewId: resolvedConnectedViewId,\n },\n ],\n })\n },\n )\n}\n", "import { lazy } from 'react'\n\nimport { ViewType } from '@jbrowse/core/pluggableElementTypes'\n\nimport stateModelF from './model'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nconst ReactComponent = lazy(() => import('./components/ProteinView'))\n\nexport default function ProteinViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'ProteinView',\n displayName: 'Protein view',\n stateModel: stateModelF(),\n ReactComponent,\n })\n })\n}\n", "import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { addDisposer, types } from '@jbrowse/mobx-state-tree'\nimport SettingsIcon from '@mui/icons-material/Settings'\nimport Visibility from '@mui/icons-material/Visibility'\nimport { autorun } from 'mobx'\n\nimport {\n COLOR_SCHEMES,\n COLOR_SCHEME_VALUES,\n type ProteinColorScheme,\n applyColorTheme,\n} from './applyColorTheme'\nimport { loadStructureData } from './loadStructureData'\nimport { makeStructureLoader } from './structureLoader'\nimport Structure from './structureModel'\nimport { superposeStructures } from './superposeStructures'\nimport { type AlignmentAlgorithm, DEFAULT_ALIGNMENT_ALGORITHM } from './types'\n\nconst SETTINGS_KEY = 'proteinView-settings'\nconst PERSISTED_SETTINGS = [\n 'showAlignment',\n 'showProteinTracks',\n 'showHighlight',\n 'zoomToBaseLevel',\n 'autoScrollAlignment',\n 'compactTracks',\n] as const\n\nimport type { Instance } from '@jbrowse/mobx-state-tree'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface ProteinViewInitState {\n structures?: {\n url?: string\n data?: string\n }[]\n showControls?: boolean\n showAlignment?: boolean\n}\n\n/**\n * #stateModel Protein3dViewPlugin\n * extends\n * - BaseViewModel\n */\nfunction stateModelFactory() {\n return types\n .compose(\n 'ProteinView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('ProteinView'),\n /**\n * #property\n */\n structures: types.array(Structure),\n\n /**\n * #property\n */\n showControls: false,\n /**\n * #property\n */\n height: types.optional(types.number, 650),\n\n /**\n * #property\n */\n showHighlight: false,\n /**\n * #property\n */\n zoomToBaseLevel: true,\n /**\n * #property\n */\n autoScrollAlignment: false,\n /**\n * #property\n * molstar color-theme name applied to all loaded structures\n */\n colorScheme: types.optional(\n types.enumeration<ProteinColorScheme>(\n 'ColorScheme',\n COLOR_SCHEME_VALUES,\n ),\n 'default',\n ),\n /**\n * #property\n */\n showAlignment: true,\n /**\n * #property\n */\n showProteinTracks: true,\n /**\n * #property\n * render the feature/residue tracks at reduced height\n */\n compactTracks: true,\n /**\n * #property\n */\n alignmentAlgorithm: types.optional(\n types.string,\n DEFAULT_ALIGNMENT_ALGORITHM,\n ),\n\n /**\n * #property\n * ID of connected MSA view for hover synchronization\n */\n connectedMsaViewId: types.maybe(types.string),\n\n /**\n * #property\n * used for loading the protein view via session snapshots, e.g.\n * {\n * \"type\": \"ProteinView\",\n * \"init\": {\n * \"structures\": [\n * { \"url\": \"https://files.rcsb.org/download/1A2B.pdb\" }\n * ],\n * \"showControls\": true\n * }\n * }\n */\n init: types.frozen<ProteinViewInitState | undefined>(),\n }),\n )\n .volatile(() => ({\n /**\n * #volatile\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n error: undefined as unknown,\n /**\n * #volatile\n */\n molstarPluginContext: undefined as PluginContext | undefined,\n /**\n * #volatile\n */\n showManualAlignmentDialog: false,\n /**\n * #volatile\n */\n showAddStructureDialog: false,\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n setHeight(n: number) {\n self.height = n\n return n\n },\n /**\n * #action\n */\n setShowAlignment(f: boolean) {\n self.showAlignment = f\n },\n\n /**\n * #action\n */\n setShowControls(arg: boolean) {\n self.showControls = arg\n },\n\n /**\n * #action\n */\n setError(e: unknown) {\n self.error = e\n },\n\n /**\n * #action\n */\n setShowHighlight(arg: boolean) {\n self.showHighlight = arg\n },\n /**\n * #action\n */\n setShowProteinTracks(arg: boolean) {\n self.showProteinTracks = arg\n },\n /**\n * #action\n */\n setCompactTracks(arg: boolean) {\n self.compactTracks = arg\n },\n /**\n * #action\n */\n setZoomToBaseLevel(arg: boolean) {\n self.zoomToBaseLevel = arg\n },\n /**\n * #action\n */\n setAutoScrollAlignment(arg: boolean) {\n self.autoScrollAlignment = arg\n },\n /**\n * #action\n */\n setAlignmentAlgorithm(algorithm: AlignmentAlgorithm) {\n self.alignmentAlgorithm = algorithm\n },\n /**\n * #action\n */\n setColorScheme(scheme: ProteinColorScheme) {\n self.colorScheme = scheme\n },\n /**\n * #action\n */\n setMolstarPluginContext(p?: PluginContext) {\n // Reset loadedToMolstar for all structures when plugin context changes\n // This ensures structures get reloaded when the view is moved/remounted\n if (p !== self.molstarPluginContext) {\n for (const structure of self.structures) {\n structure.setLoadedToMolstar(false)\n }\n }\n self.molstarPluginContext = p\n },\n /**\n * #action\n */\n setShowManualAlignmentDialog(val: boolean) {\n self.showManualAlignmentDialog = val\n },\n /**\n * #action\n */\n setShowAddStructureDialog(val: boolean) {\n self.showAddStructureDialog = val\n },\n /**\n * #action\n */\n setInit(arg?: ProteinViewInitState) {\n self.init = arg\n },\n /**\n * #action\n */\n setConnectedMsaViewId(id?: string) {\n self.connectedMsaViewId = id\n },\n /**\n * #action\n */\n addStructure(structure: { url?: string; data?: string }) {\n self.structures.push(\n Structure.create({\n url: structure.url,\n data: structure.data,\n userProvidedTranscriptSequence: '',\n }),\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n async addStructureAndSuperpose(structure: {\n url?: string\n data?: string\n }) {\n const { molstarPluginContext } = self\n if (!molstarPluginContext) {\n return\n }\n\n const newStructure = Structure.create({\n url: structure.url,\n data: structure.data,\n userProvidedTranscriptSequence: '',\n })\n // Set loadedToMolstar BEFORE pushing to avoid race condition with autorun\n newStructure.setLoadedToMolstar(true)\n self.structures.push(newStructure)\n\n try {\n newStructure.setStructureData(\n await loadStructureData({\n structure,\n plugin: molstarPluginContext,\n }),\n )\n if (self.structures.length > 1) {\n await superposeStructures(molstarPluginContext)\n }\n } catch (e) {\n self.setError(e)\n console.error(e)\n }\n },\n }))\n .actions(self => ({\n afterAttach() {\n // restore settings from localStorage\n try {\n const stored = localStorage.getItem(SETTINGS_KEY)\n if (stored) {\n const settings = JSON.parse(stored) as Record<string, boolean>\n for (const key of PERSISTED_SETTINGS) {\n if (settings[key] !== undefined) {\n self[key] = settings[key]\n }\n }\n }\n } catch (e) {\n console.error('Failed to restore protein view settings', e)\n }\n\n // save settings to localStorage when they change\n addDisposer(\n self,\n autorun(() => {\n try {\n const settings: Record<string, boolean> = {}\n for (const key of PERSISTED_SETTINGS) {\n settings[key] = self[key]\n }\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings))\n } catch (e) {\n console.error('Failed to save protein view settings', e)\n }\n }),\n )\n\n // process init parameter for loading structures from session snapshots\n addDisposer(\n self,\n autorun(() => {\n const { init } = self\n if (init) {\n const { structures, showControls, showAlignment } = init\n\n if (structures) {\n for (const structure of structures) {\n self.addStructure(structure)\n }\n }\n\n if (showControls !== undefined) {\n self.setShowControls(showControls)\n }\n\n if (showAlignment !== undefined) {\n self.setShowAlignment(showAlignment)\n }\n\n self.setInit(undefined)\n }\n }),\n )\n\n // Apply the chosen color theme whenever it changes or once a structure\n // finishes loading (structureSequences is set after its molstar\n // representation is built, so the theme has something to recolor).\n addDisposer(\n self,\n autorun(() => {\n const { molstarPluginContext, colorScheme } = self\n const readyCount = self.structures.filter(\n s => s.structureSequences !== undefined,\n ).length\n if (molstarPluginContext && readyCount > 0) {\n applyColorTheme({\n plugin: molstarPluginContext,\n colorScheme,\n }).catch((e: unknown) => {\n console.error(e)\n self.setError(e)\n })\n }\n }),\n )\n\n // Load structures into Molstar as they appear or whenever the plugin\n // context changes. See makeStructureLoader for why the autorun body is\n // synchronous and how it guards against duplicate/stale loads.\n addDisposer(self, autorun(makeStructureLoader(self)))\n },\n }))\n .views(self => ({\n get primaryStructure() {\n return self.structures[0]\n },\n menuItems() {\n return [\n {\n label: 'Pairwise alignment',\n icon: Visibility,\n type: 'checkbox',\n checked: self.showAlignment,\n onClick: () => {\n self.setShowAlignment(!self.showAlignment)\n },\n },\n {\n label: 'Protein feature tracks',\n icon: Visibility,\n type: 'checkbox',\n checked: self.showProteinTracks,\n onClick: () => {\n self.setShowProteinTracks(!self.showProteinTracks)\n },\n },\n {\n label: 'Color scheme...',\n subMenu: COLOR_SCHEMES.map(scheme => ({\n label: scheme.label,\n type: 'radio' as const,\n checked: self.colorScheme === scheme.value,\n onClick: () => {\n self.setColorScheme(scheme.value)\n },\n })),\n },\n {\n label: 'Add structure...',\n onClick: () => {\n self.setShowAddStructureDialog(true)\n },\n },\n {\n label: 'Advanced...',\n icon: SettingsIcon,\n subMenu: [\n {\n label: 'Pairwise alignment as green highlight',\n type: 'checkbox',\n checked: self.showHighlight,\n onClick: () => {\n self.setShowHighlight(!self.showHighlight)\n },\n },\n {\n label: 'Show all protein feature tracks',\n onClick: () => {\n for (const structure of self.structures) {\n structure.showAllFeatureTypes()\n }\n },\n },\n {\n label: 'Import manual alignment...',\n onClick: () => {\n self.setShowManualAlignmentDialog(true)\n },\n },\n {\n label: 'Re-align structures (TM-align)',\n onClick: () => {\n if (self.molstarPluginContext) {\n superposeStructures(self.molstarPluginContext).catch(\n (e: unknown) => {\n console.error(e)\n self.setError(e)\n },\n )\n }\n },\n },\n {\n label: 'Zoom to base level on click',\n type: 'checkbox',\n checked: self.zoomToBaseLevel,\n onClick: () => {\n self.setZoomToBaseLevel(!self.zoomToBaseLevel)\n },\n },\n {\n label: 'Auto-scroll protein feature view on hover',\n type: 'checkbox',\n checked: self.autoScrollAlignment,\n onClick: () => {\n self.setAutoScrollAlignment(!self.autoScrollAlignment)\n },\n },\n ],\n },\n ]\n },\n }))\n}\n\nexport default stateModelFactory\n\nexport type JBrowsePluginProteinViewStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type JBrowsePluginProteinViewModel =\n Instance<JBrowsePluginProteinViewStateModel>\n\nexport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinStructureStateModel,\n} from './structureModel'\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3\"\n}), 'Visibility');", "// Minimal shape of the molstar Model fields we read. AlphaFold structures\n// store the per-residue pLDDT in the B-factor column (B_iso_or_equiv), so\n// reading the first atom of each residue yields pLDDT for AlphaFold files and\n// the crystallographic B-factor for experimental ones.\ninterface ConfidenceModel {\n obj?: {\n data: {\n atomicConformation: {\n B_iso_or_equiv: { value: (row: number) => number }\n }\n atomicHierarchy: {\n residueAtomSegments: {\n offsets: ArrayLike<number>\n count: number\n }\n }\n }\n }\n}\n\n/**\n * Per-residue B-factor / pLDDT, indexed by 0-based residue order (which aligns\n * with the structure's first-chain sequence for AlphaFold models). `maxLength`\n * caps the result to the structure sequence length so trailing chains/hetero\n * residues don't bleed in.\n */\nexport function extractPerResidueConfidence(\n model: ConfidenceModel,\n maxLength?: number,\n): number[] | undefined {\n const data = model.obj?.data\n if (!data) {\n return undefined\n }\n const { B_iso_or_equiv } = data.atomicConformation\n const { offsets, count } = data.atomicHierarchy.residueAtomSegments\n const n = maxLength === undefined ? count : Math.min(count, maxLength)\n const values: number[] = []\n for (let i = 0; i < n; i++) {\n values.push(B_iso_or_equiv.value(offsets[i]!))\n }\n return values\n}\n\n/**\n * AlphaFold-style pLDDT lives in [0, 100] and varies across residues. A\n * constant column (common when a PDB has no B-factors) or out-of-range values\n * indicate the track wouldn't be meaningful as confidence.\n */\nexport function looksLikePlddt(\n values: number[] | undefined,\n): values is number[] {\n return (\n !!values &&\n values.length > 1 &&\n values.every(v => v >= 0 && v <= 100) &&\n new Set(values).size > 1\n )\n}\n", "import { addStructureFromData } from './addStructureFromData'\nimport { addStructureFromURL } from './addStructureFromURL'\nimport { extractPerResidueConfidence } from './extractPerResidueConfidence'\nimport { extractStructureSequences } from './extractStructureSequences'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface StructureData {\n sequences?: string[]\n confidence?: number[]\n}\n\n/**\n * Loads a structure (from inline data or a URL) into the given Molstar plugin\n * and pulls out its per-chain sequences and per-residue confidence. Pure with\n * respect to the model \u2014 it only touches the plugin and returns plain data, so\n * callers own the decision of whether/where to store the result.\n */\nexport async function loadStructureData({\n structure,\n plugin,\n}: {\n structure: { data?: string; url?: string }\n plugin: PluginContext\n}): Promise<StructureData> {\n const { model } = structure.data\n ? await addStructureFromData({ data: structure.data, plugin })\n : structure.url\n ? await addStructureFromURL({ url: structure.url, plugin })\n : { model: undefined }\n const sequences = model ? extractStructureSequences(model) : undefined\n const confidence = model\n ? extractPerResidueConfidence(model, sequences?.[0]?.length)\n : undefined\n return { sequences, confidence }\n}\n", "import { isAlive } from '@jbrowse/mobx-state-tree'\n\nimport { loadStructureData } from './loadStructureData'\n\nimport type StructureModel from './structureModel'\nimport type { IAnyStateTreeNode, Instance } from '@jbrowse/mobx-state-tree'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype StructureInstance = Instance<typeof StructureModel>\n\nexport type StructureLoaderHost = IAnyStateTreeNode & {\n readonly molstarPluginContext: PluginContext | undefined\n readonly structures: StructureInstance[]\n setError: (error: unknown) => void\n}\n\n/**\n * Builds the body of the autorun that loads structures into Molstar.\n *\n * The returned callback is synchronous on purpose: MobX only tracks\n * observables read before the first `await`, so an async autorun body would\n * stop reacting to later structures/plugin changes. Instead it reads its\n * dependencies synchronously and dispatches a guarded fire-and-forget load for\n * each structure that is neither loaded nor already loading. The guards handle\n * the lifecycle hazards of an external GPU resource:\n *\n * - a non-observable in-flight Set stops a re-entrant run (a new structure\n * pushed, or the plugin swapped mid-load) from starting a duplicate load of\n * the same structure;\n * - a load whose plugin was replaced or whose model was destroyed while\n * awaiting has its result discarded rather than written into a torn-down\n * plugin;\n * - if the plugin was merely swapped (e.g. a view remount), the structure is\n * reloaded into the current plugin so it isn't left stranded unloaded.\n */\nexport function makeStructureLoader(host: StructureLoaderHost) {\n const loadingStructures = new Set<StructureInstance>()\n\n function loadInto(structure: StructureInstance, plugin: PluginContext) {\n loadingStructures.add(structure)\n loadStructureData({ structure, plugin })\n .then(data => {\n const current = isAlive(structure)\n ? host.molstarPluginContext\n : undefined\n if (current === plugin) {\n structure.setStructureData(data)\n structure.setLoadedToMolstar(true)\n }\n loadingStructures.delete(structure)\n if (current && current !== plugin && !structure.loadedToMolstar) {\n loadInto(structure, current)\n }\n })\n .catch((e: unknown) => {\n loadingStructures.delete(structure)\n if (isAlive(host)) {\n host.setError(e)\n console.error(e)\n }\n })\n }\n\n return function loadPendingStructures() {\n const { structures, molstarPluginContext } = host\n if (molstarPluginContext) {\n for (const structure of structures) {\n if (!structure.loadedToMolstar && !loadingStructures.has(structure)) {\n loadInto(structure, molstarPluginContext)\n }\n }\n }\n }\n}\n", "import { SimpleFeature, getSession } from '@jbrowse/core/util'\nimport {\n type Instance,\n addDisposer,\n getParent,\n types,\n} from '@jbrowse/mobx-state-tree'\nimport { autorun } from 'mobx'\n\nimport {\n applyLociInteractivityMultiple,\n applyLociInteractivitySingle,\n} from './applyLociInteractivity'\nimport {\n COMPACT_TRACK_GAP,\n COMPACT_TRACK_HEIGHT,\n NORMAL_TRACK_GAP,\n NORMAL_TRACK_HEIGHT,\n} from './constants'\nimport {\n type CoordinateMapper,\n alignmentCol,\n makeCoordinateMapper,\n structurePos,\n} from './coordinates'\nimport { looksLikePlddt } from './extractPerResidueConfidence'\nimport highlightResidueRange from './highlightResidueRange'\nimport { runLocalAlignment } from './pairwiseAlignment'\nimport { proteinAbbreviationMapping } from './proteinAbbreviationMapping'\nimport {\n clickProteinToGenome,\n proteinRangeToGenomeMapping,\n proteinToGenomeMapping,\n} from './proteinToGenomeMapping'\nimport { kyteDoolittleScores, mapResidueValuesToColumns } from './residueTracks'\nimport subscribeMolstarInteraction from './subscribeMolstarInteraction'\nimport { checkHovered } from './util'\nimport { getUniprotIdFromAlphaFoldTarget } from '../LaunchProteinView/utils/launchViewUtils'\nimport { stripStopCodon } from '../LaunchProteinView/utils/util'\nimport { genomeToTranscriptSeqMapping } from '../mappings'\nimport { coerceAlignmentAlgorithm } from './types'\n\nimport type { PairwiseAlignment } from '../mappings'\nimport type { AlignmentAlgorithm } from './types'\nimport type { SimpleFeatureSerialized } from '@jbrowse/core/util'\nimport type { Region as IRegion } from '@jbrowse/core/util/types'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype LGV = LinearGenomeViewModel\ntype MaybeLGV = LGV | undefined\ntype MaybePairwiseAlignment = PairwiseAlignment | undefined\n\nexport interface ParentProteinView {\n zoomToBaseLevel: boolean\n autoScrollAlignment: boolean\n showHighlight: boolean\n showProteinTracks: boolean\n compactTracks: boolean\n alignmentAlgorithm: string\n molstarPluginContext: PluginContext | undefined\n structures: { url?: string }[]\n setShowAlignment: (f: boolean) => void\n setError: (e: unknown) => void\n}\n\nconst Structure = types\n .model({\n /**\n * #property\n */\n url: types.maybe(types.string),\n /**\n * #property\n */\n data: types.maybe(types.string),\n /**\n * #property\n */\n connectedViewId: types.maybe(types.string),\n /**\n * #property\n */\n pairwiseAlignment: types.frozen<MaybePairwiseAlignment>(),\n /**\n * #property\n */\n feature: types.frozen<SimpleFeatureSerialized | undefined>(),\n /**\n * #property\n */\n userProvidedTranscriptSequence: types.string,\n })\n .volatile(() => ({\n /**\n * #volatile\n * Inclusive-exclusive structure-residue range from a click; drives the\n * derived clickGenomeHighlights getter.\n */\n clickedStructureRange: undefined as\n | { start: number; end: number }\n | undefined,\n\n /**\n * #volatile\n * The 'genome' source is set when the hover originated from the\n * connected LinearGenomeView; hoverGenomeHighlights ignores it to avoid\n * echoing a codon-width highlight back onto the same genome view.\n */\n hoverPosition: undefined as\n | {\n structureSeqPos?: number\n code?: string\n chain?: string\n source: 'structure' | 'genome'\n }\n | undefined,\n /**\n * #volatile\n */\n structureSequences: undefined as string[] | undefined,\n /**\n * #volatile\n * Per-residue B-factor / pLDDT for the first chain, indexed by 0-based\n * structure sequence position. Drives the confidence feature track.\n */\n structureConfidence: undefined as number[] | undefined,\n /**\n * #volatile\n */\n isMouseInAlignment: false,\n /**\n * #volatile\n * Tracks whether this structure has been loaded into Molstar\n */\n loadedToMolstar: false,\n /**\n * #volatile\n * Range of alignment positions to highlight (e.g., when hovering a protein feature)\n */\n alignmentHoverRange: undefined as\n | { start: number; end: number }\n | undefined,\n /**\n * #volatile\n * The uniqueId of the currently selected protein feature (for persistent highlight)\n */\n selectedFeatureId: undefined as string | undefined,\n /**\n * #volatile\n * Set of feature track types that are hidden\n */\n hiddenFeatureTypes: new Set<string>(),\n }))\n .actions(self => ({\n setStructureData(data: { sequences?: string[]; confidence?: number[] }) {\n self.structureSequences = data.sequences\n self.structureConfidence = data.confidence\n },\n /**\n * #action\n */\n hideFeatureType(type: string) {\n self.hiddenFeatureTypes = new Set([...self.hiddenFeatureTypes, type])\n },\n /**\n * #action\n */\n showFeatureType(type: string) {\n const newSet = new Set(self.hiddenFeatureTypes)\n newSet.delete(type)\n self.hiddenFeatureTypes = newSet\n },\n /**\n * #action\n */\n showAllFeatureTypes() {\n self.hiddenFeatureTypes = new Set()\n },\n /**\n * #action\n */\n setLoadedToMolstar(val: boolean) {\n self.loadedToMolstar = val\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get connectedView() {\n const { views } = getSession(self)\n return views.find(f => f.id === self.connectedViewId) as MaybeLGV\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setClickedStructureRange(range?: { start: number; end: number }) {\n self.clickedStructureRange = range\n },\n /**\n * #action\n */\n setAlignmentHoverRange(range?: { start: number; end: number }) {\n self.alignmentHoverRange = range\n },\n /**\n * #action\n */\n setSelectedFeatureId(uniqueId?: string) {\n self.selectedFeatureId = uniqueId\n },\n /**\n * #action\n */\n setHoveredPosition(arg?: {\n structureSeqPos?: number\n chain?: string\n code?: string\n }) {\n self.hoverPosition = arg ? { ...arg, source: 'structure' } : undefined\n },\n /**\n * #action\n * Records a hover that originated from the connected LinearGenomeView.\n * Drives the 3D structure / feature-track highlight, but is excluded\n * from hoverGenomeHighlights so it doesn't echo back onto that same view.\n */\n setGenomeHoveredPosition(structureSeqPos?: number) {\n self.hoverPosition =\n structureSeqPos === undefined\n ? undefined\n : { structureSeqPos, source: 'genome' }\n },\n /**\n * #action\n */\n setAlignment(r?: PairwiseAlignment) {\n self.pairwiseAlignment = r\n },\n /**\n * #action\n */\n setIsMouseInAlignment(val: boolean) {\n self.isMouseInAlignment = val\n },\n }))\n .views(self => ({\n /**\n * #getter\n * Extracts UniProt ID from AlphaFold URL if available\n */\n get uniprotId() {\n const { url } = self\n if (!url) {\n return undefined\n }\n return getUniprotIdFromAlphaFoldTarget(url)\n },\n /**\n * #getter\n * All structure/transcript/alignment coordinate conversions, built once\n * from the pairwise alignment (see coordinates.ts). Use its typed methods\n * for point conversions; the getters below expose the raw maps for\n * whole-map consumers.\n */\n get coordinateMapper(): CoordinateMapper | undefined {\n return self.pairwiseAlignment\n ? makeCoordinateMapper(self.pairwiseAlignment)\n : undefined\n },\n /**\n * #getter\n */\n get structureSeqToTranscriptSeqPosition() {\n return this.coordinateMapper?.maps.structureSeqToTranscriptSeqPosition\n },\n /**\n * #getter\n */\n get transcriptSeqToStructureSeqPosition() {\n return this.coordinateMapper?.maps.transcriptSeqToStructureSeqPosition\n },\n /**\n * #getter\n */\n get structurePositionToAlignmentMap() {\n return this.coordinateMapper?.maps.structurePositionToAlignmentMap\n },\n /**\n * #getter\n */\n get transcriptPositionToAlignmentMap() {\n return this.coordinateMapper?.maps.transcriptPositionToAlignmentMap\n },\n /**\n * #getter\n * Per-residue pLDDT values mapped to alignment columns, shown only when the\n * structure's B-factor column actually looks like AlphaFold confidence.\n */\n get confidenceCells() {\n const c = self.structureConfidence\n return looksLikePlddt(c)\n ? mapResidueValuesToColumns(c, this.structurePositionToAlignmentMap)\n : []\n },\n /**\n * #getter\n * Per-residue Kyte-Doolittle hydrophobicity mapped to alignment columns.\n */\n get hydrophobicityCells() {\n const seq = self.structureSequences?.[0]\n return seq\n ? mapResidueValuesToColumns(\n kyteDoolittleScores(stripStopCodon(seq)),\n this.structurePositionToAlignmentMap,\n )\n : []\n },\n /**\n * #getter\n */\n get pairwiseAlignmentToTranscriptPosition() {\n return this.coordinateMapper?.maps.alignmentToTranscriptPosition\n },\n /**\n * #getter\n */\n get pairwiseAlignmentToStructurePosition() {\n return this.coordinateMapper?.maps.alignmentToStructurePosition\n },\n /**\n * #getter\n */\n get hoverString() {\n const r = self.hoverPosition\n if (r === undefined) {\n return ''\n }\n const structureLetter = this.hoverStructureLetter\n const genomeLetter = this.hoverGenomeLetter\n const parts = []\n\n if (r.structureSeqPos !== undefined) {\n parts.push(`${r.structureSeqPos + 1}`)\n }\n\n if (structureLetter) {\n parts.push(`Structure: ${structureLetter}`)\n }\n\n if (genomeLetter && structureLetter && genomeLetter !== structureLetter) {\n parts.push(`Genome: ${genomeLetter}`)\n }\n\n if (r.chain) {\n parts.push(`Chain: ${r.chain}`)\n }\n\n return parts.join(', ')\n },\n /**\n * #getter\n */\n get genomeToTranscriptSeqMapping() {\n return self.feature\n ? genomeToTranscriptSeqMapping(new SimpleFeature(self.feature))\n : undefined\n },\n /**\n * #getter\n */\n get structureSeqHoverPos() {\n return self.hoverPosition?.structureSeqPos\n },\n\n /**\n * #getter\n */\n get alignmentHoverPos() {\n const pos = this.structureSeqHoverPos\n return pos === undefined\n ? undefined\n : this.coordinateMapper?.structureToAlignment(structurePos(pos))\n },\n\n /**\n * #getter\n * Structure-residue range from a feature-bar hover, derived by mapping\n * alignmentHoverRange through pairwiseAlignmentToStructurePosition.\n * End is exclusive, matching clickedStructureRange.\n */\n get hoverStructureRange() {\n const { alignmentHoverRange } = self\n const a2s = this.pairwiseAlignmentToStructurePosition\n if (!alignmentHoverRange || !a2s) {\n return undefined\n }\n const start = a2s[alignmentHoverRange.start]\n const end = a2s[alignmentHoverRange.end]\n return start === undefined || end === undefined\n ? undefined\n : { start, end: end + 1 }\n },\n\n /**\n * #getter\n * Persistent click selection in alignment coordinates, derived from\n * clickedStructureRange via structurePositionToAlignmentMap.\n */\n get clickAlignmentRange() {\n const range = self.clickedStructureRange\n const s2a = this.structurePositionToAlignmentMap\n if (!range || !s2a) {\n return undefined\n }\n const start = s2a[range.start]\n const end = s2a[range.end - 1]\n return start === undefined || end === undefined\n ? undefined\n : { start, end }\n },\n\n /**\n * #getter\n * Maps a structure-residue range to genome coordinates as a single\n * IRegion. Handles single-residue and multi-residue ranges.\n */\n structureRangeToGenomeHighlight(\n range: { start: number; end: number } | undefined,\n ): IRegion[] {\n const assemblyName = self.connectedView?.assemblyNames[0]\n const mapping = this.genomeToTranscriptSeqMapping\n if (!range || !assemblyName || !mapping) {\n return []\n }\n const model = {\n genomeToTranscriptSeqMapping: mapping,\n pairwiseAlignment: self.pairwiseAlignment,\n structureSeqToTranscriptSeqPosition:\n this.structureSeqToTranscriptSeqPosition,\n }\n const mapped =\n range.end > range.start + 1\n ? proteinRangeToGenomeMapping({\n model,\n structureSeqPos: range.start,\n structureSeqEndPos: range.end,\n })\n : proteinToGenomeMapping({ model, structureSeqPos: range.start })\n if (!mapped) {\n return []\n }\n const [start, end] = mapped\n return [{ assemblyName, refName: mapping.refName, start, end }]\n },\n\n /**\n * #getter\n * Genome regions to highlight in the LGV based on the current hover.\n * A feature-range hover (hoverStructureRange) takes priority over a\n * single-residue hover (structureSeqHoverPos). Excludes hovers that\n * originated from the genome view itself, so hovering the LGV doesn't\n * echo a codon-width highlight back onto that same view.\n */\n get hoverGenomeHighlights(): IRegion[] {\n if (self.hoverPosition?.source === 'genome') {\n return []\n }\n const range = this.hoverStructureRange\n if (range) {\n return this.structureRangeToGenomeHighlight(range)\n }\n const structureSeqPos = this.structureSeqHoverPos\n return structureSeqPos === undefined\n ? []\n : this.structureRangeToGenomeHighlight({\n start: structureSeqPos,\n end: structureSeqPos + 1,\n })\n },\n\n /**\n * #getter\n * Genome regions to highlight in the LGV from the persistent click\n * selection. Derived from clickedStructureRange.\n */\n get clickGenomeHighlights(): IRegion[] {\n return this.structureRangeToGenomeHighlight(self.clickedStructureRange)\n },\n\n /**\n * #getter\n * Returns the single-letter amino acid code from the structure at hover position\n */\n get hoverStructureLetter() {\n const code = self.hoverPosition?.code\n if (code) {\n return proteinAbbreviationMapping[code]?.singleLetterCode\n }\n const structurePos = this.structureSeqHoverPos\n if (structurePos !== undefined && self.structureSequences?.[0]) {\n return self.structureSequences[0][structurePos]\n }\n return undefined\n },\n\n /**\n * #getter\n * Returns the single-letter amino acid code from the genome/transcript at hover position\n */\n get hoverGenomeLetter() {\n const structurePos = this.structureSeqHoverPos\n if (structurePos === undefined) {\n return undefined\n }\n const transcriptPos =\n this.structureSeqToTranscriptSeqPosition?.[structurePos]\n if (transcriptPos === undefined) {\n return undefined\n }\n return self.userProvidedTranscriptSequence[transcriptPos]\n },\n\n /**\n * #getter\n */\n get alignmentMatchSet() {\n const con = self.pairwiseAlignment?.consensus\n if (!con) {\n return undefined\n }\n const matchSet = new Set<number>()\n for (let i = 0; i < con.length; i++) {\n if (con[i] === '|' || con[i] === ':') {\n matchSet.add(i)\n }\n }\n return matchSet\n },\n\n /**\n * #getter\n * True while a pairwise alignment can still be produced but hasn't been\n * computed yet (both the transcript and structure sequences are present).\n * A standalone structure with no connected transcript has no sequence to\n * align against, so this stays false \u2014 the header shows no loader rather\n * than a perpetual \"Loading pairwise alignment\".\n */\n get alignmentPending() {\n return (\n !self.pairwiseAlignment &&\n !!self.userProvidedTranscriptSequence &&\n !!self.structureSequences?.[0]\n )\n },\n\n /**\n * #getter\n */\n get exactMatch() {\n const r1 = stripStopCodon(self.userProvidedTranscriptSequence)\n const r2 = self.structureSequences?.[0]\n ? stripStopCodon(self.structureSequences[0])\n : undefined\n return r1 === r2\n },\n\n get parentView(): ParentProteinView {\n return getParent<ParentProteinView>(self, 2)\n },\n get zoomToBaseLevel(): boolean {\n return this.parentView.zoomToBaseLevel\n },\n get autoScrollAlignment(): boolean {\n return this.parentView.autoScrollAlignment\n },\n get showHighlight(): boolean {\n return this.parentView.showHighlight\n },\n get showProteinTracks(): boolean {\n return this.parentView.showProteinTracks\n },\n get trackHeight(): number {\n return this.parentView.compactTracks\n ? COMPACT_TRACK_HEIGHT\n : NORMAL_TRACK_HEIGHT\n },\n get trackGap(): number {\n return this.parentView.compactTracks\n ? COMPACT_TRACK_GAP\n : NORMAL_TRACK_GAP\n },\n get alignmentAlgorithm(): AlignmentAlgorithm {\n return coerceAlignmentAlgorithm(this.parentView.alignmentAlgorithm)\n },\n get molstarPluginContext(): PluginContext | undefined {\n return this.parentView.molstarPluginContext\n },\n /**\n * #getter\n * Returns this structure's index in the parent's structures array\n */\n get structureIndex() {\n return this.parentView.structures.indexOf(self)\n },\n /**\n * #getter\n * Returns the Molstar structure object for the current structure.\n * Note: We access loadedToMolstar to ensure MobX recomputes this getter\n * when the structure finishes loading (Molstar's internal state isn't observable).\n */\n get molstarStructure() {\n const idx = this.structureIndex\n return self.loadedToMolstar && idx >= 0\n ? this.molstarPluginContext?.managers.structure.hierarchy.current\n .structures[idx]?.cell.obj?.data\n : undefined\n },\n }))\n .actions(self => ({\n setError(e: unknown) {\n self.parentView.setError(e)\n },\n /**\n * #action\n */\n hoverAlignmentPosition(alignmentPos: number) {\n if (!self.alignmentHoverRange) {\n const structureSeqPos = self.coordinateMapper?.alignmentToStructure(\n alignmentCol(alignmentPos),\n )\n self.setHoveredPosition(\n structureSeqPos !== undefined ? { structureSeqPos } : undefined,\n )\n }\n },\n /**\n * #action\n */\n clickAlignmentPosition(alignmentPos: number) {\n const structureSeqPos = self.coordinateMapper?.alignmentToStructure(\n alignmentCol(alignmentPos),\n )\n self.setSelectedFeatureId(undefined)\n if (structureSeqPos !== undefined) {\n clickProteinToGenome({\n model: self,\n structureSeqPos,\n }).catch((e: unknown) => {\n console.error(e)\n self.parentView.setError(e)\n })\n } else {\n self.setClickedStructureRange(undefined)\n }\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(async () => {\n try {\n const {\n userProvidedTranscriptSequence,\n structureSequences,\n exactMatch,\n alignmentAlgorithm,\n } = self\n const seq1 = userProvidedTranscriptSequence\n const seq2 = structureSequences?.[0]\n\n if (self.pairwiseAlignment || !seq1 || !seq2) {\n return\n }\n const r1 = stripStopCodon(seq1)\n const r2 = stripStopCodon(seq2)\n if (exactMatch) {\n self.setAlignment({\n consensus: '|'.repeat(r1.length),\n alns: [\n { id: 'seq1', seq: r1 },\n { id: 'seq2', seq: r2 },\n ],\n })\n } else {\n const pairwiseAlignment = runLocalAlignment(\n r1,\n r2,\n alignmentAlgorithm,\n )\n self.setAlignment(pairwiseAlignment)\n self.parentView.setShowAlignment(true)\n }\n } catch (e) {\n console.error(e)\n self.parentView.setError(e)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(() => {\n const { hovered } = getSession(self)\n const {\n transcriptSeqToStructureSeqPosition,\n genomeToTranscriptSeqMapping,\n connectedView,\n } = self\n if (\n connectedView?.initialized &&\n genomeToTranscriptSeqMapping &&\n checkHovered(hovered)\n ) {\n const { hoverPosition } = hovered\n const pos =\n genomeToTranscriptSeqMapping.g2p[hoverPosition.coord - 1]\n const c0 =\n pos === undefined\n ? undefined\n : transcriptSeqToStructureSeqPosition?.[pos]\n self.setGenomeHoveredPosition(c0)\n } else if (self.hoverPosition?.source === 'genome') {\n self.setGenomeHoveredPosition(undefined)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const { molstarPluginContext } = self\n if (molstarPluginContext) {\n const dispose = await subscribeMolstarInteraction({\n plugin: molstarPluginContext,\n kind: 'click',\n onUpdate: info => {\n // Click only acts on positive matches; ignore clicks that\n // didn't land on a structure element.\n if (!info) {\n return\n }\n self.setHoveredPosition(info)\n self.setSelectedFeatureId(undefined)\n clickProteinToGenome({\n model: self,\n structureSeqPos: info.structureSeqPos,\n }).catch((e: unknown) => {\n console.error(e)\n self.parentView.setError(e)\n })\n },\n })\n addDisposer(self, dispose)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const { molstarPluginContext } = self\n if (molstarPluginContext) {\n const dispose = await subscribeMolstarInteraction({\n plugin: molstarPluginContext,\n kind: 'hover',\n onUpdate: info => {\n self.setHoveredPosition(info)\n },\n })\n addDisposer(self, dispose)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const {\n showHighlight,\n structureSeqToTranscriptSeqPosition,\n molstarPluginContext,\n molstarStructure,\n } = self\n if (\n molstarStructure &&\n molstarPluginContext &&\n structureSeqToTranscriptSeqPosition\n ) {\n if (showHighlight) {\n const residues = Object.keys(\n structureSeqToTranscriptSeqPosition,\n ).map(coord => +coord + 1)\n await applyLociInteractivityMultiple({\n structure: molstarStructure,\n residues,\n plugin: molstarPluginContext,\n mode: 'select',\n })\n } else {\n molstarPluginContext.managers.interactivity.lociSelects.deselectAll()\n }\n }\n }),\n )\n\n // Drive molstar hover-highlight state from the model. A feature-range\n // hover (hoverStructureRange) takes priority over a single-residue\n // hover (structureSeqHoverPos); otherwise clear.\n addDisposer(\n self,\n autorun(async () => {\n const {\n molstarStructure,\n molstarPluginContext,\n hoverStructureRange,\n structureSeqHoverPos,\n } = self\n if (molstarStructure && molstarPluginContext) {\n if (hoverStructureRange) {\n await highlightResidueRange({\n structure: molstarStructure,\n plugin: molstarPluginContext,\n startResidue: hoverStructureRange.start + 1,\n endResidue: hoverStructureRange.end,\n })\n } else if (structureSeqHoverPos !== undefined) {\n await applyLociInteractivitySingle({\n structure: molstarStructure,\n plugin: molstarPluginContext,\n selectedResidue: structureSeqHoverPos,\n mode: 'highlight',\n })\n } else {\n molstarPluginContext.managers.interactivity.lociHighlights.clearHighlights()\n }\n }\n }),\n )\n },\n }))\n\nexport default Structure\n\nexport type JBrowsePluginProteinStructureStateModel = typeof Structure\nexport type JBrowsePluginProteinStructureModel =\n Instance<JBrowsePluginProteinStructureStateModel>\n", "import {\n structurePositionToAlignmentMap,\n structureSeqVsTranscriptSeqMap,\n transcriptPositionToAlignmentMap,\n} from '../mappings'\nimport { invertMap } from './util'\n\nimport type { PairwiseAlignment } from '../mappings'\n\n/**\n * Branded coordinate spaces. Every position in this plugin is a bare `number`,\n * but the *meaning* differs: a structure residue index is not interchangeable\n * with a transcript residue index or an alignment column, and mixing them is\n * the root cause of the off-by-one class of bugs. Branding makes the compiler\n * reject cross-space mixing; construct values with the helpers below at the\n * boundaries where raw numbers enter (molstar picks, hover events, features).\n *\n * Conventions: all are 0-based. StructurePos indexes the ungapped structure\n * sequence; TranscriptPos the ungapped transcript sequence; AlignmentCol a\n * column of the pairwise alignment (gaps included).\n */\ntype Branded<B extends string> = number & { readonly __brand: B }\nexport type StructurePos = Branded<'StructurePos'>\nexport type TranscriptPos = Branded<'TranscriptPos'>\nexport type AlignmentCol = Branded<'AlignmentCol'>\n\nexport const structurePos = (n: number) => n as StructurePos\nexport const transcriptPos = (n: number) => n as TranscriptPos\nexport const alignmentCol = (n: number) => n as AlignmentCol\n\nexport interface CoordinateMaps {\n structureSeqToTranscriptSeqPosition: Record<number, number>\n transcriptSeqToStructureSeqPosition: Record<number, number>\n structurePositionToAlignmentMap: Record<number, number>\n transcriptPositionToAlignmentMap: Record<number, number>\n alignmentToStructurePosition: Record<number, number>\n alignmentToTranscriptPosition: Record<number, number>\n}\n\nexport interface CoordinateMapper {\n structureToTranscript: (p: StructurePos) => TranscriptPos | undefined\n transcriptToStructure: (p: TranscriptPos) => StructurePos | undefined\n structureToAlignment: (p: StructurePos) => AlignmentCol | undefined\n alignmentToStructure: (c: AlignmentCol) => StructurePos | undefined\n transcriptToAlignment: (p: TranscriptPos) => AlignmentCol | undefined\n alignmentToTranscript: (c: AlignmentCol) => TranscriptPos | undefined\n /**\n * Raw lookup tables, for consumers that iterate the whole map rather than\n * convert a single position (e.g. per-residue track rendering, selection of\n * all aligned residues). Plain numbers \u2014 prefer the typed methods above for\n * point conversions.\n */\n readonly maps: CoordinateMaps\n}\n\n/**\n * Builds every coordinate conversion once from a pairwise alignment, replacing\n * the scatter of per-getter map builds + repeated invertMap calls. The branded\n * methods are the preferred API; `maps` stays unbranded for whole-map consumers.\n */\nexport function makeCoordinateMapper(\n pairwiseAlignment: PairwiseAlignment,\n): CoordinateMapper {\n const {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n } = structureSeqVsTranscriptSeqMap(pairwiseAlignment)\n const s2aln = structurePositionToAlignmentMap(pairwiseAlignment)\n const t2aln = transcriptPositionToAlignmentMap(pairwiseAlignment)\n const aln2s = invertMap(s2aln)\n const aln2t = invertMap(t2aln)\n\n // The `as` casts below are the single brand-crossing point: indexing a\n // Record<number,number> yields a plain number that we re-brand to its output\n // space. Isolated here so the rest of the codebase stays brand-clean.\n return {\n structureToTranscript: p =>\n structureSeqToTranscriptSeqPosition[p] as TranscriptPos | undefined,\n transcriptToStructure: p =>\n transcriptSeqToStructureSeqPosition[p] as StructurePos | undefined,\n structureToAlignment: p => s2aln[p] as AlignmentCol | undefined,\n alignmentToStructure: c => aln2s[c] as StructurePos | undefined,\n transcriptToAlignment: p => t2aln[p] as AlignmentCol | undefined,\n alignmentToTranscript: c => aln2t[c] as TranscriptPos | undefined,\n maps: {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n structurePositionToAlignmentMap: s2aln,\n transcriptPositionToAlignmentMap: t2aln,\n alignmentToStructurePosition: aln2s,\n alignmentToTranscriptPosition: aln2t,\n },\n }\n}\n", "/* eslint-disable @typescript-eslint/no-confusing-non-null-assertion */\nimport type { PairwiseAlignment } from '../mappings'\nimport type { AlignmentAlgorithm } from './types'\n\n// BLOSUM62 scoring matrix \u2014 standard 20 amino acids + B, Z, X, *\n// prettier-ignore\nconst AMINO_ACIDS = ['A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V','B','Z','X','*']\n// prettier-ignore\nconst BLOSUM62_RAW = [\n// A R N D C Q E G H I L K M F P S T W Y V B Z X *\n [ 4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4], // A\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4], // R\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4], // N\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4], // D\n [ 0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4], // C\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4], // Q\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4], // E\n [ 0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4], // G\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4], // H\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4], // I\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4], // L\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4], // K\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4], // M\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4], // F\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4], // P\n [ 1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4], // S\n [ 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4], // T\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4], // W\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4], // Y\n [ 0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4], // V\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4], // B\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4], // Z\n [ 0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4], // X\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1], // *\n]\n\nconst BLOSUM62: Record<string, Record<string, number>> = {}\nfor (let i = 0; i < AMINO_ACIDS.length; i++) {\n const row: Record<string, number> = {}\n for (let j = 0; j < AMINO_ACIDS.length; j++) {\n row[AMINO_ACIDS[j]!] = BLOSUM62_RAW[i]![j]!\n }\n BLOSUM62[AMINO_ACIDS[i]!] = row\n}\n\nfunction getScore(a: string, b: string) {\n return BLOSUM62[a.toUpperCase()]?.[b.toUpperCase()] ?? -4\n}\n\n// Default gap penalties (matching EMBOSS defaults)\nconst GAP_OPEN = -10\nconst GAP_EXTEND = -0.5\n\ninterface AlignmentResult {\n alignedSeq1: string\n alignedSeq2: string\n score: number\n}\n\n/**\n * Needleman-Wunsch global alignment algorithm\n * Aligns entire sequences end-to-end\n */\nexport function needlemanWunsch(\n seq1: string,\n seq2: string,\n gapOpen = GAP_OPEN,\n gapExtend = GAP_EXTEND,\n): AlignmentResult {\n const m = seq1.length\n const n = seq2.length\n\n // Score matrices\n const M: number[][] = [] // match/mismatch\n const Ix: number[][] = [] // gap in seq2 (insertion in seq1)\n const Iy: number[][] = [] // gap in seq1 (insertion in seq2)\n\n // Initialize matrices\n for (let i = 0; i <= m; i++) {\n M[i] = []\n Ix[i] = []\n Iy[i] = []\n for (let j = 0; j <= n; j++) {\n M[i]![j] = -Infinity\n Ix[i]![j] = -Infinity\n Iy[i]![j] = -Infinity\n }\n }\n\n // Base cases\n M[0]![0] = 0\n for (let i = 1; i <= m; i++) {\n Ix[i]![0] = gapOpen + (i - 1) * gapExtend\n }\n for (let j = 1; j <= n; j++) {\n Iy[0]![j] = gapOpen + (j - 1) * gapExtend\n }\n\n // Fill matrices\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n\n // M[i][j]: best score ending with match/mismatch\n M[i]![j] =\n Math.max(M[i - 1]![j - 1]!, Ix[i - 1]![j - 1]!, Iy[i - 1]![j - 1]!) +\n matchScore\n\n // Ix[i][j]: best score ending with gap in seq2\n Ix[i]![j] = Math.max(M[i - 1]![j]! + gapOpen, Ix[i - 1]![j]! + gapExtend)\n\n // Iy[i][j]: best score ending with gap in seq1\n Iy[i]![j] = Math.max(M[i]![j - 1]! + gapOpen, Iy[i]![j - 1]! + gapExtend)\n }\n }\n\n // Traceback\n let alignedSeq1 = ''\n let alignedSeq2 = ''\n let i = m\n let j = n\n\n // Find which matrix has the best final score\n const finalScores = [M[m]![n]!, Ix[m]![n]!, Iy[m]![n]!]\n const score = Math.max(...finalScores)\n let currentMatrix: 'M' | 'Ix' | 'Iy' =\n score === M[m]![n]! ? 'M' : score === Ix[m]![n]! ? 'Ix' : 'Iy'\n\n while (i > 0 || j > 0) {\n if (currentMatrix === 'M' && i > 0 && j > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n const prevM = M[i - 1]![j - 1]!\n const prevIx = Ix[i - 1]![j - 1]!\n\n if (M[i]![j]! === prevM + matchScore) {\n currentMatrix = 'M'\n } else if (M[i]![j]! === prevIx + matchScore) {\n currentMatrix = 'Ix'\n } else {\n currentMatrix = 'Iy'\n }\n i--\n j--\n } else if (currentMatrix === 'Ix' && i > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n\n currentMatrix = Ix[i]![j]! === M[i - 1]![j]! + gapOpen ? 'M' : 'Ix'\n i--\n } else if (j > 0) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n currentMatrix = Iy[i]![j]! === M[i]![j - 1]! + gapOpen ? 'M' : 'Iy'\n j--\n } else {\n break\n }\n }\n\n return { alignedSeq1, alignedSeq2, score }\n}\n\n/**\n * Smith-Waterman local alignment algorithm\n * Finds the best local alignment between subsequences\n */\nexport function smithWaterman(\n seq1: string,\n seq2: string,\n gapOpen = GAP_OPEN,\n gapExtend = GAP_EXTEND,\n): AlignmentResult {\n const m = seq1.length\n const n = seq2.length\n\n // Score matrices\n const M: number[][] = []\n const Ix: number[][] = []\n const Iy: number[][] = []\n\n // Track best score position\n let bestScore = 0\n let bestI = 0\n let bestJ = 0\n\n // Initialize matrices\n for (let i = 0; i <= m; i++) {\n M[i] = []\n Ix[i] = []\n Iy[i] = []\n for (let j = 0; j <= n; j++) {\n M[i]![j] = 0\n Ix[i]![j] = -Infinity\n Iy[i]![j] = -Infinity\n }\n }\n\n // Fill matrices\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n\n // M[i][j]: best score ending with match/mismatch (or 0 to restart)\n M[i]![j] = Math.max(\n 0,\n M[i - 1]![j - 1]! + matchScore,\n Ix[i - 1]![j - 1]! + matchScore,\n Iy[i - 1]![j - 1]! + matchScore,\n )\n\n // Ix[i][j]: best score ending with gap in seq2\n Ix[i]![j] = Math.max(M[i - 1]![j]! + gapOpen, Ix[i - 1]![j]! + gapExtend)\n\n // Iy[i][j]: best score ending with gap in seq1\n Iy[i]![j] = Math.max(M[i]![j - 1]! + gapOpen, Iy[i]![j - 1]! + gapExtend)\n\n // Track best score\n const cellMax = Math.max(M[i]![j]!, Ix[i]![j]!, Iy[i]![j]!)\n if (cellMax > bestScore) {\n bestScore = cellMax\n bestI = i\n bestJ = j\n }\n }\n }\n\n // Traceback from best score position\n let alignedSeq1 = ''\n let alignedSeq2 = ''\n let i = bestI\n let j = bestJ\n\n // Determine starting matrix\n let currentMatrix: 'M' | 'Ix' | 'Iy' =\n M[i]![j]! >= Ix[i]![j]! && M[i]![j]! >= Iy[i]![j]!\n ? 'M'\n : Ix[i]![j]! >= Iy[i]![j]!\n ? 'Ix'\n : 'Iy'\n\n // Add trailing gaps for positions after local alignment\n for (let k = seq1.length; k > bestI; k--) {\n alignedSeq1 = seq1[k - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n }\n for (let k = seq2.length; k > bestJ; k--) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[k - 1] + alignedSeq2\n }\n\n while (i > 0 && j > 0) {\n if (currentMatrix === 'M') {\n if (M[i]![j]! === 0) {\n break\n }\n\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n const prevM = M[i - 1]![j - 1]!\n const prevIx = Ix[i - 1]![j - 1]!\n\n if (M[i]![j]! === prevM + matchScore) {\n currentMatrix = 'M'\n } else if (M[i]![j]! === prevIx + matchScore) {\n currentMatrix = 'Ix'\n } else {\n currentMatrix = 'Iy'\n }\n i--\n j--\n } else if (currentMatrix === 'Ix') {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n\n if (Ix[i]![j]! === M[i - 1]![j]! + gapOpen) {\n currentMatrix = 'M'\n }\n i--\n } else {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n if (Iy[i]![j]! === M[i]![j - 1]! + gapOpen) {\n currentMatrix = 'M'\n }\n j--\n }\n }\n\n // Add leading gaps for positions before local alignment\n while (i > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n i--\n }\n while (j > 0) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n j--\n }\n\n return { alignedSeq1, alignedSeq2, score: bestScore }\n}\n\nfunction buildConsensus(alignedSeq1: string, alignedSeq2: string) {\n const chars: string[] = []\n for (let i = 0; i < alignedSeq1.length; i++) {\n const a = alignedSeq1[i]!\n const b = alignedSeq2[i]!\n if (a !== '-' && b !== '-' && a.toUpperCase() === b.toUpperCase()) {\n chars.push('|')\n } else if (a !== '-' && b !== '-' && getScore(a, b) > 0) {\n chars.push(':')\n } else {\n chars.push(' ')\n }\n }\n return chars.join('')\n}\n\nexport function runLocalAlignment(\n seq1: string,\n seq2: string,\n algorithm: AlignmentAlgorithm,\n): PairwiseAlignment {\n const { alignedSeq1, alignedSeq2 } =\n algorithm === 'smith_waterman'\n ? smithWaterman(seq1, seq2)\n : needlemanWunsch(seq1, seq2)\n\n return {\n consensus: buildConsensus(alignedSeq1, alignedSeq2),\n alns: [\n { id: 'a', seq: alignedSeq1 },\n { id: 'b', seq: alignedSeq2 },\n ],\n }\n}\n", "export const proteinAbbreviationMapping = Object.fromEntries(\n [\n { name: 'alanine', abbreviation: 'Ala', singleLetterCode: 'A' },\n { name: 'arginine', abbreviation: 'Arg', singleLetterCode: 'R' },\n { name: 'asparagine', abbreviation: 'Asn', singleLetterCode: 'N' },\n { name: 'aspartic acid', abbreviation: 'Asp', singleLetterCode: 'D' },\n { name: 'cysteine', abbreviation: 'Cys', singleLetterCode: 'C' },\n { name: 'glutamic acid', abbreviation: 'Glu', singleLetterCode: 'E' },\n { name: 'glutamine', abbreviation: 'Gln', singleLetterCode: 'Q' },\n { name: 'glycine', abbreviation: 'Gly', singleLetterCode: 'G' },\n { name: 'histidine', abbreviation: 'His', singleLetterCode: 'H' },\n { name: 'isoleucine', abbreviation: 'Ile', singleLetterCode: 'I' },\n { name: 'leucine', abbreviation: 'Leu', singleLetterCode: 'L' },\n { name: 'lysine', abbreviation: 'Lys', singleLetterCode: 'K' },\n { name: 'methionine', abbreviation: 'Met', singleLetterCode: 'M' },\n { name: 'phenylalanine', abbreviation: 'Phe', singleLetterCode: 'F' },\n { name: 'proline', abbreviation: 'Pro', singleLetterCode: 'P' },\n { name: 'serine', abbreviation: 'Ser', singleLetterCode: 'S' },\n { name: 'threonine', abbreviation: 'Thr', singleLetterCode: 'T' },\n { name: 'tryptophan', abbreviation: 'Trp', singleLetterCode: 'W' },\n { name: 'tyrosine', abbreviation: 'Tyr', singleLetterCode: 'Y' },\n { name: 'valine', abbreviation: 'Val', singleLetterCode: 'V' },\n ].map(r => [r.abbreviation.toUpperCase(), r]),\n)\n", "import loadMolstar from './loadMolstar'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface MolstarLocationInfo {\n structureSeqPos: number\n code: string\n chain: string\n}\n\nfunction extractLocationInfo(\n molstar: Awaited<ReturnType<typeof loadMolstar>>,\n location: ReturnType<\n (typeof molstar.StructureElement.Loci)['getFirstLocation']\n > &\n object,\n): MolstarLocationInfo {\n return {\n structureSeqPos:\n molstar.StructureProperties.residue.auth_seq_id(location) - 1,\n code: molstar.StructureProperties.atom.label_comp_id(location),\n chain: molstar.StructureProperties.chain.auth_asym_id(location),\n }\n}\n\n/**\n * Subscribe to molstar's click/hover behavior with the location-extraction\n * boilerplate factored out. The handler receives extracted location info when\n * the cursor is over a structure element, or `undefined` otherwise (so e.g.\n * hover handlers can clear state when the cursor leaves).\n *\n * Returns a cleanup function suitable for use with mobx's addDisposer.\n */\nexport default async function subscribeMolstarInteraction({\n plugin,\n kind,\n onUpdate,\n}: {\n plugin: PluginContext\n kind: 'click' | 'hover'\n onUpdate: (info: MolstarLocationInfo | undefined) => void\n}): Promise<() => void> {\n const molstar = await loadMolstar()\n const subscription = plugin.behaviors.interaction[kind].subscribe(e => {\n if (molstar.StructureElement.Loci.is(e.current.loci)) {\n const loc = molstar.StructureElement.Loci.getFirstLocation(e.current.loci)\n onUpdate(loc ? extractLocationInfo(molstar, loc) : undefined)\n } else {\n onUpdate(undefined)\n }\n })\n return () => {\n subscription.unsubscribe()\n }\n}\n", "import loadMolstar from './loadMolstar'\n\nimport type { Mat4 } from 'molstar/lib/mol-math/linear-algebra'\nimport type { StructureElement } from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { StateObjectRef } from 'molstar/lib/mol-state'\n\nconst SuperpositionTag = 'SuperpositionTransform'\n\nexport async function superposeStructures(plugin: PluginContext) {\n const {\n QueryContext,\n StructureElement,\n StructureSelection,\n StructureSelectionQueries,\n PluginCommands,\n PluginStateObject,\n tmAlign,\n } = await loadMolstar()\n\n const structures = plugin.managers.structure.hierarchy.current.structures\n if (structures.length < 2) {\n return\n }\n\n const { query } = StructureSelectionQueries.trace\n\n const locis = structures.map(s => {\n const structure = s.cell.obj?.data\n if (!structure) {\n return undefined\n }\n const parent = plugin.helpers.substructureParent.get(structure)\n if (!parent) {\n return undefined\n }\n const rootStructure = plugin.state.data.selectQ(q =>\n q.byValue(parent).rootOfType(PluginStateObject.Molecule.Structure),\n )[0]?.obj?.data\n if (!rootStructure) {\n return undefined\n }\n const loci = StructureSelection.toLociWithSourceUnits(\n query(new QueryContext(structure)),\n )\n return StructureElement.Loci.remap(loci, rootStructure)\n })\n\n const validLocis = locis.filter(\n (l): l is StructureElement.Loci => l !== undefined,\n )\n if (validLocis.length < 2) {\n return\n }\n\n const pivot = plugin.managers.structure.hierarchy.findStructure(\n validLocis[0]?.structure,\n )\n const coordinateSystem = pivot?.transform?.cell.obj?.data.coordinateSystem\n\n for (let i = 1; i < validLocis.length; i++) {\n const result = tmAlign(validLocis[0]!, validLocis[i]!)\n const { bTransform, tmScoreA, tmScoreB, rmsd, alignedLength } = result\n await applyTransform(\n plugin,\n structures[i]!.cell,\n bTransform,\n coordinateSystem,\n )\n plugin.log.info(\n `TM-align: TM-score=${tmScoreA.toFixed(4)}/${tmScoreB.toFixed(4)}, RMSD=${rmsd.toFixed(2)} \u00C5, aligned ${alignedLength} residues.`,\n )\n }\n\n await new Promise(res => requestAnimationFrame(res))\n await PluginCommands.Camera.Reset(plugin)\n}\n\nasync function applyTransform(\n plugin: PluginContext,\n s: StateObjectRef,\n matrix: Mat4,\n coordinateSystem: { matrix: Mat4 } | undefined,\n) {\n const { Mat4, StateObjectRef, StateTransforms } = await loadMolstar()\n const r = StateObjectRef.resolveAndCheck(plugin.state.data, s)\n if (!r) {\n return\n }\n\n const o = plugin.state.data.selectQ(q =>\n q\n .byRef(r.transform.ref)\n .subtree()\n .withTransformer(StateTransforms.Model.TransformStructureConformation),\n )[0]\n\n const finalTransform =\n coordinateSystem && !Mat4.isIdentity(coordinateSystem.matrix)\n ? Mat4.mul(Mat4(), coordinateSystem.matrix, matrix)\n : matrix\n\n const params = {\n transform: {\n name: 'matrix' as const,\n params: { data: finalTransform, transpose: false },\n },\n }\n\n const b = o\n ? plugin.state.data.build().to(o).update(params)\n : plugin.state.data\n .build()\n .to(s)\n .insert(StateTransforms.Model.TransformStructureConformation, params, {\n tags: SuperpositionTag,\n })\n\n await plugin.runTask(plugin.state.data.updateTree(b))\n}\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function UniProtVariationAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'UniProtVariationAdapter',\n displayName: 'UniProtVariation adapter',\n configSchema,\n getAdapterClass: () =>\n import('./UniProtVariationAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config UniProtVariationAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst UniProtVariationAdapter: AnyConfigurationSchemaType = ConfigurationSchema(\n 'UniProtVariationAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },\n },\n scoreField: {\n type: 'string',\n defaultValue: '',\n },\n },\n { explicitlyTyped: true },\n)\nexport default UniProtVariationAdapter\n", "export const version = '0.4.12'\n"],
|
|
5
|
-
"mappings": "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C/F,CAAC,GAAK,EAAI,EAAI,EAAG,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAG,GAAI,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAG,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAK,EA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",
|
|
6
|
-
"names": ["require_Plugin", "__commonJSMin", "exports", "module", "require_react", "__commonJSMin", "exports", "module", "require_mobx_react", "__commonJSMin", "exports", "module", "require_util", "__commonJSMin", "exports", "module", "require_mui", "__commonJSMin", "exports", "module", "loadMolstar", "cached", "base", "src", "init_loadMolstar", "__esmMin", "checkHovered", "hovered", "getMolstarStructureSelection", "structure", "selectedResidue", "Script", "loadMolstar", "Q", "invertMap", "arg", "a", "b", "init_util", "__esmMin", "init_loadMolstar", "genomeToTranscriptSeqMapping", "feature", "strand", "refName", "uniqueCds", "f", "key", "cds", "b", "g2p", "p2g", "p2gCodon", "proteinCounter", "lastProteinPos", "length", "i", "genomePos", "proteinPos", "getCodonRange", "init_esm", "__esmMin", "require_mobx", "__commonJSMin", "exports", "module", "structureSeqVsTranscriptSeqMap", "pairwiseAlignment", "structureSeq", "transcriptSeq", "j", "k", "structureSeqToTranscriptSeqPosition", "transcriptSeqToStructureSeqPosition", "i", "c1", "seqPositionToAlignmentMap", "seq", "map", "structurePositionToAlignmentMap", "transcriptPositionToAlignmentMap", "genomeToTranscriptSeqMapping", "feature", "init_mappings", "__esmMin", "init_esm", "import_util", "import_mobx", "Protein1DViewRegistry", "protein1DViewRegistry", "init_Protein1DViewRegistry", "__esmMin", "init_esm", "init_mappings", "info", "viewId", "session", "activeViewIds", "v", "uniprotId", "proteinPos", "feature", "mapping", "genomeToTranscriptSeqMapping", "p2g", "strand", "refName", "result", "getCodonRange", "start", "end", "stripStopCodon", "seq", "getTranscriptFeatures", "feature", "transcripts", "f", "stripTrailingVersion", "s", "getId", "val", "getTranscriptDisplayName", "getGeneDisplayName", "isRecognizedDatabaseId", "id", "ensemblGenePattern", "ensemblTranscriptPattern", "ensemblProteinPattern", "refSeqTranscriptPattern", "refSeqProteinPattern", "ccdsPattern", "hgncPattern", "getDatabaseTypeForId", "parseDbxref", "dbxref", "item", "extractIdsFromDbxref", "dbxrefEntries", "ids", "entry", "parts", "lastPart", "findRecognizedDbIds", "recognizedIds", "attributesToCheck", "attr", "stripped", "hgnc", "hgncStr", "dbxrefIds", "extractFeatureIdentifiers", "featureToProcess", "uniprotIdAttr", "uniprotId", "geneId", "geneName", "selectBestTranscript", "options", "isoformSequences", "structureSequence", "exactMatch", "longestWithData", "a", "b", "init_util", "__esmMin", "require_AdapterType", "__commonJSMin", "exports", "module", "require_configuration", "__commonJSMin", "exports", "module", "require_BaseAdapter", "__commonJSMin", "exports", "module", "require_io", "__commonJSMin", "exports", "module", "require_rxjs", "__commonJSMin", "exports", "module", "AlphaFoldConfidenceAdapter_exports", "__export", "AlphaFoldConfidenceAdapter", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_AlphaFoldConfidenceAdapter", "__esmMin", "scores", "value", "idx", "_opts", "e", "query", "observer", "start", "end", "refName", "data", "f", "AlphaMissensePathogenicityAdapter_exports", "__export", "AlphaMissensePathogenicityAdapter", "parseAlphaMissense", "text", "f", "row", "idx", "protein_variant", "score", "am_class", "ref", "variant", "coord", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_AlphaMissensePathogenicityAdapter", "__esmMin", "scores", "_opts", "e", "s", "_regions", "query", "observer", "start", "end", "refName", "data", "sources", "require_utils", "__commonJSMin", "exports", "module", "import_utils", "init_createSvgIcon", "__esmMin", "require_jsx_runtime", "__commonJSMin", "exports", "module", "require_ui", "__commonJSMin", "exports", "module", "require_material", "__commonJSMin", "exports", "module", "getFirstNonEmptyLine", "arr", "line", "init_util", "__esmMin", "isRulerLine", "line", "trimmed", "f", "isSequenceLine", "hasPositionNumbers", "fields", "getSeqBounds", "seqIndex", "seq", "seqStart", "parsePairwiseBlock", "arr", "getFirstNonEmptyLine", "block", "consensusLine", "s", "firstField", "start", "end", "ids", "seqs", "consensus", "firstSeq", "remainder", "parsePairwiseBlocks", "res", "i", "init_pairwise", "__esmMin", "init_util", "parsePairwise", "contents", "filtered", "f", "res", "parsePairwiseBlocks", "alns", "n", "index", "consensus", "firstAln", "init_esm", "__esmMin", "init_pairwise", "init_util", "setupProteinAssembly", "session", "uniprotId", "init_proteinAssemblySetup", "__esmMin", "fetchUniProtFeatureTypes", "uniprotId", "url", "res", "data", "f", "addUniProtFeatureTracks", "session", "featureTypes", "type", "trackId", "addAntigenTrack", "addVariationTrack", "addAlphaFoldConfidenceTrack", "confidenceUrl", "addAlphaMissenseTrack", "addAllProteinTracks", "init_proteinTrackSetup", "__esmMin", "launchProteinAnnotationView", "session", "feature", "selectedTranscript", "uniprotId", "confidenceUrl", "connectedViewId", "setupProteinAssembly", "addAllProteinTracks", "view", "formatViewName", "protein1DViewRegistry", "init_launchProteinAnnotationView", "__esmMin", "init_proteinAssemblySetup", "init_proteinTrackSetup", "init_Protein1DViewRegistry", "init_launchViewUtils", "getAlphaFoldStructureUrl", "uniprotId", "version", "ALPHAFOLD_VERSION", "getAlphaFoldConfidenceUrl", "getAlphaFoldMsaUrl", "getPdbStructureUrl", "pdbId", "extractTargetId", "target", "getUniprotIdFromAlphaFoldTarget", "getStructureUrlFromTarget", "db", "targetId", "getConfidenceUrlFromTarget", "formatViewName", "prefix", "feature", "selectedTranscript", "getGeneDisplayName", "getTranscriptDisplayName", "s", "launch3DProteinView", "session", "view", "url", "data", "userProvidedTranscriptSequence", "alignmentAlgorithm", "displayName", "connectedMsaViewId", "snap", "launch1DProteinView", "confidenceUrl", "launchProteinAnnotationView", "launchMsaView", "hasMsaViewPlugin", "launch3DProteinViewWithMsa", "params", "msaView", "import_util", "init_launchViewUtils", "__esmMin", "init_util", "init_launchProteinAnnotationView", "require_use_sync_external_store_shim_production", "__commonJSMin", "exports", "React", "is", "x", "y", "objectIs", "useState", "useEffect", "useLayoutEffect", "useDebugValue", "useSyncExternalStore$2", "subscribe", "getSnapshot", "value", "_useState", "inst", "forceUpdate", "checkIfSnapshotChanged", "latestGetSnapshot", "nextValue", "useSyncExternalStore$1", "shim", "require_shim", "__commonJSMin", "exports", "module", "events_exports", "__export", "ERROR_REVALIDATE_EVENT", "FOCUS_EVENT", "MUTATE_EVENT", "RECONNECT_EVENT", "init_events", "__esmMin", "dequal", "foo", "bar", "ctor", "len", "has", "init_lite", "__esmMin", "internalMutate", "args", "cache", "_key", "_data", "_opts", "options", "mergeObjects", "populateCache", "rollbackOnErrorOption", "optimisticData", "rollbackOnError", "error", "throwOnError", "isFunction", "keyFilter", "matchedKeys", "it", "key", "mutateByKey", "_k", "serialize", "get", "set", "createCacheHelper", "EVENT_REVALIDATORS", "MUTATION", "FETCH", "PRELOAD", "SWRGlobalState", "startRevalidate", "revalidators", "data", "isError", "beforeMutationTs", "getTimestamp", "hasOptimisticData", "isUndefined", "state", "displayedData", "currentData", "committedData", "err", "isPromiseLike", "UNDEFINED", "populateCachedData", "import_react", "noop", "OBJECT", "EMPTY_CACHE", "INITIAL_CACHE", "STR_UNDEFINED", "isWindowDefined", "isDocumentDefined", "isLegacyDeno", "hasRequestAnimationFrame", "online", "isOnline", "onWindowEvent", "offWindowEvent", "isVisible", "initFocus", "initReconnect", "preset", "defaultConfigOptions", "IS_REACT_LEGACY", "IS_SERVER", "rAF", "useIsomorphicLayoutEffect", "navigatorConnection", "slowConnection", "table", "getTypeName", "isObjectTypeName", "counter", "stableHash", "__timestamp", "revalidateAllKeys", "initCache", "onErrorRetry", "compare", "mutate", "defaultConfig", "mergeConfigs", "SWRConfigContext", "SWRConfig", "init_config_context_12s_CCVTDPOP", "__esmMin", "init_lite", "v", "a", "b", "x", "info", "prev", "visibilityState", "callback", "onOnline", "onOffline", "React", "f", "value", "typeName", "type", "arg", "isDate", "isRegex", "isPlainObject", "result", "index", "keys", "provider", "opts", "unmount", "subscriptions", "subscribe", "subs", "setter", "fn", "initProvider", "releaseFocus", "releaseReconnect", "_", "__", "config", "revalidate", "maxRetryCount", "currentRetryCount", "timeout", "dequal", "u1", "f1", "u2", "f2", "props", "parentConfig", "isFunctionalConfig", "extendedConfig", "cacheContextRef", "cacheContext", "INFINITE_PREFIX", "init_constants", "__esmMin", "init_types", "__esmMin", "import_react", "enableDevtools", "use", "setupDevTools", "normalize", "useSWRConfig", "middleware", "BUILT_IN_MIDDLEWARE", "withArgs", "subscribeCallback", "init_internal", "__esmMin", "init_config_context_12s_CCVTDPOP", "init_events", "init_constants", "init_types", "isWindowDefined", "React", "args", "isFunction", "parentConfig", "SWRConfigContext", "mergeObjects", "defaultConfig", "useSWRNext", "key_", "fetcher_", "config", "key", "serialize", "PRELOAD", "SWRGlobalState", "cache", "INFINITE_PREFIX", "req", "isUndefined", "hook", "fallbackConfig", "fn", "_config", "mergeConfigs", "next", "i", "callbacks", "callback", "keyedRevalidators", "index", "import_react", "import_shim", "noop", "UNDEFINED", "use", "WITH_DEDUPE", "resolvedUndef", "sub", "useSWRHandler", "SWRConfig", "useSWR", "init_index", "__esmMin", "init_internal", "React", "thenable", "v", "e", "_key", "fetcher", "config", "cache", "compare", "suspense", "fallbackData", "revalidateOnMount", "revalidateIfStale", "refreshInterval", "refreshWhenHidden", "refreshWhenOffline", "keepPreviousData", "strictServerPrefetchWarning", "EVENT_REVALIDATORS", "MUTATION", "FETCH", "PRELOAD", "SWRGlobalState", "key", "fnArg", "serialize", "initialMountedRef", "unmountedRef", "keyRef", "fetcherRef", "configRef", "getConfig", "isActive", "getCache", "setCache", "subscribeCache", "getInitialCache", "createCacheHelper", "stateDependencies", "fallback", "isUndefined", "isEqual", "prev", "current", "_", "t", "returnedData", "isInitialMount", "getSnapshot", "cachedData", "initialData", "getSelectedCache", "state", "snapshot", "mergeObjects", "data", "clientSnapshot", "serverSnapshot", "memorizedSnapshot", "newSnapshot", "cached", "callback", "hasRevalidator", "isPromiseLike", "error", "laggyDataRef", "hasKeyButNoData", "hydrationRef", "IS_SERVER", "isHydration", "shouldDoInitialRevalidation", "defaultValidatingState", "isValidating", "isLoading", "revalidate", "revalidateOpts", "currentFetcher", "newData", "startAt", "loading", "opts", "shouldStartNewRequest", "callbackSafeguard", "IS_REACT_LEGACY", "finalState", "finishRequestAndUpdateState", "cleanupState", "requestInfo", "initialState", "getTimestamp", "mutationInfo", "cacheData", "err", "currentConfig", "shouldRetryOnError", "isFunction", "_opts", "revalidators", "events_exports", "boundMutate", "args", "internalMutate", "useIsomorphicLayoutEffect", "softRevalidate", "nextFocusRevalidatedAt", "unsubEvents", "subscribeCallback", "type", "now", "rAF", "timer", "next", "interval", "execute", "req", "mutateReq", "revalidation", "OBJECT", "defaultConfig", "withArgs", "import_jsx_runtime", "Help_default", "init_Help", "__esmMin", "init_createSvgIcon", "_jsx", "HelpDialog_exports", "__export", "HelpDialog", "Typography2", "children", "React", "handleClose", "import_react", "import_ui", "import_material", "init_HelpDialog", "__esmMin", "require_pluggableElementTypes", "__commonJSMin", "exports", "module", "require_mst", "__commonJSMin", "exports", "module", "require_mobx_state_tree", "__commonJSMin", "exports", "module", "applyColorTheme", "plugin", "colorScheme", "structures", "structure", "COLOR_SCHEMES", "COLOR_SCHEME_VALUES", "init_applyColorTheme", "__esmMin", "s", "clearLoci", "plugin", "applyLoci", "loci", "mode", "applyLociInteractivityMultiple", "structure", "residues", "StructureSelection", "Script", "loadMolstar", "sel", "Q", "residue", "applyLociInteractivity", "startResidue", "endResidue", "applyLociInteractivitySingle", "selectedResidue", "getMolstarStructureSelection", "init_applyLociInteractivity", "__esmMin", "init_loadMolstar", "init_util", "HOVER_MARKER_COLOR", "SELECTED_BORDER", "HOVERED_BORDER", "HIDE_BUTTON_COLOR", "init_constants", "__esmMin", "highlightResidueRange", "structure", "startResidue", "endResidue", "plugin", "applyLociInteractivity", "selectResidueRange", "init_highlightResidueRange", "__esmMin", "init_applyLociInteractivity", "proteinToGenomeMapping", "model", "structureSeqPos", "genomeToTranscriptSeqMapping", "pairwiseAlignment", "structureSeqToTranscriptSeqPosition", "p2g", "strand", "transcriptPos", "getCodonRange", "proteinRangeToGenomeMapping", "structureSeqEndPos", "minStart", "maxEnd", "pos", "result", "s", "e", "navigateToProteinPosition", "zoomToBaseLevel", "session", "connectedView", "refName", "assemblyName", "start", "end", "assemblyManager", "canonicalRefName", "clickProteinToGenome", "import_util", "init_proteinToGenomeMapping", "__esmMin", "init_esm", "kyteDoolittleScores", "seq", "aa", "KYTE_DOOLITTLE", "plddtColor", "score", "hydrophobicityColor", "KYTE_DOOLITTLE_MIN", "KYTE_DOOLITTLE_MAX", "r", "g", "b", "mapResidueValuesToColumns", "values", "structurePositionToAlignmentMap", "value", "structurePos", "col", "init_residueTracks", "__esmMin", "import_react", "import_material", "import_mobx_react", "ManualAlignmentDialog", "ManualAlignmentDialog_default", "init_ManualAlignmentDialog", "__esmMin", "init_esm", "model", "alignment", "setAlignment", "parseError", "setParseError", "showManualAlignmentDialog", "primaryStructure", "handleClose", "handleApply", "parsed", "parsePairwise", "e", "React", "import_jsx_runtime", "Tune_default", "init_Tune", "__esmMin", "init_createSvgIcon", "_jsx", "require_Checkbox", "__commonJSMin", "exports", "module", "require_IconButton", "__commonJSMin", "exports", "module", "require_ListItemIcon", "__commonJSMin", "exports", "module", "require_ListItemText", "__commonJSMin", "exports", "module", "require_Menu", "__commonJSMin", "exports", "module", "require_MenuItem", "__commonJSMin", "exports", "module", "require_TextField", "__commonJSMin", "exports", "module", "require_Tooltip", "__commonJSMin", "exports", "module", "import_react", "import_ui", "import_material", "import_mobx_react", "AddStructureDialog", "AddStructureDialog_default", "init_AddStructureDialog", "__esmMin", "init_launchViewUtils", "model", "file", "setFile", "pdbId", "setPdbId", "uniprotId", "setUniprotId", "choice", "setChoice", "structureURL", "setStructureURL", "error", "setError", "showAddStructureDialog", "handleClose", "handleAdd", "url", "data", "getPdbStructureUrl", "getAlphaFoldStructureUrl", "e", "canAdd", "React", "event", "target", "f", "import_react", "import_mobx_react", "HeaderStructureInfo", "HeaderStructureInfo_default", "init_HeaderStructureInfo", "__esmMin", "model", "structures", "hoverText", "structure", "React", "ProteinAlignmentHelpDialog_exports", "__export", "ProteinAlignmentHelpDialog", "Typography2", "children", "React", "handleClose", "import_react", "import_ui", "import_material", "init_ProteinAlignmentHelpDialog", "__esmMin", "ProteinAlignmentHelpButton", "model", "React", "handleClose", "ProteinAlignmentHelpDialog", "Help_default", "import_react", "import_util", "import_material", "init_ProteinAlignmentHelpButton", "__esmMin", "init_Help", "getFeatureColor", "type", "featureColors", "fetchUniProtFeatures", "url", "res", "text", "features", "line", "parts", "start", "end", "attributes", "description", "id", "attr", "key", "value", "uniqueId", "useUniProtFeatures", "uniprotId", "data", "error", "isLoading", "useSWR", "init_useUniProtFeatures", "__esmMin", "init_index", "getFeatureAlignmentRange", "feature", "structurePositionToAlignmentMap", "startAlignmentPos", "endAlignmentPos", "getFeatureGeometry", "startAlnPos", "endAlnPos", "FeatureTooltipContent", "React", "import_react", "import_material", "import_mobx_react", "FeatureBar", "FeatureBar_default", "init_FeatureBar", "__esmMin", "init_constants", "init_highlightResidueRange", "init_useUniProtFeatures", "init_proteinToGenomeMapping", "model", "isHovered", "setIsHovered", "molstarPluginContext", "selectedFeatureId", "isSelected", "handleMouseEnter", "range", "handleMouseLeave", "handleClick", "structure", "newSelected", "selectResidueRange", "e", "clickProteinToGenome", "left", "width", "color", "getFeatureColor", "SELECTED_BORDER", "HOVERED_BORDER", "import_react", "import_material", "import_mobx_react", "FeatureTypeLabel", "FeatureTypeLabel_default", "init_FeatureTypeLabel", "__esmMin", "init_constants", "type", "labelWidth", "model", "React", "e", "HIDE_BUTTON_COLOR", "import_react", "import_mobx_react", "HoverMarker", "HoverMarker_default", "init_HoverMarker", "__esmMin", "init_constants", "model", "alignmentHoverPos", "React", "HOVER_MARKER_COLOR", "getVisibleTypes", "featureTypes", "hiddenFeatureTypes", "type", "import_react", "import_mobx_react", "FeatureTypeTrackContent", "ProteinFeatureTrackLabels", "ProteinFeatureTrackContent", "init_ProteinFeatureTrack", "__esmMin", "init_constants", "init_FeatureBar", "init_FeatureTypeLabel", "init_HoverMarker", "features", "model", "sequenceLength", "React", "feature", "FeatureBar_default", "HoverMarker_default", "data", "labelWidth", "visibleTypes", "FeatureTypeLabel_default", "e", "rect", "x", "alignmentPos", "import_react", "import_material", "import_mobx_react", "ResidueValueTrack", "ResidueValueTrack_default", "init_ResidueValueTrack", "__esmMin", "init_constants", "cells", "colorFor", "formatValue", "sequenceLength", "model", "React", "e", "rect", "alignmentPos", "cell", "import_react", "import_mobx_react", "CharacterSpans", "MatchOverlays", "HoverHighlight", "RangeHighlight", "AlignmentHighlights", "SplitString", "SplitString_default", "init_SplitString", "__esmMin", "init_constants", "str", "char", "i", "React", "model", "height", "showHighlight", "alignmentMatchSet", "strLength", "alignmentHoverPos", "range", "background", "border", "start", "end", "clampedStart", "clampedEnd", "width", "e", "rect", "x", "index", "groupFeaturesByType", "features", "grouped", "feature", "useProteinFeatureTrackData", "model", "uniprotId", "isLoading", "error", "useUniProtFeatures", "pairwiseAlignment", "sequenceLength", "groupedFeatures", "init_useProteinFeatureTrackData", "__esmMin", "init_useUniProtFeatures", "GutterLabel", "label", "title", "height", "React", "import_react", "import_material", "import_mobx", "import_mobx_react", "ProteinAlignment", "ProteinAlignment_default", "init_ProteinAlignment", "__esmMin", "init_constants", "init_ProteinAlignmentHelpButton", "init_ProteinFeatureTrack", "init_ResidueValueTrack", "init_SplitString", "init_useProteinFeatureTrackData", "init_residueTracks", "model", "pairwiseAlignment", "showHighlight", "showProteinTracks", "uniprotId", "confidenceCells", "hydrophobicityCells", "containerRef", "featureData", "featureLoading", "featureError", "useProteinFeatureTrackData", "container", "a0", "a1", "con", "ProteinAlignmentHelpButton", "ProteinFeatureTrackLabels", "AlignmentHighlights", "SplitString_default", "ProteinFeatureTrackContent", "ResidueValueTrack_default", "plddtColor", "v", "hydrophobicityColor", "ToggleMenuItem", "checked", "label", "onToggle", "React", "MenuItem", "ListItemIcon", "Checkbox", "ListItemText", "getDisplayToggles", "model", "import_react", "import_ui", "import_Checkbox", "import_IconButton", "import_ListItemIcon", "import_ListItemText", "import_Menu", "import_MenuItem", "import_TextField", "import_Tooltip", "import_mobx_react", "ColorSchemeSelect", "DisplaySettingsMenu", "ProteinViewHeader", "ProteinViewHeader_default", "init_ProteinViewHeader", "__esmMin", "init_Tune", "init_AddStructureDialog", "init_HeaderStructureInfo", "init_ProteinAlignment", "init_applyColorTheme", "TextField", "event", "scheme", "COLOR_SCHEMES", "s", "anchorEl", "setAnchorEl", "Tooltip", "IconButton", "Tune_default", "Menu", "toggle", "structures", "showAlignment", "HeaderStructureInfo_default", "structure", "idx", "ProteinAlignment_default", "AddStructureDialog_default", "molstar_default", "init_molstar", "__esmMin", "useProteinView", "showControls", "model", "parentRef", "pluginRef", "error", "setError", "loading", "setLoading", "state", "GeometryExport", "MAQualityAssessment", "PluginConfig", "PluginSpec", "DefaultPluginUISpec", "createPluginUI", "renderReact18", "loadMolstar", "host", "defaultSpec", "created", "e", "plugin", "PluginCommands", "import_react", "import_mobx_state_tree", "init_useProteinView", "__esmMin", "init_loadMolstar", "ProteinView_exports", "__export", "ProteinView_default", "import_react", "import_ui", "import_mobx_react", "style", "ProteinView", "ProteinViewContainer", "init_ProteinView", "__esmMin", "init_ManualAlignmentDialog", "init_ProteinViewHeader", "init_molstar", "init_useProteinView", "molstar_default", "model", "showControls", "parentRef", "error", "loading", "useProteinView", "React", "width", "height", "structures", "ready", "s", "ProteinViewHeader_default", "delta", "ManualAlignmentDialog_default", "UniProtVariationAdapter_exports", "__export", "UniProtVariationAdapter", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_UniProtVariationAdapter", "__esmMin", "features", "scoreField", "begin", "end", "rest", "idx", "d", "_opts", "e", "query", "observer", "start", "refName", "data", "f", "index_exports", "__export", "ProteinViewer", "import_Plugin", "import_react", "import_react", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "import_mui", "useStyles", "getProteinView", "session", "v", "Highlight", "assemblyName", "start", "end", "refName", "model", "cx", "classes", "useStyles", "assemblyManager", "offsetPx", "ref", "s", "e", "width", "left", "React", "Highlight_default", "init_util", "GenomeMouseoverHighlight", "model", "session", "views", "hovered", "checkHovered", "s", "assemblyNames", "coord", "refName", "React", "Highlight_default", "GenomeMouseoverHighlight_default", "import_react", "import_util", "import_mobx_react", "init_Protein1DViewRegistry", "init_util", "init_mappings", "GenomeTo1DProteinHoverHighlight", "model", "session", "hovered", "assemblyNames", "viewId", "protein1DInfo", "protein1DViewRegistry", "checkHovered", "coord", "feature", "mapping", "genomeToTranscriptSeqMapping", "g2p", "proteinPos", "React", "Highlight_default", "GenomeTo1DProteinHoverHighlight_default", "import_react", "import_util", "import_mobx_react", "init_Protein1DViewRegistry", "init_util", "Protein1DToGenomeHoverHighlight", "model", "session", "hovered", "assemblyNames", "viewId", "checkHovered", "coord", "refName", "protein1DViewRegistry", "assemblyName", "genomeHighlight", "React", "Highlight_default", "Protein1DToGenomeHoverHighlight_default", "import_react", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "ProteinToGenomeHighlightInner", "model", "field", "session", "assemblyManager", "assemblyNames", "proteinView", "getProteinView", "assemblyName", "React", "structure", "idx", "r", "idx2", "Highlight_default", "ProteinToGenomeHighlightInner_default", "ProteinToGenomeClickHighlight", "model", "React", "ProteinToGenomeHighlightInner_default", "ProteinToGenomeHoverHighlight", "import_react", "import_util", "import_mobx", "import_mobx_react", "ungap", "seq", "findStructureRowName", "rowMap", "structureSeq", "init_util", "ProteinToMsaHoverSync", "model", "session", "views", "proteinView", "getProteinView", "connectedMsaViewId", "msaView", "f", "disposers", "structureRowName", "seq", "findStructureRowName", "stripStopCodon", "setMousePos", "structure", "seqPos", "col", "structureSeqPos", "d", "ProteinToMsaHoverSync_default", "HighlightComponents", "model", "React", "ProteinToGenomeClickHighlight", "ProteinToGenomeHoverHighlight", "Protein1DToGenomeHoverHighlight_default", "GenomeTo1DProteinHoverHighlight_default", "GenomeMouseoverHighlight_default", "ProteinToMsaHoverSync_default", "HighlightComponents_default", "AddHighlightModelF", "pluginManager", "rest", "model", "React", "HighlightComponents_default", "import_AdapterType", "import_configuration", "AlphaFoldConfidenceAdapter", "configSchema_default", "AlphaFoldConfidenceAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "import_AdapterType", "import_configuration", "AlphaMissensePathogenicityAdapter", "configSchema_default", "AlphaMissensePathogenicityAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "import_util", "init_createSvgIcon", "import_jsx_runtime", "Add_default", "_jsx", "import_react", "import_ui", "import_util", "import_material", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "import_react", "import_material", "import_react", "import_util", "import_material", "import_mui", "import_react", "import_material", "import_mui", "useStyles", "Checkbox2", "checked", "disabled", "label", "onChange", "classes", "React", "init_util", "useStyles", "MSATable", "structureName", "structureSequence", "isoformSequences", "classes", "showInFastaFormat", "setShowInFastaFormat", "removedStars", "key", "val", "stripStopCodon", "exactMatchIsoformAndStructureSeq", "_", "sname", "maxKeyLen", "getTranscriptDisplayName", "React", "Checkbox2", "event", "feature", "seq", "k", "f", "IsoformSequencesToggle", "structureSequence", "structureName", "isoformSequences", "show", "setShow", "React", "MSATable", "import_react", "init_createSvgIcon", "import_jsx_runtime", "OpenInNew_default", "_jsx", "import_material", "ExternalLink", "props", "children", "rest", "React", "OpenInNew_default", "init_util", "NotFound", "uniprotId", "React", "ExternalLink", "AlphaFoldDBSearchStatus", "selectedTranscript", "structureSequence", "isoformSequences", "url", "IsoformSequencesToggle", "getTranscriptDisplayName", "import_react", "import_material", "init_util", "getIdLabel", "id", "dbType", "getDatabaseTypeForId", "IdentifierSelector", "recognizedIds", "geneName", "selectedId", "onSelectedIdChange", "expanded", "setExpanded", "options", "React", "e", "opt", "import_react", "import_ui", "init_createSvgIcon", "import_jsx_runtime", "ArrowDropDown_default", "_jsx", "import_material", "import_react", "import_material", "LaunchOptionsDialog", "open", "onClose", "options", "React", "opt", "import_react", "import_material", "import_react", "init_createSvgIcon", "import_jsx_runtime", "Settings_default", "_jsx", "import_material", "init_esm", "ALIGNMENT_ALGORITHMS", "DEFAULT_ALIGNMENT_ALGORITHM", "ALIGNMENT_ALGORITHM_VALUES", "coerceAlignmentAlgorithm", "value", "v", "ALIGNMENT_ALGORITHM_LABELS", "AlignmentSettingsButton", "value", "onChange", "onManualAlignment", "open", "setOpen", "tabValue", "setTabValue", "tempAlgorithm", "setTempAlgorithm", "manualAlignment", "setManualAlignment", "parseError", "setParseError", "handleOpen", "handleSave", "parsed", "parsePairwise", "e", "handleCancel", "React", "Settings_default", "_", "val", "event", "ALIGNMENT_ALGORITHMS", "SequenceMismatchNotice", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "React", "ALIGNMENT_ALGORITHM_LABELS", "AlignmentSettingsButton", "safeLaunch", "fn", "onSuccess", "onError", "e", "getLaunchMissingReasons", "uniprotId", "userSelectedProteinSequence", "selectedTranscript", "isLoading", "error", "s", "init_launchViewUtils", "ProteinViewActions", "handleClose", "uniprotId", "userSelectedProteinSequence", "selectedTranscript", "url", "confidenceUrl", "feature", "view", "session", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "sequencesMatch", "isLoading", "error", "dialogOpen", "setDialogOpen", "launchError", "setLaunchError", "canLaunch", "missingReasons", "getLaunchMissingReasons", "closeMenu", "baseParams", "launch3DParams", "runLaunch", "fn", "safeLaunch", "handleLaunch3DView", "launch3DProteinView", "handleLaunch1DView", "launch1DProteinView", "handleLaunchMsa", "launchMsaView", "handleLaunch3DWithMsa", "launch3DProteinViewWithMsa", "launchOptions", "hasMsaViewPlugin", "React", "SequenceMismatchNotice", "ArrowDropDown_default", "LaunchOptionsDialog", "import_react", "import_material", "SequenceSearchStatus", "isLoading", "uniprotId", "url", "hasProteinSequence", "sequenceSearchType", "React", "import_react", "import_material", "init_util", "TranscriptSelector", "val", "setVal", "isoforms", "isoformSequences", "structureSequence", "feature", "disabled", "geneName", "getGeneDisplayName", "matches", "nonMatches", "noData", "f", "entry", "stripStopCodon", "byLengthDesc", "a", "b", "React", "event", "getTranscriptDisplayName", "import_react", "import_material", "UniProtIdInput", "lookupMode", "onLookupModeChange", "manualUniprotId", "onManualUniprotIdChange", "featureUniprotId", "hasProteinSequence", "sequenceSearchType", "onSequenceSearchTypeChange", "endContent", "React", "event", "e", "ExternalLink", "import_react", "import_material", "import_mui", "useStyles", "UniProtResultsTable", "entries", "selectedAccession", "onSelect", "classes", "cx", "React", "entry", "ExternalLink", "import_react", "init_index", "STATIC_SWR_OPTIONS", "applyStructurePreset", "plugin", "trajectory", "options", "model", "addStructureFromData", "data", "format", "options", "plugin", "_data", "trajectory", "applyStructurePreset", "addStructureFromURL", "url", "format", "isBinary", "options", "plugin", "data", "trajectory", "applyStructurePreset", "extractStructureSequences", "model", "s", "init_loadMolstar", "withTemporaryMolstarPlugin", "callback", "createPluginUI", "renderReact18", "loadMolstar", "ret", "plugin", "detectStructureFormat", "fileName", "dot", "ext", "fetchSequences", "file", "url", "withTemporaryMolstarPlugin", "plugin", "model", "addStructureFromData", "addStructureFromURL", "extractStructureSequences", "useStructureFileSequence", "key", "data", "error", "isLoading", "isValidating", "useSWR", "seq", "STATIC_SWR_OPTIONS", "init_launchViewUtils", "useAlphaFoldData", "uniprotId", "url", "getAlphaFoldStructureUrl", "confidenceUrl", "getAlphaFoldConfidenceUrl", "sequences", "isLoading", "isValidating", "error", "useStructureFileSequence", "import_react", "init_index", "myfetch", "url", "args", "response", "jsonfetch", "abortError", "signal", "timeout", "time", "resolve", "reject", "id", "safeAdd", "x", "y", "lsw", "bitRotateLeft", "num", "cnt", "md5cmn", "q", "a", "b", "s", "t", "md5ff", "c", "d", "md5gg", "md5hh", "md5ii", "binlMd5", "len", "i", "olda", "oldb", "oldc", "oldd", "binl2hex", "binarray", "hexTab", "str", "str2binl", "bin", "md5", "init_util", "useAlphaFoldSequenceSearch", "sequence", "searchType", "enabled", "searchValue", "cleanSeq", "stripStopCodon", "md5", "data", "error", "isLoading", "isValidating", "useSWR", "jsonfetch", "STATIC_SWR_OPTIONS", "import_react", "useDebouncedValue", "value", "delayMs", "debounced", "setDebounced", "t", "import_util", "init_index", "import_configuration", "import_util", "stitch", "subfeats", "sequence", "sub", "calculateProteinSequence", "cds", "codonTable", "str", "protein", "revlist", "list", "seqlen", "a", "b", "getItemId", "feat", "dedupe", "item", "pos", "ary", "getProteinSequence", "feature", "seq", "featureStart", "strand", "subfeatures", "f", "fetchProteinSeq", "session", "assemblyName", "start", "end", "refName", "assemblyManager", "rpcManager", "assembly", "sessionId", "feats", "init_util", "useIsoformProteinSequences", "feature", "view", "data", "error", "isLoading", "useSWR", "transcripts", "getTranscriptFeatures", "errors", "entries", "f", "seq", "fetchProteinSeq", "e", "r", "STATIC_SWR_OPTIONS", "import_react", "init_util", "useTranscriptSelection", "options", "isoformSequences", "structureSequence", "resetKey", "userSelection", "setUserSelection", "prevResetKey", "setPrevResetKey", "autoSelection", "selectBestTranscript", "init_util", "useTranscriptIsoformSelection", "feature", "view", "structureSequence", "resetKey", "transcripts", "getTranscriptFeatures", "isoformSequences", "isLoading", "error", "useIsoformProteinSequences", "userSelection", "setUserSelection", "useTranscriptSelection", "selectedTranscript", "f", "getId", "selectedIsoform", "init_index", "init_util", "UNIPROT_FIELDS", "mapApiResultToEntry", "result", "buildXrefQuery", "id", "getDatabaseTypeForId", "searchUniProt", "query", "size", "url", "jsonfetch", "searchByXref", "e", "deduplicateEntries", "entries", "seen", "entry", "searchUniProtEntries", "recognizedIds", "geneId", "geneName", "organismId", "idsToSearch", "strippedGeneId", "stripTrailingVersion", "isRecognizedDatabaseId", "xrefResults", "r", "xrefErrors", "geneNameError", "geneNameResults", "attempted", "failed", "a", "b", "init_util", "useUniProtSearch", "recognizedIds", "geneId", "geneName", "selectedQueryId", "enabled", "idsToSearch", "geneNameToSearch", "isRecognizedDatabaseId", "hasValidId", "id", "data", "error", "isLoading", "useSWR", "searchUniProtEntries", "STATIC_SWR_OPTIONS", "getSearchDescription", "selectedQueryId", "recognizedIds", "geneName", "joinWord", "init_util", "useAlphaFoldDBSearch", "feature", "view", "lookupMode", "setLookupMode", "manualUniprotId", "setManualUniprotId", "geneIds", "extractFeatureIdentifiers", "selectedQueryId", "setSelectedQueryId", "sequenceSearchType", "setSequenceSearchType", "selectedUniprotId", "setSelectedUniprotId", "featureUniprotId", "effectiveLookupMode", "isSequenceMode", "isAutoMode", "uniprotEntries", "isLookupLoading", "lookupError", "useUniProtSearch", "debouncedManualUniprotId", "useDebouncedValue", "autoUniprotId", "uniprotId", "isAlphaFoldLoading", "isAlphaFoldValidating", "alphaFoldError", "alphaFoldUrl", "alphaFoldConfidenceUrl", "alphaFoldStructureSequence", "useAlphaFoldData", "transcriptOptions", "isoformSequences", "isIsoformLoading", "isoformError", "effectiveTranscriptId", "setUserSelection", "selectedTranscript", "userSelectedProteinSequence", "useTranscriptIsoformSelection", "seqSearchUniprotId", "seqSearchUrl", "seqSearchConfidenceUrl", "seqSearchStructureSequence", "isSequenceSearchLoading", "isSequenceSearchValidating", "sequenceSearchError", "useAlphaFoldSequenceSearch", "finalUrl", "finalConfidenceUrl", "finalStructureSequence", "finalUniprotId", "isStructureValidating", "loadingStatuses", "s", "isLoading", "error", "stripStopCodon", "getSearchDescription", "useStyles", "AlphaFoldDBSearch", "feature", "session", "view", "handleClose", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "classes", "state", "useAlphaFoldDBSearch", "React", "UniProtIdInput", "IdentifierSelector", "status", "UniProtResultsTable", "ExternalLink", "TranscriptSelector", "SequenceSearchStatus", "AlphaFoldDBSearchStatus", "ProteinViewActions", "AlphaFoldDBSearch_default", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "import_mui", "FOLDSEEK_DATABASES", "DEFAULT_DATABASES", "predict3Di", "aaSequence", "signal", "cleanSequence", "line", "response", "cleanDi3", "submitFoldseekSearch", "di3Sequence", "databases", "fastaContent", "params", "db", "text", "pollFoldseekStatus", "ticketId", "result", "getFoldseekResults", "jsonfetch", "waitForFoldseekResults", "onStatusChange", "attempts", "status", "apiResponse", "r", "timeout", "useStyles", "FoldseekDatabaseSelector", "selected", "onChange", "disabled", "classes", "React", "FOLDSEEK_DATABASES", "db", "id", "import_react", "import_material", "import_mui", "import_react", "import_ui", "import_material", "AA_3LETTER", "padLeft", "str", "len", "padRight", "formatCoord", "val", "caCoordsToPdb", "tCa", "tSeq", "chainId", "title", "coords", "lines", "atomNum", "resNum", "i", "x", "y", "z", "aa", "resName", "line", "hasValidCaCoords", "init_launchViewUtils", "FoldseekActionMenu", "hit", "session", "view", "feature", "selectedTranscript", "userProvidedTranscriptSequence", "onClose", "anchorEl", "setAnchorEl", "launchError", "setLaunchError", "open", "uniprotId", "getUniprotIdFromAlphaFoldTarget", "handleClick", "event", "handleMenuClose", "baseParams", "runLaunch", "fn", "safeLaunch", "handleLaunch3D", "pdbData", "hasValidCaCoords", "caCoordsToPdb", "launch3DProteinView", "handleLaunch1D", "launch1DProteinView", "getConfidenceUrlFromTarget", "handleLaunchMSA", "launchMsaView", "React", "hasMsaViewPlugin", "init_launchViewUtils", "useStyles", "flattenResults", "results", "hits", "dbResult", "alignment", "getStructureUrlFromTarget", "a", "b", "FoldseekResultsTable", "session", "view", "feature", "selectedTranscript", "userProvidedTranscriptSequence", "onClose", "classes", "flatHits", "React", "hit", "idx", "FoldseekActionMenu", "import_react", "useFoldseekSearch", "results", "setResults", "predictData", "setPredictData", "isLoading", "setIsLoading", "isPredicting", "setIsPredicting", "error", "setError", "statusMessage", "setStatusMessage", "abortRef", "startOperation", "controller", "predictStructure", "aaSequence", "signal", "result", "predict3Di", "e", "search", "aaSeq", "di3Seq", "databases", "DEFAULT_DATABASES", "ticket", "submitFoldseekSearch", "waitForFoldseekResults", "reset", "init_util", "useStyles", "FoldseekSearch", "feature", "session", "view", "handleClose", "classes", "userEditedSequence", "setUserEditedSequence", "selectedDatabases", "setSelectedDatabases", "DEFAULT_DATABASES", "results", "cleanedAaSequence", "di3Sequence", "isLoading", "isPredicting", "error", "statusMessage", "predictStructure", "search", "reset", "useFoldseekSearch", "transcripts", "isoformSequences", "isLoadingIsoforms", "isoformError", "effectiveSelectedTranscriptId", "setUserSelection", "selectedTranscript", "selectedIsoformData", "useTranscriptIsoformSelection", "cleanedSequence", "stripStopCodon", "sequence", "setUserSelectionWithReset", "id", "canPredict", "canSearch", "combinedError", "isBusy", "React", "TranscriptSelector", "e", "FoldseekDatabaseSelector", "FoldseekResultsTable", "FoldseekSearch_default", "import_react", "init_Help", "import_material", "HelpDialog", "HelpButton", "show", "setShow", "React", "Help_default", "import_react", "TabPanel", "children", "value", "index", "other", "React", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "init_launchViewUtils", "StructureSourcePicker", "choice", "setChoice", "structureURL", "setStructureURL", "setFile", "pdbId", "setPdbId", "React", "HelpButton", "event", "target", "f", "s", "getPdbStructureUrl", "init_launchViewUtils", "init_util", "useStyles", "theme", "HelpText", "React", "ExternalLink", "UserProvidedStructure", "feature", "session", "view", "handleClose", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "classes", "file", "setFile", "pdbId", "setPdbId", "choice", "setChoice", "submitError", "setSubmitError", "structureURL", "setStructureURL", "activeFile", "activeURL", "structureSequences", "fileError", "useStructureFileSequence", "structureName", "structureSequence", "options", "isoformSequences", "userSelection", "setUserSelection", "selectedTranscript", "protein", "isoformError", "useTranscriptIsoformSelection", "error", "canLaunch", "sequencesDiffer", "stripStopCodon", "handleLaunch", "structureData", "launch3DProteinView", "getGeneDisplayName", "getTranscriptDisplayName", "e", "StructureSourcePicker", "TranscriptSelector", "IsoformSequencesToggle", "SequenceMismatchNotice", "UserProvidedStructure_default", "import_react", "useLocalStorage", "key", "defaultValue", "value", "setValue", "stored", "setValueAndStore", "newValue", "LaunchProteinViewDialog", "handleClose", "feature", "model", "choice", "setChoice", "alignmentAlgorithm", "setAlignmentAlgorithm", "useLocalStorage", "DEFAULT_ALIGNMENT_ALGORITHM", "session", "view", "React", "HelpButton", "_", "val", "TabPanel", "AlphaFoldDBSearch_default", "FoldseekSearch_default", "UserProvidedStructure_default", "isDisplay", "elt", "extendStateModel", "stateModel", "self", "superContextMenuItems", "feature", "showProteinMenuItem", "Add_default", "track", "handleClose", "LaunchProteinViewDialog", "LaunchProteinViewF", "pluginManager", "import_configuration", "import_util", "init_launchViewUtils", "init_util", "getTrackId", "track", "trackId", "transcriptMatches", "transcript", "transcriptId", "target", "stripTrailingVersion", "candidate", "resolveShortLaunch", "session", "uniprotId", "connectedView", "assemblyName", "loc", "trackSpecs", "assembly", "parsed", "refName", "region", "trackIds", "t", "tracksById", "sessionId", "transcripts", "trackConf", "feats", "feat", "getTranscriptFeatures", "f", "sub", "userProvidedTranscriptSequence", "fetchProteinSeq", "getAlphaFoldStructureUrl", "LaunchProteinViewExtensionPointF", "pluginManager", "session", "url", "uniprotId", "transcriptId", "userProvidedTranscriptSequence", "feature", "connectedViewId", "connectedView", "alignmentAlgorithm", "displayName", "height", "showControls", "showHighlight", "zoomToBaseLevel", "resolved", "resolveShortLaunch", "e", "finalUrl", "resolvedConnectedViewId", "import_react", "import_pluggableElementTypes", "import_pluggableElementTypes", "import_mst", "import_mobx_state_tree", "init_createSvgIcon", "import_jsx_runtime", "Visibility_default", "_jsx", "import_mobx", "init_applyColorTheme", "extractPerResidueConfidence", "model", "maxLength", "data", "B_iso_or_equiv", "offsets", "count", "n", "values", "i", "looksLikePlddt", "v", "loadStructureData", "structure", "plugin", "model", "addStructureFromData", "addStructureFromURL", "sequences", "extractStructureSequences", "confidence", "extractPerResidueConfidence", "import_mobx_state_tree", "makeStructureLoader", "host", "loadingStructures", "loadInto", "structure", "plugin", "loadStructureData", "data", "current", "e", "structures", "molstarPluginContext", "import_util", "import_mobx_state_tree", "import_mobx", "init_applyLociInteractivity", "init_constants", "init_mappings", "init_util", "structurePos", "n", "alignmentCol", "n", "makeCoordinateMapper", "pairwiseAlignment", "structureSeqToTranscriptSeqPosition", "transcriptSeqToStructureSeqPosition", "structureSeqVsTranscriptSeqMap", "s2aln", "structurePositionToAlignmentMap", "t2aln", "transcriptPositionToAlignmentMap", "aln2s", "invertMap", "aln2t", "p", "c", "init_highlightResidueRange", "AMINO_ACIDS", "BLOSUM62_RAW", "BLOSUM62", "i", "row", "j", "getScore", "a", "b", "GAP_OPEN", "GAP_EXTEND", "needlemanWunsch", "seq1", "seq2", "gapOpen", "gapExtend", "m", "n", "M", "Ix", "Iy", "matchScore", "alignedSeq1", "alignedSeq2", "finalScores", "score", "currentMatrix", "prevM", "prevIx", "smithWaterman", "bestScore", "bestI", "bestJ", "cellMax", "k", "buildConsensus", "chars", "runLocalAlignment", "algorithm", "proteinAbbreviationMapping", "r", "init_proteinToGenomeMapping", "init_residueTracks", "init_loadMolstar", "extractLocationInfo", "molstar", "location", "subscribeMolstarInteraction", "plugin", "kind", "onUpdate", "loadMolstar", "subscription", "e", "loc", "init_util", "init_launchViewUtils", "init_mappings", "Structure", "self", "data", "type", "newSet", "val", "views", "f", "range", "uniqueId", "arg", "structureSeqPos", "r", "url", "getUniprotIdFromAlphaFoldTarget", "makeCoordinateMapper", "c", "looksLikePlddt", "mapResidueValuesToColumns", "seq", "kyteDoolittleScores", "stripStopCodon", "structureLetter", "genomeLetter", "parts", "genomeToTranscriptSeqMapping", "pos", "structurePos", "alignmentHoverRange", "a2s", "start", "end", "s2a", "assemblyName", "mapping", "model", "mapped", "proteinRangeToGenomeMapping", "proteinToGenomeMapping", "code", "proteinAbbreviationMapping", "transcriptPos", "con", "matchSet", "i", "r1", "r2", "coerceAlignmentAlgorithm", "idx", "e", "alignmentPos", "alignmentCol", "clickProteinToGenome", "userProvidedTranscriptSequence", "structureSequences", "exactMatch", "alignmentAlgorithm", "seq1", "seq2", "pairwiseAlignment", "runLocalAlignment", "hovered", "transcriptSeqToStructureSeqPosition", "connectedView", "checkHovered", "hoverPosition", "c0", "molstarPluginContext", "dispose", "subscribeMolstarInteraction", "info", "showHighlight", "structureSeqToTranscriptSeqPosition", "molstarStructure", "residues", "coord", "applyLociInteractivityMultiple", "hoverStructureRange", "structureSeqHoverPos", "highlightResidueRange", "applyLociInteractivitySingle", "structureModel_default", "init_loadMolstar", "SuperpositionTag", "superposeStructures", "plugin", "QueryContext", "StructureElement", "StructureSelection", "StructureSelectionQueries", "PluginCommands", "PluginStateObject", "tmAlign", "loadMolstar", "structures", "query", "validLocis", "s", "structure", "parent", "rootStructure", "q", "loci", "l", "coordinateSystem", "i", "result", "bTransform", "tmScoreA", "tmScoreB", "rmsd", "alignedLength", "applyTransform", "res", "matrix", "Mat4", "StateObjectRef", "StateTransforms", "r", "o", "params", "b", "SETTINGS_KEY", "PERSISTED_SETTINGS", "stateModelFactory", "structureModel_default", "COLOR_SCHEME_VALUES", "DEFAULT_ALIGNMENT_ALGORITHM", "self", "n", "f", "arg", "e", "algorithm", "scheme", "p", "structure", "val", "id", "molstarPluginContext", "newStructure", "loadStructureData", "superposeStructures", "stored", "settings", "key", "init", "structures", "showControls", "showAlignment", "colorScheme", "readyCount", "s", "applyColorTheme", "makeStructureLoader", "Visibility_default", "COLOR_SCHEMES", "Settings_default", "model_default", "ReactComponent", "ProteinViewF", "pluginManager", "model_default", "import_AdapterType", "import_configuration", "UniProtVariationAdapter", "configSchema_default", "UniProtVariationAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "version", "ProteinViewer", "Plugin", "version", "pluginManager", "ProteinViewF", "LaunchProteinViewF", "LaunchProteinViewExtensionPointF", "AddHighlightModelF", "AlphaFoldConfidenceAdapterF", "AlphaMissensePathogenicityAdapterF", "UniProtVariationAdapterF", "_pluginManager"]
|
|
3
|
+
"sources": ["global-externals:@jbrowse/core/Plugin", "global-externals:react", "global-externals:mobx-react", "global-externals:@jbrowse/core/util", "global-externals:tss-react/mui", "../src/ProteinView/loadMolstar.ts", "../src/ProteinView/util.ts", "../node_modules/.pnpm/g2p_mapper@2.1.5/node_modules/g2p_mapper/src/index.ts", "global-externals:mobx", "../src/mappings.ts", "../src/Protein1DViewRegistry/index.ts", "../src/LaunchProteinView/utils/util.ts", "global-externals:@jbrowse/core/pluggableElementTypes/AdapterType", "global-externals:@jbrowse/core/configuration", "global-externals:@jbrowse/core/data_adapters/BaseAdapter", "global-externals:@jbrowse/core/util/io", "global-externals:@jbrowse/core/util/rxjs", "../src/AlphaFoldConfidenceAdapter/AlphaFoldConfidenceAdapter.ts", "../src/AlphaMissensePathogenicityAdapter/AlphaMissensePathogenicityAdapter.ts", "global-externals:@mui/material/utils", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/utils/createSvgIcon.js", "global-externals:react/jsx-runtime", "global-externals:@jbrowse/core/ui", "global-externals:@mui/material", "../src/LaunchProteinView/utils/sideBySide.ts", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/util.ts", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/pairwise.ts", "../node_modules/.pnpm/clustal-js@2.0.15/node_modules/clustal-js/src/index.ts", "../src/LaunchProteinView/components/proteinAssemblySetup.ts", "../src/LaunchProteinView/components/proteinTrackSetup.ts", "../src/LaunchProteinView/components/launchProteinAnnotationView.ts", "../src/LaunchProteinView/utils/launchViewUtils.ts", "../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.7/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js", "../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.7/node_modules/use-sync-external-store/shim/index.js", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/events.mjs", "../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/config-context-12s-CCVTDPOP.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/constants.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/types.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/_internal/index.mjs", "../node_modules/.pnpm/swr@2.4.1_react@19.2.7/node_modules/swr/dist/index/index.mjs", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Help.js", "../src/LaunchProteinView/components/HelpDialog.tsx", "global-externals:@jbrowse/core/pluggableElementTypes", "global-externals:@jbrowse/core/util/types/mst", "global-externals:@jbrowse/mobx-state-tree", "../src/ProteinView/applyColorTheme.ts", "../src/ProteinView/applyLociInteractivity.ts", "../src/ProteinView/constants.ts", "../src/ProteinView/highlightResidueRange.ts", "../src/ProteinView/proteinToGenomeMapping.ts", "../src/ProteinView/residueTracks.ts", "../src/ProteinView/components/ManualAlignmentDialog.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Tune.js", "global-externals:@mui/material/Checkbox", "global-externals:@mui/material/IconButton", "global-externals:@mui/material/ListItemIcon", "global-externals:@mui/material/ListItemText", "global-externals:@mui/material/Menu", "global-externals:@mui/material/MenuItem", "global-externals:@mui/material/TextField", "global-externals:@mui/material/Tooltip", "../src/ProteinView/components/AddStructureDialog.tsx", "../src/ProteinView/components/HeaderStructureInfo.tsx", "../src/ProteinView/components/ProteinAlignmentHelpDialog.tsx", "../src/ProteinView/components/ProteinAlignmentHelpButton.tsx", "../src/ProteinView/hooks/useUniProtFeatures.ts", "../src/ProteinView/components/FeatureBar.tsx", "../src/ProteinView/components/FeatureTypeLabel.tsx", "../src/ProteinView/components/HoverMarker.tsx", "../src/ProteinView/components/ProteinFeatureTrack.tsx", "../src/ProteinView/components/ResidueValueTrack.tsx", "../src/ProteinView/components/SplitString.tsx", "../src/ProteinView/hooks/useProteinFeatureTrackData.ts", "../src/ProteinView/components/ProteinAlignment.tsx", "../src/ProteinView/components/ProteinViewHeader.tsx", "../src/ProteinView/css/molstar.ts", "../src/ProteinView/useProteinView.ts", "../src/ProteinView/components/ProteinView.tsx", "../src/UniProtVariationAdapter/UniProtVariationAdapter.ts", "../src/index.ts", "../src/AddHighlightModel/index.tsx", "../src/AddHighlightModel/HighlightComponents.tsx", "../src/AddHighlightModel/GenomeMouseoverHighlight.tsx", "../src/AddHighlightModel/Highlight.tsx", "../src/AddHighlightModel/util.ts", "../src/AddHighlightModel/GenomeTo1DProteinHoverHighlight.tsx", "../src/AddHighlightModel/Protein1DToGenomeHoverHighlight.tsx", "../src/AddHighlightModel/ProteinToGenomeHighlight.tsx", "../src/AddHighlightModel/ProteinToGenomeHighlightInner.tsx", "../src/AddHighlightModel/ProteinToMsaHoverSync.tsx", "../src/AddHighlightModel/msaRowMatch.ts", "../src/AlphaFoldConfidenceAdapter/index.ts", "../src/AlphaFoldConfidenceAdapter/configSchema.ts", "../src/AlphaMissensePathogenicityAdapter/index.ts", "../src/AlphaMissensePathogenicityAdapter/configSchema.ts", "../src/LaunchProteinView/index.ts", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Add.js", "../src/LaunchProteinView/components/LaunchProteinViewDialog.tsx", "../src/LaunchProteinView/components/AlphaFoldDBSearch.tsx", "../src/LaunchProteinView/components/AlphaFoldDBSearchStatus.tsx", "../src/LaunchProteinView/components/IsoformSequencesToggle.tsx", "../src/LaunchProteinView/components/MSATable.tsx", "../src/LaunchProteinView/components/Checkbox2.tsx", "../src/components/ExternalLink.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/OpenInNew.js", "../src/LaunchProteinView/components/IdentifierSelector.tsx", "../src/LaunchProteinView/components/ProteinViewActions.tsx", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/ArrowDropDown.js", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Settings.js", "../src/LaunchProteinView/components/LaunchOptionsDialog.tsx", "../src/LaunchProteinView/components/LaunchSettingsDialog.tsx", "../src/LaunchProteinView/components/SequenceMismatchNotice.tsx", "../src/LaunchProteinView/components/AlignmentSettingsButton.tsx", "../src/ProteinView/types.ts", "../src/LaunchProteinView/utils/launchHelpers.ts", "../src/LaunchProteinView/components/SequenceSearchStatus.tsx", "../src/LaunchProteinView/components/TranscriptSelector.tsx", "../src/LaunchProteinView/components/UniProtIdInput.tsx", "../src/LaunchProteinView/components/UniProtResultsTable.tsx", "../src/LaunchProteinView/hooks/useAlphaFoldDBSearch.ts", "../src/LaunchProteinView/hooks/useStructureFileSequence.ts", "../src/LaunchProteinView/hooks/swrOptions.ts", "../src/ProteinView/structurePipeline.ts", "../src/ProteinView/addStructureFromData.ts", "../src/ProteinView/addStructureFromURL.ts", "../src/ProteinView/extractStructureSequences.ts", "../src/ProteinView/withTemporaryMolstarPlugin.ts", "../src/LaunchProteinView/hooks/useAlphaFoldData.ts", "../src/LaunchProteinView/hooks/useAlphaFoldSequenceSearch.ts", "../src/fetchUtils.ts", "../src/LaunchProteinView/utils/md5.ts", "../src/LaunchProteinView/hooks/useDebouncedValue.ts", "../src/LaunchProteinView/hooks/useIsoformProteinSequences.ts", "../src/LaunchProteinView/utils/calculateProteinSequence.ts", "../src/LaunchProteinView/hooks/useTranscriptSelection.ts", "../src/LaunchProteinView/hooks/useTranscriptIsoformSelection.ts", "../src/LaunchProteinView/hooks/useUniProtSearch.ts", "../src/LaunchProteinView/services/lookupMethods.ts", "../src/LaunchProteinView/utils/getSearchDescription.ts", "../src/LaunchProteinView/components/FoldseekSearch.tsx", "../src/LaunchProteinView/components/FoldseekDatabaseSelector.tsx", "../src/LaunchProteinView/services/foldseekApi.ts", "../src/LaunchProteinView/components/FoldseekResultsTable.tsx", "../src/LaunchProteinView/components/FoldseekActionMenu.tsx", "../src/LaunchProteinView/utils/caCoordsToPdb.ts", "../src/LaunchProteinView/hooks/useFoldseekSearch.ts", "../src/LaunchProteinView/components/HelpButton.tsx", "../src/LaunchProteinView/components/TabPanel.tsx", "../src/LaunchProteinView/components/UserProvidedStructure.tsx", "../src/LaunchProteinView/components/StructureSourcePicker.tsx", "../src/LaunchProteinView/hooks/useLocalStorage.ts", "../src/LaunchProteinViewExtensionPoint/resolveShortLaunch.ts", "../src/LaunchProteinViewExtensionPoint/index.ts", "../src/ProteinView/index.ts", "../src/ProteinView/model.ts", "../node_modules/.pnpm/@mui+icons-material@7.3.11_@mui+material@7.3.11_@emotion+react@11.14.0_@types+react@19._7241bd1f716df2da09c230a555adab24/node_modules/@mui/icons-material/esm/Visibility.js", "../src/ProteinView/extractPerResidueConfidence.ts", "../src/ProteinView/loadStructureData.ts", "../src/ProteinView/structureLoader.ts", "../src/ProteinView/structureModel.ts", "../src/ProteinView/coordinates.ts", "../src/ProteinView/pairwiseAlignment.ts", "../src/ProteinView/proteinAbbreviationMapping.ts", "../src/ProteinView/subscribeMolstarInteraction.ts", "../src/ProteinView/superposeStructures.ts", "../src/UniProtVariationAdapter/index.ts", "../src/UniProtVariationAdapter/configSchema.ts", "../src/version.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/Plugin\"];", "module.exports = JBrowseExports[\"react\"];", "module.exports = JBrowseExports[\"mobx-react\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util\"];", "module.exports = JBrowseExports[\"tss-react/mui\"];", "\n var src = typeof document !== 'undefined'\n ? document.currentScript?.src\n : undefined;\n var base = src ? src.replace(/\\/[^/]*$/, '/') : '';\n var cached;\n export default function loadMolstar() {\n if (!cached) {\n cached = import(base + 'molstar-chunk.js').catch(function(e) {\n cached = undefined;\n throw e;\n });\n }\n return cached;\n }\n ", "import loadMolstar from './loadMolstar'\n\nimport type { Structure } from 'molstar/lib/mol-model/structure'\n\ninterface HoveredState {\n hoverPosition: {\n coord: number\n refName: string\n }\n}\n\nexport function checkHovered(hovered: unknown): hovered is HoveredState {\n return (\n !!hovered &&\n typeof hovered === 'object' &&\n 'hoverPosition' in hovered &&\n !!hovered.hoverPosition &&\n typeof hovered.hoverPosition === 'object' &&\n 'coord' in hovered.hoverPosition &&\n 'refName' in hovered.hoverPosition\n )\n}\n\nexport async function getMolstarStructureSelection({\n structure,\n selectedResidue,\n}: {\n structure: Structure\n selectedResidue: number\n}) {\n const { Script } = await loadMolstar()\n return Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.rel.eq([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n selectedResidue,\n ]),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n}\n\nexport function invertMap(arg: Record<number, number>): Record<number, number> {\n return Object.fromEntries(Object.entries(arg).map(([a, b]) => [b, +a]))\n}\n", "export interface Feat {\n refName: string\n start: number\n end: number\n type?: string\n strand?: number\n phase?: number\n subfeatures?: Feat[]\n}\n\nexport function genomeToTranscriptSeqMapping(feature: Feat) {\n const strand = feature.strand\n const refName = feature.refName\n\n if (strand !== -1 && strand !== 1) {\n throw new Error(`Invalid strand value: ${strand}. Expected 1 or -1.`)\n }\n if (!refName) {\n throw new Error('refName is required')\n }\n\n // GFF3 files can repeat CDS rows; dedupe on start/end, keeping the first.\n const uniqueCds = new Map<string, Feat>()\n for (const f of feature.subfeatures ?? []) {\n if (f.type === 'CDS' && f.start < f.end) {\n const key = `${f.start}-${f.end}`\n if (!uniqueCds.has(key)) {\n uniqueCds.set(key, f)\n }\n }\n }\n const cds = [...uniqueCds.values()].sort(\n (a, b) => strand * (a.start - b.start),\n )\n\n const g2p: Record<number, number> = {}\n const p2g: Record<number, number> = {}\n const p2gCodon: Record<number, number[]> = {}\n\n if (cds.length !== 0) {\n // Phase: number of bases at the start of the first CDS that complete a\n // codon begun outside this transcript. Per-segment phase is assumed\n // consistent with running the counter through all bases.\n const firstPhase = cds[0]?.phase ?? 0\n let proteinCounter = (3 - firstPhase) % 3\n let lastProteinPos = -1\n\n for (const f of cds) {\n const length = f.end - f.start\n for (let i = 0; i < length; i++) {\n const genomePos = strand === 1 ? f.start + i : f.end - 1 - i\n const proteinPos = Math.floor(proteinCounter++ / 3)\n g2p[genomePos] = proteinPos\n if (proteinPos !== lastProteinPos) {\n p2g[proteinPos] = genomePos\n p2gCodon[proteinPos] = [genomePos]\n lastProteinPos = proteinPos\n } else {\n p2gCodon[proteinPos]!.push(genomePos)\n }\n }\n }\n }\n\n return { g2p, p2g, p2gCodon, refName, strand }\n}\n\n/**\n * Genomic range [start, end) covering the codon at `proteinPos`.\n * On the reverse strand p2g stores the highest coordinate of the codon, so\n * the range extends from genomePos-2 to genomePos+1.\n *\n * Caveat: assumes the codon's three bases are contiguous in genome\n * coordinates. Codons that span an exon boundary, or split codons at the\n * start of a CDS (phase != 0), will produce a range that includes intronic\n * or out-of-CDS positions. Use `getCodonRanges` with `p2gCodon` to handle\n * those cases correctly.\n */\nexport function getCodonRange(\n p2g: Record<number, number>,\n proteinPos: number,\n strand: number,\n) {\n const genomePos = p2g[proteinPos]\n if (genomePos !== undefined) {\n if (strand === 1) {\n return [genomePos, genomePos + 3] as const\n } else {\n return [genomePos - 2, genomePos + 1] as const\n }\n }\n return undefined\n}\n\n/**\n * One or more genomic [start, end) ranges covering the codon at `proteinPos`,\n * derived from the full set of genomic positions in `p2gCodon`. Returns\n * multiple ranges when the codon spans an exon boundary. Ranges are sorted\n * ascending and use 0-based half-open coordinates regardless of strand.\n * Returns undefined if `proteinPos` is unknown.\n */\nexport function getCodonRanges(\n p2gCodon: Record<number, number[]>,\n proteinPos: number,\n) {\n const positions = p2gCodon[proteinPos]\n if (positions === undefined) {\n return undefined\n }\n const sorted = [...positions].sort((a, b) => a - b)\n const ranges: [number, number][] = []\n for (const pos of sorted) {\n const last = ranges.at(-1)\n if (last?.[1] === pos) {\n last[1] = pos + 1\n } else {\n ranges.push([pos, pos + 1])\n }\n }\n return ranges\n}\n", "module.exports = JBrowseExports[\"mobx\"];", "import { genomeToTranscriptSeqMapping as g2p } from 'g2p_mapper'\n\nimport type { Feature } from '@jbrowse/core/util'\nexport interface AlignmentRow {\n id: string\n seq: string\n}\nexport interface PairwiseAlignment {\n consensus: string\n alns: readonly [AlignmentRow, AlignmentRow]\n}\n\nexport function structureSeqVsTranscriptSeqMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n const structureSeq = pairwiseAlignment.alns[1].seq\n const transcriptSeq = pairwiseAlignment.alns[0].seq\n if (structureSeq.length !== transcriptSeq.length) {\n throw new Error('mismatched length')\n }\n\n let j = 0\n let k = 0\n const structureSeqToTranscriptSeqPosition: Record<number, number> = {}\n const transcriptSeqToStructureSeqPosition: Record<number, number> = {}\n\n for (let i = 0; i < structureSeq.length; i++) {\n const c1 = structureSeq[i]\n const c2 = transcriptSeq[i]\n\n if (c2 === '-') {\n j++\n } else if (c1 === '-') {\n k++\n } else {\n structureSeqToTranscriptSeqPosition[j] = k\n transcriptSeqToStructureSeqPosition[k] = j\n k++\n j++\n }\n }\n\n return {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n }\n}\n\nfunction seqPositionToAlignmentMap(seq: string) {\n const map: Record<number, number> = {}\n for (let i = 0, j = 0; i < seq.length; i++) {\n if (seq[i] !== '-') {\n map[j] = i\n j++\n }\n }\n return map\n}\n\nexport function structurePositionToAlignmentMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n return seqPositionToAlignmentMap(pairwiseAlignment.alns[1].seq)\n}\n\nexport function transcriptPositionToAlignmentMap(\n pairwiseAlignment: PairwiseAlignment,\n) {\n return seqPositionToAlignmentMap(pairwiseAlignment.alns[0].seq)\n}\n\n// see similar function in msaview plugin\nexport function genomeToTranscriptSeqMapping(feature: Feature) {\n return g2p(feature.toJSON())\n}\n", "import { SimpleFeature } from '@jbrowse/core/util'\nimport { getCodonRange } from 'g2p_mapper'\nimport { action, computed, makeObservable, observable } from 'mobx'\n\nimport { genomeToTranscriptSeqMapping } from '../mappings'\n\nimport type { SimpleFeatureSerialized } from '@jbrowse/core/util'\n\nexport interface Protein1DViewInfo {\n viewId: string\n connectedViewId: string\n feature: SimpleFeatureSerialized\n uniprotId: string\n}\n\ninterface GenomeToTranscriptMapping {\n p2g: Record<number, number>\n g2p: Record<number, number>\n strand: number\n refName: string\n}\n\ninterface SessionWithViews {\n views: { id: string }[]\n}\n\nclass Protein1DViewRegistry {\n views = observable.map<string, Protein1DViewInfo>()\n\n constructor() {\n makeObservable(this, {\n register: action,\n unregister: action,\n cleanupStaleViews: action,\n entries: computed,\n })\n }\n\n register(info: Protein1DViewInfo) {\n this.views.set(info.viewId, info)\n }\n\n unregister(viewId: string) {\n this.views.delete(viewId)\n }\n\n cleanupStaleViews(session: SessionWithViews) {\n const activeViewIds = new Set(session.views.map(v => v.id))\n for (const viewId of this.views.keys()) {\n if (!activeViewIds.has(viewId)) {\n this.views.delete(viewId)\n }\n }\n }\n\n get(viewId: string) {\n return this.views.get(viewId)\n }\n\n getByUniprotId(uniprotId: string, session?: SessionWithViews) {\n if (session) {\n this.cleanupStaleViews(session)\n }\n for (const info of this.views.values()) {\n if (info.uniprotId === uniprotId) {\n return info\n }\n }\n return undefined\n }\n\n get entries() {\n return [...this.views.values()]\n }\n\n getGenomeHighlightForProteinPosition(\n uniprotId: string,\n proteinPos: number,\n session?: SessionWithViews,\n ): { refName: string; start: number; end: number } | undefined {\n const info = this.getByUniprotId(uniprotId, session)\n if (!info) {\n return undefined\n }\n\n const feature = new SimpleFeature(info.feature)\n const mapping = genomeToTranscriptSeqMapping(feature) as\n | GenomeToTranscriptMapping\n | undefined\n if (!mapping) {\n return undefined\n }\n\n const { p2g, strand, refName } = mapping\n const result = getCodonRange(p2g, proteinPos, strand)\n if (!result) {\n return undefined\n }\n\n const [start, end] = result\n return { refName, start, end }\n }\n}\n\nexport const protein1DViewRegistry = new Protein1DViewRegistry()\n", "import type { Feature } from '@jbrowse/core/util'\n\nexport function stripStopCodon(seq: string) {\n return seq.replaceAll('*', '')\n}\n\nexport function getTranscriptFeatures(feature: Feature) {\n // check if we are looking at a 'two-level' or 'three-level' feature by\n // finding exon/CDS subfeatures. we want to select from transcript names\n const subfeatures = feature.get('subfeatures') ?? []\n\n // Check for mRNA/transcript subfeatures (three-level: gene \u2192 mRNA \u2192 CDS)\n const transcripts = subfeatures.filter(\n (f: Feature) => f.get('type') === 'mRNA' || f.get('type') === 'transcript',\n )\n if (transcripts.length > 0) {\n return transcripts\n }\n\n // Has direct CDS/exon children, treat feature itself as the transcript\n // (two-level: gene \u2192 CDS or mRNA \u2192 CDS)\n return [feature]\n}\n\nexport function stripTrailingVersion(s?: string) {\n return s?.replace(/\\.[^./]+$/, '')\n}\n\nexport function getId(val?: Feature): string {\n return val === undefined ? '' : val.id()\n}\n\nexport function getTranscriptDisplayName(val?: Feature): string {\n return val === undefined ? '' : (val.get('name') ?? val.get('id') ?? '')\n}\n\nexport function getGeneDisplayName(val?: Feature): string {\n return val === undefined\n ? ''\n : (val.get('gene_name') ?? val.get('name') ?? val.get('id') ?? '')\n}\n\nexport function getUniProtIdFromFeature(f?: Feature): string | undefined {\n if (!f) {\n return undefined\n }\n return f.get('uniprot') ?? f.get('uniprotId') ?? f.get('uniprotid')\n}\n\n// Ensembl ID patterns - covers human (ENS), mouse (ENSMUS), zebrafish (ENSDAR), etc.\nconst ensemblGenePattern = /^ENS[A-Z]*G\\d+/i\nconst ensemblTranscriptPattern = /^ENS[A-Z]*T\\d+/i\nconst ensemblProteinPattern = /^ENS[A-Z]*P\\d+/i\n\n// NCBI RefSeq ID patterns\nconst refSeqTranscriptPattern = /^[NX][MR]_\\d+/i\nconst refSeqProteinPattern = /^[NX]P_\\d+/i\n\n// CCDS pattern\nconst ccdsPattern = /^CCDS\\d+/i\n\n// HGNC pattern (HGNC:12345)\nconst hgncPattern = /^HGNC:\\d+/i\n\n/**\n * Check if an ID is a recognized database identifier that UniProt can map\n */\nexport function isRecognizedDatabaseId(id: string) {\n return (\n ensemblGenePattern.test(id) ||\n ensemblTranscriptPattern.test(id) ||\n ensemblProteinPattern.test(id) ||\n refSeqTranscriptPattern.test(id) ||\n refSeqProteinPattern.test(id) ||\n ccdsPattern.test(id) ||\n hgncPattern.test(id)\n )\n}\n\n/**\n * Get the database type for a recognized ID (used for UniProt xref queries)\n */\nexport function getDatabaseTypeForId(id: string): string | undefined {\n if (\n ensemblGenePattern.test(id) ||\n ensemblTranscriptPattern.test(id) ||\n ensemblProteinPattern.test(id)\n ) {\n return 'ensembl'\n }\n if (refSeqTranscriptPattern.test(id) || refSeqProteinPattern.test(id)) {\n return 'refseq'\n }\n if (ccdsPattern.test(id)) {\n return 'ccds'\n }\n if (hgncPattern.test(id)) {\n return 'hgnc'\n }\n return undefined\n}\n\n/**\n * Parse dbxref attribute which can have formats like:\n * - \"GeneID:1234,HGNC:HGNC:5678\"\n * - \"Dbxref=GeneID:1234\"\n * - Array of strings\n */\nfunction parseDbxref(dbxref: unknown): string[] {\n if (!dbxref) {\n return []\n }\n if (Array.isArray(dbxref)) {\n return dbxref.flatMap(item =>\n typeof item === 'string' ? item.split(',') : [],\n )\n }\n if (typeof dbxref === 'string') {\n return dbxref.split(',').map(s => s.trim())\n }\n return []\n}\n\n/**\n * Extract recognized database IDs from dbxref entries\n * Returns IDs without their database prefix where applicable\n */\nfunction extractIdsFromDbxref(dbxrefEntries: string[]): string[] {\n const ids: string[] = []\n for (const entry of dbxrefEntries) {\n // Handle formats like \"Ensembl:ENST00000123456\" or \"RefSeq:NM_001234\"\n const parts = entry.split(':')\n const lastPart = parts[parts.length - 1]\n if (lastPart && isRecognizedDatabaseId(lastPart)) {\n ids.push(lastPart)\n }\n // Also check if the whole entry is a recognized ID\n if (isRecognizedDatabaseId(entry)) {\n ids.push(entry)\n }\n // Handle HGNC format \"HGNC:HGNC:12345\" -> \"HGNC:12345\"\n if (entry.startsWith('HGNC:HGNC:')) {\n ids.push(entry.replace('HGNC:HGNC:', 'HGNC:'))\n } else if (entry.startsWith('HGNC:') && /^HGNC:\\d+$/.test(entry)) {\n ids.push(entry)\n }\n }\n return [...new Set(ids)]\n}\n\n// New helper function to extract recognized DB IDs\nexport function findRecognizedDbIds(f?: Feature): string[] {\n if (!f) {\n return []\n }\n\n const recognizedIds: string[] = []\n\n // Check various feature attributes for recognized IDs\n const attributesToCheck = [\n f.get('ID'),\n f.get('id'),\n f.get('name'),\n f.get('Name'),\n f.get('transcript_id'),\n f.get('protein_id'),\n f.get('protAcc'), // RefSeq protein accession\n f.get('mrnaAcc'), // RefSeq mRNA accession\n ]\n\n for (const attr of attributesToCheck) {\n if (typeof attr === 'string') {\n const stripped = attr.replace(/\\.[^./]+$/, '') // Strip version\n if (isRecognizedDatabaseId(stripped)) {\n recognizedIds.push(stripped)\n }\n }\n }\n\n // Handle HGNC attribute which may be just the number (e.g., \"10848\" instead of \"HGNC:10848\")\n const hgnc = f.get('hgnc') ?? f.get('HGNC')\n if (typeof hgnc === 'string' || typeof hgnc === 'number') {\n const hgncStr = String(hgnc)\n if (/^\\d+$/.test(hgncStr)) {\n recognizedIds.push(`HGNC:${hgncStr}`)\n } else if (hgncPattern.test(hgncStr)) {\n recognizedIds.push(hgncStr)\n }\n }\n\n // Parse dbxref for additional IDs\n const dbxref = f.get('Dbxref') ?? f.get('dbxref') ?? f.get('db_xref')\n const dbxrefIds = extractIdsFromDbxref(parseDbxref(dbxref))\n for (const id of dbxrefIds) {\n recognizedIds.push(id)\n }\n\n return [...new Set(recognizedIds)]\n}\n\nexport interface FeatureIdentifiers {\n recognizedIds: string[]\n uniprotId?: string\n geneId?: string\n geneName?: string\n}\n\n/**\n * Extract all useful identifiers from a feature for UniProt lookup.\n * If the feature is a gene, prioritizes identifiers from its first transcript.\n * Otherwise, extracts identifiers from the feature itself.\n * geneId and geneName are always extracted from the parent feature 'f'.\n */\nexport function extractFeatureIdentifiers(f?: Feature): FeatureIdentifiers {\n if (!f) {\n return { recognizedIds: [] }\n }\n\n let featureToProcess = f // Default to the parent feature\n\n // If the feature is a gene, try to get identifiers from its first transcript.\n if (f.get('type') === 'gene') {\n const transcripts = getTranscriptFeatures(f)\n if (transcripts.length > 0) {\n featureToProcess = transcripts[0]! // Prioritize the first transcript (length > 0 checked above)\n }\n // If no transcripts found, featureToProcess remains the parent gene 'f'.\n }\n\n // --- Extracting Recognized IDs and UniProt ID from featureToProcess ---\n const recognizedIds = findRecognizedDbIds(featureToProcess)\n\n // Handle UniProt ID from feature attributes (trust that it's valid if present)\n const uniprotIdAttr =\n featureToProcess.get('uniprot') ??\n featureToProcess.get('uniprotId') ??\n featureToProcess.get('uniprotid') ??\n featureToProcess.get('UniProt')\n const uniprotId =\n typeof uniprotIdAttr === 'string' && uniprotIdAttr.length > 0\n ? uniprotIdAttr\n : undefined\n\n // --- Get gene ID and name as fallbacks from the original parent feature 'f' ---\n // This assumes gene_id and gene_name are attributes of the parent gene, not the transcript.\n const geneId = f.get('gene_id') ?? f.get('ID')\n const geneName =\n f.get('gene_name') ?? f.get('gene') ?? f.get('name') ?? f.get('Name')\n\n return {\n recognizedIds: [...new Set(recognizedIds)], // Ensure unique IDs\n uniprotId,\n geneId: typeof geneId === 'string' ? geneId : undefined,\n geneName: typeof geneName === 'string' ? geneName : undefined,\n }\n}\n\nexport function selectBestTranscript({\n options,\n isoformSequences,\n structureSequence,\n}: {\n options: Feature[]\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n structureSequence: string | undefined\n}) {\n const exactMatch = options.find(\n f =>\n structureSequence &&\n stripStopCodon(isoformSequences[f.id()]?.seq ?? '') === structureSequence,\n )\n const longestWithData = options\n .filter(f => !!isoformSequences[f.id()])\n .toSorted(\n (a, b) =>\n isoformSequences[b.id()]!.seq.length -\n isoformSequences[a.id()]!.seq.length,\n )[0]\n return exactMatch ?? longestWithData\n}\n", "module.exports = JBrowseExports[\"@jbrowse/core/pluggableElementTypes/AdapterType\"];", "module.exports = JBrowseExports[\"@jbrowse/core/configuration\"];", "module.exports = JBrowseExports[\"@jbrowse/core/data_adapters/BaseAdapter\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/io\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/rxjs\"];", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2 } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\nexport default class AlphaFoldConfidenceAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats:\n | Promise<{ uniqueId: string; start: number; end: number; score: number }[]>\n | undefined\n\n private async loadDataP() {\n const scores = JSON.parse(\n await openLocation(this.getConf('location')).readFile('utf8'),\n ) as { residueNumber: number[]; confidenceScore: number[] }\n\n return scores.residueNumber.map((value, idx) => ({\n uniqueId: `feat-${idx}`,\n start: value,\n end: value + 1,\n score: scores.confidenceScore[idx]!,\n }))\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(new SimpleFeature({ ...f, refName }))\n }\n }\n observer.complete()\n })\n }\n\n public freeResources(): void {}\n}\n", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2, max, min } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\nexport interface AlphaMissenseRow {\n uniqueId: string\n start: number\n end: number\n score: number\n ref: string\n variant: string\n am_class: string\n}\n\n/**\n * Parses AlphaMissense CSV text (protein_variant,score,am_class). The\n * protein_variant column looks like \"V123L\": a ref AA, a 1-based residue\n * coordinate, and a variant AA. Rows that don't parse to a numeric coordinate\n * are skipped rather than emitted as bogus position-0 features.\n */\nexport function parseAlphaMissense(text: string): AlphaMissenseRow[] {\n return text\n .split('\\n')\n .slice(1)\n .map(f => f.trim())\n .filter(f => !!f)\n .flatMap((row, idx) => {\n const [protein_variant = '', score, am_class] = row.split(',')\n const ref = protein_variant[0]\n const variant = protein_variant.at(-1)\n const coord = +protein_variant.slice(1, -1)\n return ref !== undefined &&\n variant !== undefined &&\n !Number.isNaN(coord) &&\n score !== undefined &&\n am_class !== undefined\n ? [\n {\n uniqueId: `feat-${idx}`,\n ref,\n variant,\n start: coord,\n end: coord + 1,\n score: +score,\n am_class,\n },\n ]\n : []\n })\n}\n\nexport default class AlphaMissensePathogenicityAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats: Promise<AlphaMissenseRow[]> | undefined\n\n private async loadDataP() {\n const scores = await openLocation(this.getConf('location')).readFile('utf8')\n return parseAlphaMissense(scores)\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getGlobalStats(_opts?: BaseOptions) {\n const data = await this.loadData()\n const scores = data.map(s => s.score)\n return { scoreMin: min(scores), scoreMax: max(scores) }\n }\n\n // always render bigwig instead of calculating a feature density for it\n async getMultiRegionFeatureDensityStats(_regions: Region[]) {\n return { featureDensity: 0 }\n }\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(\n new SimpleFeature({\n ...f,\n refName,\n source: f.variant,\n }),\n )\n }\n }\n observer.complete()\n })\n }\n\n public async getSources() {\n const sources = new Set<string>()\n const data = await this.loadData()\n for (const f of data) {\n sources.add(f.variant)\n }\n return [...sources].map(s => ({\n name: s,\n __name: s,\n }))\n }\n\n public freeResources(): void {}\n}\n", "module.exports = JBrowseExports[\"@mui/material/utils\"];", "'use client';\n\nexport { createSvgIcon as default } from '@mui/material/utils';", "module.exports = JBrowseExports[\"react/jsx-runtime\"];", "module.exports = JBrowseExports[\"@jbrowse/core/ui\"];", "module.exports = JBrowseExports[\"@mui/material\"];", "import type { AbstractSessionModel } from '@jbrowse/core/util'\n\n// Self-contained launch preference (NOT the global/core preferences system):\n// whether a protein view launched from a genome feature opens side-by-side with\n// its connected genome view (left genome | right protein) instead of stacked.\nconst SIDE_BY_SIDE_KEY = 'proteinView-launchSideBySide'\n\n// Default to side-by-side: a connected genome+protein pair reads best as a\n// left/right split. Users can turn it off in the launch dialog's settings.\nconst DEFAULT_SIDE_BY_SIDE = true\n\nexport function getLaunchSideBySide() {\n const stored = localStorage.getItem(SIDE_BY_SIDE_KEY)\n return stored === null ? DEFAULT_SIDE_BY_SIDE : stored === 'true'\n}\n\nexport function setLaunchSideBySide(value: boolean) {\n localStorage.setItem(SIDE_BY_SIDE_KEY, value ? 'true' : 'false')\n}\n\n// The workspaces split is driven by two session actions that only exist on the\n// web/desktop session (MultipleViews + DockviewLayout mixins). Embedded sessions\n// lack them, so feature-detect before using.\ninterface SessionWithWorkspaces {\n setUseWorkspaces: (useWorkspaces: boolean) => void\n setPendingMove: (move: { type: 'splitRight'; viewId: string }) => void\n}\n\nfunction isSessionWithWorkspaces(\n session: AbstractSessionModel,\n): session is AbstractSessionModel & SessionWithWorkspaces {\n return (\n 'setUseWorkspaces' in session &&\n typeof session.setUseWorkspaces === 'function' &&\n 'setPendingMove' in session &&\n typeof session.setPendingMove === 'function'\n )\n}\n\n/**\n * Place a freshly-added view to the right of the others in a workspaces (tiled)\n * layout. Mirrors the \"Move to split view\" view-menu action: queue a splitRight\n * pending move for this view, then enable workspaces so TiledViewsContainer\n * consumes the move on mount (other views land in the left panel, this one in a\n * new right panel). No-op on sessions without workspaces support.\n */\nexport function launchViewSideBySide(\n session: AbstractSessionModel,\n viewId: string,\n) {\n if (isSessionWithWorkspaces(session)) {\n session.setPendingMove({ type: 'splitRight', viewId })\n session.setUseWorkspaces(true)\n }\n}\n", "export function parseVersion(line: string) {\n const res = /\\(?(\\d+(\\.\\d+)+)\\)?/.exec(line)\n return res && res.length > 1 ? res[1] : ''\n}\nexport function parseHeader(info: string) {\n const knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign']\n\n if (!knownHeaders.some(l => info.startsWith(l))) {\n console.warn(\n `${info} is not a known CLUSTAL header: ${knownHeaders.join(\n ',',\n )}, proceeding but could indicate an issue`,\n )\n }\n const version = parseVersion(info)\n return { info, version }\n}\n\nexport function getFirstNonEmptyLine(arr: Iterator<string>): string {\n // There should be two blank lines after the header line\n let line = arr.next()\n while (!line.done && line.value.trim() === '') {\n line = arr.next()\n }\n return line.value!\n}\n\nexport function getSeqBounds(line: string) {\n const fields = line.split(/\\s+/)\n const temp = line.slice(fields[0]!.length)\n const s = fields[0]!.length + temp.indexOf(fields[1]!)\n const e = s + fields[1]!.length\n return [s, e] as const\n}\n\n// Use the first block to get the sequence identifiers\nexport function parseBlock(arr: Iterator<string>) {\n let line = getFirstNonEmptyLine(arr)\n const block = []\n let consensusLine = ''\n if (!line) {\n return undefined\n }\n\n while (line) {\n if (line.startsWith(' ')) {\n consensusLine = line\n } else {\n block.push(line)\n }\n line = arr.next().value\n }\n const [start, end] = getSeqBounds(block[0]!)\n const fields = block.map(s => s.split(/\\s+/))\n const ids = fields.map(s => s[0]!)\n const seqs = block.map(s => s.slice(start, end))\n let consensus = consensusLine.slice(start, end)\n\n // handle if the consensus trailing whitespace got trimmed\n const remainder = seqs[0]!.length - consensus.length\n if (remainder) {\n consensus += ' '.repeat(remainder)\n }\n return {\n ids,\n seqs,\n consensus,\n }\n}\n\nexport function parseBlocks(arr: Iterator<string>) {\n let block\n const res = parseBlock(arr)\n if (res !== undefined) {\n while ((block = parseBlock(arr))) {\n for (let i = 0; i < block.seqs.length; i++) {\n res.seqs[i] += block.seqs[i]!\n }\n res.consensus += block.consensus\n }\n }\n return res\n}\n", "import { getFirstNonEmptyLine } from './util.ts'\n\nfunction isRulerLine(line: string) {\n const trimmed = line.trim()\n if (!trimmed) {\n return false\n }\n const fields = trimmed.split(/\\s+/)\n return fields.every(f => /^\\d+$/.test(f))\n}\n\nfunction isSequenceLine(line: string) {\n const trimmed = line.trim()\n return /^\\w+\\s+/.test(trimmed) && !isRulerLine(line)\n}\n\nfunction hasPositionNumbers(fields: string[]) {\n return fields.length >= 3 && /^\\d+$/.test(fields[1]!)\n}\n\nfunction getSeqBounds(line: string, seqIndex: number) {\n const trimmed = line.trim()\n const fields = trimmed.split(/\\s+/)\n const seq = fields[seqIndex]!\n const seqStart = line.indexOf(\n seq,\n line.indexOf(fields[0]!) + fields[0]!.length,\n )\n return [seqStart, seqStart + seq.length] as const\n}\n\n// Use the first block to get the sequence identifiers\nexport function parsePairwiseBlock(arr: Iterator<string>) {\n let line = getFirstNonEmptyLine(arr)\n const block: string[] = []\n let consensusLine = ''\n if (!line) {\n return undefined\n }\n\n while (line) {\n if (isRulerLine(line)) {\n // skip position ruler lines\n } else if (isSequenceLine(line)) {\n block.push(line)\n } else {\n consensusLine = line\n }\n line = arr.next().value\n }\n\n if (block.length === 0) {\n return undefined\n }\n\n const fields = block.map(s => s.trim().split(/\\s+/))\n const firstField = fields[0]\n if (!firstField) {\n return undefined\n }\n const seqIndex = hasPositionNumbers(firstField) ? 2 : 1\n const [start, end] = getSeqBounds(block[0]!, seqIndex)\n const ids = fields.map(s => s[0]!)\n const seqs = fields.map(s => s[seqIndex]!)\n let consensus = consensusLine.slice(start, end)\n\n // handle if the consensus trailing whitespace got trimmed\n const firstSeq = seqs[0]\n if (firstSeq) {\n const remainder = firstSeq.length - consensus.length\n if (remainder > 0) {\n consensus += ' '.repeat(remainder)\n }\n }\n return {\n ids,\n seqs,\n consensus,\n }\n}\n\nexport function parsePairwiseBlocks(arr: Iterator<string>) {\n let block\n const res = parsePairwiseBlock(arr)\n if (res !== undefined) {\n while ((block = parsePairwiseBlock(arr))) {\n for (let i = 0; i < block.seqs.length; i++) {\n res.seqs[i] += block.seqs[i]!\n }\n res.consensus += block.consensus\n }\n }\n return res\n}\n", "import { parsePairwiseBlocks } from './pairwise.ts'\nimport { parseBlocks, parseHeader, getFirstNonEmptyLine } from './util.ts'\n\nexport function parseClustalIter(arr: Iterator<string>) {\n const line = getFirstNonEmptyLine(arr)\n if (!line) {\n throw new Error('Empty file received')\n }\n const header = parseHeader(line)\n\n const res = parseBlocks(arr)\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n if (consensus.length !== alns[0]!.seq.length) {\n throw new Error(\n `Consensus length != sequence length. Con ${consensus.length} seq ${alns[0]!.seq.length}`,\n )\n }\n\n return { consensus, alns, header }\n}\n\nexport interface Row {\n id: string\n seq: string\n}\n\nexport function parse(contents: string) {\n const iter = contents.split('\\n')[Symbol.iterator]()\n return parseClustalIter(iter)\n}\n\nexport function parsePairwise(contents: string) {\n const filtered = contents\n .split('\\n')\n .filter(f => !f.startsWith('#'))\n .join('\\n')\n\n const res = parsePairwiseBlocks(filtered.split('\\n')[Symbol.iterator]())\n if (res === undefined) {\n throw new Error('No blocks parsed')\n }\n\n const alns = res.seqs.map((n, index) => ({ id: res.ids[index]!, seq: n }))\n const { consensus } = res\n const firstAln = alns[0]\n if (!firstAln) {\n throw new Error('No alignments found')\n }\n if (consensus.length !== firstAln.seq.length) {\n throw new Error(\n `Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`,\n )\n }\n if (alns.length !== 2) {\n throw new Error(\n `Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`,\n )\n }\n return {\n consensus,\n alns: alns as [Row, Row],\n }\n}\n", "import type { SessionWithAddTracks } from '@jbrowse/core/util'\n\n/**\n * Sets up a temporary assembly for a protein sequence from UniProt\n */\nexport function setupProteinAssembly(\n session: SessionWithAddTracks,\n uniprotId: string,\n) {\n session.addTemporaryAssembly?.({\n name: uniprotId,\n sequence: {\n type: 'ReferenceSequenceTrack',\n trackId: `${uniprotId}-ReferenceSequenceTrack`,\n sequenceType: 'pep',\n adapter: {\n type: 'UnindexedFastaAdapter',\n rewriteRefNames: \"jexl:split(refName,'|')[1]\",\n fastaLocation: {\n uri: `https://rest.uniprot.org/uniprotkb/${uniprotId}.fasta`,\n },\n },\n },\n })\n}\n", "import type { SessionWithAddTracks } from '@jbrowse/core/util'\n\n/**\n * Fetches UniProt GFF data and extracts unique feature types\n */\nexport async function fetchUniProtFeatureTypes(\n uniprotId: string,\n): Promise<string[]> {\n const url = `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff`\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} fetching ${url}`)\n }\n const data = await res.text()\n\n return [\n ...new Set(\n data\n .split('\\n')\n .filter(f => !f.startsWith('#'))\n .map(f => f.trim())\n .filter(f => !!f)\n .map(f => f.split('\\t')[2]!),\n ),\n ]\n}\n\n/**\n * Adds UniProt feature tracks for each feature type\n */\nexport function addUniProtFeatureTracks({\n session,\n uniprotId,\n featureTypes,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n featureTypes: string[]\n}) {\n featureTypes.forEach(type => {\n const trackId = `${uniprotId}-${type}`\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId,\n name: type,\n adapter: {\n type: 'Gff3Adapter',\n gffLocation: {\n uri: `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff`,\n },\n },\n assemblyNames: [uniprotId],\n displays: [\n {\n displayId: `${trackId}-LinearBasicDisplay`,\n type: 'LinearBasicDisplay',\n jexlFilters: [`get(feature,'type')=='${type}'`],\n },\n ],\n })\n })\n}\n\n/**\n * Adds antigen annotation track from EBI\n */\nexport function addAntigenTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId: `${uniprotId}-Antigen`,\n name: 'Antigen',\n adapter: {\n type: 'Gff3Adapter',\n gffLocation: {\n uri: `https://www.ebi.ac.uk/proteins/api/antigen/${uniprotId}?format=gff`,\n },\n },\n assemblyNames: [uniprotId],\n })\n}\n\n/**\n * Adds variation track from EBI\n */\nexport function addVariationTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'FeatureTrack',\n trackId: `${uniprotId}-Variation`,\n name: 'Variation',\n adapter: {\n type: 'UniProtVariationAdapter',\n location: {\n uri: `https://www.ebi.ac.uk/proteins/api/variation/${uniprotId}.json`,\n },\n },\n assemblyNames: [uniprotId],\n })\n}\n\n/**\n * Adds AlphaFold confidence track\n */\nexport function addAlphaFoldConfidenceTrack({\n session,\n uniprotId,\n confidenceUrl,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n confidenceUrl: string | undefined\n}) {\n if (confidenceUrl) {\n session.addTrackConf({\n type: 'QuantitativeTrack',\n trackId: `${uniprotId}-AlphaFold-confidence`,\n name: 'AlphaFold confidence',\n adapter: {\n type: 'AlphaFoldConfidenceAdapter',\n location: {\n uri: confidenceUrl,\n },\n },\n assemblyNames: [uniprotId],\n })\n }\n}\n\n/**\n * Adds AlphaMissense pathogenicity scores track\n */\nexport function addAlphaMissenseTrack({\n session,\n uniprotId,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n}) {\n session.addTrackConf({\n type: 'MultiQuantitativeTrack',\n trackId: `${uniprotId}-AlphaMissense-scores`,\n name: 'AlphaMissense scores',\n assemblyNames: [uniprotId],\n adapter: {\n type: 'AlphaMissensePathogenicityAdapter',\n location: {\n uri: `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-aa-substitutions.csv`,\n },\n },\n displays: [\n {\n type: 'MultiLinearWiggleDisplay',\n displayId: `${uniprotId}-AlphaMissense-scores-MultiLinearWiggleDisplay`,\n defaultRendering: 'multirowdensity',\n renderers: {\n MultiDensityRenderer: {\n type: 'MultiDensityRenderer',\n bicolorPivotValue: 0.5,\n posColor: 'red',\n negColor: 'blue',\n },\n },\n },\n ],\n })\n}\n\n/**\n * Adds all protein annotation tracks for a given UniProt ID\n */\nexport async function addAllProteinTracks({\n session,\n uniprotId,\n confidenceUrl,\n}: {\n session: SessionWithAddTracks\n uniprotId: string\n confidenceUrl: string | undefined\n}) {\n const featureTypes = await fetchUniProtFeatureTypes(uniprotId)\n addUniProtFeatureTracks({\n session,\n uniprotId,\n featureTypes,\n })\n addAntigenTrack({\n session,\n uniprotId,\n })\n addVariationTrack({\n session,\n uniprotId,\n })\n addAlphaFoldConfidenceTrack({\n session,\n uniprotId,\n confidenceUrl,\n })\n addAlphaMissenseTrack({\n session,\n uniprotId,\n })\n}\n", "import { setupProteinAssembly } from './proteinAssemblySetup'\nimport { addAllProteinTracks } from './proteinTrackSetup'\nimport { protein1DViewRegistry } from '../../Protein1DViewRegistry'\nimport { formatViewName } from '../utils/launchViewUtils'\n\nimport type { Feature, SessionWithAddTracks } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport async function launchProteinAnnotationView({\n session,\n feature,\n selectedTranscript,\n uniprotId,\n confidenceUrl,\n connectedViewId,\n}: {\n session: SessionWithAddTracks\n feature: Feature\n selectedTranscript?: Feature\n uniprotId: string\n confidenceUrl?: string\n connectedViewId?: string\n}) {\n setupProteinAssembly(session, uniprotId)\n\n await addAllProteinTracks({\n session,\n uniprotId,\n confidenceUrl,\n })\n\n const view = session.addView('LinearGenomeView', {\n type: 'LinearGenomeView',\n displayName: formatViewName(\n 'Protein view',\n feature,\n selectedTranscript,\n uniprotId,\n ),\n }) as LinearGenomeViewModel\n\n // Register for linked highlighting between 1D and 3D views\n if (connectedViewId && selectedTranscript) {\n protein1DViewRegistry.register({\n viewId: view.id,\n connectedViewId,\n feature: selectedTranscript.toJSON(),\n uniprotId,\n })\n }\n\n await view.navToLocString(uniprotId, uniprotId)\n}\n", "import { isSessionWithAddTracks } from '@jbrowse/core/util'\n\ndeclare global {\n interface Window {\n JBrowsePluginMsaView?: unknown\n }\n}\n\nimport { getLaunchSideBySide, launchViewSideBySide } from './sideBySide'\nimport { getGeneDisplayName, getTranscriptDisplayName } from './util'\nimport { launchProteinAnnotationView } from '../components/launchProteinAnnotationView'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport const ALPHAFOLD_VERSION = 'v6'\n\nexport function getAlphaFoldStructureUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-model_${version}.cif`\n}\n\nexport function getAlphaFoldConfidenceUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/AF-${uniprotId}-F1-confidence_${version}.json`\n}\n\nexport function getAlphaFoldMsaUrl(\n uniprotId: string,\n version = ALPHAFOLD_VERSION,\n) {\n return `https://alphafold.ebi.ac.uk/files/msa/AF-${uniprotId}-F1-msa_${version}.a3m`\n}\n\nexport function getPdbStructureUrl(pdbId: string) {\n return `https://files.rcsb.org/download/${pdbId}.cif`\n}\n\n// Foldseek targets may contain a description after the ID separated by a\n// space, e.g. \"AF-P16442-F1-model_v6 Histo-blood group ABO transferase\".\nfunction extractTargetId(target: string) {\n return target.split(' ')[0]!\n}\n\nexport function getUniprotIdFromAlphaFoldTarget(target: string) {\n // Handles both \"AF-P16442-F1-model_v6\" and full URLs like\n // \"https://alphafold.ebi.ac.uk/files/AF-P16442-F1-model_v6.cif\"\n const match = /AF-([A-Z0-9]+)-F\\d+/.exec(extractTargetId(target))\n return match?.[1]\n}\n\nexport function getStructureUrlFromTarget(target: string, db: string) {\n const targetId = extractTargetId(target)\n if (targetId.startsWith('AF-')) {\n return `https://alphafold.ebi.ac.uk/files/${targetId}.cif`\n }\n if (db === 'pdb100') {\n const pdbId = targetId.split('_')[0]!\n if (pdbId.length === 4) {\n return getPdbStructureUrl(pdbId)\n }\n }\n return undefined\n}\n\nexport function getConfidenceUrlFromTarget(target: string) {\n const targetId = extractTargetId(target)\n if (targetId.startsWith('AF-')) {\n const confidenceId = targetId.replace('-model_', '-confidence_')\n return `https://alphafold.ebi.ac.uk/files/${confidenceId}.json`\n }\n return undefined\n}\n\ninterface LaunchViewParams {\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n uniprotId?: string\n}\n\nexport function formatViewName(\n prefix: string,\n feature: Feature,\n selectedTranscript?: Feature,\n uniprotId?: string,\n) {\n return [\n ...new Set([\n prefix,\n uniprotId,\n getGeneDisplayName(feature),\n getTranscriptDisplayName(selectedTranscript),\n ]),\n ]\n .filter(s => !!s)\n .join(' - ')\n}\n\nexport function launch3DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n url,\n data,\n userProvidedTranscriptSequence,\n alignmentAlgorithm,\n displayName,\n connectedMsaViewId,\n sideBySide,\n}: LaunchViewParams & {\n url?: string\n data?: string\n userProvidedTranscriptSequence?: string\n alignmentAlgorithm?: string\n displayName?: string\n connectedMsaViewId?: string\n // explicit override; when undefined the launch-dialog localStorage preference\n // decides (left genome | right protein)\n sideBySide?: boolean\n}) {\n const snap = {\n type: 'ProteinView',\n alignmentAlgorithm,\n connectedMsaViewId,\n structures: [\n {\n url,\n data,\n userProvidedTranscriptSequence: userProvidedTranscriptSequence ?? '',\n feature: selectedTranscript?.toJSON(),\n connectedViewId: view.id,\n },\n ],\n displayName:\n displayName ??\n formatViewName('Protein view', feature, selectedTranscript, uniprotId),\n }\n const proteinView = session.addView('ProteinView', snap)\n if (sideBySide ?? getLaunchSideBySide()) {\n launchViewSideBySide(session, proteinView.id)\n }\n return proteinView\n}\n\nexport async function launch1DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n confidenceUrl,\n}: LaunchViewParams & {\n confidenceUrl?: string\n}) {\n if (!uniprotId || !isSessionWithAddTracks(session)) {\n return\n }\n await launchProteinAnnotationView({\n session,\n selectedTranscript,\n feature,\n uniprotId,\n confidenceUrl,\n connectedViewId: view.id,\n })\n}\n\n// CROSS-REPO DEPENDENCY: the 'MsaView' view type is registered by\n// jbrowse-plugin-msaview, which wraps the `react-msaview` library. The `init`\n// keys below (msaUrl, colorSchemeName) and the connected* props are a runtime\n// contract with that plugin's model \u2014 they are NOT type-checked here because we\n// only depend on it at runtime (gated by hasMsaViewPlugin()). If react-msaview\n// renames these, the launch silently degrades. Keep in step with that repo.\nexport function launchMsaView({\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n displayName,\n}: LaunchViewParams & { displayName?: string }) {\n if (!uniprotId) {\n return undefined\n }\n return session.addView('MsaView', {\n type: 'MsaView',\n displayName:\n displayName ??\n formatViewName('MSA view', feature, selectedTranscript, uniprotId),\n connectedViewId: view.id,\n connectedFeature: selectedTranscript?.toJSON(),\n init: {\n msaUrl: getAlphaFoldMsaUrl(uniprotId),\n colorSchemeName: 'percent_identity',\n },\n })\n}\n\nexport function hasMsaViewPlugin() {\n return window.JBrowsePluginMsaView !== undefined\n}\n\nexport function launch3DProteinViewWithMsa(\n params: LaunchViewParams & {\n url?: string\n data?: string\n userProvidedTranscriptSequence?: string\n alignmentAlgorithm?: string\n displayName?: string\n },\n) {\n const { uniprotId } = params\n if (!uniprotId) {\n return undefined\n }\n const msaView = launchMsaView(params)\n return launch3DProteinView({\n ...params,\n connectedMsaViewId: msaView?.id,\n })\n}\n", "/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n", "const FOCUS_EVENT = 0;\nconst RECONNECT_EVENT = 1;\nconst MUTATE_EVENT = 2;\nconst ERROR_REVALIDATE_EVENT = 3;\n\nexport { ERROR_REVALIDATE_EVENT, FOCUS_EVENT, MUTATE_EVENT, RECONNECT_EVENT };\n", "var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n", "'use client';\nimport React, { useEffect, useLayoutEffect, createContext, useContext, useMemo, useRef, createElement } from 'react';\nimport * as revalidateEvents from './events.mjs';\nimport { dequal } from 'dequal/lite';\n\n// Global state used to deduplicate requests and store listeners\nconst SWRGlobalState = new WeakMap();\n\n// Shared state between server components and client components\nconst noop = ()=>{};\n// Using noop() as the undefined value as undefined can be replaced\n// by something else. Prettier ignore and extra parentheses are necessary here\n// to ensure that tsc doesn't remove the __NOINLINE__ comment.\n// prettier-ignore\nconst UNDEFINED = /*#__NOINLINE__*/ noop();\nconst OBJECT = Object;\nconst isUndefined = (v)=>v === UNDEFINED;\nconst isFunction = (v)=>typeof v == 'function';\nconst mergeObjects = (a, b)=>({\n ...a,\n ...b\n });\nconst isPromiseLike = (x)=>isFunction(x.then);\n\nconst EMPTY_CACHE = {};\nconst INITIAL_CACHE = {};\nconst STR_UNDEFINED = 'undefined';\n// NOTE: Use the function to guarantee it's re-evaluated between jsdom and node runtime for tests.\nconst isWindowDefined = typeof window != STR_UNDEFINED;\nconst isDocumentDefined = typeof document != STR_UNDEFINED;\nconst isLegacyDeno = isWindowDefined && 'Deno' in window;\nconst hasRequestAnimationFrame = ()=>isWindowDefined && typeof window['requestAnimationFrame'] != STR_UNDEFINED;\nconst createCacheHelper = (cache, key)=>{\n const state = SWRGlobalState.get(cache);\n return [\n // Getter\n ()=>!isUndefined(key) && cache.get(key) || EMPTY_CACHE,\n // Setter\n (info)=>{\n if (!isUndefined(key)) {\n const prev = cache.get(key);\n // Before writing to the store, we keep the value in the initial cache\n // if it's not there yet.\n if (!(key in INITIAL_CACHE)) {\n INITIAL_CACHE[key] = prev;\n }\n state[5](key, mergeObjects(prev, info), prev || EMPTY_CACHE);\n }\n },\n // Subscriber\n state[6],\n // Get server cache snapshot\n ()=>{\n if (!isUndefined(key)) {\n // If the cache was updated on the client, we return the stored initial value.\n if (key in INITIAL_CACHE) return INITIAL_CACHE[key];\n }\n // If we haven't done any client-side updates, we return the current value.\n return !isUndefined(key) && cache.get(key) || EMPTY_CACHE;\n }\n ];\n} // export { UNDEFINED, OBJECT, isUndefined, isFunction, mergeObjects, isPromiseLike }\n;\n\n/**\n * Due to the bug https://bugs.chromium.org/p/chromium/issues/detail?id=678075,\n * it's not reliable to detect if the browser is currently online or offline\n * based on `navigator.onLine`.\n * As a workaround, we always assume it's online on the first load, and change\n * the status upon `online` or `offline` events.\n */ let online = true;\nconst isOnline = ()=>online;\n// For node and React Native, `add/removeEventListener` doesn't exist on window.\nconst [onWindowEvent, offWindowEvent] = isWindowDefined && window.addEventListener ? [\n window.addEventListener.bind(window),\n window.removeEventListener.bind(window)\n] : [\n noop,\n noop\n];\nconst isVisible = ()=>{\n const visibilityState = isDocumentDefined && document.visibilityState;\n return isUndefined(visibilityState) || visibilityState !== 'hidden';\n};\nconst initFocus = (callback)=>{\n // focus revalidate\n if (isDocumentDefined) {\n document.addEventListener('visibilitychange', callback);\n }\n onWindowEvent('focus', callback);\n return ()=>{\n if (isDocumentDefined) {\n document.removeEventListener('visibilitychange', callback);\n }\n offWindowEvent('focus', callback);\n };\n};\nconst initReconnect = (callback)=>{\n // revalidate on reconnected\n const onOnline = ()=>{\n online = true;\n callback();\n };\n // nothing to revalidate, just update the status\n const onOffline = ()=>{\n online = false;\n };\n onWindowEvent('online', onOnline);\n onWindowEvent('offline', onOffline);\n return ()=>{\n offWindowEvent('online', onOnline);\n offWindowEvent('offline', onOffline);\n };\n};\nconst preset = {\n isOnline,\n isVisible\n};\nconst defaultConfigOptions = {\n initFocus,\n initReconnect\n};\n\nconst IS_REACT_LEGACY = !React.useId;\nconst IS_SERVER = !isWindowDefined || isLegacyDeno;\n// Polyfill requestAnimationFrame\nconst rAF = (f)=>hasRequestAnimationFrame() ? window['requestAnimationFrame'](f) : setTimeout(f, 1);\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser.\nconst useIsomorphicLayoutEffect = IS_SERVER ? useEffect : useLayoutEffect;\n// This assignment is to extend the Navigator type to use effectiveType.\nconst navigatorConnection = typeof navigator !== 'undefined' && navigator.connection;\n// Adjust the config based on slow connection status (<= 70Kbps).\nconst slowConnection = !IS_SERVER && navigatorConnection && ([\n 'slow-2g',\n '2g'\n].includes(navigatorConnection.effectiveType) || navigatorConnection.saveData);\n\n// use WeakMap to store the object->key mapping\n// so the objects can be garbage collected.\n// WeakMap uses a hashtable under the hood, so the lookup\n// complexity is almost O(1).\nconst table = new WeakMap();\nconst getTypeName = (value)=>OBJECT.prototype.toString.call(value);\nconst isObjectTypeName = (typeName, type)=>typeName === `[object ${type}]`;\n// counter of the key\nlet counter = 0;\n// A stable hash implementation that supports:\n// - Fast and ensures unique hash properties\n// - Handles unserializable values\n// - Handles object key ordering\n// - Generates short results\n//\n// This is not a serialization function, and the result is not guaranteed to be\n// parsable.\nconst stableHash = (arg)=>{\n const type = typeof arg;\n const typeName = getTypeName(arg);\n const isDate = isObjectTypeName(typeName, 'Date');\n const isRegex = isObjectTypeName(typeName, 'RegExp');\n const isPlainObject = isObjectTypeName(typeName, 'Object');\n let result;\n let index;\n if (OBJECT(arg) === arg && !isDate && !isRegex) {\n // Object/function, not null/date/regexp. Use WeakMap to store the id first.\n // If it's already hashed, directly return the result.\n result = table.get(arg);\n if (result) return result;\n // Store the hash first for circular reference detection before entering the\n // recursive `stableHash` calls.\n // For other objects like set and map, we use this id directly as the hash.\n result = ++counter + '~';\n table.set(arg, result);\n if (Array.isArray(arg)) {\n // Array.\n result = '@';\n for(index = 0; index < arg.length; index++){\n result += stableHash(arg[index]) + ',';\n }\n table.set(arg, result);\n }\n if (isPlainObject) {\n // Object, sort keys.\n result = '#';\n const keys = OBJECT.keys(arg).sort();\n while(!isUndefined(index = keys.pop())){\n if (!isUndefined(arg[index])) {\n result += index + ':' + stableHash(arg[index]) + ',';\n }\n }\n table.set(arg, result);\n }\n } else {\n result = isDate ? arg.toJSON() : type == 'symbol' ? arg.toString() : type == 'string' ? JSON.stringify(arg) : '' + arg;\n }\n return result;\n};\n\nconst serialize = (key)=>{\n if (isFunction(key)) {\n try {\n key = key();\n } catch (err) {\n // dependencies not ready\n key = '';\n }\n }\n // Use the original key as the argument of fetcher. This can be a string or an\n // array of values.\n const args = key;\n // If key is not falsy, or not an empty array, hash it.\n key = typeof key == 'string' ? key : (Array.isArray(key) ? key.length : key) ? stableHash(key) : '';\n return [\n key,\n args\n ];\n};\n\n// Global timestamp.\nlet __timestamp = 0;\nconst getTimestamp = ()=>++__timestamp;\n\nasync function internalMutate(...args) {\n const [cache, _key, _data, _opts] = args;\n // When passing as a boolean, it's explicitly used to disable/enable\n // revalidation.\n const options = mergeObjects({\n populateCache: true,\n throwOnError: true\n }, typeof _opts === 'boolean' ? {\n revalidate: _opts\n } : _opts || {});\n let populateCache = options.populateCache;\n const rollbackOnErrorOption = options.rollbackOnError;\n let optimisticData = options.optimisticData;\n const rollbackOnError = (error)=>{\n return typeof rollbackOnErrorOption === 'function' ? rollbackOnErrorOption(error) : rollbackOnErrorOption !== false;\n };\n const throwOnError = options.throwOnError;\n // If the second argument is a key filter, return the mutation results for all\n // filtered keys.\n if (isFunction(_key)) {\n const keyFilter = _key;\n const matchedKeys = [];\n const it = cache.keys();\n for (const key of it){\n if (// Skip the special useSWRInfinite and useSWRSubscription keys.\n !/^\\$(inf|sub)\\$/.test(key) && keyFilter(cache.get(key)._k)) {\n matchedKeys.push(key);\n }\n }\n return Promise.all(matchedKeys.map(mutateByKey));\n }\n return mutateByKey(_key);\n async function mutateByKey(_k) {\n // Serialize key\n const [key] = serialize(_k);\n if (!key) return;\n const [get, set] = createCacheHelper(cache, key);\n const [EVENT_REVALIDATORS, MUTATION, FETCH, PRELOAD] = SWRGlobalState.get(cache);\n const startRevalidate = ()=>{\n const revalidators = EVENT_REVALIDATORS[key];\n const revalidate = isFunction(options.revalidate) ? options.revalidate(get().data, _k) : options.revalidate !== false;\n if (revalidate) {\n // Invalidate the key by deleting the concurrent request markers so new\n // requests will not be deduped.\n delete FETCH[key];\n delete PRELOAD[key];\n if (revalidators && revalidators[0]) {\n return revalidators[0](revalidateEvents.MUTATE_EVENT).then(()=>get().data);\n }\n }\n return get().data;\n };\n // If there is no new data provided, revalidate the key with current state.\n if (args.length < 3) {\n // Revalidate and broadcast state.\n return startRevalidate();\n }\n let data = _data;\n let error;\n let isError = false;\n // Update global timestamps.\n const beforeMutationTs = getTimestamp();\n MUTATION[key] = [\n beforeMutationTs,\n 0\n ];\n const hasOptimisticData = !isUndefined(optimisticData);\n const state = get();\n // `displayedData` is the current value on screen. It could be the optimistic value\n // that is going to be overridden by a `committedData`, or get reverted back.\n // `committedData` is the validated value that comes from a fetch or mutation.\n const displayedData = state.data;\n const currentData = state._c;\n const committedData = isUndefined(currentData) ? displayedData : currentData;\n // Do optimistic data update.\n if (hasOptimisticData) {\n optimisticData = isFunction(optimisticData) ? optimisticData(committedData, displayedData) : optimisticData;\n // When we set optimistic data, backup the current committedData data in `_c`.\n set({\n data: optimisticData,\n _c: committedData\n });\n }\n if (isFunction(data)) {\n // `data` is a function, call it passing current cache value.\n try {\n data = data(committedData);\n } catch (err) {\n // If it throws an error synchronously, we shouldn't update the cache.\n error = err;\n isError = true;\n }\n }\n // `data` is a promise/thenable, resolve the final data first.\n if (data && isPromiseLike(data)) {\n // This means that the mutation is async, we need to check timestamps to\n // avoid race conditions.\n data = await data.catch((err)=>{\n error = err;\n isError = true;\n });\n // Check if other mutations have occurred since we've started this mutation.\n // If there's a race we don't update cache or broadcast the change,\n // just return the data.\n if (beforeMutationTs !== MUTATION[key][0]) {\n if (isError) throw error;\n return data;\n } else if (isError && hasOptimisticData && rollbackOnError(error)) {\n // Rollback. Always populate the cache in this case but without\n // transforming the data.\n populateCache = true;\n // Reset data to be the latest committed data, and clear the `_c` value.\n set({\n data: committedData,\n _c: UNDEFINED\n });\n }\n }\n // If we should write back the cache after request.\n if (populateCache) {\n if (!isError) {\n // Transform the result into data.\n if (isFunction(populateCache)) {\n const populateCachedData = populateCache(data, committedData);\n set({\n data: populateCachedData,\n error: UNDEFINED,\n _c: UNDEFINED\n });\n } else {\n // Only update cached data and reset the error if there's no error. Data can be `undefined` here.\n set({\n data,\n error: UNDEFINED,\n _c: UNDEFINED\n });\n }\n }\n }\n // Reset the timestamp to mark the mutation has ended.\n MUTATION[key][1] = getTimestamp();\n // Update existing SWR Hooks' internal states:\n Promise.resolve(startRevalidate()).then(()=>{\n // The mutation and revalidation are ended, we can clear it since the data is\n // not an optimistic value anymore.\n set({\n _c: UNDEFINED\n });\n });\n // Throw error or return data\n if (isError) {\n if (throwOnError) throw error;\n return;\n }\n return data;\n }\n}\n\nconst revalidateAllKeys = (revalidators, type)=>{\n for(const key in revalidators){\n if (revalidators[key][0]) revalidators[key][0](type);\n }\n};\nconst initCache = (provider, options)=>{\n // The global state for a specific provider will be used to deduplicate\n // requests and store listeners. As well as a mutate function that is bound to\n // the cache.\n // The provider's global state might be already initialized. Let's try to get the\n // global state associated with the provider first.\n if (!SWRGlobalState.has(provider)) {\n const opts = mergeObjects(defaultConfigOptions, options);\n // If there's no global state bound to the provider, create a new one with the\n // new mutate function.\n const EVENT_REVALIDATORS = Object.create(null);\n const mutate = internalMutate.bind(UNDEFINED, provider);\n let unmount = noop;\n const subscriptions = Object.create(null);\n const subscribe = (key, callback)=>{\n const subs = subscriptions[key] || [];\n subscriptions[key] = subs;\n subs.push(callback);\n return ()=>subs.splice(subs.indexOf(callback), 1);\n };\n const setter = (key, value, prev)=>{\n provider.set(key, value);\n const subs = subscriptions[key];\n if (subs) {\n for (const fn of subs){\n fn(value, prev);\n }\n }\n };\n const initProvider = ()=>{\n if (!SWRGlobalState.has(provider)) {\n // Update the state if it's new, or if the provider has been extended.\n SWRGlobalState.set(provider, [\n EVENT_REVALIDATORS,\n Object.create(null),\n Object.create(null),\n Object.create(null),\n mutate,\n setter,\n subscribe\n ]);\n if (!IS_SERVER) {\n // When listening to the native events for auto revalidations,\n // we intentionally put a delay (setTimeout) here to make sure they are\n // fired after immediate JavaScript executions, which can be\n // React's state updates.\n // This avoids some unnecessary revalidations such as\n // https://github.com/vercel/swr/issues/1680.\n const releaseFocus = opts.initFocus(setTimeout.bind(UNDEFINED, revalidateAllKeys.bind(UNDEFINED, EVENT_REVALIDATORS, revalidateEvents.FOCUS_EVENT)));\n const releaseReconnect = opts.initReconnect(setTimeout.bind(UNDEFINED, revalidateAllKeys.bind(UNDEFINED, EVENT_REVALIDATORS, revalidateEvents.RECONNECT_EVENT)));\n unmount = ()=>{\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n releaseFocus && releaseFocus();\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n releaseReconnect && releaseReconnect();\n // When un-mounting, we need to remove the cache provider from the state\n // storage too because it's a side-effect. Otherwise, when re-mounting we\n // will not re-register those event listeners.\n SWRGlobalState.delete(provider);\n };\n }\n }\n };\n initProvider();\n // This is a new provider, we need to initialize it and setup DOM events\n // listeners for `focus` and `reconnect` actions.\n // We might want to inject an extra layer on top of `provider` in the future,\n // such as key serialization, auto GC, etc.\n // For now, it's just a `Map` interface without any modifications.\n return [\n provider,\n mutate,\n initProvider,\n unmount\n ];\n }\n return [\n provider,\n SWRGlobalState.get(provider)[4]\n ];\n};\n\n// error retry\nconst onErrorRetry = (_, __, config, revalidate, opts)=>{\n const maxRetryCount = config.errorRetryCount;\n const currentRetryCount = opts.retryCount;\n // Exponential backoff\n const timeout = ~~((Math.random() + 0.5) * (1 << (currentRetryCount < 8 ? currentRetryCount : 8))) * config.errorRetryInterval;\n if (!isUndefined(maxRetryCount) && currentRetryCount > maxRetryCount) {\n return;\n }\n setTimeout(revalidate, timeout, opts);\n};\nconst compare = dequal;\n// Default cache provider\nconst [cache, mutate] = initCache(new Map());\n// Default config\nconst defaultConfig = mergeObjects({\n // events\n onLoadingSlow: noop,\n onSuccess: noop,\n onError: noop,\n onErrorRetry,\n onDiscarded: noop,\n // switches\n revalidateOnFocus: true,\n revalidateOnReconnect: true,\n revalidateIfStale: true,\n shouldRetryOnError: true,\n // timeouts\n errorRetryInterval: slowConnection ? 10000 : 5000,\n focusThrottleInterval: 5 * 1000,\n dedupingInterval: 2 * 1000,\n loadingTimeout: slowConnection ? 5000 : 3000,\n // providers\n compare,\n isPaused: ()=>false,\n cache,\n mutate,\n fallback: {}\n}, // use web preset by default\npreset);\n\nconst mergeConfigs = (a, b)=>{\n // Need to create a new object to avoid mutating the original here.\n const v = mergeObjects(a, b);\n // If two configs are provided, merge their `use` and `fallback` options.\n if (b) {\n const { use: u1, fallback: f1 } = a;\n const { use: u2, fallback: f2 } = b;\n if (u1 && u2) {\n v.use = u1.concat(u2);\n }\n if (f1 && f2) {\n v.fallback = mergeObjects(f1, f2);\n }\n }\n return v;\n};\n\nconst SWRConfigContext = createContext({});\nconst SWRConfig = (props)=>{\n const { value } = props;\n const parentConfig = useContext(SWRConfigContext);\n const isFunctionalConfig = isFunction(value);\n const config = useMemo(()=>isFunctionalConfig ? value(parentConfig) : value, [\n isFunctionalConfig,\n parentConfig,\n value\n ]);\n // Extend parent context values and middleware.\n const extendedConfig = useMemo(()=>isFunctionalConfig ? config : mergeConfigs(parentConfig, config), [\n isFunctionalConfig,\n parentConfig,\n config\n ]);\n // Should not use the inherited provider.\n const provider = config && config.provider;\n // initialize the cache only on first access.\n const cacheContextRef = useRef(UNDEFINED);\n if (provider && !cacheContextRef.current) {\n cacheContextRef.current = initCache(provider(extendedConfig.cache || cache), config);\n }\n const cacheContext = cacheContextRef.current;\n // Override the cache if a new provider is given.\n if (cacheContext) {\n extendedConfig.cache = cacheContext[0];\n extendedConfig.mutate = cacheContext[1];\n }\n // Unsubscribe events.\n useIsomorphicLayoutEffect(()=>{\n if (cacheContext) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n cacheContext[2] && cacheContext[2]();\n return cacheContext[3];\n }\n }, []);\n return createElement(SWRConfigContext.Provider, mergeObjects(props, {\n value: extendedConfig\n }));\n};\n\nexport { noop as A, isPromiseLike as B, IS_SERVER as I, OBJECT as O, SWRConfigContext as S, UNDEFINED as U, isFunction as a, SWRGlobalState as b, cache as c, defaultConfig as d, isUndefined as e, mergeConfigs as f, SWRConfig as g, initCache as h, isWindowDefined as i, mutate as j, compare as k, stableHash as l, mergeObjects as m, internalMutate as n, getTimestamp as o, preset as p, defaultConfigOptions as q, IS_REACT_LEGACY as r, serialize as s, rAF as t, useIsomorphicLayoutEffect as u, slowConnection as v, isDocumentDefined as w, isLegacyDeno as x, hasRequestAnimationFrame as y, createCacheHelper as z };\n", "const INFINITE_PREFIX = '$inf$';\n\nexport { INFINITE_PREFIX };\n", "\n", "import { i as isWindowDefined, a as isFunction, S as SWRConfigContext, m as mergeObjects, d as defaultConfig, s as serialize, b as SWRGlobalState, c as cache, e as isUndefined, I as IS_SERVER, f as mergeConfigs } from './config-context-12s-CCVTDPOP.mjs';\nexport { r as IS_REACT_LEGACY, O as OBJECT, g as SWRConfig, U as UNDEFINED, k as compare, z as createCacheHelper, q as defaultConfigOptions, o as getTimestamp, y as hasRequestAnimationFrame, h as initCache, n as internalMutate, w as isDocumentDefined, x as isLegacyDeno, B as isPromiseLike, j as mutate, A as noop, p as preset, t as rAF, v as slowConnection, l as stableHash, u as useIsomorphicLayoutEffect } from './config-context-12s-CCVTDPOP.mjs';\nimport * as revalidateEvents from './events.mjs';\nexport { revalidateEvents };\nimport { INFINITE_PREFIX } from './constants.mjs';\nexport { INFINITE_PREFIX } from './constants.mjs';\nimport React, { useContext, useMemo } from 'react';\nexport * from './types.mjs';\n\n// @ts-expect-error\nconst enableDevtools = isWindowDefined && window.__SWR_DEVTOOLS_USE__;\nconst use = enableDevtools ? window.__SWR_DEVTOOLS_USE__ : [];\nconst setupDevTools = ()=>{\n if (enableDevtools) {\n // @ts-expect-error\n window.__SWR_DEVTOOLS_REACT__ = React;\n }\n};\n\nconst normalize = (args)=>{\n return isFunction(args[1]) ? [\n args[0],\n args[1],\n args[2] || {}\n ] : [\n args[0],\n null,\n (args[1] === null ? args[2] : args[1]) || {}\n ];\n};\n\nconst useSWRConfig = ()=>{\n const parentConfig = useContext(SWRConfigContext);\n const mergedConfig = useMemo(()=>mergeObjects(defaultConfig, parentConfig), [\n parentConfig\n ]);\n return mergedConfig;\n};\n\nconst preload = (key_, fetcher)=>{\n // preload should be a no-op on the server\n if (IS_SERVER) {\n return undefined;\n }\n const [key, fnArg] = serialize(key_);\n const [, , , PRELOAD] = SWRGlobalState.get(cache);\n // Prevent preload to be called multiple times before used.\n if (PRELOAD[key]) return PRELOAD[key];\n const req = fetcher(fnArg);\n PRELOAD[key] = req;\n return req;\n};\nconst middleware = (useSWRNext)=>(key_, fetcher_, config)=>{\n // fetcher might be a sync function, so this should not be an async function\n const fetcher = fetcher_ && ((...args)=>{\n const [key] = serialize(key_);\n const [, , , PRELOAD] = SWRGlobalState.get(cache);\n if (key.startsWith(INFINITE_PREFIX)) {\n // we want the infinite fetcher to be called.\n // handling of the PRELOAD cache happens there.\n return fetcher_(...args);\n }\n const req = PRELOAD[key];\n if (isUndefined(req)) return fetcher_(...args);\n delete PRELOAD[key];\n return req;\n });\n return useSWRNext(key_, fetcher, config);\n };\n\nconst BUILT_IN_MIDDLEWARE = use.concat(middleware);\n\n// It's tricky to pass generic types as parameters, so we just directly override\n// the types here.\nconst withArgs = (hook)=>{\n return function useSWRArgs(...args) {\n // Get the default and inherited configuration.\n const fallbackConfig = useSWRConfig();\n // Normalize arguments.\n const [key, fn, _config] = normalize(args);\n // Merge configurations.\n const config = mergeConfigs(fallbackConfig, _config);\n // Apply middleware\n let next = hook;\n const { use } = config;\n const middleware = (use || []).concat(BUILT_IN_MIDDLEWARE);\n for(let i = middleware.length; i--;){\n next = middleware[i](next);\n }\n return next(key, fn || config.fetcher || null, config);\n };\n};\n\n// Add a callback function to a list of keyed callback functions and return\n// the unsubscribe function.\nconst subscribeCallback = (key, callbacks, callback)=>{\n const keyedRevalidators = callbacks[key] || (callbacks[key] = []);\n keyedRevalidators.push(callback);\n return ()=>{\n const index = keyedRevalidators.indexOf(callback);\n if (index >= 0) {\n // O(1): faster than splice\n keyedRevalidators[index] = keyedRevalidators[keyedRevalidators.length - 1];\n keyedRevalidators.pop();\n }\n };\n};\n\n// Create a custom hook with a middleware\nconst withMiddleware = (useSWR, middleware)=>{\n return (...args)=>{\n const [key, fn, config] = normalize(args);\n const uses = (config.use || []).concat(middleware);\n return useSWR(key, fn, {\n ...config,\n use: uses\n });\n };\n};\n\nsetupDevTools();\n\nexport { IS_SERVER, SWRGlobalState, cache, defaultConfig, isFunction, isUndefined, isWindowDefined, mergeConfigs, mergeObjects, normalize, preload, serialize, subscribeCallback, useSWRConfig, withArgs, withMiddleware };\n", "import React, { useRef, useMemo, useCallback, useDebugValue } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { UNDEFINED as UNDEFINED$1, OBJECT as OBJECT$1, SWRConfig as SWRConfig$1, defaultConfig, withArgs, SWRGlobalState, serialize as serialize$1, createCacheHelper, isUndefined as isUndefined$1, isPromiseLike, IS_SERVER, noop as noop$1, getTimestamp, isFunction as isFunction$1, revalidateEvents, internalMutate, useIsomorphicLayoutEffect, subscribeCallback, rAF, IS_REACT_LEGACY, mergeObjects } from '../_internal/index.mjs';\nexport { mutate, preload, useSWRConfig } from '../_internal/index.mjs';\n\n// Shared state between server components and client components\nconst noop = ()=>{};\n// Using noop() as the undefined value as undefined can be replaced\n// by something else. Prettier ignore and extra parentheses are necessary here\n// to ensure that tsc doesn't remove the __NOINLINE__ comment.\n// prettier-ignore\nconst UNDEFINED = /*#__NOINLINE__*/ noop();\nconst OBJECT = Object;\nconst isUndefined = (v)=>v === UNDEFINED;\nconst isFunction = (v)=>typeof v == 'function';\n\n// use WeakMap to store the object->key mapping\n// so the objects can be garbage collected.\n// WeakMap uses a hashtable under the hood, so the lookup\n// complexity is almost O(1).\nconst table = new WeakMap();\nconst getTypeName = (value)=>OBJECT.prototype.toString.call(value);\nconst isObjectTypeName = (typeName, type)=>typeName === `[object ${type}]`;\n// counter of the key\nlet counter = 0;\n// A stable hash implementation that supports:\n// - Fast and ensures unique hash properties\n// - Handles unserializable values\n// - Handles object key ordering\n// - Generates short results\n//\n// This is not a serialization function, and the result is not guaranteed to be\n// parsable.\nconst stableHash = (arg)=>{\n const type = typeof arg;\n const typeName = getTypeName(arg);\n const isDate = isObjectTypeName(typeName, 'Date');\n const isRegex = isObjectTypeName(typeName, 'RegExp');\n const isPlainObject = isObjectTypeName(typeName, 'Object');\n let result;\n let index;\n if (OBJECT(arg) === arg && !isDate && !isRegex) {\n // Object/function, not null/date/regexp. Use WeakMap to store the id first.\n // If it's already hashed, directly return the result.\n result = table.get(arg);\n if (result) return result;\n // Store the hash first for circular reference detection before entering the\n // recursive `stableHash` calls.\n // For other objects like set and map, we use this id directly as the hash.\n result = ++counter + '~';\n table.set(arg, result);\n if (Array.isArray(arg)) {\n // Array.\n result = '@';\n for(index = 0; index < arg.length; index++){\n result += stableHash(arg[index]) + ',';\n }\n table.set(arg, result);\n }\n if (isPlainObject) {\n // Object, sort keys.\n result = '#';\n const keys = OBJECT.keys(arg).sort();\n while(!isUndefined(index = keys.pop())){\n if (!isUndefined(arg[index])) {\n result += index + ':' + stableHash(arg[index]) + ',';\n }\n }\n table.set(arg, result);\n }\n } else {\n result = isDate ? arg.toJSON() : type == 'symbol' ? arg.toString() : type == 'string' ? JSON.stringify(arg) : '' + arg;\n }\n return result;\n};\n\nconst serialize = (key)=>{\n if (isFunction(key)) {\n try {\n key = key();\n } catch (err) {\n // dependencies not ready\n key = '';\n }\n }\n // Use the original key as the argument of fetcher. This can be a string or an\n // array of values.\n const args = key;\n // If key is not falsy, or not an empty array, hash it.\n key = typeof key == 'string' ? key : (Array.isArray(key) ? key.length : key) ? stableHash(key) : '';\n return [\n key,\n args\n ];\n};\n\nconst unstable_serialize = (key)=>serialize(key)[0];\n\n/// <reference types=\"react/experimental\" />\nconst use = React.use || // This extra generic is to avoid TypeScript mixing up the generic and JSX sytax\n// and emitting an error.\n// We assume that this is only for the `use(thenable)` case, not `use(context)`.\n// https://github.com/facebook/react/blob/aed00dacfb79d17c53218404c52b1c7aa59c4a89/packages/react-server/src/ReactFizzThenable.js#L45\n((thenable)=>{\n switch(thenable.status){\n case 'pending':\n throw thenable;\n case 'fulfilled':\n return thenable.value;\n case 'rejected':\n throw thenable.reason;\n default:\n thenable.status = 'pending';\n thenable.then((v)=>{\n thenable.status = 'fulfilled';\n thenable.value = v;\n }, (e)=>{\n thenable.status = 'rejected';\n thenable.reason = e;\n });\n throw thenable;\n }\n});\nconst WITH_DEDUPE = {\n dedupe: true\n};\nconst resolvedUndef = Promise.resolve(UNDEFINED$1);\nconst sub = ()=>noop$1;\n/**\n * The core implementation of the useSWR hook.\n *\n * This is the main handler function that implements all SWR functionality including\n * data fetching, caching, revalidation, error handling, and state management.\n * It manages the complete lifecycle of SWR requests from initialization through\n * cleanup.\n *\n * Key responsibilities:\n * - Key serialization and normalization\n * - Cache state management and synchronization\n * - Automatic and manual revalidation\n * - Error handling and retry logic\n * - Suspense integration\n * - Loading state management\n * - Effect cleanup and memory management\n *\n * @template Data - The type of data returned by the fetcher\n * @template Error - The type of error that can be thrown\n *\n * @param _key - The SWR key (string, array, object, function, or falsy)\n * @param fetcher - The fetcher function to retrieve data, or null to disable fetching\n * @param config - Complete SWR configuration object with both public and internal options\n *\n * @returns SWRResponse object containing data, error, mutate function, and loading states\n *\n * @internal This is the internal implementation. Use `useSWR` instead.\n */ const useSWRHandler = (_key, fetcher, config)=>{\n const { cache, compare, suspense, fallbackData, revalidateOnMount, revalidateIfStale, refreshInterval, refreshWhenHidden, refreshWhenOffline, keepPreviousData, strictServerPrefetchWarning } = config;\n const [EVENT_REVALIDATORS, MUTATION, FETCH, PRELOAD] = SWRGlobalState.get(cache);\n // `key` is the identifier of the SWR internal state,\n // `fnArg` is the argument/arguments parsed from the key, which will be passed\n // to the fetcher.\n // All of them are derived from `_key`.\n const [key, fnArg] = serialize$1(_key);\n // If it's the initial render of this hook.\n const initialMountedRef = useRef(false);\n // If the hook is unmounted already. This will be used to prevent some effects\n // to be called after unmounting.\n const unmountedRef = useRef(false);\n // Refs to keep the key and config.\n const keyRef = useRef(key);\n const fetcherRef = useRef(fetcher);\n const configRef = useRef(config);\n const getConfig = ()=>configRef.current;\n const isActive = ()=>getConfig().isVisible() && getConfig().isOnline();\n const [getCache, setCache, subscribeCache, getInitialCache] = createCacheHelper(cache, key);\n const stateDependencies = useRef({}).current;\n // Resolve the fallback data from either the inline option, or the global provider.\n // If it's a promise, we simply let React suspend and resolve it for us.\n const fallback = isUndefined$1(fallbackData) ? isUndefined$1(config.fallback) ? UNDEFINED$1 : config.fallback[key] : fallbackData;\n const isEqual = (prev, current)=>{\n for(const _ in stateDependencies){\n const t = _;\n if (t === 'data') {\n if (!compare(prev[t], current[t])) {\n if (!isUndefined$1(prev[t])) {\n return false;\n }\n if (!compare(returnedData, current[t])) {\n return false;\n }\n }\n } else {\n if (current[t] !== prev[t]) {\n return false;\n }\n }\n }\n return true;\n };\n const isInitialMount = !initialMountedRef.current;\n const getSnapshot = useMemo(()=>{\n const cachedData = getCache();\n const initialData = getInitialCache();\n const getSelectedCache = (state)=>{\n // We only select the needed fields from the state.\n const snapshot = mergeObjects(state);\n delete snapshot._k;\n const shouldStartRequest = (()=>{\n if (!key) return false;\n if (!fetcher) return false;\n // If it's paused, we skip revalidation.\n if (getConfig().isPaused()) return false;\n // If `revalidateOnMount` is set, we take the value directly.\n if (isInitialMount && !isUndefined$1(revalidateOnMount)) return revalidateOnMount;\n const data = !isUndefined$1(fallback) ? fallback : snapshot.data;\n if (suspense) return isUndefined$1(data) || revalidateIfStale;\n return isUndefined$1(data) || revalidateIfStale;\n })();\n if (!shouldStartRequest) {\n return snapshot;\n }\n return {\n isValidating: true,\n isLoading: true,\n ...snapshot\n };\n };\n const clientSnapshot = getSelectedCache(cachedData);\n const serverSnapshot = cachedData === initialData ? clientSnapshot : getSelectedCache(initialData);\n // To make sure that we are returning the same object reference to avoid\n // unnecessary re-renders, we keep the previous snapshot and use deep\n // comparison to check if we need to return a new one.\n let memorizedSnapshot = clientSnapshot;\n return [\n ()=>{\n const newSnapshot = getSelectedCache(getCache());\n const compareResult = isEqual(newSnapshot, memorizedSnapshot);\n if (compareResult) {\n // Mentally, we should always return the `memorizedSnapshot` here\n // as there's no change between the new and old snapshots.\n // However, since the `isEqual` function only compares selected fields,\n // the values of the unselected fields might be changed. That's\n // simply because we didn't track them.\n // To support the case in https://github.com/vercel/swr/pull/2576,\n // we need to update these fields in the `memorizedSnapshot` too\n // with direct mutations to ensure the snapshot is always up-to-date\n // even for the unselected fields, but only trigger re-renders when\n // the selected fields are changed.\n memorizedSnapshot.data = newSnapshot.data;\n memorizedSnapshot.isLoading = newSnapshot.isLoading;\n memorizedSnapshot.isValidating = newSnapshot.isValidating;\n memorizedSnapshot.error = newSnapshot.error;\n return memorizedSnapshot;\n } else {\n memorizedSnapshot = newSnapshot;\n return newSnapshot;\n }\n },\n ()=>serverSnapshot\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n cache,\n key\n ]);\n // Get the current state that SWR should return.\n const cached = useSyncExternalStore(useCallback((callback)=>subscribeCache(key, (current, prev)=>{\n if (!isEqual(prev, current)) callback();\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n cache,\n key\n ]), getSnapshot[0], getSnapshot[1]);\n const hasRevalidator = EVENT_REVALIDATORS[key] && EVENT_REVALIDATORS[key].length > 0;\n const cachedData = cached.data;\n const data = isUndefined$1(cachedData) ? fallback && isPromiseLike(fallback) ? use(fallback) : fallback : cachedData;\n const error = cached.error;\n // Use a ref to store previously returned data. Use the initial data as its initial value.\n const laggyDataRef = useRef(data);\n const returnedData = keepPreviousData ? isUndefined$1(cachedData) ? isUndefined$1(laggyDataRef.current) ? data : laggyDataRef.current : cachedData : data;\n const hasKeyButNoData = key && isUndefined$1(data);\n const hydrationRef = useRef(null);\n // Note: the conditionally hook call is fine because the environment\n // `IS_SERVER` never changes.\n // @ts-expect-error -- use hydrationRef directly\n !IS_SERVER && // getServerSnapshot is only called during hydration\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSyncExternalStore(sub, ()=>{\n hydrationRef.current = false;\n return hydrationRef;\n }, ()=>{\n hydrationRef.current = true;\n return hydrationRef;\n });\n const isHydration = hydrationRef.current;\n // During the initial SSR render, warn if the key has no data pre-fetched via:\n // - fallback data\n // - preload calls\n // - initial data from the cache provider\n // We only warn once for each key during Hydration.\n if (strictServerPrefetchWarning && isHydration && !suspense && hasKeyButNoData) {\n console.warn(`Missing pre-initiated data for serialized key \"${key}\" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set \"strictServerPrefetchWarning: false\" to disable this warning.`);\n }\n // Resolve the default validating state:\n // If it's able to validate, and it should revalidate when mount, this will be true.\n // - Suspense mode and there's stale data for the initial render.\n // - Not suspense mode and there is no fallback data and `revalidateIfStale` is enabled.\n // - `revalidateIfStale` is enabled but `data` is not defined.\n const shouldDoInitialRevalidation = (()=>{\n if (!key || !fetcher) return false;\n // If it's paused, we skip revalidation.\n if (getConfig().isPaused()) return false;\n // if a key already has revalidators and also has error, we should not trigger revalidation\n if (hasRevalidator && !isUndefined$1(error)) return false;\n // If `revalidateOnMount` is set, we take the value directly.\n if (isInitialMount && !isUndefined$1(revalidateOnMount)) return revalidateOnMount;\n // Under suspense mode, it will always fetch on render if there is no\n // stale data so no need to revalidate immediately mount it again.\n // If data exists, only revalidate if `revalidateIfStale` is true.\n if (suspense) return isUndefined$1(data) ? false : revalidateIfStale;\n // If there is no stale data, we need to revalidate when mount;\n // If `revalidateIfStale` is set to true, we will always revalidate.\n return isUndefined$1(data) || revalidateIfStale;\n })();\n const defaultValidatingState = isInitialMount && shouldDoInitialRevalidation;\n const isValidating = isUndefined$1(cached.isValidating) ? defaultValidatingState : cached.isValidating;\n const isLoading = isUndefined$1(cached.isLoading) ? defaultValidatingState : cached.isLoading;\n // The revalidation function is a carefully crafted wrapper of the original\n // `fetcher`, to correctly handle the many edge cases.\n const revalidate = useCallback(async (revalidateOpts)=>{\n const currentFetcher = fetcherRef.current;\n if (!key || !currentFetcher || unmountedRef.current || getConfig().isPaused()) {\n return false;\n }\n let newData;\n let startAt;\n let loading = true;\n const opts = revalidateOpts || {};\n // If there is no ongoing concurrent request, or `dedupe` is not set, a\n // new request should be initiated.\n const shouldStartNewRequest = !FETCH[key] || !opts.dedupe;\n /*\n For React 17\n Do unmount check for calls:\n If key has changed during the revalidation, or the component has been\n unmounted, old dispatch and old event callbacks should not take any\n effect\n\n For React 18\n only check if key has changed\n https://github.com/reactwg/react-18/discussions/82\n */ const callbackSafeguard = ()=>{\n if (IS_REACT_LEGACY) {\n return !unmountedRef.current && key === keyRef.current && initialMountedRef.current;\n }\n return key === keyRef.current;\n };\n // The final state object when the request finishes.\n const finalState = {\n isValidating: false,\n isLoading: false\n };\n const finishRequestAndUpdateState = ()=>{\n setCache(finalState);\n };\n const cleanupState = ()=>{\n // Check if it's still the same request before deleting it.\n const requestInfo = FETCH[key];\n if (requestInfo && requestInfo[1] === startAt) {\n delete FETCH[key];\n }\n };\n // Start fetching. Change the `isValidating` state, update the cache.\n const initialState = {\n isValidating: true\n };\n // It is in the `isLoading` state, if and only if there is no cached data.\n // This bypasses fallback data and laggy data.\n if (isUndefined$1(getCache().data)) {\n initialState.isLoading = true;\n }\n try {\n if (shouldStartNewRequest) {\n setCache(initialState);\n // If no cache is being rendered currently (it shows a blank page),\n // we trigger the loading slow event.\n if (config.loadingTimeout && isUndefined$1(getCache().data)) {\n setTimeout(()=>{\n if (loading && callbackSafeguard()) {\n getConfig().onLoadingSlow(key, config);\n }\n }, config.loadingTimeout);\n }\n // Start the request and save the timestamp.\n // Key must be truthy if entering here.\n FETCH[key] = [\n currentFetcher(fnArg),\n getTimestamp()\n ];\n }\n // Wait until the ongoing request is done. Deduplication is also\n // considered here.\n ;\n [newData, startAt] = FETCH[key];\n newData = await newData;\n if (shouldStartNewRequest) {\n // If the request isn't interrupted, clean it up after the\n // deduplication interval.\n setTimeout(cleanupState, config.dedupingInterval);\n }\n // If there're other ongoing request(s), started after the current one,\n // we need to ignore the current one to avoid possible race conditions:\n // req1------------------>res1 (current one)\n // req2---------------->res2\n // the request that fired later will always be kept.\n // The timestamp maybe be `undefined` or a number\n if (!FETCH[key] || FETCH[key][1] !== startAt) {\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onDiscarded(key);\n }\n }\n return false;\n }\n // Clear error.\n finalState.error = UNDEFINED$1;\n // If there're other mutations(s), that overlapped with the current revalidation:\n // case 1:\n // req------------------>res\n // mutate------>end\n // case 2:\n // req------------>res\n // mutate------>end\n // case 3:\n // req------------------>res\n // mutate-------...---------->\n // we have to ignore the revalidation result (res) because it's no longer fresh.\n // meanwhile, a new revalidation should be triggered when the mutation ends.\n const mutationInfo = MUTATION[key];\n if (!isUndefined$1(mutationInfo) && // case 1\n (startAt <= mutationInfo[0] || // case 2\n startAt <= mutationInfo[1] || // case 3\n mutationInfo[1] === 0)) {\n finishRequestAndUpdateState();\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onDiscarded(key);\n }\n }\n return false;\n }\n // Deep compare with the latest state to avoid extra re-renders.\n // For local state, compare and assign.\n const cacheData = getCache().data;\n // Since the compare fn could be custom fn\n // cacheData might be different from newData even when compare fn returns True\n finalState.data = compare(cacheData, newData) ? cacheData : newData;\n // Trigger the successful callback if it's the original request.\n if (shouldStartNewRequest) {\n if (callbackSafeguard()) {\n getConfig().onSuccess(newData, key, config);\n }\n }\n } catch (err) {\n cleanupState();\n const currentConfig = getConfig();\n const { shouldRetryOnError } = currentConfig;\n // Not paused, we continue handling the error. Otherwise, discard it.\n if (!currentConfig.isPaused()) {\n // Get a new error, don't use deep comparison for errors.\n finalState.error = err;\n // Error event and retry logic. Only for the actual request, not\n // deduped ones.\n if (shouldStartNewRequest && callbackSafeguard()) {\n currentConfig.onError(err, key, currentConfig);\n if (shouldRetryOnError === true || isFunction$1(shouldRetryOnError) && shouldRetryOnError(err)) {\n if (!getConfig().revalidateOnFocus || !getConfig().revalidateOnReconnect || isActive()) {\n // If it's inactive, stop. It will auto-revalidate when\n // refocusing or reconnecting.\n // When retrying, deduplication is always enabled.\n currentConfig.onErrorRetry(err, key, currentConfig, (_opts)=>{\n const revalidators = EVENT_REVALIDATORS[key];\n if (revalidators && revalidators[0]) {\n revalidators[0](revalidateEvents.ERROR_REVALIDATE_EVENT, _opts);\n }\n }, {\n retryCount: (opts.retryCount || 0) + 1,\n dedupe: true\n });\n }\n }\n }\n }\n }\n // Mark loading as stopped.\n loading = false;\n // Update the current hook's state.\n finishRequestAndUpdateState();\n return true;\n }, // `setState` is immutable, and `eventsCallback`, `fnArg`, and\n // `keyValidating` are depending on `key`, so we can exclude them from\n // the deps array.\n //\n // FIXME:\n // `fn` and `config` might be changed during the lifecycle,\n // but they might be changed every render like this.\n // `useSWR('key', () => fetch('/api/'), { suspense: true })`\n // So we omit the values from the deps array\n // even though it might cause unexpected behaviors.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n key,\n cache\n ]);\n // Similar to the global mutate but bound to the current cache and key.\n // `cache` isn't allowed to change during the lifecycle.\n const boundMutate = useCallback(// Use callback to make sure `keyRef.current` returns latest result every time\n (...args)=>{\n return internalMutate(cache, keyRef.current, ...args);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n []);\n // The logic for updating refs.\n useIsomorphicLayoutEffect(()=>{\n fetcherRef.current = fetcher;\n configRef.current = config;\n // Handle laggy data updates. If there's cached data of the current key,\n // it'll be the correct reference.\n if (!isUndefined$1(cachedData)) {\n laggyDataRef.current = cachedData;\n }\n });\n // After mounted or key changed.\n useIsomorphicLayoutEffect(()=>{\n if (!key) return;\n const softRevalidate = revalidate.bind(UNDEFINED$1, WITH_DEDUPE);\n let nextFocusRevalidatedAt = 0;\n if (getConfig().revalidateOnFocus) {\n const initNow = Date.now();\n nextFocusRevalidatedAt = initNow + getConfig().focusThrottleInterval;\n }\n // Expose revalidators to global event listeners. So we can trigger\n // revalidation from the outside.\n const onRevalidate = (type, opts = {})=>{\n if (type == revalidateEvents.FOCUS_EVENT) {\n const now = Date.now();\n if (getConfig().revalidateOnFocus && now > nextFocusRevalidatedAt && isActive()) {\n nextFocusRevalidatedAt = now + getConfig().focusThrottleInterval;\n softRevalidate();\n }\n } else if (type == revalidateEvents.RECONNECT_EVENT) {\n if (getConfig().revalidateOnReconnect && isActive()) {\n softRevalidate();\n }\n } else if (type == revalidateEvents.MUTATE_EVENT) {\n return revalidate();\n } else if (type == revalidateEvents.ERROR_REVALIDATE_EVENT) {\n return revalidate(opts);\n }\n return;\n };\n const unsubEvents = subscribeCallback(key, EVENT_REVALIDATORS, onRevalidate);\n // Mark the component as mounted and update corresponding refs.\n unmountedRef.current = false;\n keyRef.current = key;\n initialMountedRef.current = true;\n // Keep the original key in the cache.\n setCache({\n _k: fnArg\n });\n // Trigger a revalidation\n if (shouldDoInitialRevalidation) {\n // Performance optimization: if a request is already in progress for this key,\n // skip the revalidation to avoid redundant work\n if (!FETCH[key]) {\n if (isUndefined$1(data) || IS_SERVER) {\n // Revalidate immediately.\n softRevalidate();\n } else {\n // Delay the revalidate if we have data to return so we won't block\n // rendering.\n rAF(softRevalidate);\n }\n }\n }\n return ()=>{\n // Mark it as unmounted.\n unmountedRef.current = true;\n unsubEvents();\n };\n }, [\n key\n ]);\n // Polling\n useIsomorphicLayoutEffect(()=>{\n let timer;\n function next() {\n // Use the passed interval\n // ...or invoke the function with the updated data to get the interval\n const interval = isFunction$1(refreshInterval) ? refreshInterval(getCache().data) : refreshInterval;\n // We only start the next interval if `refreshInterval` is not 0, and:\n // - `force` is true, which is the start of polling\n // - or `timer` is not 0, which means the effect wasn't canceled\n if (interval && timer !== -1) {\n timer = setTimeout(execute, interval);\n }\n }\n function execute() {\n // Check if it's OK to execute:\n // Only revalidate when the page is visible, online, and not errored.\n if (!getCache().error && (refreshWhenHidden || getConfig().isVisible()) && (refreshWhenOffline || getConfig().isOnline())) {\n revalidate(WITH_DEDUPE).then(next);\n } else {\n // Schedule the next interval to check again.\n next();\n }\n }\n next();\n return ()=>{\n if (timer) {\n clearTimeout(timer);\n timer = -1;\n }\n };\n }, [\n refreshInterval,\n refreshWhenHidden,\n refreshWhenOffline,\n key\n ]);\n // Display debug info in React DevTools.\n useDebugValue(returnedData);\n // In Suspense mode, we can't return the empty `data` state.\n // If there is an `error`, the `error` needs to be thrown to the error boundary.\n // If there is no `error`, the `revalidation` promise needs to be thrown to\n // the suspense boundary.\n if (suspense) {\n // SWR should throw when trying to use Suspense on the server with React 18,\n // without providing any fallback data. This causes hydration errors. See:\n // https://github.com/vercel/swr/issues/1832\n if (!IS_REACT_LEGACY && IS_SERVER && hasKeyButNoData) {\n throw new Error('Fallback data is required when using Suspense in SSR.');\n }\n // Always update fetcher and config refs even with the Suspense mode.\n if (hasKeyButNoData) {\n fetcherRef.current = fetcher;\n configRef.current = config;\n unmountedRef.current = false;\n }\n const req = PRELOAD[key];\n const mutateReq = !isUndefined$1(req) && hasKeyButNoData ? boundMutate(req) : resolvedUndef;\n use(mutateReq);\n if (!isUndefined$1(error) && hasKeyButNoData) {\n throw error;\n }\n const revalidation = hasKeyButNoData ? revalidate(WITH_DEDUPE) : resolvedUndef;\n if (!isUndefined$1(returnedData) && hasKeyButNoData) {\n // @ts-ignore modify react promise status\n revalidation.status = 'fulfilled';\n // @ts-ignore modify react promise value\n revalidation.value = true;\n }\n use(revalidation);\n }\n const swrResponse = {\n mutate: boundMutate,\n get data () {\n stateDependencies.data = true;\n return returnedData;\n },\n get error () {\n stateDependencies.error = true;\n return error;\n },\n get isValidating () {\n stateDependencies.isValidating = true;\n return isValidating;\n },\n get isLoading () {\n stateDependencies.isLoading = true;\n return isLoading;\n }\n };\n return swrResponse;\n};\nconst SWRConfig = OBJECT$1.defineProperty(SWRConfig$1, 'defaultValue', {\n value: defaultConfig\n});\n/**\n * A hook to fetch data.\n *\n * @see {@link https://swr.vercel.app}\n *\n * @example\n * ```jsx\n * import useSWR from 'swr'\n * function Profile() {\n * const { data, error, isLoading } = useSWR('/api/user', fetcher)\n * if (error) return <div>failed to load</div>\n * if (isLoading) return <div>loading...</div>\n * return <div>hello {data.name}!</div>\n * }\n * ```\n */ const useSWR = withArgs(useSWRHandler);\n\n// useSWR\n\nexport { SWRConfig, useSWR as default, unstable_serialize };\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25\"\n}), 'Help');", "import React from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n Divider,\n Typography,\n} from '@mui/material'\n\nimport type { TypographyProps } from '@mui/material'\n\nfunction Typography2({ children }: TypographyProps) {\n return <Typography style={{ margin: 4 }}>{children}</Typography>\n}\nexport default function HelpDialog({\n handleClose,\n}: {\n handleClose: () => void\n}) {\n return (\n <Dialog open maxWidth=\"lg\" onClose={handleClose} title=\"Help\">\n <DialogContent>\n <Typography2>\n The procedure for the protein lookup is as follows:\n <ul>\n <li>\n (Automatic lookup) Searches UniProt for the transcript ID or gene\n name to retrieve the UniProt ID, which is then used to lookup the\n structure in AlphaFoldDB\n </li>\n <li>\n (Manual) Allows you to choose your own structure file from your\n local machine (e.g. a PDB file predicted by e.g. ColabFold) or\n supply a specific URL\n </li>\n <li>\n The residues from the structure are downloaded, and then you can\n choose the transcript isoform from the selected gene that best\n represents the structure. Asterisks are displayed if there is an\n exact sequence match\n </li>\n <li>\n The residues from the structure are finally aligned to the to the\n selected transcript's protein sequence representation, and\n this creates a mapping from the reference genome coordinates to\n positions in the 3-D structure\n </li>\n <li>\n Finally the molstar panel is opened, and this contains many\n specialized features features, plus additional mouseover and\n selection features supplied by the plugin to connect mouse click\n actions and mouse hover with coordinates on the linear genome view\n </li>\n </ul>\n </Typography2>\n <Typography2>\n If you run into challenges with this workflow e.g. your transcripts\n are not being found in UniProt then you can use the Manual import\n form, or contact colin.diesh@gmail.com for troubleshooting\n </Typography2>\n </DialogContent>\n <Divider />\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n", "module.exports = JBrowseExports[\"@jbrowse/core/pluggableElementTypes\"];", "module.exports = JBrowseExports[\"@jbrowse/core/util/types/mst\"];", "module.exports = JBrowseExports[\"mobx-state-tree\"];", "import type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { ColorTheme } from 'molstar/lib/mol-theme/color'\n\n/**\n * Color schemes offered in the protein view menu. The `value`s are molstar\n * color-theme names: all are built-in except `plddt-confidence`, which is\n * registered by the MAQualityAssessment behavior (see useProteinView) and reads\n * the per-residue pLDDT scores parsed from AlphaFold mmCIF files.\n */\nexport const COLOR_SCHEMES = [\n { value: 'default', label: 'Default (element/chain)' },\n { value: 'plddt-confidence', label: 'pLDDT confidence (AlphaFold)' },\n { value: 'chain-id', label: 'Chain' },\n { value: 'secondary-structure', label: 'Secondary structure' },\n { value: 'hydrophobicity', label: 'Hydrophobicity (Kyte-Doolittle)' },\n { value: 'residue-name', label: 'Residue type' },\n { value: 'uncertainty', label: 'B-factor / uncertainty' },\n { value: 'molecule-type', label: 'Molecule type' },\n] as const\n\nexport type ProteinColorScheme = (typeof COLOR_SCHEMES)[number]['value']\n\nexport const COLOR_SCHEME_VALUES = COLOR_SCHEMES.map(s => s.value)\n\nexport async function applyColorTheme({\n plugin,\n colorScheme,\n}: {\n plugin: PluginContext\n colorScheme: ProteinColorScheme\n}) {\n const { structures } = plugin.managers.structure.hierarchy.current\n for (const structure of structures) {\n // molstar types `color` against its statically-generated built-in theme\n // union, which excludes extension themes like 'plddt-confidence'. Its own\n // API doc says to widen the name here; ProteinColorScheme keeps it\n // constrained to schemes we actually expose.\n await plugin.managers.structure.component.updateRepresentationsTheme(\n structure.components,\n { color: colorScheme as ColorTheme.BuiltIn | 'default' },\n )\n }\n}\n", "import loadMolstar from './loadMolstar'\nimport { getMolstarStructureSelection } from './util'\n\nimport type {\n Structure,\n StructureElement,\n} from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype InteractivityMode = 'highlight' | 'select' | 'clear'\n\nfunction clearLoci(plugin: PluginContext) {\n plugin.managers.interactivity.lociHighlights.clearHighlights()\n plugin.managers.interactivity.lociSelects.deselectAll()\n}\n\nfunction applyLoci(\n plugin: PluginContext,\n loci: StructureElement.Loci,\n mode: 'highlight' | 'select',\n) {\n if (mode === 'highlight') {\n plugin.managers.interactivity.lociHighlights.clearHighlights()\n plugin.managers.interactivity.lociHighlights.highlight({ loci })\n } else {\n plugin.managers.interactivity.lociSelects.deselectAll()\n plugin.managers.interactivity.lociSelects.select({ loci })\n }\n}\n\nexport async function applyLociInteractivityMultiple({\n structure,\n residues,\n plugin,\n mode,\n}: {\n structure: Structure\n residues: number[]\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear' || residues.length === 0) {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection, Script } = await loadMolstar()\n\n const sel = Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.logic.or(\n residues.map(residue =>\n Q.core.rel.eq([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n residue,\n ]),\n ),\n ),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n\nexport async function applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear') {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection, Script } = await loadMolstar()\n const sel = Script.getStructureSelection(\n Q =>\n Q.struct.generator.atomGroups({\n 'residue-test': Q.core.logic.and([\n Q.core.rel.gre([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n startResidue,\n ]),\n Q.core.rel.lte([\n Q.struct.atomProperty.macromolecular.label_seq_id(),\n endResidue,\n ]),\n ]),\n 'group-by': Q.struct.atomProperty.macromolecular.residueKey(),\n }),\n structure,\n )\n\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n\nexport async function applyLociInteractivitySingle({\n structure,\n selectedResidue,\n plugin,\n mode,\n}: {\n structure: Structure\n selectedResidue: number\n plugin: PluginContext\n mode: InteractivityMode\n}) {\n if (mode === 'clear') {\n clearLoci(plugin)\n return\n }\n\n const { StructureSelection } = await loadMolstar()\n const sel = await getMolstarStructureSelection({\n structure,\n selectedResidue: selectedResidue + 1,\n })\n const loci = StructureSelection.toLociWithSourceUnits(sel)\n applyLoci(plugin, loci, mode)\n}\n", "export const CHAR_WIDTH = 6\nexport const ROW_HEIGHT = 14\nexport const COMPACT_TRACK_HEIGHT = 8\nexport const COMPACT_TRACK_GAP = 1\nexport const NORMAL_TRACK_HEIGHT = 12\nexport const NORMAL_TRACK_GAP = 2\nexport const LABEL_WIDTH = 50\n\nexport const HOVER_MARKER_COLOR = 'rgba(255, 105, 180, 0.5)'\nexport const SELECTED_BORDER = '2px solid #333'\nexport const HOVERED_BORDER = '1px solid black'\nexport const HIDE_BUTTON_COLOR = '#999'\n", "import { applyLociInteractivity } from './applyLociInteractivity'\n\nimport type { Structure } from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport default async function highlightResidueRange({\n structure,\n startResidue,\n endResidue,\n plugin,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n}) {\n await applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode: 'highlight',\n })\n}\n\nexport async function selectResidueRange({\n structure,\n startResidue,\n endResidue,\n plugin,\n}: {\n structure: Structure\n startResidue: number\n endResidue: number\n plugin: PluginContext\n}) {\n await applyLociInteractivity({\n structure,\n startResidue,\n endResidue,\n plugin,\n mode: 'select',\n })\n}\n", "import { getSession } from '@jbrowse/core/util'\nimport { getCodonRange } from 'g2p_mapper'\n\nimport type { PairwiseAlignment } from '../mappings'\nimport type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ninterface GenomeToTranscriptSeqMapping {\n p2g: Record<number, number>\n strand: number\n refName: string\n}\n\n/**\n * Minimal model shape needed to map structure positions to genome coords.\n */\ninterface ProteinGenomeMappingModel {\n genomeToTranscriptSeqMapping: GenomeToTranscriptSeqMapping | undefined\n pairwiseAlignment: PairwiseAlignment | undefined\n structureSeqToTranscriptSeqPosition: Record<number, number> | undefined\n}\n\ntype NavigateToProteinPositionModel = IAnyStateTreeNode &\n ProteinGenomeMappingModel & {\n connectedView: LinearGenomeViewModel | undefined\n }\n\ntype ClickProteinToGenomeModel = NavigateToProteinPositionModel & {\n zoomToBaseLevel: boolean\n setClickedStructureRange: (range?: { start: number; end: number }) => void\n}\n\n/**\n * Maps a protein structure position to genome coordinates\n * @returns [start, end] tuple of genome coordinates, or undefined if mapping fails\n */\nexport function proteinToGenomeMapping({\n model,\n structureSeqPos,\n}: {\n structureSeqPos: number\n model: ProteinGenomeMappingModel\n}) {\n const {\n genomeToTranscriptSeqMapping,\n pairwiseAlignment,\n structureSeqToTranscriptSeqPosition,\n } = model\n\n if (!genomeToTranscriptSeqMapping || !pairwiseAlignment) {\n return undefined\n }\n\n const { p2g, strand } = genomeToTranscriptSeqMapping\n const transcriptPos = structureSeqToTranscriptSeqPosition?.[structureSeqPos]\n\n if (transcriptPos === undefined) {\n return undefined\n }\n\n return getCodonRange(p2g, transcriptPos, strand)\n}\n\n/**\n * Maps a protein structure range to genome coordinates\n * @returns [start, end] tuple of genome coordinates spanning the full range, or undefined if mapping fails\n */\nexport function proteinRangeToGenomeMapping({\n model,\n structureSeqPos,\n structureSeqEndPos,\n}: {\n structureSeqPos: number\n structureSeqEndPos: number\n model: ProteinGenomeMappingModel\n}) {\n let minStart: number | undefined\n let maxEnd: number | undefined\n for (let pos = structureSeqPos; pos < structureSeqEndPos; pos++) {\n const result = proteinToGenomeMapping({ structureSeqPos: pos, model })\n if (result) {\n const [s, e] = result\n if (minStart === undefined || s < minStart) {\n minStart = s\n }\n if (maxEnd === undefined || e > maxEnd) {\n maxEnd = e\n }\n }\n }\n if (minStart !== undefined && maxEnd !== undefined) {\n return [minStart, maxEnd] as const\n }\n return undefined\n}\n\nexport async function navigateToProteinPosition({\n model,\n structureSeqPos,\n structureSeqEndPos,\n zoomToBaseLevel,\n}: {\n structureSeqPos: number\n structureSeqEndPos?: number\n model: NavigateToProteinPositionModel\n zoomToBaseLevel: boolean\n}) {\n const session = getSession(model)\n const { connectedView, genomeToTranscriptSeqMapping } = model\n if (!genomeToTranscriptSeqMapping || !connectedView) {\n return\n }\n const { strand, refName } = genomeToTranscriptSeqMapping\n const assemblyName = connectedView.assemblyNames[0]\n if (!assemblyName) {\n return\n }\n\n const result =\n structureSeqEndPos !== undefined\n ? proteinRangeToGenomeMapping({\n structureSeqPos,\n structureSeqEndPos,\n model,\n })\n : proteinToGenomeMapping({ structureSeqPos, model })\n\n if (!result) {\n return\n }\n const [start, end] = result\n\n if (zoomToBaseLevel) {\n await connectedView.navToLocString(\n `${refName}:${start}-${end}${strand === -1 ? '[rev]' : ''}`,\n undefined,\n 0.2,\n )\n } else {\n const { assemblyManager } = session\n const assembly = assemblyManager.get(assemblyName)\n const canonicalRefName = assembly?.getCanonicalRefName(refName) ?? refName\n connectedView.centerAt(start, canonicalRefName)\n }\n}\n\nexport async function clickProteinToGenome({\n model,\n structureSeqPos,\n structureSeqEndPos,\n}: {\n structureSeqPos: number\n structureSeqEndPos?: number\n model: ClickProteinToGenomeModel\n}) {\n model.setClickedStructureRange({\n start: structureSeqPos,\n end: structureSeqEndPos ?? structureSeqPos + 1,\n })\n await navigateToProteinPosition({\n model,\n structureSeqPos,\n structureSeqEndPos,\n zoomToBaseLevel: model.zoomToBaseLevel,\n })\n}\n", "// Kyte-Doolittle hydropathy index. Positive = hydrophobic, negative =\n// hydrophilic. Residues absent from the table (X, gaps, non-standard) map to\n// undefined so they render as gaps in the track.\nconst KYTE_DOOLITTLE: Record<string, number> = {\n I: 4.5,\n V: 4.2,\n L: 3.8,\n F: 2.8,\n C: 2.5,\n M: 1.9,\n A: 1.8,\n G: -0.4,\n T: -0.7,\n S: -0.8,\n W: -0.9,\n Y: -1.3,\n P: -1.6,\n H: -3.2,\n E: -3.5,\n Q: -3.5,\n D: -3.5,\n N: -3.5,\n K: -3.9,\n R: -4.5,\n}\n\nexport const KYTE_DOOLITTLE_MIN = -4.5\nexport const KYTE_DOOLITTLE_MAX = 4.5\n\nexport function kyteDoolittleScores(seq: string): (number | undefined)[] {\n return Array.from(seq, aa => KYTE_DOOLITTLE[aa])\n}\n\n/**\n * AlphaFold pLDDT confidence palette (matches molstar's plddt-confidence\n * color theme): very low (<=50) orange, low (<=70) yellow, confident (<=90)\n * light blue, very high (>90) blue.\n */\nexport function plddtColor(score: number): string {\n return score < 0\n ? '#cccccc'\n : score <= 50\n ? '#ff7d45'\n : score <= 70\n ? '#ffdb13'\n : score <= 90\n ? '#65cbf3'\n : '#0053d6'\n}\n\n/**\n * Diverging hydrophobicity color: hydrophobic (high Kyte-Doolittle) toward\n * orange, hydrophilic (low) toward blue, near-neutral white.\n */\nexport function hydrophobicityColor(score: number): string {\n const t = Math.max(\n 0,\n Math.min(\n 1,\n (score - KYTE_DOOLITTLE_MIN) / (KYTE_DOOLITTLE_MAX - KYTE_DOOLITTLE_MIN),\n ),\n )\n // t=0 hydrophilic (blue 51,102,204) -> t=1 hydrophobic (orange 230,140,40)\n const r = Math.round(51 + (230 - 51) * t)\n const g = Math.round(102 + (140 - 102) * t)\n const b = Math.round(204 + (40 - 204) * t)\n return `rgb(${r}, ${g}, ${b})`\n}\n\n/**\n * Maps per-structure-residue values (indexed by 0-based structure sequence\n * position) onto alignment columns via structurePositionToAlignmentMap.\n * Residues with no value or no alignment column (gaps) are dropped.\n */\nexport function mapResidueValuesToColumns(\n values: (number | undefined)[],\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n): { col: number; value: number }[] {\n return structurePositionToAlignmentMap\n ? values.flatMap((value, structurePos) => {\n const col = structurePositionToAlignmentMap[structurePos]\n return value !== undefined && col !== undefined ? [{ col, value }] : []\n })\n : []\n}\n", "import React, { useState } from 'react'\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n Typography,\n} from '@mui/material'\nimport { parsePairwise } from 'clustal-js'\nimport { observer } from 'mobx-react'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst ManualAlignmentDialog = observer(function ManualAlignmentDialog({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [alignment, setAlignment] = useState('')\n const [parseError, setParseError] = useState<string>()\n const { showManualAlignmentDialog, primaryStructure } = model\n\n const handleClose = () => {\n setAlignment('')\n setParseError(undefined)\n model.setShowManualAlignmentDialog(false)\n }\n\n const handleApply = () => {\n if (!alignment.trim()) {\n return\n }\n try {\n const parsed = parsePairwise(alignment.trim())\n if (!primaryStructure) {\n setParseError('No structure loaded to apply alignment to')\n return\n }\n primaryStructure.setAlignment(parsed)\n handleClose()\n } catch (e) {\n setParseError(`Failed to parse alignment: ${e}`)\n }\n }\n\n if (!showManualAlignmentDialog) {\n return null\n }\n\n return (\n <Dialog open onClose={handleClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Import Manual Alignment</DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Paste a pre-computed alignment in Clustal format. The first sequence\n should be the transcript and the second should be the structure.\n </Typography>\n <TextField\n multiline\n rows={12}\n fullWidth\n placeholder={`Example:\ntranscript MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG\n |||||||||||||||||||||||||||||||||||||\nstructure MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG`}\n value={alignment}\n onChange={e => {\n setAlignment(e.target.value)\n setParseError(undefined)\n }}\n slotProps={{\n htmlInput: { style: { fontFamily: 'monospace', fontSize: 12 } },\n }}\n />\n {parseError ? (\n <Typography color=\"error\" variant=\"body2\" sx={{ mt: 1 }}>\n {parseError}\n </Typography>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose}>Cancel</Button>\n <Button\n onClick={handleApply}\n variant=\"contained\"\n color=\"primary\"\n disabled={!alignment.trim()}\n >\n Apply Alignment\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default ManualAlignmentDialog\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 17v2h6v-2zM3 5v2h10V5zm10 16v-2h8v-2h-8v-2h-2v6zM7 9v2H3v2h4v2h2V9zm14 4v-2H11v2zm-6-4h2V7h4V5h-4V3h-2z\"\n}), 'Tune');", "module.exports = JBrowseExports[\"@mui/material/Checkbox\"];", "module.exports = JBrowseExports[\"@mui/material/IconButton\"];", "module.exports = JBrowseExports[\"@mui/material/ListItemIcon\"];", "module.exports = JBrowseExports[\"@mui/material/ListItemText\"];", "module.exports = JBrowseExports[\"@mui/material/Menu\"];", "module.exports = JBrowseExports[\"@mui/material/MenuItem\"];", "module.exports = JBrowseExports[\"@mui/material/TextField\"];", "module.exports = JBrowseExports[\"@mui/material/Tooltip\"];", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport {\n getAlphaFoldStructureUrl,\n getPdbStructureUrl,\n} from '../../LaunchProteinView/utils/launchViewUtils'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst AddStructureDialog = observer(function AddStructureDialog({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [file, setFile] = useState<File>()\n const [pdbId, setPdbId] = useState('')\n const [uniprotId, setUniprotId] = useState('')\n const [choice, setChoice] = useState('pdb')\n const [structureURL, setStructureURL] = useState('')\n const [error, setError] = useState<unknown>()\n const { showAddStructureDialog } = model\n\n const handleClose = () => {\n setFile(undefined)\n setPdbId('')\n setUniprotId('')\n setStructureURL('')\n setError(undefined)\n model.setShowAddStructureDialog(false)\n }\n\n const handleAdd = async () => {\n try {\n let url: string | undefined\n let data: string | undefined\n\n if (choice === 'pdb' && pdbId) {\n url = getPdbStructureUrl(pdbId)\n } else if (choice === 'uniprot' && uniprotId) {\n url = getAlphaFoldStructureUrl(uniprotId.toUpperCase())\n } else if (choice === 'url' && structureURL) {\n url = structureURL\n } else if (choice === 'file' && file) {\n data = await file.text()\n }\n\n if (url !== undefined || data !== undefined) {\n await model.addStructureAndSuperpose({ url, data })\n handleClose()\n }\n } catch (e) {\n console.error(e)\n setError(e)\n }\n }\n\n if (!showAddStructureDialog) {\n return null\n }\n\n const canAdd =\n (choice === 'url' && structureURL !== '') ||\n (choice === 'file' && file !== undefined) ||\n (choice === 'pdb' && pdbId !== '') ||\n (choice === 'uniprot' && uniprotId !== '')\n\n return (\n <Dialog open onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Add Structure</DialogTitle>\n <DialogContent>\n {error ? <ErrorMessage error={error} /> : null}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Add another structure to superpose on the existing structure(s).\n </Typography>\n\n <FormControl component=\"fieldset\" sx={{ mb: 2 }}>\n <RadioGroup\n value={choice}\n onChange={event => {\n setChoice(event.target.value)\n }}\n >\n <FormControlLabel value=\"pdb\" control={<Radio />} label=\"PDB ID\" />\n <FormControlLabel\n value=\"uniprot\"\n control={<Radio />}\n label=\"UniProt ID (AlphaFold)\"\n />\n <FormControlLabel value=\"url\" control={<Radio />} label=\"URL\" />\n <FormControlLabel value=\"file\" control={<Radio />} label=\"File\" />\n </RadioGroup>\n </FormControl>\n\n {choice === 'pdb' ? (\n <TextField\n fullWidth\n value={pdbId}\n onChange={event => {\n setPdbId(event.target.value.toUpperCase())\n }}\n label=\"PDB ID (e.g. 1CRN)\"\n placeholder=\"Enter PDB ID\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'uniprot' ? (\n <TextField\n fullWidth\n value={uniprotId}\n onChange={event => {\n setUniprotId(event.target.value.toUpperCase())\n }}\n label=\"UniProt ID (e.g. P04637)\"\n placeholder=\"Enter UniProt ID\"\n helperText=\"Will fetch the AlphaFold v6 predicted structure\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'url' ? (\n <TextField\n fullWidth\n label=\"Structure URL\"\n value={structureURL}\n onChange={event => {\n setStructureURL(event.target.value)\n }}\n placeholder=\"https://files.rcsb.org/download/1CRN.cif\"\n sx={{ mb: 2 }}\n />\n ) : null}\n\n {choice === 'file' ? (\n <div style={{ marginBottom: 16 }}>\n <Button variant=\"outlined\" component=\"label\">\n {file ? file.name : 'Choose File'}\n <input\n type=\"file\"\n hidden\n accept=\".pdb,.cif,.mmcif,.ent\"\n onChange={({ target }) => {\n const f = target.files?.[0]\n if (f) {\n setFile(f)\n }\n }}\n />\n </Button>\n {file ? (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n Selected: {file.name}\n </Typography>\n ) : null}\n </div>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n Tip: Structures will be automatically superposed using TM-align. For\n manual control, use the Mol* controls (\uD83D\uDD27 wrench icon).\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose}>Cancel</Button>\n <Button\n onClick={() => {\n void handleAdd()\n }}\n variant=\"contained\"\n color=\"primary\"\n disabled={!canAdd}\n >\n Add Structure\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default AddStructureDialog\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinViewModel,\n} from '../model'\n\nconst HeaderStructureInfo = observer(function HeaderStructureInfo({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { structures } = model\n const hoverText = structures\n .map(\n (structure: JBrowsePluginProteinStructureModel) => structure.hoverString,\n )\n .filter(Boolean)\n .join(' ')\n return (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: 12,\n }}\n title={hoverText}\n >\n {/* nbsp keeps the line height stable when there is no hover */}\n {hoverText ? `Hover: ${hoverText}` : '\u00A0'}\n </div>\n )\n})\n\nexport default HeaderStructureInfo\n", "import React from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport { Button, DialogActions, DialogContent, Typography } from '@mui/material'\n\nimport type { TypographyProps } from '@mui/material'\n\nfunction Typography2({ children }: TypographyProps) {\n return (\n <Typography\n style={{\n margin: 4,\n marginBottom: 12,\n }}\n >\n {children}\n </Typography>\n )\n}\nexport default function ProteinAlignmentHelpDialog({\n handleClose,\n}: {\n handleClose: () => void\n}) {\n return (\n <Dialog open maxWidth=\"lg\" onClose={handleClose} title=\"Protein alignment\">\n <DialogContent>\n <Typography2>\n This panel shows the computed pairwise alignment of the reference\n genome sequence to the structure sequence. The structure file (PDB\n file, mmCIF file, etc) has a stored representation of the e.g. amino\n acid sequence but the sequence in the structure file can differ from\n the sequence from the gene on the genome browser\n </Typography2>\n <Typography2>\n In order to resolve this, we align the two sequences together (using\n EMBOSS needle) to get pairwise alignment of the genome's\n representation of the protein and the structure file's\n representation of the protein.\n </Typography2>\n <Typography2>\n If you need a 100% fidelity protein, you can do a folding with e.g.\n AlphaFold to make sure the structure you are using matches exactly the\n sequence of the transcript\n </Typography2>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n handleClose()\n }}\n variant=\"contained\"\n color=\"primary\"\n >\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n", "import React, { lazy } from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport Help from '@mui/icons-material/Help'\nimport { IconButton } from '@mui/material'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\n// icons\n\nconst ProteinAlignmentHelpDialog = lazy(\n () => import('./ProteinAlignmentHelpDialog'),\n)\n\nexport default function ProteinAlignmentHelpButton({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <IconButton\n style={{ float: 'right' }}\n onClick={() => {\n getSession(model).queueDialog(handleClose => [\n ProteinAlignmentHelpDialog,\n { handleClose },\n ])\n }}\n >\n <Help />\n </IconButton>\n )\n}\n", "import useSWR from 'swr'\n\nexport interface UniProtFeature {\n type: string\n start: number\n end: number\n description: string\n id?: string\n uniqueId: string\n}\n\nconst featureColors: Record<string, string> = {\n Domain: '#1f77b4',\n 'DNA binding': '#ff7f0e',\n Region: '#2ca02c',\n 'Zinc finger': '#d62728',\n 'Coiled coil': '#9467bd',\n Motif: '#8c564b',\n 'Compositional bias': '#e377c2',\n Repeat: '#7f7f7f',\n Transmembrane: '#bcbd22',\n Intramembrane: '#17becf',\n 'Topological domain': '#aec7e8',\n Signal: '#ffbb78',\n 'Signal peptide': '#ffbb78',\n Propeptide: '#98df8a',\n 'Transit peptide': '#ff9896',\n Chain: '#c5b0d5',\n 'Disulfide bond': '#c49c94',\n 'Active site': '#f7b6d2',\n 'Binding site': '#c7c7c7',\n Site: '#dbdb8d',\n 'Modified residue': '#9edae5',\n Glycosylation: '#393b79',\n Lipidation: '#637939',\n 'Cross-link': '#8c6d31',\n 'Alternative sequence': '#e7969c',\n 'Natural variant': '#de9ed6',\n Mutagenesis: '#ad494a',\n 'Sequence conflict': '#b5cf6b',\n Helix: '#e7ba52',\n 'Beta strand': '#6b6ecf',\n Turn: '#d6616b',\n 'Initiator methionine': '#ce6dbd',\n Peptide: '#6baed6',\n 'Calcium binding': '#fd8d3c',\n 'Nucleotide binding': '#74c476',\n}\n\nexport function getFeatureColor(type: string) {\n return featureColors[type] ?? '#999999'\n}\n\nasync function fetchUniProtFeatures(url: string): Promise<UniProtFeature[]> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} fetching ${url}`)\n }\n const text = await res.text()\n\n const features: UniProtFeature[] = []\n for (const line of text.split('\\n')) {\n if (line.startsWith('#') || !line.trim()) {\n continue\n }\n const parts = line.split('\\t')\n if (parts.length < 9) {\n continue\n }\n const type = parts[2]\n const start = Number.parseInt(parts[3] ?? '0', 10)\n const end = Number.parseInt(parts[4] ?? '0', 10)\n const attributes = parts[8] ?? ''\n\n let description = ''\n let id: string | undefined\n for (const attr of attributes.split(';')) {\n const [key, value] = attr.split('=')\n if (key === 'Note') {\n description = decodeURIComponent(value ?? '')\n } else if (key === 'ID') {\n id = value\n }\n }\n\n if (type) {\n const uniqueId = `${type}-${start}-${end}-${features.length}`\n features.push({\n type,\n start,\n end,\n description,\n id,\n uniqueId,\n })\n }\n }\n\n return features\n}\n\nexport default function useUniProtFeatures(uniprotId: string | undefined) {\n const { data, error, isLoading } = useSWR(\n uniprotId ? `https://rest.uniprot.org/uniprotkb/${uniprotId}.gff` : null,\n fetchUniProtFeatures,\n )\n\n return {\n features: data,\n error,\n isLoading,\n }\n}\n", "import React, { useState } from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, HOVERED_BORDER, SELECTED_BORDER } from '../constants'\nimport { selectResidueRange } from '../highlightResidueRange'\nimport { getFeatureColor } from '../hooks/useUniProtFeatures'\nimport { clickProteinToGenome } from '../proteinToGenomeMapping'\n\nimport type { UniProtFeature } from '../hooks/useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction getFeatureAlignmentRange(\n feature: UniProtFeature,\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n) {\n const startAlignmentPos = structurePositionToAlignmentMap?.[feature.start - 1]\n const endAlignmentPos = structurePositionToAlignmentMap?.[feature.end - 1]\n return startAlignmentPos !== undefined && endAlignmentPos !== undefined\n ? { start: startAlignmentPos, end: endAlignmentPos }\n : undefined\n}\n\nfunction getFeatureGeometry(\n feature: UniProtFeature,\n structurePositionToAlignmentMap: Record<number, number> | undefined,\n) {\n const startAlnPos =\n structurePositionToAlignmentMap?.[feature.start - 1] ?? feature.start - 1\n const endAlnPos =\n structurePositionToAlignmentMap?.[feature.end - 1] ?? feature.end - 1\n return {\n left: startAlnPos * CHAR_WIDTH,\n width: Math.max((endAlnPos - startAlnPos + 1) * CHAR_WIDTH, 3),\n }\n}\n\nfunction FeatureTooltipContent({ feature }: { feature: UniProtFeature }) {\n return (\n <div>\n <div>\n <strong>{feature.type}</strong>\n </div>\n <div>\n Position: {feature.start}-{feature.end}\n </div>\n {feature.description ? <div>{feature.description}</div> : null}\n </div>\n )\n}\n\nconst FeatureBar = observer(function FeatureBar({\n feature,\n model,\n}: {\n feature: UniProtFeature\n model: JBrowsePluginProteinStructureModel\n}) {\n const [isHovered, setIsHovered] = useState(false)\n const {\n molstarPluginContext,\n selectedFeatureId,\n structurePositionToAlignmentMap,\n } = model\n const isSelected = selectedFeatureId === feature.uniqueId\n\n const handleMouseEnter = () => {\n setIsHovered(true)\n const range = getFeatureAlignmentRange(\n feature,\n structurePositionToAlignmentMap,\n )\n if (range) {\n model.setAlignmentHoverRange(range)\n }\n }\n\n const handleMouseLeave = () => {\n setIsHovered(false)\n model.setAlignmentHoverRange(undefined)\n }\n\n const handleClick = () => {\n const structure = model.molstarStructure\n const newSelected = !isSelected\n\n if (structure && molstarPluginContext) {\n if (newSelected) {\n selectResidueRange({\n structure,\n startResidue: feature.start,\n endResidue: feature.end,\n plugin: molstarPluginContext,\n }).catch((e: unknown) => {\n console.error(e)\n model.setError(e)\n })\n } else {\n molstarPluginContext.managers.interactivity.lociSelects.deselectAll()\n }\n }\n\n if (newSelected) {\n model.setSelectedFeatureId(feature.uniqueId)\n clickProteinToGenome({\n model,\n structureSeqPos: feature.start - 1,\n structureSeqEndPos: feature.end,\n }).catch((e: unknown) => {\n console.error(e)\n model.setError(e)\n })\n } else {\n model.setSelectedFeatureId(undefined)\n model.setClickedStructureRange(undefined)\n }\n }\n\n const { left, width } = getFeatureGeometry(\n feature,\n structurePositionToAlignmentMap,\n )\n const color = getFeatureColor(feature.type)\n\n return (\n <Tooltip title={<FeatureTooltipContent feature={feature} />} followCursor>\n <div\n onClick={() => {\n handleClick()\n }}\n onMouseEnter={() => {\n handleMouseEnter()\n }}\n onMouseLeave={() => {\n handleMouseLeave()\n }}\n style={{\n position: 'absolute',\n left,\n top: 0,\n width,\n height: model.trackHeight,\n backgroundColor: color,\n opacity: isHovered || isSelected ? 0.9 : 0.6,\n cursor: 'pointer',\n borderRadius: 2,\n border: isSelected\n ? SELECTED_BORDER\n : isHovered\n ? HOVERED_BORDER\n : 'none',\n boxSizing: 'border-box',\n }}\n />\n </Tooltip>\n )\n})\n\nexport default FeatureBar\n", "import React from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { HIDE_BUTTON_COLOR } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst FeatureTypeLabel = observer(function FeatureTypeLabel({\n type,\n labelWidth,\n model,\n}: {\n type: string\n labelWidth: number\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <Tooltip title={type} placement=\"left\">\n <div\n style={{\n height: model.trackHeight + model.trackGap,\n width: labelWidth - 4,\n fontSize: 9,\n fontFamily: 'monospace',\n textAlign: 'right',\n paddingRight: 4,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n }}\n >\n <span\n onClick={e => {\n e.stopPropagation()\n model.hideFeatureType(type)\n }}\n style={{\n cursor: 'pointer',\n color: HIDE_BUTTON_COLOR,\n fontWeight: 'bold',\n fontSize: 8,\n lineHeight: 1,\n }}\n title={`Hide ${type} track`}\n >\n x\n </span>\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {type}\n </span>\n </div>\n </Tooltip>\n )\n})\n\nexport default FeatureTypeLabel\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, HOVER_MARKER_COLOR } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst HoverMarker = observer(function HoverMarker({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n const { alignmentHoverPos } = model\n\n if (alignmentHoverPos === undefined) {\n return null\n }\n\n return (\n <div\n style={{\n position: 'absolute',\n left: alignmentHoverPos * CHAR_WIDTH,\n top: 0,\n bottom: 0,\n width: CHAR_WIDTH,\n backgroundColor: HOVER_MARKER_COLOR,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n />\n )\n})\n\nexport default HoverMarker\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\nimport FeatureBar from './FeatureBar'\nimport FeatureTypeLabel from './FeatureTypeLabel'\nimport HoverMarker from './HoverMarker'\n\nimport type { FeatureTrackData } from '../hooks/useProteinFeatureTrackData'\nimport type { UniProtFeature } from '../hooks/useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction getVisibleTypes(\n featureTypes: string[],\n hiddenFeatureTypes: Set<string>,\n) {\n return featureTypes.filter(type => !hiddenFeatureTypes.has(type))\n}\n\nconst FeatureTypeTrackContent = observer(function FeatureTypeTrackContent({\n features,\n model,\n sequenceLength,\n}: {\n features: UniProtFeature[]\n model: JBrowsePluginProteinStructureModel\n sequenceLength: number\n}) {\n return (\n <div\n style={{\n position: 'relative',\n height: model.trackHeight,\n width: sequenceLength * CHAR_WIDTH,\n marginBottom: model.trackGap,\n }}\n >\n {features.map(feature => (\n <FeatureBar key={feature.uniqueId} feature={feature} model={model} />\n ))}\n <HoverMarker model={model} />\n </div>\n )\n})\n\nexport const ProteinFeatureTrackLabels = observer(\n function ProteinFeatureTrackLabels({\n data,\n labelWidth,\n model,\n }: {\n data: FeatureTrackData\n labelWidth: number\n model: JBrowsePluginProteinStructureModel\n }) {\n const { hiddenFeatureTypes } = model\n const visibleTypes = getVisibleTypes(data.featureTypes, hiddenFeatureTypes)\n return (\n <>\n {visibleTypes.map(type => (\n <FeatureTypeLabel\n key={type}\n type={type}\n labelWidth={labelWidth}\n model={model}\n />\n ))}\n </>\n )\n },\n)\n\nexport const ProteinFeatureTrackContent = observer(\n function ProteinFeatureTrackContent({\n data,\n model,\n }: {\n data: FeatureTrackData\n model: JBrowsePluginProteinStructureModel\n }) {\n const { hiddenFeatureTypes } = model\n const visibleTypes = getVisibleTypes(data.featureTypes, hiddenFeatureTypes)\n\n return (\n <div\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const alignmentPos = Math.floor(x / CHAR_WIDTH)\n if (alignmentPos >= 0 && alignmentPos < data.sequenceLength) {\n model.hoverAlignmentPosition(alignmentPos)\n }\n }}\n onMouseLeave={() => {\n model.setHoveredPosition(undefined)\n }}\n >\n {visibleTypes.map(type => (\n <FeatureTypeTrackContent\n key={type}\n features={data.groupedFeatures[type]!}\n model={model}\n sequenceLength={data.sequenceLength}\n />\n ))}\n </div>\n )\n },\n)\n", "import React from 'react'\n\nimport { Tooltip } from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nexport interface ResidueCell {\n col: number\n value: number\n}\n\n/**\n * A per-residue scalar track (e.g. pLDDT, hydrophobicity) rendered as colored\n * cells aligned to the pairwise-alignment columns, matching the UniProt feature\n * tracks. Hovering drives the same structure hover as the feature tracks.\n */\nconst ResidueValueTrack = observer(function ResidueValueTrack({\n cells,\n colorFor,\n formatValue,\n sequenceLength,\n model,\n}: {\n cells: ResidueCell[]\n colorFor: (value: number) => string\n formatValue: (value: number) => string\n sequenceLength: number\n model: JBrowsePluginProteinStructureModel\n}) {\n return (\n <div\n style={{\n position: 'relative',\n height: model.trackHeight,\n width: sequenceLength * CHAR_WIDTH,\n marginBottom: model.trackGap,\n }}\n onMouseMove={(e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const alignmentPos = Math.floor((e.clientX - rect.left) / CHAR_WIDTH)\n if (alignmentPos >= 0 && alignmentPos < sequenceLength) {\n model.hoverAlignmentPosition(alignmentPos)\n }\n }}\n onMouseLeave={() => {\n model.setHoveredPosition(undefined)\n }}\n >\n {cells.map(cell => (\n <Tooltip key={cell.col} title={formatValue(cell.value)} followCursor>\n <div\n style={{\n position: 'absolute',\n left: cell.col * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height: model.trackHeight,\n backgroundColor: colorFor(cell.value),\n }}\n />\n </Tooltip>\n ))}\n </div>\n )\n})\n\nexport default ResidueValueTrack\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH } from '../constants'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nconst CharacterSpans = observer(function CharacterSpans({\n str,\n}: {\n str: string\n}) {\n return str.split('').map((char, i) => (\n <span\n key={i}\n style={{\n position: 'absolute',\n left: i * CHAR_WIDTH,\n width: CHAR_WIDTH,\n }}\n >\n {char === ' ' ? '\\u00A0' : char}\n </span>\n ))\n})\n\nconst MatchOverlays = observer(function MatchOverlays({\n model,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n height: number\n}) {\n const { showHighlight, alignmentMatchSet } = model\n return !showHighlight || !alignmentMatchSet\n ? null\n : [...alignmentMatchSet].map(i => (\n <span\n key={i}\n style={{\n position: 'absolute',\n left: i * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height,\n background: '#33ff19a0',\n pointerEvents: 'none',\n }}\n />\n ))\n})\n\nconst HoverHighlight = observer(function HoverHighlight({\n model,\n strLength,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n strLength: number\n height: number\n}) {\n const { alignmentHoverPos } = model\n const showHoverHighlight =\n alignmentHoverPos !== undefined &&\n alignmentHoverPos >= 0 &&\n alignmentHoverPos < strLength\n\n return !showHoverHighlight ? null : (\n <span\n style={{\n position: 'absolute',\n left: alignmentHoverPos * CHAR_WIDTH,\n top: 0,\n width: CHAR_WIDTH,\n height,\n background: '#f698',\n pointerEvents: 'none',\n }}\n />\n )\n})\n\nconst RangeHighlight = observer(function RangeHighlight({\n range,\n strLength,\n background,\n border,\n height,\n}: {\n range: { start: number; end: number } | undefined\n strLength: number\n background: string\n border?: string\n height: number\n}) {\n if (!range) {\n return null\n }\n const { start, end } = range\n const clampedStart = Math.max(0, start)\n const clampedEnd = Math.min(strLength - 1, end)\n if (clampedStart > clampedEnd) {\n return null\n }\n const width = (clampedEnd - clampedStart + 1) * CHAR_WIDTH\n\n return (\n <span\n style={{\n position: 'absolute',\n left: clampedStart * CHAR_WIDTH,\n top: 0,\n width,\n height,\n background,\n border,\n boxSizing: 'border-box',\n pointerEvents: 'none',\n }}\n />\n )\n})\n\nexport const AlignmentHighlights = observer(function AlignmentHighlights({\n model,\n strLength,\n height,\n}: {\n model: JBrowsePluginProteinStructureModel\n strLength: number\n height: number\n}) {\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: strLength * CHAR_WIDTH,\n height,\n pointerEvents: 'none',\n }}\n >\n <MatchOverlays model={model} height={height} />\n <RangeHighlight\n range={model.clickAlignmentRange}\n strLength={strLength}\n background=\"rgba(0, 120, 255, 0.3)\"\n border=\"1px solid rgba(0, 120, 255, 0.6)\"\n height={height}\n />\n <RangeHighlight\n range={model.alignmentHoverRange}\n strLength={strLength}\n background=\"rgba(255, 165, 0, 0.4)\"\n height={height}\n />\n <HoverHighlight model={model} strLength={strLength} height={height} />\n </div>\n )\n})\n\nconst SplitString = observer(function SplitString({\n model,\n str,\n}: {\n model: JBrowsePluginProteinStructureModel\n str: string\n}) {\n return (\n <span\n style={{\n position: 'relative',\n display: 'inline-block',\n width: str.length * CHAR_WIDTH,\n height: '1em',\n }}\n onMouseMove={(e: React.MouseEvent<HTMLSpanElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const index = Math.floor(x / CHAR_WIDTH)\n if (index >= 0 && index < str.length) {\n model.hoverAlignmentPosition(index)\n }\n }}\n onClick={(e: React.MouseEvent<HTMLSpanElement>) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const index = Math.floor(x / CHAR_WIDTH)\n if (index >= 0 && index < str.length) {\n model.clickAlignmentPosition(index)\n }\n }}\n >\n <CharacterSpans str={str} />\n </span>\n )\n})\n\nexport default SplitString\n", "import useUniProtFeatures from './useUniProtFeatures'\n\nimport type { UniProtFeature } from './useUniProtFeatures'\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\ntype FeaturesByType = Record<string, UniProtFeature[]>\n\nexport interface FeatureTrackData {\n featureTypes: string[]\n groupedFeatures: FeaturesByType\n sequenceLength: number\n}\n\nfunction groupFeaturesByType(features: UniProtFeature[]): FeaturesByType {\n const grouped: FeaturesByType = {}\n for (const feature of features) {\n grouped[feature.type] ??= []\n grouped[feature.type]!.push(feature)\n }\n return grouped\n}\n\nexport default function useProteinFeatureTrackData(\n model: JBrowsePluginProteinStructureModel,\n uniprotId: string | undefined,\n): {\n data: FeatureTrackData | undefined\n isLoading: boolean\n error: unknown\n} {\n const { features, isLoading, error } = useUniProtFeatures(uniprotId)\n const { pairwiseAlignment } = model\n\n if (!uniprotId || isLoading || error || !features || !pairwiseAlignment) {\n return { data: undefined, isLoading, error }\n }\n\n const sequenceLength = pairwiseAlignment.alns[0].seq.length\n const groupedFeatures = groupFeaturesByType(features)\n const featureTypes = Object.keys(groupedFeatures)\n\n return {\n data: { featureTypes, groupedFeatures, sequenceLength },\n isLoading: false,\n error: undefined,\n }\n}\n", "import React, { useEffect, useRef } from 'react'\n\nimport { Tooltip, Typography } from '@mui/material'\nimport { autorun } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport { CHAR_WIDTH, LABEL_WIDTH, ROW_HEIGHT } from '../constants'\nimport ProteinAlignmentHelpButton from './ProteinAlignmentHelpButton'\nimport {\n ProteinFeatureTrackContent,\n ProteinFeatureTrackLabels,\n} from './ProteinFeatureTrack'\nimport ResidueValueTrack from './ResidueValueTrack'\nimport SplitString, { AlignmentHighlights } from './SplitString'\nimport useProteinFeatureTrackData from '../hooks/useProteinFeatureTrackData'\nimport { hydrophobicityColor, plddtColor } from '../residueTracks'\n\nimport type { JBrowsePluginProteinStructureModel } from '../model'\n\nfunction GutterLabel({\n label,\n title,\n height,\n}: {\n label: string\n title: string\n height: number\n}) {\n return (\n <Tooltip title={title} placement=\"left\">\n <div\n style={{\n height,\n fontSize: 9,\n fontFamily: 'monospace',\n textAlign: 'right',\n paddingRight: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </div>\n </Tooltip>\n )\n}\n\nconst ProteinAlignment = observer(function ProteinAlignment({\n model,\n}: {\n model: JBrowsePluginProteinStructureModel\n}) {\n const {\n pairwiseAlignment,\n showHighlight,\n showProteinTracks,\n uniprotId,\n confidenceCells,\n hydrophobicityCells,\n } = model\n const containerRef = useRef<HTMLDivElement>(null)\n const {\n data: featureData,\n isLoading: featureLoading,\n error: featureError,\n } = useProteinFeatureTrackData(model, uniprotId)\n\n useEffect(\n () =>\n autorun(() => {\n const container = containerRef.current\n if (\n model.autoScrollAlignment &&\n !model.isMouseInAlignment &&\n model.alignmentHoverPos !== undefined &&\n container\n ) {\n container.scrollTo({\n left:\n model.alignmentHoverPos * CHAR_WIDTH - container.clientWidth / 2,\n behavior: 'smooth',\n })\n }\n }),\n [model],\n )\n\n if (!pairwiseAlignment) {\n return <div>No pairwiseAlignment</div>\n }\n\n const a0 = pairwiseAlignment.alns[0].seq\n const a1 = pairwiseAlignment.alns[1].seq\n const con = pairwiseAlignment.consensus\n\n return (\n <div>\n <ProteinAlignmentHelpButton model={model} />\n\n <Typography>\n Alignment of the protein structure file's sequence with the\n selected transcript's sequence.{' '}\n {showHighlight ? 'Green is the aligned portion' : null}\n </Typography>\n <div\n style={{\n display: 'flex',\n fontSize: 9,\n fontFamily: 'monospace',\n cursor: 'pointer',\n margin: 8,\n paddingBottom: 8,\n }}\n onMouseEnter={() => {\n model.setIsMouseInAlignment(true)\n }}\n onMouseLeave={() => {\n model.setIsMouseInAlignment(false)\n model.setHoveredPosition(undefined)\n }}\n >\n <div\n style={{\n flexShrink: 0,\n width: LABEL_WIDTH,\n textAlign: 'right',\n paddingRight: 4,\n }}\n >\n <div style={{ height: ROW_HEIGHT }}>\n <Tooltip title=\"This is the sequence of the protein from the reference genome transcript\">\n <span>GENOME</span>\n </Tooltip>\n </div>\n <div style={{ height: ROW_HEIGHT }}> </div>\n <div style={{ height: ROW_HEIGHT }}>\n <Tooltip title=\"This is the sequence of the protein from the structure file\">\n <span>STRUCT</span>\n </Tooltip>\n </div>\n {showProteinTracks ? (\n featureLoading ? (\n <div style={{ height: ROW_HEIGHT, fontSize: 8, color: '#666' }}>\n Loading...\n </div>\n ) : featureError ? (\n <Tooltip\n title={\n featureError instanceof Error\n ? featureError.message\n : 'Error loading features'\n }\n >\n <div style={{ height: ROW_HEIGHT, fontSize: 8, color: 'red' }}>\n Error\n </div>\n </Tooltip>\n ) : featureData ? (\n <ProteinFeatureTrackLabels\n data={featureData}\n labelWidth={LABEL_WIDTH}\n model={model}\n />\n ) : null\n ) : null}\n {showProteinTracks && confidenceCells.length > 0 ? (\n <GutterLabel\n label=\"pLDDT\"\n title=\"AlphaFold per-residue confidence (pLDDT)\"\n height={model.trackHeight + model.trackGap}\n />\n ) : null}\n {showProteinTracks && hydrophobicityCells.length > 0 ? (\n <GutterLabel\n label=\"hydro\"\n title=\"Kyte-Doolittle hydrophobicity (orange hydrophobic, blue hydrophilic)\"\n height={model.trackHeight + model.trackGap}\n />\n ) : null}\n </div>\n <div\n ref={containerRef}\n style={{\n overflow: 'auto',\n whiteSpace: 'nowrap',\n flex: 1,\n paddingBottom: 10,\n backgroundColor: 'white',\n }}\n >\n <div style={{ position: 'relative' }}>\n <AlignmentHighlights\n model={model}\n strLength={a0.length}\n height={ROW_HEIGHT * 3}\n />\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={a0} />\n </div>\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={con} />\n </div>\n <div style={{ height: ROW_HEIGHT }}>\n <SplitString model={model} str={a1} />\n </div>\n </div>\n {showProteinTracks && featureData ? (\n <ProteinFeatureTrackContent data={featureData} model={model} />\n ) : null}\n {showProteinTracks && confidenceCells.length > 0 ? (\n <ResidueValueTrack\n cells={confidenceCells}\n colorFor={plddtColor}\n formatValue={v => `pLDDT ${v.toFixed(0)}`}\n sequenceLength={a0.length}\n model={model}\n />\n ) : null}\n {showProteinTracks && hydrophobicityCells.length > 0 ? (\n <ResidueValueTrack\n cells={hydrophobicityCells}\n colorFor={hydrophobicityColor}\n formatValue={v => `Kyte-Doolittle ${v.toFixed(1)}`}\n sequenceLength={a0.length}\n model={model}\n />\n ) : null}\n </div>\n </div>\n </div>\n )\n})\n\nexport default ProteinAlignment\n", "import React, { useState } from 'react'\n\nimport { LoadingEllipses } from '@jbrowse/core/ui'\nimport TuneIcon from '@mui/icons-material/Tune'\nimport Checkbox from '@mui/material/Checkbox'\nimport IconButton from '@mui/material/IconButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport Menu from '@mui/material/Menu'\nimport MenuItem from '@mui/material/MenuItem'\nimport TextField from '@mui/material/TextField'\nimport Tooltip from '@mui/material/Tooltip'\nimport { observer } from 'mobx-react'\n\nimport AddStructureDialog from './AddStructureDialog'\nimport HeaderStructureInfo from './HeaderStructureInfo'\nimport ProteinAlignment from './ProteinAlignment'\nimport { COLOR_SCHEMES } from '../applyColorTheme'\n\nimport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinViewModel,\n} from '../model'\n\nconst ColorSchemeSelect = observer(function ColorSchemeSelect({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n return (\n <TextField\n select\n size=\"small\"\n label=\"Color\"\n value={model.colorScheme}\n onChange={event => {\n const scheme = COLOR_SCHEMES.find(s => s.value === event.target.value)\n if (scheme) {\n model.setColorScheme(scheme.value)\n }\n }}\n slotProps={{ select: { native: false } }}\n sx={{ minWidth: 180 }}\n >\n {COLOR_SCHEMES.map(scheme => (\n <MenuItem key={scheme.value} value={scheme.value}>\n {scheme.label}\n </MenuItem>\n ))}\n </TextField>\n )\n})\n\nfunction ToggleMenuItem({\n checked,\n label,\n onToggle,\n}: {\n checked: boolean\n label: string\n onToggle: () => void\n}) {\n return (\n <MenuItem\n onClick={() => {\n onToggle()\n }}\n dense\n >\n <ListItemIcon>\n <Checkbox checked={checked} size=\"small\" edge=\"start\" disableRipple />\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n}\n\nfunction getDisplayToggles(model: JBrowsePluginProteinViewModel) {\n return [\n {\n label: 'Show alignment',\n checked: model.showAlignment,\n onToggle: () => {\n model.setShowAlignment(!model.showAlignment)\n },\n },\n {\n label: 'Show features',\n checked: model.showProteinTracks,\n onToggle: () => {\n model.setShowProteinTracks(!model.showProteinTracks)\n },\n },\n {\n label: 'Auto-scroll features',\n checked: model.autoScrollAlignment,\n onToggle: () => {\n model.setAutoScrollAlignment(!model.autoScrollAlignment)\n },\n },\n {\n label: 'Compact tracks',\n checked: model.compactTracks,\n onToggle: () => {\n model.setCompactTracks(!model.compactTracks)\n },\n },\n ]\n}\n\nconst DisplaySettingsMenu = observer(function DisplaySettingsMenu({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n return (\n <>\n <Tooltip title=\"Display settings\">\n <IconButton\n size=\"small\"\n onClick={event => {\n setAnchorEl(event.currentTarget)\n }}\n >\n <TuneIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => {\n setAnchorEl(null)\n }}\n >\n {getDisplayToggles(model).map(toggle => (\n <ToggleMenuItem\n key={toggle.label}\n checked={toggle.checked}\n label={toggle.label}\n onToggle={toggle.onToggle}\n />\n ))}\n </Menu>\n </>\n )\n})\n\nconst ProteinViewHeader = observer(function ProteinViewHeader({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { structures, showAlignment } = model\n return (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <HeaderStructureInfo model={model} />\n <div\n style={{\n display: 'flex',\n gap: '8px',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <ColorSchemeSelect model={model} />\n <DisplaySettingsMenu model={model} />\n </div>\n </div>\n {showAlignment\n ? structures\n .filter(s => s.pairwiseAlignment || s.alignmentPending)\n .map((structure: JBrowsePluginProteinStructureModel, idx) => (\n <div key={idx}>\n {structure.pairwiseAlignment ? (\n <ProteinAlignment model={structure} />\n ) : (\n <LoadingEllipses message=\"Loading pairwise alignment\" />\n )}\n </div>\n ))\n : null}\n <AddStructureDialog model={model} />\n </div>\n )\n})\n\nexport default ProteinViewHeader\n", "export default `\n.msp-plugin{font-family:Helvetica Neue,Segoe UI,Helvetica,Source Sans Pro,Arial,sans-serif;font-size:14px;line-height:1.42857143;position:absolute;inset:0}.msp-plugin *{box-sizing:border-box}.msp-plugin [hidden],.msp-plugin template{display:none}.msp-plugin a{background-color:transparent}.msp-plugin a:active,.msp-plugin a:hover{outline:0}.msp-plugin abbr[title]{border-bottom:1px dotted}.msp-plugin b,.msp-plugin strong{font-weight:700}.msp-plugin small{font-size:80%}.msp-plugin img{border:0}.msp-plugin svg:not(:root){overflow:hidden}.msp-plugin button,.msp-plugin input,.msp-plugin optgroup,.msp-plugin select,.msp-plugin textarea{color:inherit;font:inherit;margin:0}.msp-plugin button{overflow:visible}.msp-plugin button,.msp-plugin select{text-transform:none}.msp-plugin button,.msp-plugin html input[type=button],.msp-plugin input[type=reset],.msp-plugin input[type=submit]{-webkit-appearance:button;cursor:pointer}.msp-plugin button[disabled],.msp-plugin html input[disabled]{cursor:default}.msp-plugin button::-moz-focus-inner,.msp-plugin input::-moz-focus-inner{border:0;padding:0}.msp-plugin input{line-height:normal}.msp-plugin input[type=checkbox],.msp-plugin input[type=radio]{box-sizing:border-box;padding:0}.msp-plugin input[type=number]::-webkit-inner-spin-button,.msp-plugin input[type=number]::-webkit-outer-spin-button{height:auto}.msp-plugin textarea{overflow:auto}.msp-plugin .msp-layout-expanded,.msp-plugin .msp-layout-standard{inset:0}.msp-plugin .msp-layout-standard{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-region{overflow:hidden}.msp-plugin .msp-layout-static,.msp-plugin .msp-layout-scrollable{position:absolute}.msp-plugin .msp-scrollable{overflow-y:auto}.msp-plugin .msp-scrollable-container{position:absolute;inset:0;overflow-y:auto}.msp-plugin .msp-layout-static{overflow:hidden}.msp-plugin .msp-layout-top .msp-layout-static,.msp-plugin .msp-layout-main .msp-layout-static,.msp-plugin .msp-layout-bottom .msp-layout-static,.msp-plugin .msp-layout-right .msp-layout-static{inset:0}.msp-plugin .msp-layout-right .msp-layout-scrollable{inset:43px 0 0}.msp-plugin .msp-layout-left .msp-layout-static{inset:0}.msp-plugin .msp-layout-standard-outside{position:absolute}.msp-plugin .msp-layout-standard-outside .msp-layout-main{position:absolute;inset:0}.msp-plugin .msp-layout-standard-outside .msp-layout-top{position:absolute;right:0;height:97px;top:-97px;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;top:-97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-right{position:absolute;width:50%;right:0;bottom:-295px;height:295px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-left{position:absolute;width:50%;left:0;bottom:-295px;height:295px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-outside .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-outside .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-outside .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-landscape{position:absolute}.msp-plugin .msp-layout-standard-landscape .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-standard-landscape .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-standard-landscape .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-landscape .msp-layout-hide-top .msp-layout-main{top:0}.msp-plugin .msp-layout-standard-portrait{position:absolute}.msp-plugin .msp-layout-standard-portrait .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-standard-portrait .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-portrait .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-portrait .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-portrait .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}.msp-plugin .msp-layout-standard-reactive{position:absolute}@media(orientation:landscape),(min-width:1000px){.msp-plugin .msp-layout-standard-reactive .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-standard-reactive .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-main{top:0}}@media(orientation:portrait)and (max-width:1000px){.msp-plugin .msp-layout-standard-reactive .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-standard-reactive .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-standard-reactive .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-standard-reactive .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}}.msp-plugin .msp-layout-expanded{position:fixed}@media(orientation:landscape){.msp-plugin .msp-layout-expanded .msp-layout-main{position:absolute;inset:100px 300px 70px 330px}.msp-plugin .msp-layout-expanded .msp-layout-top{position:absolute;left:330px;right:300px;height:100px;top:0;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-bottom{position:absolute;left:330px;right:300px;height:70px;bottom:0;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-right{position:absolute;width:300px;right:0;bottom:0;top:0;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-left{position:absolute;width:330px;left:0;bottom:0;top:0;border-right:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-bottom{right:0}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-bottom{left:0}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-main,.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-top,.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-bottom{left:32px}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-main{bottom:0}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-main{top:0}}@media(orientation:portrait){.msp-plugin .msp-layout-expanded .msp-layout-main{position:absolute;inset:97px 0 361px}.msp-plugin .msp-layout-expanded .msp-layout-top{position:absolute;right:0;height:97px;top:0;width:50%;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-bottom{position:absolute;left:0;right:0;height:97px;width:50%;border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-right{position:absolute;width:50%;right:0;bottom:0;height:361px;border-left:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-left{position:absolute;width:50%;left:0;bottom:0;height:361px;border-top:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-right{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right .msp-layout-left{width:100%}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-left{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-left .msp-layout-right{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-right.msp-layout-hide-left .msp-layout-main{bottom:0}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-left{width:32px}.msp-plugin .msp-layout-expanded .msp-layout-collapse-left .msp-layout-right{left:32px;width:auto}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-top{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top .msp-layout-bottom{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-bottom{display:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-bottom .msp-layout-top{width:100%;border-left:none}.msp-plugin .msp-layout-expanded .msp-layout-hide-top.msp-layout-hide-bottom .msp-layout-main{top:0}}.msp-plugin ::-webkit-scrollbar{width:10px;height:10px}.msp-plugin ::-webkit-scrollbar-track{border-radius:0;background-color:#e9e6e0}.msp-plugin ::-webkit-scrollbar-thumb{border-radius:10px;background-color:#beb7a4;border:solid 1px transparent;background-clip:content-box}.msp-plugin .msp-form-control,.msp-plugin .msp-control-row select,.msp-plugin .msp-control-row button,.msp-plugin .msp-control-row input[type=text],.msp-plugin .msp-btn{display:block;width:100%;background:#f3f2ee;border:none;padding:0 10px;line-height:30px;height:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-box-shadow:none;box-shadow:none;background-image:none}.msp-plugin .msp-form-control::-moz-placeholder,.msp-plugin .msp-control-row select::-moz-placeholder,.msp-plugin .msp-control-row button::-moz-placeholder,.msp-plugin .msp-control-row input[type=text]::-moz-placeholder,.msp-plugin .msp-btn::-moz-placeholder{color:#9c835f;opacity:1}.msp-plugin .msp-form-control:-ms-input-placeholder,.msp-plugin .msp-control-row select:-ms-input-placeholder,.msp-plugin .msp-control-row button:-ms-input-placeholder,.msp-plugin .msp-control-row input[type=text]:-ms-input-placeholder,.msp-plugin .msp-btn:-ms-input-placeholder{color:#9c835f}.msp-plugin .msp-form-control::-webkit-input-placeholder,.msp-plugin .msp-control-row select::-webkit-input-placeholder,.msp-plugin .msp-control-row button::-webkit-input-placeholder,.msp-plugin .msp-control-row input[type=text]::-webkit-input-placeholder,.msp-plugin .msp-btn::-webkit-input-placeholder{color:#9c835f}.msp-plugin .msp-form-control:hover,.msp-plugin .msp-control-row select:hover,.msp-plugin .msp-control-row button:hover,.msp-plugin .msp-control-row input[type=text]:hover,.msp-plugin .msp-btn:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-form-control:active,.msp-plugin .msp-control-row select:active,.msp-plugin .msp-control-row button:active,.msp-plugin .msp-control-row input[type=text]:active,.msp-plugin .msp-btn:active,.msp-plugin .msp-form-control:focus,.msp-plugin .msp-control-row select:focus,.msp-plugin .msp-control-row button:focus,.msp-plugin .msp-control-row input[type=text]:focus,.msp-plugin .msp-btn:focus{color:#332b1f;background-color:#f3f2ee;border:none;outline-offset:0;outline:none}.msp-plugin .msp-form-control[disabled],.msp-plugin .msp-control-row select[disabled],.msp-plugin .msp-control-row button[disabled],.msp-plugin .msp-control-row input[disabled][type=text],.msp-plugin [disabled].msp-btn,.msp-plugin .msp-form-control[readonly],.msp-plugin .msp-control-row select[readonly],.msp-plugin .msp-control-row button[readonly],.msp-plugin .msp-control-row input[readonly][type=text],.msp-plugin [readonly].msp-btn,fieldset[disabled] .msp-plugin .msp-form-control,fieldset[disabled] .msp-plugin .msp-control-row select,fieldset[disabled] .msp-plugin .msp-control-row button,fieldset[disabled] .msp-plugin .msp-control-row input[type=text],fieldset[disabled] .msp-plugin .msp-btn{background:#eeece7;opacity:.35}.msp-plugin .msp-btn,.msp-plugin .msp-control-row button{display:inline-block;margin-bottom:0;text-align:center;touch-action:manipulation;cursor:pointer;background-image:none;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0 10px;line-height:32px;border:none;-moz-box-sizing:border-box;box-sizing:border-box}.msp-plugin .msp-btn[disabled],.msp-plugin .msp-control-row button[disabled]{background:#eeece7;opacity:.35}.msp-plugin .msp-btn-block,.msp-plugin .msp-control-row button{display:block;width:100%}.msp-plugin .msp-btn,.msp-plugin .msp-control-row button,.msp-plugin .msp-btn:active,.msp-plugin .msp-btn-link:focus,.msp-plugin .msp-btn:hover{outline:none}.msp-plugin .msp-material-icon svg{display:inline-flex;vertical-align:middle;font-size:1.2em;margin-bottom:3px;fill:currentColor;width:1em;height:1em;flex-shrink:0;user-select:none}.msp-plugin .msp-btn-block>.msp-material-icon,.msp-plugin .msp-control-row button>.msp-material-icon{margin-left:0;margin-right:.4em}.msp-plugin .msp-btn-childless>.msp-material-icon{margin-left:0;margin-right:0}.msp-plugin .msp-btn-icon{border:none;height:32px;width:32px;line-height:32px;padding:0;text-align:center}.msp-plugin .msp-btn-icon:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-btn-icon[disabled],.msp-plugin .msp-btn-icon[disabled]:hover,.msp-plugin .msp-btn-icon[disabled]:active{color:#9c835f}.msp-plugin .msp-btn-icon-small{border:none;height:32px;width:20px;line-height:32px;padding:0;text-align:center}.msp-plugin .msp-btn-icon-small:hover{color:#ae5d04;background-color:#e9e6e0;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-btn-icon-small[disabled],.msp-plugin .msp-btn-icon-small[disabled]:hover,.msp-plugin .msp-btn-icon-small[disabled]:active{color:#9c835f}.msp-plugin .msp-btn-link{font-weight:400;border-radius:0}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:active,.msp-plugin .msp-btn-link.active,.msp-plugin .msp-btn-link[disabled],fieldset[disabled] .msp-plugin .msp-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:hover,.msp-plugin .msp-btn-link:focus,.msp-plugin .msp-btn-link:active{border-color:transparent}.msp-plugin .msp-btn-link:hover,.msp-plugin .msp-btn-link:focus{text-decoration:none;background-color:transparent}.msp-plugin .msp-btn-link[disabled]:hover,.msp-plugin .msp-btn-link[disabled]:focus,fieldset[disabled] .msp-plugin .msp-btn-link:hover,fieldset[disabled] .msp-plugin .msp-btn-link:focus{text-decoration:none}.msp-plugin .msp-btn-link .msp-icon{font-size:100%}.msp-plugin .msp-btn-link,.msp-plugin .msp-btn-link:active,.msp-plugin .msp-btn-link:focus{color:#332b1f;text-decoration:none}.msp-plugin .msp-btn-link:hover{color:#ae5d04;text-decoration:none}.msp-plugin .msp-btn-link-toggle-on{color:#332b1f}.msp-plugin .msp-btn-link-toggle-off,.msp-plugin .msp-btn-link-toggle-off:active,.msp-plugin .msp-btn-link-toggle-off:focus{color:#9c835f!important}.msp-plugin .msp-btn-link-toggle-on:hover{color:#ae5d04!important}.msp-plugin .msp-btn-link-toggle-off:hover{color:#dc9c56!important}.msp-plugin .msp-btn-action,.msp-plugin .msp-btn-action:active,.msp-plugin .msp-btn-action:focus{color:#332b1f;background:#f3f2ee}.msp-plugin .msp-btn-action:hover{color:#ae5d04;background:#f9f8f6}.msp-plugin .msp-btn-action[disabled],.msp-plugin .msp-btn-action[disabled]:hover,.msp-plugin .msp-btn-action[disabled]:active,.msp-plugin .msp-btn-action[disabled]:focus{color:#362e21}.msp-plugin .msp-btn-commit-on,.msp-plugin .msp-btn-commit-on:active,.msp-plugin .msp-btn-commit-on:focus{color:#974102;background:#f2f1ed}.msp-plugin .msp-btn-commit-on:hover{color:#ae5d04;background:#f8f7f4}.msp-plugin .msp-btn-commit-on[disabled],.msp-plugin .msp-btn-commit-on[disabled]:hover,.msp-plugin .msp-btn-commit-on[disabled]:active,.msp-plugin .msp-btn-commit-on[disabled]:focus{color:#9c4302}.msp-plugin .msp-btn-commit-off,.msp-plugin .msp-btn-commit-off:active,.msp-plugin .msp-btn-commit-off:focus{color:#332b1f;background:#f6f5f3}.msp-plugin .msp-btn-commit-off:hover{color:#ae5d04;background:#fcfbfa}.msp-plugin .msp-btn-commit-off[disabled],.msp-plugin .msp-btn-commit-off[disabled]:hover,.msp-plugin .msp-btn-commit-off[disabled]:active,.msp-plugin .msp-btn-commit-off[disabled]:focus{color:#362e21}.msp-plugin .msp-btn-remove:hover{color:#f2f4f7}.msp-plugin .msp-btn-commit-on:hover{color:#fc6c03}.msp-plugin .msp-select-toggle:after{content:\"\";position:absolute;right:.75rem;top:50%;transform:translateY(-50%);width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:7px solid #ae5d04;opacity:0;pointer-events:none}.msp-plugin .msp-select-toggle:hover:after{opacity:1}.msp-plugin .msp-btn-action{height:32px;line-height:32px}.msp-plugin input[type=file]{display:block}.msp-plugin input[type=range]{display:block;width:100%}.msp-plugin select[multiple],.msp-plugin select[size],.msp-plugin textarea.msp-form-control,.msp-plugin textarea.msp-btn{height:auto}.msp-plugin .msp-control-top-offset{margin-top:1px}.msp-plugin .msp-btn-commit{text-align:right;padding:0 10px 0 0;line-height:32px;border:none;overflow:hidden;font-weight:700}.msp-plugin .msp-btn-commit .msp-icon{display:block-inline;line-height:32px;width:32px;text-align:center}.msp-plugin select.msp-form-control,.msp-plugin .msp-control-row select,.msp-plugin select.msp-btn{background:none;background-color:#f3f2ee;background-size:8px 12px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right 10px center;padding-right:24px}.msp-plugin select.msp-form-control:-moz-focusring,.msp-plugin .msp-control-row select:-moz-focusring,.msp-plugin select.msp-btn:-moz-focusring{color:transparent;text-shadow:0 0 0 #332b1f}.msp-plugin .msp-default-bg{background:#eeece7}.msp-plugin .msp-transparent-bg{background:transparent}.msp-plugin .msp-no-hover-outline:hover{color:#ae5d04;background-color:inherit;border:none;outline-offset:0!important;outline:none!important}.msp-plugin .msp-icon-inline{margin-right:8px}.msp-plugin .msp-control-row{position:relative;height:32px;background:#eeece7;margin-top:1px}.msp-plugin .msp-control-row>span.msp-control-row-label,.msp-plugin .msp-control-row>button.msp-control-button-label{line-height:32px;display:block;width:120px;text-align:right;padding:0 10px;color:#63533c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-control-row>button.msp-control-button-label{background:#eeece7;cursor:pointer}.msp-plugin .msp-control-row .msp-control-current{background:#eeece7}.msp-plugin .msp-control-row>div.msp-control-row-ctrl{position:absolute;inset:0 0 0 120px}.msp-plugin .msp-control-row>div.msp-control-row-text{position:absolute;inset:0 0 0 120px;display:flex;align-items:center;padding:0 10px}.msp-plugin .msp-control-row>div{background:#f3f2ee}.msp-plugin .msp-control-row>.msp-flex-row,.msp-plugin .msp-control-row>.msp-state-image-row{background:#eeece7}.msp-plugin .msp-control-label-short>span{width:80px!important}.msp-plugin .msp-control-label-short>div:nth-child(2){left:80px!important}.msp-plugin .msp-control-col-2{float:left;width:50%}.msp-plugin .msp-control-twoline{height:64px!important}.msp-plugin .msp-control-group{position:relative}.msp-plugin .msp-toggle-button .msp-icon{display:inline-block;margin-right:6px}.msp-plugin .msp-toggle-button>div>button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-slider>div:first-child{position:absolute;inset:0 62px 0 18px;display:flex}.msp-plugin .msp-slider>div:last-child{position:absolute;height:32px;line-height:32px;text-align:center;right:0;width:50px;top:0;bottom:0}.msp-plugin .msp-slider-no-input>div:first-child{right:18px}.msp-plugin .msp-slider-no-input>div:last-child{visibility:hidden;width:0}.msp-plugin .msp-slider input[type=text]{padding-right:6px;padding-left:4px;font-size:80%;text-align:right}.msp-plugin .msp-slider2>div:first-child{position:absolute;height:32px;line-height:32px;text-align:center;left:0;width:25px;top:0;bottom:0;font-size:80%}.msp-plugin .msp-slider2>div:nth-child(2){position:absolute;inset:0 37px 0 35px;display:flex}.msp-plugin .msp-slider2>div:last-child{position:absolute;height:32px;line-height:32px;text-align:center;right:0;width:25px;top:0;bottom:0;font-size:80%}.msp-plugin .msp-slider2 input[type=text]{padding-right:4px;padding-left:4px;font-size:80%;text-align:center}.msp-plugin .msp-toggle-color-picker button{border:10px solid rgb(243.2865853659,241.9085365854,238.4634146341)!important;margin:0;text-align:center;padding-right:10px;padding-left:10px}.msp-plugin .msp-toggle-color-picker button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-toggle-color-picker .msp-color-picker{position:absolute;z-index:100000;background:#eeece7;border-top:1px solid #eeece7;padding-bottom:5px;width:100%}.msp-plugin .msp-toggle-color-picker-above .msp-color-picker{top:-85px;height:85px}.msp-plugin .msp-toggle-color-picker-below .msp-color-picker{top:32px;height:80px}.msp-plugin .msp-control-offset{padding-left:10px}.msp-plugin .msp-accent-offset{padding-left:1px;margin-left:8px;border-left:2px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-control-group-wrapper{margin-bottom:0;margin-top:1px}.msp-plugin .msp-control-group-header{background:#eeece7}.msp-plugin .msp-control-group-header>button,.msp-plugin .msp-control-group-header div{padding-left:4px;text-align:left;height:24px!important;line-height:24px!important;font-size:85%!important;background:#eeece7!important;color:#63533c}.msp-plugin .msp-control-group-header .msp-icon{height:24px!important;line-height:24px!important}.msp-plugin .msp-control-group-header>span{padding-left:5px;line-height:21.3333333333px;font-size:70%;background:#eeece7;color:#63533c}.msp-plugin .msp-control-current{background:#eeece7}.msp-plugin .msp-control-group-footer{background:#e3e0d8;height:5px;font-size:1px;margin-top:1px}.msp-plugin .msp-control-group-expander{display:block;position:absolute;line-height:32px;padding:0;left:0;top:0;width:120px;text-align:left;background:transparent}.msp-plugin .msp-control-group-expander .msp-icon{line-height:29px;width:31px;text-align:center;font-size:100%}.msp-plugin .msp-plugin-layout_controls{position:absolute;left:10px;top:10px}.msp-plugin .msp-plugin-layout_controls>button:first-child{margin-right:6px}.msp-plugin .msp-empty-control{display:none}.msp-plugin .msp-control .msp-btn-block,.msp-plugin .msp-control .msp-control-row button,.msp-plugin .msp-control-row .msp-control button{margin-bottom:0;margin-top:0}.msp-plugin .msp-row-text{height:32px;position:relative;background:#eeece7;margin-top:1px}.msp-plugin .msp-row-text>div{line-height:32px;text-align:center;color:#63533c}.msp-plugin .msp-help span{display:none}.msp-plugin .msp-help:hover span{display:inline-block;background:linear-gradient(#eeece7,#eeece7cc)}.msp-plugin .msp-help-text{position:relative;background:#eeece7;margin-top:1px}.msp-plugin .msp-help-text>div{padding:5px 10px;text-align:left;color:#63533c}.msp-plugin .msp-help-text>p{padding:5px 10px;text-align:left;color:#63533c}.msp-plugin .msp-help-description{font-style:italic}.msp-plugin .msp-help-legend{padding-top:10px}.msp-plugin .msp-scale-legend>div{width:100%;height:30px}.msp-plugin .msp-scale-legend>div>span{padding:5px;color:#fff;font-weight:700;background-color:#0003}.msp-plugin .msp-table-legend>div{margin-right:5px;display:inline-flex}.msp-plugin .msp-table-legend>div .msp-table-legend-color{width:30px;height:20px}.msp-plugin .msp-table-legend>div .msp-table-legend-text{margin:0 5px}.msp-plugin .msp-image-preview{position:relative;background:#eeece7;margin-top:1px;padding:10px}.msp-plugin .msp-image-preview canvas{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.msp-plugin .msp-image-preview>span{margin-top:6px;display:block;text-align:center;font-size:80%;line-height:15px}.msp-plugin .msp-copy-image-wrapper{position:relative}.msp-plugin .msp-copy-image-wrapper div{font-weight:700;padding:3px;margin:1px 0;width:100%;background:#f3f2ee;text-align:center}.msp-plugin .msp-copy-image-wrapper img{margin-top:1px}.msp-plugin .msp-control-text-area-wrapper,.msp-plugin .msp-text-area-wrapper{position:relative}.msp-plugin .msp-control-text-area-wrapper textarea,.msp-plugin .msp-text-area-wrapper textarea{border:none;width:100%;height:100%;background:#f3f2ee;padding:5px 10px;resize:none;font-size:12px;line-height:16px}.msp-plugin .msp-control-text-area-wrapper{height:64px!important}.msp-plugin .msp-text-area-wrapper{height:96px!important}.msp-plugin .msp-help-row{position:relative;height:32px;background:#eeece7;margin-top:1px;display:table;width:100%}.msp-plugin .msp-help-row>span{width:120px;text-align:right;padding:3px 10px;color:#63533c;display:table-cell;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-help-row>div{background:#f3f2ee;position:relative;padding:3px 10px;display:table-cell}.msp-plugin .msp-canvas{width:100%;height:100%;background-color:#f3f2ee}.msp-plugin .msp-canvas text{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.msp-plugin .msp-canvas circle{stroke:#000;stroke-width:10;stroke-opacity:.3}.msp-plugin .msp-canvas circle:hover{fill:#ae5d04;stroke:#000;stroke-width:10px}.msp-plugin .msp-canvas .info{fill:#fff;stroke:#000;stroke-width:3}.msp-plugin .msp-canvas .show{visibility:visible}.msp-plugin .msp-canvas .hide{visibility:hidden}.msp-plugin .msp-canvas .delete-button rect{fill:#ed4337;stroke:#000}.msp-plugin .msp-canvas .delete-button text{stroke:#fff;fill:#fff}.msp-plugin .msp-canvas .delete-button:hover{stroke:#000;stroke-width:3;fill:#ff6961}.msp-plugin .msp-canvas .infoCircle:hover{fill:#4c66b2}.msp-plugin .msp-canvas:focus{outline:none}.msp-plugin .msp-log-wrap{position:absolute;inset:0;overflow:hidden}.msp-plugin .msp-log{position:absolute;inset:0 -20px 0 0;overflow-y:scroll;overflow-x:hidden;font-size:90%;background:#e0ddd4}.msp-plugin .msp-log{font-size:90%}.msp-plugin .msp-log ul{padding:0;margin:0}.msp-plugin .msp-log{color:#433829}.msp-plugin .msp-log li{clear:both;margin:0;background:#eeece7;position:relative}.msp-plugin .msp-log li:not(:last-child){border-bottom:1px solid rgb(206.2804878049,200.5487804878,186.2195121951)}.msp-plugin .msp-log .msp-log-entry{margin-left:110px;background:#ebe8e3;padding:3px 25px 3px 10px}.msp-plugin .msp-log .msp-log-timestamp{padding:3px 10px;float:left;text-align:right;width:110px;color:#726046;font-size:100%}.msp-plugin .msp-log .msp-log-timestamp small{font-size:100%}.msp-plugin .msp-log .label{margin-top:-3px;font-size:7pt}.msp-plugin .msp-log-entry-badge{position:absolute;left:0;top:0;bottom:0;width:6px}.msp-plugin .msp-log-entry-message{background:#0cca5d}.msp-plugin .msp-log-entry-info{background:#5e3673}.msp-plugin .msp-log-entry-error{background:#fd354b}.msp-plugin .msp-log-entry-warning{background:#fcc937}.msp-plugin .msp-slider-base{position:relative;height:14px;padding:5px 0;width:100%;border-radius:6px;align-self:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.msp-plugin .msp-slider-base *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.msp-plugin .msp-slider-base-rail{position:absolute;width:100%;background-color:#e0ddd4;height:4px;border-radius:2px}.msp-plugin .msp-slider-base-track{position:absolute;left:0;height:4px;border-radius:6px;background-color:tint(#332b1f,60%)}.msp-plugin .msp-slider-base-handle{position:absolute;margin-left:-11px;margin-top:-9px;width:22px;height:22px;cursor:pointer;border-radius:50%;background-color:#332b1f;border:4px solid rgb(224.2548780488,220.637804878,211.5951219512)}.msp-plugin .msp-slider-base-handle:hover{background-color:#ae5d04}.msp-plugin .msp-slider-base-mark{position:absolute;top:18px;left:0;width:100%;font-size:12px}.msp-plugin .msp-slider-base-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:#999}.msp-plugin .msp-slider-base-mark-text-active{color:#666}.msp-plugin .msp-slider-base-step{position:absolute;width:100%;height:4px;background:transparent}.msp-plugin .msp-slider-base-dot{position:absolute;bottom:-2px;margin-left:-4px;width:8px;height:8px;border:2px solid #e9e9e9;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.msp-plugin .msp-slider-base-dot:first-child{margin-left:-4px}.msp-plugin .msp-slider-base-dot:last-child{margin-left:-4px}.msp-plugin .msp-slider-base-dot-active{border-color:tint(#332b1f,50%)}.msp-plugin .msp-slider-base-disabled{background:#eeece7;opacity:.35}.msp-plugin .msp-slider-base-disabled .msp-slider-base-handle,.msp-plugin .msp-slider-base-disabled .msp-slider-base-dot{cursor:not-allowed}.msp-plugin .msp-slider-base-disabled .msp-slider-base-mark-text,.msp-plugin .msp-slider-base-disabled .msp-slider-base-dot{cursor:not-allowed!important}.msp-plugin .msp-markdown table{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);border-collapse:collapse}.msp-plugin .msp-markdown th{text-align:left}.msp-plugin .msp-markdown th,.msp-plugin .msp-markdown td{border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);padding:4px 8px}.msp-plugin .msp-markdown img{max-width:100%;height:auto}.msp-plugin .msp-description{padding:10px;font-size:85%;background:#eeece7;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;font-weight:light;cursor:default}.msp-plugin .msp-description:not(:first-child){border-top:1px solid rgb(224.2548780488,220.637804878,211.5951219512)}.msp-plugin .msp-color-picker input{color:#000!important}.msp-plugin .msp-no-webgl{position:absolute;width:100%;height:100%;left:0;top:0;display:table;text-align:center;background:#eeece7}.msp-plugin .msp-no-webgl>div b{font-size:120%}.msp-plugin .msp-no-webgl>div{display:table-cell;vertical-align:middle;text-align:center;width:100%;height:100%}.msp-plugin .msp-loader-msp-btn-file{position:relative;overflow:hidden}.msp-plugin .msp-loader-msp-btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;outline:none;background:#fff;cursor:inherit;display:block}.msp-plugin .msp-controls-section{margin-bottom:10px}.msp-plugin .msp-combined-color-button{border:4px solid rgb(243.2865853659,241.9085365854,238.4634146341)!important;margin:0;text-align:center;padding-right:10px;padding-left:10px}.msp-plugin .msp-combined-color-button:hover{border-color:#e9e6e0!important;border:none;outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-combined-color-swatch{width:100%;display:grid;grid-gap:1px;grid-template-columns:repeat(6,auto)}.msp-plugin .msp-combined-color-swatch .msp-btn:hover,.msp-plugin .msp-combined-color-swatch .msp-control-row button:hover,.msp-plugin .msp-control-row .msp-combined-color-swatch button:hover{outline-offset:-1px!important;outline:1px solid rgb(200.993902439,194.6402439024,178.756097561)!important}.msp-plugin .msp-action-select{position:relative}.msp-plugin .msp-action-select select{padding-left:42px}.msp-plugin .msp-action-select option:first-child{color:#63533c}.msp-plugin .msp-action-select>.msp-icon{display:block;top:0;left:10px;position:absolute;line-height:32px}.msp-plugin .msp-simple-help-section{height:28px;line-height:28px;margin-top:5px;margin-bottom:5px;padding:0 10px;font-weight:500;background:#eeece7;color:#332b1f}.msp-plugin .msp-left-panel-controls-buttons{position:absolute;width:32px;top:0;bottom:0;padding-top:10px;background:#eeece7}.msp-plugin .msp-left-panel-controls-buttons-bottom{position:absolute;bottom:0}.msp-plugin .msp-left-panel-controls-button-data-dirty{position:absolute;width:6px;height:6px;background:#e98b39;border-radius:3px;right:6px;bottom:6px}.msp-plugin .msp-left-panel-controls .msp-scrollable-container{left:33px}.msp-plugin .msp-mapped-parameter-group{position:relative}.msp-plugin .msp-mapped-parameter-group>.msp-control-row:first-child>div:nth-child(2){right:33px}.msp-plugin .msp-mapped-parameter-group>button:first-child{right:33px}.msp-plugin .msp-mapped-parameter-group>.msp-btn-icon{position:absolute;right:0;width:32px;top:0;padding:0}.msp-plugin .msp-shape-filled{fill:#332b1f;stroke:#332b1f}.msp-plugin .msp-shape-empty{fill:none;stroke:#332b1f}.msp-plugin .msp-no-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.msp-plugin .msp-25-lower-contrast-text{color:#826e4f}.msp-plugin .msp-expandable-group-color-stripe{position:absolute;left:0;top:30px;width:120px;height:2px}.msp-plugin .msp-section-header{height:32px;line-height:32px;margin-top:10px;margin-bottom:10px;text-align:right;padding:0 10px;font-weight:700;background:#eeece7;overflow:hidden;cursor:default}.msp-plugin .msp-section-header>.msp-icon{display:block;float:left}.msp-plugin .msp-section-header>small{font-weight:400}.msp-plugin .msp-current-header{height:32px;line-height:32px;margin-bottom:10px;text-align:center;font-weight:700;background:#eeece7}.msp-plugin .msp-flex-row,.msp-plugin .msp-state-image-row{margin-top:1px;background:#eeece7;display:flex;flex-direction:row;width:inherit;height:32px}.msp-plugin .msp-flex-row>.msp-flex-item,.msp-plugin .msp-state-image-row>.msp-flex-item{margin:0 1px 0 0;flex:1 1 auto;overflow:hidden}.msp-plugin .msp-flex-row>.msp-flex-item:last-child,.msp-plugin .msp-state-image-row>.msp-flex-item:last-child{margin-right:0}.msp-plugin .msp-flex-row>select,.msp-plugin .msp-state-image-row>select,.msp-plugin .msp-flex-row>button,.msp-plugin .msp-state-image-row>button{margin:0 1px 0 0;flex:1 1 auto;height:32px;overflow:hidden}.msp-plugin .msp-flex-row .msp-btn-icon,.msp-plugin .msp-state-image-row .msp-btn-icon,.msp-plugin .msp-flex-row .msp-btn-icon-small,.msp-plugin .msp-state-image-row .msp-btn-icon-small{flex:0 0 32px;max-width:32px}.msp-plugin .msp-flex-row>select,.msp-plugin .msp-state-image-row>select{background:none}.msp-plugin .msp-flex-row>select>option[value=_],.msp-plugin .msp-state-image-row>select>option[value=_]{display:none}.msp-plugin .msp-flex-row>select:last-child,.msp-plugin .msp-state-image-row>select:last-child,.msp-plugin .msp-flex-row>button:last-child,.msp-plugin .msp-state-image-row>button:last-child{margin-right:0}.msp-plugin .msp-flex-row>button.msp-control-button-label,.msp-plugin .msp-state-image-row>button.msp-control-button-label{background:#eeece7}.msp-plugin .msp-state-list{list-style:none}.msp-plugin .msp-state-list>li{position:relative;overflow:hidden}.msp-plugin .msp-state-list>li>button:first-child{text-align:left;border-left:10px solid rgb(212.6243902439,207.6390243902,195.1756097561)!important}.msp-plugin .msp-state-list>li>div{position:absolute;right:0;top:0}.msp-plugin .msp-state-image-row{height:96px;margin-top:0}.msp-plugin .msp-state-image-row>button{height:96px;padding:0}.msp-plugin .msp-state-image-row>button>img{min-height:96px;width:inherit;transform:translateY(-50%);top:50%;position:relative}.msp-plugin .msp-tree-row{position:relative;margin-top:0;margin-bottom:1px;background:transparent}.msp-plugin .msp-tree-row-current .msp-btn-tree-label>span{font-weight:700}.msp-plugin .msp-tree-row-current .msp-btn-tree-label{border-radius:0!important}.msp-plugin .msp-tree-row .msp-btn-tree-label{text-align:left;border-radius:0 0 0 8px;border-left-width:4px;border-left-style:solid}.msp-plugin .msp-tree-row .msp-btn-tree-label>small{color:#726046}.msp-plugin .msp-tree-updates-wrapper .msp-control-group-header:last-child{margin-bottom:1px}.msp-plugin .msp-viewport-top-left-controls{position:absolute;left:10px;top:10px}.msp-plugin .msp-viewport-top-left-controls .msp-traj-controls{line-height:32px;float:left;margin-right:10px;background-color:#f3f2ee}.msp-plugin .msp-viewport-top-left-controls .msp-traj-controls>span{color:#332b1f;margin-left:10px;margin-right:10px;font-size:85%;display:inline-block}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls{line-height:32px;float:left;margin-right:10px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls>button{background-color:#f3f2ee}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-viewport-controls>select{display:inline-block;width:200px;margin-right:10px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-animation-slider{position:relative;display:inline-block;width:120px;line-height:32px}.msp-plugin .msp-viewport-top-left-controls .msp-state-snapshot-animation-button{margin-left:10px}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls{line-height:32px;float:left;margin-right:10px;position:relative}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls>div:first-child{position:relative;display:inline-block}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls>div:first-child>button{position:relative}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls .msp-animation-viewport-controls-select{width:290px;position:absolute;left:0;margin-top:10px;background:#e0ddd4;z-index:10001}.msp-plugin .msp-viewport-top-left-controls .msp-animation-viewport-controls .msp-animation-viewport-controls-select .msp-control-row:first-child{margin-top:0}.msp-plugin .msp-selection-viewport-controls{position:relative;margin:10px auto 0;width:430px}.msp-plugin .msp-selection-viewport-controls-actions{position:absolute;width:100%;top:32px;background:#e0ddd4}.msp-plugin .msp-selection-viewport-controls>.msp-flex-row .msp-btn,.msp-plugin .msp-selection-viewport-controls>.msp-state-image-row .msp-btn,.msp-plugin .msp-selection-viewport-controls>.msp-flex-row .msp-control-row button,.msp-plugin .msp-control-row .msp-selection-viewport-controls>.msp-flex-row button,.msp-plugin .msp-selection-viewport-controls>.msp-state-image-row .msp-control-row button,.msp-plugin .msp-control-row .msp-selection-viewport-controls>.msp-state-image-row button{padding:0 5px}.msp-plugin .msp-selection-viewport-controls select.msp-form-control,.msp-plugin .msp-selection-viewport-controls select.msp-btn,.msp-plugin .msp-selection-viewport-controls .msp-control-row select,.msp-plugin .msp-control-row .msp-selection-viewport-controls select{padding:0 5px;text-align:center;background:#f3f2ee;flex:0 0 80px;text-overflow:ellipsis}.msp-plugin .msp-param-object-list-item{margin-top:1px;position:relative}.msp-plugin .msp-param-object-list-item>button{text-align:left}.msp-plugin .msp-param-object-list-item>button>span{font-weight:700}.msp-plugin .msp-param-object-list-item>div{position:absolute;right:0;top:0}.msp-plugin .msp-state-actions .msp-transform-wrapper:last-child{margin-bottom:10px}.msp-plugin .msp-button-row{display:flex;flex-direction:row;height:32px;width:inherit}.msp-plugin .msp-button-row>button{margin:0 1px 0 0;flex:1 1 auto;height:32px;text-align-last:center;background:none;padding:0 10px;overflow:hidden}.msp-plugin .msp-action-menu-options-no-header,.msp-plugin .msp-action-menu-options .msp-control-group-children{max-height:300px;overflow:hidden;overflow-y:auto}.msp-plugin .msp-action-menu-options .msp-control-row,.msp-plugin .msp-action-menu-options button,.msp-plugin .msp-action-menu-options .msp-icon,.msp-plugin .msp-action-menu-options .msp-flex-row,.msp-plugin .msp-action-menu-options .msp-state-image-row{height:24px;line-height:24px}.msp-plugin .msp-action-menu-options button{text-align:left}.msp-plugin .msp-action-menu-options .msp-action-menu-button{margin-top:1px;display:flex}.msp-plugin .msp-action-menu-options .msp-action-menu-button .msp-icon{margin-right:6px}.msp-plugin .msp-representation-entry{position:relative}.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-btn,.msp-plugin .msp-control-row .msp-representation-entry>.msp-control-group-header>button{font-weight:700}.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-icon,.msp-plugin .msp-representation-entry>.msp-control-group-header>.msp-btn-link{line-height:24px;height:24px}.msp-plugin .msp-control-group-presets-wrapper{position:absolute;right:0;top:0}.msp-plugin .msp-control-group-presets-wrapper .msp-control-group-header{background:transparent}.msp-plugin .msp-control-group-presets-wrapper button{background:transparent!important}.msp-plugin .msp-parameter-matrix input{flex:1 1 auto;min-width:0}.msp-plugin .msp-btn-apply-simple{text-align:left}.msp-plugin .msp-btn-apply-simple .msp-icon{margin-right:10px}.msp-plugin .msp-type-class-Root{border-left-color:#eeece7}.msp-plugin .msp-type-class-Group{border-left-color:#e98b39}.msp-plugin .msp-type-class-Data{border-left-color:#bfc8c9}.msp-plugin .msp-type-class-Object{border-left-color:#54d98c}.msp-plugin .msp-type-class-Representation3D{border-left-color:#4aa3df}.msp-plugin .msp-type-class-Behavior{border-left-color:#b07cc6}.msp-plugin .msp-accent-color-cyan{color:#bfc8c9}.msp-plugin .msp-accent-bg-cyan{background:#bfc8c9}.msp-plugin .msp-transform-header-brand-cyan{border-bottom:1px solid rgb(190.5846153846,200.3076923077,200.9153846154)}.msp-plugin .msp-transform-header-brand-cyan:active,.msp-plugin .msp-transform-header-brand-cyan:focus{border-bottom:1px solid rgb(190.5846153846,200.3076923077,200.9153846154)}.msp-plugin .msp-accent-color-red{color:#ef8b80}.msp-plugin .msp-accent-bg-red{background:#ef8b80}.msp-plugin .msp-transform-header-brand-red{border-bottom:1px solid rgb(239.3835616438,138.5273972603,128.1164383562)}.msp-plugin .msp-transform-header-brand-red:active,.msp-plugin .msp-transform-header-brand-red:focus{border-bottom:1px solid rgb(239.3835616438,138.5273972603,128.1164383562)}.msp-plugin .msp-accent-color-gray{color:#46637f}.msp-plugin .msp-accent-bg-gray{background:#46637f}.msp-plugin .msp-transform-header-brand-gray{border-bottom:1px solid rgb(70.1643835616,98.5,126.8356164384)}.msp-plugin .msp-transform-header-brand-gray:active,.msp-plugin .msp-transform-header-brand-gray:focus{border-bottom:1px solid rgb(70.1643835616,98.5,126.8356164384)}.msp-plugin .msp-accent-color-green{color:#54d98c}.msp-plugin .msp-accent-bg-green{background:#54d98c}.msp-plugin .msp-transform-header-brand-green{border-bottom:1px solid rgb(84.456,216.544,140.468)}.msp-plugin .msp-transform-header-brand-green:active,.msp-plugin .msp-transform-header-brand-green:focus{border-bottom:1px solid rgb(84.456,216.544,140.468)}.msp-plugin .msp-accent-color-purple{color:#b07cc6}.msp-plugin .msp-accent-bg-purple{background:#b07cc6}.msp-plugin .msp-transform-header-brand-purple{border-bottom:1px solid rgb(176.3389121339,124.4225941423,197.5774058577)}.msp-plugin .msp-transform-header-brand-purple:active,.msp-plugin .msp-transform-header-brand-purple:focus{border-bottom:1px solid rgb(176.3389121339,124.4225941423,197.5774058577)}.msp-plugin .msp-accent-color-blue{color:#4aa3df}.msp-plugin .msp-accent-bg-blue{background:#4aa3df}.msp-plugin .msp-transform-header-brand-blue{border-bottom:1px solid rgb(73.6589958159,162.989539749,222.8410041841)}.msp-plugin .msp-transform-header-brand-blue:active,.msp-plugin .msp-transform-header-brand-blue:focus{border-bottom:1px solid rgb(73.6589958159,162.989539749,222.8410041841)}.msp-plugin .msp-accent-color-orange{color:#e98b39}.msp-plugin .msp-accent-bg-orange{background:#e98b39}.msp-plugin .msp-transform-header-brand-orange{border-bottom:1px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-transform-header-brand-orange:active,.msp-plugin .msp-transform-header-brand-orange:focus{border-bottom:1px solid rgb(232.5914634146,139.3719512195,56.9085365854)}.msp-plugin .msp-volume-channel-inline-controls>:first-child{position:absolute;left:0;top:0;height:32px;right:32px}.msp-plugin .msp-volume-channel-inline-controls .msp-slider>div:first-child{right:42px}.msp-plugin .msp-volume-channel-inline-controls .msp-slider>div:last-child{width:30px}.msp-plugin .msp-volume-channel-inline-controls>button{position:absolute;right:0;width:32px;top:0;padding:0}.msp-plugin .msp-volume-channel-inline-controls>button .msp-material-icon{margin-right:0}.msp-plugin .msp-list-unstyled{padding-left:0;list-style:none}.msp-plugin .msp-drag-drop-overlay{border:12px dashed #332b1f;background:#0000005c;display:flex;align-items:center;justify-content:center;position:absolute;inset:0;font-size:48px;font-weight:700}.msp-plugin .msp-task-state{line-height:32px}.msp-plugin .msp-task-state>span{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-overlay-tasks{position:absolute;display:flex;inset:0;height:100%;width:100%;z-index:1000;justify-content:center;align-items:center;background:#00000040}.msp-plugin .msp-overlay-tasks .msp-task-state>div{height:32px;margin-top:1px;position:relative;width:100%;background:#eeece7}.msp-plugin .msp-overlay-tasks .msp-task-state>div>div{height:32px;line-height:32px;display:inline-block;padding:0 10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;white-space:nowrap;background:#eeece7;position:absolute}.msp-plugin .msp-overlay-tasks .msp-task-state>div>button{display:inline-block;margin-top:-3px}.msp-plugin .msp-background-tasks{position:absolute;left:0;bottom:0;z-index:1000}.msp-plugin .msp-background-tasks .msp-task-state>div{height:32px;margin-top:1px;position:relative;width:100%;background:#eeece7}.msp-plugin .msp-background-tasks .msp-task-state>div>div{height:32px;line-height:32px;display:inline-block;padding:0 10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;white-space:nowrap;background:#eeece7;position:absolute}.msp-plugin .msp-background-tasks .msp-task-state>div>button{display:inline-block;margin-top:-3px}.msp-plugin .msp-viewport{position:absolute;inset:0;background:#eeece7}.msp-plugin .msp-viewport .msp-btn-link{background:#0003}.msp-plugin .msp-viewport-expanded{position:fixed;z-index:1000}.msp-plugin .msp-viewport-controls{position:absolute;right:10px;top:10px;width:32px}.msp-plugin .msp-viewport-controls-buttons{text-align:right;position:relative}.msp-plugin .msp-viewport-controls-buttons>div{position:relative;margin-bottom:4px}.msp-plugin .msp-viewport-controls-buttons button{padding:0;text-align:center;width:32px;position:relative}.msp-plugin .msp-viewport-controls-buttons .msp-btn-link-toggle-off{color:#9c835f}.msp-plugin .msp-viewport-controls-buttons .msp-btn-link:hover{color:#ae5d04}.msp-plugin .msp-semi-transparent-background{background:#eeece7;opacity:.5;position:absolute;top:0;left:0;width:100%;height:100%}.msp-plugin .msp-hover-box-wrapper{position:relative}.msp-plugin .msp-hover-box-wrapper .msp-hover-box-body{visibility:hidden;position:absolute;right:36px;top:0;width:100px;background-color:#eeece7}.msp-plugin .msp-hover-box-wrapper .msp-hover-box-spacer{visibility:hidden;position:absolute;right:32px;top:0;width:4px;height:32px}.msp-plugin .msp-hover-box-wrapper:hover .msp-hover-box-body,.msp-plugin .msp-hover-box-wrapper:hover .msp-hover-box-spacer{visibility:visible}.msp-plugin .msp-viewport-controls-panel{width:290px;top:0;right:36px;position:absolute;background:#e0ddd4}.msp-plugin .msp-viewport-controls-panel .msp-control-group-wrapper:first-child{padding-top:0}.msp-plugin .msp-viewport-controls-panel .msp-viewport-controls-panel-controls{overflow-y:auto;max-height:400px}.msp-plugin .msp-highlight-toast-wrapper{position:absolute;right:10px;bottom:10px;max-width:95%;z-index:10000;pointer-events:none}.msp-plugin .msp-highlight-toast-wrapper .msp-toast-container{pointer-events:initial}.msp-plugin .msp-highlight-info{color:#ae5d04;padding:3px 10px;background:#eeece7;opacity:90%;max-width:400px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default}.msp-plugin .msp-highlight-markdown-row{padding-left:10px}.msp-plugin .msp-highlight-simple-row{text-align:right}.msp-plugin .msp-highlight-info-hr{margin-inline:0px;margin-block:3px;border:none;height:1px;background-color:#ae5d04}.msp-plugin .msp-highlight-info-additional{font-size:85%;display:inline-block;color:#fa911e}.msp-plugin .msp-snapshot-description-wrapper{background:#eeece780;position:absolute;left:0;top:42px;padding:6.6px 10px;max-height:224px;overflow:hidden;overflow-y:auto;width:max-content;max-width:400px}.msp-plugin .msp-snapshot-description-wrapper a{text-decoration:underline;cursor:pointer;color:#332b1f}.msp-plugin .msp-snapshot-description-wrapper ul,.msp-plugin .msp-snapshot-description-wrapper ol{padding-left:14px}.msp-plugin .msp-sequence{position:absolute;inset:0;background:#eeece7}.msp-plugin .msp-sequence-select{position:relative;height:24px;width:100%;margin-bottom:1px;background:#e0ddd4;text-align:left}.msp-plugin .msp-sequence-select>span{display:inline-block;line-height:24px;padding:0 10px;font-size:85%;font-weight:700;cursor:default}.msp-plugin .msp-sequence-select>select{display:inline-block;max-width:120px;width:auto;text-overflow:ellipsis;font-size:85%;height:24px;line-height:24px;background-size:6px 8px;background-color:#e0ddd4}.msp-plugin .msp-sequence-wrapper{word-break:break-word;padding:10px 10px 3px;user-select:none}.msp-plugin .msp-sequence-wrapper-non-empty{font-size:85%;line-height:180%;font-family:Courier New,monospace;background:#f3f2ee;width:100%;overflow-y:auto;overflow-x:hidden;position:absolute;inset:25px 0 0}.msp-plugin .msp-sequence-chain-label{margin-left:10px;margin-top:10px;user-select:none;color:#ae5d04;font-size:90%;line-height:90%;padding-left:.2em}.msp-plugin .msp-sequence-wrapper span{cursor:pointer}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-long{margin:0 .2em}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-long-begin{margin:0 .2em 0 0}.msp-plugin .msp-sequence-wrapper .msp-sequence-residue-focused{font-weight:700;text-decoration:underline}.msp-plugin .msp-sequence-wrapper .msp-sequence-label{color:#ae5d04;font-size:90%;line-height:90%;padding-bottom:1em;padding-left:.2em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number{color:#ae5d04;word-break:keep-all;cursor:default;position:relative;top:-1.1em;left:3.1em;padding:0;margin-left:-3em;font-size:80%;pointer-events:none}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-long{left:3.3em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-long-negative{left:2.7em}.msp-plugin .msp-sequence-wrapper .msp-sequence-number-negative{left:2.5em}.msp-plugin .msp-sequence-wrapper .msp-sequence-present{color:#332b1f}.msp-plugin .msp-sequence-wrapper .msp-sequence-missing{color:#b4a184;cursor:default}.msp-plugin .msp-transformer .msp-entity-badge{position:absolute;top:0;right:0;height:32px;line-height:32px;width:32px}.msp-plugin .msp-layout-right,.msp-plugin .msp-layout-left{background:#e0ddd4}.msp-plugin .msp-transformer-wrapper{position:relative}.msp-plugin .msp-transformer-wrapper .msp-entity-badge{left:0;top:0}.msp-plugin .msp-transformer-wrapper:first-child .msp-panel-description-content{top:33px}.msp-plugin .msp-transformer-wrapper:not(:first-child) .msp-panel-description-content{bottom:33px}.msp-plugin .msp-transform-wrapper{margin-bottom:10px}.msp-plugin .msp-transform-wrapper-collapsed,.msp-plugin .msp-transform-update-wrapper,.msp-plugin .msp-transform-update-wrapper-collapsed{margin-bottom:1px}.msp-plugin .msp-transform-update-wrapper>.msp-transform-header>button,.msp-plugin .msp-transform-update-wrapper-collapsed>.msp-transform-header>button{text-align:left;padding-left:32px;line-height:24px;background:#e9e6e0}.msp-plugin .msp-transform-wrapper>.msp-transform-header>button{text-align:left;background:#eeece7;font-weight:700;padding-right:5px}.msp-plugin .msp-transform-header{position:relative}.msp-plugin .msp-transform-header>button>small{font-weight:400;float:right}.msp-plugin .msp-transform-header>button>span:first-child{margin-right:10px}.msp-plugin .msp-transform-header>button:hover{color:#63533c}.msp-plugin .msp-transform-header-brand{margin-bottom:-1px}.msp-plugin .msp-transform-header-brand svg{fill:#332b1f;stroke:#332b1f}.msp-plugin .msp-transform-default-params{background:#eeece7;position:absolute;left:0;top:0;width:32px;padding:0}.msp-plugin .msp-transform-default-params:hover{background:#fff}.msp-plugin .msp-transform-apply-wrap{position:relative;margin-top:1px;width:100%;height:32px}.msp-plugin .msp-transform-refresh{width:87px;margin-left:33px;background:#eeece7;text-align:right}.msp-plugin .msp-transform-apply{display:block;position:absolute;left:120px;right:0;top:0}.msp-plugin .msp-transform-apply-wider{margin-left:33px}.msp-plugin .msp-data-beh{margin:10px 0!important}.msp-plugin .msp-toast-container{position:relative;z-index:1001}.msp-plugin .msp-toast-container .msp-toast-entry{color:#332b1f;background:#e0ddd4;position:relative;float:right;min-height:32px;margin-top:10px;border:1px solid rgb(206.2804878049,200.5487804878,186.2195121951);display:table}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-title{height:100%;line-height:32px;padding:0 10px;background:#eeece7;font-weight:700;display:table-cell;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;font-weight:light;cursor:pointer}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message{padding:3px 42px 3px 10px;display:table-cell}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a{text-decoration:none;color:#974102;font-weight:700}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:hover{text-decoration:underline;color:#fc6c03}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:active,.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-message a:focus{color:#974102;outline-offset:0;outline:none}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-hide{position:absolute;width:42px;right:0;top:0;bottom:0}.msp-plugin .msp-toast-container .msp-toast-entry .msp-toast-hide .msp-btn-icon{background:transparent;position:absolute;inset:1px 0 0;width:100%;text-align:right;padding-right:5px}.msp-plugin .msp-logo{display:block;position:absolute;bottom:10px;right:10px;height:32px;width:100px;background-repeat:no-repeat;background-position:bottom right;background-size:auto;background-image:url(data:image/png;base64,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)}.msp-plugin .msp-plugin-content{color:#332b1f}.msp-plugin .msp-plugin-init-error{white-space:pre;margin:10px}.msp-plugin .msp-svg-text{fill:#332b1f}.msp-plugin{background:#eeece7}\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n/*# sourceMappingURL=molstar.css.map */\n`\n", "import { useEffect, useRef, useState } from 'react'\n\nimport { isAlive } from '@jbrowse/mobx-state-tree'\n\nimport loadMolstar from './loadMolstar'\n\nimport type { JBrowsePluginProteinViewModel } from './model'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport default function useProteinView({\n showControls,\n model,\n}: {\n showControls: boolean\n model?: JBrowsePluginProteinViewModel\n}) {\n const parentRef = useRef<HTMLDivElement>(null)\n const pluginRef = useRef<PluginContext | null>(null)\n const [error, setError] = useState<unknown>()\n const [loading, setLoading] = useState(true)\n\n // Create the Mol* plugin once on mount. showControls is intentionally NOT a\n // dependency: toggling it is applied at runtime in the effect below via\n // Layout.Update, rather than tearing down and rebuilding the entire WebGL\n // plugin (which leaks a GPU context and reloads every structure each toggle).\n useEffect(() => {\n const state: {\n cancelled: boolean\n plugin?: PluginContext\n host?: HTMLDivElement\n } = { cancelled: false }\n void (async () => {\n try {\n if (!parentRef.current) {\n return\n }\n const {\n GeometryExport,\n MAQualityAssessment,\n PluginConfig,\n PluginSpec,\n DefaultPluginUISpec,\n createPluginUI,\n renderReact18,\n } = await loadMolstar()\n\n const host = document.createElement('div')\n parentRef.current.append(host)\n state.host = host\n const defaultSpec = DefaultPluginUISpec()\n const created = await createPluginUI({\n target: host,\n render: renderReact18,\n spec: {\n ...DefaultPluginUISpec(),\n behaviors: [\n ...defaultSpec.behaviors,\n PluginSpec.Behavior(GeometryExport),\n // Parses per-residue pLDDT from AlphaFold mmCIF and registers the\n // 'plddt-confidence' color theme used by the color-scheme menu.\n PluginSpec.Behavior(MAQualityAssessment),\n ],\n layout: {\n initial: {\n controlsDisplay: 'reactive',\n showControls,\n },\n },\n config: [[PluginConfig.Viewport.ShowExpand, false]],\n },\n })\n await created.initialized\n if (state.cancelled) {\n created.dispose()\n host.remove()\n } else {\n state.plugin = created\n pluginRef.current = created\n model?.setMolstarPluginContext(created)\n }\n } catch (e) {\n console.error(e)\n setError(e)\n } finally {\n setLoading(false)\n }\n })()\n return () => {\n state.cancelled = true\n pluginRef.current = null\n // Drop the stale reference before disposing so model autoruns don't act\n // on a torn-down plugin.\n if (model && isAlive(model)) {\n model.setMolstarPluginContext(undefined)\n }\n // dispose() (not unmount()) is what frees the WebGL context, canvas3d and\n // GPU buffers; unmount() is a no-op on the createPluginUI path. Mirrors\n // Mol*'s own Viewer.dispose().\n state.plugin?.dispose()\n state.host?.remove()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Show/hide the Mol* controls panel at runtime without rebuilding the plugin.\n useEffect(() => {\n const state = { cancelled: false }\n void (async () => {\n const plugin = pluginRef.current\n if (plugin) {\n const { PluginCommands } = await loadMolstar()\n if (!state.cancelled) {\n await PluginCommands.Layout.Update(plugin, {\n state: { showControls },\n })\n }\n }\n })()\n return () => {\n state.cancelled = true\n }\n }, [showControls])\n\n return { parentRef, error, loading }\n}\n", "import React from 'react'\n\nimport { ErrorMessage, LoadingEllipses, ResizeHandle } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n\nimport ManualAlignmentDialog from './ManualAlignmentDialog'\nimport ProteinViewHeader from './ProteinViewHeader'\nimport css from '../css/molstar'\nimport useProteinView from '../useProteinView'\n\nimport type { JBrowsePluginProteinViewModel } from '../model'\n\nconst style = document.createElement('style')\nstyle.append(css)\ndocument.head.append(style)\n\nconst ProteinView = observer(function ProteinView({\n model,\n}: {\n model: JBrowsePluginProteinViewModel\n}) {\n const { showControls } = model\n const { parentRef, error, loading } = useProteinView({\n showControls,\n model,\n })\n\n if (error) {\n return <ErrorMessage error={error} />\n }\n return (\n <ProteinViewContainer\n model={model}\n parentRef={parentRef}\n loading={loading}\n />\n )\n})\n\nconst ProteinViewContainer = observer(function ProteinViewContainer({\n model,\n parentRef,\n loading,\n}: {\n model: JBrowsePluginProteinViewModel\n parentRef?: React.RefObject<HTMLDivElement | null>\n loading?: boolean\n}) {\n const { width, height, error, structures } = model\n\n // Capture/automation signal: the structure has finished loading and no\n // pairwise alignment is still pending, so the view is painted in its settled\n // state. Lets screenshot/e2e tooling wait deterministically instead of\n // guessing a fixed settle time.\n const ready = !loading && structures.every(s => !s.alignmentPending)\n\n return (\n <div\n style={{ background: '#ccc' }}\n data-testid={ready ? 'protein-view-ready' : 'protein-view-loading'}\n >\n {error ? <ErrorMessage error={error} /> : null}\n {loading ? (\n <LoadingEllipses message=\"Loading protein viewer\" />\n ) : (\n <ProteinViewHeader model={model} />\n )}\n <div\n ref={parentRef}\n style={{\n position: 'relative',\n width,\n height,\n }}\n />\n <ResizeHandle\n style={{ height: 4, background: 'grey' }}\n onDrag={delta => {\n return model.setHeight(model.height + delta)\n }}\n />\n <ManualAlignmentDialog model={model} />\n </div>\n )\n})\n\nexport default ProteinView\n", "import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, doesIntersect2 } from '@jbrowse/core/util'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature, Region } from '@jbrowse/core/util'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Observable } from 'rxjs'\n\ninterface UniProtVariantFeature {\n begin: string\n end: string\n wildType: string\n mutatedType: string\n xrefs: {\n name: string\n id: string\n url: string\n alternativeUrl: string\n }[]\n predictions?: {\n score: number\n }[]\n descriptions?: {\n value: string\n }[]\n populationFrequencies?: {\n frequency?: number\n }[]\n}\n\nexport default class UniProtVariationAdapter extends BaseFeatureDataAdapter {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n public feats:\n | Promise<{ uniqueId: string; start: number; end: number }[]>\n | undefined\n\n private async loadDataP() {\n const { features } = JSON.parse(\n await openLocation(this.getConf('location')).readFile('utf8'),\n ) as { features: UniProtVariantFeature[] }\n\n const scoreField = this.getConf('scoreField')\n\n return features.map(({ begin, end, ...rest }, idx) => ({\n ...rest,\n uniqueId: `feat-${idx}`,\n start: +begin,\n end: +end + 1,\n score:\n scoreField === 'population_frequency'\n ? rest.populationFrequencies?.[0]?.frequency\n : scoreField === 'variant_impact_score'\n ? rest.predictions?.[0]?.score\n : undefined,\n description: rest.descriptions?.map(d => d.value).join(','),\n name: [\n rest.mutatedType\n ? `${rest.wildType}->${rest.mutatedType}`\n : `${rest.wildType}->del`,\n ],\n }))\n }\n\n private async loadData(_opts: BaseOptions = {}) {\n this.feats ??= this.loadDataP().catch((e: unknown) => {\n this.feats = undefined\n throw e\n })\n\n return this.feats\n }\n\n public async getRefNames(_opts: BaseOptions = {}) {\n return []\n }\n\n public getFeatures(query: Region, _opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const { start, end, refName } = query\n const data = await this.loadData()\n for (const f of data) {\n if (doesIntersect2(f.start, f.end, start, end)) {\n observer.next(new SimpleFeature({ ...f, refName }))\n }\n }\n observer.complete()\n })\n }\n\n public freeResources(): void {}\n}\n", "import Plugin from '@jbrowse/core/Plugin'\n\nimport AddHighlightModelF from './AddHighlightModel'\nimport AlphaFoldConfidenceAdapterF from './AlphaFoldConfidenceAdapter'\nimport AlphaMissensePathogenicityAdapterF from './AlphaMissensePathogenicityAdapter'\nimport LaunchProteinViewF from './LaunchProteinView'\nimport LaunchProteinViewExtensionPointF from './LaunchProteinViewExtensionPoint'\nimport ProteinViewF from './ProteinView'\nimport UniProtVariationAdapterF from './UniProtVariationAdapter'\nimport { version } from './version'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default class ProteinViewer extends Plugin {\n name = 'ProteinViewer'\n version = version\n\n install(pluginManager: PluginManager) {\n ProteinViewF(pluginManager)\n LaunchProteinViewF(pluginManager)\n LaunchProteinViewExtensionPointF(pluginManager)\n AddHighlightModelF(pluginManager)\n AlphaFoldConfidenceAdapterF(pluginManager)\n AlphaMissensePathogenicityAdapterF(pluginManager)\n UniProtVariationAdapterF(pluginManager)\n }\n\n configure(_pluginManager: PluginManager) {}\n}\n", "import React from 'react'\n\nimport HighlightComponents from './HighlightComponents'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function AddHighlightModelF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LinearGenomeView-TracksContainerComponent',\n // @ts-expect-error\n (rest: React.ReactNode[], { model }: { model: LinearGenomeViewModel }) => {\n return [\n ...rest,\n <HighlightComponents\n key=\"highlight_protein_viewer_protein3d\"\n model={model}\n />,\n ]\n },\n )\n}\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport GenomeMouseoverHighlight from './GenomeMouseoverHighlight'\nimport GenomeTo1DProteinHoverHighlight from './GenomeTo1DProteinHoverHighlight'\nimport Protein1DToGenomeHoverHighlight from './Protein1DToGenomeHoverHighlight'\nimport {\n ProteinToGenomeClickHighlight,\n ProteinToGenomeHoverHighlight,\n} from './ProteinToGenomeHighlight'\nimport ProteinToMsaHoverSync from './ProteinToMsaHoverSync'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst HighlightComponents = observer(function Highlight({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n return (\n <>\n <ProteinToGenomeClickHighlight model={model} />\n <ProteinToGenomeHoverHighlight model={model} />\n <Protein1DToGenomeHoverHighlight model={model} />\n <GenomeTo1DProteinHoverHighlight model={model} />\n <GenomeMouseoverHighlight model={model} />\n <ProteinToMsaHoverSync model={model} />\n </>\n )\n})\n\nexport default HighlightComponents\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { checkHovered } from '../ProteinView/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst GenomeMouseoverHighlight = observer(function GenomeMouseoverHighlight({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const session = getSession(model)\n const { views, hovered } = session\n if (checkHovered(hovered) && views.some(s => s.type === 'ProteinView')) {\n const { assemblyNames } = model\n const { coord, refName } = hovered.hoverPosition\n return (\n <Highlight\n model={model}\n start={coord - 1}\n end={coord}\n refName={refName}\n assemblyName={assemblyNames[0]!}\n />\n )\n }\n return null\n})\n\nexport default GenomeMouseoverHighlight\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport { useStyles } from './util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst Highlight = observer(function Highlight({\n assemblyName,\n start,\n end,\n refName,\n model,\n}: {\n model: LinearGenomeViewModel\n assemblyName: string\n start: number\n end: number\n refName: string\n}) {\n const { cx, classes } = useStyles()\n const { assemblyManager } = getSession(model)\n const { offsetPx } = model\n const assembly = assemblyManager.get(assemblyName)\n const ref = assembly?.getCanonicalRefName(refName) ?? refName\n const s = model.bpToPx({ refName: ref, coord: start })\n const e = model.bpToPx({ refName: ref, coord: end })\n if (s && e) {\n const width = Math.max(Math.abs(e.offsetPx - s.offsetPx), 3)\n const left = Math.min(s.offsetPx, e.offsetPx) - offsetPx\n return (\n <div\n className={cx(\n classes.highlight,\n width <= 3 ? classes.thinborder : undefined,\n )}\n style={{ left, width }}\n />\n )\n } else {\n return null\n }\n})\n\nexport default Highlight\n", "import { makeStyles } from 'tss-react/mui'\n\nimport type { JBrowsePluginProteinViewModel } from '../ProteinView/model'\nimport type { AbstractSessionModel } from '@jbrowse/core/util'\n\nexport const useStyles = makeStyles()({\n highlight: {\n height: '100%',\n background: 'rgba(255,255,0,0.2)',\n border: '1px solid rgba(50,50,0,0.2)',\n position: 'absolute',\n zIndex: 99,\n textAlign: 'center',\n pointerEvents: 'none',\n overflow: 'hidden',\n },\n thinborder: {\n border: '1px solid black',\n },\n})\n\nexport function getProteinView(\n session: AbstractSessionModel,\n): JBrowsePluginProteinViewModel | undefined {\n const view = session.views.find(v => v.type === 'ProteinView')\n return view as JBrowsePluginProteinViewModel | undefined\n}\n", "import React from 'react'\n\nimport { SimpleFeature, getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { protein1DViewRegistry } from '../Protein1DViewRegistry'\nimport { checkHovered } from '../ProteinView/util'\nimport { genomeToTranscriptSeqMapping } from '../mappings'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst GenomeTo1DProteinHoverHighlight = observer(\n function GenomeTo1DProteinHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n const session = getSession(model)\n const { hovered } = session\n const { assemblyNames, id: viewId } = model\n\n const assemblyName = assemblyNames[0]\n if (!assemblyName) {\n return null\n }\n\n const protein1DInfo = protein1DViewRegistry.get(viewId)\n if (!protein1DInfo) {\n return null\n }\n\n if (!checkHovered(hovered)) {\n return null\n }\n\n const { coord } = hovered.hoverPosition\n\n const feature = new SimpleFeature(protein1DInfo.feature)\n const mapping = genomeToTranscriptSeqMapping(feature)\n const { g2p } = mapping\n const proteinPos = g2p[coord - 1]\n if (proteinPos === undefined) {\n return null\n }\n\n return (\n <Highlight\n model={model}\n start={proteinPos}\n end={proteinPos + 1}\n refName={protein1DInfo.uniprotId}\n assemblyName={protein1DInfo.uniprotId}\n />\n )\n },\n)\n\nexport default GenomeTo1DProteinHoverHighlight\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { protein1DViewRegistry } from '../Protein1DViewRegistry'\nimport { checkHovered } from '../ProteinView/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst Protein1DToGenomeHoverHighlight = observer(\n function Protein1DToGenomeHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n const session = getSession(model)\n const { hovered } = session\n const { assemblyNames, id: viewId } = model\n\n if (!checkHovered(hovered)) {\n return null\n }\n\n const { coord, refName } = hovered.hoverPosition\n const protein1DInfo = protein1DViewRegistry.getByUniprotId(refName, session)\n\n if (protein1DInfo?.connectedViewId !== viewId) {\n return null\n }\n\n const assemblyName = assemblyNames[0]\n if (!assemblyName) {\n return null\n }\n\n const genomeHighlight =\n protein1DViewRegistry.getGenomeHighlightForProteinPosition(\n refName,\n coord - 1,\n session,\n )\n\n if (!genomeHighlight) {\n return null\n }\n\n return (\n <Highlight\n model={model}\n start={genomeHighlight.start}\n end={genomeHighlight.end}\n refName={genomeHighlight.refName}\n assemblyName={assemblyName}\n />\n )\n },\n)\n\nexport default Protein1DToGenomeHoverHighlight\n", "import React from 'react'\n\nimport { observer } from 'mobx-react'\n\nimport ProteinToGenomeHighlightInner from './ProteinToGenomeHighlightInner'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport const ProteinToGenomeClickHighlight = observer(\n function ProteinToGenomeClickHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n return (\n <ProteinToGenomeHighlightInner\n model={model}\n field=\"clickGenomeHighlights\"\n />\n )\n },\n)\n\nexport const ProteinToGenomeHoverHighlight = observer(\n function ProteinToGenomeHoverHighlight({\n model,\n }: {\n model: LinearGenomeViewModel\n }) {\n return (\n <ProteinToGenomeHighlightInner\n model={model}\n field=\"hoverGenomeHighlights\"\n />\n )\n },\n)\n", "import React from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\nimport Highlight from './Highlight'\nimport { getProteinView } from './util'\n\nimport type { JBrowsePluginProteinStructureModel } from '../ProteinView/model'\nimport type { Region } from '@jbrowse/core/util/types'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ntype HighlightField = 'clickGenomeHighlights' | 'hoverGenomeHighlights'\n\nconst ProteinToGenomeHighlightInner = observer(\n function ProteinToGenomeHighlightInner({\n model,\n field,\n }: {\n model: LinearGenomeViewModel\n field: HighlightField\n }) {\n const session = getSession(model)\n const { assemblyManager } = session\n const { assemblyNames } = model\n const proteinView = getProteinView(session)\n const assemblyName = assemblyNames[0]\n const assembly = assemblyName\n ? assemblyManager.get(assemblyName)\n : undefined\n return assembly && assemblyName ? (\n <>\n {proteinView?.structures.flatMap(\n (structure: JBrowsePluginProteinStructureModel, idx: number) =>\n structure[field].map((r: Region, idx2: number) => (\n <Highlight\n key={`${r.refName}-${r.start}-${r.end}-${idx}-${idx2}`}\n start={r.start}\n end={r.end}\n refName={r.refName}\n assemblyName={assemblyName}\n model={model}\n />\n )),\n )}\n </>\n ) : null\n },\n)\n\nexport default ProteinToGenomeHighlightInner\n", "import { useEffect } from 'react'\n\nimport { getSession } from '@jbrowse/core/util'\nimport { autorun, untracked } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport { findStructureRowName } from './msaRowMatch'\nimport { getProteinView } from './util'\nimport { stripStopCodon } from '../LaunchProteinView/utils/util'\n\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\n// CROSS-REPO DEPENDENCY: react-msaview (https://github.com/GMOD/react-msaview)\n//\n// This file reaches into the live MsaView model exposed by the `react-msaview`\n// library (via the jbrowse-plugin-msaview wrapper) to drive a bidirectional\n// hover highlight between a 3D structure and its alignment. The member names\n// below are part of react-msaview's public model API \u2014 see\n// react-msaview/packages/lib/src/model.ts (`mouseCol`, `setMousePos`). If those\n// names change there, this sync silently stops working, so the two repos must\n// be kept in step.\n//\n// NOTE on coordinates: `mouseCol` is an MSA *visible column* (accounts for both\n// alignment gaps and hidden gappy columns), whereas `structureSeqHoverPos` is an\n// ungapped residue index in the structure's sequence. We translate across gaps\n// with react-msaview's `visibleColToSeqPos(rowName, col)` /\n// `seqPosToVisibleCol(rowName, seqPos)`, anchoring the structure to its MSA row\n// by matching sequences (see findStructureRowName). When the row can't be\n// resolved (MSA not loaded, no matching row) we fall back to the 1:1 mapping,\n// which is correct when the structure's row has no gaps and no columns hidden.\ninterface MsaView {\n id: string\n type: string\n mouseCol?: number\n setMousePos?: (col?: number, row?: number) => void\n rowMap?: Map<string, string>\n seqPosToVisibleCol?: (rowName: string, seqPos: number) => number | undefined\n visibleColToSeqPos?: (\n rowName: string,\n visibleCol: number,\n ) => number | undefined\n}\n\nconst ProteinToMsaHoverSync = observer(function ProteinToMsaHoverSync({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const session = getSession(model)\n const { views } = session\n\n const proteinView = getProteinView(session)\n\n const connectedMsaViewId = proteinView?.connectedMsaViewId\n const msaView = connectedMsaViewId\n ? (views.find(f => f.id === connectedMsaViewId) as MsaView | undefined)\n : undefined\n\n useEffect(() => {\n if (!proteinView || !msaView) {\n return\n }\n\n const disposers: (() => void)[] = []\n\n // Resolve which MSA row corresponds to the structure once the MSA loads.\n // Recomputes only when the alignment rows or structure sequence change, not\n // on every hover, so the per-hover conversions below stay cheap.\n let structureRowName: string | undefined\n disposers.push(\n autorun(() => {\n const seq = proteinView.primaryStructure?.structureSequences?.[0]\n structureRowName = findStructureRowName(\n msaView.rowMap,\n seq === undefined ? undefined : stripStopCodon(seq),\n )\n }),\n )\n\n if (msaView.setMousePos) {\n const { setMousePos } = msaView\n disposers.push(\n autorun(() => {\n const structure = proteinView.primaryStructure\n if (structure) {\n const seqPos = structure.structureSeqHoverPos\n const col =\n seqPos !== undefined &&\n structureRowName !== undefined &&\n msaView.seqPosToVisibleCol\n ? msaView.seqPosToVisibleCol(structureRowName, seqPos)\n : seqPos\n setMousePos(col)\n }\n }),\n )\n }\n\n disposers.push(\n autorun(() => {\n const col = msaView.mouseCol\n const structure = proteinView.primaryStructure\n if (structure) {\n const hasFeatureHoverRange = untracked(\n () => !!structure.alignmentHoverRange,\n )\n if (!hasFeatureHoverRange) {\n const structureSeqPos =\n col !== undefined &&\n structureRowName !== undefined &&\n msaView.visibleColToSeqPos\n ? msaView.visibleColToSeqPos(structureRowName, col)\n : col\n structure.setHoveredPosition(\n structureSeqPos === undefined ? undefined : { structureSeqPos },\n )\n }\n }\n }),\n )\n\n return () => {\n disposers.forEach(d => {\n d()\n })\n }\n }, [proteinView, msaView])\n\n return null\n})\n\nexport default ProteinToMsaHoverSync\n", "/** Removes alignment gap characters ('-' and '.') from an MSA row sequence. */\nexport function ungap(seq: string) {\n return seq.replace(/[-.]/g, '')\n}\n\n/**\n * Finds the MSA row whose ungapped sequence equals the structure's sequence.\n * For AlphaFold structures the structure sequence is the same UniProt sequence\n * as the MSA query row, so this anchors the structure to its alignment row\n * independent of row naming/ordering. Returns undefined when no row matches\n * (e.g. MSA not yet loaded), letting callers fall back to a 1:1 mapping.\n */\nexport function findStructureRowName(\n rowMap: Map<string, string> | undefined,\n structureSeq: string | undefined,\n): string | undefined {\n return rowMap && structureSeq\n ? [...rowMap].find(([, seq]) => ungap(seq) === structureSeq)?.[0]\n : undefined\n}\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function AlphaFoldConfidenceAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'AlphaFoldConfidenceAdapter',\n displayName: 'AlphaFoldConfidence adapter',\n configSchema,\n getAdapterClass: () =>\n import('./AlphaFoldConfidenceAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config AlphaFoldConfidenceAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst AlphaFoldConfidenceAdapter: AnyConfigurationSchemaType =\n ConfigurationSchema(\n 'AlphaFoldConfidenceAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bed.gz',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n )\nexport default AlphaFoldConfidenceAdapter\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function AlphaMissensePathogenicityAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'AlphaMissensePathogenicityAdapter',\n displayName: 'AlphaMissensePathogenicity adapter',\n configSchema,\n getAdapterClass: () =>\n import('./AlphaMissensePathogenicityAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config AlphaMissensePathogenicityAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst AlphaMissensePathogenicityAdapter: AnyConfigurationSchemaType =\n ConfigurationSchema(\n 'AlphaMissensePathogenicityAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bed.gz',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n )\nexport default AlphaMissensePathogenicityAdapter\n", "import { getContainingTrack, getSession } from '@jbrowse/core/util'\nimport AddIcon from '@mui/icons-material/Add'\n\nimport LaunchProteinViewDialog from './components/LaunchProteinViewDialog'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { PluggableElementType } from '@jbrowse/core/pluggableElementTypes'\nimport type DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport type { MenuItem } from '@jbrowse/core/ui'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { IAnyModelType } from '@jbrowse/mobx-state-tree'\n\nfunction isDisplay(elt: { name: string }): elt is DisplayType {\n return elt.name === 'LinearBasicDisplay'\n}\n\nfunction extendStateModel(stateModel: IAnyModelType) {\n return stateModel.views(\n (self: {\n contextMenuItems: () => MenuItem[]\n contextMenuFeature?: Feature\n }) => {\n const superContextMenuItems = self.contextMenuItems\n return {\n contextMenuItems() {\n const feature = self.contextMenuFeature\n const showProteinMenuItem =\n feature !== undefined &&\n ['gene', 'mRNA', 'transcript'].includes(feature.get('type'))\n return [\n ...superContextMenuItems(),\n ...(showProteinMenuItem\n ? [\n {\n label: 'Launch protein view',\n icon: AddIcon,\n onClick: () => {\n const track = getContainingTrack(self)\n const session = getSession(track)\n session.queueDialog(handleClose => [\n LaunchProteinViewDialog,\n { model: track, handleClose, feature },\n ])\n },\n },\n ]\n : []),\n ]\n },\n }\n },\n )\n}\n\nexport default function LaunchProteinViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-extendPluggableElement',\n (elt: PluggableElementType) => {\n if (isDisplay(elt)) {\n elt.stateModel = extendStateModel(elt.stateModel)\n }\n return elt\n },\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z\"\n}), 'Add');", "import React, { useState } from 'react'\n\nimport { Dialog } from '@jbrowse/core/ui'\nimport { getContainingView, getSession } from '@jbrowse/core/util'\nimport { Tab, Tabs } from '@mui/material'\n\nimport AlphaFoldDBSearch from './AlphaFoldDBSearch'\nimport FoldseekSearch from './FoldseekSearch'\nimport HelpButton from './HelpButton'\nimport TabPanel from './TabPanel'\nimport UserProvidedStructure from './UserProvidedStructure'\nimport { DEFAULT_ALIGNMENT_ALGORITHM } from '../../ProteinView/types'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractTrackModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function LaunchProteinViewDialog({\n handleClose,\n feature,\n model,\n}: {\n handleClose: () => void\n feature: Feature\n model: AbstractTrackModel\n}) {\n const [choice, setChoice] = useState(0)\n const [alignmentAlgorithm, setAlignmentAlgorithm] =\n useLocalStorage<AlignmentAlgorithm>(\n 'jbrowse-protein3d-alignment-algorithm',\n DEFAULT_ALIGNMENT_ALGORITHM,\n )\n const session = getSession(model)\n const view = getContainingView(model) as LinearGenomeViewModel\n\n return (\n <Dialog\n maxWidth=\"xl\"\n title=\"Launch protein view\"\n titleNode={\n <>\n Launch protein view <HelpButton />\n </>\n }\n open\n onClose={handleClose}\n >\n <Tabs\n value={choice}\n onChange={(_, val) => {\n setChoice(val)\n }}\n >\n <Tab value={0} label=\"AlphaFoldDB search\" />\n <Tab value={1} label=\"Foldseek search\" />\n <Tab value={2} label=\"Open file manually\" />\n </Tabs>\n <TabPanel value={choice} index={0}>\n <AlphaFoldDBSearch\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={setAlignmentAlgorithm}\n />\n </TabPanel>\n <TabPanel value={choice} index={1}>\n <FoldseekSearch\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n />\n </TabPanel>\n <TabPanel value={choice} index={2}>\n <UserProvidedStructure\n session={session}\n view={view}\n feature={feature}\n handleClose={handleClose}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={setAlignmentAlgorithm}\n />\n </TabPanel>\n </Dialog>\n )\n}\n", "import React from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport { DialogActions, DialogContent, Typography } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport AlphaFoldDBSearchStatus from './AlphaFoldDBSearchStatus'\nimport IdentifierSelector from './IdentifierSelector'\nimport ProteinViewActions from './ProteinViewActions'\nimport SequenceSearchStatus from './SequenceSearchStatus'\nimport TranscriptSelector from './TranscriptSelector'\nimport UniProtIdInput from './UniProtIdInput'\nimport UniProtResultsTable from './UniProtResultsTable'\nimport ExternalLink from '../../components/ExternalLink'\nimport useAlphaFoldDBSearch from '../hooks/useAlphaFoldDBSearch'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n dialogContent: {\n width: '80em',\n '& > *': {\n marginBottom: 20,\n },\n '& > *:last-child': {\n marginBottom: 0,\n },\n },\n selectorsRow: {\n display: 'flex',\n flexDirection: 'row',\n gap: 20,\n alignItems: 'flex-start',\n },\n})\n\nconst AlphaFoldDBSearch = observer(function AlphaFoldDBSearch({\n feature,\n session,\n view,\n handleClose,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n handleClose: () => void\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n const { classes } = useStyles()\n\n const state = useAlphaFoldDBSearch({ feature, view })\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {state.error ? <ErrorMessage error={state.error} /> : null}\n\n <UniProtIdInput\n lookupMode={state.lookupMode}\n onLookupModeChange={state.setLookupMode}\n manualUniprotId={state.manualUniprotId}\n onManualUniprotIdChange={state.setManualUniprotId}\n featureUniprotId={state.featureUniprotId}\n hasProteinSequence={!!state.userSelectedProteinSequence?.seq}\n sequenceSearchType={state.sequenceSearchType}\n onSequenceSearchTypeChange={state.setSequenceSearchType}\n endContent={\n state.showIdentifierSelector ? (\n <IdentifierSelector\n recognizedIds={state.recognizedIds}\n geneName={state.geneName}\n selectedId={state.selectedQueryId}\n onSelectedIdChange={state.setSelectedQueryId}\n />\n ) : null\n }\n />\n\n {state.loadingStatuses.map(status => (\n <LoadingEllipses key={status} variant=\"subtitle2\" message={status} />\n ))}\n\n {state.showUniprotResults && (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Searched UniProt by {state.searchDescription}\n </Typography>\n <UniProtResultsTable\n entries={state.uniprotEntries}\n selectedAccession={state.selectedTableAccession}\n onSelect={state.setSelectedUniprotId}\n />\n <Typography variant=\"body2\" color=\"textSecondary\">\n If you don't see the entry you're looking for, try a different\n identifier above or search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">\n UniProt\n </ExternalLink>{' '}\n directly and use \"Enter manually\".\n </Typography>\n </>\n )}\n\n {state.showNoResults && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n No UniProt entries found for {state.searchDescriptionOr}. Try a\n different identifier above, or search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">UniProt</ExternalLink>{' '}\n directly and use \"Enter manually\" above, or use \"Search sequence\n against AlphaFoldDB API\" if available.\n </Typography>\n )}\n\n {state.showStructureSelectors && (\n <>\n <div className={classes.selectorsRow}>\n <TranscriptSelector\n val={state.userSelection}\n setVal={state.setUserSelection}\n structureSequence={state.structureSequence}\n feature={feature}\n isoforms={state.transcriptOptions}\n isoformSequences={state.isoformSequences!}\n />\n </div>\n {state.showSequenceSearchStatus && (\n <SequenceSearchStatus\n isLoading={state.isSequenceSearchLoading}\n uniprotId={state.uniprotId}\n url={state.url}\n hasProteinSequence={!!state.userSelectedProteinSequence}\n sequenceSearchType={state.sequenceSearchType}\n />\n )}\n {state.showAlphaFoldDBSearchStatus && (\n <AlphaFoldDBSearchStatus\n uniprotId={state.uniprotId}\n selectedTranscript={state.selectedTranscript}\n structureSequence={state.structureSequence}\n isoformSequences={state.isoformSequences!}\n url={state.url}\n />\n )}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <ProteinViewActions\n handleClose={handleClose}\n uniprotId={state.uniprotId}\n userSelectedProteinSequence={state.userSelectedProteinSequence}\n selectedTranscript={state.selectedTranscript}\n url={state.url}\n confidenceUrl={state.confidenceUrl}\n feature={feature}\n view={view}\n session={session}\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n sequencesMatch={state.sequencesMatch}\n isLoading={state.isLoading}\n error={state.error}\n />\n </DialogActions>\n </>\n )\n})\n\nexport default AlphaFoldDBSearch\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport IsoformSequencesToggle from './IsoformSequencesToggle'\nimport ExternalLink from '../../components/ExternalLink'\nimport { getTranscriptDisplayName } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nfunction NotFound({ uniprotId }: { uniprotId: string }) {\n return (\n <Typography>\n No structure found for this UniProtID in AlphaFoldDB{' '}\n <ExternalLink\n href={`https://alphafold.ebi.ac.uk/search/text/${uniprotId}`}\n >\n (search for results)\n </ExternalLink>\n </Typography>\n )\n}\n\nexport default function AlphaFoldDBSearchStatus({\n uniprotId,\n selectedTranscript,\n structureSequence,\n isoformSequences,\n url,\n}: {\n uniprotId?: string\n selectedTranscript?: Feature\n structureSequence?: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n url?: string\n}) {\n return uniprotId ? (\n <>\n <div>\n <Typography>\n UniProt link:{' '}\n <ExternalLink\n href={`https://www.uniprot.org/uniprotkb/${uniprotId}/entry`}\n >\n {uniprotId}\n </ExternalLink>\n </Typography>\n <Typography>\n AlphaFoldDB link: <ExternalLink href={url}>{url}</ExternalLink>\n </Typography>\n </div>\n {structureSequence ? (\n <IsoformSequencesToggle\n structureSequence={structureSequence}\n structureName={uniprotId}\n isoformSequences={isoformSequences}\n />\n ) : (\n <NotFound uniprotId={uniprotId} />\n )}\n </>\n ) : (\n <Typography>\n Searching{' '}\n {selectedTranscript\n ? getTranscriptDisplayName(selectedTranscript)\n : 'transcript'}{' '}\n for UniProt ID\n </Typography>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { Button } from '@mui/material'\n\nimport MSATable from './MSATable'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function IsoformSequencesToggle({\n structureSequence,\n structureName,\n isoformSequences,\n}: {\n structureSequence: string\n structureName: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n}) {\n const [show, setShow] = useState(false)\n return (\n <div style={{ margin: 10 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setShow(!show)\n }}\n >\n {show\n ? 'Hide all isoform protein sequences'\n : 'Show all isoform protein sequences'}\n </Button>\n {show ? (\n <MSATable\n structureSequence={structureSequence}\n structureName={structureName}\n isoformSequences={isoformSequences}\n />\n ) : null}\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { max } from '@jbrowse/core/util'\nimport { TextField } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport Checkbox2 from './Checkbox2'\nimport { getTranscriptDisplayName, stripStopCodon } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nconst useStyles = makeStyles()({\n textAreaFont: {\n fontFamily: 'Courier New',\n whiteSpace: 'pre',\n },\n})\n\nexport default function MSATable({\n structureName,\n structureSequence,\n isoformSequences,\n}: {\n structureName: string\n structureSequence: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n}) {\n const { classes } = useStyles()\n const [showInFastaFormat, setShowInFastaFormat] = useState(false)\n const removedStars = Object.fromEntries(\n Object.entries(isoformSequences).map(([key, val]) => [\n key,\n { ...val, seq: stripStopCodon(val.seq) },\n ]),\n )\n const exactMatchIsoformAndStructureSeq = Object.entries(removedStars).find(\n ([_, val]) => structureSequence === val.seq,\n )\n const sname = `${structureName} (structure residues)`\n const maxKeyLen = max([\n sname.length,\n ...Object.entries(removedStars).map(\n ([_, val]) => getTranscriptDisplayName(val.feature).length,\n ),\n ])\n\n return (\n <>\n <Checkbox2\n onChange={event => {\n setShowInFastaFormat(event.target.checked)\n }}\n label=\"Show in FASTA format?\"\n checked={showInFastaFormat}\n />\n <TextField\n variant=\"outlined\"\n multiline\n minRows={5}\n maxRows={10}\n fullWidth\n value={\n showInFastaFormat\n ? [\n `>${sname}\\n${structureSequence}`,\n ...Object.values(removedStars).map(\n ({ feature, seq }) =>\n `>${getTranscriptDisplayName(feature)}\\n${seq}`,\n ),\n ].join('\\n')\n : [\n `${sname.padEnd(maxKeyLen)}${exactMatchIsoformAndStructureSeq ? '*' : ' '} ${structureSequence}`,\n exactMatchIsoformAndStructureSeq\n ? `${getTranscriptDisplayName(exactMatchIsoformAndStructureSeq[1].feature).padEnd(maxKeyLen)}* ${exactMatchIsoformAndStructureSeq[1].seq}`\n : undefined,\n ...Object.entries(removedStars)\n .filter(([k]) => k !== exactMatchIsoformAndStructureSeq?.[0])\n .map(\n ([_, val]) =>\n `${getTranscriptDisplayName(val.feature).padEnd(maxKeyLen)} ${val.seq}`,\n ),\n ]\n .filter(f => !!f)\n .join('\\n')\n }\n slotProps={{\n input: {\n readOnly: true,\n classes: {\n input: classes.textAreaFont,\n },\n },\n }}\n />\n </>\n )\n}\n", "import React from 'react'\n\nimport { Checkbox, FormControlLabel } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nconst useStyles = makeStyles()({\n block: {\n display: 'block',\n },\n})\n\nexport default function Checkbox2({\n checked,\n disabled,\n label,\n onChange,\n}: {\n checked: boolean\n disabled?: boolean\n label: string\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n}) {\n const { classes } = useStyles()\n return (\n <FormControlLabel\n disabled={disabled}\n className={classes.block}\n control={<Checkbox checked={checked} onChange={onChange} />}\n label={label}\n />\n )\n}\n", "import React from 'react'\n\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\nimport { Link } from '@mui/material'\n\nimport type { LinkProps } from '@mui/material'\n\nexport default function ExternalLink(props: LinkProps) {\n const { children, ...rest } = props\n return (\n <Link {...rest} target=\"_blank\" rel=\"noreferrer\">\n {children} <OpenInNewIcon fontSize=\"small\" />\n </Link>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z\"\n}), 'OpenInNew');", "import React, { useState } from 'react'\n\nimport {\n Button,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n} from '@mui/material'\n\nimport { getDatabaseTypeForId } from '../utils/util'\n\ninterface IdentifierSelectorProps {\n recognizedIds: string[]\n geneName?: string\n selectedId: string\n onSelectedIdChange: (id: string) => void\n}\n\nfunction getIdLabel(id: string): string {\n const dbType = getDatabaseTypeForId(id)\n if (dbType === 'refseq') {\n if (id.startsWith('NM_') || id.startsWith('XM_')) {\n return `${id} (RefSeq mRNA)`\n }\n if (id.startsWith('NR_') || id.startsWith('XR_')) {\n return `${id} (RefSeq ncRNA)`\n }\n if (id.startsWith('NP_') || id.startsWith('XP_')) {\n return `${id} (RefSeq protein)`\n }\n return `${id} (RefSeq)`\n }\n if (dbType === 'ensembl') {\n if (id.includes('G')) {\n return `${id} (Ensembl gene)`\n }\n if (id.includes('T')) {\n return `${id} (Ensembl transcript)`\n }\n if (id.includes('P')) {\n return `${id} (Ensembl protein)`\n }\n return `${id} (Ensembl)`\n }\n if (dbType === 'hgnc') {\n return `${id} (HGNC)`\n }\n if (dbType === 'ccds') {\n return `${id} (CCDS)`\n }\n return id\n}\n\nexport default function IdentifierSelector({\n recognizedIds,\n geneName,\n selectedId,\n onSelectedIdChange,\n}: IdentifierSelectorProps) {\n const [expanded, setExpanded] = useState(false)\n\n // Build list of selectable options\n const options: { value: string; label: string }[] = [\n { value: 'auto', label: 'Auto (try all)' },\n ...recognizedIds.map(id => ({ value: id, label: getIdLabel(id) })),\n ]\n\n if (geneName) {\n options.push({\n value: `gene:${geneName}`,\n label: `${geneName} (gene name)`,\n })\n }\n\n if (recognizedIds.length === 0 && !geneName) {\n return null\n }\n\n if (!expanded) {\n return (\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={() => {\n setExpanded(true)\n }}\n >\n Choose identifier to query...\n </Button>\n )\n }\n\n return (\n <FormControl size=\"small\">\n <InputLabel>Query UniProt by</InputLabel>\n <Select\n value={selectedId}\n label=\"Query UniProt by\"\n onChange={e => {\n onSelectedIdChange(e.target.value)\n }}\n >\n {options.map(opt => (\n <MenuItem key={opt.value} value={opt.value}>\n {opt.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'\nimport SettingsIcon from '@mui/icons-material/Settings'\nimport { Button, ButtonGroup, IconButton, Tooltip, Typography } from '@mui/material'\n\nimport LaunchOptionsDialog from './LaunchOptionsDialog'\nimport LaunchSettingsDialog from './LaunchSettingsDialog'\nimport SequenceMismatchNotice from './SequenceMismatchNotice'\nimport { getLaunchMissingReasons, safeLaunch } from '../utils/launchHelpers'\nimport {\n hasMsaViewPlugin,\n launch1DProteinView,\n launch3DProteinView,\n launch3DProteinViewWithMsa,\n launchMsaView,\n} from '../utils/launchViewUtils'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\ninterface ProteinViewActionsProps {\n handleClose: () => void\n uniprotId?: string\n userSelectedProteinSequence?: { seq: string }\n selectedTranscript?: Feature\n url?: string\n confidenceUrl?: string\n feature: Feature\n view: LinearGenomeViewModel\n session: AbstractSessionModel\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n sequencesMatch?: boolean\n isLoading?: boolean\n /**\n * Real error from the lookup/data pipeline. When present, \"No UniProt ID\n * found\" is suppressed so it doesn't compete with the actual error message\n * shown above by <ErrorMessage>.\n */\n error?: unknown\n}\n\nexport default function ProteinViewActions({\n handleClose,\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n url,\n confidenceUrl,\n feature,\n view,\n session,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n sequencesMatch,\n isLoading,\n error,\n}: ProteinViewActionsProps) {\n const [dialogOpen, setDialogOpen] = useState(false)\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [launchError, setLaunchError] = useState<unknown>()\n // Disable launch while loading \u2014 SWR's keepPreviousData would otherwise let\n // a user click Launch on stale results (wrong UniProt ID) during a refetch.\n const canLaunch =\n !isLoading &&\n !!uniprotId &&\n !!userSelectedProteinSequence &&\n !!selectedTranscript\n\n const missingReasons = getLaunchMissingReasons({\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n isLoading,\n error,\n })\n\n const closeMenu = () => {\n setDialogOpen(false)\n }\n\n const baseParams = {\n session,\n view,\n feature,\n selectedTranscript,\n uniprotId,\n }\n const launch3DParams = {\n ...baseParams,\n url,\n userProvidedTranscriptSequence: userSelectedProteinSequence?.seq,\n alignmentAlgorithm,\n }\n\n const runLaunch = (fn: () => void | Promise<void>) => () => {\n closeMenu()\n void safeLaunch(fn, handleClose, setLaunchError)\n }\n\n const handleLaunch3DView = runLaunch(() => {\n launch3DProteinView(launch3DParams)\n })\n\n const handleLaunch1DView = runLaunch(async () => {\n await launch1DProteinView({ ...baseParams, confidenceUrl })\n })\n\n const handleLaunchMsa = runLaunch(() => {\n launchMsaView(baseParams)\n })\n\n const handleLaunch3DWithMsa = runLaunch(() => {\n launch3DProteinViewWithMsa(launch3DParams)\n })\n\n const launchOptions = [\n {\n key: '3d',\n title: 'Launch 3D protein structure view',\n description:\n 'View protein structure with genome-to-structure coordinate mapping',\n onClick: handleLaunch3DView,\n },\n {\n key: '1d',\n title: 'Launch 1D protein annotation view',\n description: 'View protein features and annotations as a linear track',\n onClick: handleLaunch1DView,\n },\n ...(hasMsaViewPlugin()\n ? [\n {\n key: 'msa',\n title: 'Launch MSA view',\n description: 'View AlphaFold a3m multiple sequence alignment',\n onClick: handleLaunchMsa,\n },\n {\n key: '3d-msa',\n title: 'Launch 3D structure + MSA view',\n description: 'Launch both views with AlphaFold a3m MSA',\n onClick: handleLaunch3DWithMsa,\n },\n ]\n : []),\n ]\n\n return (\n <>\n {launchError ? <ErrorMessage error={launchError} /> : null}\n {sequencesMatch === false ? (\n <SequenceMismatchNotice\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n />\n ) : null}\n <Tooltip title=\"Launch settings\">\n <IconButton\n size=\"small\"\n aria-label=\"Launch settings\"\n onClick={() => {\n setSettingsOpen(true)\n }}\n >\n <SettingsIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n size=\"small\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n {!canLaunch && missingReasons.length > 0 ? (\n <Typography variant=\"body2\" color=\"error\" sx={{ mr: 2 }}>\n {missingReasons.join('. ')}\n </Typography>\n ) : null}\n <ButtonGroup variant=\"contained\" color=\"primary\" size=\"small\">\n <Button disabled={!canLaunch} onClick={handleLaunch3DView}>\n Launch\n </Button>\n <Button\n disabled={!canLaunch}\n onClick={() => {\n setDialogOpen(true)\n }}\n aria-label=\"More launch options\"\n >\n <ArrowDropDownIcon />\n </Button>\n </ButtonGroup>\n <LaunchOptionsDialog\n open={dialogOpen}\n onClose={closeMenu}\n options={launchOptions}\n />\n <LaunchSettingsDialog\n open={settingsOpen}\n onClose={() => {\n setSettingsOpen(false)\n }}\n />\n </>\n )\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m7 10 5 5 5-5z\"\n}), 'ArrowDropDown');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6\"\n}), 'Settings');", "import React from 'react'\n\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n MenuItem,\n MenuList,\n Typography,\n} from '@mui/material'\n\ninterface LaunchOption {\n key: string\n title: string\n description: string\n onClick: () => void\n}\n\nexport default function LaunchOptionsDialog({\n open,\n onClose,\n options,\n}: {\n open: boolean\n onClose: () => void\n options: LaunchOption[]\n}) {\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogTitle>Launch options</DialogTitle>\n <DialogContent>\n <MenuList>\n {options.map(opt => (\n <MenuItem key={opt.key} onClick={opt.onClick}>\n <div>\n <Typography variant=\"body1\">{opt.title}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {opt.description}\n </Typography>\n </div>\n </MenuItem>\n ))}\n </MenuList>\n </DialogContent>\n </Dialog>\n )\n}\n", "import React, { useState } from 'react'\n\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n FormGroup,\n Typography,\n} from '@mui/material'\n\nimport { getLaunchSideBySide, setLaunchSideBySide } from '../utils/sideBySide'\n\n// Small, self-contained launch settings (NOT the global preferences dialog):\n// just the options that affect how this protein view opens.\nexport default function LaunchSettingsDialog({\n open,\n onClose,\n}: {\n open: boolean\n onClose: () => void\n}) {\n const [sideBySide, setSideBySide] = useState(() => getLaunchSideBySide())\n return (\n <Dialog\n open={open}\n onClose={() => {\n onClose()\n }}\n >\n <DialogTitle>Launch settings</DialogTitle>\n <DialogContent>\n <FormGroup>\n <FormControlLabel\n control={<Checkbox checked={sideBySide} />}\n label=\"Open protein view side-by-side with the genome view\"\n onChange={(_, checked) => {\n setSideBySide(checked)\n setLaunchSideBySide(checked)\n }}\n />\n </FormGroup>\n <Typography variant=\"body2\" color=\"text.secondary\">\n When enabled, launching a protein view places it to the right of the\n connected genome view in a split layout instead of stacking it below.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => {\n onClose()\n }}\n >\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport AlignmentSettingsButton from './AlignmentSettingsButton'\nimport {\n ALIGNMENT_ALGORITHM_LABELS,\n type AlignmentAlgorithm,\n} from '../../ProteinView/types'\n\nexport default function SequenceMismatchNotice({\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n return (\n <Typography\n variant=\"body2\"\n sx={{ mr: 2, display: 'flex', alignItems: 'center' }}\n >\n Transcript and structure sequences differ, will run{' '}\n {ALIGNMENT_ALGORITHM_LABELS[alignmentAlgorithm] ?? alignmentAlgorithm}{' '}\n alignment\n <AlignmentSettingsButton\n value={alignmentAlgorithm}\n onChange={onAlignmentAlgorithmChange}\n />\n </Typography>\n )\n}\n", "import React, { useState } from 'react'\n\nimport SettingsIcon from '@mui/icons-material/Settings'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n FormLabel,\n IconButton,\n Radio,\n RadioGroup,\n Tab,\n Tabs,\n TextField,\n Typography,\n} from '@mui/material'\nimport { parsePairwise } from 'clustal-js'\n\nimport { ALIGNMENT_ALGORITHMS } from '../../ProteinView/types'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { PairwiseAlignment } from '../../mappings'\n\ninterface AlignmentSettingsButtonProps {\n value: AlignmentAlgorithm\n onChange: (algorithm: AlignmentAlgorithm) => void\n onManualAlignment?: (alignment: PairwiseAlignment) => void\n}\n\nexport default function AlignmentSettingsButton({\n value,\n onChange,\n onManualAlignment,\n}: AlignmentSettingsButtonProps) {\n const [open, setOpen] = useState(false)\n const [tabValue, setTabValue] = useState(0)\n const [tempAlgorithm, setTempAlgorithm] = useState<AlignmentAlgorithm>(value)\n const [manualAlignment, setManualAlignment] = useState('')\n const [parseError, setParseError] = useState<string>()\n\n const handleOpen = () => {\n setTempAlgorithm(value)\n setManualAlignment('')\n setParseError(undefined)\n setTabValue(0)\n setOpen(true)\n }\n\n const handleSave = () => {\n if (tabValue === 0) {\n onChange(tempAlgorithm)\n } else if (tabValue === 1 && manualAlignment.trim() && onManualAlignment) {\n try {\n const parsed = parsePairwise(manualAlignment.trim())\n onManualAlignment(parsed)\n } catch (e) {\n setParseError(`Failed to parse alignment: ${e}`)\n return\n }\n }\n setOpen(false)\n }\n\n const handleCancel = () => {\n setTempAlgorithm(value)\n setManualAlignment('')\n setParseError(undefined)\n setOpen(false)\n }\n\n return (\n <>\n <IconButton onClick={handleOpen} size=\"small\" title=\"Alignment settings\">\n <SettingsIcon />\n </IconButton>\n\n <Dialog open={open} onClose={handleCancel} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Alignment Settings</DialogTitle>\n <DialogContent>\n <Tabs\n value={tabValue}\n onChange={(_, val) => {\n setTabValue(val)\n }}\n sx={{ mb: 2 }}\n >\n <Tab label=\"Automatic\" />\n <Tab label=\"Manual\" disabled={!onManualAlignment} />\n </Tabs>\n\n {tabValue === 0 ? (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Choose the algorithm for aligning transcript sequences to\n protein structures.\n </Typography>\n\n <FormControl component=\"fieldset\">\n <FormLabel component=\"legend\">Algorithm</FormLabel>\n <RadioGroup\n value={tempAlgorithm}\n onChange={event => {\n setTempAlgorithm(event.target.value as AlignmentAlgorithm)\n }}\n >\n <FormControlLabel\n value={ALIGNMENT_ALGORITHMS.SMITH_WATERMAN}\n control={<Radio />}\n label=\"Smith-Waterman (local alignment)\"\n />\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ ml: 4, mt: -1, mb: 1 }}\n >\n Finds best matching region. Recommended for most use cases.\n </Typography>\n\n <FormControlLabel\n value={ALIGNMENT_ALGORITHMS.NEEDLEMAN_WUNSCH}\n control={<Radio />}\n label=\"Needleman-Wunsch (global alignment)\"\n />\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ ml: 4, mt: -1, mb: 1 }}\n >\n End-to-end alignment. Use when sequences should align\n completely.\n </Typography>\n </RadioGroup>\n </FormControl>\n </>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Paste a pre-computed alignment in Clustal format. The first\n sequence should be the transcript and the second should be the\n structure.\n </Typography>\n <TextField\n multiline\n rows={10}\n fullWidth\n placeholder={`Example:\na MKAAYLSMFGKEDHKPFGD\n |||||||||||||||||||\nb MKAAYLSMFGKEDHKPFGD`}\n value={manualAlignment}\n onChange={e => {\n setManualAlignment(e.target.value)\n setParseError(undefined)\n }}\n sx={{ fontFamily: 'monospace', fontSize: 12 }}\n />\n {parseError ? (\n <Typography color=\"error\" variant=\"body2\" sx={{ mt: 1 }}>\n {parseError}\n </Typography>\n ) : null}\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleCancel}>Cancel</Button>\n <Button\n onClick={handleSave}\n variant=\"contained\"\n color=\"primary\"\n disabled={tabValue === 1 && !manualAlignment.trim()}\n >\n {tabValue === 0 ? 'Save' : 'Apply Alignment'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n", "export type AlignmentAlgorithm = 'needleman_wunsch' | 'smith_waterman'\n\nexport const ALIGNMENT_ALGORITHMS = {\n NEEDLEMAN_WUNSCH: 'needleman_wunsch',\n SMITH_WATERMAN: 'smith_waterman',\n} as const\n\nexport const DEFAULT_ALIGNMENT_ALGORITHM: AlignmentAlgorithm = 'smith_waterman'\n\nconst ALIGNMENT_ALGORITHM_VALUES: AlignmentAlgorithm[] = [\n 'needleman_wunsch',\n 'smith_waterman',\n]\n\nexport function coerceAlignmentAlgorithm(value: string): AlignmentAlgorithm {\n return (\n ALIGNMENT_ALGORITHM_VALUES.find(v => v === value) ??\n DEFAULT_ALIGNMENT_ALGORITHM\n )\n}\n\nexport const ALIGNMENT_ALGORITHM_LABELS: Record<string, string> = {\n needleman_wunsch: 'Needleman-Wunsch',\n smith_waterman: 'Smith-Waterman',\n}\n", "/**\n * Run a launch fn (sync or async) and surface any thrown error via onError.\n * Used to wrap `session.addView(...)` calls so MST validation errors don't\n * fall silently into the React error boundary.\n */\nexport async function safeLaunch(\n fn: () => void | Promise<void>,\n onSuccess?: () => void,\n onError?: (e: unknown) => void,\n) {\n try {\n await fn()\n onSuccess?.()\n } catch (e) {\n console.error(e)\n onError?.(e)\n }\n}\n\ninterface LaunchRequirements {\n uniprotId?: string\n userSelectedProteinSequence?: { seq: string }\n selectedTranscript?: unknown\n isLoading?: boolean\n /**\n * If a real error already surfaced (e.g. from UniProt lookup), suppress the\n * derived \"No UniProt ID found\" reason \u2014 the underlying error is already\n * shown via <ErrorMessage> and the duplicate hint is misleading.\n */\n error?: unknown\n}\n\n/**\n * Compute user-facing reasons the Launch button is disabled. Suppressed\n * while loading or while a real upstream error is being displayed.\n */\nexport function getLaunchMissingReasons({\n uniprotId,\n userSelectedProteinSequence,\n selectedTranscript,\n isLoading,\n error,\n}: LaunchRequirements): string[] {\n if (isLoading || error) {\n return []\n }\n return [\n !uniprotId && 'No UniProt ID found',\n !userSelectedProteinSequence &&\n 'Could not compute protein sequence (feature may be missing CDS subfeatures)',\n !selectedTranscript && 'No transcript selected',\n ].filter((s): s is string => typeof s === 'string')\n}\n", "import React from 'react'\n\nimport { Typography } from '@mui/material'\n\nimport type { SequenceSearchType } from '../hooks/useAlphaFoldSequenceSearch'\n\ninterface SequenceSearchStatusProps {\n isLoading: boolean\n uniprotId?: string\n url?: string\n hasProteinSequence: boolean\n sequenceSearchType: SequenceSearchType\n}\n\nexport default function SequenceSearchStatus({\n isLoading,\n uniprotId,\n url,\n hasProteinSequence,\n sequenceSearchType,\n}: SequenceSearchStatusProps) {\n return isLoading ? null : !uniprotId && hasProteinSequence ? (\n <Typography color=\"warning.main\">\n No AlphaFold structure found for this sequence (searched by{' '}\n {sequenceSearchType === 'md5' ? 'MD5 checksum' : 'full sequence'})\n </Typography>\n ) : uniprotId ? (\n <Typography color=\"success.main\">\n Found AlphaFold structure: {uniprotId}\n {url ? (\n <>\n {' '}\n -{' '}\n <a href={url} target=\"_blank\" rel=\"noreferrer\">\n {url}\n </a>\n </>\n ) : null}\n </Typography>\n ) : null\n}\n", "import React from 'react'\n\nimport { MenuItem, TextField } from '@mui/material'\n\nimport {\n getGeneDisplayName,\n getTranscriptDisplayName,\n stripStopCodon,\n} from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function TranscriptSelector({\n val,\n setVal,\n isoforms,\n isoformSequences,\n structureSequence,\n feature,\n disabled,\n}: {\n isoforms: Feature[]\n feature: Feature\n val: string | undefined\n setVal: (str: string) => void\n structureSequence?: string\n isoformSequences: Record<string, { feature: Feature; seq: string }>\n disabled?: boolean\n}) {\n const geneName = getGeneDisplayName(feature)\n const matches: Feature[] = []\n const nonMatches: Feature[] = []\n const noData: Feature[] = []\n\n for (const f of isoforms) {\n const entry = isoformSequences[f.id()]\n if (!entry) {\n noData.push(f)\n } else if (\n structureSequence &&\n stripStopCodon(entry.seq) === structureSequence\n ) {\n matches.push(f)\n } else {\n nonMatches.push(f)\n }\n }\n\n const byLengthDesc = (a: Feature, b: Feature) =>\n isoformSequences[b.id()]!.seq.length - isoformSequences[a.id()]!.seq.length\n\n return (\n <TextField\n value={val ?? ''}\n onChange={event => {\n setVal(event.target.value)\n }}\n label=\"Choose transcript isoform\"\n select\n disabled={disabled}\n >\n {matches.toSorted(byLengthDesc).map(f => (\n <MenuItem value={f.id()} key={f.id()}>\n {geneName} - {getTranscriptDisplayName(f)} (\n {isoformSequences[f.id()]!.seq.length}aa) (matches structure residues)\n </MenuItem>\n ))}\n {nonMatches.toSorted(byLengthDesc).map(f => (\n <MenuItem value={f.id()} key={f.id()}>\n {geneName} - {getTranscriptDisplayName(f)} (\n {isoformSequences[f.id()]!.seq.length}aa)\n </MenuItem>\n ))}\n {noData.map(f => (\n <MenuItem value={f.id()} key={f.id()} disabled>\n {geneName} - {getTranscriptDisplayName(f)} (no data)\n </MenuItem>\n ))}\n </TextField>\n )\n}\n", "import React from 'react'\n\nimport {\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\n\nimport ExternalLink from '../../components/ExternalLink'\n\nimport type { SequenceSearchType } from '../hooks/useAlphaFoldSequenceSearch'\n\nexport type LookupMode = 'auto' | 'manual' | 'feature' | 'sequence'\n\ninterface UniProtIdInputProps {\n lookupMode: LookupMode\n onLookupModeChange: (mode: LookupMode) => void\n manualUniprotId: string\n onManualUniprotIdChange: (id: string) => void\n featureUniprotId?: string\n hasProteinSequence?: boolean\n sequenceSearchType?: SequenceSearchType\n onSequenceSearchTypeChange?: (type: SequenceSearchType) => void\n endContent?: React.ReactNode\n}\n\nexport default function UniProtIdInput({\n lookupMode,\n onLookupModeChange,\n manualUniprotId,\n onManualUniprotIdChange,\n featureUniprotId,\n hasProteinSequence,\n sequenceSearchType,\n onSequenceSearchTypeChange,\n endContent,\n}: UniProtIdInputProps) {\n return (\n <>\n <div style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>\n <FormControl component=\"fieldset\">\n <RadioGroup\n row\n value={lookupMode}\n onChange={event => {\n onLookupModeChange(event.target.value as LookupMode)\n }}\n >\n {featureUniprotId && (\n <FormControlLabel\n value=\"feature\"\n control={<Radio />}\n label={`From feature (${featureUniprotId})`}\n />\n )}\n <FormControlLabel\n value=\"auto\"\n control={<Radio />}\n label=\"Auto-detect using UniProt ID mapping API\"\n />\n <FormControlLabel\n value=\"manual\"\n control={<Radio />}\n label=\"Enter manually\"\n />\n {hasProteinSequence && (\n <FormControlLabel\n value=\"sequence\"\n control={<Radio />}\n label=\"Search sequence against AlphaFoldDB API\"\n />\n )}\n </RadioGroup>\n </FormControl>\n {endContent}\n </div>\n\n {lookupMode === 'manual' && (\n <div>\n <TextField\n label=\"UniProt ID\"\n variant=\"outlined\"\n placeholder=\"e.g. P68871\"\n size=\"small\"\n value={manualUniprotId}\n onChange={e => {\n onManualUniprotIdChange(e.target.value)\n }}\n />\n </div>\n )}\n\n {lookupMode === 'sequence' &&\n sequenceSearchType &&\n onSequenceSearchTypeChange && (\n <div>\n <FormControl component=\"fieldset\">\n <RadioGroup\n row\n value={sequenceSearchType}\n onChange={event => {\n onSequenceSearchTypeChange(\n event.target.value as SequenceSearchType,\n )\n }}\n >\n <FormControlLabel\n value=\"md5\"\n control={<Radio />}\n label=\"Exact match\"\n />\n <FormControlLabel\n value=\"sequence\"\n control={<Radio />}\n label=\"Fuzzy match\"\n />\n </RadioGroup>\n </FormControl>\n <Typography variant=\"body2\" color=\"text.secondary\">\n May not find the canonical UniProt entry.\n </Typography>\n </div>\n )}\n\n {lookupMode === 'manual' && !manualUniprotId && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Search{' '}\n <ExternalLink href=\"https://www.uniprot.org/\">UniProt</ExternalLink>\n {' or '}\n <ExternalLink href=\"https://alphafold.ebi.ac.uk/\">\n AlphaFoldDB\n </ExternalLink>\n </Typography>\n )}\n </>\n )\n}\n", "import React from 'react'\n\nimport {\n Chip,\n Paper,\n Radio,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport ExternalLink from '../../components/ExternalLink'\n\nimport type { UniProtEntry } from '../services/lookupMethods'\n\nconst useStyles = makeStyles()({\n tableContainer: {\n maxHeight: 200,\n },\n headerCell: {\n fontWeight: 'bold',\n backgroundColor: '#f5f5f5',\n },\n selectedRow: {\n backgroundColor: '#e3f2fd',\n },\n clickableRow: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '#f5f5f5',\n },\n },\n reviewedChip: {\n backgroundColor: '#4caf50',\n color: 'white',\n fontSize: '0.7rem',\n height: 20,\n },\n unreviewedChip: {\n backgroundColor: '#ff9800',\n color: 'white',\n fontSize: '0.7rem',\n height: 20,\n },\n})\n\ninterface UniProtResultsTableProps {\n entries: UniProtEntry[]\n selectedAccession?: string\n onSelect: (accession: string) => void\n}\n\nexport default function UniProtResultsTable({\n entries,\n selectedAccession,\n onSelect,\n}: UniProtResultsTableProps) {\n const { classes, cx } = useStyles()\n\n return entries.length === 0 ? null : (\n <div>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Found {entries.length} UniProt entries. Select one:\n </Typography>\n <TableContainer component={Paper} className={classes.tableContainer}>\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell} padding=\"checkbox\" />\n <TableCell className={classes.headerCell}>Accession</TableCell>\n <TableCell className={classes.headerCell}>Gene</TableCell>\n <TableCell className={classes.headerCell}>Organism</TableCell>\n <TableCell className={classes.headerCell}>Protein</TableCell>\n <TableCell className={classes.headerCell}>Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {entries.map(entry => (\n <TableRow\n key={entry.accession}\n onClick={() => {\n onSelect(entry.accession)\n }}\n className={cx(\n classes.clickableRow,\n selectedAccession === entry.accession && classes.selectedRow,\n )}\n >\n <TableCell padding=\"checkbox\">\n <Radio\n checked={selectedAccession === entry.accession}\n size=\"small\"\n />\n </TableCell>\n <TableCell>\n <ExternalLink\n href={`https://www.uniprot.org/uniprotkb/${entry.accession}`}\n >\n {entry.accession}\n </ExternalLink>\n </TableCell>\n <TableCell>{entry.geneName ?? '-'}</TableCell>\n <TableCell>{entry.organismName ?? '-'}</TableCell>\n <TableCell>\n {entry.proteinName\n ? entry.proteinName.length > 40\n ? `${entry.proteinName.slice(0, 40)}...`\n : entry.proteinName\n : '-'}\n </TableCell>\n <TableCell>\n <Chip\n label={entry.isReviewed ? 'Reviewed' : 'Unreviewed'}\n size=\"small\"\n className={\n entry.isReviewed\n ? classes.reviewedChip\n : classes.unreviewedChip\n }\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n", "import { useState } from 'react'\n\nimport useAlphaFoldData from './useAlphaFoldData'\nimport useAlphaFoldSequenceSearch from './useAlphaFoldSequenceSearch'\nimport useDebouncedValue from './useDebouncedValue'\nimport useTranscriptIsoformSelection from './useTranscriptIsoformSelection'\nimport useUniProtSearch from './useUniProtSearch'\nimport getSearchDescription from '../utils/getSearchDescription'\nimport { extractFeatureIdentifiers, stripStopCodon } from '../utils/util'\n\nimport type { SequenceSearchType } from './useAlphaFoldSequenceSearch'\nimport type { LookupMode } from '../components/UniProtIdInput'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function useAlphaFoldDBSearch({\n feature,\n view,\n}: {\n feature: Feature\n view: LinearGenomeViewModel\n}) {\n const [lookupMode, setLookupMode] = useState<LookupMode>('auto')\n const [manualUniprotId, setManualUniprotId] = useState('')\n const geneIds = extractFeatureIdentifiers(feature)\n const [selectedQueryId, setSelectedQueryId] = useState('auto')\n const [sequenceSearchType, setSequenceSearchType] =\n useState<SequenceSearchType>('md5')\n const [selectedUniprotId, setSelectedUniprotId] = useState<string>()\n\n const featureUniprotId = geneIds.uniprotId\n\n const effectiveLookupMode =\n lookupMode === 'auto' && featureUniprotId ? 'feature' : lookupMode\n const isSequenceMode = effectiveLookupMode === 'sequence'\n const isAutoMode = effectiveLookupMode === 'auto'\n\n const {\n entries: uniprotEntries,\n isLoading: isLookupLoading,\n error: lookupError,\n } = useUniProtSearch({\n recognizedIds: geneIds.recognizedIds,\n geneId: geneIds.geneId,\n geneName: geneIds.geneName,\n selectedQueryId,\n enabled: isAutoMode,\n })\n\n // Debounce manual entry so fetches don't fire on every keystroke and\n // pollute the SWR cache with partial-ID 404s.\n const debouncedManualUniprotId = useDebouncedValue(manualUniprotId, 400)\n\n const autoUniprotId = uniprotEntries[0]?.accession\n const uniprotId =\n effectiveLookupMode === 'feature'\n ? featureUniprotId\n : isAutoMode\n ? (selectedUniprotId ?? autoUniprotId)\n : effectiveLookupMode === 'manual'\n ? debouncedManualUniprotId\n : undefined\n\n const {\n isLoading: isAlphaFoldLoading,\n isValidating: isAlphaFoldValidating,\n error: alphaFoldError,\n url: alphaFoldUrl,\n confidenceUrl: alphaFoldConfidenceUrl,\n structureSequence: alphaFoldStructureSequence,\n } = useAlphaFoldData({\n uniprotId: isSequenceMode ? undefined : uniprotId,\n })\n\n const {\n transcripts: transcriptOptions,\n isoformSequences,\n isLoading: isIsoformLoading,\n error: isoformError,\n selectedTranscriptId: effectiveTranscriptId,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: userSelectedProteinSequence,\n } = useTranscriptIsoformSelection({\n feature,\n view,\n structureSequence: alphaFoldStructureSequence,\n resetKey: uniprotId,\n })\n\n const {\n uniprotId: seqSearchUniprotId,\n cifUrl: seqSearchUrl,\n plddtDocUrl: seqSearchConfidenceUrl,\n structureSequence: seqSearchStructureSequence,\n isLoading: isSequenceSearchLoading,\n isValidating: isSequenceSearchValidating,\n error: sequenceSearchError,\n } = useAlphaFoldSequenceSearch({\n sequence: userSelectedProteinSequence?.seq,\n searchType: sequenceSearchType,\n enabled: isSequenceMode,\n })\n\n // Merge alphafold / sequence-search results\n const finalUrl = isSequenceMode ? seqSearchUrl : alphaFoldUrl\n const finalConfidenceUrl = isSequenceMode\n ? seqSearchConfidenceUrl\n : alphaFoldConfidenceUrl\n const finalStructureSequence = isSequenceMode\n ? seqSearchStructureSequence\n : alphaFoldStructureSequence\n const finalUniprotId = isSequenceMode ? seqSearchUniprotId : uniprotId\n\n // While a structure fetch is in flight, finalStructureSequence may still be\n // the previous selection's sequence (keepPreviousData). Comparing that stale\n // sequence to the freshly-selected transcript would give a wrong match, so\n // the match is treated as unknown until the fetch settles.\n const isStructureValidating = isSequenceMode\n ? isSequenceSearchValidating\n : isAlphaFoldValidating\n\n const loadingStatuses = [\n isLookupLoading && 'Looking up UniProt ID',\n isIsoformLoading && 'Loading protein sequences from transcript isoforms',\n !isSequenceMode && isAlphaFoldLoading && 'Fetching AlphaFold structure URL',\n isSequenceMode &&\n isSequenceSearchLoading &&\n 'Searching AlphaFoldDB by sequence',\n ].filter((s): s is string => !!s)\n const isLoading = loadingStatuses.length > 0\n\n // Only show errors once all loading is done \u2014 the synchronous\n // effectiveLookupMode and autoTranscriptId computations prevent the\n // one-frame gaps that previously caused brief error flashes\n const rawError =\n isoformError ?? lookupError ?? alphaFoldError ?? sequenceSearchError\n const error = isLoading ? undefined : rawError\n\n return {\n lookupMode: effectiveLookupMode,\n setLookupMode,\n manualUniprotId,\n setManualUniprotId,\n selectedQueryId,\n setSelectedQueryId,\n sequenceSearchType,\n setSequenceSearchType,\n selectedUniprotId,\n setSelectedUniprotId,\n userSelection: effectiveTranscriptId,\n setUserSelection,\n\n transcriptOptions,\n selectedTranscript,\n isoformSequences,\n userSelectedProteinSequence,\n uniprotEntries,\n\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n featureUniprotId,\n\n uniprotId: finalUniprotId,\n url: finalUrl,\n confidenceUrl: finalConfidenceUrl,\n structureSequence: finalStructureSequence,\n\n error,\n loadingStatuses,\n isSequenceSearchLoading,\n\n showIdentifierSelector:\n isAutoMode && (geneIds.recognizedIds.length > 0 || !!geneIds.geneName),\n showStructureSelectors:\n !!isoformSequences &&\n !!selectedTranscript &&\n (isSequenceMode || !!(finalStructureSequence && finalUniprotId)),\n sequencesMatch:\n !isStructureValidating &&\n userSelectedProteinSequence?.seq &&\n finalStructureSequence\n ? stripStopCodon(userSelectedProteinSequence.seq) ===\n finalStructureSequence\n : undefined,\n\n searchDescription: getSearchDescription({\n selectedQueryId,\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n }),\n searchDescriptionOr: getSearchDescription({\n selectedQueryId,\n recognizedIds: geneIds.recognizedIds,\n geneName: geneIds.geneName,\n joinWord: 'or',\n }),\n\n selectedTableAccession: selectedUniprotId ?? autoUniprotId,\n\n showUniprotResults:\n !!isoformSequences &&\n isAutoMode &&\n (uniprotEntries.length > 0 || isLookupLoading),\n showNoResults:\n !!isoformSequences &&\n isAutoMode &&\n !isLookupLoading &&\n uniprotEntries.length === 0,\n showSequenceSearchStatus: isSequenceMode,\n showAlphaFoldDBSearchStatus:\n !!finalStructureSequence && !!finalUniprotId && !isSequenceMode,\n isLoading,\n }\n}\n", "import useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { addStructureFromData } from '../../ProteinView/addStructureFromData'\nimport { addStructureFromURL } from '../../ProteinView/addStructureFromURL'\nimport { extractStructureSequences } from '../../ProteinView/extractStructureSequences'\nimport { withTemporaryMolstarPlugin } from '../../ProteinView/withTemporaryMolstarPlugin'\n\ntype StructureFormat = 'pdb' | 'mmcif'\n\nfunction detectStructureFormat(fileName: string): StructureFormat {\n const dot = fileName.lastIndexOf('.')\n const ext = dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : ''\n if (ext === 'cif' || ext === 'mmcif' || ext === 'bcif') {\n return 'mmcif'\n }\n return 'pdb'\n}\n\nasync function fetchSequences({ file, url }: { file?: File; url?: string }) {\n return withTemporaryMolstarPlugin(async plugin => {\n const { model } = file\n ? await addStructureFromData({\n data: await file.text(),\n plugin,\n format: detectStructureFormat(file.name),\n })\n : await addStructureFromURL({ url: url!, plugin })\n return extractStructureSequences(model)\n })\n}\n\n// Extract protein sequences from a structure given either a local File or a\n// remote URL (exactly one is expected). Used directly for user-provided\n// structures and wrapped by useAlphaFoldData for AlphaFoldDB URLs.\nexport default function useStructureFileSequence({\n file,\n url,\n}: {\n file?: File\n url?: string\n}) {\n const key = file\n ? (['structure-file', file.name, file.size, file.lastModified] as const)\n : url\n ? (['structure-url', url] as const)\n : null\n const { data, error, isLoading, isValidating } = useSWR<string[] | undefined>(\n key,\n async () => {\n const seq = await fetchSequences({ file, url })\n if (!seq) {\n throw new Error('no sequences detected in file')\n }\n return seq\n },\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n // isValidating distinguishes \"fetching for the current key\" from the stale\n // data keepPreviousData keeps around during a key change. Consumers comparing\n // this sequence against another need it to avoid matching against stale data.\n return { error, isLoading, isValidating, sequences: data }\n}\n", "// Shared SWR config for one-shot fetches that should never auto-revalidate\n// (structure files, computed protein sequences). keepPreviousData is opt-in\n// per-hook since it avoids result flicker when the key changes.\nexport const STATIC_SWR_OPTIONS = {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n revalidateIfStale: false,\n} as const\n", "import type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { StructureRepresentationPresetProvider } from 'molstar/lib/mol-plugin-state/builder/structure/representation-preset'\nimport type { StateObjectSelector } from 'molstar/lib/mol-state'\n\nexport interface LoadStructureOptions {\n representationParams?: StructureRepresentationPresetProvider.CommonParams\n}\n\nexport async function applyStructurePreset({\n plugin,\n trajectory,\n options,\n}: {\n plugin: PluginContext\n trajectory: StateObjectSelector\n options?: LoadStructureOptions\n}) {\n const model = await plugin.builders.structure.createModel(trajectory)\n\n await plugin.builders.structure.hierarchy.applyPreset(\n trajectory,\n 'all-models',\n {\n useDefaultIfSingleModel: true,\n representationPresetParams: options?.representationParams,\n },\n )\n return { model }\n}\n", "import { applyStructurePreset } from './structurePipeline'\n\nimport type { LoadStructureOptions } from './structurePipeline'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { BuiltInTrajectoryFormat } from 'molstar/lib/mol-plugin-state/formats/trajectory'\n\nexport async function addStructureFromData({\n data,\n format = 'pdb',\n options,\n plugin,\n}: {\n data: string\n format?: BuiltInTrajectoryFormat\n options?: LoadStructureOptions & { label?: string; dataLabel?: string }\n plugin: PluginContext\n}) {\n const _data = await plugin.builders.data.rawData({\n data,\n label: options?.dataLabel,\n })\n\n const trajectory = await plugin.builders.structure.parseTrajectory(\n _data,\n format,\n )\n return applyStructurePreset({ plugin, trajectory, options })\n}\n\nexport { type LoadStructureOptions } from './structurePipeline'\n", "import { applyStructurePreset } from './structurePipeline'\n\nimport type { LoadStructureOptions } from './structurePipeline'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { BuiltInTrajectoryFormat } from 'molstar/lib/mol-plugin-state/formats/trajectory'\n\nexport async function addStructureFromURL({\n url,\n format = 'mmcif',\n isBinary,\n options,\n plugin,\n}: {\n url: string\n format?: BuiltInTrajectoryFormat\n isBinary?: boolean\n options?: LoadStructureOptions & { label?: string }\n plugin: PluginContext\n}) {\n const data = await plugin.builders.data.download(\n {\n url,\n isBinary,\n },\n {\n state: {\n isGhost: true,\n },\n },\n )\n\n const trajectory = await plugin.builders.structure.parseTrajectory(\n data,\n format,\n )\n return applyStructurePreset({ plugin, trajectory, options })\n}\n\nexport { type LoadStructureOptions } from './structurePipeline'\n", "interface StructureModel {\n obj?: {\n data: {\n sequence: {\n sequences: readonly {\n sequence: {\n label: {\n toArray(): ArrayLike<string>\n }\n }\n }[]\n }\n }\n }\n}\n\nexport function extractStructureSequences(\n model: StructureModel,\n): string[] | undefined {\n return model.obj?.data.sequence.sequences.map(s =>\n Array.from(s.sequence.label.toArray()).join(''),\n )\n}\n", "import loadMolstar from './loadMolstar'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport async function withTemporaryMolstarPlugin<T>(\n callback: (plugin: PluginContext) => Promise<T>,\n) {\n const { createPluginUI, renderReact18 } = await loadMolstar()\n const ret = document.createElement('div')\n const plugin = await createPluginUI({\n target: ret,\n render: renderReact18,\n })\n\n try {\n return await callback(plugin)\n } finally {\n plugin.unmount()\n ret.remove()\n }\n}\n", "import useStructureFileSequence from './useStructureFileSequence'\nimport {\n getAlphaFoldConfidenceUrl,\n getAlphaFoldStructureUrl,\n} from '../utils/launchViewUtils'\n\nexport default function useAlphaFoldData({\n uniprotId,\n}: {\n uniprotId?: string\n}) {\n const url = uniprotId ? getAlphaFoldStructureUrl(uniprotId) : undefined\n const confidenceUrl = uniprotId\n ? getAlphaFoldConfidenceUrl(uniprotId)\n : undefined\n\n const { sequences, isLoading, isValidating, error } =\n useStructureFileSequence({ url })\n\n return {\n isLoading,\n isValidating,\n error,\n url,\n confidenceUrl,\n structureSequence: sequences?.[0],\n }\n}\n", "import { useMemo } from 'react'\n\nimport useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { jsonfetch } from '../../fetchUtils'\nimport { md5 } from '../utils/md5'\nimport { stripStopCodon } from '../utils/util'\n\nexport type SequenceSearchType = 'md5' | 'sequence'\n\ninterface SequenceSummaryResponse {\n entryId?: string\n uniprotAccession?: string\n uniprotId?: string\n uniprotDescription?: string\n taxId?: number\n organismScientificName?: string\n uniprotStart?: number\n uniprotEnd?: number\n modelUrl?: string\n cifUrl?: string\n plddtDocUrl?: string\n sequence?: string\n}\n\nexport default function useAlphaFoldSequenceSearch({\n sequence,\n searchType,\n enabled = true,\n}: {\n sequence?: string\n searchType: SequenceSearchType\n enabled?: boolean\n}) {\n const searchValue = useMemo(() => {\n if (!sequence) {\n return undefined\n }\n const cleanSeq = stripStopCodon(sequence.toUpperCase())\n return searchType === 'md5' ? md5(cleanSeq) : cleanSeq\n }, [sequence, searchType])\n\n const { data, error, isLoading, isValidating } =\n useSWR<SequenceSummaryResponse>(\n enabled && searchValue\n ? `https://alphafold.ebi.ac.uk/api/sequence/summary?id=${encodeURIComponent(searchValue)}&type=${searchType}`\n : null,\n jsonfetch,\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return {\n isLoading,\n isValidating,\n result: data,\n uniprotId: data?.uniprotAccession,\n cifUrl: data?.cifUrl,\n plddtDocUrl: data?.plddtDocUrl,\n structureSequence: data?.sequence,\n error,\n }\n}\n", "export async function myfetch(url: string, args?: RequestInit) {\n const response = await fetch(url, args)\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} fetching ${url} ${await response.text()}`,\n )\n }\n\n return response\n}\n\nexport async function jsonfetch<T = unknown>(\n url: string,\n args?: RequestInit,\n): Promise<T> {\n const response = await myfetch(url, args)\n return response.json()\n}\n\nfunction abortError(signal: AbortSignal) {\n return signal.reason instanceof Error\n ? signal.reason\n : new Error('Aborted', { cause: signal.reason })\n}\n\nexport function timeout(time: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal))\n } else {\n const id = setTimeout(resolve, time)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(id)\n reject(abortError(signal))\n },\n { once: true },\n )\n }\n })\n}\n", "// MD5 implementation based on RFC 1321\n// Adapted from public domain implementations\n\nfunction safeAdd(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\nfunction bitRotateLeft(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\nfunction md5cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n}\n\nfunction md5ff(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n}\n\nfunction md5gg(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n}\n\nfunction md5hh(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\n}\n\nfunction md5ii(\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number,\n) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n}\n\nfunction binlMd5(x: number[], len: number) {\n x[len >> 5]! |= 0x80 << (len % 32)\n x[(((len + 64) >>> 9) << 4) + 14] = len\n\n let a = 1732584193\n let b = -271733879\n let c = -1732584194\n let d = 271733878\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a\n const oldb = b\n const oldc = c\n const oldd = d\n\n a = md5ff(a, b, c, d, x[i] ?? 0, 7, -680876936)\n d = md5ff(d, a, b, c, x[i + 1] ?? 0, 12, -389564586)\n c = md5ff(c, d, a, b, x[i + 2] ?? 0, 17, 606105819)\n b = md5ff(b, c, d, a, x[i + 3] ?? 0, 22, -1044525330)\n a = md5ff(a, b, c, d, x[i + 4] ?? 0, 7, -176418897)\n d = md5ff(d, a, b, c, x[i + 5] ?? 0, 12, 1200080426)\n c = md5ff(c, d, a, b, x[i + 6] ?? 0, 17, -1473231341)\n b = md5ff(b, c, d, a, x[i + 7] ?? 0, 22, -45705983)\n a = md5ff(a, b, c, d, x[i + 8] ?? 0, 7, 1770035416)\n d = md5ff(d, a, b, c, x[i + 9] ?? 0, 12, -1958414417)\n c = md5ff(c, d, a, b, x[i + 10] ?? 0, 17, -42063)\n b = md5ff(b, c, d, a, x[i + 11] ?? 0, 22, -1990404162)\n a = md5ff(a, b, c, d, x[i + 12] ?? 0, 7, 1804603682)\n d = md5ff(d, a, b, c, x[i + 13] ?? 0, 12, -40341101)\n c = md5ff(c, d, a, b, x[i + 14] ?? 0, 17, -1502002290)\n b = md5ff(b, c, d, a, x[i + 15] ?? 0, 22, 1236535329)\n\n a = md5gg(a, b, c, d, x[i + 1] ?? 0, 5, -165796510)\n d = md5gg(d, a, b, c, x[i + 6] ?? 0, 9, -1069501632)\n c = md5gg(c, d, a, b, x[i + 11] ?? 0, 14, 643717713)\n b = md5gg(b, c, d, a, x[i] ?? 0, 20, -373897302)\n a = md5gg(a, b, c, d, x[i + 5] ?? 0, 5, -701558691)\n d = md5gg(d, a, b, c, x[i + 10] ?? 0, 9, 38016083)\n c = md5gg(c, d, a, b, x[i + 15] ?? 0, 14, -660478335)\n b = md5gg(b, c, d, a, x[i + 4] ?? 0, 20, -405537848)\n a = md5gg(a, b, c, d, x[i + 9] ?? 0, 5, 568446438)\n d = md5gg(d, a, b, c, x[i + 14] ?? 0, 9, -1019803690)\n c = md5gg(c, d, a, b, x[i + 3] ?? 0, 14, -187363961)\n b = md5gg(b, c, d, a, x[i + 8] ?? 0, 20, 1163531501)\n a = md5gg(a, b, c, d, x[i + 13] ?? 0, 5, -1444681467)\n d = md5gg(d, a, b, c, x[i + 2] ?? 0, 9, -51403784)\n c = md5gg(c, d, a, b, x[i + 7] ?? 0, 14, 1735328473)\n b = md5gg(b, c, d, a, x[i + 12] ?? 0, 20, -1926607734)\n\n a = md5hh(a, b, c, d, x[i + 5] ?? 0, 4, -378558)\n d = md5hh(d, a, b, c, x[i + 8] ?? 0, 11, -2022574463)\n c = md5hh(c, d, a, b, x[i + 11] ?? 0, 16, 1839030562)\n b = md5hh(b, c, d, a, x[i + 14] ?? 0, 23, -35309556)\n a = md5hh(a, b, c, d, x[i + 1] ?? 0, 4, -1530992060)\n d = md5hh(d, a, b, c, x[i + 4] ?? 0, 11, 1272893353)\n c = md5hh(c, d, a, b, x[i + 7] ?? 0, 16, -155497632)\n b = md5hh(b, c, d, a, x[i + 10] ?? 0, 23, -1094730640)\n a = md5hh(a, b, c, d, x[i + 13] ?? 0, 4, 681279174)\n d = md5hh(d, a, b, c, x[i] ?? 0, 11, -358537222)\n c = md5hh(c, d, a, b, x[i + 3] ?? 0, 16, -722521979)\n b = md5hh(b, c, d, a, x[i + 6] ?? 0, 23, 76029189)\n a = md5hh(a, b, c, d, x[i + 9] ?? 0, 4, -640364487)\n d = md5hh(d, a, b, c, x[i + 12] ?? 0, 11, -421815835)\n c = md5hh(c, d, a, b, x[i + 15] ?? 0, 16, 530742520)\n b = md5hh(b, c, d, a, x[i + 2] ?? 0, 23, -995338651)\n\n a = md5ii(a, b, c, d, x[i] ?? 0, 6, -198630844)\n d = md5ii(d, a, b, c, x[i + 7] ?? 0, 10, 1126891415)\n c = md5ii(c, d, a, b, x[i + 14] ?? 0, 15, -1416354905)\n b = md5ii(b, c, d, a, x[i + 5] ?? 0, 21, -57434055)\n a = md5ii(a, b, c, d, x[i + 12] ?? 0, 6, 1700485571)\n d = md5ii(d, a, b, c, x[i + 3] ?? 0, 10, -1894986606)\n c = md5ii(c, d, a, b, x[i + 10] ?? 0, 15, -1051523)\n b = md5ii(b, c, d, a, x[i + 1] ?? 0, 21, -2054922799)\n a = md5ii(a, b, c, d, x[i + 8] ?? 0, 6, 1873313359)\n d = md5ii(d, a, b, c, x[i + 15] ?? 0, 10, -30611744)\n c = md5ii(c, d, a, b, x[i + 6] ?? 0, 15, -1560198380)\n b = md5ii(b, c, d, a, x[i + 13] ?? 0, 21, 1309151649)\n a = md5ii(a, b, c, d, x[i + 4] ?? 0, 6, -145523070)\n d = md5ii(d, a, b, c, x[i + 11] ?? 0, 10, -1120210379)\n c = md5ii(c, d, a, b, x[i + 2] ?? 0, 15, 718787259)\n b = md5ii(b, c, d, a, x[i + 9] ?? 0, 21, -343485551)\n\n a = safeAdd(a, olda)\n b = safeAdd(b, oldb)\n c = safeAdd(c, oldc)\n d = safeAdd(d, oldd)\n }\n return [a, b, c, d]\n}\n\nfunction binl2hex(binarray: number[]) {\n const hexTab = '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hexTab.charAt((binarray[i >> 2]! >> ((i % 4) * 8 + 4)) & 0xf) +\n hexTab.charAt((binarray[i >> 2]! >> ((i % 4) * 8)) & 0xf)\n }\n return str\n}\n\nfunction str2binl(str: string) {\n const bin: number[] = []\n const mask = (1 << 8) - 1\n for (let i = 0; i < str.length * 8; i += 8) {\n bin[i >> 5] =\n (bin[i >> 5] ?? 0) | ((str.charCodeAt(i / 8) & mask) << (i % 32))\n }\n return bin\n}\n\nexport function md5(str: string) {\n return binl2hex(binlMd5(str2binl(str), str.length * 8))\n}\n", "import { useEffect, useState } from 'react'\n\n/**\n * Returns `value` after it has been stable for `delayMs`. Used to throttle\n * network fetches keyed off a fast-changing input (e.g. text fields) without\n * having to debounce the input handler itself.\n */\nexport default function useDebouncedValue<T>(value: T, delayMs = 300): T {\n const [debounced, setDebounced] = useState(value)\n useEffect(() => {\n const t = setTimeout(() => {\n setDebounced(value)\n }, delayMs)\n return () => {\n clearTimeout(t)\n }\n }, [value, delayMs])\n return debounced\n}\n", "import { getSession } from '@jbrowse/core/util'\nimport useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { fetchProteinSeq } from '../utils/calculateProteinSequence'\nimport { getTranscriptFeatures } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function useIsoformProteinSequences({\n feature,\n view,\n}: {\n feature: Feature\n view?: { assemblyNames?: string[] }\n}) {\n const { data, error, isLoading } = useSWR<\n Record<string, { feature: Feature; seq: string }>\n >(\n ['isoform-sequences', feature.id(), view?.assemblyNames?.[0]],\n async () => {\n const transcripts = getTranscriptFeatures(feature)\n const errors: unknown[] = []\n const results = await Promise.all(\n transcripts.map(async f => {\n try {\n const seq = await fetchProteinSeq({\n session: getSession(view),\n assemblyName: view?.assemblyNames?.[0],\n feature: f,\n })\n return seq ? ([f.id(), { feature: f, seq }] as const) : undefined\n } catch (e) {\n console.error('[useIsoformProteinSequences] error for', f.id(), e)\n errors.push(e)\n return undefined\n }\n }),\n )\n const entries = results.filter(r => r !== undefined)\n // If every transcript fetch failed, surface the underlying error rather\n // than silently returning {} \u2014 otherwise the UI shows the misleading\n // \"feature may be missing CDS subfeatures\" hint with no actual cause.\n if (\n entries.length === 0 &&\n errors.length === transcripts.length &&\n errors.length > 0\n ) {\n throw errors[0]\n }\n return Object.fromEntries(entries)\n },\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return { isLoading, isoformSequences: data, error }\n}\n", "import { getConf } from '@jbrowse/core/configuration'\nimport {\n defaultCodonTable,\n generateCodonTable,\n revcom,\n} from '@jbrowse/core/util'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\n\nexport interface Feat {\n start: number\n end: number\n type: string\n}\n\nexport function stitch(subfeats: Feat[], sequence: string) {\n return subfeats.map(sub => sequence.slice(sub.start, sub.end)).join('')\n}\n\nexport function calculateProteinSequence({\n cds,\n sequence,\n codonTable,\n}: {\n cds: Feat[]\n sequence: string\n codonTable: Record<string, string>\n}) {\n const str = stitch(cds, sequence)\n let protein = ''\n for (let i = 0; i < str.length; i += 3) {\n // use & symbol for undefined codon, or partial slice\n protein += codonTable[str.slice(i, i + 3)] ?? '&'\n }\n return protein\n}\n\nexport function revlist(list: Feat[], seqlen: number) {\n return list\n .map(sub => ({\n ...sub,\n start: seqlen - sub.end,\n end: seqlen - sub.start,\n }))\n .toSorted((a, b) => a.start - b.start)\n}\n\nfunction getItemId(feat: Feat) {\n return `${feat.start}-${feat.end}`\n}\n\nexport function dedupe(list: Feat[]) {\n return list.filter(\n (item, pos, ary) => !pos || getItemId(item) !== getItemId(ary[pos - 1]!),\n )\n}\n\nexport function getProteinSequence({\n feature,\n seq,\n}: {\n seq: string\n feature: Feature\n}) {\n const featureStart = feature.get('start')\n const strand = feature.get('strand')\n const subfeatures = feature.get('subfeatures') ?? []\n const cds = dedupe(\n subfeatures\n .toSorted((a, b) => a.get('start') - b.get('start'))\n .map(sub => ({\n start: sub.get('start') - featureStart,\n end: sub.get('end') - featureStart,\n type: sub.get('type'),\n }))\n .filter(f => f.type === 'CDS'),\n )\n\n return calculateProteinSequence({\n cds: strand === -1 ? revlist(cds, seq.length) : cds,\n sequence: strand === -1 ? revcom(seq) : seq,\n codonTable: generateCodonTable(defaultCodonTable),\n })\n}\n\nexport async function fetchProteinSeq({\n feature,\n session,\n assemblyName,\n}: {\n feature: Feature\n session: AbstractSessionModel\n assemblyName: string | undefined\n}) {\n const start = feature.get('start')\n const end = feature.get('end')\n const refName = feature.get('refName')\n const { assemblyManager, rpcManager } = session\n const assembly = assemblyName\n ? await assemblyManager.waitForAssembly(assemblyName)\n : undefined\n if (!assembly) {\n throw new Error('assembly not found')\n }\n const sessionId = 'getSequence'\n const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {\n adapterConfig: getConf(assembly, ['sequence', 'adapter']),\n sessionId,\n regions: [\n {\n start,\n end,\n refName: assembly.getCanonicalRefName(refName),\n assemblyName,\n },\n ],\n })\n\n const [feat] = feats as Feature[]\n const seq = feat?.get('seq') as string | undefined\n return seq ? getProteinSequence({ seq, feature }) : undefined\n}\n", "import { useMemo, useState } from 'react'\n\nimport { selectBestTranscript } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\nexport default function useTranscriptSelection({\n options,\n isoformSequences,\n structureSequence,\n resetKey,\n}: {\n options: Feature[]\n isoformSequences?: Record<string, { feature: Feature; seq: string }>\n structureSequence?: string\n // When this value changes the manual selection is cleared, falling back to\n // the recomputed auto-selection (e.g. after the user picks a different\n // UniProt entry, which yields a different structure).\n resetKey?: string\n}) {\n const [userSelection, setUserSelection] = useState<string>()\n const [prevResetKey, setPrevResetKey] = useState(resetKey)\n if (resetKey !== prevResetKey) {\n setPrevResetKey(resetKey)\n setUserSelection(undefined)\n }\n\n const autoSelection = useMemo(\n () =>\n isoformSequences !== undefined\n ? selectBestTranscript({\n options,\n isoformSequences,\n structureSequence,\n })?.id()\n : undefined,\n [options, structureSequence, isoformSequences],\n )\n\n return { userSelection: userSelection ?? autoSelection, setUserSelection }\n}\n", "import useIsoformProteinSequences from './useIsoformProteinSequences'\nimport useTranscriptSelection from './useTranscriptSelection'\nimport { getId, getTranscriptFeatures } from '../utils/util'\n\nimport type { Feature } from '@jbrowse/core/util'\n\n// Bundles the transcript-isoform wiring shared by all three launch tabs:\n// list transcripts, fetch their protein sequences, auto/manually select one,\n// and resolve the selection back to its feature + sequence.\nexport default function useTranscriptIsoformSelection({\n feature,\n view,\n structureSequence,\n resetKey,\n}: {\n feature: Feature\n view?: { assemblyNames?: string[] }\n structureSequence?: string\n resetKey?: string\n}) {\n const transcripts = getTranscriptFeatures(feature)\n const { isoformSequences, isLoading, error } = useIsoformProteinSequences({\n feature,\n view,\n })\n const { userSelection, setUserSelection } = useTranscriptSelection({\n options: transcripts,\n isoformSequences,\n structureSequence,\n resetKey,\n })\n const selectedTranscript = transcripts.find(f => getId(f) === userSelection)\n const selectedIsoform = userSelection\n ? isoformSequences?.[userSelection]\n : undefined\n\n return {\n transcripts,\n isoformSequences,\n isLoading,\n error,\n selectedTranscriptId: userSelection,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform,\n }\n}\n", "import useSWR from 'swr'\n\nimport { STATIC_SWR_OPTIONS } from './swrOptions'\nimport { searchUniProtEntries } from '../services/lookupMethods'\nimport { isRecognizedDatabaseId } from '../utils/util'\n\nimport type { UniProtEntry } from '../services/lookupMethods'\n\nexport default function useUniProtSearch({\n recognizedIds = [],\n geneId,\n geneName,\n selectedQueryId = 'auto',\n enabled = true,\n}: {\n recognizedIds?: string[]\n geneId?: string\n geneName?: string\n selectedQueryId?: string\n enabled?: boolean\n}) {\n // Determine what to search based on selectedQueryId\n let idsToSearch: string[] = []\n let geneNameToSearch: string | undefined\n\n if (selectedQueryId === 'auto') {\n idsToSearch = recognizedIds\n geneNameToSearch = geneName\n } else if (selectedQueryId.startsWith('gene:')) {\n geneNameToSearch = selectedQueryId.replace('gene:', '')\n } else if (isRecognizedDatabaseId(selectedQueryId)) {\n idsToSearch = [selectedQueryId]\n }\n\n const hasValidId =\n idsToSearch.some(id => isRecognizedDatabaseId(id)) ||\n Boolean(geneNameToSearch)\n\n const { data, error, isLoading } = useSWR<UniProtEntry[]>(\n enabled && hasValidId\n ? [\n 'uniprotSearch',\n selectedQueryId,\n idsToSearch.join(','),\n geneNameToSearch,\n ]\n : null,\n async () =>\n searchUniProtEntries({\n recognizedIds: idsToSearch,\n geneId,\n geneName: geneNameToSearch,\n }),\n {\n ...STATIC_SWR_OPTIONS,\n keepPreviousData: true,\n },\n )\n\n return {\n entries: data ?? [],\n isLoading,\n error,\n hasValidId,\n }\n}\n", "import { jsonfetch } from '../../fetchUtils'\nimport {\n getDatabaseTypeForId,\n isRecognizedDatabaseId,\n stripTrailingVersion,\n} from '../utils/util'\n\ninterface UniProtApiResult {\n results: {\n entryType: string\n primaryAccession: string\n uniProtkbId?: string\n genes?: {\n geneName?: {\n value: string\n }\n }[]\n organism?: {\n taxonId: number\n scientificName?: string\n commonName?: string\n }\n proteinDescription?: {\n recommendedName?: {\n fullName?: {\n value: string\n }\n }\n }\n }[]\n}\n\nexport interface UniProtEntry {\n accession: string\n id?: string\n geneName?: string\n organismName?: string\n proteinName?: string\n isReviewed: boolean\n}\n\nconst UNIPROT_FIELDS =\n 'accession,id,gene_names,organism_name,protein_name,reviewed'\n\nfunction mapApiResultToEntry(\n result: UniProtApiResult['results'][0],\n): UniProtEntry {\n return {\n accession: result.primaryAccession,\n id: result.uniProtkbId,\n geneName: result.genes?.[0]?.geneName?.value,\n organismName:\n result.organism?.commonName ?? result.organism?.scientificName,\n proteinName: result.proteinDescription?.recommendedName?.fullName?.value,\n isReviewed: result.entryType === 'UniProtKB reviewed (Swiss-Prot)',\n }\n}\n\n/**\n * Build UniProt xref query for a recognized database ID\n */\nfunction buildXrefQuery(id: string): string | undefined {\n const dbType = getDatabaseTypeForId(id)\n switch (dbType) {\n case 'ensembl':\n return `xref:ensembl-${id}`\n case 'refseq':\n return `xref:refseq-${id}`\n case 'ccds':\n return `xref:ccds-${id}`\n case 'hgnc':\n return `xref:hgnc-${id.replace('HGNC:', '')}`\n default:\n return undefined\n }\n}\n\nasync function searchUniProt(\n query: string,\n size = 10,\n): Promise<UniProtEntry[]> {\n const url = `https://rest.uniprot.org/uniprotkb/search?query=${encodeURIComponent(query)}&fields=${UNIPROT_FIELDS}&size=${size}`\n const data = await jsonfetch<UniProtApiResult>(url)\n return data.results.map(mapApiResultToEntry)\n}\n\ninterface SearchByXrefResult {\n entries: UniProtEntry[]\n error: unknown\n}\n\nasync function searchByXref(id: string): Promise<SearchByXrefResult> {\n const query = buildXrefQuery(id)\n if (!query) {\n return { entries: [], error: undefined }\n }\n try {\n return { entries: await searchUniProt(query), error: undefined }\n } catch (e) {\n console.error(`xref search failed for ${id}:`, e)\n return { entries: [], error: e }\n }\n}\n\nfunction deduplicateEntries(entries: UniProtEntry[]) {\n const seen = new Set<string>()\n const result: UniProtEntry[] = []\n for (const entry of entries) {\n if (!seen.has(entry.accession)) {\n seen.add(entry.accession)\n result.push(entry)\n }\n }\n return result\n}\n\nexport async function searchUniProtEntries({\n recognizedIds = [],\n geneId,\n geneName,\n organismId = 9606,\n}: {\n recognizedIds?: string[]\n geneId?: string\n geneName?: string\n organismId?: number\n}) {\n const idsToSearch = new Set(recognizedIds)\n const strippedGeneId = geneId ? stripTrailingVersion(geneId) : undefined\n if (strippedGeneId && isRecognizedDatabaseId(strippedGeneId)) {\n idsToSearch.add(strippedGeneId)\n }\n\n const xrefResults = await Promise.all([...idsToSearch].map(searchByXref))\n let entries = deduplicateEntries(xrefResults.flatMap(r => r.entries))\n const xrefErrors = xrefResults.filter(r => r.error !== undefined)\n\n // Fallback: if no reviewed entries found, try gene name search\n let geneNameError: unknown\n if (!entries.some(e => e.isReviewed) && geneName) {\n try {\n const query = `gene:${geneName}+AND+organism_id:${organismId}+AND+reviewed:true`\n const geneNameResults = await searchUniProt(query, 5)\n entries = deduplicateEntries([...entries, ...geneNameResults])\n } catch (e) {\n console.error(`gene name search failed for ${geneName}:`, e)\n geneNameError = e\n }\n }\n\n // If we got no entries but every attempted lookup failed, surface the\n // underlying error rather than silently returning []. Otherwise consumers\n // see \"No UniProt ID found\" with no indication that the network failed.\n if (entries.length === 0) {\n const attempted = idsToSearch.size + (geneName ? 1 : 0)\n const failed = xrefErrors.length + (geneNameError ? 1 : 0)\n if (attempted > 0 && attempted === failed) {\n throw (geneNameError ?? xrefErrors[0]?.error) as Error\n }\n }\n\n return entries.toSorted((a, b) => Number(b.isReviewed) - Number(a.isReviewed))\n}\n", "export default function getSearchDescription({\n selectedQueryId,\n recognizedIds,\n geneName,\n joinWord = 'and',\n}: {\n selectedQueryId: string\n recognizedIds: string[]\n geneName?: string\n joinWord?: 'and' | 'or'\n}) {\n if (selectedQueryId === 'auto') {\n return [\n recognizedIds.length > 0\n ? `database ID${recognizedIds.length > 1 ? 's' : ''} \"${recognizedIds.join('\", \"')}\"`\n : undefined,\n geneName ? `gene name \"${geneName}\"` : undefined,\n ]\n .filter(Boolean)\n .join(` ${joinWord} `)\n }\n if (selectedQueryId.startsWith('gene:')) {\n return `gene name \"${selectedQueryId.replace('gene:', '')}\"`\n }\n return `database ID \"${selectedQueryId}\"`\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n TextField,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport FoldseekDatabaseSelector from './FoldseekDatabaseSelector'\nimport FoldseekResultsTable from './FoldseekResultsTable'\nimport TranscriptSelector from './TranscriptSelector'\nimport useFoldseekSearch from '../hooks/useFoldseekSearch'\nimport useTranscriptIsoformSelection from '../hooks/useTranscriptIsoformSelection'\nimport { DEFAULT_DATABASES } from '../services/foldseekApi'\nimport { stripStopCodon } from '../utils/util'\n\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n dialogContent: {\n width: '80em',\n display: 'flex',\n flexDirection: 'column',\n gap: 20,\n },\n sequenceInput: {\n fontFamily: 'monospace',\n },\n di3Section: {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n },\n})\n\nconst FoldseekSearch = observer(function FoldseekSearch({\n feature,\n session,\n view,\n handleClose,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n handleClose: () => void\n}) {\n const { classes } = useStyles()\n\n const [userEditedSequence, setUserEditedSequence] = useState<\n string | undefined\n >()\n const [selectedDatabases, setSelectedDatabases] = useState(DEFAULT_DATABASES)\n\n const {\n results,\n cleanedAaSequence,\n di3Sequence,\n isLoading,\n isPredicting,\n error,\n statusMessage,\n predictStructure,\n search,\n reset,\n } = useFoldseekSearch()\n\n const {\n transcripts,\n isoformSequences,\n isLoading: isLoadingIsoforms,\n error: isoformError,\n selectedTranscriptId: effectiveSelectedTranscriptId,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: selectedIsoformData,\n } = useTranscriptIsoformSelection({ feature, view })\n\n const cleanedSequence = selectedIsoformData\n ? stripStopCodon(selectedIsoformData.seq)\n : ''\n const sequence = userEditedSequence ?? cleanedSequence\n\n const setUserSelectionWithReset = (id: string | undefined) => {\n setUserSelection(id)\n setUserEditedSequence(undefined)\n }\n\n const canPredict = sequence.trim().length > 0 && !isPredicting && !isLoading\n const canSearch =\n !!cleanedAaSequence &&\n !!di3Sequence &&\n selectedDatabases.length > 0 &&\n !isLoading\n\n const combinedError = error ?? isoformError\n const isBusy = isLoading || isPredicting\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {combinedError && !isLoadingIsoforms ? (\n <ErrorMessage error={combinedError} />\n ) : null}\n\n {isLoadingIsoforms ? (\n <LoadingEllipses\n variant=\"subtitle2\"\n message=\"Loading transcript sequences\"\n />\n ) : null}\n\n {isoformSequences ? (\n <>\n <TranscriptSelector\n val={effectiveSelectedTranscriptId}\n setVal={setUserSelectionWithReset}\n isoforms={transcripts}\n isoformSequences={isoformSequences}\n feature={feature}\n disabled={isBusy}\n />\n <TextField\n label=\"Protein sequence (amino acids)\"\n multiline\n rows={4}\n value={sequence}\n onChange={e => {\n setUserEditedSequence(e.target.value)\n }}\n placeholder={`MKTVRQERLKSIVRILERSKEPVSGAQLAEEL...`}\n disabled={isBusy}\n InputProps={{\n className: classes.sequenceInput,\n }}\n />\n </>\n ) : null}\n\n {di3Sequence ? (\n <div className={classes.di3Section}>\n <Typography variant=\"subtitle2\">\n 3Di structural alphabet (used for searching):\n </Typography>\n <TextField\n multiline\n rows={4}\n value={di3Sequence}\n InputProps={{\n className: classes.sequenceInput,\n readOnly: true,\n }}\n />\n </div>\n ) : null}\n\n <FoldseekDatabaseSelector\n selected={selectedDatabases}\n onChange={setSelectedDatabases}\n disabled={isBusy}\n />\n\n {statusMessage ? (\n <LoadingEllipses variant=\"subtitle2\" message={statusMessage} />\n ) : null}\n\n {results ? (\n <FoldseekResultsTable\n results={results}\n session={session}\n view={view}\n feature={feature}\n selectedTranscript={selectedTranscript}\n userProvidedTranscriptSequence={sequence}\n onClose={handleClose}\n />\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n {results ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n reset()\n }}\n >\n New search\n </Button>\n ) : null}\n {!di3Sequence ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canPredict}\n onClick={() => {\n void predictStructure(sequence.trim())\n }}\n >\n {isPredicting ? 'Predicting...' : 'Predict 3Di structure'}\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canSearch}\n onClick={() => {\n void search(cleanedAaSequence!, di3Sequence, selectedDatabases)\n }}\n >\n {isLoading ? 'Searching...' : 'Search Foldseek'}\n </Button>\n )}\n </DialogActions>\n </>\n )\n})\n\nexport default FoldseekSearch\n", "import React from 'react'\n\nimport {\n Button,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport {\n FOLDSEEK_DATABASES,\n type FoldseekDatabaseId,\n} from '../services/foldseekApi'\n\nconst useStyles = makeStyles()({\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n },\n buttons: {\n display: 'flex',\n gap: 4,\n },\n checkboxGroup: {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 0,\n },\n})\n\nexport default function FoldseekDatabaseSelector({\n selected,\n onChange,\n disabled,\n}: {\n selected: FoldseekDatabaseId[]\n onChange: (databases: FoldseekDatabaseId[]) => void\n disabled?: boolean\n}) {\n const { classes } = useStyles()\n\n return (\n <div className={classes.root}>\n <div className={classes.header}>\n <Typography variant=\"subtitle2\">Databases to search:</Typography>\n <div className={classes.buttons}>\n <Button\n size=\"small\"\n onClick={() => {\n onChange(FOLDSEEK_DATABASES.map(db => db.id))\n }}\n disabled={disabled}\n >\n Select all\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n onChange([])\n }}\n disabled={disabled}\n >\n Clear\n </Button>\n </div>\n </div>\n <FormGroup className={classes.checkboxGroup}>\n {FOLDSEEK_DATABASES.map(db => (\n <FormControlLabel\n key={db.id}\n control={\n <Checkbox\n size=\"small\"\n checked={selected.includes(db.id)}\n onChange={() => {\n if (selected.includes(db.id)) {\n onChange(selected.filter(id => id !== db.id))\n } else {\n onChange([...selected, db.id])\n }\n }}\n disabled={disabled}\n />\n }\n label={db.label}\n />\n ))}\n </FormGroup>\n </div>\n )\n}\n", "import { jsonfetch, timeout } from '../../fetchUtils'\n\nexport const FOLDSEEK_DATABASES = [\n { id: 'pdb100', label: 'PDB (100% redundancy)' },\n { id: 'afdb-swissprot', label: 'AlphaFold DB (Swiss-Prot)' },\n { id: 'afdb50', label: 'AlphaFold DB (50% redundancy)' },\n { id: 'afdb-proteome', label: 'AlphaFold DB (Proteomes)' },\n { id: 'cath50', label: 'CATH (50% redundancy)' },\n { id: 'mgnify_esm30', label: 'MGnify ESM30' },\n { id: 'bfmd', label: 'BFMD' },\n { id: 'gmgcl_id', label: 'GMGCL' },\n] as const\n\nexport type FoldseekDatabaseId = (typeof FOLDSEEK_DATABASES)[number]['id']\n\nexport const DEFAULT_DATABASES: FoldseekDatabaseId[] = [\n 'pdb100',\n 'afdb-swissprot',\n]\n\nexport interface FoldseekTicketResponse {\n id: string\n status: 'PENDING' | 'RUNNING' | 'COMPLETE' | 'ERROR'\n error?: string\n}\n\nexport interface FoldseekAlignment {\n target: string\n seqId?: number\n alnLength?: number\n mismatches?: number\n gapsopened?: number\n qStartPos?: number\n qEndPos?: number\n qLen?: number\n qAln?: string\n dbStartPos?: number\n dbEndPos?: number\n dbLen?: number\n dbAln?: string\n prob?: number\n eval?: number\n score?: number\n tCa?: string\n tSeq?: string\n taxId?: number\n taxName?: string\n query?: string\n}\n\nexport interface FoldseekDatabaseResult {\n db: string\n alignments?: FoldseekAlignment[][]\n}\n\nexport interface FoldseekResult {\n query: {\n header: string\n sequence: string\n }\n results: FoldseekDatabaseResult[]\n}\n\nexport async function predict3Di({\n aaSequence,\n signal,\n}: {\n aaSequence: string\n signal?: AbortSignal\n}) {\n // Clean the sequence - remove FASTA header, whitespace, stop codons, and non-AA chars\n const cleanSequence = aaSequence\n .split('\\n')\n .filter(line => !line.startsWith('>'))\n .join('')\n .replace(/\\s/g, '')\n .replace(/\\*/g, '') // Remove stop codons before querying 3Di\n .toUpperCase()\n .replace(/[^ACDEFGHIKLMNPQRSTVWY]/g, '') // Keep only valid amino acids\n\n const response = await fetch(\n `https://3di.foldseek.com/predict/${encodeURIComponent(cleanSequence)}`,\n { signal },\n )\n if (!response.ok) {\n throw new Error(\n `3Di prediction failed: ${response.status} ${await response.text()}`,\n )\n }\n const di3Sequence = await response.text()\n // Remove any quotes, slashes, or whitespace from the response\n const cleanDi3 = di3Sequence\n .replace(/^[\"'/\\s]+/, '')\n .replace(/[\"'/\\s]+$/, '')\n .trim()\n return { aaSequence: cleanSequence, di3Sequence: cleanDi3 }\n}\n\nexport async function submitFoldseekSearch({\n aaSequence,\n di3Sequence,\n databases,\n signal,\n}: {\n aaSequence: string\n di3Sequence: string\n databases: FoldseekDatabaseId[]\n signal?: AbortSignal\n}) {\n // Submit both AA and 3Di sequences (with trailing newline like working example)\n const fastaContent = `>query\\n${aaSequence}\\n>3DI\\n${di3Sequence}\\n`\n const params = new URLSearchParams()\n params.append('q', fastaContent)\n params.append('mode', '3diaa')\n params.append('email', '')\n for (const db of databases) {\n params.append('database[]', db)\n }\n\n const response = await fetch('https://search.foldseek.com/api/ticket', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n signal,\n })\n\n // Read the body as text first so a non-JSON error page (e.g. a gateway/500\n // HTML response) surfaces the real status instead of an opaque JSON\n // SyntaxError that hides it.\n const text = await response.text()\n if (!response.ok) {\n throw new Error(`Foldseek submission failed: ${response.status} ${text}`)\n }\n\n return JSON.parse(text) as FoldseekTicketResponse\n}\n\nexport async function pollFoldseekStatus({\n ticketId,\n signal,\n}: {\n ticketId: string\n signal?: AbortSignal\n}) {\n // Use the /tickets endpoint (plural) with POST\n const params = new URLSearchParams()\n params.append('tickets[]', ticketId)\n\n const response = await fetch('https://search.foldseek.com/api/tickets', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n signal,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to poll ticket status: ${response.status}`)\n }\n\n const results = (await response.json()) as FoldseekTicketResponse[]\n\n // Return the first (and only) result\n const result = results[0]\n if (!result) {\n throw new Error('No ticket status returned')\n }\n return result\n}\n\ninterface FoldseekApiResponse {\n mode: string\n queries: { header: string; sequence: string }[]\n results: {\n db: string\n alignments: FoldseekAlignment[][]\n taxonomyreports: unknown[]\n }[]\n}\n\nexport async function getFoldseekResults({\n ticketId,\n signal,\n}: {\n ticketId: string\n signal?: AbortSignal\n}): Promise<FoldseekApiResponse> {\n return jsonfetch<FoldseekApiResponse>(\n `https://search.foldseek.com/api/result/${ticketId}/0`,\n { signal },\n )\n}\n\nexport async function waitForFoldseekResults({\n ticketId,\n onStatusChange,\n signal,\n}: {\n ticketId: string\n onStatusChange?: (status: string) => void\n signal?: AbortSignal\n}) {\n const maxAttempts = 180\n let attempts = 0\n\n while (attempts < maxAttempts) {\n if (signal?.aborted) {\n throw signal.reason\n }\n const status = await pollFoldseekStatus({ ticketId, signal })\n\n if (status.status === 'ERROR') {\n console.error('[Foldseek] Search error:', status)\n throw new Error(\n `Foldseek search failed: ${status.error ?? 'Unknown error'}`,\n )\n }\n\n if (status.status === 'COMPLETE') {\n onStatusChange?.('Fetching results...')\n const apiResponse = await getFoldseekResults({ ticketId, signal })\n\n // Transform API response to our format\n const results: FoldseekResult = {\n query: apiResponse.queries[0] ?? { header: '', sequence: '' },\n results: apiResponse.results.map(r => ({\n db: r.db,\n alignments: r.alignments,\n })),\n }\n\n return results\n }\n\n onStatusChange?.(\n `Search ${status.status.toLowerCase()}... (${attempts + 1}s)`,\n )\n await timeout(1000, signal)\n attempts++\n }\n\n throw new Error('Foldseek search timed out')\n}\n", "import React from 'react'\n\nimport {\n Paper,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nimport FoldseekActionMenu from './FoldseekActionMenu'\nimport { getStructureUrlFromTarget } from '../utils/launchViewUtils'\n\nimport type { FlattenedHit } from './FoldseekActionMenu'\nimport type { FoldseekResult } from '../services/foldseekApi'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()({\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n },\n tableContainer: {\n maxHeight: 400,\n },\n headerCell: {\n fontWeight: 'bold',\n backgroundColor: '#f5f5f5',\n },\n noResults: {\n padding: 16,\n textAlign: 'center',\n },\n})\n\nfunction flattenResults(results: FoldseekResult): FlattenedHit[] {\n const hits = results.results.flatMap(dbResult =>\n (dbResult.alignments ?? []).flat().map(alignment => ({\n ...alignment,\n db: dbResult.db,\n structureUrl: getStructureUrlFromTarget(alignment.target, dbResult.db),\n })),\n )\n hits.sort((a, b) => (a.eval ?? Infinity) - (b.eval ?? Infinity))\n return hits.slice(0, 100)\n}\n\nexport default function FoldseekResultsTable({\n results,\n session,\n view,\n feature,\n selectedTranscript,\n userProvidedTranscriptSequence,\n onClose,\n}: {\n results: FoldseekResult\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n userProvidedTranscriptSequence?: string\n onClose: () => void\n}) {\n const { classes } = useStyles()\n const flatHits = flattenResults(results)\n\n if (flatHits.length === 0) {\n return (\n <Paper className={classes.noResults}>\n <Typography>No similar structures found</Typography>\n </Paper>\n )\n }\n\n return (\n <div className={classes.root}>\n <Typography variant=\"subtitle2\">\n Found {flatHits.length} similar structures\n </Typography>\n <TableContainer component={Paper} className={classes.tableContainer}>\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell className={classes.headerCell}>Database</TableCell>\n <TableCell className={classes.headerCell}>Target</TableCell>\n <TableCell className={classes.headerCell}>Organism</TableCell>\n <TableCell className={classes.headerCell}>Prob</TableCell>\n <TableCell className={classes.headerCell}>Seq. Id.</TableCell>\n <TableCell className={classes.headerCell}>Coverage</TableCell>\n <TableCell className={classes.headerCell}>E-value</TableCell>\n <TableCell className={classes.headerCell}>Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {flatHits.map((hit, idx) => (\n <TableRow key={`${hit.db}-${hit.target}-${idx}`}>\n <TableCell>{hit.db}</TableCell>\n <TableCell>{hit.target}</TableCell>\n <TableCell>{hit.taxName ?? '-'}</TableCell>\n <TableCell>\n {hit.prob != null ? `${(hit.prob * 100).toFixed(1)}%` : '-'}\n </TableCell>\n <TableCell>\n {hit.seqId != null ? `${hit.seqId.toFixed(1)}%` : '-'}\n </TableCell>\n <TableCell>\n {hit.alnLength != null && hit.qLen != null\n ? `${((hit.alnLength / hit.qLen) * 100).toFixed(1)}%`\n : '-'}\n </TableCell>\n <TableCell>\n {hit.eval != null ? hit.eval.toExponential(2) : '-'}\n </TableCell>\n <TableCell>\n <FoldseekActionMenu\n hit={hit}\n session={session}\n view={view}\n feature={feature}\n selectedTranscript={selectedTranscript}\n userProvidedTranscriptSequence={\n userProvidedTranscriptSequence\n }\n onClose={onClose}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport { Button, Menu, MenuItem } from '@mui/material'\n\nimport { caCoordsToPdb, hasValidCaCoords } from '../utils/caCoordsToPdb'\nimport { safeLaunch } from '../utils/launchHelpers'\nimport {\n getConfidenceUrlFromTarget,\n getUniprotIdFromAlphaFoldTarget,\n hasMsaViewPlugin,\n launch1DProteinView,\n launch3DProteinView,\n launchMsaView,\n} from '../utils/launchViewUtils'\n\nimport type { FoldseekAlignment } from '../services/foldseekApi'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport interface FlattenedHit extends FoldseekAlignment {\n db: string\n structureUrl?: string\n}\n\nexport default function FoldseekActionMenu({\n hit,\n session,\n view,\n feature,\n selectedTranscript,\n userProvidedTranscriptSequence,\n onClose,\n}: {\n hit: FlattenedHit\n session: AbstractSessionModel\n view: LinearGenomeViewModel\n feature: Feature\n selectedTranscript?: Feature\n userProvidedTranscriptSequence?: string\n onClose: () => void\n}) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const [launchError, setLaunchError] = useState<unknown>()\n const open = Boolean(anchorEl)\n\n const uniprotId = getUniprotIdFromAlphaFoldTarget(hit.target)\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleMenuClose = () => {\n setAnchorEl(null)\n }\n\n const baseParams = { session, view, feature, selectedTranscript, uniprotId }\n\n const runLaunch = (fn: () => void | Promise<void>) => () => {\n handleMenuClose()\n void safeLaunch(fn, onClose, setLaunchError)\n }\n\n const handleLaunch3D = runLaunch(() => {\n // Use tCa coordinates to generate PDB data if no URL is available\n const pdbData =\n !hit.structureUrl && hasValidCaCoords(hit.tCa, hit.tSeq)\n ? caCoordsToPdb(hit.tCa!, hit.tSeq!, 'A', hit.target)\n : undefined\n launch3DProteinView({\n ...baseParams,\n url: hit.structureUrl,\n data: pdbData,\n userProvidedTranscriptSequence,\n })\n })\n\n const handleLaunch1D = runLaunch(async () => {\n await launch1DProteinView({\n ...baseParams,\n confidenceUrl: getConfidenceUrlFromTarget(hit.target),\n })\n })\n\n const handleLaunchMSA = runLaunch(() => {\n launchMsaView(baseParams)\n })\n\n const canLoad = hit.structureUrl ?? hasValidCaCoords(hit.tCa, hit.tSeq)\n if (!canLoad) {\n return <span>-</span>\n }\n\n return (\n <>\n {launchError ? <ErrorMessage error={launchError} /> : null}\n <Button size=\"small\" variant=\"outlined\" onClick={handleClick}>\n Load\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleMenuClose}>\n <MenuItem onClick={handleLaunch3D}>Launch 3D protein view</MenuItem>\n {uniprotId ? (\n <MenuItem onClick={handleLaunch1D}>\n Launch 1D protein annotation view\n </MenuItem>\n ) : null}\n {uniprotId && hasMsaViewPlugin() ? (\n <MenuItem onClick={handleLaunchMSA}>\n Launch MSA view (AlphaFoldDB a3m)\n </MenuItem>\n ) : null}\n </Menu>\n </>\n )\n}\n", "// 3-letter amino acid codes\nconst AA_3LETTER: Record<string, string> = {\n A: 'ALA',\n C: 'CYS',\n D: 'ASP',\n E: 'GLU',\n F: 'PHE',\n G: 'GLY',\n H: 'HIS',\n I: 'ILE',\n K: 'LYS',\n L: 'LEU',\n M: 'MET',\n N: 'ASN',\n P: 'PRO',\n Q: 'GLN',\n R: 'ARG',\n S: 'SER',\n T: 'THR',\n V: 'VAL',\n W: 'TRP',\n Y: 'TYR',\n X: 'UNK', // Unknown\n}\n\nfunction padLeft(str: string, len: number) {\n return str.padStart(len, ' ')\n}\n\nfunction padRight(str: string, len: number) {\n return str.padEnd(len, ' ')\n}\n\nfunction formatCoord(val: number) {\n return val.toFixed(3).padStart(8, ' ')\n}\n\n/**\n * Convert Foldseek tCa coordinates and tSeq to PDB format\n * tCa is a comma-separated string of x,y,z triplets\n * tSeq is the amino acid sequence\n */\nexport function caCoordsToPdb(\n tCa: string,\n tSeq: string,\n chainId = 'A',\n title?: string,\n) {\n const coords = tCa.split(',').map(Number)\n const lines: string[] = []\n\n // Add header\n if (title) {\n lines.push(`TITLE ${title}`)\n }\n lines.push('REMARK 1 Generated from Foldseek C\u03B1 coordinates')\n\n let atomNum = 1\n let resNum = 1\n\n for (let i = 0; i < coords.length - 2; i += 3) {\n const x = coords[i]\n const y = coords[i + 1]\n const z = coords[i + 2]\n const aa = tSeq[resNum - 1] ?? 'X'\n const resName = AA_3LETTER[aa] ?? 'UNK'\n\n if (x === undefined || y === undefined || z === undefined) {\n break\n }\n\n // PDB ATOM record format\n // Columns: 1-6 \"ATOM \", 7-11 serial, 13-16 name, 17 altLoc, 18-20 resName,\n // 22 chainID, 23-26 resSeq, 27 iCode, 31-38 x, 39-46 y, 47-54 z,\n // 55-60 occupancy, 61-66 tempFactor, 77-78 element\n const line =\n 'ATOM ' +\n padLeft(String(atomNum), 5) +\n ' CA ' +\n padRight(resName, 3) +\n ' ' +\n chainId +\n padLeft(String(resNum), 4) +\n ' ' +\n formatCoord(x) +\n formatCoord(y) +\n formatCoord(z) +\n ' 1.00 0.00 C'\n\n lines.push(line)\n atomNum++\n resNum++\n }\n\n lines.push('END')\n\n return lines.join('\\n')\n}\n\n/**\n * Check if a hit has valid tCa data that can be converted to PDB\n */\nexport function hasValidCaCoords(tCa?: string, tSeq?: string) {\n if (!tCa || !tSeq) {\n return false\n }\n const coords = tCa.split(',')\n // Need at least 3 coordinates (x,y,z for one residue) and matching sequence\n return coords.length >= 3 && tSeq.length > 0\n}\n", "import { useEffect, useRef, useState } from 'react'\n\nimport {\n DEFAULT_DATABASES,\n predict3Di,\n submitFoldseekSearch,\n waitForFoldseekResults,\n} from '../services/foldseekApi'\n\nimport type {\n FoldseekDatabaseId,\n FoldseekResult,\n} from '../services/foldseekApi'\n\nexport default function useFoldseekSearch() {\n const [results, setResults] = useState<FoldseekResult>()\n const [predictData, setPredictData] = useState<{\n aaSequence: string\n di3Sequence: string\n }>()\n const [isLoading, setIsLoading] = useState(false)\n const [isPredicting, setIsPredicting] = useState(false)\n const [error, setError] = useState<unknown>()\n const [statusMessage, setStatusMessage] = useState('')\n\n // Aborts the in-flight request (3Di prediction or the up-to-3-minute Foldseek\n // poll) when the dialog closes/unmounts, so it stops hitting the external API\n // and stops updating dead state.\n const abortRef = useRef<AbortController | null>(null)\n useEffect(() => {\n return () => {\n abortRef.current?.abort()\n }\n }, [])\n\n const startOperation = () => {\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n return controller.signal\n }\n\n const predictStructure = async (aaSequence: string) => {\n const signal = startOperation()\n setIsPredicting(true)\n setError(undefined)\n setStatusMessage('Predicting 3Di structure...')\n try {\n const result = await predict3Di({ aaSequence, signal })\n setPredictData(result)\n return result\n } catch (e) {\n if (!signal.aborted) {\n console.error(e)\n setError(e)\n }\n return undefined\n } finally {\n if (!signal.aborted) {\n setIsPredicting(false)\n setStatusMessage('')\n }\n }\n }\n\n const search = async (\n aaSeq: string,\n di3Seq: string,\n databases: FoldseekDatabaseId[] = DEFAULT_DATABASES,\n ) => {\n const signal = startOperation()\n setIsLoading(true)\n setError(undefined)\n setStatusMessage('Submitting search...')\n try {\n const ticket = await submitFoldseekSearch({\n aaSequence: aaSeq,\n di3Sequence: di3Seq,\n databases,\n signal,\n })\n const result = await waitForFoldseekResults({\n ticketId: ticket.id,\n onStatusChange: setStatusMessage,\n signal,\n })\n setResults(result)\n return result\n } catch (e) {\n if (!signal.aborted) {\n console.error(e)\n setError(e)\n }\n return undefined\n } finally {\n if (!signal.aborted) {\n setIsLoading(false)\n setStatusMessage('')\n }\n }\n }\n\n const reset = () => {\n abortRef.current?.abort()\n setResults(undefined)\n setPredictData(undefined)\n setError(undefined)\n setStatusMessage('')\n }\n\n return {\n results,\n cleanedAaSequence: predictData?.aaSequence,\n di3Sequence: predictData?.di3Sequence,\n isLoading,\n isPredicting,\n error,\n statusMessage,\n predictStructure,\n search,\n reset,\n }\n}\n", "import React, { Suspense, lazy, useState } from 'react'\n\nimport Help from '@mui/icons-material/Help'\nimport { IconButton } from '@mui/material'\n// icons\n\n// lazies\nconst HelpDialog = lazy(() => import('./HelpDialog'))\n\nexport default function HelpButton() {\n const [show, setShow] = useState(false)\n return (\n <>\n <IconButton\n onClick={() => {\n setShow(true)\n }}\n >\n <Help />\n </IconButton>\n {show ? (\n <Suspense fallback={null}>\n <HelpDialog\n handleClose={() => {\n setShow(false)\n }}\n />\n </Suspense>\n ) : null}\n </>\n )\n}\n", "import React from 'react'\n\n// this is from MUI example\nexport default function TabPanel({\n children,\n value,\n index,\n ...other\n}: {\n children?: React.ReactNode\n index: number\n value: number\n}) {\n return (\n <div role=\"tabpanel\" hidden={value !== index} {...other}>\n {value === index && <div>{children}</div>}\n </div>\n )\n}\n", "import React, { useState } from 'react'\n\nimport { ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'\nimport { Button, DialogActions, DialogContent } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport IsoformSequencesToggle from './IsoformSequencesToggle'\nimport SequenceMismatchNotice from './SequenceMismatchNotice'\nimport StructureSourcePicker from './StructureSourcePicker'\nimport TranscriptSelector from './TranscriptSelector'\nimport ExternalLink from '../../components/ExternalLink'\nimport useStructureFileSequence from '../hooks/useStructureFileSequence'\nimport useTranscriptIsoformSelection from '../hooks/useTranscriptIsoformSelection'\nimport { launch3DProteinView } from '../utils/launchViewUtils'\nimport {\n getGeneDisplayName,\n getTranscriptDisplayName,\n stripStopCodon,\n} from '../utils/util'\n\nimport type { AlignmentAlgorithm } from '../../ProteinView/types'\nimport type { AbstractSessionModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst useStyles = makeStyles()(theme => ({\n dialogContent: {\n marginTop: theme.spacing(6),\n width: '80em',\n },\n textAreaFont: {\n fontFamily: 'Courier New',\n },\n}))\n\ntype LGV = LinearGenomeViewModel\n\nfunction HelpText() {\n return (\n <div style={{ marginBottom: 20 }}>\n Manually supply a protein structure (PDB, mmCIF, etc) for a given\n transcript. You can open the file from the result of running, for example,{' '}\n <ExternalLink href=\"https://github.com/sokrypton/ColabFold\">\n ColabFold\n </ExternalLink>\n . This plugin will align the protein sequence calculated from the genome\n to the protein sequence embedded in the structure file which allows for\n slight differences in these two representations.\n </div>\n )\n}\n\nconst UserProvidedStructure = observer(function UserProvidedStructure({\n feature,\n session,\n view,\n handleClose,\n alignmentAlgorithm,\n onAlignmentAlgorithmChange,\n}: {\n feature: Feature\n session: AbstractSessionModel\n view: LGV\n handleClose: () => void\n alignmentAlgorithm: AlignmentAlgorithm\n onAlignmentAlgorithmChange: (algorithm: AlignmentAlgorithm) => void\n}) {\n const { classes } = useStyles()\n const [file, setFile] = useState<File>()\n const [pdbId, setPdbId] = useState('')\n const [choice, setChoice] = useState('file')\n const [submitError, setSubmitError] = useState<unknown>()\n const [structureURL, setStructureURL] = useState('')\n\n const activeFile = choice === 'file' ? file : undefined\n const activeURL = choice === 'file' ? '' : structureURL\n\n const { sequences: structureSequences, error: fileError } =\n useStructureFileSequence({ file: activeFile, url: activeURL })\n\n const structureName =\n activeFile?.name ?? activeURL.slice(activeURL.lastIndexOf('/') + 1)\n const structureSequence = structureSequences?.[0]\n\n const {\n transcripts: options,\n isoformSequences,\n selectedTranscriptId: userSelection,\n setSelectedTranscriptId: setUserSelection,\n selectedTranscript,\n selectedIsoform: protein,\n error: isoformError,\n } = useTranscriptIsoformSelection({ feature, view, structureSequence })\n\n const error = isoformError ?? submitError ?? fileError\n\n const canLaunch =\n !!(activeURL || activeFile) && !!protein && !!selectedTranscript\n const sequencesDiffer =\n !!protein?.seq &&\n !!structureSequence &&\n stripStopCodon(protein.seq) !== structureSequence\n\n const handleLaunch = async () => {\n if (!protein || !selectedTranscript) {\n return\n }\n try {\n const structureData = activeFile ? await activeFile.text() : undefined\n const url = activeURL ? activeURL : undefined\n launch3DProteinView({\n session,\n view,\n feature,\n selectedTranscript,\n url,\n data: structureData,\n userProvidedTranscriptSequence: protein.seq,\n alignmentAlgorithm,\n displayName: `Protein view ${getGeneDisplayName(feature)} - ${getTranscriptDisplayName(selectedTranscript)}`,\n })\n handleClose()\n } catch (e) {\n console.error(e)\n setSubmitError(e)\n }\n }\n\n return (\n <>\n <DialogContent className={classes.dialogContent}>\n {error ? <ErrorMessage error={error} /> : null}\n <HelpText />\n\n <StructureSourcePicker\n choice={choice}\n setChoice={setChoice}\n structureURL={structureURL}\n setStructureURL={setStructureURL}\n setFile={setFile}\n pdbId={pdbId}\n setPdbId={setPdbId}\n />\n <div style={{ margin: 20 }}>\n {isoformSequences ? (\n structureSequence ? (\n <>\n <TranscriptSelector\n val={userSelection}\n setVal={setUserSelection}\n structureSequence={structureSequence}\n isoforms={options}\n feature={feature}\n isoformSequences={isoformSequences}\n />\n <IsoformSequencesToggle\n structureSequence={structureSequence}\n structureName={structureName}\n isoformSequences={isoformSequences}\n />\n </>\n ) : null\n ) : (\n <LoadingEllipses title=\"Loading protein sequences\" variant=\"h6\" />\n )}\n </div>\n </DialogContent>\n <DialogActions>\n {sequencesDiffer ? (\n <SequenceMismatchNotice\n alignmentAlgorithm={alignmentAlgorithm}\n onAlignmentAlgorithmChange={onAlignmentAlgorithmChange}\n />\n ) : null}\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!canLaunch}\n onClick={() => {\n void handleLaunch()\n }}\n >\n Launch 3-D protein structure view\n </Button>\n </DialogActions>\n </>\n )\n})\n\nexport default UserProvidedStructure\n", "import React from 'react'\n\nimport {\n Button,\n FormControl,\n FormControlLabel,\n Radio,\n RadioGroup,\n TextField,\n Typography,\n} from '@mui/material'\n\nimport HelpButton from './HelpButton'\nimport { getPdbStructureUrl } from '../utils/launchViewUtils'\n\nexport default function StructureSourcePicker({\n choice,\n setChoice,\n structureURL,\n setStructureURL,\n setFile,\n pdbId,\n setPdbId,\n}: {\n choice: string\n setChoice: (c: string) => void\n structureURL: string\n setStructureURL: (url: string) => void\n setFile: (f: File) => void\n pdbId: string\n setPdbId: (id: string) => void\n}) {\n return (\n <div style={{ display: 'flex', margin: 30 }}>\n <Typography>\n Open your structure file <HelpButton />\n </Typography>\n\n <FormControl component=\"fieldset\">\n <RadioGroup\n value={choice}\n onChange={event => {\n setChoice(event.target.value)\n }}\n >\n <FormControlLabel value=\"url\" control={<Radio />} label=\"URL\" />\n <FormControlLabel value=\"file\" control={<Radio />} label=\"File\" />\n <FormControlLabel value=\"pdb\" control={<Radio />} label=\"PDB ID\" />\n </RadioGroup>\n </FormControl>\n\n {choice === 'url' ? (\n <div>\n <Typography>Open a PDB/mmCIF/etc. file from remote URL</Typography>\n <TextField\n label=\"URL\"\n value={structureURL}\n onChange={event => {\n setStructureURL(event.target.value)\n }}\n />\n </div>\n ) : null}\n\n {choice === 'file' ? (\n <div style={{ paddingTop: 20 }}>\n <Typography>\n Open a PDB/mmCIF/etc. file from your local drive\n </Typography>\n <Button variant=\"outlined\" component=\"label\">\n Choose File\n <input\n type=\"file\"\n hidden\n onChange={({ target }) => {\n const f = target.files?.[0]\n if (f) {\n setFile(f)\n }\n }}\n />\n </Button>\n </div>\n ) : null}\n\n {choice === 'pdb' ? (\n <TextField\n value={pdbId}\n onChange={event => {\n const s = event.target.value\n setPdbId(s)\n setStructureURL(getPdbStructureUrl(s))\n }}\n label=\"PDB ID\"\n />\n ) : null}\n </div>\n )\n}\n", "import { useState } from 'react'\n\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n): [T, (value: T) => void] {\n const [value, setValue] = useState<T>(() => {\n const stored = localStorage.getItem(key)\n if (stored) {\n try {\n return JSON.parse(stored) as T\n } catch {\n return defaultValue\n }\n }\n return defaultValue\n })\n\n function setValueAndStore(newValue: T) {\n setValue(newValue)\n localStorage.setItem(key, JSON.stringify(newValue))\n }\n\n return [value, setValueAndStore]\n}\n", "import { readConfObject } from '@jbrowse/core/configuration'\nimport { parseLocString } from '@jbrowse/core/util'\n\nimport { fetchProteinSeq } from '../LaunchProteinView/utils/calculateProteinSequence'\nimport { getAlphaFoldStructureUrl } from '../LaunchProteinView/utils/launchViewUtils'\nimport {\n getTranscriptFeatures,\n stripTrailingVersion,\n} from '../LaunchProteinView/utils/util'\n\nimport type {\n AbstractSessionModel,\n Feature,\n SimpleFeatureSerialized,\n} from '@jbrowse/core/util'\n\nexport interface ConnectedViewSpec {\n loc?: string\n assembly?: string\n tracks?: (string | Record<string, unknown>)[]\n}\n\nexport interface ResolvedShortLaunch {\n url: string\n feature: SimpleFeatureSerialized\n userProvidedTranscriptSequence: string\n}\n\nfunction getTrackId(track: string | Record<string, unknown>) {\n if (typeof track === 'string') {\n return track\n }\n const { trackId } = track\n return typeof trackId === 'string' ? trackId : undefined\n}\n\nfunction transcriptMatches(transcript: Feature, transcriptId: string) {\n const target = stripTrailingVersion(transcriptId)\n return [transcript.get('name'), transcript.get('id'), transcript.id()].some(\n candidate =>\n typeof candidate === 'string' &&\n (candidate === transcriptId ||\n stripTrailingVersion(candidate) === target),\n )\n}\n\n/**\n * Headless counterpart of the interactive AlphaFoldDBSearch \u2192 TranscriptSelector\n * flow. Given a `uniprotId`, a `transcriptId`, and a connected genome view spec,\n * it derives the three things a ProteinView structure needs: the AlphaFold\n * structure URL, the transcript `feature` (for the genome\u2194protein mapping), and\n * the translated protein sequence (for the alignment). Every failure throws with\n * a descriptive message so the caller can surface it \u2014 nothing degrades silently\n * to an unlinked structure.\n */\nexport async function resolveShortLaunch({\n session,\n uniprotId,\n transcriptId,\n connectedView,\n}: {\n session: AbstractSessionModel\n uniprotId: string\n transcriptId?: string\n connectedView?: ConnectedViewSpec\n}): Promise<ResolvedShortLaunch> {\n if (!transcriptId) {\n throw new Error('transcriptId is required to launch from a uniprotId')\n }\n const assemblyName = connectedView?.assembly\n const loc = connectedView?.loc\n const trackSpecs = connectedView?.tracks ?? []\n if (!assemblyName || !loc) {\n throw new Error(\n 'connectedView with assembly + loc is required to launch from a uniprotId',\n )\n }\n\n const assembly = await session.assemblyManager.waitForAssembly(assemblyName)\n if (!assembly) {\n throw new Error(`assembly \"${assemblyName}\" not found`)\n }\n\n const parsed = parseLocString(loc, refName => assembly.isValidRefName(refName))\n if (parsed.start === undefined || parsed.end === undefined) {\n throw new Error(`could not parse a start-end region from loc \"${loc}\"`)\n }\n const region = {\n assemblyName,\n refName: assembly.getCanonicalRefName(parsed.refName) ?? parsed.refName,\n start: parsed.start,\n end: parsed.end,\n }\n\n const trackIds = trackSpecs.map(getTrackId).filter(t => t !== undefined)\n const tracksById = session.getTracksById()\n const sessionId = 'getFeatures'\n const transcripts: Feature[] = []\n for (const trackId of trackIds) {\n const trackConf = tracksById[trackId]\n if (!trackConf) {\n continue\n }\n const feats = (await session.rpcManager.call(sessionId, 'CoreGetFeatures', {\n adapterConfig: readConfObject(trackConf, 'adapter'),\n sessionId,\n regions: [region],\n })) as Feature[]\n for (const feat of feats) {\n transcripts.push(...getTranscriptFeatures(feat))\n }\n }\n\n const transcript = transcripts.find(f => transcriptMatches(f, transcriptId))\n if (!transcript) {\n throw new Error(\n `transcript \"${transcriptId}\" not found at ${loc} in tracks [${trackIds.join(', ')}]`,\n )\n }\n const hasCds = (transcript.get('subfeatures') ?? []).some(\n (sub: Feature) => sub.get('type') === 'CDS',\n )\n if (!hasCds) {\n throw new Error(`transcript \"${transcriptId}\" has no CDS subfeatures`)\n }\n\n const userProvidedTranscriptSequence = await fetchProteinSeq({\n session,\n assemblyName,\n feature: transcript,\n })\n if (!userProvidedTranscriptSequence) {\n throw new Error(\n `could not translate a protein sequence for \"${transcriptId}\"`,\n )\n }\n\n return {\n url: getAlphaFoldStructureUrl(uniprotId),\n feature: transcript.toJSON(),\n userProvidedTranscriptSequence,\n }\n}\n", "import { type ConnectedViewSpec, resolveShortLaunch } from './resolveShortLaunch'\nimport {\n getLaunchSideBySide,\n launchViewSideBySide,\n} from '../LaunchProteinView/utils/sideBySide'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { AbstractSessionModel } from '@jbrowse/core/util'\n\nexport default function LaunchProteinViewExtensionPointF(\n pluginManager: PluginManager,\n) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-ProteinView',\n // LaunchView extension points are typed as transformers `(extendee, props)\n // => extendee`, but in practice JBrowse invokes them as side-effect\n // handlers and ignores the return value. Casting away the signature\n // mismatch rather than fabricating a fake return.\n // @ts-expect-error\n async ({\n session,\n url,\n uniprotId,\n transcriptId,\n userProvidedTranscriptSequence,\n feature,\n connectedViewId,\n connectedView,\n alignmentAlgorithm,\n displayName,\n height,\n showControls,\n showHighlight,\n zoomToBaseLevel,\n sideBySide,\n }: {\n session: AbstractSessionModel\n url?: string\n uniprotId?: string\n transcriptId?: string\n userProvidedTranscriptSequence?: string\n feature?: Record<string, unknown>\n connectedViewId?: string\n connectedView?: ConnectedViewSpec\n alignmentAlgorithm?: string\n displayName?: string\n height?: number\n showControls?: boolean\n showHighlight?: boolean\n zoomToBaseLevel?: boolean\n // when this launch creates its own connected genome view, place the\n // protein view side-by-side (left genome | right protein). Explicit\n // override; falls back to the launch-dialog localStorage preference.\n sideBySide?: boolean\n }) => {\n // Short-URL form: `uniprotId` + `transcriptId` + `connectedView` (no\n // explicit `url`/`feature`/sequence). Derive the structure URL, the\n // transcript feature, and the translated sequence from the connected\n // track. Failures surface via notify and abort \u2014 we never leave a\n // half-wired view (see agent-docs/urlparam_plan.md).\n let resolved\n if (!url && uniprotId) {\n try {\n resolved = await resolveShortLaunch({\n session,\n uniprotId,\n transcriptId,\n connectedView,\n })\n } catch (e) {\n console.error(e)\n session.notify(`Could not launch protein view: ${e}`, 'error')\n return\n }\n }\n\n const finalUrl = url ?? resolved?.url\n if (!finalUrl) {\n throw new Error(\n 'No url or uniprotId provided when launching protein view',\n )\n }\n\n // A session spec launches each view independently with an auto-generated\n // id, so it cannot pre-compute a connectedViewId to cross-reference. When\n // `connectedView` is supplied we create the LinearGenomeView here and wire\n // its id, letting a single spec entry produce a connected genome+protein\n // pair (e.g. hover a variant to highlight the residue).\n // a connected view this launch created itself can be split beside the\n // protein view; a pre-existing connectedViewId is left in place\n const ownsConnectedView = !connectedViewId && !!connectedView\n const resolvedConnectedViewId =\n connectedViewId ??\n (connectedView\n ? session.addView('LinearGenomeView', {\n type: 'LinearGenomeView',\n init: connectedView,\n }).id\n : undefined)\n\n const proteinView = session.addView('ProteinView', {\n type: 'ProteinView',\n alignmentAlgorithm,\n displayName,\n height,\n showControls,\n showHighlight,\n zoomToBaseLevel,\n structures: [\n {\n url: finalUrl,\n userProvidedTranscriptSequence:\n resolved?.userProvidedTranscriptSequence ??\n userProvidedTranscriptSequence ??\n '',\n feature: resolved?.feature ?? feature,\n connectedViewId: resolvedConnectedViewId,\n },\n ],\n })\n\n if (ownsConnectedView && (sideBySide ?? getLaunchSideBySide())) {\n launchViewSideBySide(session, proteinView.id)\n }\n },\n )\n}\n", "import { lazy } from 'react'\n\nimport { ViewType } from '@jbrowse/core/pluggableElementTypes'\n\nimport stateModelF from './model'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nconst ReactComponent = lazy(() => import('./components/ProteinView'))\n\nexport default function ProteinViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'ProteinView',\n displayName: 'Protein view',\n stateModel: stateModelF(),\n ReactComponent,\n })\n })\n}\n", "import { BaseViewModel } from '@jbrowse/core/pluggableElementTypes'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { addDisposer, types } from '@jbrowse/mobx-state-tree'\nimport SettingsIcon from '@mui/icons-material/Settings'\nimport Visibility from '@mui/icons-material/Visibility'\nimport { autorun } from 'mobx'\n\nimport {\n COLOR_SCHEMES,\n COLOR_SCHEME_VALUES,\n type ProteinColorScheme,\n applyColorTheme,\n} from './applyColorTheme'\nimport { loadStructureData } from './loadStructureData'\nimport { makeStructureLoader } from './structureLoader'\nimport Structure from './structureModel'\nimport { superposeStructures } from './superposeStructures'\nimport { type AlignmentAlgorithm, DEFAULT_ALIGNMENT_ALGORITHM } from './types'\n\nconst SETTINGS_KEY = 'proteinView-settings'\nconst PERSISTED_SETTINGS = [\n 'showAlignment',\n 'showProteinTracks',\n 'showHighlight',\n 'zoomToBaseLevel',\n 'autoScrollAlignment',\n 'compactTracks',\n] as const\n\nimport type { Instance } from '@jbrowse/mobx-state-tree'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface ProteinViewInitState {\n structures?: {\n url?: string\n data?: string\n }[]\n showControls?: boolean\n showAlignment?: boolean\n}\n\n/**\n * #stateModel Protein3dViewPlugin\n * extends\n * - BaseViewModel\n */\nfunction stateModelFactory() {\n return types\n .compose(\n 'ProteinView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('ProteinView'),\n /**\n * #property\n */\n structures: types.array(Structure),\n\n /**\n * #property\n */\n showControls: false,\n /**\n * #property\n */\n height: types.optional(types.number, 650),\n\n /**\n * #property\n */\n showHighlight: false,\n /**\n * #property\n */\n zoomToBaseLevel: true,\n /**\n * #property\n */\n autoScrollAlignment: false,\n /**\n * #property\n * molstar color-theme name applied to all loaded structures\n */\n colorScheme: types.optional(\n types.enumeration<ProteinColorScheme>(\n 'ColorScheme',\n COLOR_SCHEME_VALUES,\n ),\n 'default',\n ),\n /**\n * #property\n */\n showAlignment: true,\n /**\n * #property\n */\n showProteinTracks: true,\n /**\n * #property\n * render the feature/residue tracks at reduced height\n */\n compactTracks: true,\n /**\n * #property\n */\n alignmentAlgorithm: types.optional(\n types.string,\n DEFAULT_ALIGNMENT_ALGORITHM,\n ),\n\n /**\n * #property\n * ID of connected MSA view for hover synchronization\n */\n connectedMsaViewId: types.maybe(types.string),\n\n /**\n * #property\n * used for loading the protein view via session snapshots, e.g.\n * {\n * \"type\": \"ProteinView\",\n * \"init\": {\n * \"structures\": [\n * { \"url\": \"https://files.rcsb.org/download/1A2B.pdb\" }\n * ],\n * \"showControls\": true\n * }\n * }\n */\n init: types.frozen<ProteinViewInitState | undefined>(),\n }),\n )\n .volatile(() => ({\n /**\n * #volatile\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n error: undefined as unknown,\n /**\n * #volatile\n */\n molstarPluginContext: undefined as PluginContext | undefined,\n /**\n * #volatile\n */\n showManualAlignmentDialog: false,\n /**\n * #volatile\n */\n showAddStructureDialog: false,\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n setHeight(n: number) {\n self.height = n\n return n\n },\n /**\n * #action\n */\n setShowAlignment(f: boolean) {\n self.showAlignment = f\n },\n\n /**\n * #action\n */\n setShowControls(arg: boolean) {\n self.showControls = arg\n },\n\n /**\n * #action\n */\n setError(e: unknown) {\n self.error = e\n },\n\n /**\n * #action\n */\n setShowHighlight(arg: boolean) {\n self.showHighlight = arg\n },\n /**\n * #action\n */\n setShowProteinTracks(arg: boolean) {\n self.showProteinTracks = arg\n },\n /**\n * #action\n */\n setCompactTracks(arg: boolean) {\n self.compactTracks = arg\n },\n /**\n * #action\n */\n setZoomToBaseLevel(arg: boolean) {\n self.zoomToBaseLevel = arg\n },\n /**\n * #action\n */\n setAutoScrollAlignment(arg: boolean) {\n self.autoScrollAlignment = arg\n },\n /**\n * #action\n */\n setAlignmentAlgorithm(algorithm: AlignmentAlgorithm) {\n self.alignmentAlgorithm = algorithm\n },\n /**\n * #action\n */\n setColorScheme(scheme: ProteinColorScheme) {\n self.colorScheme = scheme\n },\n /**\n * #action\n */\n setMolstarPluginContext(p?: PluginContext) {\n // Reset loadedToMolstar for all structures when plugin context changes\n // This ensures structures get reloaded when the view is moved/remounted\n if (p !== self.molstarPluginContext) {\n for (const structure of self.structures) {\n structure.setLoadedToMolstar(false)\n }\n }\n self.molstarPluginContext = p\n },\n /**\n * #action\n */\n setShowManualAlignmentDialog(val: boolean) {\n self.showManualAlignmentDialog = val\n },\n /**\n * #action\n */\n setShowAddStructureDialog(val: boolean) {\n self.showAddStructureDialog = val\n },\n /**\n * #action\n */\n setInit(arg?: ProteinViewInitState) {\n self.init = arg\n },\n /**\n * #action\n */\n setConnectedMsaViewId(id?: string) {\n self.connectedMsaViewId = id\n },\n /**\n * #action\n */\n addStructure(structure: { url?: string; data?: string }) {\n self.structures.push(\n Structure.create({\n url: structure.url,\n data: structure.data,\n userProvidedTranscriptSequence: '',\n }),\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n async addStructureAndSuperpose(structure: {\n url?: string\n data?: string\n }) {\n const { molstarPluginContext } = self\n if (!molstarPluginContext) {\n return\n }\n\n const newStructure = Structure.create({\n url: structure.url,\n data: structure.data,\n userProvidedTranscriptSequence: '',\n })\n // Set loadedToMolstar BEFORE pushing to avoid race condition with autorun\n newStructure.setLoadedToMolstar(true)\n self.structures.push(newStructure)\n\n try {\n newStructure.setStructureData(\n await loadStructureData({\n structure,\n plugin: molstarPluginContext,\n }),\n )\n if (self.structures.length > 1) {\n await superposeStructures(molstarPluginContext)\n }\n } catch (e) {\n self.setError(e)\n console.error(e)\n }\n },\n }))\n .actions(self => ({\n afterAttach() {\n // restore settings from localStorage\n try {\n const stored = localStorage.getItem(SETTINGS_KEY)\n if (stored) {\n const settings = JSON.parse(stored) as Record<string, boolean>\n for (const key of PERSISTED_SETTINGS) {\n if (settings[key] !== undefined) {\n self[key] = settings[key]\n }\n }\n }\n } catch (e) {\n console.error('Failed to restore protein view settings', e)\n }\n\n // save settings to localStorage when they change\n addDisposer(\n self,\n autorun(() => {\n try {\n const settings: Record<string, boolean> = {}\n for (const key of PERSISTED_SETTINGS) {\n settings[key] = self[key]\n }\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings))\n } catch (e) {\n console.error('Failed to save protein view settings', e)\n }\n }),\n )\n\n // process init parameter for loading structures from session snapshots\n addDisposer(\n self,\n autorun(() => {\n const { init } = self\n if (init) {\n const { structures, showControls, showAlignment } = init\n\n if (structures) {\n for (const structure of structures) {\n self.addStructure(structure)\n }\n }\n\n if (showControls !== undefined) {\n self.setShowControls(showControls)\n }\n\n if (showAlignment !== undefined) {\n self.setShowAlignment(showAlignment)\n }\n\n self.setInit(undefined)\n }\n }),\n )\n\n // Apply the chosen color theme whenever it changes or once a structure\n // finishes loading (structureSequences is set after its molstar\n // representation is built, so the theme has something to recolor).\n addDisposer(\n self,\n autorun(() => {\n const { molstarPluginContext, colorScheme } = self\n const readyCount = self.structures.filter(\n s => s.structureSequences !== undefined,\n ).length\n if (molstarPluginContext && readyCount > 0) {\n applyColorTheme({\n plugin: molstarPluginContext,\n colorScheme,\n }).catch((e: unknown) => {\n console.error(e)\n self.setError(e)\n })\n }\n }),\n )\n\n // Load structures into Molstar as they appear or whenever the plugin\n // context changes. See makeStructureLoader for why the autorun body is\n // synchronous and how it guards against duplicate/stale loads.\n addDisposer(self, autorun(makeStructureLoader(self)))\n },\n }))\n .views(self => ({\n get primaryStructure() {\n return self.structures[0]\n },\n menuItems() {\n return [\n {\n label: 'Pairwise alignment',\n icon: Visibility,\n type: 'checkbox',\n checked: self.showAlignment,\n onClick: () => {\n self.setShowAlignment(!self.showAlignment)\n },\n },\n {\n label: 'Protein feature tracks',\n icon: Visibility,\n type: 'checkbox',\n checked: self.showProteinTracks,\n onClick: () => {\n self.setShowProteinTracks(!self.showProteinTracks)\n },\n },\n {\n label: 'Color scheme...',\n subMenu: COLOR_SCHEMES.map(scheme => ({\n label: scheme.label,\n type: 'radio' as const,\n checked: self.colorScheme === scheme.value,\n onClick: () => {\n self.setColorScheme(scheme.value)\n },\n })),\n },\n {\n label: 'Add structure...',\n onClick: () => {\n self.setShowAddStructureDialog(true)\n },\n },\n {\n label: 'Advanced...',\n icon: SettingsIcon,\n subMenu: [\n {\n label: 'Pairwise alignment as green highlight',\n type: 'checkbox',\n checked: self.showHighlight,\n onClick: () => {\n self.setShowHighlight(!self.showHighlight)\n },\n },\n {\n label: 'Show all protein feature tracks',\n onClick: () => {\n for (const structure of self.structures) {\n structure.showAllFeatureTypes()\n }\n },\n },\n {\n label: 'Import manual alignment...',\n onClick: () => {\n self.setShowManualAlignmentDialog(true)\n },\n },\n {\n label: 'Re-align structures (TM-align)',\n onClick: () => {\n if (self.molstarPluginContext) {\n superposeStructures(self.molstarPluginContext).catch(\n (e: unknown) => {\n console.error(e)\n self.setError(e)\n },\n )\n }\n },\n },\n {\n label: 'Zoom to base level on click',\n type: 'checkbox',\n checked: self.zoomToBaseLevel,\n onClick: () => {\n self.setZoomToBaseLevel(!self.zoomToBaseLevel)\n },\n },\n {\n label: 'Auto-scroll protein feature view on hover',\n type: 'checkbox',\n checked: self.autoScrollAlignment,\n onClick: () => {\n self.setAutoScrollAlignment(!self.autoScrollAlignment)\n },\n },\n ],\n },\n ]\n },\n }))\n}\n\nexport default stateModelFactory\n\nexport type JBrowsePluginProteinViewStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type JBrowsePluginProteinViewModel =\n Instance<JBrowsePluginProteinViewStateModel>\n\nexport type {\n JBrowsePluginProteinStructureModel,\n JBrowsePluginProteinStructureStateModel,\n} from './structureModel'\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3\"\n}), 'Visibility');", "// Minimal shape of the molstar Model fields we read. AlphaFold structures\n// store the per-residue pLDDT in the B-factor column (B_iso_or_equiv), so\n// reading the first atom of each residue yields pLDDT for AlphaFold files and\n// the crystallographic B-factor for experimental ones.\ninterface ConfidenceModel {\n obj?: {\n data: {\n atomicConformation: {\n B_iso_or_equiv: { value: (row: number) => number }\n }\n atomicHierarchy: {\n residueAtomSegments: {\n offsets: ArrayLike<number>\n count: number\n }\n }\n }\n }\n}\n\n/**\n * Per-residue B-factor / pLDDT, indexed by 0-based residue order (which aligns\n * with the structure's first-chain sequence for AlphaFold models). `maxLength`\n * caps the result to the structure sequence length so trailing chains/hetero\n * residues don't bleed in.\n */\nexport function extractPerResidueConfidence(\n model: ConfidenceModel,\n maxLength?: number,\n): number[] | undefined {\n const data = model.obj?.data\n if (!data) {\n return undefined\n }\n const { B_iso_or_equiv } = data.atomicConformation\n const { offsets, count } = data.atomicHierarchy.residueAtomSegments\n const n = maxLength === undefined ? count : Math.min(count, maxLength)\n const values: number[] = []\n for (let i = 0; i < n; i++) {\n values.push(B_iso_or_equiv.value(offsets[i]!))\n }\n return values\n}\n\n/**\n * AlphaFold-style pLDDT lives in [0, 100] and varies across residues. A\n * constant column (common when a PDB has no B-factors) or out-of-range values\n * indicate the track wouldn't be meaningful as confidence.\n */\nexport function looksLikePlddt(\n values: number[] | undefined,\n): values is number[] {\n return (\n !!values &&\n values.length > 1 &&\n values.every(v => v >= 0 && v <= 100) &&\n new Set(values).size > 1\n )\n}\n", "import { addStructureFromData } from './addStructureFromData'\nimport { addStructureFromURL } from './addStructureFromURL'\nimport { extractPerResidueConfidence } from './extractPerResidueConfidence'\nimport { extractStructureSequences } from './extractStructureSequences'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface StructureData {\n sequences?: string[]\n confidence?: number[]\n}\n\n/**\n * Loads a structure (from inline data or a URL) into the given Molstar plugin\n * and pulls out its per-chain sequences and per-residue confidence. Pure with\n * respect to the model \u2014 it only touches the plugin and returns plain data, so\n * callers own the decision of whether/where to store the result.\n */\nexport async function loadStructureData({\n structure,\n plugin,\n}: {\n structure: { data?: string; url?: string }\n plugin: PluginContext\n}): Promise<StructureData> {\n const { model } = structure.data\n ? await addStructureFromData({ data: structure.data, plugin })\n : structure.url\n ? await addStructureFromURL({ url: structure.url, plugin })\n : { model: undefined }\n const sequences = model ? extractStructureSequences(model) : undefined\n const confidence = model\n ? extractPerResidueConfidence(model, sequences?.[0]?.length)\n : undefined\n return { sequences, confidence }\n}\n", "import { isAlive } from '@jbrowse/mobx-state-tree'\n\nimport { loadStructureData } from './loadStructureData'\n\nimport type StructureModel from './structureModel'\nimport type { IAnyStateTreeNode, Instance } from '@jbrowse/mobx-state-tree'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype StructureInstance = Instance<typeof StructureModel>\n\nexport type StructureLoaderHost = IAnyStateTreeNode & {\n readonly molstarPluginContext: PluginContext | undefined\n readonly structures: StructureInstance[]\n setError: (error: unknown) => void\n}\n\n/**\n * Builds the body of the autorun that loads structures into Molstar.\n *\n * The returned callback is synchronous on purpose: MobX only tracks\n * observables read before the first `await`, so an async autorun body would\n * stop reacting to later structures/plugin changes. Instead it reads its\n * dependencies synchronously and dispatches a guarded fire-and-forget load for\n * each structure that is neither loaded nor already loading. The guards handle\n * the lifecycle hazards of an external GPU resource:\n *\n * - a non-observable in-flight Set stops a re-entrant run (a new structure\n * pushed, or the plugin swapped mid-load) from starting a duplicate load of\n * the same structure;\n * - a load whose plugin was replaced or whose model was destroyed while\n * awaiting has its result discarded rather than written into a torn-down\n * plugin;\n * - if the plugin was merely swapped (e.g. a view remount), the structure is\n * reloaded into the current plugin so it isn't left stranded unloaded.\n */\nexport function makeStructureLoader(host: StructureLoaderHost) {\n const loadingStructures = new Set<StructureInstance>()\n\n function loadInto(structure: StructureInstance, plugin: PluginContext) {\n loadingStructures.add(structure)\n loadStructureData({ structure, plugin })\n .then(data => {\n const current = isAlive(structure)\n ? host.molstarPluginContext\n : undefined\n if (current === plugin) {\n structure.setStructureData(data)\n structure.setLoadedToMolstar(true)\n }\n loadingStructures.delete(structure)\n if (current && current !== plugin && !structure.loadedToMolstar) {\n loadInto(structure, current)\n }\n })\n .catch((e: unknown) => {\n loadingStructures.delete(structure)\n if (isAlive(host)) {\n host.setError(e)\n console.error(e)\n }\n })\n }\n\n return function loadPendingStructures() {\n const { structures, molstarPluginContext } = host\n if (molstarPluginContext) {\n for (const structure of structures) {\n if (!structure.loadedToMolstar && !loadingStructures.has(structure)) {\n loadInto(structure, molstarPluginContext)\n }\n }\n }\n }\n}\n", "import { SimpleFeature, getSession } from '@jbrowse/core/util'\nimport {\n type Instance,\n addDisposer,\n getParent,\n types,\n} from '@jbrowse/mobx-state-tree'\nimport { autorun } from 'mobx'\n\nimport {\n applyLociInteractivityMultiple,\n applyLociInteractivitySingle,\n} from './applyLociInteractivity'\nimport {\n COMPACT_TRACK_GAP,\n COMPACT_TRACK_HEIGHT,\n NORMAL_TRACK_GAP,\n NORMAL_TRACK_HEIGHT,\n} from './constants'\nimport {\n type CoordinateMapper,\n alignmentCol,\n makeCoordinateMapper,\n structurePos,\n} from './coordinates'\nimport { looksLikePlddt } from './extractPerResidueConfidence'\nimport highlightResidueRange from './highlightResidueRange'\nimport { runLocalAlignment } from './pairwiseAlignment'\nimport { proteinAbbreviationMapping } from './proteinAbbreviationMapping'\nimport {\n clickProteinToGenome,\n proteinRangeToGenomeMapping,\n proteinToGenomeMapping,\n} from './proteinToGenomeMapping'\nimport { kyteDoolittleScores, mapResidueValuesToColumns } from './residueTracks'\nimport subscribeMolstarInteraction from './subscribeMolstarInteraction'\nimport { checkHovered } from './util'\nimport { getUniprotIdFromAlphaFoldTarget } from '../LaunchProteinView/utils/launchViewUtils'\nimport { stripStopCodon } from '../LaunchProteinView/utils/util'\nimport { genomeToTranscriptSeqMapping } from '../mappings'\nimport { coerceAlignmentAlgorithm } from './types'\n\nimport type { PairwiseAlignment } from '../mappings'\nimport type { AlignmentAlgorithm } from './types'\nimport type { SimpleFeatureSerialized } from '@jbrowse/core/util'\nimport type { Region as IRegion } from '@jbrowse/core/util/types'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\ntype LGV = LinearGenomeViewModel\ntype MaybeLGV = LGV | undefined\ntype MaybePairwiseAlignment = PairwiseAlignment | undefined\n\nexport interface ParentProteinView {\n zoomToBaseLevel: boolean\n autoScrollAlignment: boolean\n showHighlight: boolean\n showProteinTracks: boolean\n compactTracks: boolean\n alignmentAlgorithm: string\n molstarPluginContext: PluginContext | undefined\n structures: { url?: string }[]\n setShowAlignment: (f: boolean) => void\n setError: (e: unknown) => void\n}\n\nconst Structure = types\n .model({\n /**\n * #property\n */\n url: types.maybe(types.string),\n /**\n * #property\n */\n data: types.maybe(types.string),\n /**\n * #property\n */\n connectedViewId: types.maybe(types.string),\n /**\n * #property\n */\n pairwiseAlignment: types.frozen<MaybePairwiseAlignment>(),\n /**\n * #property\n */\n feature: types.frozen<SimpleFeatureSerialized | undefined>(),\n /**\n * #property\n */\n userProvidedTranscriptSequence: types.string,\n })\n .volatile(() => ({\n /**\n * #volatile\n * Inclusive-exclusive structure-residue range from a click; drives the\n * derived clickGenomeHighlights getter.\n */\n clickedStructureRange: undefined as\n | { start: number; end: number }\n | undefined,\n\n /**\n * #volatile\n * The 'genome' source is set when the hover originated from the\n * connected LinearGenomeView; hoverGenomeHighlights ignores it to avoid\n * echoing a codon-width highlight back onto the same genome view.\n */\n hoverPosition: undefined as\n | {\n structureSeqPos?: number\n code?: string\n chain?: string\n source: 'structure' | 'genome'\n }\n | undefined,\n /**\n * #volatile\n */\n structureSequences: undefined as string[] | undefined,\n /**\n * #volatile\n * Per-residue B-factor / pLDDT for the first chain, indexed by 0-based\n * structure sequence position. Drives the confidence feature track.\n */\n structureConfidence: undefined as number[] | undefined,\n /**\n * #volatile\n */\n isMouseInAlignment: false,\n /**\n * #volatile\n * Tracks whether this structure has been loaded into Molstar\n */\n loadedToMolstar: false,\n /**\n * #volatile\n * Range of alignment positions to highlight (e.g., when hovering a protein feature)\n */\n alignmentHoverRange: undefined as\n | { start: number; end: number }\n | undefined,\n /**\n * #volatile\n * The uniqueId of the currently selected protein feature (for persistent highlight)\n */\n selectedFeatureId: undefined as string | undefined,\n /**\n * #volatile\n * Set of feature track types that are hidden\n */\n hiddenFeatureTypes: new Set<string>(),\n }))\n .actions(self => ({\n setStructureData(data: { sequences?: string[]; confidence?: number[] }) {\n self.structureSequences = data.sequences\n self.structureConfidence = data.confidence\n },\n /**\n * #action\n */\n hideFeatureType(type: string) {\n self.hiddenFeatureTypes = new Set([...self.hiddenFeatureTypes, type])\n },\n /**\n * #action\n */\n showFeatureType(type: string) {\n const newSet = new Set(self.hiddenFeatureTypes)\n newSet.delete(type)\n self.hiddenFeatureTypes = newSet\n },\n /**\n * #action\n */\n showAllFeatureTypes() {\n self.hiddenFeatureTypes = new Set()\n },\n /**\n * #action\n */\n setLoadedToMolstar(val: boolean) {\n self.loadedToMolstar = val\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get connectedView() {\n const { views } = getSession(self)\n return views.find(f => f.id === self.connectedViewId) as MaybeLGV\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setClickedStructureRange(range?: { start: number; end: number }) {\n self.clickedStructureRange = range\n },\n /**\n * #action\n */\n setAlignmentHoverRange(range?: { start: number; end: number }) {\n self.alignmentHoverRange = range\n },\n /**\n * #action\n */\n setSelectedFeatureId(uniqueId?: string) {\n self.selectedFeatureId = uniqueId\n },\n /**\n * #action\n */\n setHoveredPosition(arg?: {\n structureSeqPos?: number\n chain?: string\n code?: string\n }) {\n self.hoverPosition = arg ? { ...arg, source: 'structure' } : undefined\n },\n /**\n * #action\n * Records a hover that originated from the connected LinearGenomeView.\n * Drives the 3D structure / feature-track highlight, but is excluded\n * from hoverGenomeHighlights so it doesn't echo back onto that same view.\n */\n setGenomeHoveredPosition(structureSeqPos?: number) {\n self.hoverPosition =\n structureSeqPos === undefined\n ? undefined\n : { structureSeqPos, source: 'genome' }\n },\n /**\n * #action\n */\n setAlignment(r?: PairwiseAlignment) {\n self.pairwiseAlignment = r\n },\n /**\n * #action\n */\n setIsMouseInAlignment(val: boolean) {\n self.isMouseInAlignment = val\n },\n }))\n .views(self => ({\n /**\n * #getter\n * Extracts UniProt ID from AlphaFold URL if available\n */\n get uniprotId() {\n const { url } = self\n if (!url) {\n return undefined\n }\n return getUniprotIdFromAlphaFoldTarget(url)\n },\n /**\n * #getter\n * All structure/transcript/alignment coordinate conversions, built once\n * from the pairwise alignment (see coordinates.ts). Use its typed methods\n * for point conversions; the getters below expose the raw maps for\n * whole-map consumers.\n */\n get coordinateMapper(): CoordinateMapper | undefined {\n return self.pairwiseAlignment\n ? makeCoordinateMapper(self.pairwiseAlignment)\n : undefined\n },\n /**\n * #getter\n */\n get structureSeqToTranscriptSeqPosition() {\n return this.coordinateMapper?.maps.structureSeqToTranscriptSeqPosition\n },\n /**\n * #getter\n */\n get transcriptSeqToStructureSeqPosition() {\n return this.coordinateMapper?.maps.transcriptSeqToStructureSeqPosition\n },\n /**\n * #getter\n */\n get structurePositionToAlignmentMap() {\n return this.coordinateMapper?.maps.structurePositionToAlignmentMap\n },\n /**\n * #getter\n */\n get transcriptPositionToAlignmentMap() {\n return this.coordinateMapper?.maps.transcriptPositionToAlignmentMap\n },\n /**\n * #getter\n * Per-residue pLDDT values mapped to alignment columns, shown only when the\n * structure's B-factor column actually looks like AlphaFold confidence.\n */\n get confidenceCells() {\n const c = self.structureConfidence\n return looksLikePlddt(c)\n ? mapResidueValuesToColumns(c, this.structurePositionToAlignmentMap)\n : []\n },\n /**\n * #getter\n * Per-residue Kyte-Doolittle hydrophobicity mapped to alignment columns.\n */\n get hydrophobicityCells() {\n const seq = self.structureSequences?.[0]\n return seq\n ? mapResidueValuesToColumns(\n kyteDoolittleScores(stripStopCodon(seq)),\n this.structurePositionToAlignmentMap,\n )\n : []\n },\n /**\n * #getter\n */\n get pairwiseAlignmentToTranscriptPosition() {\n return this.coordinateMapper?.maps.alignmentToTranscriptPosition\n },\n /**\n * #getter\n */\n get pairwiseAlignmentToStructurePosition() {\n return this.coordinateMapper?.maps.alignmentToStructurePosition\n },\n /**\n * #getter\n */\n get hoverString() {\n const r = self.hoverPosition\n if (r === undefined) {\n return ''\n }\n const structureLetter = this.hoverStructureLetter\n const genomeLetter = this.hoverGenomeLetter\n const parts = []\n\n if (r.structureSeqPos !== undefined) {\n parts.push(`${r.structureSeqPos + 1}`)\n }\n\n if (structureLetter) {\n parts.push(`Structure: ${structureLetter}`)\n }\n\n if (genomeLetter && structureLetter && genomeLetter !== structureLetter) {\n parts.push(`Genome: ${genomeLetter}`)\n }\n\n if (r.chain) {\n parts.push(`Chain: ${r.chain}`)\n }\n\n return parts.join(', ')\n },\n /**\n * #getter\n */\n get genomeToTranscriptSeqMapping() {\n return self.feature\n ? genomeToTranscriptSeqMapping(new SimpleFeature(self.feature))\n : undefined\n },\n /**\n * #getter\n */\n get structureSeqHoverPos() {\n return self.hoverPosition?.structureSeqPos\n },\n\n /**\n * #getter\n */\n get alignmentHoverPos() {\n const pos = this.structureSeqHoverPos\n return pos === undefined\n ? undefined\n : this.coordinateMapper?.structureToAlignment(structurePos(pos))\n },\n\n /**\n * #getter\n * Structure-residue range from a feature-bar hover, derived by mapping\n * alignmentHoverRange through pairwiseAlignmentToStructurePosition.\n * End is exclusive, matching clickedStructureRange.\n */\n get hoverStructureRange() {\n const { alignmentHoverRange } = self\n const a2s = this.pairwiseAlignmentToStructurePosition\n if (!alignmentHoverRange || !a2s) {\n return undefined\n }\n const start = a2s[alignmentHoverRange.start]\n const end = a2s[alignmentHoverRange.end]\n return start === undefined || end === undefined\n ? undefined\n : { start, end: end + 1 }\n },\n\n /**\n * #getter\n * Persistent click selection in alignment coordinates, derived from\n * clickedStructureRange via structurePositionToAlignmentMap.\n */\n get clickAlignmentRange() {\n const range = self.clickedStructureRange\n const s2a = this.structurePositionToAlignmentMap\n if (!range || !s2a) {\n return undefined\n }\n const start = s2a[range.start]\n const end = s2a[range.end - 1]\n return start === undefined || end === undefined\n ? undefined\n : { start, end }\n },\n\n /**\n * #getter\n * Maps a structure-residue range to genome coordinates as a single\n * IRegion. Handles single-residue and multi-residue ranges.\n */\n structureRangeToGenomeHighlight(\n range: { start: number; end: number } | undefined,\n ): IRegion[] {\n const assemblyName = self.connectedView?.assemblyNames[0]\n const mapping = this.genomeToTranscriptSeqMapping\n if (!range || !assemblyName || !mapping) {\n return []\n }\n const model = {\n genomeToTranscriptSeqMapping: mapping,\n pairwiseAlignment: self.pairwiseAlignment,\n structureSeqToTranscriptSeqPosition:\n this.structureSeqToTranscriptSeqPosition,\n }\n const mapped =\n range.end > range.start + 1\n ? proteinRangeToGenomeMapping({\n model,\n structureSeqPos: range.start,\n structureSeqEndPos: range.end,\n })\n : proteinToGenomeMapping({ model, structureSeqPos: range.start })\n if (!mapped) {\n return []\n }\n const [start, end] = mapped\n return [{ assemblyName, refName: mapping.refName, start, end }]\n },\n\n /**\n * #getter\n * Genome regions to highlight in the LGV based on the current hover.\n * A feature-range hover (hoverStructureRange) takes priority over a\n * single-residue hover (structureSeqHoverPos). Excludes hovers that\n * originated from the genome view itself, so hovering the LGV doesn't\n * echo a codon-width highlight back onto that same view.\n */\n get hoverGenomeHighlights(): IRegion[] {\n if (self.hoverPosition?.source === 'genome') {\n return []\n }\n const range = this.hoverStructureRange\n if (range) {\n return this.structureRangeToGenomeHighlight(range)\n }\n const structureSeqPos = this.structureSeqHoverPos\n return structureSeqPos === undefined\n ? []\n : this.structureRangeToGenomeHighlight({\n start: structureSeqPos,\n end: structureSeqPos + 1,\n })\n },\n\n /**\n * #getter\n * Genome regions to highlight in the LGV from the persistent click\n * selection. Derived from clickedStructureRange.\n */\n get clickGenomeHighlights(): IRegion[] {\n return this.structureRangeToGenomeHighlight(self.clickedStructureRange)\n },\n\n /**\n * #getter\n * Returns the single-letter amino acid code from the structure at hover position\n */\n get hoverStructureLetter() {\n const code = self.hoverPosition?.code\n if (code) {\n return proteinAbbreviationMapping[code]?.singleLetterCode\n }\n const structurePos = this.structureSeqHoverPos\n if (structurePos !== undefined && self.structureSequences?.[0]) {\n return self.structureSequences[0][structurePos]\n }\n return undefined\n },\n\n /**\n * #getter\n * Returns the single-letter amino acid code from the genome/transcript at hover position\n */\n get hoverGenomeLetter() {\n const structurePos = this.structureSeqHoverPos\n if (structurePos === undefined) {\n return undefined\n }\n const transcriptPos =\n this.structureSeqToTranscriptSeqPosition?.[structurePos]\n if (transcriptPos === undefined) {\n return undefined\n }\n return self.userProvidedTranscriptSequence[transcriptPos]\n },\n\n /**\n * #getter\n */\n get alignmentMatchSet() {\n const con = self.pairwiseAlignment?.consensus\n if (!con) {\n return undefined\n }\n const matchSet = new Set<number>()\n for (let i = 0; i < con.length; i++) {\n if (con[i] === '|' || con[i] === ':') {\n matchSet.add(i)\n }\n }\n return matchSet\n },\n\n /**\n * #getter\n * True while a pairwise alignment can still be produced but hasn't been\n * computed yet (both the transcript and structure sequences are present).\n * A standalone structure with no connected transcript has no sequence to\n * align against, so this stays false \u2014 the header shows no loader rather\n * than a perpetual \"Loading pairwise alignment\".\n */\n get alignmentPending() {\n return (\n !self.pairwiseAlignment &&\n !!self.userProvidedTranscriptSequence &&\n !!self.structureSequences?.[0]\n )\n },\n\n /**\n * #getter\n */\n get exactMatch() {\n const r1 = stripStopCodon(self.userProvidedTranscriptSequence)\n const r2 = self.structureSequences?.[0]\n ? stripStopCodon(self.structureSequences[0])\n : undefined\n return r1 === r2\n },\n\n get parentView(): ParentProteinView {\n return getParent<ParentProteinView>(self, 2)\n },\n get zoomToBaseLevel(): boolean {\n return this.parentView.zoomToBaseLevel\n },\n get autoScrollAlignment(): boolean {\n return this.parentView.autoScrollAlignment\n },\n get showHighlight(): boolean {\n return this.parentView.showHighlight\n },\n get showProteinTracks(): boolean {\n return this.parentView.showProteinTracks\n },\n get trackHeight(): number {\n return this.parentView.compactTracks\n ? COMPACT_TRACK_HEIGHT\n : NORMAL_TRACK_HEIGHT\n },\n get trackGap(): number {\n return this.parentView.compactTracks\n ? COMPACT_TRACK_GAP\n : NORMAL_TRACK_GAP\n },\n get alignmentAlgorithm(): AlignmentAlgorithm {\n return coerceAlignmentAlgorithm(this.parentView.alignmentAlgorithm)\n },\n get molstarPluginContext(): PluginContext | undefined {\n return this.parentView.molstarPluginContext\n },\n /**\n * #getter\n * Returns this structure's index in the parent's structures array\n */\n get structureIndex() {\n return this.parentView.structures.indexOf(self)\n },\n /**\n * #getter\n * Returns the Molstar structure object for the current structure.\n * Note: We access loadedToMolstar to ensure MobX recomputes this getter\n * when the structure finishes loading (Molstar's internal state isn't observable).\n */\n get molstarStructure() {\n const idx = this.structureIndex\n return self.loadedToMolstar && idx >= 0\n ? this.molstarPluginContext?.managers.structure.hierarchy.current\n .structures[idx]?.cell.obj?.data\n : undefined\n },\n }))\n .actions(self => ({\n setError(e: unknown) {\n self.parentView.setError(e)\n },\n /**\n * #action\n */\n hoverAlignmentPosition(alignmentPos: number) {\n if (!self.alignmentHoverRange) {\n const structureSeqPos = self.coordinateMapper?.alignmentToStructure(\n alignmentCol(alignmentPos),\n )\n self.setHoveredPosition(\n structureSeqPos !== undefined ? { structureSeqPos } : undefined,\n )\n }\n },\n /**\n * #action\n */\n clickAlignmentPosition(alignmentPos: number) {\n const structureSeqPos = self.coordinateMapper?.alignmentToStructure(\n alignmentCol(alignmentPos),\n )\n self.setSelectedFeatureId(undefined)\n if (structureSeqPos !== undefined) {\n clickProteinToGenome({\n model: self,\n structureSeqPos,\n }).catch((e: unknown) => {\n console.error(e)\n self.parentView.setError(e)\n })\n } else {\n self.setClickedStructureRange(undefined)\n }\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(async () => {\n try {\n const {\n userProvidedTranscriptSequence,\n structureSequences,\n exactMatch,\n alignmentAlgorithm,\n } = self\n const seq1 = userProvidedTranscriptSequence\n const seq2 = structureSequences?.[0]\n\n if (self.pairwiseAlignment || !seq1 || !seq2) {\n return\n }\n const r1 = stripStopCodon(seq1)\n const r2 = stripStopCodon(seq2)\n if (exactMatch) {\n self.setAlignment({\n consensus: '|'.repeat(r1.length),\n alns: [\n { id: 'seq1', seq: r1 },\n { id: 'seq2', seq: r2 },\n ],\n })\n } else {\n const pairwiseAlignment = runLocalAlignment(\n r1,\n r2,\n alignmentAlgorithm,\n )\n self.setAlignment(pairwiseAlignment)\n self.parentView.setShowAlignment(true)\n }\n } catch (e) {\n console.error(e)\n self.parentView.setError(e)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(() => {\n const { hovered } = getSession(self)\n const {\n transcriptSeqToStructureSeqPosition,\n genomeToTranscriptSeqMapping,\n connectedView,\n } = self\n if (\n connectedView?.initialized &&\n genomeToTranscriptSeqMapping &&\n checkHovered(hovered)\n ) {\n const { hoverPosition } = hovered\n const pos =\n genomeToTranscriptSeqMapping.g2p[hoverPosition.coord - 1]\n const c0 =\n pos === undefined\n ? undefined\n : transcriptSeqToStructureSeqPosition?.[pos]\n self.setGenomeHoveredPosition(c0)\n } else if (self.hoverPosition?.source === 'genome') {\n self.setGenomeHoveredPosition(undefined)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const { molstarPluginContext } = self\n if (molstarPluginContext) {\n const dispose = await subscribeMolstarInteraction({\n plugin: molstarPluginContext,\n kind: 'click',\n onUpdate: info => {\n // Click only acts on positive matches; ignore clicks that\n // didn't land on a structure element.\n if (!info) {\n return\n }\n self.setHoveredPosition(info)\n self.setSelectedFeatureId(undefined)\n clickProteinToGenome({\n model: self,\n structureSeqPos: info.structureSeqPos,\n }).catch((e: unknown) => {\n console.error(e)\n self.parentView.setError(e)\n })\n },\n })\n addDisposer(self, dispose)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const { molstarPluginContext } = self\n if (molstarPluginContext) {\n const dispose = await subscribeMolstarInteraction({\n plugin: molstarPluginContext,\n kind: 'hover',\n onUpdate: info => {\n self.setHoveredPosition(info)\n },\n })\n addDisposer(self, dispose)\n }\n }),\n )\n\n addDisposer(\n self,\n autorun(async () => {\n const {\n showHighlight,\n structureSeqToTranscriptSeqPosition,\n molstarPluginContext,\n molstarStructure,\n } = self\n if (\n molstarStructure &&\n molstarPluginContext &&\n structureSeqToTranscriptSeqPosition\n ) {\n if (showHighlight) {\n const residues = Object.keys(\n structureSeqToTranscriptSeqPosition,\n ).map(coord => +coord + 1)\n await applyLociInteractivityMultiple({\n structure: molstarStructure,\n residues,\n plugin: molstarPluginContext,\n mode: 'select',\n })\n } else {\n molstarPluginContext.managers.interactivity.lociSelects.deselectAll()\n }\n }\n }),\n )\n\n // Drive molstar hover-highlight state from the model. A feature-range\n // hover (hoverStructureRange) takes priority over a single-residue\n // hover (structureSeqHoverPos); otherwise clear.\n addDisposer(\n self,\n autorun(async () => {\n const {\n molstarStructure,\n molstarPluginContext,\n hoverStructureRange,\n structureSeqHoverPos,\n } = self\n if (molstarStructure && molstarPluginContext) {\n if (hoverStructureRange) {\n await highlightResidueRange({\n structure: molstarStructure,\n plugin: molstarPluginContext,\n startResidue: hoverStructureRange.start + 1,\n endResidue: hoverStructureRange.end,\n })\n } else if (structureSeqHoverPos !== undefined) {\n await applyLociInteractivitySingle({\n structure: molstarStructure,\n plugin: molstarPluginContext,\n selectedResidue: structureSeqHoverPos,\n mode: 'highlight',\n })\n } else {\n molstarPluginContext.managers.interactivity.lociHighlights.clearHighlights()\n }\n }\n }),\n )\n },\n }))\n\nexport default Structure\n\nexport type JBrowsePluginProteinStructureStateModel = typeof Structure\nexport type JBrowsePluginProteinStructureModel =\n Instance<JBrowsePluginProteinStructureStateModel>\n", "import {\n structurePositionToAlignmentMap,\n structureSeqVsTranscriptSeqMap,\n transcriptPositionToAlignmentMap,\n} from '../mappings'\nimport { invertMap } from './util'\n\nimport type { PairwiseAlignment } from '../mappings'\n\n/**\n * Branded coordinate spaces. Every position in this plugin is a bare `number`,\n * but the *meaning* differs: a structure residue index is not interchangeable\n * with a transcript residue index or an alignment column, and mixing them is\n * the root cause of the off-by-one class of bugs. Branding makes the compiler\n * reject cross-space mixing; construct values with the helpers below at the\n * boundaries where raw numbers enter (molstar picks, hover events, features).\n *\n * Conventions: all are 0-based. StructurePos indexes the ungapped structure\n * sequence; TranscriptPos the ungapped transcript sequence; AlignmentCol a\n * column of the pairwise alignment (gaps included).\n */\ntype Branded<B extends string> = number & { readonly __brand: B }\nexport type StructurePos = Branded<'StructurePos'>\nexport type TranscriptPos = Branded<'TranscriptPos'>\nexport type AlignmentCol = Branded<'AlignmentCol'>\n\nexport const structurePos = (n: number) => n as StructurePos\nexport const transcriptPos = (n: number) => n as TranscriptPos\nexport const alignmentCol = (n: number) => n as AlignmentCol\n\nexport interface CoordinateMaps {\n structureSeqToTranscriptSeqPosition: Record<number, number>\n transcriptSeqToStructureSeqPosition: Record<number, number>\n structurePositionToAlignmentMap: Record<number, number>\n transcriptPositionToAlignmentMap: Record<number, number>\n alignmentToStructurePosition: Record<number, number>\n alignmentToTranscriptPosition: Record<number, number>\n}\n\nexport interface CoordinateMapper {\n structureToTranscript: (p: StructurePos) => TranscriptPos | undefined\n transcriptToStructure: (p: TranscriptPos) => StructurePos | undefined\n structureToAlignment: (p: StructurePos) => AlignmentCol | undefined\n alignmentToStructure: (c: AlignmentCol) => StructurePos | undefined\n transcriptToAlignment: (p: TranscriptPos) => AlignmentCol | undefined\n alignmentToTranscript: (c: AlignmentCol) => TranscriptPos | undefined\n /**\n * Raw lookup tables, for consumers that iterate the whole map rather than\n * convert a single position (e.g. per-residue track rendering, selection of\n * all aligned residues). Plain numbers \u2014 prefer the typed methods above for\n * point conversions.\n */\n readonly maps: CoordinateMaps\n}\n\n/**\n * Builds every coordinate conversion once from a pairwise alignment, replacing\n * the scatter of per-getter map builds + repeated invertMap calls. The branded\n * methods are the preferred API; `maps` stays unbranded for whole-map consumers.\n */\nexport function makeCoordinateMapper(\n pairwiseAlignment: PairwiseAlignment,\n): CoordinateMapper {\n const {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n } = structureSeqVsTranscriptSeqMap(pairwiseAlignment)\n const s2aln = structurePositionToAlignmentMap(pairwiseAlignment)\n const t2aln = transcriptPositionToAlignmentMap(pairwiseAlignment)\n const aln2s = invertMap(s2aln)\n const aln2t = invertMap(t2aln)\n\n // The `as` casts below are the single brand-crossing point: indexing a\n // Record<number,number> yields a plain number that we re-brand to its output\n // space. Isolated here so the rest of the codebase stays brand-clean.\n return {\n structureToTranscript: p =>\n structureSeqToTranscriptSeqPosition[p] as TranscriptPos | undefined,\n transcriptToStructure: p =>\n transcriptSeqToStructureSeqPosition[p] as StructurePos | undefined,\n structureToAlignment: p => s2aln[p] as AlignmentCol | undefined,\n alignmentToStructure: c => aln2s[c] as StructurePos | undefined,\n transcriptToAlignment: p => t2aln[p] as AlignmentCol | undefined,\n alignmentToTranscript: c => aln2t[c] as TranscriptPos | undefined,\n maps: {\n structureSeqToTranscriptSeqPosition,\n transcriptSeqToStructureSeqPosition,\n structurePositionToAlignmentMap: s2aln,\n transcriptPositionToAlignmentMap: t2aln,\n alignmentToStructurePosition: aln2s,\n alignmentToTranscriptPosition: aln2t,\n },\n }\n}\n", "/* eslint-disable @typescript-eslint/no-confusing-non-null-assertion */\nimport type { PairwiseAlignment } from '../mappings'\nimport type { AlignmentAlgorithm } from './types'\n\n// BLOSUM62 scoring matrix \u2014 standard 20 amino acids + B, Z, X, *\n// prettier-ignore\nconst AMINO_ACIDS = ['A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V','B','Z','X','*']\n// prettier-ignore\nconst BLOSUM62_RAW = [\n// A R N D C Q E G H I L K M F P S T W Y V B Z X *\n [ 4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4], // A\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4], // R\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4], // N\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4], // D\n [ 0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4], // C\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4], // Q\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4], // E\n [ 0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4], // G\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4], // H\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4], // I\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4], // L\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4], // K\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4], // M\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4], // F\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4], // P\n [ 1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4], // S\n [ 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4], // T\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4], // W\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4], // Y\n [ 0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4], // V\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4], // B\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4], // Z\n [ 0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4], // X\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1], // *\n]\n\nconst BLOSUM62: Record<string, Record<string, number>> = {}\nfor (let i = 0; i < AMINO_ACIDS.length; i++) {\n const row: Record<string, number> = {}\n for (let j = 0; j < AMINO_ACIDS.length; j++) {\n row[AMINO_ACIDS[j]!] = BLOSUM62_RAW[i]![j]!\n }\n BLOSUM62[AMINO_ACIDS[i]!] = row\n}\n\nfunction getScore(a: string, b: string) {\n return BLOSUM62[a.toUpperCase()]?.[b.toUpperCase()] ?? -4\n}\n\n// Default gap penalties (matching EMBOSS defaults)\nconst GAP_OPEN = -10\nconst GAP_EXTEND = -0.5\n\ninterface AlignmentResult {\n alignedSeq1: string\n alignedSeq2: string\n score: number\n}\n\n/**\n * Needleman-Wunsch global alignment algorithm\n * Aligns entire sequences end-to-end\n */\nexport function needlemanWunsch(\n seq1: string,\n seq2: string,\n gapOpen = GAP_OPEN,\n gapExtend = GAP_EXTEND,\n): AlignmentResult {\n const m = seq1.length\n const n = seq2.length\n\n // Score matrices\n const M: number[][] = [] // match/mismatch\n const Ix: number[][] = [] // gap in seq2 (insertion in seq1)\n const Iy: number[][] = [] // gap in seq1 (insertion in seq2)\n\n // Initialize matrices\n for (let i = 0; i <= m; i++) {\n M[i] = []\n Ix[i] = []\n Iy[i] = []\n for (let j = 0; j <= n; j++) {\n M[i]![j] = -Infinity\n Ix[i]![j] = -Infinity\n Iy[i]![j] = -Infinity\n }\n }\n\n // Base cases\n M[0]![0] = 0\n for (let i = 1; i <= m; i++) {\n Ix[i]![0] = gapOpen + (i - 1) * gapExtend\n }\n for (let j = 1; j <= n; j++) {\n Iy[0]![j] = gapOpen + (j - 1) * gapExtend\n }\n\n // Fill matrices\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n\n // M[i][j]: best score ending with match/mismatch\n M[i]![j] =\n Math.max(M[i - 1]![j - 1]!, Ix[i - 1]![j - 1]!, Iy[i - 1]![j - 1]!) +\n matchScore\n\n // Ix[i][j]: best score ending with gap in seq2\n Ix[i]![j] = Math.max(M[i - 1]![j]! + gapOpen, Ix[i - 1]![j]! + gapExtend)\n\n // Iy[i][j]: best score ending with gap in seq1\n Iy[i]![j] = Math.max(M[i]![j - 1]! + gapOpen, Iy[i]![j - 1]! + gapExtend)\n }\n }\n\n // Traceback\n let alignedSeq1 = ''\n let alignedSeq2 = ''\n let i = m\n let j = n\n\n // Find which matrix has the best final score\n const finalScores = [M[m]![n]!, Ix[m]![n]!, Iy[m]![n]!]\n const score = Math.max(...finalScores)\n let currentMatrix: 'M' | 'Ix' | 'Iy' =\n score === M[m]![n]! ? 'M' : score === Ix[m]![n]! ? 'Ix' : 'Iy'\n\n while (i > 0 || j > 0) {\n if (currentMatrix === 'M' && i > 0 && j > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n const prevM = M[i - 1]![j - 1]!\n const prevIx = Ix[i - 1]![j - 1]!\n\n if (M[i]![j]! === prevM + matchScore) {\n currentMatrix = 'M'\n } else if (M[i]![j]! === prevIx + matchScore) {\n currentMatrix = 'Ix'\n } else {\n currentMatrix = 'Iy'\n }\n i--\n j--\n } else if (currentMatrix === 'Ix' && i > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n\n currentMatrix = Ix[i]![j]! === M[i - 1]![j]! + gapOpen ? 'M' : 'Ix'\n i--\n } else if (j > 0) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n currentMatrix = Iy[i]![j]! === M[i]![j - 1]! + gapOpen ? 'M' : 'Iy'\n j--\n } else {\n break\n }\n }\n\n return { alignedSeq1, alignedSeq2, score }\n}\n\n/**\n * Smith-Waterman local alignment algorithm\n * Finds the best local alignment between subsequences\n */\nexport function smithWaterman(\n seq1: string,\n seq2: string,\n gapOpen = GAP_OPEN,\n gapExtend = GAP_EXTEND,\n): AlignmentResult {\n const m = seq1.length\n const n = seq2.length\n\n // Score matrices\n const M: number[][] = []\n const Ix: number[][] = []\n const Iy: number[][] = []\n\n // Track best score position\n let bestScore = 0\n let bestI = 0\n let bestJ = 0\n\n // Initialize matrices\n for (let i = 0; i <= m; i++) {\n M[i] = []\n Ix[i] = []\n Iy[i] = []\n for (let j = 0; j <= n; j++) {\n M[i]![j] = 0\n Ix[i]![j] = -Infinity\n Iy[i]![j] = -Infinity\n }\n }\n\n // Fill matrices\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n\n // M[i][j]: best score ending with match/mismatch (or 0 to restart)\n M[i]![j] = Math.max(\n 0,\n M[i - 1]![j - 1]! + matchScore,\n Ix[i - 1]![j - 1]! + matchScore,\n Iy[i - 1]![j - 1]! + matchScore,\n )\n\n // Ix[i][j]: best score ending with gap in seq2\n Ix[i]![j] = Math.max(M[i - 1]![j]! + gapOpen, Ix[i - 1]![j]! + gapExtend)\n\n // Iy[i][j]: best score ending with gap in seq1\n Iy[i]![j] = Math.max(M[i]![j - 1]! + gapOpen, Iy[i]![j - 1]! + gapExtend)\n\n // Track best score\n const cellMax = Math.max(M[i]![j]!, Ix[i]![j]!, Iy[i]![j]!)\n if (cellMax > bestScore) {\n bestScore = cellMax\n bestI = i\n bestJ = j\n }\n }\n }\n\n // Traceback from best score position\n let alignedSeq1 = ''\n let alignedSeq2 = ''\n let i = bestI\n let j = bestJ\n\n // Determine starting matrix\n let currentMatrix: 'M' | 'Ix' | 'Iy' =\n M[i]![j]! >= Ix[i]![j]! && M[i]![j]! >= Iy[i]![j]!\n ? 'M'\n : Ix[i]![j]! >= Iy[i]![j]!\n ? 'Ix'\n : 'Iy'\n\n // Add trailing gaps for positions after local alignment\n for (let k = seq1.length; k > bestI; k--) {\n alignedSeq1 = seq1[k - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n }\n for (let k = seq2.length; k > bestJ; k--) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[k - 1] + alignedSeq2\n }\n\n while (i > 0 && j > 0) {\n if (currentMatrix === 'M') {\n if (M[i]![j]! === 0) {\n break\n }\n\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n const matchScore = getScore(seq1[i - 1]!, seq2[j - 1]!)\n const prevM = M[i - 1]![j - 1]!\n const prevIx = Ix[i - 1]![j - 1]!\n\n if (M[i]![j]! === prevM + matchScore) {\n currentMatrix = 'M'\n } else if (M[i]![j]! === prevIx + matchScore) {\n currentMatrix = 'Ix'\n } else {\n currentMatrix = 'Iy'\n }\n i--\n j--\n } else if (currentMatrix === 'Ix') {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n\n if (Ix[i]![j]! === M[i - 1]![j]! + gapOpen) {\n currentMatrix = 'M'\n }\n i--\n } else {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n\n if (Iy[i]![j]! === M[i]![j - 1]! + gapOpen) {\n currentMatrix = 'M'\n }\n j--\n }\n }\n\n // Add leading gaps for positions before local alignment\n while (i > 0) {\n alignedSeq1 = seq1[i - 1] + alignedSeq1\n alignedSeq2 = '-' + alignedSeq2\n i--\n }\n while (j > 0) {\n alignedSeq1 = '-' + alignedSeq1\n alignedSeq2 = seq2[j - 1] + alignedSeq2\n j--\n }\n\n return { alignedSeq1, alignedSeq2, score: bestScore }\n}\n\nfunction buildConsensus(alignedSeq1: string, alignedSeq2: string) {\n const chars: string[] = []\n for (let i = 0; i < alignedSeq1.length; i++) {\n const a = alignedSeq1[i]!\n const b = alignedSeq2[i]!\n if (a !== '-' && b !== '-' && a.toUpperCase() === b.toUpperCase()) {\n chars.push('|')\n } else if (a !== '-' && b !== '-' && getScore(a, b) > 0) {\n chars.push(':')\n } else {\n chars.push(' ')\n }\n }\n return chars.join('')\n}\n\nexport function runLocalAlignment(\n seq1: string,\n seq2: string,\n algorithm: AlignmentAlgorithm,\n): PairwiseAlignment {\n const { alignedSeq1, alignedSeq2 } =\n algorithm === 'smith_waterman'\n ? smithWaterman(seq1, seq2)\n : needlemanWunsch(seq1, seq2)\n\n return {\n consensus: buildConsensus(alignedSeq1, alignedSeq2),\n alns: [\n { id: 'a', seq: alignedSeq1 },\n { id: 'b', seq: alignedSeq2 },\n ],\n }\n}\n", "export const proteinAbbreviationMapping = Object.fromEntries(\n [\n { name: 'alanine', abbreviation: 'Ala', singleLetterCode: 'A' },\n { name: 'arginine', abbreviation: 'Arg', singleLetterCode: 'R' },\n { name: 'asparagine', abbreviation: 'Asn', singleLetterCode: 'N' },\n { name: 'aspartic acid', abbreviation: 'Asp', singleLetterCode: 'D' },\n { name: 'cysteine', abbreviation: 'Cys', singleLetterCode: 'C' },\n { name: 'glutamic acid', abbreviation: 'Glu', singleLetterCode: 'E' },\n { name: 'glutamine', abbreviation: 'Gln', singleLetterCode: 'Q' },\n { name: 'glycine', abbreviation: 'Gly', singleLetterCode: 'G' },\n { name: 'histidine', abbreviation: 'His', singleLetterCode: 'H' },\n { name: 'isoleucine', abbreviation: 'Ile', singleLetterCode: 'I' },\n { name: 'leucine', abbreviation: 'Leu', singleLetterCode: 'L' },\n { name: 'lysine', abbreviation: 'Lys', singleLetterCode: 'K' },\n { name: 'methionine', abbreviation: 'Met', singleLetterCode: 'M' },\n { name: 'phenylalanine', abbreviation: 'Phe', singleLetterCode: 'F' },\n { name: 'proline', abbreviation: 'Pro', singleLetterCode: 'P' },\n { name: 'serine', abbreviation: 'Ser', singleLetterCode: 'S' },\n { name: 'threonine', abbreviation: 'Thr', singleLetterCode: 'T' },\n { name: 'tryptophan', abbreviation: 'Trp', singleLetterCode: 'W' },\n { name: 'tyrosine', abbreviation: 'Tyr', singleLetterCode: 'Y' },\n { name: 'valine', abbreviation: 'Val', singleLetterCode: 'V' },\n ].map(r => [r.abbreviation.toUpperCase(), r]),\n)\n", "import loadMolstar from './loadMolstar'\n\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\n\nexport interface MolstarLocationInfo {\n structureSeqPos: number\n code: string\n chain: string\n}\n\nfunction extractLocationInfo(\n molstar: Awaited<ReturnType<typeof loadMolstar>>,\n location: ReturnType<\n (typeof molstar.StructureElement.Loci)['getFirstLocation']\n > &\n object,\n): MolstarLocationInfo {\n return {\n structureSeqPos:\n molstar.StructureProperties.residue.auth_seq_id(location) - 1,\n code: molstar.StructureProperties.atom.label_comp_id(location),\n chain: molstar.StructureProperties.chain.auth_asym_id(location),\n }\n}\n\n/**\n * Subscribe to molstar's click/hover behavior with the location-extraction\n * boilerplate factored out. The handler receives extracted location info when\n * the cursor is over a structure element, or `undefined` otherwise (so e.g.\n * hover handlers can clear state when the cursor leaves).\n *\n * Returns a cleanup function suitable for use with mobx's addDisposer.\n */\nexport default async function subscribeMolstarInteraction({\n plugin,\n kind,\n onUpdate,\n}: {\n plugin: PluginContext\n kind: 'click' | 'hover'\n onUpdate: (info: MolstarLocationInfo | undefined) => void\n}): Promise<() => void> {\n const molstar = await loadMolstar()\n const subscription = plugin.behaviors.interaction[kind].subscribe(e => {\n if (molstar.StructureElement.Loci.is(e.current.loci)) {\n const loc = molstar.StructureElement.Loci.getFirstLocation(e.current.loci)\n onUpdate(loc ? extractLocationInfo(molstar, loc) : undefined)\n } else {\n onUpdate(undefined)\n }\n })\n return () => {\n subscription.unsubscribe()\n }\n}\n", "import loadMolstar from './loadMolstar'\n\nimport type { Mat4 } from 'molstar/lib/mol-math/linear-algebra'\nimport type { StructureElement } from 'molstar/lib/mol-model/structure'\nimport type { PluginContext } from 'molstar/lib/mol-plugin/context'\nimport type { StateObjectRef } from 'molstar/lib/mol-state'\n\nconst SuperpositionTag = 'SuperpositionTransform'\n\nexport async function superposeStructures(plugin: PluginContext) {\n const {\n QueryContext,\n StructureElement,\n StructureSelection,\n StructureSelectionQueries,\n PluginCommands,\n PluginStateObject,\n tmAlign,\n } = await loadMolstar()\n\n const structures = plugin.managers.structure.hierarchy.current.structures\n if (structures.length < 2) {\n return\n }\n\n const { query } = StructureSelectionQueries.trace\n\n const locis = structures.map(s => {\n const structure = s.cell.obj?.data\n if (!structure) {\n return undefined\n }\n const parent = plugin.helpers.substructureParent.get(structure)\n if (!parent) {\n return undefined\n }\n const rootStructure = plugin.state.data.selectQ(q =>\n q.byValue(parent).rootOfType(PluginStateObject.Molecule.Structure),\n )[0]?.obj?.data\n if (!rootStructure) {\n return undefined\n }\n const loci = StructureSelection.toLociWithSourceUnits(\n query(new QueryContext(structure)),\n )\n return StructureElement.Loci.remap(loci, rootStructure)\n })\n\n const validLocis = locis.filter(\n (l): l is StructureElement.Loci => l !== undefined,\n )\n if (validLocis.length < 2) {\n return\n }\n\n const pivot = plugin.managers.structure.hierarchy.findStructure(\n validLocis[0]?.structure,\n )\n const coordinateSystem = pivot?.transform?.cell.obj?.data.coordinateSystem\n\n for (let i = 1; i < validLocis.length; i++) {\n const result = tmAlign(validLocis[0]!, validLocis[i]!)\n const { bTransform, tmScoreA, tmScoreB, rmsd, alignedLength } = result\n await applyTransform(\n plugin,\n structures[i]!.cell,\n bTransform,\n coordinateSystem,\n )\n plugin.log.info(\n `TM-align: TM-score=${tmScoreA.toFixed(4)}/${tmScoreB.toFixed(4)}, RMSD=${rmsd.toFixed(2)} \u00C5, aligned ${alignedLength} residues.`,\n )\n }\n\n await new Promise(res => requestAnimationFrame(res))\n await PluginCommands.Camera.Reset(plugin)\n}\n\nasync function applyTransform(\n plugin: PluginContext,\n s: StateObjectRef,\n matrix: Mat4,\n coordinateSystem: { matrix: Mat4 } | undefined,\n) {\n const { Mat4, StateObjectRef, StateTransforms } = await loadMolstar()\n const r = StateObjectRef.resolveAndCheck(plugin.state.data, s)\n if (!r) {\n return\n }\n\n const o = plugin.state.data.selectQ(q =>\n q\n .byRef(r.transform.ref)\n .subtree()\n .withTransformer(StateTransforms.Model.TransformStructureConformation),\n )[0]\n\n const finalTransform =\n coordinateSystem && !Mat4.isIdentity(coordinateSystem.matrix)\n ? Mat4.mul(Mat4(), coordinateSystem.matrix, matrix)\n : matrix\n\n const params = {\n transform: {\n name: 'matrix' as const,\n params: { data: finalTransform, transpose: false },\n },\n }\n\n const b = o\n ? plugin.state.data.build().to(o).update(params)\n : plugin.state.data\n .build()\n .to(s)\n .insert(StateTransforms.Model.TransformStructureConformation, params, {\n tags: SuperpositionTag,\n })\n\n await plugin.runTask(plugin.state.data.updateTree(b))\n}\n", "import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nimport type PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function UniProtVariationAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'UniProtVariationAdapter',\n displayName: 'UniProtVariation adapter',\n configSchema,\n getAdapterClass: () =>\n import('./UniProtVariationAdapter').then(r => r.default),\n }),\n )\n}\n", "import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport type { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #config UniProtVariationAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst UniProtVariationAdapter: AnyConfigurationSchemaType = ConfigurationSchema(\n 'UniProtVariationAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },\n },\n scoreField: {\n type: 'string',\n defaultValue: '',\n },\n },\n { explicitlyTyped: true },\n)\nexport default UniProtVariationAdapter\n", "export const version = '0.4.13'\n"],
|
|
5
|
+
"mappings": "4sBAAA,IAAAA,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,sBAAsB,ICAtD,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,QCAhC,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,YAAY,ICA5C,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,oBAAoB,ICApD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,eAAe,ICMxB,SAARC,IAA+B,CACpC,OAAKC,KACHA,GAAS,OAAOC,GAAO,oBAAoB,MAAM,SAAS,EAAG,CAC3D,MAAAD,GAAS,OACH,CACR,CAAC,GAEIA,EACT,CAdR,IACYE,GAGAD,GACAD,GALZG,GAAAC,EAAA,kBACYF,GAAM,OAAO,SAAa,IAC1B,SAAS,eAAe,IACxB,OACAD,GAAOC,GAAMA,GAAI,QAAQ,WAAY,GAAG,EAAI,KCOjD,SAASG,GAAaC,EAA2C,CACtE,MACE,CAAC,CAACA,GACF,OAAOA,GAAY,UACnB,kBAAmBA,GACnB,CAAC,CAACA,EAAQ,eACV,OAAOA,EAAQ,eAAkB,UACjC,UAAWA,EAAQ,eACnB,YAAaA,EAAQ,aAEzB,CAEA,eAAsBC,GAA6B,CACjD,UAAAC,EACA,gBAAAC,CACF,EAGG,CACD,GAAM,CAAE,OAAAC,CAAO,EAAI,MAAMC,GAAY,EACrC,OAAOD,EAAO,sBACZE,GACEA,EAAE,OAAO,UAAU,WAAW,CAC5B,eAAgBA,EAAE,KAAK,IAAI,GAAG,CAC5BA,EAAE,OAAO,aAAa,eAAe,aAAa,EAClDH,CACF,CAAC,EACD,WAAYG,EAAE,OAAO,aAAa,eAAe,WAAW,CAC9D,CAAC,EACHJ,CACF,CACF,CAEO,SAASK,GAAUC,EAAqD,CAC7E,OAAO,OAAO,YAAY,OAAO,QAAQA,CAAG,EAAE,IAAI,CAAC,CAACC,EAAGC,CAAC,IAAM,CAACA,EAAG,CAACD,CAAC,CAAC,CAAC,CACxE,CA9CA,IAAAE,GAAAC,EAAA,kBAAAC,OCUM,SAAUC,GAA6BC,EAAa,CACxD,IAAMC,EAASD,EAAQ,OACjBE,EAAUF,EAAQ,QAExB,GAAIC,IAAW,IAAMA,IAAW,EAC9B,MAAM,IAAI,MAAM,yBAAyBA,CAAM,qBAAqB,EAEtE,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,qBAAqB,EAIvC,IAAMC,EAAY,IAAI,IACtB,QAAWC,KAAKJ,EAAQ,aAAe,CAAA,EACrC,GAAII,EAAE,OAAS,OAASA,EAAE,MAAQA,EAAE,IAAK,CACvC,IAAMC,EAAM,GAAGD,EAAE,KAAK,IAAIA,EAAE,GAAG,GAC1BD,EAAU,IAAIE,CAAG,GACpBF,EAAU,IAAIE,EAAKD,CAAC,CAExB,CAEF,IAAME,EAAM,CAAC,GAAGH,EAAU,OAAM,CAAE,EAAE,KAClC,CAAC,EAAGI,IAAMN,GAAU,EAAE,MAAQM,EAAE,MAAM,EAGlCC,EAA8B,CAAA,EAC9BC,EAA8B,CAAA,EAC9BC,EAAqC,CAAA,EAE3C,GAAIJ,EAAI,SAAW,EAAG,CAKpB,IAAIK,GAAkB,GADHL,EAAI,CAAC,GAAG,OAAS,IACI,EACpCM,EAAiB,GAErB,QAAWR,KAAKE,EAAK,CACnB,IAAMO,EAAST,EAAE,IAAMA,EAAE,MACzB,QAASU,EAAI,EAAGA,EAAID,EAAQC,IAAK,CAC/B,IAAMC,EAAYd,IAAW,EAAIG,EAAE,MAAQU,EAAIV,EAAE,IAAM,EAAIU,EACrDE,EAAa,KAAK,MAAML,IAAmB,CAAC,EAClDH,EAAIO,CAAS,EAAIC,EACbA,IAAeJ,GACjBH,EAAIO,CAAU,EAAID,EAClBL,EAASM,CAAU,EAAI,CAACD,CAAS,EACjCH,EAAiBI,GAEjBN,EAASM,CAAU,EAAG,KAAKD,CAAS,CAExC,CACF,CACF,CAEA,MAAO,CAAE,IAAAP,EAAK,IAAAC,EAAK,SAAAC,EAAU,QAAAR,EAAS,OAAAD,CAAM,CAC9C,CAaM,SAAUgB,GACdR,EACAO,EACAf,EAAc,CAEd,IAAMc,EAAYN,EAAIO,CAAU,EAChC,GAAID,IAAc,OAChB,OAAId,IAAW,EACN,CAACc,EAAWA,EAAY,CAAC,EAEzB,CAACA,EAAY,EAAGA,EAAY,CAAC,CAI1C,CAlFA,IAAAG,GAAAC,EAAA,QCVA,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,OCYzB,SAASC,GACdC,EACA,CACA,IAAMC,EAAeD,EAAkB,KAAK,CAAC,EAAE,IACzCE,EAAgBF,EAAkB,KAAK,CAAC,EAAE,IAChD,GAAIC,EAAa,SAAWC,EAAc,OACxC,MAAM,IAAI,MAAM,mBAAmB,EAGrC,IAAIC,EAAI,EACJC,EAAI,EACFC,EAA8D,CAAC,EAC/DC,EAA8D,CAAC,EAErE,QAASC,EAAI,EAAGA,EAAIN,EAAa,OAAQM,IAAK,CAC5C,IAAMC,EAAKP,EAAaM,CAAC,EACdL,EAAcK,CAAC,IAEf,IACTJ,IACSK,IAAO,IAChBJ,KAEAC,EAAoCF,CAAC,EAAIC,EACzCE,EAAoCF,CAAC,EAAID,EACzCC,IACAD,IAEJ,CAEA,MAAO,CACL,oCAAAE,EACA,oCAAAC,CACF,CACF,CAEA,SAASG,GAA0BC,EAAa,CAC9C,IAAMC,EAA8B,CAAC,EACrC,QAASJ,EAAI,EAAGJ,EAAI,EAAGI,EAAIG,EAAI,OAAQH,IACjCG,EAAIH,CAAC,IAAM,MACbI,EAAIR,CAAC,EAAII,EACTJ,KAGJ,OAAOQ,CACT,CAEO,SAASC,GACdZ,EACA,CACA,OAAOS,GAA0BT,EAAkB,KAAK,CAAC,EAAE,GAAG,CAChE,CAEO,SAASa,GACdb,EACA,CACA,OAAOS,GAA0BT,EAAkB,KAAK,CAAC,EAAE,GAAG,CAChE,CAGO,SAASc,GAA6BC,EAAkB,CAC7D,OAAOD,GAAIC,EAAQ,OAAO,CAAC,CAC7B,CA1EA,IAAAC,GAAAC,EAAA,kBAAAC,OCAA,IAAAC,GAEAC,GAwBMC,GA8EOC,GAxGbC,GAAAC,EAAA,kBAAAL,GAA8B,QAC9BM,KACAL,GAA6D,QAE7DM,KAsBML,GAAN,KAA4B,CAC1B,MAAQ,cAAW,IAA+B,EAElD,aAAc,IACZ,mBAAe,KAAM,CACnB,SAAU,UACV,WAAY,UACZ,kBAAmB,UACnB,QAAS,WACX,CAAC,CACH,CAEA,SAASM,EAAyB,CAChC,KAAK,MAAM,IAAIA,EAAK,OAAQA,CAAI,CAClC,CAEA,WAAWC,EAAgB,CACzB,KAAK,MAAM,OAAOA,CAAM,CAC1B,CAEA,kBAAkBC,EAA2B,CAC3C,IAAMC,EAAgB,IAAI,IAAID,EAAQ,MAAM,IAAIE,GAAKA,EAAE,EAAE,CAAC,EAC1D,QAAWH,KAAU,KAAK,MAAM,KAAK,EAC9BE,EAAc,IAAIF,CAAM,GAC3B,KAAK,MAAM,OAAOA,CAAM,CAG9B,CAEA,IAAIA,EAAgB,CAClB,OAAO,KAAK,MAAM,IAAIA,CAAM,CAC9B,CAEA,eAAeI,EAAmBH,EAA4B,CACxDA,GACF,KAAK,kBAAkBA,CAAO,EAEhC,QAAWF,KAAQ,KAAK,MAAM,OAAO,EACnC,GAAIA,EAAK,YAAcK,EACrB,OAAOL,CAIb,CAEA,IAAI,SAAU,CACZ,MAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAChC,CAEA,qCACEK,EACAC,EACAJ,EAC6D,CAC7D,IAAMF,EAAO,KAAK,eAAeK,EAAWH,CAAO,EACnD,GAAI,CAACF,EACH,OAGF,IAAMO,EAAU,IAAI,iBAAcP,EAAK,OAAO,EACxCQ,EAAUC,GAA6BF,CAAO,EAGpD,GAAI,CAACC,EACH,OAGF,GAAM,CAAE,IAAAE,EAAK,OAAAC,EAAQ,QAAAC,CAAQ,EAAIJ,EAC3BK,EAASC,GAAcJ,EAAKJ,EAAYK,CAAM,EACpD,GAAI,CAACE,EACH,OAGF,GAAM,CAACE,EAAOC,CAAG,EAAIH,EACrB,MAAO,CAAE,QAAAD,EAAS,MAAAG,EAAO,IAAAC,CAAI,CAC/B,CACF,EAEarB,GAAwB,IAAID,KCtGlC,SAASuB,GAAeC,EAAa,CAC1C,OAAOA,EAAI,WAAW,IAAK,EAAE,CAC/B,CAEO,SAASC,GAAsBC,EAAkB,CAMtD,IAAMC,GAHcD,EAAQ,IAAI,aAAa,GAAK,CAAC,GAGnB,OAC7BE,GAAeA,EAAE,IAAI,MAAM,IAAM,QAAUA,EAAE,IAAI,MAAM,IAAM,YAChE,EACA,OAAID,EAAY,OAAS,EAChBA,EAKF,CAACD,CAAO,CACjB,CAEO,SAASG,GAAqBC,EAAY,CAC/C,OAAOA,GAAG,QAAQ,YAAa,EAAE,CACnC,CAEO,SAASC,GAAMC,EAAuB,CAC3C,OAAOA,IAAQ,OAAY,GAAKA,EAAI,GAAG,CACzC,CAEO,SAASC,GAAyBD,EAAuB,CAC9D,OAAOA,IAAQ,OAAY,GAAMA,EAAI,IAAI,MAAM,GAAKA,EAAI,IAAI,IAAI,GAAK,EACvE,CAEO,SAASE,GAAmBF,EAAuB,CACxD,OAAOA,IAAQ,OACX,GACCA,EAAI,IAAI,WAAW,GAAKA,EAAI,IAAI,MAAM,GAAKA,EAAI,IAAI,IAAI,GAAK,EACnE,CA2BO,SAASG,GAAuBC,EAAY,CACjD,OACEC,GAAmB,KAAKD,CAAE,GAC1BE,GAAyB,KAAKF,CAAE,GAChCG,GAAsB,KAAKH,CAAE,GAC7BI,GAAwB,KAAKJ,CAAE,GAC/BK,GAAqB,KAAKL,CAAE,GAC5BM,GAAY,KAAKN,CAAE,GACnBO,GAAY,KAAKP,CAAE,CAEvB,CAKO,SAASQ,GAAqBR,EAAgC,CACnE,GACEC,GAAmB,KAAKD,CAAE,GAC1BE,GAAyB,KAAKF,CAAE,GAChCG,GAAsB,KAAKH,CAAE,EAE7B,MAAO,UAET,GAAII,GAAwB,KAAKJ,CAAE,GAAKK,GAAqB,KAAKL,CAAE,EAClE,MAAO,SAET,GAAIM,GAAY,KAAKN,CAAE,EACrB,MAAO,OAET,GAAIO,GAAY,KAAKP,CAAE,EACrB,MAAO,MAGX,CAQA,SAASS,GAAYC,EAA2B,CAC9C,OAAKA,EAGD,MAAM,QAAQA,CAAM,EACfA,EAAO,QAAQC,GACpB,OAAOA,GAAS,SAAWA,EAAK,MAAM,GAAG,EAAI,CAAC,CAChD,EAEE,OAAOD,GAAW,SACbA,EAAO,MAAM,GAAG,EAAE,IAAIhB,GAAKA,EAAE,KAAK,CAAC,EAErC,CAAC,EAVC,CAAC,CAWZ,CAMA,SAASkB,GAAqBC,EAAmC,CAC/D,IAAMC,EAAgB,CAAC,EACvB,QAAWC,KAASF,EAAe,CAEjC,IAAMG,EAAQD,EAAM,MAAM,GAAG,EACvBE,EAAWD,EAAMA,EAAM,OAAS,CAAC,EACnCC,GAAYlB,GAAuBkB,CAAQ,GAC7CH,EAAI,KAAKG,CAAQ,EAGflB,GAAuBgB,CAAK,GAC9BD,EAAI,KAAKC,CAAK,EAGZA,EAAM,WAAW,YAAY,EAC/BD,EAAI,KAAKC,EAAM,QAAQ,aAAc,OAAO,CAAC,EACpCA,EAAM,WAAW,OAAO,GAAK,aAAa,KAAKA,CAAK,GAC7DD,EAAI,KAAKC,CAAK,CAElB,CACA,MAAO,CAAC,GAAG,IAAI,IAAID,CAAG,CAAC,CACzB,CAGO,SAASI,GAAoB1B,EAAuB,CACzD,GAAI,CAACA,EACH,MAAO,CAAC,EAGV,IAAM2B,EAA0B,CAAC,EAG3BC,EAAoB,CACxB5B,EAAE,IAAI,IAAI,EACVA,EAAE,IAAI,IAAI,EACVA,EAAE,IAAI,MAAM,EACZA,EAAE,IAAI,MAAM,EACZA,EAAE,IAAI,eAAe,EACrBA,EAAE,IAAI,YAAY,EAClBA,EAAE,IAAI,SAAS,EACfA,EAAE,IAAI,SAAS,CACjB,EAEA,QAAW6B,KAAQD,EACjB,GAAI,OAAOC,GAAS,SAAU,CAC5B,IAAMC,EAAWD,EAAK,QAAQ,YAAa,EAAE,EACzCtB,GAAuBuB,CAAQ,GACjCH,EAAc,KAAKG,CAAQ,CAE/B,CAIF,IAAMC,EAAO/B,EAAE,IAAI,MAAM,GAAKA,EAAE,IAAI,MAAM,EAC1C,GAAI,OAAO+B,GAAS,UAAY,OAAOA,GAAS,SAAU,CACxD,IAAMC,EAAU,OAAOD,CAAI,EACvB,QAAQ,KAAKC,CAAO,EACtBL,EAAc,KAAK,QAAQK,CAAO,EAAE,EAC3BjB,GAAY,KAAKiB,CAAO,GACjCL,EAAc,KAAKK,CAAO,CAE9B,CAGA,IAAMd,EAASlB,EAAE,IAAI,QAAQ,GAAKA,EAAE,IAAI,QAAQ,GAAKA,EAAE,IAAI,SAAS,EAC9DiC,EAAYb,GAAqBH,GAAYC,CAAM,CAAC,EAC1D,QAAWV,KAAMyB,EACfN,EAAc,KAAKnB,CAAE,EAGvB,MAAO,CAAC,GAAG,IAAI,IAAImB,CAAa,CAAC,CACnC,CAeO,SAASO,GAA0BlC,EAAiC,CACzE,GAAI,CAACA,EACH,MAAO,CAAE,cAAe,CAAC,CAAE,EAG7B,IAAImC,EAAmBnC,EAGvB,GAAIA,EAAE,IAAI,MAAM,IAAM,OAAQ,CAC5B,IAAMD,EAAcF,GAAsBG,CAAC,EACvCD,EAAY,OAAS,IACvBoC,EAAmBpC,EAAY,CAAC,EAGpC,CAGA,IAAM4B,EAAgBD,GAAoBS,CAAgB,EAGpDC,EACJD,EAAiB,IAAI,SAAS,GAC9BA,EAAiB,IAAI,WAAW,GAChCA,EAAiB,IAAI,WAAW,GAChCA,EAAiB,IAAI,SAAS,EAC1BE,EACJ,OAAOD,GAAkB,UAAYA,EAAc,OAAS,EACxDA,EACA,OAIAE,EAAStC,EAAE,IAAI,SAAS,GAAKA,EAAE,IAAI,IAAI,EACvCuC,EACJvC,EAAE,IAAI,WAAW,GAAKA,EAAE,IAAI,MAAM,GAAKA,EAAE,IAAI,MAAM,GAAKA,EAAE,IAAI,MAAM,EAEtE,MAAO,CACL,cAAe,CAAC,GAAG,IAAI,IAAI2B,CAAa,CAAC,EACzC,UAAAU,EACA,OAAQ,OAAOC,GAAW,SAAWA,EAAS,OAC9C,SAAU,OAAOC,GAAa,SAAWA,EAAW,MACtD,CACF,CAEO,SAASC,GAAqB,CACnC,QAAAC,EACA,iBAAAC,EACA,kBAAAC,CACF,EAIG,CACD,IAAMC,EAAaH,EAAQ,KACzBzC,GACE2C,GACAhD,GAAe+C,EAAiB1C,EAAE,GAAG,CAAC,GAAG,KAAO,EAAE,IAAM2C,CAC5D,EACME,EAAkBJ,EACrB,OAAOzC,GAAK,CAAC,CAAC0C,EAAiB1C,EAAE,GAAG,CAAC,CAAC,EACtC,SACC,CAAC8C,EAAGC,IACFL,EAAiBK,EAAE,GAAG,CAAC,EAAG,IAAI,OAC9BL,EAAiBI,EAAE,GAAG,CAAC,EAAG,IAAI,MAClC,EAAE,CAAC,EACL,OAAOF,GAAcC,CACvB,CAvRA,IAkDMpC,GACAC,GACAC,GAGAC,GACAC,GAGAC,GAGAC,GA9DNiC,GAAAC,EAAA,kBAkDMxC,GAAqB,kBACrBC,GAA2B,kBAC3BC,GAAwB,kBAGxBC,GAA0B,iBAC1BC,GAAuB,cAGvBC,GAAc,YAGdC,GAAc,eC9DpB,IAAAmC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,iDAAiD,ICAjF,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,6BAA6B,ICA7D,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,yCAAyC,ICAzE,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,uBAAuB,ICAvD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,yBAAyB,ICAzD,IAAAC,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,IAAAC,GACAC,GACAC,GACAC,GAOqBJ,GAVrBK,GAAAC,EAAA,kBAAAL,GAAuC,QACvCC,GAA8C,QAC9CC,GAA6B,QAC7BC,GAAiC,QAOZJ,GAArB,cAAwD,yBAAuB,CAC7E,OAAc,aAAe,CAAC,cAAe,aAAa,EAEnD,MAIP,MAAc,WAAY,CACxB,IAAMO,EAAS,KAAK,MAClB,QAAM,iBAAa,KAAK,QAAQ,UAAU,CAAC,EAAE,SAAS,MAAM,CAC9D,EAEA,OAAOA,EAAO,cAAc,IAAI,CAACC,EAAOC,KAAS,CAC/C,SAAU,QAAQA,CAAG,GACrB,MAAOD,EACP,IAAKA,EAAQ,EACb,MAAOD,EAAO,gBAAgBE,CAAG,CACnC,EAAE,CACJ,CAEA,MAAc,SAASC,EAAqB,CAAC,EAAG,CAC9C,YAAK,QAAU,KAAK,UAAU,EAAE,MAAOC,GAAe,CACpD,WAAK,MAAQ,OACPA,CACR,CAAC,EAEM,KAAK,KACd,CAEA,MAAa,YAAYD,EAAqB,CAAC,EAAG,CAChD,MAAO,CAAC,CACV,CAEO,YAAYE,EAAeF,EAAqB,CAAC,EAAG,CACzD,SAAO,qBAA0B,MAAMG,GAAY,CACjD,GAAM,CAAE,MAAAC,EAAO,IAAAC,EAAK,QAAAC,CAAQ,EAAIJ,EAC1BK,EAAO,MAAM,KAAK,SAAS,EACjC,QAAWC,KAAKD,KACV,mBAAeC,EAAE,MAAOA,EAAE,IAAKJ,EAAOC,CAAG,GAC3CF,EAAS,KAAK,IAAI,iBAAc,CAAE,GAAGK,EAAG,QAAAF,CAAQ,CAAC,CAAC,EAGtDH,EAAS,SAAS,CACpB,CAAC,CACH,CAEO,eAAsB,CAAC,CAChC,ICzDA,IAAAM,GAAA,GAAAC,GAAAD,GAAA,aAAAE,GAAA,uBAAAC,KA0BO,SAASA,GAAmBC,EAAkC,CACnE,OAAOA,EACJ,MAAM;AAAA,CAAI,EACV,MAAM,CAAC,EACP,IAAIC,GAAKA,EAAE,KAAK,CAAC,EACjB,OAAOA,GAAK,CAAC,CAACA,CAAC,EACf,QAAQ,CAACC,EAAKC,IAAQ,CACrB,GAAM,CAACC,EAAkB,GAAIC,EAAOC,CAAQ,EAAIJ,EAAI,MAAM,GAAG,EACvDK,EAAMH,EAAgB,CAAC,EACvBI,EAAUJ,EAAgB,GAAG,EAAE,EAC/BK,EAAQ,CAACL,EAAgB,MAAM,EAAG,EAAE,EAC1C,OAAOG,IAAQ,QACbC,IAAY,QACZ,CAAC,OAAO,MAAMC,CAAK,GACnBJ,IAAU,QACVC,IAAa,OACX,CACE,CACE,SAAU,QAAQH,CAAG,GACrB,IAAAI,EACA,QAAAC,EACA,MAAOC,EACP,IAAKA,EAAQ,EACb,MAAO,CAACJ,EACR,SAAAC,CACF,CACF,EACA,CAAC,CACP,CAAC,CACL,CAvDA,IAAAI,GACAC,GACAC,GACAC,GAsDqBf,GAzDrBgB,GAAAC,EAAA,kBAAAL,GAAuC,QACvCC,GAAwD,QACxDC,GAA6B,QAC7BC,GAAiC,QAsDZf,GAArB,cAA+D,yBAAuB,CACpF,OAAc,aAAe,CAAC,cAAe,aAAa,EAEnD,MAEP,MAAc,WAAY,CACxB,IAAMkB,EAAS,QAAM,iBAAa,KAAK,QAAQ,UAAU,CAAC,EAAE,SAAS,MAAM,EAC3E,OAAOjB,GAAmBiB,CAAM,CAClC,CAEA,MAAc,SAASC,EAAqB,CAAC,EAAG,CAC9C,YAAK,QAAU,KAAK,UAAU,EAAE,MAAOC,GAAe,CACpD,WAAK,MAAQ,OACPA,CACR,CAAC,EAEM,KAAK,KACd,CAEA,MAAa,eAAeD,EAAqB,CAE/C,IAAMD,GADO,MAAM,KAAK,SAAS,GACb,IAAIG,GAAKA,EAAE,KAAK,EACpC,MAAO,CAAE,YAAU,QAAIH,CAAM,EAAG,YAAU,QAAIA,CAAM,CAAE,CACxD,CAGA,MAAM,kCAAkCI,EAAoB,CAC1D,MAAO,CAAE,eAAgB,CAAE,CAC7B,CACA,MAAa,YAAYH,EAAqB,CAAC,EAAG,CAChD,MAAO,CAAC,CACV,CAEO,YAAYI,EAAeJ,EAAqB,CAAC,EAAG,CACzD,SAAO,qBAA0B,MAAMK,GAAY,CACjD,GAAM,CAAE,MAAAC,EAAO,IAAAC,EAAK,QAAAC,CAAQ,EAAIJ,EAC1BK,EAAO,MAAM,KAAK,SAAS,EACjC,QAAWzB,KAAKyB,KACV,mBAAezB,EAAE,MAAOA,EAAE,IAAKsB,EAAOC,CAAG,GAC3CF,EAAS,KACP,IAAI,iBAAc,CAChB,GAAGrB,EACH,QAAAwB,EACA,OAAQxB,EAAE,OACZ,CAAC,CACH,EAGJqB,EAAS,SAAS,CACpB,CAAC,CACH,CAEA,MAAa,YAAa,CACxB,IAAMK,EAAU,IAAI,IACdD,EAAO,MAAM,KAAK,SAAS,EACjC,QAAWzB,KAAKyB,EACdC,EAAQ,IAAI1B,EAAE,OAAO,EAEvB,MAAO,CAAC,GAAG0B,CAAO,EAAE,IAAIR,IAAM,CAC5B,KAAMA,EACN,OAAQA,CACV,EAAE,CACJ,CAEO,eAAsB,CAAC,CAChC,IC1HA,IAAAS,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,qBAAqB,ICArD,IAEAC,GAFAC,GAAAC,EAAA,kBAEAF,GAAyC,YCFzC,IAAAG,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,mBAAmB,ICAnD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,kBAAkB,ICAlD,IAAAC,EAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,eAAe,ICWxC,SAASC,IAAsB,CACpC,IAAMC,EAAS,aAAa,QAAQC,EAAgB,EACpD,OAAOD,IAAW,KAAO,GAAuBA,IAAW,MAC7D,CAEO,SAASE,GAAoBC,EAAgB,CAClD,aAAa,QAAQF,GAAkBE,EAAQ,OAAS,OAAO,CACjE,CAUA,SAASC,GACPC,EACyD,CACzD,MACE,qBAAsBA,GACtB,OAAOA,EAAQ,kBAAqB,YACpC,mBAAoBA,GACpB,OAAOA,EAAQ,gBAAmB,UAEtC,CASO,SAASC,GACdD,EACAE,EACA,CACIH,GAAwBC,CAAO,IACjCA,EAAQ,eAAe,CAAE,KAAM,aAAc,OAAAE,CAAO,CAAC,EACrDF,EAAQ,iBAAiB,EAAI,EAEjC,CAtDA,IAKMJ,GALNO,GAAAC,EAAA,kBAKMR,GAAmB,iCCanB,SAAUS,GAAqBC,EAAqB,CAExD,IAAIC,EAAOD,EAAI,KAAI,EACnB,KAAO,CAACC,EAAK,MAAQA,EAAK,MAAM,KAAI,IAAO,IACzCA,EAAOD,EAAI,KAAI,EAEjB,OAAOC,EAAK,KACd,CAzBA,IAAAC,GAAAC,EAAA,QCEA,SAASC,GAAYC,EAAY,CAC/B,IAAMC,EAAUD,EAAK,KAAI,EACzB,OAAKC,EAGUA,EAAQ,MAAM,KAAK,EACpB,MAAMC,GAAK,QAAQ,KAAKA,CAAC,CAAC,EAH/B,EAIX,CAEA,SAASC,GAAeH,EAAY,CAClC,IAAMC,EAAUD,EAAK,KAAI,EACzB,MAAO,UAAU,KAAKC,CAAO,GAAK,CAACF,GAAYC,CAAI,CACrD,CAEA,SAASI,GAAmBC,EAAgB,CAC1C,OAAOA,EAAO,QAAU,GAAK,QAAQ,KAAKA,EAAO,CAAC,CAAE,CACtD,CAEA,SAASC,GAAaN,EAAcO,EAAgB,CAElD,IAAMF,EADUL,EAAK,KAAI,EACF,MAAM,KAAK,EAC5BQ,EAAMH,EAAOE,CAAQ,EACrBE,EAAWT,EAAK,QACpBQ,EACAR,EAAK,QAAQK,EAAO,CAAC,CAAE,EAAIA,EAAO,CAAC,EAAG,MAAM,EAE9C,MAAO,CAACI,EAAUA,EAAWD,EAAI,MAAM,CACzC,CAGM,SAAUE,GAAmBC,EAAqB,CACtD,IAAIX,EAAOY,GAAqBD,CAAG,EAC7BE,EAAkB,CAAA,EACpBC,EAAgB,GACpB,GAAI,CAACd,EACH,OAGF,KAAOA,GACDD,GAAYC,CAAI,IAETG,GAAeH,CAAI,EAC5Ba,EAAM,KAAKb,CAAI,EAEfc,EAAgBd,GAElBA,EAAOW,EAAI,KAAI,EAAG,MAGpB,GAAIE,EAAM,SAAW,EACnB,OAGF,IAAMR,EAASQ,EAAM,IAAIE,GAAKA,EAAE,KAAI,EAAG,MAAM,KAAK,CAAC,EAC7CC,EAAaX,EAAO,CAAC,EAC3B,GAAI,CAACW,EACH,OAEF,IAAMT,EAAWH,GAAmBY,CAAU,EAAI,EAAI,EAChD,CAACC,EAAOC,CAAG,EAAIZ,GAAaO,EAAM,CAAC,EAAIN,CAAQ,EAC/CY,EAAMd,EAAO,IAAIU,GAAKA,EAAE,CAAC,CAAE,EAC3BK,EAAOf,EAAO,IAAIU,GAAKA,EAAER,CAAQ,CAAE,EACrCc,EAAYP,EAAc,MAAMG,EAAOC,CAAG,EAGxCI,EAAWF,EAAK,CAAC,EACvB,GAAIE,EAAU,CACZ,IAAMC,EAAYD,EAAS,OAASD,EAAU,OAC1CE,EAAY,IACdF,GAAa,IAAI,OAAOE,CAAS,EAErC,CACA,MAAO,CACL,IAAAJ,EACA,KAAAC,EACA,UAAAC,EAEJ,CAEM,SAAUG,GAAoBb,EAAqB,CACvD,IAAIE,EACEY,EAAMf,GAAmBC,CAAG,EAClC,GAAIc,IAAQ,OACV,KAAQZ,EAAQH,GAAmBC,CAAG,GAAI,CACxC,QAASe,EAAI,EAAGA,EAAIb,EAAM,KAAK,OAAQa,IACrCD,EAAI,KAAKC,CAAC,GAAKb,EAAM,KAAKa,CAAC,EAE7BD,EAAI,WAAaZ,EAAM,SACzB,CAEF,OAAOY,CACT,CA7FA,IAAAE,GAAAC,EAAA,KAAAC,OCoCM,SAAUC,GAAcC,EAAgB,CAC5C,IAAMC,EAAWD,EACd,MAAM;CAAI,EACV,OAAOE,GAAK,CAACA,EAAE,WAAW,GAAG,CAAC,EAC9B,KAAK;CAAI,EAENC,EAAMC,GAAoBH,EAAS,MAAM;CAAI,EAAE,OAAO,QAAQ,EAAC,CAAE,EACvE,GAAIE,IAAQ,OACV,MAAM,IAAI,MAAM,kBAAkB,EAGpC,IAAME,EAAOF,EAAI,KAAK,IAAI,CAACG,EAAGC,KAAW,CAAE,GAAIJ,EAAI,IAAII,CAAK,EAAI,IAAKD,CAAC,EAAG,EACnE,CAAE,UAAAE,CAAS,EAAKL,EAChBM,EAAWJ,EAAK,CAAC,EACvB,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,qBAAqB,EAEvC,GAAID,EAAU,SAAWC,EAAS,IAAI,OACpC,MAAM,IAAI,MACR,6CAA6CD,EAAU,MAAM,QAAQC,EAAS,IAAI,MAAM,EAAE,EAG9F,GAAIJ,EAAK,SAAW,EAClB,MAAM,IAAI,MACR,2DAA2DA,EAAK,MAAM,EAAE,EAG5E,MAAO,CACL,UAAAG,EACA,KAAMH,EAEV,CAnEA,IAAAK,GAAAC,EAAA,KAAAC,KACAC,OCIO,SAASC,GACdC,EACAC,EACA,CACAD,EAAQ,uBAAuB,CAC7B,KAAMC,EACN,SAAU,CACR,KAAM,yBACN,QAAS,GAAGA,CAAS,0BACrB,aAAc,MACd,QAAS,CACP,KAAM,wBACN,gBAAiB,6BACjB,cAAe,CACb,IAAK,sCAAsCA,CAAS,QACtD,CACF,CACF,CACF,CAAC,CACH,CAxBA,IAAAC,GAAAC,EAAA,oBCKA,eAAsBC,GACpBC,EACmB,CACnB,IAAMC,EAAM,sCAAsCD,CAAS,OACrDE,EAAM,MAAM,MAAMD,CAAG,EAC3B,GAAI,CAACC,EAAI,GACP,MAAM,IAAI,MAAM,QAAQA,EAAI,MAAM,aAAaD,CAAG,EAAE,EAEtD,IAAME,EAAO,MAAMD,EAAI,KAAK,EAE5B,MAAO,CACL,GAAG,IAAI,IACLC,EACG,MAAM;AAAA,CAAI,EACV,OAAOC,GAAK,CAACA,EAAE,WAAW,GAAG,CAAC,EAC9B,IAAIA,GAAKA,EAAE,KAAK,CAAC,EACjB,OAAOA,GAAK,CAAC,CAACA,CAAC,EACf,IAAIA,GAAKA,EAAE,MAAM,GAAI,EAAE,CAAC,CAAE,CAC/B,CACF,CACF,CAKO,SAASC,GAAwB,CACtC,QAAAC,EACA,UAAAN,EACA,aAAAO,CACF,EAIG,CACDA,EAAa,QAAQC,GAAQ,CAC3B,IAAMC,EAAU,GAAGT,CAAS,IAAIQ,CAAI,GACpCF,EAAQ,aAAa,CACnB,KAAM,eACN,QAAAG,EACA,KAAMD,EACN,QAAS,CACP,KAAM,cACN,YAAa,CACX,IAAK,sCAAsCR,CAAS,MACtD,CACF,EACA,cAAe,CAACA,CAAS,EACzB,SAAU,CACR,CACE,UAAW,GAAGS,CAAO,sBACrB,KAAM,qBACN,YAAa,CAAC,yBAAyBD,CAAI,GAAG,CAChD,CACF,CACF,CAAC,CACH,CAAC,CACH,CAKO,SAASE,GAAgB,CAC9B,QAAAJ,EACA,UAAAN,CACF,EAGG,CACDM,EAAQ,aAAa,CACnB,KAAM,eACN,QAAS,GAAGN,CAAS,WACrB,KAAM,UACN,QAAS,CACP,KAAM,cACN,YAAa,CACX,IAAK,8CAA8CA,CAAS,aAC9D,CACF,EACA,cAAe,CAACA,CAAS,CAC3B,CAAC,CACH,CAKO,SAASW,GAAkB,CAChC,QAAAL,EACA,UAAAN,CACF,EAGG,CACDM,EAAQ,aAAa,CACnB,KAAM,eACN,QAAS,GAAGN,CAAS,aACrB,KAAM,YACN,QAAS,CACP,KAAM,0BACN,SAAU,CACR,IAAK,gDAAgDA,CAAS,OAChE,CACF,EACA,cAAe,CAACA,CAAS,CAC3B,CAAC,CACH,CAKO,SAASY,GAA4B,CAC1C,QAAAN,EACA,UAAAN,EACA,cAAAa,CACF,EAIG,CACGA,GACFP,EAAQ,aAAa,CACnB,KAAM,oBACN,QAAS,GAAGN,CAAS,wBACrB,KAAM,uBACN,QAAS,CACP,KAAM,6BACN,SAAU,CACR,IAAKa,CACP,CACF,EACA,cAAe,CAACb,CAAS,CAC3B,CAAC,CAEL,CAKO,SAASc,GAAsB,CACpC,QAAAR,EACA,UAAAN,CACF,EAGG,CACDM,EAAQ,aAAa,CACnB,KAAM,yBACN,QAAS,GAAGN,CAAS,wBACrB,KAAM,uBACN,cAAe,CAACA,CAAS,EACzB,QAAS,CACP,KAAM,oCACN,SAAU,CACR,IAAK,wCAAwCA,CAAS,0BACxD,CACF,EACA,SAAU,CACR,CACE,KAAM,2BACN,UAAW,GAAGA,CAAS,iDACvB,iBAAkB,kBAClB,UAAW,CACT,qBAAsB,CACpB,KAAM,uBACN,kBAAmB,GACnB,SAAU,MACV,SAAU,MACZ,CACF,CACF,CACF,CACF,CAAC,CACH,CAKA,eAAsBe,GAAoB,CACxC,QAAAT,EACA,UAAAN,EACA,cAAAa,CACF,EAIG,CACD,IAAMN,EAAe,MAAMR,GAAyBC,CAAS,EAC7DK,GAAwB,CACtB,QAAAC,EACA,UAAAN,EACA,aAAAO,CACF,CAAC,EACDG,GAAgB,CACd,QAAAJ,EACA,UAAAN,CACF,CAAC,EACDW,GAAkB,CAChB,QAAAL,EACA,UAAAN,CACF,CAAC,EACDY,GAA4B,CAC1B,QAAAN,EACA,UAAAN,EACA,cAAAa,CACF,CAAC,EACDC,GAAsB,CACpB,QAAAR,EACA,UAAAN,CACF,CAAC,CACH,CArNA,IAAAgB,GAAAC,EAAA,oBCQA,eAAsBC,GAA4B,CAChD,QAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,cAAAC,EACA,gBAAAC,CACF,EAOG,CACDC,GAAqBN,EAASG,CAAS,EAEvC,MAAMI,GAAoB,CACxB,QAAAP,EACA,UAAAG,EACA,cAAAC,CACF,CAAC,EAED,IAAMI,EAAOR,EAAQ,QAAQ,mBAAoB,CAC/C,KAAM,mBACN,YAAaS,GACX,eACAR,EACAC,EACAC,CACF,CACF,CAAC,EAGGE,GAAmBH,GACrBQ,GAAsB,SAAS,CAC7B,OAAQF,EAAK,GACb,gBAAAH,EACA,QAASH,EAAmB,OAAO,EACnC,UAAAC,CACF,CAAC,EAGH,MAAMK,EAAK,eAAeL,EAAWA,CAAS,CAChD,CApDA,IAAAQ,GAAAC,EAAA,kBAAAC,KACAC,KACAC,KACAC,OCcO,SAASC,GACdC,EACAC,EAAUC,GACV,CACA,MAAO,wCAAwCF,CAAS,aAAaC,CAAO,MAC9E,CAEO,SAASE,GACdH,EACAC,EAAUC,GACV,CACA,MAAO,wCAAwCF,CAAS,kBAAkBC,CAAO,OACnF,CAEO,SAASG,GACdJ,EACAC,EAAUC,GACV,CACA,MAAO,4CAA4CF,CAAS,WAAWC,CAAO,MAChF,CAEO,SAASI,GAAmBC,EAAe,CAChD,MAAO,mCAAmCA,CAAK,MACjD,CAIA,SAASC,GAAgBC,EAAgB,CACvC,OAAOA,EAAO,MAAM,GAAG,EAAE,CAAC,CAC5B,CAEO,SAASC,GAAgCD,EAAgB,CAI9D,MADc,sBAAsB,KAAKD,GAAgBC,CAAM,CAAC,IACjD,CAAC,CAClB,CAEO,SAASE,GAA0BF,EAAgBG,EAAY,CACpE,IAAMC,EAAWL,GAAgBC,CAAM,EACvC,GAAII,EAAS,WAAW,KAAK,EAC3B,MAAO,qCAAqCA,CAAQ,OAEtD,GAAID,IAAO,SAAU,CACnB,IAAML,EAAQM,EAAS,MAAM,GAAG,EAAE,CAAC,EACnC,GAAIN,EAAM,SAAW,EACnB,OAAOD,GAAmBC,CAAK,CAEnC,CAEF,CAEO,SAASO,GAA2BL,EAAgB,CACzD,IAAMI,EAAWL,GAAgBC,CAAM,EACvC,GAAII,EAAS,WAAW,KAAK,EAE3B,MAAO,qCADcA,EAAS,QAAQ,UAAW,cAAc,CACP,OAG5D,CAUO,SAASE,GACdC,EACAC,EACAC,EACAjB,EACA,CACA,MAAO,CACL,GAAG,IAAI,IAAI,CACTe,EACAf,EACAkB,GAAmBF,CAAO,EAC1BG,GAAyBF,CAAkB,CAC7C,CAAC,CACH,EACG,OAAOG,GAAK,CAAC,CAACA,CAAC,EACf,KAAK,KAAK,CACf,CAEO,SAASC,GAAoB,CAClC,QAAAC,EACA,KAAAC,EACA,QAAAP,EACA,mBAAAC,EACA,UAAAjB,EACA,IAAAwB,EACA,KAAAC,EACA,+BAAAC,EACA,mBAAAC,EACA,YAAAC,EACA,mBAAAC,EACA,WAAAC,CACF,EAUG,CACD,IAAMC,EAAO,CACX,KAAM,cACN,mBAAAJ,EACA,mBAAAE,EACA,WAAY,CACV,CACE,IAAAL,EACA,KAAAC,EACA,+BAAgCC,GAAkC,GAClE,QAAST,GAAoB,OAAO,EACpC,gBAAiBM,EAAK,EACxB,CACF,EACA,YACEK,GACAd,GAAe,eAAgBE,EAASC,EAAoBjB,CAAS,CACzE,EACMgC,EAAcV,EAAQ,QAAQ,cAAeS,CAAI,EACvD,OAAID,GAAcG,GAAoB,IACpCC,GAAqBZ,EAASU,EAAY,EAAE,EAEvCA,CACT,CAEA,eAAsBG,GAAoB,CACxC,QAAAb,EACA,KAAAC,EACA,QAAAP,EACA,mBAAAC,EACA,UAAAjB,EACA,cAAAoC,CACF,EAEG,CACG,CAACpC,GAAa,IAAC,2BAAuBsB,CAAO,GAGjD,MAAMe,GAA4B,CAChC,QAAAf,EACA,mBAAAL,EACA,QAAAD,EACA,UAAAhB,EACA,cAAAoC,EACA,gBAAiBb,EAAK,EACxB,CAAC,CACH,CAQO,SAASe,GAAc,CAC5B,QAAAhB,EACA,KAAAC,EACA,QAAAP,EACA,mBAAAC,EACA,UAAAjB,EACA,YAAA4B,CACF,EAAgD,CAC9C,GAAK5B,EAGL,OAAOsB,EAAQ,QAAQ,UAAW,CAChC,KAAM,UACN,YACEM,GACAd,GAAe,WAAYE,EAASC,EAAoBjB,CAAS,EACnE,gBAAiBuB,EAAK,GACtB,iBAAkBN,GAAoB,OAAO,EAC7C,KAAM,CACJ,OAAQb,GAAmBJ,CAAS,EACpC,gBAAiB,kBACnB,CACF,CAAC,CACH,CAEO,SAASuC,IAAmB,CACjC,OAAO,OAAO,uBAAyB,MACzC,CAEO,SAASC,GACdC,EAOA,CACA,GAAM,CAAE,UAAAzC,CAAU,EAAIyC,EACtB,GAAI,CAACzC,EACH,OAEF,IAAM0C,EAAUJ,GAAcG,CAAM,EACpC,OAAOpB,GAAoB,CACzB,GAAGoB,EACH,mBAAoBC,GAAS,EAC/B,CAAC,CACH,CApOA,IAAAC,GAeazC,GAfb0C,GAAAC,EAAA,kBAAAF,GAAuC,QAQvCG,KACAC,KACAC,KAKa9C,GAAoB,OCfjC,IAAA+C,GAAAC,EAAAC,IAAA,cAWA,IAAIC,GAAQ,IACZ,SAASC,GAAGC,EAAGC,EAAG,CAChB,OAAQD,IAAMC,IAAYD,IAAN,GAAW,EAAIA,IAAM,EAAIC,IAAQD,IAAMA,GAAKC,IAAMA,CACxE,CACA,IAAIC,GAA0B,OAAO,OAAO,IAA7B,WAAkC,OAAO,GAAKH,GAC3DI,GAAWL,GAAM,SACjBM,GAAYN,GAAM,UAClBO,GAAkBP,GAAM,gBACxBQ,GAAgBR,GAAM,cACxB,SAASS,GAAuBC,EAAWC,EAAa,CACtD,IAAIC,EAAQD,EAAY,EACtBE,EAAYR,GAAS,CAAE,KAAM,CAAE,MAAOO,EAAO,YAAaD,CAAY,CAAE,CAAC,EACzEG,EAAOD,EAAU,CAAC,EAAE,KACpBE,EAAcF,EAAU,CAAC,EAC3B,OAAAN,GACE,UAAY,CACVO,EAAK,MAAQF,EACbE,EAAK,YAAcH,EACnBK,GAAuBF,CAAI,GAAKC,EAAY,CAAE,KAAMD,CAAK,CAAC,CAC5D,EACA,CAACJ,EAAWE,EAAOD,CAAW,CAChC,EACAL,GACE,UAAY,CACV,OAAAU,GAAuBF,CAAI,GAAKC,EAAY,CAAE,KAAMD,CAAK,CAAC,EACnDJ,EAAU,UAAY,CAC3BM,GAAuBF,CAAI,GAAKC,EAAY,CAAE,KAAMD,CAAK,CAAC,CAC5D,CAAC,CACH,EACA,CAACJ,CAAS,CACZ,EACAF,GAAcI,CAAK,EACZA,CACT,CACA,SAASI,GAAuBF,EAAM,CACpC,IAAIG,EAAoBH,EAAK,YAC7BA,EAAOA,EAAK,MACZ,GAAI,CACF,IAAII,EAAYD,EAAkB,EAClC,MAAO,CAACb,GAASU,EAAMI,CAAS,CAClC,MAAgB,CACd,MAAO,EACT,CACF,CACA,SAASC,GAAuBT,EAAWC,EAAa,CACtD,OAAOA,EAAY,CACrB,CACA,IAAIS,GACc,OAAO,OAAvB,KACgB,OAAO,OAAO,SAA9B,KACgB,OAAO,OAAO,SAAS,cAAvC,IACID,GACAV,GACNV,GAAQ,qBACKC,GAAM,uBAAjB,OAAwCA,GAAM,qBAAuBoB,KCjEvE,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,cAGEA,GAAO,QAAU,OCHnB,IAAAC,GAAA,GAAAC,GAAAD,GAAA,4BAAAE,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,KAAA,IAAMF,GACAE,GACAD,GACAF,GAHNI,GAAAC,EAAA,KAAMJ,GAAc,EACdE,GAAkB,EAClBD,GAAe,EACfF,GAAyB,ICDxB,SAASM,GAAOC,EAAKC,EAAK,CAChC,IAAIC,EAAMC,EACV,GAAIH,IAAQC,EAAK,MAAO,GAExB,GAAID,GAAOC,IAAQC,EAAKF,EAAI,eAAiBC,EAAI,YAAa,CAC7D,GAAIC,IAAS,KAAM,OAAOF,EAAI,QAAQ,IAAMC,EAAI,QAAQ,EACxD,GAAIC,IAAS,OAAQ,OAAOF,EAAI,SAAS,IAAMC,EAAI,SAAS,EAE5D,GAAIC,IAAS,MAAO,CACnB,IAAKC,EAAIH,EAAI,UAAYC,EAAI,OAC5B,KAAOE,KAASJ,GAAOC,EAAIG,CAAG,EAAGF,EAAIE,CAAG,CAAC,GAAE,CAE5C,OAAOA,IAAQ,EAChB,CAEA,GAAI,CAACD,GAAQ,OAAOF,GAAQ,SAAU,CACrCG,EAAM,EACN,IAAKD,KAAQF,EAEZ,GADII,GAAI,KAAKJ,EAAKE,CAAI,GAAK,EAAEC,GAAO,CAACC,GAAI,KAAKH,EAAKC,CAAI,GACnD,EAAEA,KAAQD,IAAQ,CAACF,GAAOC,EAAIE,CAAI,EAAGD,EAAIC,CAAI,CAAC,EAAG,MAAO,GAE7D,OAAO,OAAO,KAAKD,CAAG,EAAE,SAAWE,CACpC,CACD,CAEA,OAAOH,IAAQA,GAAOC,IAAQA,CAC/B,CA5BA,IAAIG,GAAJC,GAAAC,EAAA,KAAIF,GAAM,OAAO,UAAU,iBC+N3B,eAAeG,MAAkBC,EAAM,CACnC,GAAM,CAACC,EAAOC,EAAMC,EAAOC,CAAK,EAAIJ,EAG9BK,EAAUC,GAAa,CACzB,cAAe,GACf,aAAc,EAClB,EAAG,OAAOF,GAAU,UAAY,CAC5B,WAAYA,CAChB,EAAIA,GAAS,CAAC,CAAC,EACXG,EAAgBF,EAAQ,cACtBG,EAAwBH,EAAQ,gBAClCI,EAAiBJ,EAAQ,eACvBK,EAAmBC,GACd,OAAOH,GAA0B,WAAaA,EAAsBG,CAAK,EAAIH,IAA0B,GAE5GI,EAAeP,EAAQ,aAG7B,GAAIQ,GAAWX,CAAI,EAAG,CAClB,IAAMY,EAAYZ,EACZa,EAAc,CAAC,EACfC,EAAKf,EAAM,KAAK,EACtB,QAAWgB,KAAOD,EAEd,CAAC,iBAAiB,KAAKC,CAAG,GAAKH,EAAUb,EAAM,IAAIgB,CAAG,EAAE,EAAE,GACtDF,EAAY,KAAKE,CAAG,EAG5B,OAAO,QAAQ,IAAIF,EAAY,IAAIG,CAAW,CAAC,CACnD,CACA,OAAOA,EAAYhB,CAAI,EACvB,eAAegB,EAAYC,EAAI,CAE3B,GAAM,CAACF,CAAG,EAAIG,GAAUD,CAAE,EAC1B,GAAI,CAACF,EAAK,OACV,GAAM,CAACI,EAAKC,CAAG,EAAIC,GAAkBtB,EAAOgB,CAAG,EACzC,CAACO,EAAoBC,EAAUC,EAAOC,CAAO,EAAIC,GAAe,IAAI3B,CAAK,EACzE4B,EAAkB,IAAI,CACxB,IAAMC,EAAeN,EAAmBP,CAAG,EAE3C,OADmBJ,GAAWR,EAAQ,UAAU,EAAIA,EAAQ,WAAWgB,EAAI,EAAE,KAAMF,CAAE,EAAId,EAAQ,aAAe,MAI5G,OAAOqB,EAAMT,CAAG,EAChB,OAAOU,EAAQV,CAAG,EACda,GAAgBA,EAAa,CAAC,GACvBA,EAAa,CAAC,EAAmB,CAAY,EAAE,KAAK,IAAIT,EAAI,EAAE,IAAI,EAG1EA,EAAI,EAAE,IACjB,EAEA,GAAIrB,EAAK,OAAS,EAEd,OAAO6B,EAAgB,EAE3B,IAAIE,EAAO5B,EACPQ,EACAqB,EAAU,GAERC,GAAmBC,GAAa,EACtCT,EAASR,CAAG,EAAI,CACZgB,GACA,CACJ,EACA,IAAME,EAAoB,CAACC,EAAY3B,CAAc,EAC/C4B,GAAQhB,EAAI,EAIZiB,GAAgBD,GAAM,KACtBE,GAAcF,GAAM,GACpBG,EAAgBJ,EAAYG,EAAW,EAAID,GAAgBC,GAUjE,GARIJ,IACA1B,EAAiBI,GAAWJ,CAAc,EAAIA,EAAe+B,EAAeF,EAAa,EAAI7B,EAE7Fa,EAAI,CACA,KAAMb,EACN,GAAI+B,CACR,CAAC,GAED3B,GAAWkB,CAAI,EAEf,GAAI,CACAA,EAAOA,EAAKS,CAAa,CAC7B,OAASC,EAAK,CAEV9B,EAAQ8B,EACRT,EAAU,EACd,CAGJ,GAAID,GAAQW,GAAcX,CAAI,EAU1B,GAPAA,EAAO,MAAMA,EAAK,MAAOU,GAAM,CAC3B9B,EAAQ8B,EACRT,EAAU,EACd,CAAC,EAIGC,KAAqBR,EAASR,CAAG,EAAE,CAAC,EAAG,CACvC,GAAIe,EAAS,MAAMrB,EACnB,OAAOoB,CACX,MAAWC,GAAWG,GAAqBzB,EAAgBC,CAAK,IAG5DJ,EAAgB,GAEhBe,EAAI,CACA,KAAMkB,EACN,GAAIG,EACR,CAAC,GAIT,GAAIpC,GACI,CAACyB,EAED,GAAInB,GAAWN,CAAa,EAAG,CAC3B,IAAMqC,EAAqBrC,EAAcwB,EAAMS,CAAa,EAC5DlB,EAAI,CACA,KAAMsB,EACN,MAAOD,GACP,GAAIA,EACR,CAAC,CACL,MAEIrB,EAAI,CACA,KAAAS,EACA,MAAOY,GACP,GAAIA,EACR,CAAC,EAeb,GAVAlB,EAASR,CAAG,EAAE,CAAC,EAAIiB,GAAa,EAEhC,QAAQ,QAAQL,EAAgB,CAAC,EAAE,KAAK,IAAI,CAGxCP,EAAI,CACA,GAAIqB,EACR,CAAC,CACL,CAAC,EAEGX,EAAS,CACT,GAAIpB,EAAc,MAAMD,EACxB,MACJ,CACA,OAAOoB,CACX,CACJ,CA3XA,IACAc,GAKMjB,GAGAkB,GAKAH,GACAI,GACAX,EACAvB,GACAP,GAIAoC,GAEAM,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GACA/B,GAsCEgC,GACFC,GAECC,GAAeC,GAOhBC,GAIAC,GAaAC,GAiBAC,GAIAC,GAKAC,GACAC,GAEAC,GAIAC,GAEAC,GAEAC,GASAC,GACAC,GACAC,GAEFC,GASEC,GA2CAtD,GAqBFuD,GACEzC,GAgKA0C,GAKAC,GAmFAC,GAUAC,GAEC9E,GAAO+E,GAERC,GA0BAC,GAiBAC,GACAC,GA/gBNC,GAAAC,EAAA,kBACAzC,GAA6G,SAE7G0C,KAGM3D,GAAiB,IAAI,QAGrBkB,GAAO,IAAI,CAAC,EAKZH,GAA8BG,GAAK,EACnCC,GAAS,OACTX,EAAeoD,GAAIA,IAAM7C,GACzB9B,GAAc2E,GAAI,OAAOA,GAAK,WAC9BlF,GAAe,CAACmF,EAAGC,KAAK,CACtB,GAAGD,EACH,GAAGC,CACP,GACEhD,GAAiBiD,GAAI9E,GAAW8E,EAAE,IAAI,EAEtC3C,GAAc,CAAC,EACfC,GAAgB,CAAC,EACjBC,GAAgB,YAEhBC,GAAkB,OAAO,QAAUD,GACnCE,GAAoB,OAAO,UAAYF,GACvCG,GAAeF,IAAmB,SAAU,OAC5CG,GAA2B,IAAIH,IAAmB,OAAO,OAAO,uBAA4BD,GAC5F3B,GAAoB,CAACtB,EAAOgB,IAAM,CACpC,IAAMoB,EAAQT,GAAe,IAAI3B,CAAK,EACtC,MAAO,CAEH,IAAI,CAACmC,EAAYnB,CAAG,GAAKhB,EAAM,IAAIgB,CAAG,GAAK+B,GAE1C4C,GAAO,CACJ,GAAI,CAACxD,EAAYnB,CAAG,EAAG,CACnB,IAAM4E,EAAO5F,EAAM,IAAIgB,CAAG,EAGpBA,KAAOgC,KACTA,GAAchC,CAAG,EAAI4E,GAEzBxD,EAAM,CAAC,EAAEpB,EAAKX,GAAauF,EAAMD,CAAI,EAAGC,GAAQ7C,EAAW,CAC/D,CACJ,EAEAX,EAAM,CAAC,EAEP,IACQ,CAACD,EAAYnB,CAAG,GAEZA,KAAOgC,GAAsBA,GAAchC,CAAG,EAG/C,CAACmB,EAAYnB,CAAG,GAAKhB,EAAM,IAAIgB,CAAG,GAAK+B,EAEtD,CACJ,EASQO,GAAS,GACXC,GAAW,IAAID,GAEf,CAACE,GAAeC,IAAkBP,IAAmB,OAAO,iBAAmB,CACjF,OAAO,iBAAiB,KAAK,MAAM,EACnC,OAAO,oBAAoB,KAAK,MAAM,CAC1C,EAAI,CACAL,GACAA,EACJ,EACMa,GAAY,IAAI,CAClB,IAAMmC,EAAkB1C,IAAqB,SAAS,gBACtD,OAAOhB,EAAY0D,CAAe,GAAKA,IAAoB,QAC/D,EACMlC,GAAamC,IAEX3C,IACA,SAAS,iBAAiB,mBAAoB2C,CAAQ,EAE1DtC,GAAc,QAASsC,CAAQ,EACxB,IAAI,CACH3C,IACA,SAAS,oBAAoB,mBAAoB2C,CAAQ,EAE7DrC,GAAe,QAASqC,CAAQ,CACpC,GAEElC,GAAiBkC,GAAW,CAE9B,IAAMC,EAAW,IAAI,CACjBzC,GAAS,GACTwC,EAAS,CACb,EAEME,EAAY,IAAI,CAClB1C,GAAS,EACb,EACA,OAAAE,GAAc,SAAUuC,CAAQ,EAChCvC,GAAc,UAAWwC,CAAS,EAC3B,IAAI,CACPvC,GAAe,SAAUsC,CAAQ,EACjCtC,GAAe,UAAWuC,CAAS,CACvC,CACJ,EACMnC,GAAS,CACX,SAAAN,GACA,UAAAG,EACJ,EACMI,GAAuB,CACzB,UAAAH,GACA,cAAAC,EACJ,EAEMG,GAAkB,CAAC,GAAAkC,QAAM,MACzBjC,GAAY,CAACd,IAAmBE,GAEhCa,GAAOiC,GAAI7C,GAAyB,EAAI,OAAO,sBAAyB6C,CAAC,EAAI,WAAWA,EAAG,CAAC,EAI5FhC,GAA4BF,GAAY,aAAY,mBAEpDG,GAAsB,OAAO,UAAc,KAAe,UAAU,WAEpEC,GAAiB,CAACJ,IAAaG,KAAwB,CACzD,UACA,IACJ,EAAE,SAASA,GAAoB,aAAa,GAAKA,GAAoB,UAM/DE,GAAQ,IAAI,QACZC,GAAe6B,GAAQrD,GAAO,UAAU,SAAS,KAAKqD,CAAK,EAC3D5B,GAAmB,CAAC6B,EAAUC,IAAOD,IAAa,WAAWC,CAAI,IAEnE7B,GAAU,EASRC,GAAc6B,GAAM,CACtB,IAAMD,EAAO,OAAOC,EACdF,EAAW9B,GAAYgC,CAAG,EAC1BC,EAAShC,GAAiB6B,EAAU,MAAM,EAC1CI,EAAUjC,GAAiB6B,EAAU,QAAQ,EAC7CK,EAAgBlC,GAAiB6B,EAAU,QAAQ,EACrDM,EACAC,EACJ,GAAI7D,GAAOwD,CAAG,IAAMA,GAAO,CAACC,GAAU,CAACC,EAAS,CAI5C,GADAE,EAASrC,GAAM,IAAIiC,CAAG,EAClBI,EAAQ,OAAOA,EAMnB,GAFAA,EAAS,EAAElC,GAAU,IACrBH,GAAM,IAAIiC,EAAKI,CAAM,EACjB,MAAM,QAAQJ,CAAG,EAAG,CAGpB,IADAI,EAAS,IACLC,EAAQ,EAAGA,EAAQL,EAAI,OAAQK,IAC/BD,GAAUjC,GAAW6B,EAAIK,CAAK,CAAC,EAAI,IAEvCtC,GAAM,IAAIiC,EAAKI,CAAM,CACzB,CACA,GAAID,EAAe,CAEfC,EAAS,IACT,IAAME,EAAO9D,GAAO,KAAKwD,CAAG,EAAE,KAAK,EACnC,KAAM,CAACnE,EAAYwE,EAAQC,EAAK,IAAI,CAAC,GAC5BzE,EAAYmE,EAAIK,CAAK,CAAC,IACvBD,GAAUC,EAAQ,IAAMlC,GAAW6B,EAAIK,CAAK,CAAC,EAAI,KAGzDtC,GAAM,IAAIiC,EAAKI,CAAM,CACzB,CACJ,MACIA,EAASH,EAASD,EAAI,OAAO,EAAID,GAAQ,SAAWC,EAAI,SAAS,EAAID,GAAQ,SAAW,KAAK,UAAUC,CAAG,EAAI,GAAKA,EAEvH,OAAOI,CACX,EAEMvF,GAAaH,GAAM,CACrB,GAAIJ,GAAWI,CAAG,EACd,GAAI,CACAA,EAAMA,EAAI,CACd,MAAc,CAEVA,EAAM,EACV,CAIJ,IAAMjB,EAAOiB,EAEb,OAAAA,EAAM,OAAOA,GAAO,SAAWA,GAAO,MAAM,QAAQA,CAAG,EAAIA,EAAI,OAASA,GAAOyD,GAAWzD,CAAG,EAAI,GAC1F,CACHA,EACAjB,CACJ,CACJ,EAGI2E,GAAc,EACZzC,GAAe,IAAI,EAAEyC,GAgKrBC,GAAoB,CAAC9C,EAAcwE,IAAO,CAC5C,QAAUrF,KAAOa,EACTA,EAAab,CAAG,EAAE,CAAC,GAAGa,EAAab,CAAG,EAAE,CAAC,EAAEqF,CAAI,CAE3D,EACMzB,GAAY,CAACiC,EAAUzG,IAAU,CAMnC,GAAI,CAACuB,GAAe,IAAIkF,CAAQ,EAAG,CAC/B,IAAMC,EAAOzG,GAAayD,GAAsB1D,CAAO,EAGjDmB,EAAqB,OAAO,OAAO,IAAI,EACvCwD,EAASjF,GAAe,KAAK4C,GAAWmE,CAAQ,EAClDE,EAAUlE,GACRmE,EAAgB,OAAO,OAAO,IAAI,EAClCC,EAAY,CAACjG,EAAK8E,IAAW,CAC/B,IAAMoB,EAAOF,EAAchG,CAAG,GAAK,CAAC,EACpC,OAAAgG,EAAchG,CAAG,EAAIkG,EACrBA,EAAK,KAAKpB,CAAQ,EACX,IAAIoB,EAAK,OAAOA,EAAK,QAAQpB,CAAQ,EAAG,CAAC,CACpD,EACMqB,EAAS,CAACnG,EAAKmF,EAAOP,IAAO,CAC/BiB,EAAS,IAAI7F,EAAKmF,CAAK,EACvB,IAAMe,EAAOF,EAAchG,CAAG,EAC9B,GAAIkG,EACA,QAAWE,KAAMF,EACbE,EAAGjB,EAAOP,CAAI,CAG1B,EACMyB,EAAe,IAAI,CACrB,GAAI,CAAC1F,GAAe,IAAIkF,CAAQ,IAE5BlF,GAAe,IAAIkF,EAAU,CACzBtF,EACA,OAAO,OAAO,IAAI,EAClB,OAAO,OAAO,IAAI,EAClB,OAAO,OAAO,IAAI,EAClBwD,EACAoC,EACAF,CACJ,CAAC,EACG,CAACjD,IAAW,CAOZ,IAAMsD,EAAeR,EAAK,UAAU,WAAW,KAAKpE,GAAWiC,GAAkB,KAAKjC,GAAWnB,EAAqC,CAAW,CAAC,CAAC,EAC7IgG,EAAmBT,EAAK,cAAc,WAAW,KAAKpE,GAAWiC,GAAkB,KAAKjC,GAAWnB,EAAqC,CAAe,CAAC,CAAC,EAC/JwF,EAAU,IAAI,CAEVO,GAAgBA,EAAa,EAE7BC,GAAoBA,EAAiB,EAIrC5F,GAAe,OAAOkF,CAAQ,CAClC,CACJ,CAER,EACA,OAAAQ,EAAa,EAMN,CACHR,EACA9B,EACAsC,EACAN,CACJ,CACJ,CACA,MAAO,CACHF,EACAlF,GAAe,IAAIkF,CAAQ,EAAE,CAAC,CAClC,CACJ,EAGMhC,GAAe,CAAC2C,EAAGC,EAAIC,EAAQC,EAAYb,IAAO,CACpD,IAAMc,EAAgBF,EAAO,gBACvBG,EAAoBf,EAAK,WAEzBgB,EAAU,CAAC,GAAG,KAAK,OAAO,EAAI,KAAQ,IAAMD,EAAoB,EAAIA,EAAoB,KAAOH,EAAO,mBACxG,CAACvF,EAAYyF,CAAa,GAAKC,EAAoBD,GAGvD,WAAWD,EAAYG,EAAShB,CAAI,CACxC,EACMhC,GAAUiD,GAEV,CAAC/H,GAAO+E,IAAUH,GAAU,IAAI,GAAK,EAErCI,GAAgB3E,GAAa,CAE/B,cAAewC,GACf,UAAWA,GACX,QAASA,GACT,aAAAgC,GACA,YAAahC,GAEb,kBAAmB,GACnB,sBAAuB,GACvB,kBAAmB,GACnB,mBAAoB,GAEpB,mBAAoBuB,GAAiB,IAAQ,IAC7C,sBAAuB,EAAI,IAC3B,iBAAkB,EAAI,IACtB,eAAgBA,GAAiB,IAAO,IAExC,QAAAU,GACA,SAAU,IAAI,GACd,MAAA9E,GACA,OAAA+E,GACA,SAAU,CAAC,CACf,EACAlB,EAAM,EAEAoB,GAAe,CAACO,EAAGC,IAAI,CAEzB,IAAMF,EAAIlF,GAAamF,EAAGC,CAAC,EAE3B,GAAIA,EAAG,CACH,GAAM,CAAE,IAAKuC,EAAI,SAAUC,CAAG,EAAIzC,EAC5B,CAAE,IAAK0C,EAAI,SAAUC,CAAG,EAAI1C,EAC9BuC,GAAME,IACN3C,EAAE,IAAMyC,EAAG,OAAOE,CAAE,GAEpBD,GAAME,IACN5C,EAAE,SAAWlF,GAAa4H,EAAIE,CAAE,EAExC,CACA,OAAO5C,CACX,EAEML,MAAmB,kBAAc,CAAC,CAAC,EACnCC,GAAaiD,GAAQ,CACvB,GAAM,CAAE,MAAAjC,CAAM,EAAIiC,EACZC,KAAe,eAAWnD,EAAgB,EAC1CoD,EAAqB1H,GAAWuF,CAAK,EACrCuB,KAAS,YAAQ,IAAIY,EAAqBnC,EAAMkC,CAAY,EAAIlC,EAAO,CACzEmC,EACAD,EACAlC,CACJ,CAAC,EAEKoC,KAAiB,YAAQ,IAAID,EAAqBZ,EAASzC,GAAaoD,EAAcX,CAAM,EAAG,CACjGY,EACAD,EACAX,CACJ,CAAC,EAEKb,EAAWa,GAAUA,EAAO,SAE5Bc,KAAkB,WAAO9F,EAAS,EACpCmE,GAAY,CAAC2B,EAAgB,UAC7BA,EAAgB,QAAU5D,GAAUiC,EAAS0B,EAAe,OAASvI,EAAK,EAAG0H,CAAM,GAEvF,IAAMe,EAAeD,EAAgB,QAErC,OAAIC,IACAF,EAAe,MAAQE,EAAa,CAAC,EACrCF,EAAe,OAASE,EAAa,CAAC,GAG1CvE,GAA0B,IAAI,CAC1B,GAAIuE,EAEA,OAAAA,EAAa,CAAC,GAAKA,EAAa,CAAC,EAAE,EAC5BA,EAAa,CAAC,CAE7B,EAAG,CAAC,CAAC,KACE,kBAAcvD,GAAiB,SAAU7E,GAAa+H,EAAO,CAChE,MAAOG,CACX,CAAC,CAAC,CACN,ICtjBA,IAAMG,GAANC,GAAAC,EAAA,KAAMF,GAAkB,UCAxB,IAAAG,GAAAC,EAAA,QCAA,IAMAC,GAIMC,GACAC,GACAC,GAOAC,GAYAC,GAqBAC,GAkBAC,GAIAC,GAqBAC,GA/FNC,GAAAC,EAAA,KAAAC,KACAA,KACAC,KAEAC,KAEAd,GAA2C,SAC3Ce,KAGMd,GAAiBe,IAAmB,OAAO,qBAC3Cd,GAAMD,GAAiB,OAAO,qBAAuB,CAAC,EACtDE,GAAgB,IAAI,CAClBF,KAEA,OAAO,uBAAyB,GAAAgB,QAExC,EAEMb,GAAac,GACRC,GAAWD,EAAK,CAAC,CAAC,EAAI,CACzBA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,GAAK,CAAC,CAChB,EAAI,CACAA,EAAK,CAAC,EACN,MACCA,EAAK,CAAC,IAAM,KAAOA,EAAK,CAAC,EAAIA,EAAK,CAAC,IAAM,CAAC,CAC/C,EAGEb,GAAe,IAAI,CACrB,IAAMe,KAAe,eAAWC,EAAgB,EAIhD,SAHqB,YAAQ,IAAIC,GAAaC,GAAeH,CAAY,EAAG,CACxEA,CACJ,CAAC,CAEL,EAeMd,GAAckB,GAAa,CAACC,EAAMC,EAAUC,IAenCH,EAAWC,EAbFC,IAAa,IAAIR,IAAO,CACpC,GAAM,CAACU,CAAG,EAAIC,GAAUJ,CAAI,EACtB,CAAC,CAAE,CAAE,CAAEK,CAAO,EAAIC,GAAe,IAAIC,EAAK,EAChD,GAAIJ,EAAI,WAAWK,EAAe,EAG9B,OAAOP,EAAS,GAAGR,CAAI,EAE3B,IAAMgB,EAAMJ,EAAQF,CAAG,EACvB,OAAIO,EAAYD,CAAG,EAAUR,EAAS,GAAGR,CAAI,GAC7C,OAAOY,EAAQF,CAAG,EACXM,EACX,GACiCP,CAAM,EAGzCpB,GAAsBL,GAAI,OAAOI,EAAU,EAI3CE,GAAY4B,GACP,YAAuBlB,EAAM,CAEhC,IAAMmB,EAAiBhC,GAAa,EAE9B,CAACuB,EAAKU,EAAIC,CAAO,EAAInC,GAAUc,CAAI,EAEnCS,EAASa,GAAaH,EAAgBE,CAAO,EAE/CE,EAAOL,EACL,CAAE,IAAAlC,CAAI,EAAIyB,EACVrB,GAAcJ,GAAO,CAAC,GAAG,OAAOK,EAAmB,EACzD,QAAQmC,EAAIpC,EAAW,OAAQoC,KAC3BD,EAAOnC,EAAWoC,CAAC,EAAED,CAAI,EAE7B,OAAOA,EAAKb,EAAKU,GAAMX,EAAO,SAAW,KAAMA,CAAM,CACzD,EAKElB,GAAoB,CAACmB,EAAKe,EAAWC,IAAW,CAClD,IAAMC,EAAoBF,EAAUf,CAAG,IAAMe,EAAUf,CAAG,EAAI,CAAC,GAC/D,OAAAiB,EAAkB,KAAKD,CAAQ,EACxB,IAAI,CACP,IAAME,EAAQD,EAAkB,QAAQD,CAAQ,EAC5CE,GAAS,IAETD,EAAkBC,CAAK,EAAID,EAAkBA,EAAkB,OAAS,CAAC,EACzEA,EAAkB,IAAI,EAE9B,CACJ,EAcA1C,GAAc,ICxHd,IAAA4C,GACAC,GAKMC,GAKAC,GAwFAC,GAwBAC,GAGAC,GACAC,GA4BIC,GAihBJC,GAkBIC,GA9rBVC,GAAAC,EAAA,KAAAZ,GAAmE,SACnEC,GAAqC,UACrCY,KAIMX,GAAO,IAAI,CAAC,EAKZC,GAA8BD,GAAK,EAwFnCE,GAAM,GAAAU,QAAM,MAIhBC,GAAW,CACT,OAAOA,EAAS,OAAO,CACnB,IAAK,UACD,MAAMA,EACV,IAAK,YACD,OAAOA,EAAS,MACpB,IAAK,WACD,MAAMA,EAAS,OACnB,QACI,MAAAA,EAAS,OAAS,UAClBA,EAAS,KAAMC,GAAI,CACfD,EAAS,OAAS,YAClBA,EAAS,MAAQC,CACrB,EAAIC,GAAI,CACJF,EAAS,OAAS,WAClBA,EAAS,OAASE,CACtB,CAAC,EACKF,CACd,CACJ,GACMV,GAAc,CAChB,OAAQ,EACZ,EACMC,GAAgB,QAAQ,QAAQH,EAAW,EAC3CI,GAAM,IAAIL,GA4BNM,GAAgB,CAACU,EAAMC,EAASC,IAAS,CAC/C,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,aAAAC,EAAc,kBAAAC,EAAmB,kBAAAC,EAAmB,gBAAAC,EAAiB,kBAAAC,EAAmB,mBAAAC,EAAoB,iBAAAC,EAAkB,4BAAAC,CAA4B,EAAIX,EAC1L,CAACY,EAAoBC,EAAUC,EAAOC,CAAO,EAAIC,GAAe,IAAIf,CAAK,EAKzE,CAACgB,EAAKC,CAAK,EAAIC,GAAYrB,CAAI,EAE/BsB,KAAoB,WAAO,EAAK,EAGhCC,KAAe,WAAO,EAAK,EAE3BC,KAAS,WAAOL,CAAG,EACnBM,KAAa,WAAOxB,CAAO,EAC3ByB,MAAY,WAAOxB,CAAM,EACzByB,EAAY,IAAID,GAAU,QAC1BE,GAAW,IAAID,EAAU,EAAE,UAAU,GAAKA,EAAU,EAAE,SAAS,EAC/D,CAACE,GAAUC,GAAUC,EAAgBC,CAAe,EAAIC,GAAkB9B,EAAOgB,CAAG,EACpFe,MAAoB,WAAO,CAAC,CAAC,EAAE,QAG/BC,GAAWC,EAAc9B,CAAY,EAAI8B,EAAclC,EAAO,QAAQ,EAAIjB,GAAciB,EAAO,SAASiB,CAAG,EAAIb,EAC/G+B,GAAU,CAACC,EAAMC,IAAU,CAC7B,QAAUC,KAAKN,GAAkB,CAC7B,IAAMO,GAAID,EACV,GAAIC,KAAM,QACN,GAAI,CAACrC,EAAQkC,EAAKG,EAAC,EAAGF,EAAQE,EAAC,CAAC,IACxB,CAACL,EAAcE,EAAKG,EAAC,CAAC,GAGtB,CAACrC,EAAQsC,GAAcH,EAAQE,EAAC,CAAC,GACjC,MAAO,WAIXF,EAAQE,EAAC,IAAMH,EAAKG,EAAC,EACrB,MAAO,EAGnB,CACA,MAAO,EACX,EACME,GAAiB,CAACrB,EAAkB,QACpCsB,MAAc,YAAQ,IAAI,CAC5B,IAAMC,EAAahB,GAAS,EACtBiB,EAAcd,EAAgB,EAC9Be,EAAoBC,IAAQ,CAE9B,IAAMC,GAAWC,GAAaF,EAAK,EAanC,OAZA,OAAOC,GAAS,IACY,IAAI,CAI5B,GAHI,CAAC9B,GACD,CAAClB,GAED0B,EAAU,EAAE,SAAS,EAAG,MAAO,GAEnC,GAAIgB,IAAkB,CAACP,EAAc7B,CAAiB,EAAG,OAAOA,EAChE,IAAM4C,GAAQf,EAAcD,EAAQ,EAAec,GAAS,KAApBd,GACxC,OAAI9B,EAAiB+B,EAAce,EAAI,GAAK3C,EACrC4B,EAAce,EAAI,GAAK3C,CAClC,GAAG,EAII,CACH,aAAc,GACd,UAAW,GACX,GAAGyC,EACP,EANWA,EAOf,EACMG,GAAiBL,EAAiBF,CAAU,EAC5CQ,GAAiBR,IAAeC,EAAcM,GAAiBL,EAAiBD,CAAW,EAI7FQ,GAAoBF,GACxB,MAAO,CACH,IAAI,CACA,IAAMG,GAAcR,EAAiBlB,GAAS,CAAC,EAE/C,OADsBQ,GAAQkB,GAAaD,EAAiB,GAYxDA,GAAkB,KAAOC,GAAY,KACrCD,GAAkB,UAAYC,GAAY,UAC1CD,GAAkB,aAAeC,GAAY,aAC7CD,GAAkB,MAAQC,GAAY,MAC/BD,KAEPA,GAAoBC,GACbA,GAEf,EACA,IAAIF,EACR,CAEJ,EAAG,CACClD,EACAgB,CACJ,CAAC,EAEKqC,MAAS,4BAAqB,gBAAaC,GAAW1B,EAAeZ,EAAK,CAACoB,EAASD,IAAO,CACpFD,GAAQC,EAAMC,CAAO,GAAGkB,EAAS,CAC1C,CAAC,EACL,CACItD,EACAgB,CACJ,CAAC,EAAGyB,GAAY,CAAC,EAAGA,GAAY,CAAC,CAAC,EAC5Bc,GAAiB5C,EAAmBK,CAAG,GAAKL,EAAmBK,CAAG,EAAE,OAAS,EAC7E0B,GAAaW,GAAO,KACpBL,GAAOf,EAAcS,EAAU,EAAIV,IAAYwB,GAAcxB,EAAQ,EAAIjD,GAAIiD,EAAQ,EAAIA,GAAWU,GACpGe,GAAQJ,GAAO,MAEfK,MAAe,WAAOV,EAAI,EAC1BT,GAAe9B,EAAmBwB,EAAcS,EAAU,EAAIT,EAAcyB,GAAa,OAAO,EAAIV,GAAOU,GAAa,QAAUhB,GAAaM,GAC/IW,GAAkB3C,GAAOiB,EAAce,EAAI,EAC3CY,MAAe,WAAO,IAAI,EAIhC,CAACC,OAED,yBAAqB3E,GAAK,KACtB0E,GAAa,QAAU,GAChBA,IACR,KACCA,GAAa,QAAU,GAChBA,GACV,EACD,IAAME,GAAcF,GAAa,QAM7BlD,GAA+BoD,IAAe,CAAC5D,GAAYyD,IAC3D,QAAQ,KAAK,kDAAkD3C,CAAG,kMAAkM,EAOxQ,IAAM+C,GACE,CAAC/C,GAAO,CAAClB,GAET0B,EAAU,EAAE,SAAS,GAErB+B,IAAkB,CAACtB,EAAcwB,EAAK,EAAU,GAEhDjB,IAAkB,CAACP,EAAc7B,CAAiB,EAAUA,EAI5DF,EAAiB+B,EAAce,EAAI,EAAI,GAAQ3C,EAG5C4B,EAAce,EAAI,GAAK3C,EAE5B2D,GAAyBxB,IAAkBuB,GAC3CE,GAAehC,EAAcoB,GAAO,YAAY,EAAIW,GAAyBX,GAAO,aACpFa,GAAYjC,EAAcoB,GAAO,SAAS,EAAIW,GAAyBX,GAAO,UAG9Ec,MAAa,gBAAY,MAAOC,GAAiB,CACnD,IAAMC,EAAiB/C,EAAW,QAClC,GAAI,CAACN,GAAO,CAACqD,GAAkBjD,EAAa,SAAWI,EAAU,EAAE,SAAS,EACxE,MAAO,GAEX,IAAI8C,EACAC,GACAC,GAAU,GACRC,GAAOL,GAAkB,CAAC,EAG1BM,GAAwB,CAAC7D,EAAMG,CAAG,GAAK,CAACyD,GAAK,OAW5CE,GAAoB,IACnBC,GACO,CAACxD,EAAa,SAAWJ,IAAQK,EAAO,SAAWF,EAAkB,QAEzEH,IAAQK,EAAO,QAGpBwD,GAAa,CACf,aAAc,GACd,UAAW,EACf,EACMC,GAA8B,IAAI,CACpCnD,GAASkD,EAAU,CACvB,EACME,GAAe,IAAI,CAErB,IAAMC,GAAcnE,EAAMG,CAAG,EACzBgE,IAAeA,GAAY,CAAC,IAAMT,IAClC,OAAO1D,EAAMG,CAAG,CAExB,EAEMiE,GAAe,CACjB,aAAc,EAClB,EAGIhD,EAAcP,GAAS,EAAE,IAAI,IAC7BuD,GAAa,UAAY,IAE7B,GAAI,CAmCA,GAlCIP,KACA/C,GAASsD,EAAY,EAGjBlF,EAAO,gBAAkBkC,EAAcP,GAAS,EAAE,IAAI,GACtD,WAAW,IAAI,CACP8C,IAAWG,GAAkB,GAC7BnD,EAAU,EAAE,cAAcR,EAAKjB,CAAM,CAE7C,EAAGA,EAAO,cAAc,EAI5Bc,EAAMG,CAAG,EAAI,CACTqD,EAAepD,CAAK,EACpBiE,GAAa,CACjB,GAKJ,CAACZ,EAASC,EAAO,EAAI1D,EAAMG,CAAG,EAC9BsD,EAAU,MAAMA,EACZI,IAGA,WAAWK,GAAchF,EAAO,gBAAgB,EAQhD,CAACc,EAAMG,CAAG,GAAKH,EAAMG,CAAG,EAAE,CAAC,IAAMuD,GACjC,OAAIG,IACIC,GAAkB,GAClBnD,EAAU,EAAE,YAAYR,CAAG,EAG5B,GAGX6D,GAAW,MAAQ/F,GAanB,IAAMqG,GAAevE,EAASI,CAAG,EACjC,GAAI,CAACiB,EAAckD,EAAY,IAC9BZ,IAAWY,GAAa,CAAC,GAC1BZ,IAAWY,GAAa,CAAC,GACzBA,GAAa,CAAC,IAAM,GAChB,OAAAL,GAA4B,EACxBJ,IACIC,GAAkB,GAClBnD,EAAU,EAAE,YAAYR,CAAG,EAG5B,GAIX,IAAMoE,GAAY1D,GAAS,EAAE,KAG7BmD,GAAW,KAAO5E,EAAQmF,GAAWd,CAAO,EAAIc,GAAYd,EAExDI,IACIC,GAAkB,GAClBnD,EAAU,EAAE,UAAU8C,EAAStD,EAAKjB,CAAM,CAGtD,OAASsF,GAAK,CACVN,GAAa,EACb,IAAMO,GAAgB9D,EAAU,EAC1B,CAAE,mBAAA+D,EAAmB,EAAID,GAE1BA,GAAc,SAAS,IAExBT,GAAW,MAAQQ,GAGfX,IAAyBC,GAAkB,IAC3CW,GAAc,QAAQD,GAAKrE,EAAKsE,EAAa,GACzCC,KAAuB,IAAQC,GAAaD,EAAkB,GAAKA,GAAmBF,EAAG,KACrF,CAAC7D,EAAU,EAAE,mBAAqB,CAACA,EAAU,EAAE,uBAAyBC,GAAS,IAIjF6D,GAAc,aAAaD,GAAKrE,EAAKsE,GAAgBG,IAAQ,CACzD,IAAMC,GAAe/E,EAAmBK,CAAG,EACvC0E,IAAgBA,GAAa,CAAC,GAC9BA,GAAa,CAAC,EAAEC,GAAiB,uBAAwBF,EAAK,CAEtE,EAAG,CACC,YAAahB,GAAK,YAAc,GAAK,EACrC,OAAQ,EACZ,CAAC,GAKrB,CAEA,OAAAD,GAAU,GAEVM,GAA4B,EACrB,EACX,EAWA,CACI9D,EACAhB,CACJ,CAAC,EAGK4F,MAAc,gBACpB,IAAIC,IACOC,GAAe9F,EAAOqB,EAAO,QAAS,GAAGwE,CAAI,EAExD,CAAC,CAAC,EAmHF,GAjHAE,GAA0B,IAAI,CAC1BzE,EAAW,QAAUxB,EACrByB,GAAU,QAAUxB,EAGfkC,EAAcS,EAAU,IACzBgB,GAAa,QAAUhB,GAE/B,CAAC,EAEDqD,GAA0B,IAAI,CAC1B,GAAI,CAAC/E,EAAK,OACV,IAAMgF,EAAiB7B,GAAW,KAAKrF,GAAaE,EAAW,EAC3DiH,EAAyB,EACzBzE,EAAU,EAAE,oBAEZyE,EADgB,KAAK,IAAI,EACUzE,EAAU,EAAE,uBAsBnD,IAAM0E,GAAcC,GAAkBnF,EAAKL,EAlBtB,CAACyF,GAAM3B,GAAO,CAAC,IAAI,CACpC,GAAI2B,IAAQT,GAAiB,YAAa,CACtC,IAAMU,GAAM,KAAK,IAAI,EACjB7E,EAAU,EAAE,mBAAqB6E,GAAMJ,GAA0BxE,GAAS,IAC1EwE,EAAyBI,GAAM7E,EAAU,EAAE,sBAC3CwE,EAAe,EAEvB,SAAWI,IAAQT,GAAiB,gBAC5BnE,EAAU,EAAE,uBAAyBC,GAAS,GAC9CuE,EAAe,MAEhB,IAAII,IAAQT,GAAiB,aAChC,OAAOxB,GAAW,EACf,GAAIiC,IAAQT,GAAiB,uBAChC,OAAOxB,GAAWM,EAAI,EAG9B,CAC2E,EAE3E,OAAArD,EAAa,QAAU,GACvBC,EAAO,QAAUL,EACjBG,EAAkB,QAAU,GAE5BQ,GAAS,CACL,GAAIV,CACR,CAAC,EAEG8C,KAGKlD,EAAMG,CAAG,IACNiB,EAAce,EAAI,GAAKa,GAEvBmC,EAAe,EAIfM,GAAIN,CAAc,IAIvB,IAAI,CAEP5E,EAAa,QAAU,GACvB8E,GAAY,CAChB,CACJ,EAAG,CACClF,CACJ,CAAC,EAED+E,GAA0B,IAAI,CAC1B,IAAIQ,EACJ,SAASC,GAAO,CAGZ,IAAMC,GAAWjB,GAAalF,CAAe,EAAIA,EAAgBoB,GAAS,EAAE,IAAI,EAAIpB,EAIhFmG,IAAYF,IAAU,KACtBA,EAAQ,WAAWG,EAASD,EAAQ,EAE5C,CACA,SAASC,GAAU,CAGX,CAAChF,GAAS,EAAE,QAAUnB,GAAqBiB,EAAU,EAAE,UAAU,KAAOhB,GAAsBgB,EAAU,EAAE,SAAS,GACnH2C,GAAWnF,EAAW,EAAE,KAAKwH,CAAI,EAGjCA,EAAK,CAEb,CACA,OAAAA,EAAK,EACE,IAAI,CACHD,IACA,aAAaA,CAAK,EAClBA,EAAQ,GAEhB,CACJ,EAAG,CACCjG,EACAC,EACAC,EACAQ,CACJ,CAAC,KAED,kBAAcuB,EAAY,EAKtBrC,EAAU,CAIV,GAAI,CAAC0E,IAAmBf,IAAaF,GACjC,MAAM,IAAI,MAAM,uDAAuD,EAGvEA,KACArC,EAAW,QAAUxB,EACrByB,GAAU,QAAUxB,EACpBqB,EAAa,QAAU,IAE3B,IAAMuF,EAAM7F,EAAQE,CAAG,EACjB4F,EAAY,CAAC3E,EAAc0E,CAAG,GAAKhD,GAAkBiC,GAAYe,CAAG,EAAI1H,GAE9E,GADAF,GAAI6H,CAAS,EACT,CAAC3E,EAAcwB,EAAK,GAAKE,GACzB,MAAMF,GAEV,IAAMoD,EAAelD,GAAkBQ,GAAWnF,EAAW,EAAIC,GAC7D,CAACgD,EAAcM,EAAY,GAAKoB,KAEhCkD,EAAa,OAAS,YAEtBA,EAAa,MAAQ,IAEzB9H,GAAI8H,CAAY,CACpB,CAoBA,MAnBoB,CAChB,OAAQjB,GACR,IAAI,MAAQ,CACR,OAAA7D,GAAkB,KAAO,GAClBQ,EACX,EACA,IAAI,OAAS,CACT,OAAAR,GAAkB,MAAQ,GACnB0B,EACX,EACA,IAAI,cAAgB,CAChB,OAAA1B,GAAkB,aAAe,GAC1BkC,EACX,EACA,IAAI,WAAa,CACb,OAAAlC,GAAkB,UAAY,GACvBmC,EACX,CACJ,CAEJ,EACM9E,GAAY0H,GAAS,eAAe1H,GAAa,eAAgB,CACnE,MAAO2H,EACX,CAAC,EAgBS1H,GAAS2H,GAAS7H,EAAa,IC9rBzC,IAGA8H,GACOC,GAJPC,GAAAC,EAAA,kBAEAC,KACAJ,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAI,KAAK,OAAQ,CACrD,EAAG,yQACL,CAAC,EAAG,MAAM,ICNV,IAAAC,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAaA,SAASC,GAAY,CAAE,SAAAC,CAAS,EAAoB,CAClD,OAAO,GAAAC,QAAA,cAAC,eAAW,MAAO,CAAE,OAAQ,CAAE,GAAID,CAAS,CACrD,CACe,SAARF,GAA4B,CACjC,YAAAI,CACF,EAEG,CACD,OACE,GAAAD,QAAA,cAAC,WAAO,KAAI,GAAC,SAAS,KAAK,QAASC,EAAa,MAAM,QACrD,GAAAD,QAAA,cAAC,sBACC,GAAAA,QAAA,cAACF,GAAA,KAAY,sDAEX,GAAAE,QAAA,cAAC,UACC,GAAAA,QAAA,cAAC,UAAG,8JAIJ,EACA,GAAAA,QAAA,cAAC,UAAG,sJAIJ,EACA,GAAAA,QAAA,cAAC,UAAG,uNAKJ,EACA,GAAAA,QAAA,cAAC,UAAG,6NAKJ,EACA,GAAAA,QAAA,cAAC,UAAG,8PAKJ,CACF,CACF,EACA,GAAAA,QAAA,cAACF,GAAA,KAAY,kMAIb,CACF,EACA,GAAAE,QAAA,cAAC,eAAQ,EACT,GAAAA,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,WAAO,QAASC,EAAa,MAAM,WAAU,OAE9C,CACF,CACF,CAEJ,CAvEA,IAAAC,GAEAC,GACAC,GAHAC,GAAAC,EAAA,kBAAAJ,GAAkB,OAElBC,GAAuB,QACvBC,GAMO,SCTP,IAAAG,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,qCAAqC,ICArE,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,8BAA8B,ICA9D,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,iBAAiB,ICwBjD,eAAsBC,GAAgB,CACpC,OAAAC,EACA,YAAAC,CACF,EAGG,CACD,GAAM,CAAE,WAAAC,CAAW,EAAIF,EAAO,SAAS,UAAU,UAAU,QAC3D,QAAWG,KAAaD,EAKtB,MAAMF,EAAO,SAAS,UAAU,UAAU,2BACxCG,EAAU,WACV,CAAE,MAAOF,CAA8C,CACzD,CAEJ,CA1CA,IASaG,GAaAC,GAtBbC,GAAAC,EAAA,kBASaH,GAAgB,CAC3B,CAAE,MAAO,UAAW,MAAO,yBAA0B,EACrD,CAAE,MAAO,mBAAoB,MAAO,8BAA+B,EACnE,CAAE,MAAO,WAAY,MAAO,OAAQ,EACpC,CAAE,MAAO,sBAAuB,MAAO,qBAAsB,EAC7D,CAAE,MAAO,iBAAkB,MAAO,iCAAkC,EACpE,CAAE,MAAO,eAAgB,MAAO,cAAe,EAC/C,CAAE,MAAO,cAAe,MAAO,wBAAyB,EACxD,CAAE,MAAO,gBAAiB,MAAO,eAAgB,CACnD,EAIaC,GAAsBD,GAAc,IAAII,GAAKA,EAAE,KAAK,ICXjE,SAASC,GAAUC,EAAuB,CACxCA,EAAO,SAAS,cAAc,eAAe,gBAAgB,EAC7DA,EAAO,SAAS,cAAc,YAAY,YAAY,CACxD,CAEA,SAASC,GACPD,EACAE,EACAC,EACA,CACIA,IAAS,aACXH,EAAO,SAAS,cAAc,eAAe,gBAAgB,EAC7DA,EAAO,SAAS,cAAc,eAAe,UAAU,CAAE,KAAAE,CAAK,CAAC,IAE/DF,EAAO,SAAS,cAAc,YAAY,YAAY,EACtDA,EAAO,SAAS,cAAc,YAAY,OAAO,CAAE,KAAAE,CAAK,CAAC,EAE7D,CAEA,eAAsBE,GAA+B,CACnD,UAAAC,EACA,SAAAC,EACA,OAAAN,EACA,KAAAG,CACF,EAKG,CACD,GAAIA,IAAS,SAAWG,EAAS,SAAW,EAAG,CAC7CP,GAAUC,CAAM,EAChB,MACF,CAEA,GAAM,CAAE,mBAAAO,EAAoB,OAAAC,CAAO,EAAI,MAAMC,GAAY,EAEnDC,EAAMF,EAAO,sBACjBG,GACEA,EAAE,OAAO,UAAU,WAAW,CAC5B,eAAgBA,EAAE,KAAK,MAAM,GAC3BL,EAAS,IAAIM,GACXD,EAAE,KAAK,IAAI,GAAG,CACZA,EAAE,OAAO,aAAa,eAAe,aAAa,EAClDC,CACF,CAAC,CACH,CACF,EACA,WAAYD,EAAE,OAAO,aAAa,eAAe,WAAW,CAC9D,CAAC,EACHN,CACF,EAEMH,EAAOK,EAAmB,sBAAsBG,CAAG,EACzDT,GAAUD,EAAQE,EAAMC,CAAI,CAC9B,CAEA,eAAsBU,GAAuB,CAC3C,UAAAR,EACA,aAAAS,EACA,WAAAC,EACA,OAAAf,EACA,KAAAG,CACF,EAMG,CACD,GAAIA,IAAS,QAAS,CACpBJ,GAAUC,CAAM,EAChB,MACF,CAEA,GAAM,CAAE,mBAAAO,EAAoB,OAAAC,CAAO,EAAI,MAAMC,GAAY,EACnDC,EAAMF,EAAO,sBACjBG,GACEA,EAAE,OAAO,UAAU,WAAW,CAC5B,eAAgBA,EAAE,KAAK,MAAM,IAAI,CAC/BA,EAAE,KAAK,IAAI,IAAI,CACbA,EAAE,OAAO,aAAa,eAAe,aAAa,EAClDG,CACF,CAAC,EACDH,EAAE,KAAK,IAAI,IAAI,CACbA,EAAE,OAAO,aAAa,eAAe,aAAa,EAClDI,CACF,CAAC,CACH,CAAC,EACD,WAAYJ,EAAE,OAAO,aAAa,eAAe,WAAW,CAC9D,CAAC,EACHN,CACF,EAEMH,EAAOK,EAAmB,sBAAsBG,CAAG,EACzDT,GAAUD,EAAQE,EAAMC,CAAI,CAC9B,CAEA,eAAsBa,GAA6B,CACjD,UAAAX,EACA,gBAAAY,EACA,OAAAjB,EACA,KAAAG,CACF,EAKG,CACD,GAAIA,IAAS,QAAS,CACpBJ,GAAUC,CAAM,EAChB,MACF,CAEA,GAAM,CAAE,mBAAAO,CAAmB,EAAI,MAAME,GAAY,EAC3CC,EAAM,MAAMQ,GAA6B,CAC7C,UAAAb,EACA,gBAAiBY,EAAkB,CACrC,CAAC,EACKf,EAAOK,EAAmB,sBAAsBG,CAAG,EACzDT,GAAUD,EAAQE,EAAMC,CAAI,CAC9B,CApIA,IAAAgB,GAAAC,EAAA,kBAAAC,KACAC,OCDA,IAQaC,GACAC,GACAC,GACAC,GAXbC,GAAAC,EAAA,kBAQaL,GAAqB,2BACrBC,GAAkB,iBAClBC,GAAiB,kBACjBC,GAAoB,SCNjC,eAAOG,GAA6C,CAClD,UAAAC,EACA,aAAAC,EACA,WAAAC,EACA,OAAAC,CACF,EAKG,CACD,MAAMC,GAAuB,CAC3B,UAAAJ,EACA,aAAAC,EACA,WAAAC,EACA,OAAAC,EACA,KAAM,WACR,CAAC,CACH,CAEA,eAAsBE,GAAmB,CACvC,UAAAL,EACA,aAAAC,EACA,WAAAC,EACA,OAAAC,CACF,EAKG,CACD,MAAMC,GAAuB,CAC3B,UAAAJ,EACA,aAAAC,EACA,WAAAC,EACA,OAAAC,EACA,KAAM,QACR,CAAC,CACH,CA3CA,IAAAG,GAAAC,EAAA,kBAAAC,OCoCO,SAASC,GAAuB,CACrC,MAAAC,EACA,gBAAAC,CACF,EAGG,CACD,GAAM,CACJ,6BAAAC,EACA,kBAAAC,EACA,oCAAAC,CACF,EAAIJ,EAEJ,GAAI,CAACE,GAAgC,CAACC,EACpC,OAGF,GAAM,CAAE,IAAAE,EAAK,OAAAC,CAAO,EAAIJ,EAClBK,EAAgBH,IAAsCH,CAAe,EAE3E,GAAIM,IAAkB,OAItB,OAAOC,GAAcH,EAAKE,EAAeD,CAAM,CACjD,CAMO,SAASG,GAA4B,CAC1C,MAAAT,EACA,gBAAAC,EACA,mBAAAS,CACF,EAIG,CACD,IAAIC,EACAC,EACJ,QAASC,EAAMZ,EAAiBY,EAAMH,EAAoBG,IAAO,CAC/D,IAAMC,EAASf,GAAuB,CAAE,gBAAiBc,EAAK,MAAAb,CAAM,CAAC,EACrE,GAAIc,EAAQ,CACV,GAAM,CAACC,EAAGC,CAAC,EAAIF,GACXH,IAAa,QAAaI,EAAIJ,KAChCA,EAAWI,IAETH,IAAW,QAAaI,EAAIJ,KAC9BA,EAASI,EAEb,CACF,CACA,GAAIL,IAAa,QAAaC,IAAW,OACvC,MAAO,CAACD,EAAUC,CAAM,CAG5B,CAEA,eAAsBK,GAA0B,CAC9C,MAAAjB,EACA,gBAAAC,EACA,mBAAAS,EACA,gBAAAQ,CACF,EAKG,CACD,IAAMC,KAAU,eAAWnB,CAAK,EAC1B,CAAE,cAAAoB,EAAe,6BAAAlB,CAA6B,EAAIF,EACxD,GAAI,CAACE,GAAgC,CAACkB,EACpC,OAEF,GAAM,CAAE,OAAAd,EAAQ,QAAAe,CAAQ,EAAInB,EACtBoB,EAAeF,EAAc,cAAc,CAAC,EAClD,GAAI,CAACE,EACH,OAGF,IAAMR,EACJJ,IAAuB,OACnBD,GAA4B,CAC1B,gBAAAR,EACA,mBAAAS,EACA,MAAAV,CACF,CAAC,EACDD,GAAuB,CAAE,gBAAAE,EAAiB,MAAAD,CAAM,CAAC,EAEvD,GAAI,CAACc,EACH,OAEF,GAAM,CAACS,EAAOC,CAAG,EAAIV,EAErB,GAAII,EACF,MAAME,EAAc,eAClB,GAAGC,CAAO,IAAIE,CAAK,IAAIC,CAAG,GAAGlB,IAAW,GAAK,QAAU,EAAE,GACzD,OACA,EACF,MACK,CACL,GAAM,CAAE,gBAAAmB,CAAgB,EAAIN,EAEtBO,EADWD,EAAgB,IAAIH,CAAY,GACd,oBAAoBD,CAAO,GAAKA,EACnED,EAAc,SAASG,EAAOG,CAAgB,CAChD,CACF,CAEA,eAAsBC,GAAqB,CACzC,MAAA3B,EACA,gBAAAC,EACA,mBAAAS,CACF,EAIG,CACDV,EAAM,yBAAyB,CAC7B,MAAOC,EACP,IAAKS,GAAsBT,EAAkB,CAC/C,CAAC,EACD,MAAMgB,GAA0B,CAC9B,MAAAjB,EACA,gBAAAC,EACA,mBAAAS,EACA,gBAAiBV,EAAM,eACzB,CAAC,CACH,CArKA,IAAA4B,GAAAC,GAAAC,EAAA,kBAAAF,GAA2B,QAC3BG,OC4BO,SAASC,GAAoBC,EAAqC,CACvE,OAAO,MAAM,KAAKA,EAAKC,GAAMC,GAAeD,CAAE,CAAC,CACjD,CAOO,SAASE,GAAWC,EAAuB,CAChD,OAAOA,EAAQ,EACX,UACAA,GAAS,GACP,UACAA,GAAS,GACP,UACAA,GAAS,GACP,UACA,SACZ,CAMO,SAASC,GAAoBD,EAAuB,CACzD,IAAM,EAAI,KAAK,IACb,EACA,KAAK,IACH,GACCA,EAAQE,KAAuBC,GAAqBD,GACvD,CACF,EAEME,EAAI,KAAK,MAAM,GAAM,IAAY,CAAC,EAClCC,EAAI,KAAK,MAAM,IAAO,GAAa,CAAC,EACpCC,EAAI,KAAK,MAAM,IAAO,KAAY,CAAC,EACzC,MAAO,OAAOF,CAAC,KAAKC,CAAC,KAAKC,CAAC,GAC7B,CAOO,SAASC,GACdC,EACAC,EACkC,CAClC,OAAOA,EACHD,EAAO,QAAQ,CAACE,EAAOC,IAAiB,CACtC,IAAMC,EAAMH,EAAgCE,CAAY,EACxD,OAAOD,IAAU,QAAaE,IAAQ,OAAY,CAAC,CAAE,IAAAA,EAAK,MAAAF,CAAM,CAAC,EAAI,CAAC,CACxE,CAAC,EACD,CAAC,CACP,CApFA,IAGMZ,GAuBOI,GACAC,GA3BbU,GAAAC,EAAA,kBAGMhB,GAAyC,CAC7C,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,IACL,EAEaI,GAAqB,KACrBC,GAAqB,MC3BlC,IAAAY,GAEAC,GAUAC,GAIMC,GAkFCC,GAlGPC,GAAAC,EAAA,kBAAAN,GAAgC,OAEhCC,GAQO,OACPM,KACAL,GAAyB,OAInBC,MAAwB,aAAS,SAA+B,CACpE,MAAAK,CACF,EAEG,CACD,GAAM,CAACC,EAAWC,CAAY,KAAI,aAAS,EAAE,EACvC,CAACC,EAAYC,CAAa,KAAI,aAAiB,EAC/C,CAAE,0BAAAC,EAA2B,iBAAAC,CAAiB,EAAIN,EAElDO,EAAc,IAAM,CACxBL,EAAa,EAAE,EACfE,EAAc,MAAS,EACvBJ,EAAM,6BAA6B,EAAK,CAC1C,EAEMQ,EAAc,IAAM,CACxB,GAAKP,EAAU,KAAK,EAGpB,GAAI,CACF,IAAMQ,EAASC,GAAcT,EAAU,KAAK,CAAC,EAC7C,GAAI,CAACK,EAAkB,CACrBF,EAAc,2CAA2C,EACzD,MACF,CACAE,EAAiB,aAAaG,CAAM,EACpCF,EAAY,CACd,OAASI,EAAG,CACVP,EAAc,8BAA8BO,CAAC,EAAE,CACjD,CACF,EAEA,OAAKN,EAKH,GAAAO,QAAA,cAAC,WAAO,KAAI,GAAC,QAASL,EAAa,SAAS,KAAK,UAAS,IACxD,GAAAK,QAAA,cAAC,oBAAY,yBAAuB,EACpC,GAAAA,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,iBAAiB,GAAI,CAAE,GAAI,CAAE,GAAG,uIAGlE,EACA,GAAAA,QAAA,cAAC,cACC,UAAS,GACT,KAAM,GACN,UAAS,GACT,YAAa;AAAA;AAAA;AAAA,mDAIb,MAAOX,EACP,SAAUU,GAAK,CACbT,EAAaS,EAAE,OAAO,KAAK,EAC3BP,EAAc,MAAS,CACzB,EACA,UAAW,CACT,UAAW,CAAE,MAAO,CAAE,WAAY,YAAa,SAAU,EAAG,CAAE,CAChE,EACF,EACCD,EACC,GAAAS,QAAA,cAAC,eAAW,MAAM,QAAQ,QAAQ,QAAQ,GAAI,CAAE,GAAI,CAAE,GACnDT,CACH,EACE,IACN,EACA,GAAAS,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,WAAO,QAASL,GAAa,QAAM,EACpC,GAAAK,QAAA,cAAC,WACC,QAASJ,EACT,QAAQ,YACR,MAAM,UACN,SAAU,CAACP,EAAU,KAAK,GAC3B,iBAED,CACF,CACF,EA7CO,IA+CX,CAAC,EAEML,GAAQD,KClGf,IAGAkB,GACOC,GAJPC,GAAAC,EAAA,kBAEAC,KACAJ,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAI,KAAK,OAAQ,CACrD,EAAG,4GACL,CAAC,EAAG,MAAM,ICNV,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,wBAAwB,ICAxD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,0BAA0B,ICA1D,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,4BAA4B,ICA5D,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,4BAA4B,ICA5D,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,oBAAoB,ICApD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,wBAAwB,ICAxD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,yBAAyB,ICAzD,IAAAC,GAAAC,EAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,eAAe,uBAAuB,ICAvD,IAAAC,EAEAC,GACAC,EAaAC,GASMC,GA0KCC,GAnMPC,GAAAC,EAAA,kBAAAP,EAAgC,OAEhCC,GAA6B,QAC7BC,EAYO,OACPC,GAAyB,OAEzBK,KAOMJ,MAAqB,aAAS,SAA4B,CAC9D,MAAAK,CACF,EAEG,CACD,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAe,EACjC,CAACC,EAAOC,CAAQ,KAAI,YAAS,EAAE,EAC/B,CAACC,EAAWC,CAAY,KAAI,YAAS,EAAE,EACvC,CAACC,EAAQC,CAAS,KAAI,YAAS,KAAK,EACpC,CAACC,EAAcC,CAAe,KAAI,YAAS,EAAE,EAC7C,CAACC,EAAOC,CAAQ,KAAI,YAAkB,EACtC,CAAE,uBAAAC,CAAuB,EAAIb,EAE7Bc,EAAc,IAAM,CACxBZ,EAAQ,MAAS,EACjBE,EAAS,EAAE,EACXE,EAAa,EAAE,EACfI,EAAgB,EAAE,EAClBE,EAAS,MAAS,EAClBZ,EAAM,0BAA0B,EAAK,CACvC,EAEMe,EAAY,SAAY,CAC5B,GAAI,CACF,IAAIC,EACAC,EAEAV,IAAW,OAASJ,EACtBa,EAAME,GAAmBf,CAAK,EACrBI,IAAW,WAAaF,EACjCW,EAAMG,GAAyBd,EAAU,YAAY,CAAC,EAC7CE,IAAW,OAASE,EAC7BO,EAAMP,EACGF,IAAW,QAAUN,IAC9BgB,EAAO,MAAMhB,EAAK,KAAK,IAGrBe,IAAQ,QAAaC,IAAS,UAChC,MAAMjB,EAAM,yBAAyB,CAAE,IAAAgB,EAAK,KAAAC,CAAK,CAAC,EAClDH,EAAY,EAEhB,OAASM,EAAG,CACV,QAAQ,MAAMA,CAAC,EACfR,EAASQ,CAAC,CACZ,CACF,EAEA,GAAI,CAACP,EACH,OAAO,KAGT,IAAMQ,EACHd,IAAW,OAASE,IAAiB,IACrCF,IAAW,QAAUN,IAAS,QAC9BM,IAAW,OAASJ,IAAU,IAC9BI,IAAW,WAAaF,IAAc,GAEzC,OACE,EAAAiB,QAAA,cAAC,UAAO,KAAI,GAAC,QAASR,EAAa,SAAS,KAAK,UAAS,IACxD,EAAAQ,QAAA,cAAC,mBAAY,eAAa,EAC1B,EAAAA,QAAA,cAAC,qBACEX,EAAQ,EAAAW,QAAA,cAAC,iBAAa,MAAOX,EAAO,EAAK,KAC1C,EAAAW,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,iBAAiB,GAAI,CAAE,GAAI,CAAE,GAAG,kEAElE,EAEA,EAAAA,QAAA,cAAC,eAAY,UAAU,WAAW,GAAI,CAAE,GAAI,CAAE,GAC5C,EAAAA,QAAA,cAAC,cACC,MAAOf,EACP,SAAUgB,GAAS,CACjBf,EAAUe,EAAM,OAAO,KAAK,CAC9B,GAEA,EAAAD,QAAA,cAAC,oBAAiB,MAAM,MAAM,QAAS,EAAAA,QAAA,cAAC,YAAM,EAAI,MAAM,SAAS,EACjE,EAAAA,QAAA,cAAC,oBACC,MAAM,UACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,yBACR,EACA,EAAAA,QAAA,cAAC,oBAAiB,MAAM,MAAM,QAAS,EAAAA,QAAA,cAAC,YAAM,EAAI,MAAM,MAAM,EAC9D,EAAAA,QAAA,cAAC,oBAAiB,MAAM,OAAO,QAAS,EAAAA,QAAA,cAAC,YAAM,EAAI,MAAM,OAAO,CAClE,CACF,EAECf,IAAW,MACV,EAAAe,QAAA,cAAC,aACC,UAAS,GACT,MAAOnB,EACP,SAAUoB,GAAS,CACjBnB,EAASmB,EAAM,OAAO,MAAM,YAAY,CAAC,CAC3C,EACA,MAAM,qBACN,YAAY,eACZ,GAAI,CAAE,GAAI,CAAE,EACd,EACE,KAEHhB,IAAW,UACV,EAAAe,QAAA,cAAC,aACC,UAAS,GACT,MAAOjB,EACP,SAAUkB,GAAS,CACjBjB,EAAaiB,EAAM,OAAO,MAAM,YAAY,CAAC,CAC/C,EACA,MAAM,2BACN,YAAY,mBACZ,WAAW,kDACX,GAAI,CAAE,GAAI,CAAE,EACd,EACE,KAEHhB,IAAW,MACV,EAAAe,QAAA,cAAC,aACC,UAAS,GACT,MAAM,gBACN,MAAOb,EACP,SAAUc,GAAS,CACjBb,EAAgBa,EAAM,OAAO,KAAK,CACpC,EACA,YAAY,2CACZ,GAAI,CAAE,GAAI,CAAE,EACd,EACE,KAEHhB,IAAW,OACV,EAAAe,QAAA,cAAC,OAAI,MAAO,CAAE,aAAc,EAAG,GAC7B,EAAAA,QAAA,cAAC,UAAO,QAAQ,WAAW,UAAU,SAClCrB,EAAOA,EAAK,KAAO,cACpB,EAAAqB,QAAA,cAAC,SACC,KAAK,OACL,OAAM,GACN,OAAO,wBACP,SAAU,CAAC,CAAE,OAAAE,CAAO,IAAM,CACxB,IAAMC,EAAID,EAAO,QAAQ,CAAC,EACtBC,GACFvB,EAAQuB,CAAC,CAEb,EACF,CACF,EACCxB,EACC,EAAAqB,QAAA,cAAC,cAAW,QAAQ,QAAQ,GAAI,CAAE,GAAI,CAAE,GAAG,aAC9BrB,EAAK,IAClB,EACE,IACN,EACE,KAEJ,EAAAqB,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,iBAAiB,GAAI,CAAE,GAAI,CAAE,GAAG,qIAGlE,CACF,EACA,EAAAA,QAAA,cAAC,qBACC,EAAAA,QAAA,cAAC,UAAO,QAASR,GAAa,QAAM,EACpC,EAAAQ,QAAA,cAAC,UACC,QAAS,IAAM,CACRP,EAAU,CACjB,EACA,QAAQ,YACR,MAAM,UACN,SAAU,CAACM,GACZ,eAED,CACF,CACF,CAEJ,CAAC,EAEMzB,GAAQD,KCnMf,IAAA+B,GAEAC,GAOMC,GA8BCC,GAvCPC,GAAAC,EAAA,kBAAAL,GAAkB,OAElBC,GAAyB,OAOnBC,MAAsB,aAAS,SAA6B,CAChE,MAAAI,CACF,EAEG,CACD,GAAM,CAAE,WAAAC,CAAW,EAAID,EACjBE,EAAYD,EACf,IACEE,GAAkDA,EAAU,WAC/D,EACC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,OACE,GAAAC,QAAA,cAAC,OACC,MAAO,CACL,KAAM,EACN,SAAU,EACV,WAAY,SACZ,SAAU,SACV,aAAc,WACd,SAAU,EACZ,EACA,MAAOF,GAGNA,EAAY,UAAUA,CAAS,GAAK,MACvC,CAEJ,CAAC,EAEML,GAAQD,KCvCf,IAAAS,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAOA,SAASC,GAAY,CAAE,SAAAC,CAAS,EAAoB,CAClD,OACE,GAAAC,QAAA,cAAC,eACC,MAAO,CACL,OAAQ,EACR,aAAc,EAChB,GAECD,CACH,CAEJ,CACe,SAARF,GAA4C,CACjD,YAAAI,CACF,EAEG,CACD,OACE,GAAAD,QAAA,cAAC,WAAO,KAAI,GAAC,SAAS,KAAK,QAASC,EAAa,MAAM,qBACrD,GAAAD,QAAA,cAAC,sBACC,GAAAA,QAAA,cAACF,GAAA,KAAY,iUAMb,EACA,GAAAE,QAAA,cAACF,GAAA,KAAY,qNAKb,EACA,GAAAE,QAAA,cAACF,GAAA,KAAY,uKAIb,CACF,EACA,GAAAE,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,WACC,QAAS,IAAM,CACbC,EAAY,CACd,EACA,QAAQ,YACR,MAAM,WACP,OAED,CACF,CACF,CAEJ,CA3DA,IAAAC,GAEAC,GACAC,GAHAC,GAAAC,EAAA,kBAAAJ,GAAkB,OAElBC,GAAuB,QACvBC,GAAiE,SCWlD,SAARG,GAA4C,CACjD,MAAAC,CACF,EAEG,CACD,OACE,GAAAC,QAAA,cAAC,eACC,MAAO,CAAE,MAAO,OAAQ,EACxB,QAAS,IAAM,IACb,eAAWD,CAAK,EAAE,YAAYE,GAAe,CAC3CC,GACA,CAAE,YAAAD,CAAY,CAChB,CAAC,CACH,GAEA,GAAAD,QAAA,cAACG,GAAA,IAAK,CACR,CAEJ,CAhCA,IAAAC,GAEAC,GAEAC,GAMMJ,GAVNK,GAAAC,EAAA,kBAAAJ,GAA4B,OAE5BC,GAA2B,QAC3BI,KACAH,GAA2B,OAMrBJ,MAA6B,SACjC,IAAM,qCACR,ICqCO,SAASQ,GAAgBC,EAAc,CAC5C,OAAOC,GAAcD,CAAI,GAAK,SAChC,CAEA,eAAeE,GAAqBC,EAAwC,CAC1E,IAAMC,EAAM,MAAM,MAAMD,CAAG,EAC3B,GAAI,CAACC,EAAI,GACP,MAAM,IAAI,MAAM,QAAQA,EAAI,MAAM,aAAaD,CAAG,EAAE,EAEtD,IAAME,EAAO,MAAMD,EAAI,KAAK,EAEtBE,EAA6B,CAAC,EACpC,QAAWC,KAAQF,EAAK,MAAM;AAAA,CAAI,EAAG,CACnC,GAAIE,EAAK,WAAW,GAAG,GAAK,CAACA,EAAK,KAAK,EACrC,SAEF,IAAMC,EAAQD,EAAK,MAAM,GAAI,EAC7B,GAAIC,EAAM,OAAS,EACjB,SAEF,IAAMR,EAAOQ,EAAM,CAAC,EACdC,EAAQ,OAAO,SAASD,EAAM,CAAC,GAAK,IAAK,EAAE,EAC3CE,EAAM,OAAO,SAASF,EAAM,CAAC,GAAK,IAAK,EAAE,EACzCG,EAAaH,EAAM,CAAC,GAAK,GAE3BI,EAAc,GACdC,EACJ,QAAWC,KAAQH,EAAW,MAAM,GAAG,EAAG,CACxC,GAAM,CAACI,EAAKC,CAAK,EAAIF,EAAK,MAAM,GAAG,EAC/BC,IAAQ,OACVH,EAAc,mBAAmBI,GAAS,EAAE,EACnCD,IAAQ,OACjBF,EAAKG,EAET,CAEA,GAAIhB,EAAM,CACR,IAAMiB,EAAW,GAAGjB,CAAI,IAAIS,CAAK,IAAIC,CAAG,IAAIJ,EAAS,MAAM,GAC3DA,EAAS,KAAK,CACZ,KAAAN,EACA,MAAAS,EACA,IAAAC,EACA,YAAAE,EACA,GAAAC,EACA,SAAAI,CACF,CAAC,CACH,CACF,CAEA,OAAOX,CACT,CAEe,SAARY,GAAoCC,EAA+B,CACxE,GAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,UAAAC,CAAU,EAAIC,GACjCJ,EAAY,sCAAsCA,CAAS,OAAS,KACpEjB,EACF,EAEA,MAAO,CACL,SAAUkB,EACV,MAAAC,EACA,UAAAC,CACF,CACF,CAhHA,IAWMrB,GAXNuB,GAAAC,EAAA,kBAAAC,KAWMzB,GAAwC,CAC5C,OAAQ,UACR,cAAe,UACf,OAAQ,UACR,cAAe,UACf,cAAe,UACf,MAAO,UACP,qBAAsB,UACtB,OAAQ,UACR,cAAe,UACf,cAAe,UACf,qBAAsB,UACtB,OAAQ,UACR,iBAAkB,UAClB,WAAY,UACZ,kBAAmB,UACnB,MAAO,UACP,iBAAkB,UAClB,cAAe,UACf,eAAgB,UAChB,KAAM,UACN,mBAAoB,UACpB,cAAe,UACf,WAAY,UACZ,aAAc,UACd,uBAAwB,UACxB,kBAAmB,UACnB,YAAa,UACb,oBAAqB,UACrB,MAAO,UACP,cAAe,UACf,KAAM,UACN,uBAAwB,UACxB,QAAS,UACT,kBAAmB,UACnB,qBAAsB,SACxB,IClCA,SAAS0B,GACPC,EACAC,EACA,CACA,IAAMC,EAAoBD,IAAkCD,EAAQ,MAAQ,CAAC,EACvEG,EAAkBF,IAAkCD,EAAQ,IAAM,CAAC,EACzE,OAAOE,IAAsB,QAAaC,IAAoB,OAC1D,CAAE,MAAOD,EAAmB,IAAKC,CAAgB,EACjD,MACN,CAEA,SAASC,GACPJ,EACAC,EACA,CACA,IAAMI,EACJJ,IAAkCD,EAAQ,MAAQ,CAAC,GAAKA,EAAQ,MAAQ,EACpEM,EACJL,IAAkCD,EAAQ,IAAM,CAAC,GAAKA,EAAQ,IAAM,EACtE,MAAO,CACL,KAAMK,EAAc,EACpB,MAAO,KAAK,KAAKC,EAAYD,EAAc,GAAK,EAAY,CAAC,CAC/D,CACF,CAEA,SAASE,GAAsB,CAAE,QAAAP,CAAQ,EAAgC,CACvE,OACE,GAAAQ,QAAA,cAAC,WACC,GAAAA,QAAA,cAAC,WACC,GAAAA,QAAA,cAAC,cAAQR,EAAQ,IAAK,CACxB,EACA,GAAAQ,QAAA,cAAC,WAAI,aACQR,EAAQ,MAAM,IAAEA,EAAQ,GACrC,EACCA,EAAQ,YAAc,GAAAQ,QAAA,cAAC,WAAKR,EAAQ,WAAY,EAAS,IAC5D,CAEJ,CAlDA,IAAAS,GAEAC,GACAC,GAiDMC,GA2GCC,GA/JPC,GAAAC,EAAA,kBAAAN,GAAgC,OAEhCC,GAAwB,OACxBC,GAAyB,OAEzBK,KACAC,KACAC,KACAC,KA4CMP,MAAa,aAAS,SAAoB,CAC9C,QAAAZ,EACA,MAAAoB,CACF,EAGG,CACD,GAAM,CAACC,EAAWC,CAAY,KAAI,aAAS,EAAK,EAC1C,CACJ,qBAAAC,EACA,kBAAAC,EACA,gCAAAvB,CACF,EAAImB,EACEK,EAAaD,IAAsBxB,EAAQ,SAE3C0B,EAAmB,IAAM,CAC7BJ,EAAa,EAAI,EACjB,IAAMK,EAAQ5B,GACZC,EACAC,CACF,EACI0B,GACFP,EAAM,uBAAuBO,CAAK,CAEtC,EAEMC,EAAmB,IAAM,CAC7BN,EAAa,EAAK,EAClBF,EAAM,uBAAuB,MAAS,CACxC,EAEMS,EAAc,IAAM,CACxB,IAAMC,EAAYV,EAAM,iBAClBW,EAAc,CAACN,EAEjBK,GAAaP,IACXQ,EACFC,GAAmB,CACjB,UAAAF,EACA,aAAc9B,EAAQ,MACtB,WAAYA,EAAQ,IACpB,OAAQuB,CACV,CAAC,EAAE,MAAOU,GAAe,CACvB,QAAQ,MAAMA,CAAC,EACfb,EAAM,SAASa,CAAC,CAClB,CAAC,EAEDV,EAAqB,SAAS,cAAc,YAAY,YAAY,GAIpEQ,GACFX,EAAM,qBAAqBpB,EAAQ,QAAQ,EAC3CkC,GAAqB,CACnB,MAAAd,EACA,gBAAiBpB,EAAQ,MAAQ,EACjC,mBAAoBA,EAAQ,GAC9B,CAAC,EAAE,MAAOiC,GAAe,CACvB,QAAQ,MAAMA,CAAC,EACfb,EAAM,SAASa,CAAC,CAClB,CAAC,IAEDb,EAAM,qBAAqB,MAAS,EACpCA,EAAM,yBAAyB,MAAS,EAE5C,EAEM,CAAE,KAAAe,EAAM,MAAAC,CAAM,EAAIhC,GACtBJ,EACAC,CACF,EACMoC,EAAQC,GAAgBtC,EAAQ,IAAI,EAE1C,OACE,GAAAQ,QAAA,cAAC,YAAQ,MAAO,GAAAA,QAAA,cAACD,GAAA,CAAsB,QAASP,EAAS,EAAI,aAAY,IACvE,GAAAQ,QAAA,cAAC,OACC,QAAS,IAAM,CACbqB,EAAY,CACd,EACA,aAAc,IAAM,CAClBH,EAAiB,CACnB,EACA,aAAc,IAAM,CAClBE,EAAiB,CACnB,EACA,MAAO,CACL,SAAU,WACV,KAAAO,EACA,IAAK,EACL,MAAAC,EACA,OAAQhB,EAAM,YACd,gBAAiBiB,EACjB,QAAShB,GAAaI,EAAa,GAAM,GACzC,OAAQ,UACR,aAAc,EACd,OAAQA,EACJc,GACAlB,EACEmB,GACA,OACN,UAAW,YACb,EACF,CACF,CAEJ,CAAC,EAEM3B,GAAQD,KC/Jf,IAAA6B,GAEAC,GACAC,GAMMC,GAoDCC,GA7DPC,GAAAC,EAAA,kBAAAN,GAAkB,OAElBC,GAAwB,OACxBC,GAAyB,OAEzBK,KAIMJ,MAAmB,aAAS,SAA0B,CAC1D,KAAAK,EACA,WAAAC,EACA,MAAAC,CACF,EAIG,CACD,OACE,GAAAC,QAAA,cAAC,YAAQ,MAAOH,EAAM,UAAU,QAC9B,GAAAG,QAAA,cAAC,OACC,MAAO,CACL,OAAQD,EAAM,YAAcA,EAAM,SAClC,MAAOD,EAAa,EACpB,SAAU,EACV,WAAY,YACZ,UAAW,QACX,aAAc,EACd,SAAU,SACV,aAAc,WACd,WAAY,SACZ,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,IAAK,CACP,GAEA,GAAAE,QAAA,cAAC,QACC,QAASC,GAAK,CACZA,EAAE,gBAAgB,EAClBF,EAAM,gBAAgBF,CAAI,CAC5B,EACA,MAAO,CACL,OAAQ,UACR,MAAOK,GACP,WAAY,OACZ,SAAU,EACV,WAAY,CACd,EACA,MAAO,QAAQL,CAAI,UACpB,GAED,EACA,GAAAG,QAAA,cAAC,QAAK,MAAO,CAAE,SAAU,SAAU,aAAc,UAAW,GACzDH,CACH,CACF,CACF,CAEJ,CAAC,EAEMJ,GAAQD,KC7Df,IAAAW,GAEAC,GAMMC,GA2BCC,GAnCPC,GAAAC,EAAA,kBAAAL,GAAkB,OAElBC,GAAyB,OAEzBK,KAIMJ,MAAc,aAAS,SAAqB,CAChD,MAAAK,CACF,EAEG,CACD,GAAM,CAAE,kBAAAC,CAAkB,EAAID,EAE9B,OAAIC,IAAsB,OACjB,KAIP,GAAAC,QAAA,cAAC,OACC,MAAO,CACL,SAAU,WACV,KAAMD,EAAoB,EAC1B,IAAK,EACL,OAAQ,EACR,MAAO,EACP,gBAAiBE,GACjB,cAAe,OACf,OAAQ,EACV,EACF,CAEJ,CAAC,EAEMP,GAAQD,KCtBf,SAASS,GACPC,EACAC,EACA,CACA,OAAOD,EAAa,OAAOE,GAAQ,CAACD,EAAmB,IAAIC,CAAI,CAAC,CAClE,CAlBA,IAAAC,GAEAC,GAkBMC,GA0BOC,GA2BAC,GAzEbC,GAAAC,EAAA,kBAAAN,GAAkB,OAElBC,GAAyB,OAEzBM,KACAC,KACAC,KACAC,KAaMR,MAA0B,aAAS,SAAiC,CACxE,SAAAS,EACA,MAAAC,EACA,eAAAC,CACF,EAIG,CACD,OACE,GAAAC,QAAA,cAAC,OACC,MAAO,CACL,SAAU,WACV,OAAQF,EAAM,YACd,MAAOC,EAAiB,EACxB,aAAcD,EAAM,QACtB,GAECD,EAAS,IAAII,GACZ,GAAAD,QAAA,cAACE,GAAA,CAAW,IAAKD,EAAQ,SAAU,QAASA,EAAS,MAAOH,EAAO,CACpE,EACD,GAAAE,QAAA,cAACG,GAAA,CAAY,MAAOL,EAAO,CAC7B,CAEJ,CAAC,EAEYT,MAA4B,aACvC,SAAmC,CACjC,KAAAe,EACA,WAAAC,EACA,MAAAP,CACF,EAIG,CACD,GAAM,CAAE,mBAAAd,CAAmB,EAAIc,EACzBQ,EAAexB,GAAgBsB,EAAK,aAAcpB,CAAkB,EAC1E,OACE,GAAAgB,QAAA,iBAAAA,QAAA,cACGM,EAAa,IAAIrB,GAChB,GAAAe,QAAA,cAACO,GAAA,CACC,IAAKtB,EACL,KAAMA,EACN,WAAYoB,EACZ,MAAOP,EACT,CACD,CACH,CAEJ,CACF,EAEaR,MAA6B,aACxC,SAAoC,CAClC,KAAAc,EACA,MAAAN,CACF,EAGG,CACD,GAAM,CAAE,mBAAAd,CAAmB,EAAIc,EACzBQ,EAAexB,GAAgBsB,EAAK,aAAcpB,CAAkB,EAE1E,OACE,GAAAgB,QAAA,cAAC,OACC,YAAcQ,GAAwC,CACpD,IAAMC,EAAOD,EAAE,cAAc,sBAAsB,EAC7CE,EAAIF,EAAE,QAAUC,EAAK,KACrBE,EAAe,KAAK,MAAMD,EAAI,CAAU,EAC1CC,GAAgB,GAAKA,EAAeP,EAAK,gBAC3CN,EAAM,uBAAuBa,CAAY,CAE7C,EACA,aAAc,IAAM,CAClBb,EAAM,mBAAmB,MAAS,CACpC,GAECQ,EAAa,IAAIrB,GAChB,GAAAe,QAAA,cAACZ,GAAA,CACC,IAAKH,EACL,SAAUmB,EAAK,gBAAgBnB,CAAI,EACnC,MAAOa,EACP,eAAgBM,EAAK,eACvB,CACD,CACH,CAEJ,CACF,IC7GA,IAAAQ,GAEAC,GACAC,GAgBMC,GAkDCC,GArEPC,GAAAC,EAAA,kBAAAN,GAAkB,OAElBC,GAAwB,OACxBC,GAAyB,OAEzBK,KAcMJ,MAAoB,aAAS,SAA2B,CAC5D,MAAAK,EACA,SAAAC,EACA,YAAAC,EACA,eAAAC,EACA,MAAAC,CACF,EAMG,CACD,OACE,GAAAC,QAAA,cAAC,OACC,MAAO,CACL,SAAU,WACV,OAAQD,EAAM,YACd,MAAOD,EAAiB,EACxB,aAAcC,EAAM,QACtB,EACA,YAAcE,GAAwC,CACpD,IAAMC,EAAOD,EAAE,cAAc,sBAAsB,EAC7CE,EAAe,KAAK,OAAOF,EAAE,QAAUC,EAAK,MAAQ,CAAU,EAChEC,GAAgB,GAAKA,EAAeL,GACtCC,EAAM,uBAAuBI,CAAY,CAE7C,EACA,aAAc,IAAM,CAClBJ,EAAM,mBAAmB,MAAS,CACpC,GAECJ,EAAM,IAAIS,GACT,GAAAJ,QAAA,cAAC,YAAQ,IAAKI,EAAK,IAAK,MAAOP,EAAYO,EAAK,KAAK,EAAG,aAAY,IAClE,GAAAJ,QAAA,cAAC,OACC,MAAO,CACL,SAAU,WACV,KAAMI,EAAK,IAAM,EACjB,IAAK,EACL,MAAO,EACP,OAAQL,EAAM,YACd,gBAAiBH,EAASQ,EAAK,KAAK,CACtC,EACF,CACF,CACD,CACH,CAEJ,CAAC,EAEMb,GAAQD,KCrEf,IAAAe,GAEAC,GAMMC,GAmBAC,GA0BAC,GA8BAC,GAyCOC,GAuCPC,GAqCCC,GAxMPC,GAAAC,EAAA,kBAAAV,GAAkB,OAElBC,GAAyB,OAEzBU,KAIMT,MAAiB,aAAS,SAAwB,CACtD,IAAAU,CACF,EAEG,CACD,OAAOA,EAAI,MAAM,EAAE,EAAE,IAAI,CAACC,EAAMC,IAC9B,GAAAC,QAAA,cAAC,QACC,IAAKD,EACL,MAAO,CACL,SAAU,WACV,KAAMA,EAAI,EACV,MAAO,CACT,GAECD,IAAS,IAAM,OAAWA,CAC7B,CACD,CACH,CAAC,EAEKV,MAAgB,aAAS,SAAuB,CACpD,MAAAa,EACA,OAAAC,CACF,EAGG,CACD,GAAM,CAAE,cAAAC,EAAe,kBAAAC,CAAkB,EAAIH,EAC7C,MAAO,CAACE,GAAiB,CAACC,EACtB,KACA,CAAC,GAAGA,CAAiB,EAAE,IAAI,GACzB,GAAAJ,QAAA,cAAC,QACC,IAAK,EACL,MAAO,CACL,SAAU,WACV,KAAM,EAAI,EACV,IAAK,EACL,MAAO,EACP,OAAAE,EACA,WAAY,YACZ,cAAe,MACjB,EACF,CACD,CACP,CAAC,EAEKb,MAAiB,aAAS,SAAwB,CACtD,MAAAY,EACA,UAAAI,EACA,OAAAH,CACF,EAIG,CACD,GAAM,CAAE,kBAAAI,CAAkB,EAAIL,EAM9B,OAJEK,IAAsB,QACtBA,GAAqB,GACrBA,EAAoBD,EAGpB,GAAAL,QAAA,cAAC,QACC,MAAO,CACL,SAAU,WACV,KAAMM,EAAoB,EAC1B,IAAK,EACL,MAAO,EACP,OAAAJ,EACA,WAAY,QACZ,cAAe,MACjB,EACF,EAX2B,IAa/B,CAAC,EAEKZ,MAAiB,aAAS,SAAwB,CACtD,MAAAiB,EACA,UAAAF,EACA,WAAAG,EACA,OAAAC,EACA,OAAAP,CACF,EAMG,CACD,GAAI,CAACK,EACH,OAAO,KAET,GAAM,CAAE,MAAAG,EAAO,IAAAC,CAAI,EAAIJ,EACjBK,EAAe,KAAK,IAAI,EAAGF,CAAK,EAChCG,EAAa,KAAK,IAAIR,EAAY,EAAGM,CAAG,EAC9C,GAAIC,EAAeC,EACjB,OAAO,KAET,IAAMC,GAASD,EAAaD,EAAe,GAAK,EAEhD,OACE,GAAAZ,QAAA,cAAC,QACC,MAAO,CACL,SAAU,WACV,KAAMY,EAAe,EACrB,IAAK,EACL,MAAAE,EACA,OAAAZ,EACA,WAAAM,EACA,OAAAC,EACA,UAAW,aACX,cAAe,MACjB,EACF,CAEJ,CAAC,EAEYlB,MAAsB,aAAS,SAA6B,CACvE,MAAAU,EACA,UAAAI,EACA,OAAAH,CACF,EAIG,CACD,OACE,GAAAF,QAAA,cAAC,OACC,MAAO,CACL,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAOK,EAAY,EACnB,OAAAH,EACA,cAAe,MACjB,GAEA,GAAAF,QAAA,cAACZ,GAAA,CAAc,MAAOa,EAAO,OAAQC,EAAQ,EAC7C,GAAAF,QAAA,cAACV,GAAA,CACC,MAAOW,EAAM,oBACb,UAAWI,EACX,WAAW,yBACX,OAAO,mCACP,OAAQH,EACV,EACA,GAAAF,QAAA,cAACV,GAAA,CACC,MAAOW,EAAM,oBACb,UAAWI,EACX,WAAW,yBACX,OAAQH,EACV,EACA,GAAAF,QAAA,cAACX,GAAA,CAAe,MAAOY,EAAO,UAAWI,EAAW,OAAQH,EAAQ,CACtE,CAEJ,CAAC,EAEKV,MAAc,aAAS,SAAqB,CAChD,MAAAS,EACA,IAAAJ,CACF,EAGG,CACD,OACE,GAAAG,QAAA,cAAC,QACC,MAAO,CACL,SAAU,WACV,QAAS,eACT,MAAOH,EAAI,OAAS,EACpB,OAAQ,KACV,EACA,YAAckB,GAAyC,CACrD,IAAMC,EAAOD,EAAE,cAAc,sBAAsB,EAC7CE,EAAIF,EAAE,QAAUC,EAAK,KACrBE,EAAQ,KAAK,MAAMD,EAAI,CAAU,EACnCC,GAAS,GAAKA,EAAQrB,EAAI,QAC5BI,EAAM,uBAAuBiB,CAAK,CAEtC,EACA,QAAUH,GAAyC,CACjD,IAAMC,EAAOD,EAAE,cAAc,sBAAsB,EAC7CE,EAAIF,EAAE,QAAUC,EAAK,KACrBE,EAAQ,KAAK,MAAMD,EAAI,CAAU,EACnCC,GAAS,GAAKA,EAAQrB,EAAI,QAC5BI,EAAM,uBAAuBiB,CAAK,CAEtC,GAEA,GAAAlB,QAAA,cAACb,GAAA,CAAe,IAAKU,EAAK,CAC5B,CAEJ,CAAC,EAEMJ,GAAQD,KC3Lf,SAAS2B,GAAoBC,EAA4C,CACvE,IAAMC,EAA0B,CAAC,EACjC,QAAWC,KAAWF,EACpBC,EAAQC,EAAQ,IAAI,IAAM,CAAC,EAC3BD,EAAQC,EAAQ,IAAI,EAAG,KAAKA,CAAO,EAErC,OAAOD,CACT,CAEe,SAARE,GACLC,EACAC,EAKA,CACA,GAAM,CAAE,SAAAL,EAAU,UAAAM,EAAW,MAAAC,CAAM,EAAIC,GAAmBH,CAAS,EAC7D,CAAE,kBAAAI,CAAkB,EAAIL,EAE9B,GAAI,CAACC,GAAaC,GAAaC,GAAS,CAACP,GAAY,CAACS,EACpD,MAAO,CAAE,KAAM,OAAW,UAAAH,EAAW,MAAAC,CAAM,EAG7C,IAAMG,EAAiBD,EAAkB,KAAK,CAAC,EAAE,IAAI,OAC/CE,EAAkBZ,GAAoBC,CAAQ,EAGpD,MAAO,CACL,KAAM,CAAE,aAHW,OAAO,KAAKW,CAAe,EAGxB,gBAAAA,EAAiB,eAAAD,CAAe,EACtD,UAAW,GACX,MAAO,MACT,CACF,CA9CA,IAAAE,GAAAC,EAAA,kBAAAC,OCmBA,SAASC,GAAY,CACnB,MAAAC,EACA,MAAAC,EACA,OAAAC,CACF,EAIG,CACD,OACE,EAAAC,QAAA,cAAC,YAAQ,MAAOF,EAAO,UAAU,QAC/B,EAAAE,QAAA,cAAC,OACC,MAAO,CACL,OAAAD,EACA,SAAU,EACV,WAAY,YACZ,UAAW,QACX,aAAc,EACd,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,SAAU,SACV,WAAY,QACd,GAECF,CACH,CACF,CAEJ,CAhDA,IAAAI,EAEAC,GACAC,GACAC,GA8CMC,GA0LCC,GA5OPC,GAAAC,EAAA,kBAAAP,EAAyC,OAEzCC,GAAoC,OACpCC,GAAwB,QACxBC,GAAyB,OAEzBK,KACAC,KACAC,KAIAC,KACAC,KACAC,KACAC,KAmCMV,MAAmB,aAAS,SAA0B,CAC1D,MAAAW,CACF,EAEG,CACD,GAAM,CACJ,kBAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,oBAAAC,CACF,EAAIN,EACEO,KAAe,UAAuB,IAAI,EAC1C,CACJ,KAAMC,EACN,UAAWC,EACX,MAAOC,CACT,EAAIC,GAA2BX,EAAOI,CAAS,EAsB/C,MApBA,aACE,OACE,YAAQ,IAAM,CACZ,IAAMQ,EAAYL,EAAa,QAE7BP,EAAM,qBACN,CAACA,EAAM,oBACPA,EAAM,oBAAsB,QAC5BY,GAEAA,EAAU,SAAS,CACjB,KACEZ,EAAM,kBAAoB,EAAaY,EAAU,YAAc,EACjE,SAAU,QACZ,CAAC,CAEL,CAAC,EACH,CAACZ,CAAK,CACR,EAEI,CAACC,EACH,OAAO,EAAAjB,QAAA,cAAC,WAAI,sBAAoB,EAGlC,IAAM6B,EAAKZ,EAAkB,KAAK,CAAC,EAAE,IAC/Ba,EAAKb,EAAkB,KAAK,CAAC,EAAE,IAC/Bc,EAAMd,EAAkB,UAE9B,OACE,EAAAjB,QAAA,cAAC,WACC,EAAAA,QAAA,cAACgC,GAAA,CAA2B,MAAOhB,EAAO,EAE1C,EAAAhB,QAAA,cAAC,mBAAW,8FAE2B,IACpCkB,EAAgB,+BAAiC,IACpD,EACA,EAAAlB,QAAA,cAAC,OACC,MAAO,CACL,QAAS,OACT,SAAU,EACV,WAAY,YACZ,OAAQ,UACR,OAAQ,EACR,cAAe,CACjB,EACA,aAAc,IAAM,CAClBgB,EAAM,sBAAsB,EAAI,CAClC,EACA,aAAc,IAAM,CAClBA,EAAM,sBAAsB,EAAK,EACjCA,EAAM,mBAAmB,MAAS,CACpC,GAEA,EAAAhB,QAAA,cAAC,OACC,MAAO,CACL,WAAY,EACZ,MAAO,GACP,UAAW,QACX,aAAc,CAChB,GAEA,EAAAA,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAC/B,EAAAA,QAAA,cAAC,YAAQ,MAAM,4EACb,EAAAA,QAAA,cAAC,YAAK,QAAM,CACd,CACF,EACA,EAAAA,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAAG,MAAM,EAC1C,EAAAA,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAC/B,EAAAA,QAAA,cAAC,YAAQ,MAAM,+DACb,EAAAA,QAAA,cAAC,YAAK,QAAM,CACd,CACF,EACCmB,EACCM,EACE,EAAAzB,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,GAAY,SAAU,EAAG,MAAO,MAAO,GAAG,YAEhE,EACE0B,EACF,EAAA1B,QAAA,cAAC,YACC,MACE0B,aAAwB,MACpBA,EAAa,QACb,0BAGN,EAAA1B,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,GAAY,SAAU,EAAG,MAAO,KAAM,GAAG,OAE/D,CACF,EACEwB,EACF,EAAAxB,QAAA,cAACiC,GAAA,CACC,KAAMT,EACN,WAAY,GACZ,MAAOR,EACT,EACE,KACF,KACHG,GAAqBE,EAAgB,OAAS,EAC7C,EAAArB,QAAA,cAACJ,GAAA,CACC,MAAM,QACN,MAAM,2CACN,OAAQoB,EAAM,YAAcA,EAAM,SACpC,EACE,KACHG,GAAqBG,EAAoB,OAAS,EACjD,EAAAtB,QAAA,cAACJ,GAAA,CACC,MAAM,QACN,MAAM,uEACN,OAAQoB,EAAM,YAAcA,EAAM,SACpC,EACE,IACN,EACA,EAAAhB,QAAA,cAAC,OACC,IAAKuB,EACL,MAAO,CACL,SAAU,OACV,WAAY,SACZ,KAAM,EACN,cAAe,GACf,gBAAiB,OACnB,GAEA,EAAAvB,QAAA,cAAC,OAAI,MAAO,CAAE,SAAU,UAAW,GACjC,EAAAA,QAAA,cAACkC,GAAA,CACC,MAAOlB,EACP,UAAWa,EAAG,OACd,OAAQ,GACV,EACA,EAAA7B,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAC/B,EAAAA,QAAA,cAACmC,GAAA,CAAY,MAAOnB,EAAO,IAAKa,EAAI,CACtC,EACA,EAAA7B,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAC/B,EAAAA,QAAA,cAACmC,GAAA,CAAY,MAAOnB,EAAO,IAAKe,EAAK,CACvC,EACA,EAAA/B,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAW,GAC/B,EAAAA,QAAA,cAACmC,GAAA,CAAY,MAAOnB,EAAO,IAAKc,EAAI,CACtC,CACF,EACCX,GAAqBK,EACpB,EAAAxB,QAAA,cAACoC,GAAA,CAA2B,KAAMZ,EAAa,MAAOR,EAAO,EAC3D,KACHG,GAAqBE,EAAgB,OAAS,EAC7C,EAAArB,QAAA,cAACqC,GAAA,CACC,MAAOhB,EACP,SAAUiB,GACV,YAAaC,GAAK,SAASA,EAAE,QAAQ,CAAC,CAAC,GACvC,eAAgBV,EAAG,OACnB,MAAOb,EACT,EACE,KACHG,GAAqBG,EAAoB,OAAS,EACjD,EAAAtB,QAAA,cAACqC,GAAA,CACC,MAAOf,EACP,SAAUkB,GACV,YAAaD,GAAK,kBAAkBA,EAAE,QAAQ,CAAC,CAAC,GAChD,eAAgBV,EAAG,OACnB,MAAOb,EACT,EACE,IACN,CACF,CACF,CAEJ,CAAC,EAEMV,GAAQD,KCvLf,SAASoC,GAAe,CACtB,QAAAC,EACA,MAAAC,EACA,SAAAC,CACF,EAIG,CACD,OACE,EAAAC,QAAA,cAAC,GAAAC,QAAA,CACC,QAAS,IAAM,CACbF,EAAS,CACX,EACA,MAAK,IAEL,EAAAC,QAAA,cAAC,GAAAE,QAAA,KACC,EAAAF,QAAA,cAAC,GAAAG,QAAA,CAAS,QAASN,EAAS,KAAK,QAAQ,KAAK,QAAQ,cAAa,GAAC,CACtE,EACA,EAAAG,QAAA,cAAC,GAAAI,QAAA,KAAcN,CAAM,CACvB,CAEJ,CAEA,SAASO,GAAkBC,EAAsC,CAC/D,MAAO,CACL,CACE,MAAO,iBACP,QAASA,EAAM,cACf,SAAU,IAAM,CACdA,EAAM,iBAAiB,CAACA,EAAM,aAAa,CAC7C,CACF,EACA,CACE,MAAO,gBACP,QAASA,EAAM,kBACf,SAAU,IAAM,CACdA,EAAM,qBAAqB,CAACA,EAAM,iBAAiB,CACrD,CACF,EACA,CACE,MAAO,uBACP,QAASA,EAAM,oBACf,SAAU,IAAM,CACdA,EAAM,uBAAuB,CAACA,EAAM,mBAAmB,CACzD,CACF,EACA,CACE,MAAO,iBACP,QAASA,EAAM,cACf,SAAU,IAAM,CACdA,EAAM,iBAAiB,CAACA,EAAM,aAAa,CAC7C,CACF,CACF,CACF,CA5GA,IAAAC,EAEAC,GAEAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAYMC,GAsFAC,GAsCAC,GA8CCC,GAlMPC,GAAAC,EAAA,kBAAAhB,EAAgC,OAEhCC,GAAgC,QAChCgB,KACAf,GAAqB,QACrBC,GAAuB,QACvBC,GAAyB,QACzBC,GAAyB,QACzBC,GAAiB,QACjBC,GAAqB,QACrBC,GAAsB,QACtBC,GAAoB,QACpBC,GAAyB,OAEzBQ,KACAC,KACAC,KACAC,KAOMV,MAAoB,aAAS,SAA2B,CAC5D,MAAAZ,CACF,EAEG,CACD,OACE,EAAAN,QAAA,cAAC,GAAA6B,QAAA,CACC,OAAM,GACN,KAAK,QACL,MAAM,QACN,MAAOvB,EAAM,YACb,SAAUwB,GAAS,CACjB,IAAMC,EAASC,GAAc,KAAKC,GAAKA,EAAE,QAAUH,EAAM,OAAO,KAAK,EACjEC,GACFzB,EAAM,eAAeyB,EAAO,KAAK,CAErC,EACA,UAAW,CAAE,OAAQ,CAAE,OAAQ,EAAM,CAAE,EACvC,GAAI,CAAE,SAAU,GAAI,GAEnBC,GAAc,IAAID,GACjB,EAAA/B,QAAA,cAAC,GAAAC,QAAA,CAAS,IAAK8B,EAAO,MAAO,MAAOA,EAAO,OACxCA,EAAO,KACV,CACD,CACH,CAEJ,CAAC,EA2DKZ,MAAsB,aAAS,SAA6B,CAChE,MAAAb,CACF,EAEG,CACD,GAAM,CAAC4B,EAAUC,CAAW,KAAI,YAA6B,IAAI,EACjE,OACE,EAAAnC,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,GAAAoC,QAAA,CAAQ,MAAM,oBACb,EAAApC,QAAA,cAAC,GAAAqC,QAAA,CACC,KAAK,QACL,QAASP,GAAS,CAChBK,EAAYL,EAAM,aAAa,CACjC,GAEA,EAAA9B,QAAA,cAACsC,GAAA,CAAS,SAAS,QAAQ,CAC7B,CACF,EACA,EAAAtC,QAAA,cAAC,GAAAuC,QAAA,CACC,SAAUL,EACV,KAAM,EAAQA,EACd,QAAS,IAAM,CACbC,EAAY,IAAI,CAClB,GAEC9B,GAAkBC,CAAK,EAAE,IAAIkC,GAC5B,EAAAxC,QAAA,cAACJ,GAAA,CACC,IAAK4C,EAAO,MACZ,QAASA,EAAO,QAChB,MAAOA,EAAO,MACd,SAAUA,EAAO,SACnB,CACD,CACH,CACF,CAEJ,CAAC,EAEKpB,MAAoB,aAAS,SAA2B,CAC5D,MAAAd,CACF,EAEG,CACD,GAAM,CAAE,WAAAmC,EAAY,cAAAC,CAAc,EAAIpC,EACtC,OACE,EAAAN,QAAA,cAAC,WACC,EAAAA,QAAA,cAAC,OACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,eAClB,GAEA,EAAAA,QAAA,cAAC2C,GAAA,CAAoB,MAAOrC,EAAO,EACnC,EAAAN,QAAA,cAAC,OACC,MAAO,CACL,QAAS,OACT,IAAK,MACL,WAAY,SACZ,WAAY,CACd,GAEA,EAAAA,QAAA,cAACkB,GAAA,CAAkB,MAAOZ,EAAO,EACjC,EAAAN,QAAA,cAACmB,GAAA,CAAoB,MAAOb,EAAO,CACrC,CACF,EACCoC,EACGD,EACG,OAAOR,GAAKA,EAAE,mBAAqBA,EAAE,gBAAgB,EACrD,IAAI,CAACW,EAA+CC,IACnD,EAAA7C,QAAA,cAAC,OAAI,IAAK6C,GACPD,EAAU,kBACT,EAAA5C,QAAA,cAAC8C,GAAA,CAAiB,MAAOF,EAAW,EAEpC,EAAA5C,QAAA,cAAC,oBAAgB,QAAQ,6BAA6B,CAE1D,CACD,EACH,KACJ,EAAAA,QAAA,cAAC+C,GAAA,CAAmB,MAAOzC,EAAO,CACpC,CAEJ,CAAC,EAEMe,GAAQD,KClMf,IAAO4B,GAAPC,GAAAC,EAAA,kBAAOF,GAAQ;AAAA;AAAA;AAAA;ICSA,SAARG,GAAgC,CACrC,aAAAC,EACA,MAAAC,CACF,EAGG,CACD,IAAMC,KAAY,WAAuB,IAAI,EACvCC,KAAY,WAA6B,IAAI,EAC7C,CAACC,EAAOC,CAAQ,KAAI,aAAkB,EACtC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAI,EAM3C,uBAAU,IAAM,CACd,IAAMC,EAIF,CAAE,UAAW,EAAM,EACvB,OAAM,SAAY,CAChB,GAAI,CACF,GAAI,CAACN,EAAU,QACb,OAEF,GAAM,CACJ,eAAAO,EACA,oBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,eAAAC,EACA,cAAAC,CACF,EAAI,MAAMC,GAAY,EAEhBC,EAAO,SAAS,cAAc,KAAK,EACzCf,EAAU,QAAQ,OAAOe,CAAI,EAC7BT,EAAM,KAAOS,EACb,IAAMC,EAAcL,EAAoB,EAClCM,EAAU,MAAML,EAAe,CACnC,OAAQG,EACR,OAAQF,EACR,KAAM,CACJ,GAAGF,EAAoB,EACvB,UAAW,CACT,GAAGK,EAAY,UACfN,EAAW,SAASH,CAAc,EAGlCG,EAAW,SAASF,CAAmB,CACzC,EACA,OAAQ,CACN,QAAS,CACP,gBAAiB,WACjB,aAAAV,CACF,CACF,EACA,OAAQ,CAAC,CAACW,EAAa,SAAS,WAAY,EAAK,CAAC,CACpD,CACF,CAAC,EACD,MAAMQ,EAAQ,YACVX,EAAM,WACRW,EAAQ,QAAQ,EAChBF,EAAK,OAAO,IAEZT,EAAM,OAASW,EACfhB,EAAU,QAAUgB,EACpBlB,GAAO,wBAAwBkB,CAAO,EAE1C,OAASC,EAAG,CACV,QAAQ,MAAMA,CAAC,EACff,EAASe,CAAC,CACZ,QAAE,CACAb,EAAW,EAAK,CAClB,CACF,GAAG,EACI,IAAM,CACXC,EAAM,UAAY,GAClBL,EAAU,QAAU,KAGhBF,MAAS,YAAQA,CAAK,GACxBA,EAAM,wBAAwB,MAAS,EAKzCO,EAAM,QAAQ,QAAQ,EACtBA,EAAM,MAAM,OAAO,CACrB,CAEF,EAAG,CAAC,CAAC,KAGL,cAAU,IAAM,CACd,IAAMA,EAAQ,CAAE,UAAW,EAAM,EACjC,OAAM,SAAY,CAChB,IAAMa,EAASlB,EAAU,QACzB,GAAIkB,EAAQ,CACV,GAAM,CAAE,eAAAC,CAAe,EAAI,MAAMN,GAAY,EACxCR,EAAM,WACT,MAAMc,EAAe,OAAO,OAAOD,EAAQ,CACzC,MAAO,CAAE,aAAArB,CAAa,CACxB,CAAC,CAEL,CACF,GAAG,EACI,IAAM,CACXQ,EAAM,UAAY,EACpB,CACF,EAAG,CAACR,CAAY,CAAC,EAEV,CAAE,UAAAE,EAAW,MAAAE,EAAO,QAAAE,CAAQ,CACrC,CA5HA,IAAAiB,GAEAC,GAFAC,GAAAC,EAAA,kBAAAH,GAA4C,OAE5CC,GAAwB,QAExBG,OCJA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,IAAAC,GAEAC,GACAC,GASMC,GAIAC,GAuBAC,GA+CCN,GAtFPO,GAAAC,EAAA,kBAAAP,GAAkB,OAElBC,GAA4D,QAC5DC,GAAyB,OAEzBM,KACAC,KACAC,KACAC,KAIMR,GAAQ,SAAS,cAAc,OAAO,EAC5CA,GAAM,OAAOS,EAAG,EAChB,SAAS,KAAK,OAAOT,EAAK,EAEpBC,MAAc,aAAS,SAAqB,CAChD,MAAAS,CACF,EAEG,CACD,GAAM,CAAE,aAAAC,CAAa,EAAID,EACnB,CAAE,UAAAE,EAAW,MAAAC,EAAO,QAAAC,CAAQ,EAAIC,GAAe,CACnD,aAAAJ,EACA,MAAAD,CACF,CAAC,EAED,OAAIG,EACK,GAAAG,QAAA,cAAC,iBAAa,MAAOH,EAAO,EAGnC,GAAAG,QAAA,cAACd,GAAA,CACC,MAAOQ,EACP,UAAWE,EACX,QAASE,EACX,CAEJ,CAAC,EAEKZ,MAAuB,aAAS,SAA8B,CAClE,MAAAQ,EACA,UAAAE,EACA,QAAAE,CACF,EAIG,CACD,GAAM,CAAE,MAAAG,EAAO,OAAAC,EAAQ,MAAAL,EAAO,WAAAM,CAAW,EAAIT,EAMvCU,EAAQ,CAACN,GAAWK,EAAW,MAAME,GAAK,CAACA,EAAE,gBAAgB,EAEnE,OACE,GAAAL,QAAA,cAAC,OACC,MAAO,CAAE,WAAY,MAAO,EAC5B,cAAaI,EAAQ,qBAAuB,wBAE3CP,EAAQ,GAAAG,QAAA,cAAC,iBAAa,MAAOH,EAAO,EAAK,KACzCC,EACC,GAAAE,QAAA,cAAC,oBAAgB,QAAQ,yBAAyB,EAElD,GAAAA,QAAA,cAACM,GAAA,CAAkB,MAAOZ,EAAO,EAEnC,GAAAM,QAAA,cAAC,OACC,IAAKJ,EACL,MAAO,CACL,SAAU,WACV,MAAAK,EACA,OAAAC,CACF,EACF,EACA,GAAAF,QAAA,cAAC,iBACC,MAAO,CAAE,OAAQ,EAAG,WAAY,MAAO,EACvC,OAAQO,GACCb,EAAM,UAAUA,EAAM,OAASa,CAAK,EAE/C,EACA,GAAAP,QAAA,cAACQ,GAAA,CAAsB,MAAOd,EAAO,CACvC,CAEJ,CAAC,EAEMd,GAAQK,KCtFf,IAAAwB,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,IAAAC,GACAC,GACAC,GACAC,GA6BqBJ,GAhCrBK,GAAAC,EAAA,kBAAAL,GAAuC,QACvCC,GAA8C,QAC9CC,GAA6B,QAC7BC,GAAiC,QA6BZJ,GAArB,cAAqD,yBAAuB,CAC1E,OAAc,aAAe,CAAC,cAAe,aAAa,EAEnD,MAIP,MAAc,WAAY,CACxB,GAAM,CAAE,SAAAO,CAAS,EAAI,KAAK,MACxB,QAAM,iBAAa,KAAK,QAAQ,UAAU,CAAC,EAAE,SAAS,MAAM,CAC9D,EAEMC,EAAa,KAAK,QAAQ,YAAY,EAE5C,OAAOD,EAAS,IAAI,CAAC,CAAE,MAAAE,EAAO,IAAAC,EAAK,GAAGC,CAAK,EAAGC,KAAS,CACrD,GAAGD,EACH,SAAU,QAAQC,CAAG,GACrB,MAAO,CAACH,EACR,IAAK,CAACC,EAAM,EACZ,MACEF,IAAe,uBACXG,EAAK,wBAAwB,CAAC,GAAG,UACjCH,IAAe,uBACbG,EAAK,cAAc,CAAC,GAAG,MACvB,OACR,YAAaA,EAAK,cAAc,IAAIE,GAAKA,EAAE,KAAK,EAAE,KAAK,GAAG,EAC1D,KAAM,CACJF,EAAK,YACD,GAAGA,EAAK,QAAQ,KAAKA,EAAK,WAAW,GACrC,GAAGA,EAAK,QAAQ,OACtB,CACF,EAAE,CACJ,CAEA,MAAc,SAASG,EAAqB,CAAC,EAAG,CAC9C,YAAK,QAAU,KAAK,UAAU,EAAE,MAAOC,GAAe,CACpD,WAAK,MAAQ,OACPA,CACR,CAAC,EAEM,KAAK,KACd,CAEA,MAAa,YAAYD,EAAqB,CAAC,EAAG,CAChD,MAAO,CAAC,CACV,CAEO,YAAYE,EAAeF,EAAqB,CAAC,EAAG,CACzD,SAAO,qBAA0B,MAAMG,GAAY,CACjD,GAAM,CAAE,MAAAC,EAAO,IAAAR,EAAK,QAAAS,CAAQ,EAAIH,EAC1BI,EAAO,MAAM,KAAK,SAAS,EACjC,QAAWC,KAAKD,KACV,mBAAeC,EAAE,MAAOA,EAAE,IAAKH,EAAOR,CAAG,GAC3CO,EAAS,KAAK,IAAI,iBAAc,CAAE,GAAGI,EAAG,QAAAF,CAAQ,CAAC,CAAC,EAGtDF,EAAS,SAAS,CACpB,CAAC,CACH,CAEO,eAAsB,CAAC,CAChC,IC7FA,IAAAK,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,IAAAC,GAAmB,QCAnB,IAAAC,GAAkB,OCAlB,IAAAC,GAAkB,OAElBC,GAAyB,OCFzB,IAAAC,GAAkB,OAElBC,GAA2B,QAC3BC,GAAyB,OCHzB,IAAAC,GAAkB,OAElBC,GAA2B,QAC3BC,GAAyB,OCHzB,IAAAC,GAA2B,QAKdC,MAAY,eAAW,EAAE,CACpC,UAAW,CACT,OAAQ,OACR,WAAY,sBACZ,OAAQ,8BACR,SAAU,WACV,OAAQ,GACR,UAAW,SACX,cAAe,OACf,SAAU,QACZ,EACA,WAAY,CACV,OAAQ,iBACV,CACF,CAAC,EAEM,SAASC,GACdC,EAC2C,CAE3C,OADaA,EAAQ,MAAM,KAAKC,GAAKA,EAAE,OAAS,aAAa,CAE/D,CDjBA,IAAMC,MAAY,aAAS,SAAmB,CAC5C,aAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EACA,MAAAC,CACF,EAMG,CACD,GAAM,CAAE,GAAAC,EAAI,QAAAC,CAAQ,EAAIC,GAAU,EAC5B,CAAE,gBAAAC,CAAgB,KAAI,eAAWJ,CAAK,EACtC,CAAE,SAAAK,CAAS,EAAIL,EAEfM,EADWF,EAAgB,IAAIR,CAAY,GAC3B,oBAAoBG,CAAO,GAAKA,EAChDQ,EAAIP,EAAM,OAAO,CAAE,QAASM,EAAK,MAAOT,CAAM,CAAC,EAC/CW,EAAIR,EAAM,OAAO,CAAE,QAASM,EAAK,MAAOR,CAAI,CAAC,EACnD,GAAIS,GAAKC,EAAG,CACV,IAAMC,EAAQ,KAAK,IAAI,KAAK,IAAID,EAAE,SAAWD,EAAE,QAAQ,EAAG,CAAC,EACrDG,EAAO,KAAK,IAAIH,EAAE,SAAUC,EAAE,QAAQ,EAAIH,EAChD,OACE,GAAAM,QAAA,cAAC,OACC,UAAWV,EACTC,EAAQ,UACRO,GAAS,EAAIP,EAAQ,WAAa,MACpC,EACA,MAAO,CAAE,KAAAQ,EAAM,MAAAD,CAAM,EACvB,CAEJ,KACE,QAAO,IAEX,CAAC,EAEMG,GAAQjB,GDxCfkB,KAIA,IAAMC,MAA2B,aAAS,SAAkC,CAC1E,MAAAC,CACF,EAEG,CACD,IAAMC,KAAU,eAAWD,CAAK,EAC1B,CAAE,MAAAE,EAAO,QAAAC,CAAQ,EAAIF,EAC3B,GAAIG,GAAaD,CAAO,GAAKD,EAAM,KAAKG,GAAKA,EAAE,OAAS,aAAa,EAAG,CACtE,GAAM,CAAE,cAAAC,CAAc,EAAIN,EACpB,CAAE,MAAAO,EAAO,QAAAC,CAAQ,EAAIL,EAAQ,cACnC,OACE,GAAAM,QAAA,cAACC,GAAA,CACC,MAAOV,EACP,MAAOO,EAAQ,EACf,IAAKA,EACL,QAASC,EACT,aAAcF,EAAc,CAAC,EAC/B,CAEJ,CACA,OAAO,IACT,CAAC,EAEMK,GAAQZ,GGjCf,IAAAa,GAAkB,OAElBC,GAA0C,QAC1CC,GAAyB,OAGzBC,KACAC,KACAC,KAIA,IAAMC,MAAkC,aACtC,SAAyC,CACvC,MAAAC,CACF,EAEG,CACD,IAAMC,KAAU,eAAWD,CAAK,EAC1B,CAAE,QAAAE,CAAQ,EAAID,EACd,CAAE,cAAAE,EAAe,GAAIC,CAAO,EAAIJ,EAGtC,GAAI,CADiBG,EAAc,CAAC,EAElC,OAAO,KAGT,IAAME,EAAgBC,GAAsB,IAAIF,CAAM,EAKtD,GAJI,CAACC,GAID,CAACE,GAAaL,CAAO,EACvB,OAAO,KAGT,GAAM,CAAE,MAAAM,CAAM,EAAIN,EAAQ,cAEpBO,EAAU,IAAI,iBAAcJ,EAAc,OAAO,EACjDK,EAAUC,GAA6BF,CAAO,EAC9C,CAAE,IAAAG,CAAI,EAAIF,EACVG,EAAaD,EAAIJ,EAAQ,CAAC,EAChC,OAAIK,IAAe,OACV,KAIP,GAAAC,QAAA,cAACC,GAAA,CACC,MAAOf,EACP,MAAOa,EACP,IAAKA,EAAa,EAClB,QAASR,EAAc,UACvB,aAAcA,EAAc,UAC9B,CAEJ,CACF,EAEOW,GAAQjB,GC1Df,IAAAkB,GAAkB,OAElBC,GAA2B,QAC3BC,GAAyB,OAGzBC,KACAC,KAIA,IAAMC,MAAkC,aACtC,SAAyC,CACvC,MAAAC,CACF,EAEG,CACD,IAAMC,KAAU,eAAWD,CAAK,EAC1B,CAAE,QAAAE,CAAQ,EAAID,EACd,CAAE,cAAAE,EAAe,GAAIC,CAAO,EAAIJ,EAEtC,GAAI,CAACK,GAAaH,CAAO,EACvB,OAAO,KAGT,GAAM,CAAE,MAAAI,EAAO,QAAAC,CAAQ,EAAIL,EAAQ,cAGnC,GAFsBM,GAAsB,eAAeD,EAASN,CAAO,GAExD,kBAAoBG,EACrC,OAAO,KAGT,IAAMK,EAAeN,EAAc,CAAC,EACpC,GAAI,CAACM,EACH,OAAO,KAGT,IAAMC,EACJF,GAAsB,qCACpBD,EACAD,EAAQ,EACRL,CACF,EAEF,OAAKS,EAKH,GAAAC,QAAA,cAACC,GAAA,CACC,MAAOZ,EACP,MAAOU,EAAgB,MACvB,IAAKA,EAAgB,IACrB,QAASA,EAAgB,QACzB,aAAcD,EAChB,EAVO,IAYX,CACF,EAEOI,GAAQd,GC5Df,IAAAe,GAAkB,OAElBC,GAAyB,OCFzB,IAAAC,GAAkB,OAElBC,GAA2B,QAC3BC,GAAyB,OAWzB,IAAMC,MAAgC,aACpC,SAAuC,CACrC,MAAAC,EACA,MAAAC,CACF,EAGG,CACD,IAAMC,KAAU,eAAWF,CAAK,EAC1B,CAAE,gBAAAG,CAAgB,EAAID,EACtB,CAAE,cAAAE,CAAc,EAAIJ,EACpBK,EAAcC,GAAeJ,CAAO,EACpCK,EAAeH,EAAc,CAAC,EAIpC,OAHiBG,EACbJ,EAAgB,IAAII,CAAY,EAChC,SACeA,EACjB,GAAAC,QAAA,iBAAAA,QAAA,cACGH,GAAa,WAAW,QACvB,CAACI,EAA+CC,IAC9CD,EAAUR,CAAK,EAAE,IAAI,CAACU,EAAWC,IAC/B,GAAAJ,QAAA,cAACK,GAAA,CACC,IAAK,GAAGF,EAAE,OAAO,IAAIA,EAAE,KAAK,IAAIA,EAAE,GAAG,IAAID,CAAG,IAAIE,CAAI,GACpD,MAAOD,EAAE,MACT,IAAKA,EAAE,IACP,QAASA,EAAE,QACX,aAAcJ,EACd,MAAOP,EACT,CACD,CACL,CACF,EACE,IACN,CACF,EAEOc,GAAQf,GD1CR,IAAMgB,MAAgC,aAC3C,SAAuC,CACrC,MAAAC,CACF,EAEG,CACD,OACE,GAAAC,QAAA,cAACC,GAAA,CACC,MAAOF,EACP,MAAM,wBACR,CAEJ,CACF,EAEaG,MAAgC,aAC3C,SAAuC,CACrC,MAAAH,CACF,EAEG,CACD,OACE,GAAAC,QAAA,cAACC,GAAA,CACC,MAAOF,EACP,MAAM,wBACR,CAEJ,CACF,EEpCA,IAAAI,GAA0B,OAE1BC,GAA2B,QAC3BC,GAAmC,QACnCC,GAAyB,OCHlB,SAASC,GAAMC,EAAa,CACjC,OAAOA,EAAI,QAAQ,QAAS,EAAE,CAChC,CASO,SAASC,GACdC,EACAC,EACoB,CACpB,OAAOD,GAAUC,EACb,CAAC,GAAGD,CAAM,EAAE,KAAK,CAAC,CAAC,CAAEF,CAAG,IAAMD,GAAMC,CAAG,IAAMG,CAAY,IAAI,CAAC,EAC9D,MACN,CDXAC,KAmCA,IAAMC,MAAwB,aAAS,SAA+B,CACpE,MAAAC,CACF,EAEG,CACD,IAAMC,KAAU,eAAWD,CAAK,EAC1B,CAAE,MAAAE,CAAM,EAAID,EAEZE,EAAcC,GAAeH,CAAO,EAEpCI,EAAqBF,GAAa,mBAClCG,EAAUD,EACXH,EAAM,KAAKK,GAAKA,EAAE,KAAOF,CAAkB,EAC5C,OAEJ,uBAAU,IAAM,CACd,GAAI,CAACF,GAAe,CAACG,EACnB,OAGF,IAAME,EAA4B,CAAC,EAK/BC,EAWJ,GAVAD,EAAU,QACR,YAAQ,IAAM,CACZ,IAAME,EAAMP,EAAY,kBAAkB,qBAAqB,CAAC,EAChEM,EAAmBE,GACjBL,EAAQ,OACRI,IAAQ,OAAY,OAAYE,GAAeF,CAAG,CACpD,CACF,CAAC,CACH,EAEIJ,EAAQ,YAAa,CACvB,GAAM,CAAE,YAAAO,CAAY,EAAIP,EACxBE,EAAU,QACR,YAAQ,IAAM,CACZ,IAAMM,EAAYX,EAAY,iBAC9B,GAAIW,EAAW,CACb,IAAMC,EAASD,EAAU,qBACnBE,EACJD,IAAW,QACXN,IAAqB,QACrBH,EAAQ,mBACJA,EAAQ,mBAAmBG,EAAkBM,CAAM,EACnDA,EACNF,EAAYG,CAAG,CACjB,CACF,CAAC,CACH,CACF,CAEA,OAAAR,EAAU,QACR,YAAQ,IAAM,CACZ,IAAMQ,EAAMV,EAAQ,SACdQ,EAAYX,EAAY,iBAC9B,GAAIW,GAIE,IAHyB,cAC3B,IAAM,CAAC,CAACA,EAAU,mBACpB,EAC2B,CACzB,IAAMG,EACJD,IAAQ,QACRP,IAAqB,QACrBH,EAAQ,mBACJA,EAAQ,mBAAmBG,EAAkBO,CAAG,EAChDA,EACNF,EAAU,mBACRG,IAAoB,OAAY,OAAY,CAAE,gBAAAA,CAAgB,CAChE,CACF,CAEJ,CAAC,CACH,EAEO,IAAM,CACXT,EAAU,QAAQU,GAAK,CACrBA,EAAE,CACJ,CAAC,CACH,CACF,EAAG,CAACf,EAAaG,CAAO,CAAC,EAElB,IACT,CAAC,EAEMa,GAAQpB,GRpHf,IAAMqB,MAAsB,aAAS,SAAmB,CACtD,MAAAC,CACF,EAEG,CACD,OACE,GAAAC,QAAA,iBAAAA,QAAA,cACE,GAAAA,QAAA,cAACC,GAAA,CAA8B,MAAOF,EAAO,EAC7C,GAAAC,QAAA,cAACE,GAAA,CAA8B,MAAOH,EAAO,EAC7C,GAAAC,QAAA,cAACG,GAAA,CAAgC,MAAOJ,EAAO,EAC/C,GAAAC,QAAA,cAACI,GAAA,CAAgC,MAAOL,EAAO,EAC/C,GAAAC,QAAA,cAACK,GAAA,CAAyB,MAAON,EAAO,EACxC,GAAAC,QAAA,cAACM,GAAA,CAAsB,MAAOP,EAAO,CACvC,CAEJ,CAAC,EAEMQ,GAAQT,GDzBA,SAARU,GAAoCC,EAA8B,CACvEA,EAAc,oBACZ,4CAEA,CAACC,EAAyB,CAAE,MAAAC,CAAM,IACzB,CACL,GAAGD,EACH,GAAAE,QAAA,cAACC,GAAA,CACC,IAAI,qCACJ,MAAOF,EACT,CACF,CAEJ,CACF,CWrBA,IAAAG,GAAwB,QCAxB,IAAAC,GAAoC,QASpC,IAAMC,MACJ,wBACE,6BACA,CAIE,SAAU,CACR,KAAM,eACN,aAAc,CACZ,IAAK,qBACL,aAAc,aAChB,CACF,CACF,EACA,CAAE,gBAAiB,EAAK,CAC1B,EACKC,GAAQD,GDpBA,SAARE,GACLC,EACA,CACAA,EAAc,eACZ,IACE,IAAI,GAAAC,QAAY,CACd,KAAM,6BACN,YAAa,8BACb,aAAAC,GACA,gBAAiB,IACf,sCAAuC,KAAKC,GAAKA,EAAE,OAAO,CAC9D,CAAC,CACL,CACF,CEnBA,IAAAC,GAAwB,QCAxB,IAAAC,GAAoC,QASpC,IAAMC,MACJ,wBACE,oCACA,CAIE,SAAU,CACR,KAAM,eACN,aAAc,CACZ,IAAK,qBACL,aAAc,aAChB,CACF,CACF,EACA,CAAE,gBAAiB,EAAK,CAC1B,EACKC,GAAQD,GDpBA,SAARE,GACLC,EACA,CACAA,EAAc,eACZ,IACE,IAAI,GAAAC,QAAY,CACd,KAAM,oCACN,YAAa,qCACb,aAAAC,GACA,gBAAiB,IACf,sCAA8C,KAAKC,GAAKA,EAAE,OAAO,CACrE,CAAC,CACL,CACF,CEnBA,IAAAC,GAA+C,QCE/CC,KACA,IAAAC,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,mCACL,CAAC,EAAG,KAAK,ECNT,IAAAC,GAAgC,OAEhCC,GAAuB,QACvBC,GAA8C,QAC9CC,GAA0B,OCJ1B,IAAAC,EAAkB,OAElBC,GAA8C,QAC9CC,GAAyD,OACzDC,GAAyB,OACzBC,GAA2B,QCL3B,IAAAC,GAAkB,OAElBC,GAA2B,OCF3B,IAAAC,GAAgC,OAEhCC,GAAuB,OCFvB,IAAAC,GAAgC,OAEhCC,GAAoB,QACpBC,GAA0B,OAC1BC,GAA2B,QCJ3B,IAAAC,GAAkB,OAElBC,GAA2C,OAC3CC,GAA2B,QAErBC,MAAY,eAAW,EAAE,CAC7B,MAAO,CACL,QAAS,OACX,CACF,CAAC,EAEc,SAARC,GAA2B,CAChC,QAAAC,EACA,SAAAC,EACA,MAAAC,EACA,SAAAC,CACF,EAKG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIN,GAAU,EAC9B,OACE,GAAAO,QAAA,cAAC,qBACC,SAAUJ,EACV,UAAWG,EAAQ,MACnB,QAAS,GAAAC,QAAA,cAAC,aAAS,QAASL,EAAS,SAAUG,EAAU,EACzD,MAAOD,EACT,CAEJ,CDxBAI,KAIA,IAAMC,MAAY,eAAW,EAAE,CAC7B,aAAc,CACZ,WAAY,cACZ,WAAY,KACd,CACF,CAAC,EAEc,SAARC,GAA0B,CAC/B,cAAAC,EACA,kBAAAC,EACA,iBAAAC,CACF,EAIG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EACxB,CAACM,EAAmBC,CAAoB,KAAI,aAAS,EAAK,EAC1DC,EAAe,OAAO,YAC1B,OAAO,QAAQJ,CAAgB,EAAE,IAAI,CAAC,CAACK,EAAKC,CAAG,IAAM,CACnDD,EACA,CAAE,GAAGC,EAAK,IAAKC,GAAeD,EAAI,GAAG,CAAE,CACzC,CAAC,CACH,EACME,EAAmC,OAAO,QAAQJ,CAAY,EAAE,KACpE,CAAC,CAACK,EAAGH,CAAG,IAAMP,IAAsBO,EAAI,GAC1C,EACMI,EAAQ,GAAGZ,CAAa,wBACxBa,KAAY,QAAI,CACpBD,EAAM,OACN,GAAG,OAAO,QAAQN,CAAY,EAAE,IAC9B,CAAC,CAACK,EAAGH,CAAG,IAAMM,GAAyBN,EAAI,OAAO,EAAE,MACtD,CACF,CAAC,EAED,OACE,GAAAO,QAAA,iBAAAA,QAAA,cACE,GAAAA,QAAA,cAACC,GAAA,CACC,SAAUC,GAAS,CACjBZ,EAAqBY,EAAM,OAAO,OAAO,CAC3C,EACA,MAAM,wBACN,QAASb,EACX,EACA,GAAAW,QAAA,cAAC,cACC,QAAQ,WACR,UAAS,GACT,QAAS,EACT,QAAS,GACT,UAAS,GACT,MACEX,EACI,CACE,IAAIQ,CAAK;AAAA,EAAKX,CAAiB,GAC/B,GAAG,OAAO,OAAOK,CAAY,EAAE,IAC7B,CAAC,CAAE,QAAAY,EAAS,IAAAC,CAAI,IACd,IAAIL,GAAyBI,CAAO,CAAC;AAAA,EAAKC,CAAG,EACjD,CACF,EAAE,KAAK;AAAA,CAAI,EACX,CACE,GAAGP,EAAM,OAAOC,CAAS,CAAC,GAAGH,EAAmC,IAAM,GAAG,IAAIT,CAAiB,GAC9FS,EACI,GAAGI,GAAyBJ,EAAiC,CAAC,EAAE,OAAO,EAAE,OAAOG,CAAS,CAAC,KAAKH,EAAiC,CAAC,EAAE,GAAG,GACtI,OACJ,GAAG,OAAO,QAAQJ,CAAY,EAC3B,OAAO,CAAC,CAACc,CAAC,IAAMA,IAAMV,IAAmC,CAAC,CAAC,EAC3D,IACC,CAAC,CAACC,EAAGH,CAAG,IACN,GAAGM,GAAyBN,EAAI,OAAO,EAAE,OAAOK,CAAS,CAAC,KAAKL,EAAI,GAAG,EAC1E,CACJ,EACG,OAAOa,GAAK,CAAC,CAACA,CAAC,EACf,KAAK;AAAA,CAAI,EAElB,UAAW,CACT,MAAO,CACL,SAAU,GACV,QAAS,CACP,MAAOlB,EAAQ,YACjB,CACF,CACF,EACF,CACF,CAEJ,CDxFe,SAARmB,GAAwC,CAC7C,kBAAAC,EACA,cAAAC,EACA,iBAAAC,CACF,EAIG,CACD,GAAM,CAACC,EAAMC,CAAO,KAAI,aAAS,EAAK,EACtC,OACE,GAAAC,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,GACvB,GAAAA,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,UACN,QAAS,IAAM,CACbD,EAAQ,CAACD,CAAI,CACf,GAECA,EACG,qCACA,oCACN,EACCA,EACC,GAAAE,QAAA,cAACC,GAAA,CACC,kBAAmBN,EACnB,cAAeC,EACf,iBAAkBC,EACpB,EACE,IACN,CAEJ,CGxCA,IAAAK,GAAkB,OCElBC,KACA,IAAAC,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,+HACL,CAAC,EAAG,WAAW,EDHf,IAAAC,GAAqB,OAIN,SAARC,GAA8BC,EAAkB,CACrD,GAAM,CAAE,SAAAC,EAAU,GAAGC,CAAK,EAAIF,EAC9B,OACE,GAAAG,QAAA,cAAC,SAAM,GAAGD,EAAM,OAAO,SAAS,IAAI,cACjCD,EAAS,IAAC,GAAAE,QAAA,cAACC,GAAA,CAAc,SAAS,QAAQ,CAC7C,CAEJ,CJRAC,KAIA,SAASC,GAAS,CAAE,UAAAC,CAAU,EAA0B,CACtD,OACE,GAAAC,QAAA,cAAC,mBAAW,uDAC2C,IACrD,GAAAA,QAAA,cAACC,GAAA,CACC,KAAM,2CAA2CF,CAAS,IAC3D,sBAED,CACF,CAEJ,CAEe,SAARG,GAAyC,CAC9C,UAAAH,EACA,mBAAAI,EACA,kBAAAC,EACA,iBAAAC,EACA,IAAAC,CACF,EAMG,CACD,OAAOP,EACL,GAAAC,QAAA,iBAAAA,QAAA,cACE,GAAAA,QAAA,cAAC,WACC,GAAAA,QAAA,cAAC,mBAAW,gBACI,IACd,GAAAA,QAAA,cAACC,GAAA,CACC,KAAM,qCAAqCF,CAAS,UAEnDA,CACH,CACF,EACA,GAAAC,QAAA,cAAC,mBAAW,qBACQ,GAAAA,QAAA,cAACC,GAAA,CAAa,KAAMK,GAAMA,CAAI,CAClD,CACF,EACCF,EACC,GAAAJ,QAAA,cAACO,GAAA,CACC,kBAAmBH,EACnB,cAAeL,EACf,iBAAkBM,EACpB,EAEA,GAAAL,QAAA,cAACF,GAAA,CAAS,UAAWC,EAAW,CAEpC,EAEA,GAAAC,QAAA,cAAC,mBAAW,YACA,IACTG,EACGK,GAAyBL,CAAkB,EAC3C,aAAc,IAAI,gBAExB,CAEJ,CMtEA,IAAAM,GAAgC,OAEhCC,GAMO,OAEPC,KASA,SAASC,GAAWC,EAAoB,CACtC,IAAMC,EAASC,GAAqBF,CAAE,EACtC,OAAIC,IAAW,SACTD,EAAG,WAAW,KAAK,GAAKA,EAAG,WAAW,KAAK,EACtC,GAAGA,CAAE,iBAEVA,EAAG,WAAW,KAAK,GAAKA,EAAG,WAAW,KAAK,EACtC,GAAGA,CAAE,kBAEVA,EAAG,WAAW,KAAK,GAAKA,EAAG,WAAW,KAAK,EACtC,GAAGA,CAAE,oBAEP,GAAGA,CAAE,YAEVC,IAAW,UACTD,EAAG,SAAS,GAAG,EACV,GAAGA,CAAE,kBAEVA,EAAG,SAAS,GAAG,EACV,GAAGA,CAAE,wBAEVA,EAAG,SAAS,GAAG,EACV,GAAGA,CAAE,qBAEP,GAAGA,CAAE,aAEVC,IAAW,OACN,GAAGD,CAAE,UAEVC,IAAW,OACN,GAAGD,CAAE,UAEPA,CACT,CAEe,SAARG,GAAoC,CACzC,cAAAC,EACA,SAAAC,EACA,WAAAC,EACA,mBAAAC,CACF,EAA4B,CAC1B,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EAGxCC,EAA8C,CAClD,CAAE,MAAO,OAAQ,MAAO,gBAAiB,EACzC,GAAGN,EAAc,IAAIJ,IAAO,CAAE,MAAOA,EAAI,MAAOD,GAAWC,CAAE,CAAE,EAAE,CACnE,EASA,OAPIK,GACFK,EAAQ,KAAK,CACX,MAAO,QAAQL,CAAQ,GACvB,MAAO,GAAGA,CAAQ,cACpB,CAAC,EAGCD,EAAc,SAAW,GAAK,CAACC,EAC1B,KAGJG,EAeH,GAAAG,QAAA,cAAC,gBAAY,KAAK,SAChB,GAAAA,QAAA,cAAC,mBAAW,kBAAgB,EAC5B,GAAAA,QAAA,cAAC,WACC,MAAOL,EACP,MAAM,mBACN,SAAUM,GAAK,CACbL,EAAmBK,EAAE,OAAO,KAAK,CACnC,GAECF,EAAQ,IAAIG,GACX,GAAAF,QAAA,cAAC,aAAS,IAAKE,EAAI,MAAO,MAAOA,EAAI,OAClCA,EAAI,KACP,CACD,CACH,CACF,EA5BE,GAAAF,QAAA,cAAC,WACC,KAAK,QACL,QAAQ,OACR,QAAS,IAAM,CACbF,EAAY,EAAI,CAClB,GACD,+BAED,CAsBN,CC/GA,IAAAK,GAAgC,OAEhCC,GAA6B,QCA7BC,KACA,IAAAC,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,gBACL,CAAC,EAAG,eAAe,ECJnBC,KACA,IAAAC,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,irBACL,CAAC,EAAG,UAAU,EFDd,IAAAC,GAAqE,OGLrE,IAAAC,GAAkB,OAElBC,GAOO,OASQ,SAARC,GAAqC,CAC1C,KAAAC,EACA,QAAAC,EACA,QAAAC,CACF,EAIG,CACD,OACE,GAAAC,QAAA,cAAC,WAAO,KAAMH,EAAM,QAASC,GAC3B,GAAAE,QAAA,cAAC,oBAAY,gBAAc,EAC3B,GAAAA,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,iBACED,EAAQ,IAAIE,GACX,GAAAD,QAAA,cAAC,aAAS,IAAKC,EAAI,IAAK,QAASA,EAAI,SACnC,GAAAD,QAAA,cAAC,WACC,GAAAA,QAAA,cAAC,eAAW,QAAQ,SAASC,EAAI,KAAM,EACvC,GAAAD,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,kBAC/BC,EAAI,WACP,CACF,CACF,CACD,CACH,CACF,CACF,CAEJ,CC9CA,IAAAC,GAAgC,OAEhCC,GAUO,OAEPC,KAIe,SAARC,GAAsC,CAC3C,KAAAC,EACA,QAAAC,CACF,EAGG,CACD,GAAM,CAACC,EAAYC,CAAa,KAAI,aAAS,IAAMC,GAAoB,CAAC,EACxE,OACE,GAAAC,QAAA,cAAC,WACC,KAAML,EACN,QAAS,IAAM,CACbC,EAAQ,CACV,GAEA,GAAAI,QAAA,cAAC,oBAAY,iBAAe,EAC5B,GAAAA,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,kBACC,GAAAA,QAAA,cAAC,qBACC,QAAS,GAAAA,QAAA,cAAC,aAAS,QAASH,EAAY,EACxC,MAAM,sDACN,SAAU,CAACI,EAAGC,IAAY,CACxBJ,EAAcI,CAAO,EACrBC,GAAoBD,CAAO,CAC7B,EACF,CACF,EACA,GAAAF,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,kBAAiB,4IAGnD,CACF,EACA,GAAAA,QAAA,cAAC,sBACC,GAAAA,QAAA,cAAC,WACC,QAAQ,YACR,QAAS,IAAM,CACbJ,EAAQ,CACV,GACD,OAED,CACF,CACF,CAEJ,CC9DA,IAAAQ,GAAkB,OAElBC,GAA2B,OCF3B,IAAAC,EAAgC,OAGhC,IAAAC,EAgBO,OACPC,KClBO,IAAMC,GAAuB,CAClC,iBAAkB,mBAClB,eAAgB,gBAClB,EAEaC,GAAkD,iBAEzDC,GAAmD,CACvD,mBACA,gBACF,EAEO,SAASC,GAAyBC,EAAmC,CAC1E,OACEF,GAA2B,KAAKG,GAAKA,IAAMD,CAAK,GAChDH,EAEJ,CAEO,IAAMK,GAAqD,CAChE,iBAAkB,mBAClB,eAAgB,gBAClB,EDSe,SAARC,GAAyC,CAC9C,MAAAC,EACA,SAAAC,EACA,kBAAAC,CACF,EAAiC,CAC/B,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAS,EAAK,EAChC,CAACC,EAAUC,CAAW,KAAI,YAAS,CAAC,EACpC,CAACC,EAAeC,CAAgB,KAAI,YAA6BR,CAAK,EACtE,CAACS,EAAiBC,CAAkB,KAAI,YAAS,EAAE,EACnD,CAACC,EAAYC,CAAa,KAAI,YAAiB,EAE/CC,EAAa,IAAM,CACvBL,EAAiBR,CAAK,EACtBU,EAAmB,EAAE,EACrBE,EAAc,MAAS,EACvBN,EAAY,CAAC,EACbF,EAAQ,EAAI,CACd,EAEMU,EAAa,IAAM,CACvB,GAAIT,IAAa,EACfJ,EAASM,CAAa,UACbF,IAAa,GAAKI,EAAgB,KAAK,GAAKP,EACrD,GAAI,CACF,IAAMa,EAASC,GAAcP,EAAgB,KAAK,CAAC,EACnDP,EAAkBa,CAAM,CAC1B,OAASE,EAAG,CACVL,EAAc,8BAA8BK,CAAC,EAAE,EAC/C,MACF,CAEFb,EAAQ,EAAK,CACf,EAEMc,EAAe,IAAM,CACzBV,EAAiBR,CAAK,EACtBU,EAAmB,EAAE,EACrBE,EAAc,MAAS,EACvBR,EAAQ,EAAK,CACf,EAEA,OACE,EAAAe,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,cAAW,QAASN,EAAY,KAAK,QAAQ,MAAM,sBAClD,EAAAM,QAAA,cAACC,GAAA,IAAa,CAChB,EAEA,EAAAD,QAAA,cAAC,UAAO,KAAMhB,EAAM,QAASe,EAAc,SAAS,KAAK,UAAS,IAChE,EAAAC,QAAA,cAAC,mBAAY,oBAAkB,EAC/B,EAAAA,QAAA,cAAC,qBACC,EAAAA,QAAA,cAAC,QACC,MAAOd,EACP,SAAU,CAACgB,EAAGC,IAAQ,CACpBhB,EAAYgB,CAAG,CACjB,EACA,GAAI,CAAE,GAAI,CAAE,GAEZ,EAAAH,QAAA,cAAC,OAAI,MAAM,YAAY,EACvB,EAAAA,QAAA,cAAC,OAAI,MAAM,SAAS,SAAU,CAACjB,EAAmB,CACpD,EAECG,IAAa,EACZ,EAAAc,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,iBAAiB,GAAI,CAAE,GAAI,CAAE,GAAG,+EAGlE,EAEA,EAAAA,QAAA,cAAC,eAAY,UAAU,YACrB,EAAAA,QAAA,cAAC,aAAU,UAAU,UAAS,WAAS,EACvC,EAAAA,QAAA,cAAC,cACC,MAAOZ,EACP,SAAUgB,GAAS,CACjBf,EAAiBe,EAAM,OAAO,KAA2B,CAC3D,GAEA,EAAAJ,QAAA,cAAC,oBACC,MAAOK,GAAqB,eAC5B,QAAS,EAAAL,QAAA,cAAC,YAAM,EAChB,MAAM,mCACR,EACA,EAAAA,QAAA,cAAC,cACC,QAAQ,UACR,MAAM,iBACN,GAAI,CAAE,GAAI,EAAG,GAAI,GAAI,GAAI,CAAE,GAC5B,6DAED,EAEA,EAAAA,QAAA,cAAC,oBACC,MAAOK,GAAqB,iBAC5B,QAAS,EAAAL,QAAA,cAAC,YAAM,EAChB,MAAM,sCACR,EACA,EAAAA,QAAA,cAAC,cACC,QAAQ,UACR,MAAM,iBACN,GAAI,CAAE,GAAI,EAAG,GAAI,GAAI,GAAI,CAAE,GAC5B,mEAGD,CACF,CACF,CACF,EAEA,EAAAA,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,iBAAiB,GAAI,CAAE,GAAI,CAAE,GAAG,uIAIlE,EACA,EAAAA,QAAA,cAAC,aACC,UAAS,GACT,KAAM,GACN,UAAS,GACT,YAAa;AAAA;AAAA;AAAA,wBAIb,MAAOV,EACP,SAAUQ,GAAK,CACbP,EAAmBO,EAAE,OAAO,KAAK,EACjCL,EAAc,MAAS,CACzB,EACA,GAAI,CAAE,WAAY,YAAa,SAAU,EAAG,EAC9C,EACCD,EACC,EAAAQ,QAAA,cAAC,cAAW,MAAM,QAAQ,QAAQ,QAAQ,GAAI,CAAE,GAAI,CAAE,GACnDR,CACH,EACE,IACN,CAEJ,EACA,EAAAQ,QAAA,cAAC,qBACC,EAAAA,QAAA,cAAC,UAAO,QAASD,GAAc,QAAM,EACrC,EAAAC,QAAA,cAAC,UACC,QAASL,EACT,QAAQ,YACR,MAAM,UACN,SAAUT,IAAa,GAAK,CAACI,EAAgB,KAAK,GAEjDJ,IAAa,EAAI,OAAS,iBAC7B,CACF,CACF,CACF,CAEJ,CD5Ke,SAARoB,GAAwC,CAC7C,mBAAAC,EACA,2BAAAC,CACF,EAGG,CACD,OACE,GAAAC,QAAA,cAAC,eACC,QAAQ,QACR,GAAI,CAAE,GAAI,EAAG,QAAS,OAAQ,WAAY,QAAS,GACpD,sDACqD,IACnDC,GAA2BH,CAAkB,GAAKA,EAAoB,IAAI,YAE3E,GAAAE,QAAA,cAACE,GAAA,CACC,MAAOJ,EACP,SAAUC,EACZ,CACF,CAEJ,CG1BA,eAAsBI,GACpBC,EACAC,EACAC,EACA,CACA,GAAI,CACF,MAAMF,EAAG,EACTC,IAAY,CACd,OAASE,EAAG,CACV,QAAQ,MAAMA,CAAC,EACfD,IAAUC,CAAC,CACb,CACF,CAmBO,SAASC,GAAwB,CACtC,UAAAC,EACA,4BAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAAiC,CAC/B,OAAID,GAAaC,EACR,CAAC,EAEH,CACL,CAACJ,GAAa,sBACd,CAACC,GACC,8EACF,CAACC,GAAsB,wBACzB,EAAE,OAAQG,GAAmB,OAAOA,GAAM,QAAQ,CACpD,CRzCAC,KAkCe,SAARC,GAAoC,CACzC,YAAAC,EACA,UAAAC,EACA,4BAAAC,EACA,mBAAAC,EACA,IAAAC,EACA,cAAAC,EACA,QAAAC,EACA,KAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,2BAAAC,EACA,eAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,GAAM,CAACC,EAAYC,CAAa,KAAI,aAAS,EAAK,EAC5C,CAACC,EAAcC,CAAe,KAAI,aAAS,EAAK,EAChD,CAACC,EAAaC,CAAc,KAAI,aAAkB,EAGlDC,EACJ,CAACR,GACD,CAAC,CAACX,GACF,CAAC,CAACC,GACF,CAAC,CAACC,EAEEkB,EAAiBC,GAAwB,CAC7C,UAAArB,EACA,4BAAAC,EACA,mBAAAC,EACA,UAAAS,EACA,MAAAC,CACF,CAAC,EAEKU,EAAY,IAAM,CACtBR,EAAc,EAAK,CACrB,EAEMS,EAAa,CACjB,QAAAhB,EACA,KAAAD,EACA,QAAAD,EACA,mBAAAH,EACA,UAAAF,CACF,EACMwB,GAAiB,CACrB,GAAGD,EACH,IAAApB,EACA,+BAAgCF,GAA6B,IAC7D,mBAAAO,CACF,EAEMiB,EAAaC,IAAmC,IAAM,CAC1DJ,EAAU,EACLK,GAAWD,GAAI3B,EAAamB,CAAc,CACjD,EAEMU,GAAqBH,EAAU,IAAM,CACzCI,GAAoBL,EAAc,CACpC,CAAC,EAEKM,GAAqBL,EAAU,SAAY,CAC/C,MAAMM,GAAoB,CAAE,GAAGR,EAAY,cAAAnB,CAAc,CAAC,CAC5D,CAAC,EAEK4B,GAAkBP,EAAU,IAAM,CACtCQ,GAAcV,CAAU,CAC1B,CAAC,EAEKW,EAAwBT,EAAU,IAAM,CAC5CU,GAA2BX,EAAc,CAC3C,CAAC,EAEKY,EAAgB,CACpB,CACE,IAAK,KACL,MAAO,mCACP,YACE,qEACF,QAASR,EACX,EACA,CACE,IAAK,KACL,MAAO,oCACP,YAAa,0DACb,QAASE,EACX,EACA,GAAIO,GAAiB,EACjB,CACE,CACE,IAAK,MACL,MAAO,kBACP,YAAa,iDACb,QAASL,EACX,EACA,CACE,IAAK,SACL,MAAO,iCACP,YAAa,2CACb,QAASE,CACX,CACF,EACA,CAAC,CACP,EAEA,OACE,GAAAI,QAAA,iBAAAA,QAAA,cACGrB,EAAc,GAAAqB,QAAA,cAAC,iBAAa,MAAOrB,EAAa,EAAK,KACrDP,IAAmB,GAClB,GAAA4B,QAAA,cAACC,GAAA,CACC,mBAAoB/B,EACpB,2BAA4BC,EAC9B,EACE,KACJ,GAAA6B,QAAA,cAAC,YAAQ,MAAM,mBACb,GAAAA,QAAA,cAAC,eACC,KAAK,QACL,aAAW,kBACX,QAAS,IAAM,CACbtB,EAAgB,EAAI,CACtB,GAEA,GAAAsB,QAAA,cAACE,GAAA,CAAa,SAAS,QAAQ,CACjC,CACF,EACA,GAAAF,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,YACN,KAAK,QACL,QAAS,IAAM,CACbvC,EAAY,CACd,GACD,QAED,EACC,CAACoB,GAAaC,EAAe,OAAS,EACrC,GAAAkB,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,QAAQ,GAAI,CAAE,GAAI,CAAE,GACnDlB,EAAe,KAAK,IAAI,CAC3B,EACE,KACJ,GAAAkB,QAAA,cAAC,gBAAY,QAAQ,YAAY,MAAM,UAAU,KAAK,SACpD,GAAAA,QAAA,cAAC,WAAO,SAAU,CAACnB,EAAW,QAASS,IAAoB,QAE3D,EACA,GAAAU,QAAA,cAAC,WACC,SAAU,CAACnB,EACX,QAAS,IAAM,CACbL,EAAc,EAAI,CACpB,EACA,aAAW,uBAEX,GAAAwB,QAAA,cAACG,GAAA,IAAkB,CACrB,CACF,EACA,GAAAH,QAAA,cAACI,GAAA,CACC,KAAM7B,EACN,QAASS,EACT,QAASc,EACX,EACA,GAAAE,QAAA,cAACK,GAAA,CACC,KAAM5B,EACN,QAAS,IAAM,CACbC,EAAgB,EAAK,CACvB,EACF,CACF,CAEJ,CSrNA,IAAA4B,GAAkB,OAElBC,GAA2B,OAYZ,SAARC,GAAsC,CAC3C,UAAAC,EACA,UAAAC,EACA,IAAAC,EACA,mBAAAC,EACA,mBAAAC,CACF,EAA8B,CAC5B,OAAOJ,EAAY,KAAO,CAACC,GAAaE,EACtC,GAAAE,QAAA,cAAC,eAAW,MAAM,gBAAe,8DAC6B,IAC3DD,IAAuB,MAAQ,eAAiB,gBAAgB,GACnE,EACEH,EACF,GAAAI,QAAA,cAAC,eAAW,MAAM,gBAAe,8BACHJ,EAC3BC,EACC,GAAAG,QAAA,iBAAAA,QAAA,cACG,IAAI,IACH,IACF,GAAAA,QAAA,cAAC,KAAE,KAAMH,EAAK,OAAO,SAAS,IAAI,cAC/BA,CACH,CACF,EACE,IACN,EACE,IACN,CCxCA,IAAAI,GAAkB,OAElBC,GAAoC,OAEpCC,KAQe,SAARC,GAAoC,CACzC,IAAAC,EACA,OAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAQG,CACD,IAAMC,EAAWC,GAAmBH,CAAO,EACrCI,EAAqB,CAAC,EACtBC,EAAwB,CAAC,EACzBC,EAAoB,CAAC,EAE3B,QAAWC,KAAKV,EAAU,CACxB,IAAMW,EAAQV,EAAiBS,EAAE,GAAG,CAAC,EAChCC,EAGHT,GACAU,GAAeD,EAAM,GAAG,IAAMT,EAE9BK,EAAQ,KAAKG,CAAC,EAEdF,EAAW,KAAKE,CAAC,EAPjBD,EAAO,KAAKC,CAAC,CASjB,CAEA,IAAMG,EAAe,CAACC,EAAYC,IAChCd,EAAiBc,EAAE,GAAG,CAAC,EAAG,IAAI,OAASd,EAAiBa,EAAE,GAAG,CAAC,EAAG,IAAI,OAEvE,OACE,GAAAE,QAAA,cAAC,cACC,MAAOlB,GAAO,GACd,SAAUmB,GAAS,CACjBlB,EAAOkB,EAAM,OAAO,KAAK,CAC3B,EACA,MAAM,4BACN,OAAM,GACN,SAAUb,GAETG,EAAQ,SAASM,CAAY,EAAE,IAAIH,GAClC,GAAAM,QAAA,cAAC,aAAS,MAAON,EAAE,GAAG,EAAG,IAAKA,EAAE,GAAG,GAChCL,EAAS,MAAIa,GAAyBR,CAAC,EAAE,KACzCT,EAAiBS,EAAE,GAAG,CAAC,EAAG,IAAI,OAAO,kCACxC,CACD,EACAF,EAAW,SAASK,CAAY,EAAE,IAAIH,GACrC,GAAAM,QAAA,cAAC,aAAS,MAAON,EAAE,GAAG,EAAG,IAAKA,EAAE,GAAG,GAChCL,EAAS,MAAIa,GAAyBR,CAAC,EAAE,KACzCT,EAAiBS,EAAE,GAAG,CAAC,EAAG,IAAI,OAAO,KACxC,CACD,EACAD,EAAO,IAAIC,GACV,GAAAM,QAAA,cAAC,aAAS,MAAON,EAAE,GAAG,EAAG,IAAKA,EAAE,GAAG,EAAG,SAAQ,IAC3CL,EAAS,MAAIa,GAAyBR,CAAC,EAAE,YAC5C,CACD,CACH,CAEJ,CChFA,IAAAS,EAAkB,OAElBC,EAOO,OAoBQ,SAARC,GAAgC,CACrC,WAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,wBAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,2BAAAC,EACA,WAAAC,CACF,EAAwB,CACtB,OACE,EAAAC,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,SAAU,MAAO,GACpE,EAAAA,QAAA,cAAC,eAAY,UAAU,YACrB,EAAAA,QAAA,cAAC,cACC,IAAG,GACH,MAAOT,EACP,SAAUU,GAAS,CACjBT,EAAmBS,EAAM,OAAO,KAAmB,CACrD,GAECN,GACC,EAAAK,QAAA,cAAC,oBACC,MAAM,UACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAO,iBAAiBL,CAAgB,IAC1C,EAEF,EAAAK,QAAA,cAAC,oBACC,MAAM,OACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,2CACR,EACA,EAAAA,QAAA,cAAC,oBACC,MAAM,SACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,iBACR,EACCJ,GACC,EAAAI,QAAA,cAAC,oBACC,MAAM,WACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,0CACR,CAEJ,CACF,EACCD,CACH,EAECR,IAAe,UACd,EAAAS,QAAA,cAAC,WACC,EAAAA,QAAA,cAAC,aACC,MAAM,aACN,QAAQ,WACR,YAAY,cACZ,KAAK,QACL,MAAOP,EACP,SAAUS,GAAK,CACbR,EAAwBQ,EAAE,OAAO,KAAK,CACxC,EACF,CACF,EAGDX,IAAe,YACdM,GACAC,GACE,EAAAE,QAAA,cAAC,WACC,EAAAA,QAAA,cAAC,eAAY,UAAU,YACrB,EAAAA,QAAA,cAAC,cACC,IAAG,GACH,MAAOH,EACP,SAAUI,GAAS,CACjBH,EACEG,EAAM,OAAO,KACf,CACF,GAEA,EAAAD,QAAA,cAAC,oBACC,MAAM,MACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,cACR,EACA,EAAAA,QAAA,cAAC,oBACC,MAAM,WACN,QAAS,EAAAA,QAAA,cAAC,YAAM,EAChB,MAAM,cACR,CACF,CACF,EACA,EAAAA,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,kBAAiB,2CAEnD,CACF,EAGHT,IAAe,UAAY,CAACE,GAC3B,EAAAO,QAAA,cAAC,cAAW,QAAQ,QAAQ,MAAM,kBAAiB,SAC1C,IACP,EAAAA,QAAA,cAACG,GAAA,CAAa,KAAK,4BAA2B,SAAO,EACpD,OACD,EAAAH,QAAA,cAACG,GAAA,CAAa,KAAK,gCAA+B,aAElD,CACF,CAEJ,CAEJ,CC3IA,IAAAC,EAAkB,OAElBC,EAWO,OACPC,GAA2B,QAM3B,IAAMC,MAAY,eAAW,EAAE,CAC7B,eAAgB,CACd,UAAW,GACb,EACA,WAAY,CACV,WAAY,OACZ,gBAAiB,SACnB,EACA,YAAa,CACX,gBAAiB,SACnB,EACA,aAAc,CACZ,OAAQ,UACR,UAAW,CACT,gBAAiB,SACnB,CACF,EACA,aAAc,CACZ,gBAAiB,UACjB,MAAO,QACP,SAAU,SACV,OAAQ,EACV,EACA,eAAgB,CACd,gBAAiB,UACjB,MAAO,QACP,SAAU,SACV,OAAQ,EACV,CACF,CAAC,EAQc,SAARC,GAAqC,CAC1C,QAAAC,EACA,kBAAAC,EACA,SAAAC,CACF,EAA6B,CAC3B,GAAM,CAAE,QAAAC,EAAS,GAAAC,CAAG,EAAIN,GAAU,EAElC,OAAOE,EAAQ,SAAW,EAAI,KAC5B,EAAAK,QAAA,cAAC,WACC,EAAAA,QAAA,cAAC,cAAW,QAAQ,QAAQ,GAAI,CAAE,GAAI,CAAE,GAAG,SAClCL,EAAQ,OAAO,+BACxB,EACA,EAAAK,QAAA,cAAC,kBAAe,UAAW,QAAO,UAAWF,EAAQ,gBACnD,EAAAE,QAAA,cAAC,SAAM,KAAK,QAAQ,aAAY,IAC9B,EAAAA,QAAA,cAAC,iBACC,EAAAA,QAAA,cAAC,gBACC,EAAAA,QAAA,cAAC,aAAU,UAAWF,EAAQ,WAAY,QAAQ,WAAW,EAC7D,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,WAAS,EACnD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,MAAI,EAC9C,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,UAAQ,EAClD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,SAAO,EACjD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,QAAM,CAClD,CACF,EACA,EAAAE,QAAA,cAAC,iBACEL,EAAQ,IAAIM,GACX,EAAAD,QAAA,cAAC,YACC,IAAKC,EAAM,UACX,QAAS,IAAM,CACbJ,EAASI,EAAM,SAAS,CAC1B,EACA,UAAWF,EACTD,EAAQ,aACRF,IAAsBK,EAAM,WAAaH,EAAQ,WACnD,GAEA,EAAAE,QAAA,cAAC,aAAU,QAAQ,YACjB,EAAAA,QAAA,cAAC,SACC,QAASJ,IAAsBK,EAAM,UACrC,KAAK,QACP,CACF,EACA,EAAAD,QAAA,cAAC,iBACC,EAAAA,QAAA,cAACE,GAAA,CACC,KAAM,qCAAqCD,EAAM,SAAS,IAEzDA,EAAM,SACT,CACF,EACA,EAAAD,QAAA,cAAC,iBAAWC,EAAM,UAAY,GAAI,EAClC,EAAAD,QAAA,cAAC,iBAAWC,EAAM,cAAgB,GAAI,EACtC,EAAAD,QAAA,cAAC,iBACEC,EAAM,YACHA,EAAM,YAAY,OAAS,GACzB,GAAGA,EAAM,YAAY,MAAM,EAAG,EAAE,CAAC,MACjCA,EAAM,YACR,GACN,EACA,EAAAD,QAAA,cAAC,iBACC,EAAAA,QAAA,cAAC,QACC,MAAOC,EAAM,WAAa,WAAa,aACvC,KAAK,QACL,UACEA,EAAM,WACFH,EAAQ,aACRA,EAAQ,eAEhB,CACF,CACF,CACD,CACH,CACF,CACF,CACF,CAEJ,CCrIA,IAAAK,GAAyB,OCAzBC,KCGO,IAAMC,GAAqB,CAChC,kBAAmB,GACnB,sBAAuB,GACvB,kBAAmB,EACrB,ECCA,eAAsBC,GAAqB,CACzC,OAAAC,EACA,WAAAC,EACA,QAAAC,CACF,EAIG,CACD,IAAMC,EAAQ,MAAMH,EAAO,SAAS,UAAU,YAAYC,CAAU,EAEpE,aAAMD,EAAO,SAAS,UAAU,UAAU,YACxCC,EACA,aACA,CACE,wBAAyB,GACzB,2BAA4BC,GAAS,oBACvC,CACF,EACO,CAAE,MAAAC,CAAM,CACjB,CCtBA,eAAsBC,GAAqB,CACzC,KAAAC,EACA,OAAAC,EAAS,MACT,QAAAC,EACA,OAAAC,CACF,EAKG,CACD,IAAMC,EAAQ,MAAMD,EAAO,SAAS,KAAK,QAAQ,CAC/C,KAAAH,EACA,MAAOE,GAAS,SAClB,CAAC,EAEKG,EAAa,MAAMF,EAAO,SAAS,UAAU,gBACjDC,EACAH,CACF,EACA,OAAOK,GAAqB,CAAE,OAAAH,EAAQ,WAAAE,EAAY,QAAAH,CAAQ,CAAC,CAC7D,CCrBA,eAAsBK,GAAoB,CACxC,IAAAC,EACA,OAAAC,EAAS,QACT,SAAAC,EACA,QAAAC,EACA,OAAAC,CACF,EAMG,CACD,IAAMC,EAAO,MAAMD,EAAO,SAAS,KAAK,SACtC,CACE,IAAAJ,EACA,SAAAE,CACF,EACA,CACE,MAAO,CACL,QAAS,EACX,CACF,CACF,EAEMI,EAAa,MAAMF,EAAO,SAAS,UAAU,gBACjDC,EACAJ,CACF,EACA,OAAOM,GAAqB,CAAE,OAAAH,EAAQ,WAAAE,EAAY,QAAAH,CAAQ,CAAC,CAC7D,CCpBO,SAASK,GACdC,EACsB,CACtB,OAAOA,EAAM,KAAK,KAAK,SAAS,UAAU,IAAIC,GAC5C,MAAM,KAAKA,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,CAChD,CACF,CCtBAC,KAIA,eAAsBC,GACpBC,EACA,CACA,GAAM,CAAE,eAAAC,EAAgB,cAAAC,CAAc,EAAI,MAAMC,GAAY,EACtDC,EAAM,SAAS,cAAc,KAAK,EAClCC,EAAS,MAAMJ,EAAe,CAClC,OAAQG,EACR,OAAQF,CACV,CAAC,EAED,GAAI,CACF,OAAO,MAAMF,EAASK,CAAM,CAC9B,QAAE,CACAA,EAAO,QAAQ,EACfD,EAAI,OAAO,CACb,CACF,CNVA,SAASE,GAAsBC,EAAmC,CAChE,IAAMC,EAAMD,EAAS,YAAY,GAAG,EAC9BE,EAAMD,GAAO,EAAID,EAAS,MAAMC,EAAM,CAAC,EAAE,YAAY,EAAI,GAC/D,OAAIC,IAAQ,OAASA,IAAQ,SAAWA,IAAQ,OACvC,QAEF,KACT,CAEA,eAAeC,GAAe,CAAE,KAAAC,EAAM,IAAAC,CAAI,EAAkC,CAC1E,OAAOC,GAA2B,MAAMC,GAAU,CAChD,GAAM,CAAE,MAAAC,CAAM,EAAIJ,EACd,MAAMK,GAAqB,CACzB,KAAM,MAAML,EAAK,KAAK,EACtB,OAAAG,EACA,OAAQR,GAAsBK,EAAK,IAAI,CACzC,CAAC,EACD,MAAMM,GAAoB,CAAE,IAAKL,EAAM,OAAAE,CAAO,CAAC,EACnD,OAAOI,GAA0BH,CAAK,CACxC,CAAC,CACH,CAKe,SAARI,GAA0C,CAC/C,KAAAR,EACA,IAAAC,CACF,EAGG,CACD,IAAMQ,EAAMT,EACP,CAAC,iBAAkBA,EAAK,KAAMA,EAAK,KAAMA,EAAK,YAAY,EAC3DC,EACG,CAAC,gBAAiBA,CAAG,EACtB,KACA,CAAE,KAAAS,EAAM,MAAAC,EAAO,UAAAC,EAAW,aAAAC,CAAa,EAAIC,GAC/CL,EACA,SAAY,CACV,IAAMM,EAAM,MAAMhB,GAAe,CAAE,KAAAC,EAAM,IAAAC,CAAI,CAAC,EAC9C,GAAI,CAACc,EACH,MAAM,IAAI,MAAM,+BAA+B,EAEjD,OAAOA,CACT,EACA,CACE,GAAGC,GACH,iBAAkB,EACpB,CACF,EAKA,MAAO,CAAE,MAAAL,EAAO,UAAAC,EAAW,aAAAC,EAAc,UAAWH,CAAK,CAC3D,COjEAO,KAKe,SAARC,GAAkC,CACvC,UAAAC,CACF,EAEG,CACD,IAAMC,EAAMD,EAAYE,GAAyBF,CAAS,EAAI,OACxDG,EAAgBH,EAClBI,GAA0BJ,CAAS,EACnC,OAEE,CAAE,UAAAK,EAAW,UAAAC,EAAW,aAAAC,EAAc,MAAAC,CAAM,EAChDC,GAAyB,CAAE,IAAAR,CAAI,CAAC,EAElC,MAAO,CACL,UAAAK,EACA,aAAAC,EACA,MAAAC,EACA,IAAAP,EACA,cAAAE,EACA,kBAAmBE,IAAY,CAAC,CAClC,CACF,CC3BA,IAAAK,GAAwB,OAExBC,KCFA,eAAsBC,GAAQC,EAAaC,EAAoB,CAC7D,IAAMC,EAAW,MAAM,MAAMF,EAAKC,CAAI,EAEtC,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MACR,QAAQA,EAAS,MAAM,aAAaF,CAAG,IAAI,MAAME,EAAS,KAAK,CAAC,EAClE,EAGF,OAAOA,CACT,CAEA,eAAsBC,GACpBH,EACAC,EACY,CAEZ,OADiB,MAAMF,GAAQC,EAAKC,CAAI,GACxB,KAAK,CACvB,CAEA,SAASG,GAAWC,EAAqB,CACvC,OAAOA,EAAO,kBAAkB,MAC5BA,EAAO,OACP,IAAI,MAAM,UAAW,CAAE,MAAOA,EAAO,MAAO,CAAC,CACnD,CAEO,SAASC,GAAQC,EAAcF,EAAsB,CAC1D,OAAO,IAAI,QAAc,CAACG,EAASC,IAAW,CAC5C,GAAIJ,GAAQ,QACVI,EAAOL,GAAWC,CAAM,CAAC,MACpB,CACL,IAAMK,EAAK,WAAWF,EAASD,CAAI,EACnCF,GAAQ,iBACN,QACA,IAAM,CACJ,aAAaK,CAAE,EACfD,EAAOL,GAAWC,CAAM,CAAC,CAC3B,EACA,CAAE,KAAM,EAAK,CACf,CACF,CACF,CAAC,CACH,CCvCA,SAASM,GAAQC,EAAWC,EAAW,CACrC,IAAMC,GAAOF,EAAI,QAAWC,EAAI,OAEhC,OADaD,GAAK,KAAOC,GAAK,KAAOC,GAAO,KAC7B,GAAOA,EAAM,KAC9B,CAEA,SAASC,GAAcC,EAAaC,EAAa,CAC/C,OAAQD,GAAOC,EAAQD,IAAS,GAAKC,CACvC,CAEA,SAASC,GACPC,EACAC,EACAC,EACAT,EACAU,EACAC,EACA,CACA,OAAOZ,GAAQI,GAAcJ,GAAQA,GAAQS,EAAGD,CAAC,EAAGR,GAAQC,EAAGW,CAAC,CAAC,EAAGD,CAAC,EAAGD,CAAC,CAC3E,CAEA,SAASG,GACPJ,EACAC,EACAI,EACAC,EACAd,EACAU,EACAC,EACA,CACA,OAAOL,GAAQG,EAAII,EAAM,CAACJ,EAAIK,EAAIN,EAAGC,EAAGT,EAAGU,EAAGC,CAAC,CACjD,CAEA,SAASI,GACPP,EACAC,EACAI,EACAC,EACAd,EACAU,EACAC,EACA,CACA,OAAOL,GAAQG,EAAIK,EAAMD,EAAI,CAACC,EAAIN,EAAGC,EAAGT,EAAGU,EAAGC,CAAC,CACjD,CAEA,SAASK,GACPR,EACAC,EACAI,EACAC,EACAd,EACAU,EACAC,EACA,CACA,OAAOL,GAAOG,EAAII,EAAIC,EAAGN,EAAGC,EAAGT,EAAGU,EAAGC,CAAC,CACxC,CAEA,SAASM,GACPT,EACAC,EACAI,EACAC,EACAd,EACAU,EACAC,EACA,CACA,OAAOL,GAAOO,GAAKJ,EAAI,CAACK,GAAIN,EAAGC,EAAGT,EAAGU,EAAGC,CAAC,CAC3C,CAEA,SAASO,GAAQlB,EAAamB,EAAa,CACzCnB,EAAEmB,GAAO,CAAC,GAAM,KAASA,EAAM,GAC/BnB,GAAKmB,EAAM,KAAQ,GAAM,GAAK,EAAE,EAAIA,EAEpC,IAAIX,EAAI,WACJC,EAAI,WACJI,EAAI,YACJC,EAAI,UAER,QAASM,EAAI,EAAGA,EAAIpB,EAAE,OAAQoB,GAAK,GAAI,CACrC,IAAMC,EAAOb,EACPc,EAAOb,EACPc,EAAOV,EACPW,EAAOV,EAEbN,EAAII,GAAMJ,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,CAAC,GAAK,EAAG,EAAG,UAAU,EAC9CN,EAAIF,GAAME,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDP,EAAID,GAAMC,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,SAAS,EAClDX,EAAIG,GAAMH,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDZ,EAAII,GAAMJ,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIF,GAAME,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDP,EAAID,GAAMC,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDX,EAAIG,GAAMH,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,SAAS,EAClDZ,EAAII,GAAMJ,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIF,GAAME,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDP,EAAID,GAAMC,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,MAAM,EAChDX,EAAIG,GAAMH,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EACrDZ,EAAII,GAAMJ,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,UAAU,EACnDN,EAAIF,GAAME,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,SAAS,EACnDP,EAAID,GAAMC,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EACrDX,EAAIG,GAAMH,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,UAAU,EAEpDZ,EAAIO,GAAMP,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIC,GAAMD,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,WAAW,EACnDP,EAAIE,GAAMF,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,SAAS,EACnDX,EAAIM,GAAMN,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,CAAC,GAAK,EAAG,GAAI,UAAU,EAC/CZ,EAAIO,GAAMP,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIC,GAAMD,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,QAAQ,EACjDP,EAAIE,GAAMF,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,UAAU,EACpDX,EAAIM,GAAMN,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDZ,EAAIO,GAAMP,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,SAAS,EACjDN,EAAIC,GAAMD,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,WAAW,EACpDP,EAAIE,GAAMF,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDX,EAAIM,GAAMN,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDZ,EAAIO,GAAMP,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,WAAW,EACpDN,EAAIC,GAAMD,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,SAAS,EACjDP,EAAIE,GAAMF,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDX,EAAIM,GAAMN,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EAErDZ,EAAIQ,GAAMR,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,OAAO,EAC/CN,EAAIE,GAAMF,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDP,EAAIG,GAAMH,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,UAAU,EACpDX,EAAIO,GAAMP,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,SAAS,EACnDZ,EAAIQ,GAAMR,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,WAAW,EACnDN,EAAIE,GAAMF,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDP,EAAIG,GAAMH,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDX,EAAIO,GAAMP,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EACrDZ,EAAIQ,GAAMR,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,SAAS,EAClDN,EAAIE,GAAMF,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,CAAC,GAAK,EAAG,GAAI,UAAU,EAC/CP,EAAIG,GAAMH,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDX,EAAIO,GAAMP,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,QAAQ,EACjDZ,EAAIQ,GAAMR,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIE,GAAMF,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,UAAU,EACpDP,EAAIG,GAAMH,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,SAAS,EACnDX,EAAIO,GAAMP,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EAEnDZ,EAAIS,GAAMT,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,CAAC,GAAK,EAAG,EAAG,UAAU,EAC9CN,EAAIG,GAAMH,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EACnDP,EAAII,GAAMJ,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EACrDX,EAAIQ,GAAMR,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,SAAS,EAClDZ,EAAIS,GAAMT,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,EAAE,GAAK,EAAG,EAAG,UAAU,EACnDN,EAAIG,GAAMH,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDP,EAAII,GAAMJ,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,QAAQ,EAClDX,EAAIQ,GAAMR,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDZ,EAAIS,GAAMT,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIG,GAAMH,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,SAAS,EACnDP,EAAII,GAAMJ,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,WAAW,EACpDX,EAAIQ,GAAMR,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,UAAU,EACpDZ,EAAIS,GAAMT,EAAGC,EAAGI,EAAGC,EAAGd,EAAEoB,EAAI,CAAC,GAAK,EAAG,EAAG,UAAU,EAClDN,EAAIG,GAAMH,EAAGN,EAAGC,EAAGI,EAAGb,EAAEoB,EAAI,EAAE,GAAK,EAAG,GAAI,WAAW,EACrDP,EAAII,GAAMJ,EAAGC,EAAGN,EAAGC,EAAGT,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,SAAS,EAClDX,EAAIQ,GAAMR,EAAGI,EAAGC,EAAGN,EAAGR,EAAEoB,EAAI,CAAC,GAAK,EAAG,GAAI,UAAU,EAEnDZ,EAAIT,GAAQS,EAAGa,CAAI,EACnBZ,EAAIV,GAAQU,EAAGa,CAAI,EACnBT,EAAId,GAAQc,EAAGU,CAAI,EACnBT,EAAIf,GAAQe,EAAGU,CAAI,CACrB,CACA,MAAO,CAAChB,EAAGC,EAAGI,EAAGC,CAAC,CACpB,CAEA,SAASW,GAASC,EAAoB,CACpC,IAAMC,EAAS,mBACXC,EAAM,GACV,QAASR,EAAI,EAAGA,EAAIM,EAAS,OAAS,EAAGN,IACvCQ,GACED,EAAO,OAAQD,EAASN,GAAK,CAAC,GAAQA,EAAI,EAAK,EAAI,EAAM,EAAG,EAC5DO,EAAO,OAAQD,EAASN,GAAK,CAAC,GAAQA,EAAI,EAAK,EAAM,EAAG,EAE5D,OAAOQ,CACT,CAEA,SAASC,GAASD,EAAa,CAC7B,IAAME,EAAgB,CAAC,EAEvB,QAASV,EAAI,EAAGA,EAAIQ,EAAI,OAAS,EAAGR,GAAK,EACvCU,EAAIV,GAAK,CAAC,GACPU,EAAIV,GAAK,CAAC,GAAK,IAAOQ,EAAI,WAAWR,EAAI,CAAC,EAAI,MAAUA,EAAI,GAEjE,OAAOU,CACT,CAEO,SAASC,GAAIH,EAAa,CAC/B,OAAOH,GAASP,GAAQW,GAASD,CAAG,EAAGA,EAAI,OAAS,CAAC,CAAC,CACxD,CFnLAI,KAmBe,SAARC,GAA4C,CACjD,SAAAC,EACA,WAAAC,EACA,QAAAC,EAAU,EACZ,EAIG,CACD,IAAMC,KAAc,YAAQ,IAAM,CAChC,GAAI,CAACH,EACH,OAEF,IAAMI,EAAWC,GAAeL,EAAS,YAAY,CAAC,EACtD,OAAOC,IAAe,MAAQK,GAAIF,CAAQ,EAAIA,CAChD,EAAG,CAACJ,EAAUC,CAAU,CAAC,EAEnB,CAAE,KAAAM,EAAM,MAAAC,EAAO,UAAAC,EAAW,aAAAC,CAAa,EAC3CC,GACET,GAAWC,EACP,uDAAuD,mBAAmBA,CAAW,CAAC,SAASF,CAAU,GACzG,KACJW,GACA,CACE,GAAGC,GACH,iBAAkB,EACpB,CACF,EAEF,MAAO,CACL,UAAAJ,EACA,aAAAC,EACA,OAAQH,EACR,UAAWA,GAAM,iBACjB,OAAQA,GAAM,OACd,YAAaA,GAAM,YACnB,kBAAmBA,GAAM,SACzB,MAAAC,CACF,CACF,CGjEA,IAAAM,GAAoC,OAOrB,SAARC,GAAsCC,EAAUC,EAAU,IAAQ,CACvE,GAAM,CAACC,EAAWC,CAAY,KAAI,aAASH,CAAK,EAChD,uBAAU,IAAM,CACd,IAAMI,EAAI,WAAW,IAAM,CACzBD,EAAaH,CAAK,CACpB,EAAGC,CAAO,EACV,MAAO,IAAM,CACX,aAAaG,CAAC,CAChB,CACF,EAAG,CAACJ,EAAOC,CAAO,CAAC,EACZC,CACT,CClBA,IAAAG,GAA2B,QAC3BC,KCDA,IAAAC,GAAwB,QACxBC,GAIO,QAUA,SAASC,GAAOC,EAAkBC,EAAkB,CACzD,OAAOD,EAAS,IAAIE,GAAOD,EAAS,MAAMC,EAAI,MAAOA,EAAI,GAAG,CAAC,EAAE,KAAK,EAAE,CACxE,CAEO,SAASC,GAAyB,CACvC,IAAAC,EACA,SAAAH,EACA,WAAAI,CACF,EAIG,CACD,IAAMC,EAAMP,GAAOK,EAAKH,CAAQ,EAC5BM,EAAU,GACd,QAAS,EAAI,EAAG,EAAID,EAAI,OAAQ,GAAK,EAEnCC,GAAWF,EAAWC,EAAI,MAAM,EAAG,EAAI,CAAC,CAAC,GAAK,IAEhD,OAAOC,CACT,CAEO,SAASC,GAAQC,EAAcC,EAAgB,CACpD,OAAOD,EACJ,IAAIP,IAAQ,CACX,GAAGA,EACH,MAAOQ,EAASR,EAAI,IACpB,IAAKQ,EAASR,EAAI,KACpB,EAAE,EACD,SAAS,CAACS,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,CACzC,CAEA,SAASC,GAAUC,EAAY,CAC7B,MAAO,GAAGA,EAAK,KAAK,IAAIA,EAAK,GAAG,EAClC,CAEO,SAASC,GAAON,EAAc,CACnC,OAAOA,EAAK,OACV,CAACO,EAAMC,EAAKC,IAAQ,CAACD,GAAOJ,GAAUG,CAAI,IAAMH,GAAUK,EAAID,EAAM,CAAC,CAAE,CACzE,CACF,CAEO,SAASE,GAAmB,CACjC,QAAAC,EACA,IAAAC,CACF,EAGG,CACD,IAAMC,EAAeF,EAAQ,IAAI,OAAO,EAClCG,EAASH,EAAQ,IAAI,QAAQ,EAC7BI,EAAcJ,EAAQ,IAAI,aAAa,GAAK,CAAC,EAC7ChB,EAAMW,GACVS,EACG,SAAS,CAACb,EAAGC,IAAMD,EAAE,IAAI,OAAO,EAAIC,EAAE,IAAI,OAAO,CAAC,EAClD,IAAIV,IAAQ,CACX,MAAOA,EAAI,IAAI,OAAO,EAAIoB,EAC1B,IAAKpB,EAAI,IAAI,KAAK,EAAIoB,EACtB,KAAMpB,EAAI,IAAI,MAAM,CACtB,EAAE,EACD,OAAOuB,GAAKA,EAAE,OAAS,KAAK,CACjC,EAEA,OAAOtB,GAAyB,CAC9B,IAAKoB,IAAW,GAAKf,GAAQJ,EAAKiB,EAAI,MAAM,EAAIjB,EAChD,SAAUmB,IAAW,MAAK,WAAOF,CAAG,EAAIA,EACxC,cAAY,uBAAmB,oBAAiB,CAClD,CAAC,CACH,CAEA,eAAsBK,GAAgB,CACpC,QAAAN,EACA,QAAAO,EACA,aAAAC,CACF,EAIG,CACD,IAAMC,EAAQT,EAAQ,IAAI,OAAO,EAC3BU,EAAMV,EAAQ,IAAI,KAAK,EACvBW,EAAUX,EAAQ,IAAI,SAAS,EAC/B,CAAE,gBAAAY,EAAiB,WAAAC,CAAW,EAAIN,EAClCO,EAAWN,EACb,MAAMI,EAAgB,gBAAgBJ,CAAY,EAClD,OACJ,GAAI,CAACM,EACH,MAAM,IAAI,MAAM,oBAAoB,EAEtC,IAAMC,EAAY,cACZC,EAAQ,MAAMH,EAAW,KAAKE,EAAW,kBAAmB,CAChE,iBAAe,YAAQD,EAAU,CAAC,WAAY,SAAS,CAAC,EACxD,UAAAC,EACA,QAAS,CACP,CACE,MAAAN,EACA,IAAAC,EACA,QAASI,EAAS,oBAAoBH,CAAO,EAC7C,aAAAH,CACF,CACF,CACF,CAAC,EAEK,CAACd,CAAI,EAAIsB,EACTf,EAAMP,GAAM,IAAI,KAAK,EAC3B,OAAOO,EAAMF,GAAmB,CAAE,IAAAE,EAAK,QAAAD,CAAQ,CAAC,EAAI,MACtD,CDpHAiB,KAIe,SAARC,GAA4C,CACjD,QAAAC,EACA,KAAAC,CACF,EAGG,CACD,GAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,UAAAC,CAAU,EAAIC,GAGjC,CAAC,oBAAqBL,EAAQ,GAAG,EAAGC,GAAM,gBAAgB,CAAC,CAAC,EAC5D,SAAY,CACV,IAAMK,EAAcC,GAAsBP,CAAO,EAC3CQ,EAAoB,CAAC,EAiBrBC,GAhBU,MAAM,QAAQ,IAC5BH,EAAY,IAAI,MAAMI,GAAK,CACzB,GAAI,CACF,IAAMC,EAAM,MAAMC,GAAgB,CAChC,WAAS,eAAWX,CAAI,EACxB,aAAcA,GAAM,gBAAgB,CAAC,EACrC,QAASS,CACX,CAAC,EACD,OAAOC,EAAO,CAACD,EAAE,GAAG,EAAG,CAAE,QAASA,EAAG,IAAAC,CAAI,CAAC,EAAc,MAC1D,OAASE,EAAG,CACV,QAAQ,MAAM,yCAA0CH,EAAE,GAAG,EAAGG,CAAC,EACjEL,EAAO,KAAKK,CAAC,EACb,MACF,CACF,CAAC,CACH,GACwB,OAAOC,GAAKA,IAAM,MAAS,EAInD,GACEL,EAAQ,SAAW,GACnBD,EAAO,SAAWF,EAAY,QAC9BE,EAAO,OAAS,EAEhB,MAAMA,EAAO,CAAC,EAEhB,OAAO,OAAO,YAAYC,CAAO,CACnC,EACA,CACE,GAAGM,GACH,iBAAkB,EACpB,CACF,EAEA,MAAO,CAAE,UAAAX,EAAW,iBAAkBF,EAAM,MAAAC,CAAM,CACpD,CE3DA,IAAAa,GAAkC,OAElCC,KAIe,SAARC,GAAwC,CAC7C,QAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,SAAAC,CACF,EAQG,CACD,GAAM,CAACC,EAAeC,CAAgB,KAAI,aAAiB,EACrD,CAACC,EAAcC,CAAe,KAAI,aAASJ,CAAQ,EACrDA,IAAaG,IACfC,EAAgBJ,CAAQ,EACxBE,EAAiB,MAAS,GAG5B,IAAMG,KAAgB,YACpB,IACEP,IAAqB,OACjBQ,GAAqB,CACnB,QAAAT,EACA,iBAAAC,EACA,kBAAAC,CACF,CAAC,GAAG,GAAG,EACP,OACN,CAACF,EAASE,EAAmBD,CAAgB,CAC/C,EAEA,MAAO,CAAE,cAAeG,GAAiBI,EAAe,iBAAAH,CAAiB,CAC3E,CCtCAK,KAOe,SAARC,GAA+C,CACpD,QAAAC,EACA,KAAAC,EACA,kBAAAC,EACA,SAAAC,CACF,EAKG,CACD,IAAMC,EAAcC,GAAsBL,CAAO,EAC3C,CAAE,iBAAAM,EAAkB,UAAAC,EAAW,MAAAC,CAAM,EAAIC,GAA2B,CACxE,QAAAT,EACA,KAAAC,CACF,CAAC,EACK,CAAE,cAAAS,EAAe,iBAAAC,CAAiB,EAAIC,GAAuB,CACjE,QAASR,EACT,iBAAAE,EACA,kBAAAJ,EACA,SAAAC,CACF,CAAC,EACKU,EAAqBT,EAAY,KAAKU,GAAKC,GAAMD,CAAC,IAAMJ,CAAa,EACrEM,EAAkBN,EACpBJ,IAAmBI,CAAa,EAChC,OAEJ,MAAO,CACL,YAAAN,EACA,iBAAAE,EACA,UAAAC,EACA,MAAAC,EACA,qBAAsBE,EACtB,wBAAyBC,EACzB,mBAAAE,EACA,gBAAAG,CACF,CACF,CC9CAC,KCCAC,KAwCA,IAAMC,GACJ,8DAEF,SAASC,GACPC,EACc,CACd,MAAO,CACL,UAAWA,EAAO,iBAClB,GAAIA,EAAO,YACX,SAAUA,EAAO,QAAQ,CAAC,GAAG,UAAU,MACvC,aACEA,EAAO,UAAU,YAAcA,EAAO,UAAU,eAClD,YAAaA,EAAO,oBAAoB,iBAAiB,UAAU,MACnE,WAAYA,EAAO,YAAc,iCACnC,CACF,CAKA,SAASC,GAAeC,EAAgC,CAEtD,OADeC,GAAqBD,CAAE,EACtB,CACd,IAAK,UACH,MAAO,gBAAgBA,CAAE,GAC3B,IAAK,SACH,MAAO,eAAeA,CAAE,GAC1B,IAAK,OACH,MAAO,aAAaA,CAAE,GACxB,IAAK,OACH,MAAO,aAAaA,EAAG,QAAQ,QAAS,EAAE,CAAC,GAC7C,QACE,MACJ,CACF,CAEA,eAAeE,GACbC,EACAC,EAAO,GACkB,CACzB,IAAMC,EAAM,mDAAmD,mBAAmBF,CAAK,CAAC,WAAWP,EAAc,SAASQ,CAAI,GAE9H,OADa,MAAME,GAA4BD,CAAG,GACtC,QAAQ,IAAIR,EAAmB,CAC7C,CAOA,eAAeU,GAAaP,EAAyC,CACnE,IAAMG,EAAQJ,GAAeC,CAAE,EAC/B,GAAI,CAACG,EACH,MAAO,CAAE,QAAS,CAAC,EAAG,MAAO,MAAU,EAEzC,GAAI,CACF,MAAO,CAAE,QAAS,MAAMD,GAAcC,CAAK,EAAG,MAAO,MAAU,CACjE,OAASK,EAAG,CACV,eAAQ,MAAM,0BAA0BR,CAAE,IAAKQ,CAAC,EACzC,CAAE,QAAS,CAAC,EAAG,MAAOA,CAAE,CACjC,CACF,CAEA,SAASC,GAAmBC,EAAyB,CACnD,IAAMC,EAAO,IAAI,IACXb,EAAyB,CAAC,EAChC,QAAWc,KAASF,EACbC,EAAK,IAAIC,EAAM,SAAS,IAC3BD,EAAK,IAAIC,EAAM,SAAS,EACxBd,EAAO,KAAKc,CAAK,GAGrB,OAAOd,CACT,CAEA,eAAsBe,GAAqB,CACzC,cAAAC,EAAgB,CAAC,EACjB,OAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,IACf,EAKG,CACD,IAAMC,EAAc,IAAI,IAAIJ,CAAa,EACnCK,EAAiBJ,EAASK,GAAqBL,CAAM,EAAI,OAC3DI,GAAkBE,GAAuBF,CAAc,GACzDD,EAAY,IAAIC,CAAc,EAGhC,IAAMG,EAAc,MAAM,QAAQ,IAAI,CAAC,GAAGJ,CAAW,EAAE,IAAIX,EAAY,CAAC,EACpEG,EAAUD,GAAmBa,EAAY,QAAQC,GAAKA,EAAE,OAAO,CAAC,EAC9DC,EAAaF,EAAY,OAAOC,GAAKA,EAAE,QAAU,MAAS,EAG5DE,EACJ,GAAI,CAACf,EAAQ,KAAKF,GAAKA,EAAE,UAAU,GAAKQ,EACtC,GAAI,CACF,IAAMb,EAAQ,QAAQa,CAAQ,oBAAoBC,CAAU,qBACtDS,EAAkB,MAAMxB,GAAcC,EAAO,CAAC,EACpDO,EAAUD,GAAmB,CAAC,GAAGC,EAAS,GAAGgB,CAAe,CAAC,CAC/D,OAASlB,EAAG,CACV,QAAQ,MAAM,+BAA+BQ,CAAQ,IAAKR,CAAC,EAC3DiB,EAAgBjB,CAClB,CAMF,GAAIE,EAAQ,SAAW,EAAG,CACxB,IAAMiB,EAAYT,EAAY,MAAQF,EAAW,EAAI,GAC/CY,EAASJ,EAAW,QAAUC,EAAgB,EAAI,GACxD,GAAIE,EAAY,GAAKA,IAAcC,EACjC,MAAOH,GAAiBD,EAAW,CAAC,GAAG,KAE3C,CAEA,OAAOd,EAAQ,SAAS,CAACmB,EAAGC,IAAM,OAAOA,EAAE,UAAU,EAAI,OAAOD,EAAE,UAAU,CAAC,CAC/E,CD9JAE,KAIe,SAARC,GAAkC,CACvC,cAAAC,EAAgB,CAAC,EACjB,OAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,OAClB,QAAAC,EAAU,EACZ,EAMG,CAED,IAAIC,EAAwB,CAAC,EACzBC,EAEAH,IAAoB,QACtBE,EAAcL,EACdM,EAAmBJ,GACVC,EAAgB,WAAW,OAAO,EAC3CG,EAAmBH,EAAgB,QAAQ,QAAS,EAAE,EAC7CI,GAAuBJ,CAAe,IAC/CE,EAAc,CAACF,CAAe,GAGhC,IAAMK,EACJH,EAAY,KAAKI,GAAMF,GAAuBE,CAAE,CAAC,GACjD,EAAQH,EAEJ,CAAE,KAAAI,EAAM,MAAAC,EAAO,UAAAC,CAAU,EAAIC,GACjCT,GAAWI,EACP,CACE,gBACAL,EACAE,EAAY,KAAK,GAAG,EACpBC,CACF,EACA,KACJ,SACEQ,GAAqB,CACnB,cAAeT,EACf,OAAAJ,EACA,SAAUK,CACZ,CAAC,EACH,CACE,GAAGS,GACH,iBAAkB,EACpB,CACF,EAEA,MAAO,CACL,QAASL,GAAQ,CAAC,EAClB,UAAAE,EACA,MAAAD,EACA,WAAAH,CACF,CACF,CEjEe,SAARQ,GAAsC,CAC3C,gBAAAC,EACA,cAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,KACb,EAKG,CACD,OAAIH,IAAoB,OACf,CACLC,EAAc,OAAS,EACnB,cAAcA,EAAc,OAAS,EAAI,IAAM,EAAE,KAAKA,EAAc,KAAK,MAAM,CAAC,IAChF,OACJC,EAAW,cAAcA,CAAQ,IAAM,MACzC,EACG,OAAO,OAAO,EACd,KAAK,IAAIC,CAAQ,GAAG,EAErBH,EAAgB,WAAW,OAAO,EAC7B,cAAcA,EAAgB,QAAQ,QAAS,EAAE,CAAC,IAEpD,gBAAgBA,CAAe,GACxC,CnBjBAI,KAOe,SAARC,GAAsC,CAC3C,QAAAC,EACA,KAAAC,CACF,EAGG,CACD,GAAM,CAACC,EAAYC,CAAa,KAAI,aAAqB,MAAM,EACzD,CAACC,EAAiBC,CAAkB,KAAI,aAAS,EAAE,EACnDC,EAAUC,GAA0BP,CAAO,EAC3C,CAACQ,EAAiBC,CAAkB,KAAI,aAAS,MAAM,EACvD,CAACC,EAAoBC,CAAqB,KAC9C,aAA6B,KAAK,EAC9B,CAACC,EAAmBC,CAAoB,KAAI,aAAiB,EAE7DC,EAAmBR,EAAQ,UAE3BS,EACJb,IAAe,QAAUY,EAAmB,UAAYZ,EACpDc,EAAiBD,IAAwB,WACzCE,EAAaF,IAAwB,OAErC,CACJ,QAASG,EACT,UAAWC,EACX,MAAOC,CACT,EAAIC,GAAiB,CACnB,cAAef,EAAQ,cACvB,OAAQA,EAAQ,OAChB,SAAUA,EAAQ,SAClB,gBAAAE,EACA,QAASS,CACX,CAAC,EAIKK,EAA2BC,GAAkBnB,EAAiB,GAAG,EAEjEoB,EAAgBN,EAAe,CAAC,GAAG,UACnCO,EACJV,IAAwB,UACpBD,EACAG,EACGL,GAAqBY,EACtBT,IAAwB,SACtBO,EACA,OAEJ,CACJ,UAAWI,EACX,aAAcC,GACd,MAAOC,EACP,IAAKC,GACL,cAAeC,GACf,kBAAmBC,EACrB,EAAIC,GAAiB,CACnB,UAAWhB,EAAiB,OAAYS,CAC1C,CAAC,EAEK,CACJ,YAAaQ,EACb,iBAAAC,EACA,UAAWC,GACX,MAAOC,GACP,qBAAsBC,GACtB,wBAAyBC,GACzB,mBAAAC,GACA,gBAAiBC,EACnB,EAAIC,GAA8B,CAChC,QAAAzC,EACA,KAAAC,EACA,kBAAmB8B,GACnB,SAAUN,CACZ,CAAC,EAEK,CACJ,UAAWiB,GACX,OAAQC,GACR,YAAaC,GACb,kBAAmBC,GACnB,UAAWC,GACX,aAAcC,GACd,MAAOC,EACT,EAAIC,GAA2B,CAC7B,SAAUT,IAA6B,IACvC,WAAY9B,EACZ,QAASM,CACX,CAAC,EAGKkC,GAAWlC,EAAiB2B,GAAed,GAC3CsB,GAAqBnC,EACvB4B,GACAd,GACEsB,GAAyBpC,EAC3B6B,GACAd,GACEsB,GAAiBrC,EAAiB0B,GAAqBjB,EAMvD6B,GAAwBtC,EAC1B+B,GACApB,GAEE4B,GAAkB,CACtBpC,GAAmB,wBACnBgB,IAAoB,qDACpB,CAACnB,GAAkBU,GAAsB,mCACzCV,GACE8B,IACA,mCACJ,EAAE,OAAQU,GAAmB,CAAC,CAACA,CAAC,EAC1BC,GAAYF,GAAgB,OAAS,EAOrCG,GAAQD,GAAY,OADxBrB,IAAgBhB,GAAeQ,GAAkBoB,GAGnD,MAAO,CACL,WAAYjC,EACZ,cAAAZ,EACA,gBAAAC,EACA,mBAAAC,EACA,gBAAAG,EACA,mBAAAC,EACA,mBAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,cAAewB,GACf,iBAAAC,GAEA,kBAAAL,EACA,mBAAAM,GACA,iBAAAL,EACA,4BAAAM,GACA,eAAAtB,EAEA,cAAeZ,EAAQ,cACvB,SAAUA,EAAQ,SAClB,iBAAAQ,EAEA,UAAWuC,GACX,IAAKH,GACL,cAAeC,GACf,kBAAmBC,GAEnB,MAAAM,GACA,gBAAAH,GACA,wBAAAT,GAEA,uBACE7B,IAAeX,EAAQ,cAAc,OAAS,GAAK,CAAC,CAACA,EAAQ,UAC/D,uBACE,CAAC,CAAC4B,GACF,CAAC,CAACK,KACDvB,GAAkB,CAAC,EAAEoC,IAA0BC,KAClD,eACE,CAACC,IACDd,IAA6B,KAC7BY,GACIO,GAAenB,GAA4B,GAAG,IAC9CY,GACA,OAEN,kBAAmBQ,GAAqB,CACtC,gBAAApD,EACA,cAAeF,EAAQ,cACvB,SAAUA,EAAQ,QACpB,CAAC,EACD,oBAAqBsD,GAAqB,CACxC,gBAAApD,EACA,cAAeF,EAAQ,cACvB,SAAUA,EAAQ,SAClB,SAAU,IACZ,CAAC,EAED,uBAAwBM,GAAqBY,EAE7C,mBACE,CAAC,CAACU,GACFjB,IACCC,EAAe,OAAS,GAAKC,GAChC,cACE,CAAC,CAACe,GACFjB,GACA,CAACE,GACDD,EAAe,SAAW,EAC5B,yBAA0BF,EAC1B,4BACE,CAAC,CAACoC,IAA0B,CAAC,CAACC,IAAkB,CAACrC,EACnD,UAAAyC,EACF,CACF,CrBjMA,IAAMI,MAAY,eAAW,EAAE,CAC7B,cAAe,CACb,MAAO,OACP,QAAS,CACP,aAAc,EAChB,EACA,mBAAoB,CAClB,aAAc,CAChB,CACF,EACA,aAAc,CACZ,QAAS,OACT,cAAe,MACf,IAAK,GACL,WAAY,YACd,CACF,CAAC,EAEKC,MAAoB,aAAS,SAA2B,CAC5D,QAAAC,EACA,QAAAC,EACA,KAAAC,EACA,YAAAC,EACA,mBAAAC,EACA,2BAAAC,CACF,EAOG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIR,GAAU,EAExBS,EAAQC,GAAqB,CAAE,QAAAR,EAAS,KAAAE,CAAK,CAAC,EAEpD,OACE,EAAAO,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,kBAAc,UAAWH,EAAQ,eAC/BC,EAAM,MAAQ,EAAAE,QAAA,cAAC,iBAAa,MAAOF,EAAM,MAAO,EAAK,KAEtD,EAAAE,QAAA,cAACC,GAAA,CACC,WAAYH,EAAM,WAClB,mBAAoBA,EAAM,cAC1B,gBAAiBA,EAAM,gBACvB,wBAAyBA,EAAM,mBAC/B,iBAAkBA,EAAM,iBACxB,mBAAoB,CAAC,CAACA,EAAM,6BAA6B,IACzD,mBAAoBA,EAAM,mBAC1B,2BAA4BA,EAAM,sBAClC,WACEA,EAAM,uBACJ,EAAAE,QAAA,cAACE,GAAA,CACC,cAAeJ,EAAM,cACrB,SAAUA,EAAM,SAChB,WAAYA,EAAM,gBAClB,mBAAoBA,EAAM,mBAC5B,EACE,KAER,EAECA,EAAM,gBAAgB,IAAIK,GACzB,EAAAH,QAAA,cAAC,oBAAgB,IAAKG,EAAQ,QAAQ,YAAY,QAASA,EAAQ,CACpE,EAEAL,EAAM,oBACL,EAAAE,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,iBAAgB,uBAC3BF,EAAM,iBAC7B,EACA,EAAAE,QAAA,cAACI,GAAA,CACC,QAASN,EAAM,eACf,kBAAmBA,EAAM,uBACzB,SAAUA,EAAM,qBAClB,EACA,EAAAE,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,iBAAgB,4FAErB,IAC3B,EAAAA,QAAA,cAACK,GAAA,CAAa,KAAK,4BAA2B,SAE9C,EAAgB,IAAI,oCAEtB,CACF,EAGDP,EAAM,eACL,EAAAE,QAAA,cAAC,eAAW,QAAQ,QAAQ,MAAM,iBAAgB,gCAClBF,EAAM,oBAAoB,gDAClB,IACtC,EAAAE,QAAA,cAACK,GAAA,CAAa,KAAK,4BAA2B,SAAO,EAAgB,IAAI,yGAG3E,EAGDP,EAAM,wBACL,EAAAE,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,OAAI,UAAWH,EAAQ,cACtB,EAAAG,QAAA,cAACM,GAAA,CACC,IAAKR,EAAM,cACX,OAAQA,EAAM,iBACd,kBAAmBA,EAAM,kBACzB,QAASP,EACT,SAAUO,EAAM,kBAChB,iBAAkBA,EAAM,iBAC1B,CACF,EACCA,EAAM,0BACL,EAAAE,QAAA,cAACO,GAAA,CACC,UAAWT,EAAM,wBACjB,UAAWA,EAAM,UACjB,IAAKA,EAAM,IACX,mBAAoB,CAAC,CAACA,EAAM,4BAC5B,mBAAoBA,EAAM,mBAC5B,EAEDA,EAAM,6BACL,EAAAE,QAAA,cAACQ,GAAA,CACC,UAAWV,EAAM,UACjB,mBAAoBA,EAAM,mBAC1B,kBAAmBA,EAAM,kBACzB,iBAAkBA,EAAM,iBACxB,IAAKA,EAAM,IACb,CAEJ,CAEJ,EACA,EAAAE,QAAA,cAAC,sBACC,EAAAA,QAAA,cAACS,GAAA,CACC,YAAaf,EACb,UAAWI,EAAM,UACjB,4BAA6BA,EAAM,4BACnC,mBAAoBA,EAAM,mBAC1B,IAAKA,EAAM,IACX,cAAeA,EAAM,cACrB,QAASP,EACT,KAAME,EACN,QAASD,EACT,mBAAoBG,EACpB,2BAA4BC,EAC5B,eAAgBE,EAAM,eACtB,UAAWA,EAAM,UACjB,MAAOA,EAAM,MACf,CACF,CACF,CAEJ,CAAC,EAEMY,GAAQpB,GyC9Kf,IAAAqB,EAAgC,OAEhCC,GAA8C,QAC9CC,GAMO,OACPC,GAAyB,OACzBC,GAA2B,QCX3B,IAAAC,GAAkB,OAElBC,GAMO,OACPC,GAA2B,QCPpB,IAAMC,GAAqB,CAChC,CAAE,GAAI,SAAU,MAAO,uBAAwB,EAC/C,CAAE,GAAI,iBAAkB,MAAO,2BAA4B,EAC3D,CAAE,GAAI,SAAU,MAAO,+BAAgC,EACvD,CAAE,GAAI,gBAAiB,MAAO,0BAA2B,EACzD,CAAE,GAAI,SAAU,MAAO,uBAAwB,EAC/C,CAAE,GAAI,eAAgB,MAAO,cAAe,EAC5C,CAAE,GAAI,OAAQ,MAAO,MAAO,EAC5B,CAAE,GAAI,WAAY,MAAO,OAAQ,CACnC,EAIaC,GAA0C,CACrD,SACA,gBACF,EA6CA,eAAsBC,GAAW,CAC/B,WAAAC,EACA,OAAAC,CACF,EAGG,CAED,IAAMC,EAAgBF,EACnB,MAAM;AAAA,CAAI,EACV,OAAOG,GAAQ,CAACA,EAAK,WAAW,GAAG,CAAC,EACpC,KAAK,EAAE,EACP,QAAQ,MAAO,EAAE,EACjB,QAAQ,MAAO,EAAE,EACjB,YAAY,EACZ,QAAQ,2BAA4B,EAAE,EAEnCC,EAAW,MAAM,MACrB,oCAAoC,mBAAmBF,CAAa,CAAC,GACrE,CAAE,OAAAD,CAAO,CACX,EACA,GAAI,CAACG,EAAS,GACZ,MAAM,IAAI,MACR,0BAA0BA,EAAS,MAAM,IAAI,MAAMA,EAAS,KAAK,CAAC,EACpE,EAIF,IAAMC,GAFc,MAAMD,EAAS,KAAK,GAGrC,QAAQ,YAAa,EAAE,EACvB,QAAQ,YAAa,EAAE,EACvB,KAAK,EACR,MAAO,CAAE,WAAYF,EAAe,YAAaG,CAAS,CAC5D,CAEA,eAAsBC,GAAqB,CACzC,WAAAN,EACA,YAAAO,EACA,UAAAC,EACA,OAAAP,CACF,EAKG,CAED,IAAMQ,EAAe;AAAA,EAAWT,CAAU;AAAA;AAAA,EAAWO,CAAW;AAAA,EAC1DG,EAAS,IAAI,gBACnBA,EAAO,OAAO,IAAKD,CAAY,EAC/BC,EAAO,OAAO,OAAQ,OAAO,EAC7BA,EAAO,OAAO,QAAS,EAAE,EACzB,QAAWC,KAAMH,EACfE,EAAO,OAAO,aAAcC,CAAE,EAGhC,IAAMP,EAAW,MAAM,MAAM,yCAA0C,CACrE,OAAQ,OACR,QAAS,CACP,eAAgB,mCAClB,EACA,KAAMM,EACN,OAAAT,CACF,CAAC,EAKKW,EAAO,MAAMR,EAAS,KAAK,EACjC,GAAI,CAACA,EAAS,GACZ,MAAM,IAAI,MAAM,+BAA+BA,EAAS,MAAM,IAAIQ,CAAI,EAAE,EAG1E,OAAO,KAAK,MAAMA,CAAI,CACxB,CAEA,eAAsBC,GAAmB,CACvC,SAAAC,EACA,OAAAb,CACF,EAGG,CAED,IAAMS,EAAS,IAAI,gBACnBA,EAAO,OAAO,YAAaI,CAAQ,EAEnC,IAAMV,EAAW,MAAM,MAAM,0CAA2C,CACtE,OAAQ,OACR,QAAS,CACP,eAAgB,mCAClB,EACA,KAAMM,EACN,OAAAT,CACF,CAAC,EAED,GAAI,CAACG,EAAS,GACZ,MAAM,IAAI,MAAM,iCAAiCA,EAAS,MAAM,EAAE,EAMpE,IAAMW,GAHW,MAAMX,EAAS,KAAK,GAGd,CAAC,EACxB,GAAI,CAACW,EACH,MAAM,IAAI,MAAM,2BAA2B,EAE7C,OAAOA,CACT,CAYA,eAAsBC,GAAmB,CACvC,SAAAF,EACA,OAAAb,CACF,EAGiC,CAC/B,OAAOgB,GACL,0CAA0CH,CAAQ,KAClD,CAAE,OAAAb,CAAO,CACX,CACF,CAEA,eAAsBiB,GAAuB,CAC3C,SAAAJ,EACA,eAAAK,EACA,OAAAlB,CACF,EAIG,CAED,IAAImB,EAAW,EAEf,KAAOA,EAAW,KAAa,CAC7B,GAAInB,GAAQ,QACV,MAAMA,EAAO,OAEf,IAAMoB,EAAS,MAAMR,GAAmB,CAAE,SAAAC,EAAU,OAAAb,CAAO,CAAC,EAE5D,GAAIoB,EAAO,SAAW,QACpB,cAAQ,MAAM,2BAA4BA,CAAM,EAC1C,IAAI,MACR,2BAA2BA,EAAO,OAAS,eAAe,EAC5D,EAGF,GAAIA,EAAO,SAAW,WAAY,CAChCF,IAAiB,qBAAqB,EACtC,IAAMG,EAAc,MAAMN,GAAmB,CAAE,SAAAF,EAAU,OAAAb,CAAO,CAAC,EAWjE,MARgC,CAC9B,MAAOqB,EAAY,QAAQ,CAAC,GAAK,CAAE,OAAQ,GAAI,SAAU,EAAG,EAC5D,QAASA,EAAY,QAAQ,IAAIC,IAAM,CACrC,GAAIA,EAAE,GACN,WAAYA,EAAE,UAChB,EAAE,CACJ,CAGF,CAEAJ,IACE,UAAUE,EAAO,OAAO,YAAY,CAAC,QAAQD,EAAW,CAAC,IAC3D,EACA,MAAMI,GAAQ,IAAMvB,CAAM,EAC1BmB,GACF,CAEA,MAAM,IAAI,MAAM,2BAA2B,CAC7C,CDrOA,IAAMK,MAAY,eAAW,EAAE,CAC7B,KAAM,CACJ,QAAS,OACT,cAAe,SACf,IAAK,CACP,EACA,OAAQ,CACN,QAAS,OACT,WAAY,SACZ,IAAK,CACP,EACA,QAAS,CACP,QAAS,OACT,IAAK,CACP,EACA,cAAe,CACb,QAAS,OACT,oBAAqB,iBACrB,IAAK,CACP,CACF,CAAC,EAEc,SAARC,GAA0C,CAC/C,SAAAC,EACA,SAAAC,EACA,SAAAC,CACF,EAIG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAU,EAE9B,OACE,GAAAM,QAAA,cAAC,OAAI,UAAWD,EAAQ,MACtB,GAAAC,QAAA,cAAC,OAAI,UAAWD,EAAQ,QACtB,GAAAC,QAAA,cAAC,eAAW,QAAQ,aAAY,sBAAoB,EACpD,GAAAA,QAAA,cAAC,OAAI,UAAWD,EAAQ,SACtB,GAAAC,QAAA,cAAC,WACC,KAAK,QACL,QAAS,IAAM,CACbH,EAASI,GAAmB,IAAIC,GAAMA,EAAG,EAAE,CAAC,CAC9C,EACA,SAAUJ,GACX,YAED,EACA,GAAAE,QAAA,cAAC,WACC,KAAK,QACL,QAAS,IAAM,CACbH,EAAS,CAAC,CAAC,CACb,EACA,SAAUC,GACX,OAED,CACF,CACF,EACA,GAAAE,QAAA,cAAC,cAAU,UAAWD,EAAQ,eAC3BE,GAAmB,IAAIC,GACtB,GAAAF,QAAA,cAAC,qBACC,IAAKE,EAAG,GACR,QACE,GAAAF,QAAA,cAAC,aACC,KAAK,QACL,QAASJ,EAAS,SAASM,EAAG,EAAE,EAChC,SAAU,IAAM,CACVN,EAAS,SAASM,EAAG,EAAE,EACzBL,EAASD,EAAS,OAAOO,GAAMA,IAAOD,EAAG,EAAE,CAAC,EAE5CL,EAAS,CAAC,GAAGD,EAAUM,EAAG,EAAE,CAAC,CAEjC,EACA,SAAUJ,EACZ,EAEF,MAAOI,EAAG,MACZ,CACD,CACH,CACF,CAEJ,CElGA,IAAAE,EAAkB,OAElBC,EASO,OACPC,GAA2B,QCZ3B,IAAAC,GAAgC,OAEhCC,GAA6B,QAC7BC,GAAuC,OCFvC,IAAMC,GAAqC,CACzC,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,KACL,EAEA,SAASC,GAAQC,EAAaC,EAAa,CACzC,OAAOD,EAAI,SAASC,EAAK,GAAG,CAC9B,CAEA,SAASC,GAASF,EAAaC,EAAa,CAC1C,OAAOD,EAAI,OAAOC,EAAK,GAAG,CAC5B,CAEA,SAASE,GAAYC,EAAa,CAChC,OAAOA,EAAI,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,CACvC,CAOO,SAASC,GACdC,EACAC,EACAC,EAAU,IACVC,EACA,CACA,IAAMC,EAASJ,EAAI,MAAM,GAAG,EAAE,IAAI,MAAM,EAClCK,EAAkB,CAAC,EAGrBF,GACFE,EAAM,KAAK,aAAaF,CAAK,EAAE,EAEjCE,EAAM,KAAK,wDAAmD,EAE9D,IAAIC,EAAU,EACVC,EAAS,EAEb,QAASC,EAAI,EAAGA,EAAIJ,EAAO,OAAS,EAAGI,GAAK,EAAG,CAC7C,IAAMC,EAAIL,EAAOI,CAAC,EACZE,EAAIN,EAAOI,EAAI,CAAC,EAChBG,EAAIP,EAAOI,EAAI,CAAC,EAChBI,EAAKX,EAAKM,EAAS,CAAC,GAAK,IACzBM,EAAUrB,GAAWoB,CAAE,GAAK,MAElC,GAAIH,IAAM,QAAaC,IAAM,QAAaC,IAAM,OAC9C,MAOF,IAAMG,EACJ,SACArB,GAAQ,OAAOa,CAAO,EAAG,CAAC,EAC1B,SACAV,GAASiB,EAAS,CAAC,EACnB,IACAX,EACAT,GAAQ,OAAOc,CAAM,EAAG,CAAC,EACzB,OACAV,GAAYY,CAAC,EACbZ,GAAYa,CAAC,EACbb,GAAYc,CAAC,EACb,2BAEFN,EAAM,KAAKS,CAAI,EACfR,IACAC,GACF,CAEA,OAAAF,EAAM,KAAK,KAAK,EAETA,EAAM,KAAK;AAAA,CAAI,CACxB,CAKO,SAASU,GAAiBf,EAAcC,EAAe,CAC5D,MAAI,CAACD,GAAO,CAACC,EACJ,GAEMD,EAAI,MAAM,GAAG,EAEd,QAAU,GAAKC,EAAK,OAAS,CAC7C,CDtGAe,KAkBe,SAARC,GAAoC,CACzC,IAAAC,EACA,QAAAC,EACA,KAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,+BAAAC,EACA,QAAAC,CACF,EAQG,CACD,GAAM,CAACC,EAAUC,CAAW,KAAI,aAA6B,IAAI,EAC3D,CAACC,EAAaC,CAAc,KAAI,aAAkB,EAClDC,EAAO,EAAQJ,EAEfK,EAAYC,GAAgCb,EAAI,MAAM,EAEtDc,EAAeC,GAA+C,CAClEP,EAAYO,EAAM,aAAa,CACjC,EAEMC,EAAkB,IAAM,CAC5BR,EAAY,IAAI,CAClB,EAEMS,EAAa,CAAE,QAAAhB,EAAS,KAAAC,EAAM,QAAAC,EAAS,mBAAAC,EAAoB,UAAAQ,CAAU,EAErEM,EAAaC,GAAmC,IAAM,CAC1DH,EAAgB,EACXI,GAAWD,EAAIb,EAASI,CAAc,CAC7C,EAEMW,EAAiBH,EAAU,IAAM,CAErC,IAAMI,EACJ,CAACtB,EAAI,cAAgBuB,GAAiBvB,EAAI,IAAKA,EAAI,IAAI,EACnDwB,GAAcxB,EAAI,IAAMA,EAAI,KAAO,IAAKA,EAAI,MAAM,EAClD,OACNyB,GAAoB,CAClB,GAAGR,EACH,IAAKjB,EAAI,aACT,KAAMsB,EACN,+BAAAjB,CACF,CAAC,CACH,CAAC,EAEKqB,EAAiBR,EAAU,SAAY,CAC3C,MAAMS,GAAoB,CACxB,GAAGV,EACH,cAAeW,GAA2B5B,EAAI,MAAM,CACtD,CAAC,CACH,CAAC,EAEK6B,EAAkBX,EAAU,IAAM,CACtCY,GAAcb,CAAU,CAC1B,CAAC,EAGD,OADgBjB,EAAI,cAAgBuB,GAAiBvB,EAAI,IAAKA,EAAI,IAAI,EAMpE,GAAA+B,QAAA,iBAAAA,QAAA,cACGtB,EAAc,GAAAsB,QAAA,cAAC,iBAAa,MAAOtB,EAAa,EAAK,KACtD,GAAAsB,QAAA,cAAC,WAAO,KAAK,QAAQ,QAAQ,WAAW,QAASjB,GAAa,MAE9D,EACA,GAAAiB,QAAA,cAAC,SAAK,SAAUxB,EAAU,KAAMI,EAAM,QAASK,GAC7C,GAAAe,QAAA,cAAC,aAAS,QAASV,GAAgB,wBAAsB,EACxDT,EACC,GAAAmB,QAAA,cAAC,aAAS,QAASL,GAAgB,mCAEnC,EACE,KACHd,GAAaoB,GAAiB,EAC7B,GAAAD,QAAA,cAAC,aAAS,QAASF,GAAiB,mCAEpC,EACE,IACN,CACF,EAtBO,GAAAE,QAAA,cAAC,YAAK,GAAC,CAwBlB,CDnGAE,KAOA,IAAMC,MAAY,eAAW,EAAE,CAC7B,KAAM,CACJ,QAAS,OACT,cAAe,SACf,IAAK,EACP,EACA,eAAgB,CACd,UAAW,GACb,EACA,WAAY,CACV,WAAY,OACZ,gBAAiB,SACnB,EACA,UAAW,CACT,QAAS,GACT,UAAW,QACb,CACF,CAAC,EAED,SAASC,GAAeC,EAAyC,CAC/D,IAAMC,EAAOD,EAAQ,QAAQ,QAAQE,IAClCA,EAAS,YAAc,CAAC,GAAG,KAAK,EAAE,IAAIC,IAAc,CACnD,GAAGA,EACH,GAAID,EAAS,GACb,aAAcE,GAA0BD,EAAU,OAAQD,EAAS,EAAE,CACvE,EAAE,CACJ,EACA,OAAAD,EAAK,KAAK,CAACI,EAAGC,KAAOD,EAAE,MAAQ,MAAaC,EAAE,MAAQ,IAAS,EACxDL,EAAK,MAAM,EAAG,GAAG,CAC1B,CAEe,SAARM,GAAsC,CAC3C,QAAAP,EACA,QAAAQ,EACA,KAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,+BAAAC,EACA,QAAAC,CACF,EAQG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIhB,GAAU,EACxBiB,EAAWhB,GAAeC,CAAO,EAEvC,OAAIe,EAAS,SAAW,EAEpB,EAAAC,QAAA,cAAC,SAAM,UAAWF,EAAQ,WACxB,EAAAE,QAAA,cAAC,kBAAW,6BAA2B,CACzC,EAKF,EAAAA,QAAA,cAAC,OAAI,UAAWF,EAAQ,MACtB,EAAAE,QAAA,cAAC,cAAW,QAAQ,aAAY,SACvBD,EAAS,OAAO,qBACzB,EACA,EAAAC,QAAA,cAAC,kBAAe,UAAW,QAAO,UAAWF,EAAQ,gBACnD,EAAAE,QAAA,cAAC,SAAM,KAAK,QAAQ,aAAY,IAC9B,EAAAA,QAAA,cAAC,iBACC,EAAAA,QAAA,cAAC,gBACC,EAAAA,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,UAAQ,EAClD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,QAAM,EAChD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,UAAQ,EAClD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,MAAI,EAC9C,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,UAAQ,EAClD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,UAAQ,EAClD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,SAAO,EACjD,EAAAE,QAAA,cAAC,aAAU,UAAWF,EAAQ,YAAY,SAAO,CACnD,CACF,EACA,EAAAE,QAAA,cAAC,iBACED,EAAS,IAAI,CAACE,EAAKC,IAClB,EAAAF,QAAA,cAAC,YAAS,IAAK,GAAGC,EAAI,EAAE,IAAIA,EAAI,MAAM,IAAIC,CAAG,IAC3C,EAAAF,QAAA,cAAC,iBAAWC,EAAI,EAAG,EACnB,EAAAD,QAAA,cAAC,iBAAWC,EAAI,MAAO,EACvB,EAAAD,QAAA,cAAC,iBAAWC,EAAI,SAAW,GAAI,EAC/B,EAAAD,QAAA,cAAC,iBACEC,EAAI,MAAQ,KAAO,IAAIA,EAAI,KAAO,KAAK,QAAQ,CAAC,CAAC,IAAM,GAC1D,EACA,EAAAD,QAAA,cAAC,iBACEC,EAAI,OAAS,KAAO,GAAGA,EAAI,MAAM,QAAQ,CAAC,CAAC,IAAM,GACpD,EACA,EAAAD,QAAA,cAAC,iBACEC,EAAI,WAAa,MAAQA,EAAI,MAAQ,KAClC,IAAKA,EAAI,UAAYA,EAAI,KAAQ,KAAK,QAAQ,CAAC,CAAC,IAChD,GACN,EACA,EAAAD,QAAA,cAAC,iBACEC,EAAI,MAAQ,KAAOA,EAAI,KAAK,cAAc,CAAC,EAAI,GAClD,EACA,EAAAD,QAAA,cAAC,iBACC,EAAAA,QAAA,cAACG,GAAA,CACC,IAAKF,EACL,QAAST,EACT,KAAMC,EACN,QAASC,EACT,mBAAoBC,EACpB,+BACEC,EAEF,QAASC,EACX,CACF,CACF,CACD,CACH,CACF,CACF,CACF,CAEJ,CG5IA,IAAAO,GAA4C,OAc7B,SAARC,IAAqC,CAC1C,GAAM,CAACC,EAASC,CAAU,KAAI,aAAyB,EACjD,CAACC,EAAaC,CAAc,KAAI,aAGnC,EACG,CAACC,EAAWC,CAAY,KAAI,aAAS,EAAK,EAC1C,CAACC,EAAcC,CAAe,KAAI,aAAS,EAAK,EAChD,CAACC,EAAOC,CAAQ,KAAI,aAAkB,EACtC,CAACC,EAAeC,CAAgB,KAAI,aAAS,EAAE,EAK/CC,KAAW,WAA+B,IAAI,KACpD,cAAU,IACD,IAAM,CACXA,EAAS,SAAS,MAAM,CAC1B,EACC,CAAC,CAAC,EAEL,IAAMC,EAAiB,IAAM,CAC3BD,EAAS,SAAS,MAAM,EACxB,IAAME,EAAa,IAAI,gBACvB,OAAAF,EAAS,QAAUE,EACZA,EAAW,MACpB,EAEMC,EAAmB,MAAOC,GAAuB,CACrD,IAAMC,EAASJ,EAAe,EAC9BN,EAAgB,EAAI,EACpBE,EAAS,MAAS,EAClBE,EAAiB,6BAA6B,EAC9C,GAAI,CACF,IAAMO,EAAS,MAAMC,GAAW,CAAE,WAAAH,EAAY,OAAAC,CAAO,CAAC,EACtD,OAAAd,EAAee,CAAM,EACdA,CACT,OAASE,EAAG,CACLH,EAAO,UACV,QAAQ,MAAMG,CAAC,EACfX,EAASW,CAAC,GAEZ,MACF,QAAE,CACKH,EAAO,UACVV,EAAgB,EAAK,EACrBI,EAAiB,EAAE,EAEvB,CACF,EAEMU,EAAS,MACbC,EACAC,EACAC,EAAkCC,KAC/B,CACH,IAAMR,EAASJ,EAAe,EAC9BR,EAAa,EAAI,EACjBI,EAAS,MAAS,EAClBE,EAAiB,sBAAsB,EACvC,GAAI,CACF,IAAMe,EAAS,MAAMC,GAAqB,CACxC,WAAYL,EACZ,YAAaC,EACb,UAAAC,EACA,OAAAP,CACF,CAAC,EACKC,EAAS,MAAMU,GAAuB,CAC1C,SAAUF,EAAO,GACjB,eAAgBf,EAChB,OAAAM,CACF,CAAC,EACD,OAAAhB,EAAWiB,CAAM,EACVA,CACT,OAASE,EAAG,CACLH,EAAO,UACV,QAAQ,MAAMG,CAAC,EACfX,EAASW,CAAC,GAEZ,MACF,QAAE,CACKH,EAAO,UACVZ,EAAa,EAAK,EAClBM,EAAiB,EAAE,EAEvB,CACF,EAEMkB,EAAQ,IAAM,CAClBjB,EAAS,SAAS,MAAM,EACxBX,EAAW,MAAS,EACpBE,EAAe,MAAS,EACxBM,EAAS,MAAS,EAClBE,EAAiB,EAAE,CACrB,EAEA,MAAO,CACL,QAAAX,EACA,kBAAmBE,GAAa,WAChC,YAAaA,GAAa,YAC1B,UAAAE,EACA,aAAAE,EACA,MAAAE,EACA,cAAAE,EACA,iBAAAK,EACA,OAAAM,EACA,MAAAQ,CACF,CACF,CNvGAC,KAKA,IAAMC,MAAY,eAAW,EAAE,CAC7B,cAAe,CACb,MAAO,OACP,QAAS,OACT,cAAe,SACf,IAAK,EACP,EACA,cAAe,CACb,WAAY,WACd,EACA,WAAY,CACV,QAAS,OACT,cAAe,SACf,IAAK,CACP,CACF,CAAC,EAEKC,MAAiB,aAAS,SAAwB,CACtD,QAAAC,EACA,QAAAC,EACA,KAAAC,EACA,YAAAC,CACF,EAKG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIN,GAAU,EAExB,CAACO,EAAoBC,CAAqB,KAAI,YAElD,EACI,CAACC,EAAmBC,CAAoB,KAAI,YAASC,EAAiB,EAEtE,CACJ,QAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,aAAAC,EACA,MAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,OAAAC,EACA,MAAAC,CACF,EAAIC,GAAkB,EAEhB,CACJ,YAAAC,EACA,iBAAAC,EACA,UAAWC,EACX,MAAOC,EACP,qBAAsBC,GACtB,wBAAyBC,EACzB,mBAAAC,GACA,gBAAiBC,EACnB,EAAIC,GAA8B,CAAE,QAAA7B,EAAS,KAAAE,CAAK,CAAC,EAE7C4B,GAAkBF,GACpBG,GAAeH,GAAoB,GAAG,EACtC,GACEI,EAAW3B,GAAsByB,GAEjCG,EAA6BC,IAA2B,CAC5DR,EAAiBQ,EAAE,EACnB5B,EAAsB,MAAS,CACjC,EAEM6B,GAAaH,EAAS,KAAK,EAAE,OAAS,GAAK,CAAClB,GAAgB,CAACD,EAC7DuB,GACJ,CAAC,CAACzB,GACF,CAAC,CAACC,GACFL,EAAkB,OAAS,GAC3B,CAACM,EAEGwB,GAAgBtB,GAASS,EACzBc,GAASzB,GAAaC,EAE5B,OACE,EAAAyB,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,kBAAc,UAAWnC,EAAQ,eAC/BiC,IAAiB,CAACd,EACjB,EAAAgB,QAAA,cAAC,iBAAa,MAAOF,GAAe,EAClC,KAEHd,EACC,EAAAgB,QAAA,cAAC,oBACC,QAAQ,YACR,QAAQ,+BACV,EACE,KAEHjB,EACC,EAAAiB,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAACC,GAAA,CACC,IAAKf,GACL,OAAQQ,EACR,SAAUZ,EACV,iBAAkBC,EAClB,QAAStB,EACT,SAAUsC,GACZ,EACA,EAAAC,QAAA,cAAC,cACC,MAAM,iCACN,UAAS,GACT,KAAM,EACN,MAAOP,EACP,SAAUS,IAAK,CACbnC,EAAsBmC,GAAE,OAAO,KAAK,CACtC,EACA,YAAa,sCACb,SAAUH,GACV,WAAY,CACV,UAAWlC,EAAQ,aACrB,EACF,CACF,EACE,KAEHQ,EACC,EAAA2B,QAAA,cAAC,OAAI,UAAWnC,EAAQ,YACtB,EAAAmC,QAAA,cAAC,eAAW,QAAQ,aAAY,+CAEhC,EACA,EAAAA,QAAA,cAAC,cACC,UAAS,GACT,KAAM,EACN,MAAO3B,EACP,WAAY,CACV,UAAWR,EAAQ,cACnB,SAAU,EACZ,EACF,CACF,EACE,KAEJ,EAAAmC,QAAA,cAACG,GAAA,CACC,SAAUnC,EACV,SAAUC,EACV,SAAU8B,GACZ,EAECtB,EACC,EAAAuB,QAAA,cAAC,oBAAgB,QAAQ,YAAY,QAASvB,EAAe,EAC3D,KAEHN,EACC,EAAA6B,QAAA,cAACI,GAAA,CACC,QAASjC,EACT,QAAST,EACT,KAAMC,EACN,QAASF,EACT,mBAAoB2B,GACpB,+BAAgCK,EAChC,QAAS7B,EACX,EACE,IACN,EACA,EAAAoC,QAAA,cAAC,sBACC,EAAAA,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,YACN,QAAS,IAAM,CACbpC,EAAY,CACd,GACD,QAED,EACCO,EACC,EAAA6B,QAAA,cAAC,WACC,QAAQ,WACR,QAAS,IAAM,CACbpB,EAAM,CACR,GACD,YAED,EACE,KACFP,EAYA,EAAA2B,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,UACN,SAAU,CAACH,GACX,QAAS,IAAM,CACRlB,EAAOP,EAAoBC,EAAaL,CAAiB,CAChE,GAECM,EAAY,eAAiB,iBAChC,EApBA,EAAA0B,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,UACN,SAAU,CAACJ,GACX,QAAS,IAAM,CACRlB,EAAiBe,EAAS,KAAK,CAAC,CACvC,GAEClB,EAAe,gBAAkB,uBACpC,CAaJ,CACF,CAEJ,CAAC,EAEM8B,GAAQ7C,GOvOf,IAAA8C,GAAgD,OAEhDC,KACA,IAAAC,GAA2B,OAIrBC,MAAa,SAAK,IAAM,qCAAsB,EAErC,SAARC,IAA8B,CACnC,GAAM,CAACC,EAAMC,CAAO,KAAI,aAAS,EAAK,EACtC,OACE,GAAAC,QAAA,iBAAAA,QAAA,cACE,GAAAA,QAAA,cAAC,eACC,QAAS,IAAM,CACbD,EAAQ,EAAI,CACd,GAEA,GAAAC,QAAA,cAACC,GAAA,IAAK,CACR,EACCH,EACC,GAAAE,QAAA,cAAC,aAAS,SAAU,MAClB,GAAAA,QAAA,cAACJ,GAAA,CACC,YAAa,IAAM,CACjBG,EAAQ,EAAK,CACf,EACF,CACF,EACE,IACN,CAEJ,CC/BA,IAAAG,GAAkB,OAGH,SAARC,GAA0B,CAC/B,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EAIG,CACD,OACE,GAAAC,QAAA,cAAC,OAAI,KAAK,WAAW,OAAQH,IAAUC,EAAQ,GAAGC,GAC/CF,IAAUC,GAAS,GAAAE,QAAA,cAAC,WAAKJ,CAAS,CACrC,CAEJ,CClBA,IAAAK,EAAgC,OAEhCC,GAA8C,QAC9CC,GAAqD,OACrDC,GAAyB,OACzBC,GAA2B,QCL3B,IAAAC,GAAkB,OAElBC,GAQO,OAGPC,KAEe,SAARC,GAAuC,CAC5C,OAAAC,EACA,UAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,QAAAC,EACA,MAAAC,EACA,SAAAC,CACF,EAQG,CACD,OACE,GAAAC,QAAA,cAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,OAAQ,EAAG,GACxC,GAAAA,QAAA,cAAC,mBAAW,4BACe,GAAAA,QAAA,cAACC,GAAA,IAAW,CACvC,EAEA,GAAAD,QAAA,cAAC,gBAAY,UAAU,YACrB,GAAAA,QAAA,cAAC,eACC,MAAOP,EACP,SAAUS,GAAS,CACjBR,EAAUQ,EAAM,OAAO,KAAK,CAC9B,GAEA,GAAAF,QAAA,cAAC,qBAAiB,MAAM,MAAM,QAAS,GAAAA,QAAA,cAAC,aAAM,EAAI,MAAM,MAAM,EAC9D,GAAAA,QAAA,cAAC,qBAAiB,MAAM,OAAO,QAAS,GAAAA,QAAA,cAAC,aAAM,EAAI,MAAM,OAAO,EAChE,GAAAA,QAAA,cAAC,qBAAiB,MAAM,MAAM,QAAS,GAAAA,QAAA,cAAC,aAAM,EAAI,MAAM,SAAS,CACnE,CACF,EAECP,IAAW,MACV,GAAAO,QAAA,cAAC,WACC,GAAAA,QAAA,cAAC,mBAAW,4CAA0C,EACtD,GAAAA,QAAA,cAAC,cACC,MAAM,MACN,MAAOL,EACP,SAAUO,GAAS,CACjBN,EAAgBM,EAAM,OAAO,KAAK,CACpC,EACF,CACF,EACE,KAEHT,IAAW,OACV,GAAAO,QAAA,cAAC,OAAI,MAAO,CAAE,WAAY,EAAG,GAC3B,GAAAA,QAAA,cAAC,mBAAW,kDAEZ,EACA,GAAAA,QAAA,cAAC,WAAO,QAAQ,WAAW,UAAU,SAAQ,cAE3C,GAAAA,QAAA,cAAC,SACC,KAAK,OACL,OAAM,GACN,SAAU,CAAC,CAAE,OAAAG,CAAO,IAAM,CACxB,IAAMC,EAAID,EAAO,QAAQ,CAAC,EACtBC,GACFP,EAAQO,CAAC,CAEb,EACF,CACF,CACF,EACE,KAEHX,IAAW,MACV,GAAAO,QAAA,cAAC,cACC,MAAOF,EACP,SAAUI,GAAS,CACjB,IAAMG,EAAIH,EAAM,OAAO,MACvBH,EAASM,CAAC,EACVT,EAAgBU,GAAmBD,CAAC,CAAC,CACvC,EACA,MAAM,SACR,EACE,IACN,CAEJ,CDpFAE,KACAC,KAUA,IAAMC,MAAY,eAAW,EAAEC,IAAU,CACvC,cAAe,CACb,UAAWA,EAAM,QAAQ,CAAC,EAC1B,MAAO,MACT,EACA,aAAc,CACZ,WAAY,aACd,CACF,EAAE,EAIF,SAASC,IAAW,CAClB,OACE,EAAAC,QAAA,cAAC,OAAI,MAAO,CAAE,aAAc,EAAG,GAAG,+IAE2C,IAC3E,EAAAA,QAAA,cAACC,GAAA,CAAa,KAAK,0CAAyC,WAE5D,EAAe,mMAIjB,CAEJ,CAEA,IAAMC,MAAwB,aAAS,SAA+B,CACpE,QAAAC,EACA,QAAAC,EACA,KAAAC,EACA,YAAAC,EACA,mBAAAC,EACA,2BAAAC,CACF,EAOG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIZ,GAAU,EACxB,CAACa,EAAMC,CAAO,KAAI,YAAe,EACjC,CAACC,EAAOC,CAAQ,KAAI,YAAS,EAAE,EAC/B,CAACC,EAAQC,CAAS,KAAI,YAAS,MAAM,EACrC,CAACC,EAAaC,CAAc,KAAI,YAAkB,EAClD,CAACC,EAAcC,CAAe,KAAI,YAAS,EAAE,EAE7CC,EAAaN,IAAW,OAASJ,EAAO,OACxCW,EAAYP,IAAW,OAAS,GAAKI,EAErC,CAAE,UAAWI,EAAoB,MAAOC,CAAU,EACtDC,GAAyB,CAAE,KAAMJ,EAAY,IAAKC,CAAU,CAAC,EAEzDI,EACJL,GAAY,MAAQC,EAAU,MAAMA,EAAU,YAAY,GAAG,EAAI,CAAC,EAC9DK,EAAoBJ,IAAqB,CAAC,EAE1C,CACJ,YAAaK,GACb,iBAAAC,EACA,qBAAsBC,GACtB,wBAAyBC,GACzB,mBAAAC,GACA,gBAAiBC,EACjB,MAAOC,CACT,EAAIC,GAA8B,CAAE,QAAA/B,EAAS,KAAAE,EAAM,kBAAAqB,CAAkB,CAAC,EAEhES,GAAQF,GAAgBjB,GAAeO,EAEvCa,GACJ,CAAC,EAAEf,GAAaD,IAAe,CAAC,CAACY,GAAW,CAAC,CAACD,GAC1CM,GACJ,CAAC,CAACL,GAAS,KACX,CAAC,CAACN,GACFY,GAAeN,EAAQ,GAAG,IAAMN,EAE5Ba,GAAe,SAAY,CAC/B,GAAI,GAACP,GAAW,CAACD,IAGjB,GAAI,CACF,IAAMS,GAAgBpB,EAAa,MAAMA,EAAW,KAAK,EAAI,OAE7DqB,GAAoB,CAClB,QAAArC,EACA,KAAAC,EACA,QAAAF,EACA,mBAAA4B,GACA,IANUV,GAAwB,OAOlC,KAAMmB,GACN,+BAAgCR,EAAQ,IACxC,mBAAAzB,EACA,YAAa,gBAAgBmC,GAAmBvC,CAAO,CAAC,MAAMwC,GAAyBZ,EAAkB,CAAC,EAC5G,CAAC,EACDzB,EAAY,CACd,OAASsC,GAAG,CACV,QAAQ,MAAMA,EAAC,EACf3B,EAAe2B,EAAC,CAClB,CACF,EAEA,OACE,EAAA5C,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC,kBAAc,UAAWS,EAAQ,eAC/B0B,GAAQ,EAAAnC,QAAA,cAAC,iBAAa,MAAOmC,GAAO,EAAK,KAC1C,EAAAnC,QAAA,cAACD,GAAA,IAAS,EAEV,EAAAC,QAAA,cAAC6C,GAAA,CACC,OAAQ/B,EACR,UAAWC,EACX,aAAcG,EACd,gBAAiBC,EACjB,QAASR,EACT,MAAOC,EACP,SAAUC,EACZ,EACA,EAAAb,QAAA,cAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,GACtB4B,EACCF,EACE,EAAA1B,QAAA,gBAAAA,QAAA,cACE,EAAAA,QAAA,cAAC8C,GAAA,CACC,IAAKjB,GACL,OAAQC,GACR,kBAAmBJ,EACnB,SAAUC,GACV,QAASxB,EACT,iBAAkByB,EACpB,EACA,EAAA5B,QAAA,cAAC+C,GAAA,CACC,kBAAmBrB,EACnB,cAAeD,EACf,iBAAkBG,EACpB,CACF,EACE,KAEJ,EAAA5B,QAAA,cAAC,oBAAgB,MAAM,4BAA4B,QAAQ,KAAK,CAEpE,CACF,EACA,EAAAA,QAAA,cAAC,sBACEqC,GACC,EAAArC,QAAA,cAACgD,GAAA,CACC,mBAAoBzC,EACpB,2BAA4BC,EAC9B,EACE,KACJ,EAAAR,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,YACN,QAAS,IAAM,CACbM,EAAY,CACd,GACD,QAED,EACA,EAAAN,QAAA,cAAC,WACC,QAAQ,YACR,MAAM,UACN,SAAU,CAACoC,GACX,QAAS,IAAM,CACRG,GAAa,CACpB,GACD,mCAED,CACF,CACF,CAEJ,CAAC,EAEMU,GAAQ/C,GEtMf,IAAAgD,GAAyB,OAElB,SAASC,GACdC,EACAC,EACyB,CACzB,GAAM,CAACC,EAAOC,CAAQ,KAAI,aAAY,IAAM,CAC1C,IAAMC,EAAS,aAAa,QAAQJ,CAAG,EACvC,GAAII,EACF,GAAI,CACF,OAAO,KAAK,MAAMA,CAAM,CAC1B,MAAQ,CACN,OAAOH,CACT,CAEF,OAAOA,CACT,CAAC,EAED,SAASI,EAAiBC,EAAa,CACrCH,EAASG,CAAQ,EACjB,aAAa,QAAQN,EAAK,KAAK,UAAUM,CAAQ,CAAC,CACpD,CAEA,MAAO,CAACJ,EAAOG,CAAgB,CACjC,CrDNe,SAARE,GAAyC,CAC9C,YAAAC,EACA,QAAAC,EACA,MAAAC,CACF,EAIG,CACD,GAAM,CAACC,EAAQC,CAAS,KAAI,aAAS,CAAC,EAChC,CAACC,EAAoBC,CAAqB,EAC9CC,GACE,wCACAC,EACF,EACIC,KAAU,eAAWP,CAAK,EAC1BQ,KAAO,sBAAkBR,CAAK,EAEpC,OACE,GAAAS,QAAA,cAAC,WACC,SAAS,KACT,MAAM,sBACN,UACE,GAAAA,QAAA,iBAAAA,QAAA,cAAE,uBACoB,GAAAA,QAAA,cAACC,GAAA,IAAW,CAClC,EAEF,KAAI,GACJ,QAASZ,GAET,GAAAW,QAAA,cAAC,SACC,MAAOR,EACP,SAAU,CAACU,EAAGC,IAAQ,CACpBV,EAAUU,CAAG,CACf,GAEA,GAAAH,QAAA,cAAC,QAAI,MAAO,EAAG,MAAM,qBAAqB,EAC1C,GAAAA,QAAA,cAAC,QAAI,MAAO,EAAG,MAAM,kBAAkB,EACvC,GAAAA,QAAA,cAAC,QAAI,MAAO,EAAG,MAAM,qBAAqB,CAC5C,EACA,GAAAA,QAAA,cAACI,GAAA,CAAS,MAAOZ,EAAQ,MAAO,GAC9B,GAAAQ,QAAA,cAACK,GAAA,CACC,QAASP,EACT,KAAMC,EACN,QAAST,EACT,YAAaD,EACb,mBAAoBK,EACpB,2BAA4BC,EAC9B,CACF,EACA,GAAAK,QAAA,cAACI,GAAA,CAAS,MAAOZ,EAAQ,MAAO,GAC9B,GAAAQ,QAAA,cAACM,GAAA,CACC,QAASR,EACT,KAAMC,EACN,QAAST,EACT,YAAaD,EACf,CACF,EACA,GAAAW,QAAA,cAACI,GAAA,CAAS,MAAOZ,EAAQ,MAAO,GAC9B,GAAAQ,QAAA,cAACO,GAAA,CACC,QAAST,EACT,KAAMC,EACN,QAAST,EACT,YAAaD,EACb,mBAAoBK,EACpB,2BAA4BC,EAC9B,CACF,CACF,CAEJ,CF5EA,SAASa,GAAUC,EAA2C,CAC5D,OAAOA,EAAI,OAAS,oBACtB,CAEA,SAASC,GAAiBC,EAA2B,CACnD,OAAOA,EAAW,MACfC,GAGK,CACJ,IAAMC,EAAwBD,EAAK,iBACnC,MAAO,CACL,kBAAmB,CACjB,IAAME,EAAUF,EAAK,mBACfG,EACJD,IAAY,QACZ,CAAC,OAAQ,OAAQ,YAAY,EAAE,SAASA,EAAQ,IAAI,MAAM,CAAC,EAC7D,MAAO,CACL,GAAGD,EAAsB,EACzB,GAAIE,EACA,CACE,CACE,MAAO,sBACP,KAAMC,GACN,QAAS,IAAM,CACb,IAAMC,KAAQ,uBAAmBL,CAAI,KACrB,eAAWK,CAAK,EACxB,YAAYC,GAAe,CACjCC,GACA,CAAE,MAAOF,EAAO,YAAAC,EAAa,QAAAJ,CAAQ,CACvC,CAAC,CACH,CACF,CACF,EACA,CAAC,CACP,CACF,CACF,CACF,CACF,CACF,CAEe,SAARM,GAAoCC,EAA8B,CACvEA,EAAc,oBACZ,8BACCZ,IACKD,GAAUC,CAAG,IACfA,EAAI,WAAaC,GAAiBD,EAAI,UAAU,GAE3CA,EAEX,CACF,CwDhEA,IAAAa,GAA+B,QAC/BC,GAA+B,QAG/BC,KACAC,KAuBA,SAASC,GAAWC,EAAyC,CAC3D,GAAI,OAAOA,GAAU,SACnB,OAAOA,EAET,GAAM,CAAE,QAAAC,CAAQ,EAAID,EACpB,OAAO,OAAOC,GAAY,SAAWA,EAAU,MACjD,CAEA,SAASC,GAAkBC,EAAqBC,EAAsB,CACpE,IAAMC,EAASC,GAAqBF,CAAY,EAChD,MAAO,CAACD,EAAW,IAAI,MAAM,EAAGA,EAAW,IAAI,IAAI,EAAGA,EAAW,GAAG,CAAC,EAAE,KACrEI,GACE,OAAOA,GAAc,WACpBA,IAAcH,GACbE,GAAqBC,CAAS,IAAMF,EAC1C,CACF,CAWA,eAAsBG,GAAmB,CACvC,QAAAC,EACA,UAAAC,EACA,aAAAN,EACA,cAAAO,CACF,EAKiC,CAC/B,GAAI,CAACP,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,IAAMQ,EAAeD,GAAe,SAC9BE,EAAMF,GAAe,IACrBG,EAAaH,GAAe,QAAU,CAAC,EAC7C,GAAI,CAACC,GAAgB,CAACC,EACpB,MAAM,IAAI,MACR,0EACF,EAGF,IAAME,EAAW,MAAMN,EAAQ,gBAAgB,gBAAgBG,CAAY,EAC3E,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,aAAaH,CAAY,aAAa,EAGxD,IAAMI,KAAS,mBAAeH,EAAKI,GAAWF,EAAS,eAAeE,CAAO,CAAC,EAC9E,GAAID,EAAO,QAAU,QAAaA,EAAO,MAAQ,OAC/C,MAAM,IAAI,MAAM,gDAAgDH,CAAG,GAAG,EAExE,IAAMK,EAAS,CACb,aAAAN,EACA,QAASG,EAAS,oBAAoBC,EAAO,OAAO,GAAKA,EAAO,QAChE,MAAOA,EAAO,MACd,IAAKA,EAAO,GACd,EAEMG,EAAWL,EAAW,IAAIf,EAAU,EAAE,OAAOqB,GAAKA,IAAM,MAAS,EACjEC,EAAaZ,EAAQ,cAAc,EACnCa,EAAY,cACZC,EAAyB,CAAC,EAChC,QAAWtB,KAAWkB,EAAU,CAC9B,IAAMK,EAAYH,EAAWpB,CAAO,EACpC,GAAI,CAACuB,EACH,SAEF,IAAMC,EAAS,MAAMhB,EAAQ,WAAW,KAAKa,EAAW,kBAAmB,CACzE,iBAAe,mBAAeE,EAAW,SAAS,EAClD,UAAAF,EACA,QAAS,CAACJ,CAAM,CAClB,CAAC,EACD,QAAWQ,KAAQD,EACjBF,EAAY,KAAK,GAAGI,GAAsBD,CAAI,CAAC,CAEnD,CAEA,IAAMvB,EAAaoB,EAAY,KAAK,GAAKrB,GAAkB,EAAGE,CAAY,CAAC,EAC3E,GAAI,CAACD,EACH,MAAM,IAAI,MACR,eAAeC,CAAY,kBAAkBS,CAAG,eAAeM,EAAS,KAAK,IAAI,CAAC,GACpF,EAKF,GAAI,EAHYhB,EAAW,IAAI,aAAa,GAAK,CAAC,GAAG,KAClDyB,GAAiBA,EAAI,IAAI,MAAM,IAAM,KACxC,EAEE,MAAM,IAAI,MAAM,eAAexB,CAAY,0BAA0B,EAGvE,IAAMyB,EAAiC,MAAMC,GAAgB,CAC3D,QAAArB,EACA,aAAAG,EACA,QAAST,CACX,CAAC,EACD,GAAI,CAAC0B,EACH,MAAM,IAAI,MACR,+CAA+CzB,CAAY,GAC7D,EAGF,MAAO,CACL,IAAK2B,GAAyBrB,CAAS,EACvC,QAASP,EAAW,OAAO,EAC3B,+BAAA0B,CACF,CACF,CC7IAG,KAQe,SAARC,GACLC,EACA,CACAA,EAAc,oBACZ,yBAMA,MAAO,CACL,QAAAC,EACA,IAAAC,EACA,UAAAC,EACA,aAAAC,EACA,+BAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,mBAAAC,EACA,YAAAC,EACA,OAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,WAAAC,CACF,IAmBM,CAMJ,IAAIC,EACJ,GAAI,CAACd,GAAOC,EACV,GAAI,CACFa,EAAW,MAAMC,GAAmB,CAClC,QAAAhB,EACA,UAAAE,EACA,aAAAC,EACA,cAAAI,CACF,CAAC,CACH,OAASU,EAAG,CACV,QAAQ,MAAMA,CAAC,EACfjB,EAAQ,OAAO,kCAAkCiB,CAAC,GAAI,OAAO,EAC7D,MACF,CAGF,IAAMC,EAAWjB,GAAOc,GAAU,IAClC,GAAI,CAACG,EACH,MAAM,IAAI,MACR,0DACF,EAUF,IAAMC,EAAoB,CAACb,GAAmB,CAAC,CAACC,EAC1Ca,EACJd,IACCC,EACGP,EAAQ,QAAQ,mBAAoB,CAClC,KAAM,mBACN,KAAMO,CACR,CAAC,EAAE,GACH,QAEAc,EAAcrB,EAAQ,QAAQ,cAAe,CACjD,KAAM,cACN,mBAAAQ,EACA,YAAAC,EACA,OAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,WAAY,CACV,CACE,IAAKK,EACL,+BACEH,GAAU,gCACVX,GACA,GACF,QAASW,GAAU,SAAWV,EAC9B,gBAAiBe,CACnB,CACF,CACF,CAAC,EAEGD,IAAsBL,GAAcQ,GAAoB,IAC1DC,GAAqBvB,EAASqB,EAAY,EAAE,CAEhD,CACF,CACF,CC9HA,IAAAG,GAAqB,OAErBC,GAAyB,QCFzB,IAAAC,GAA8B,QAC9BC,GAA0B,QAC1BC,GAAmC,QCAnCC,KACA,IAAAC,GAA4B,UACrBC,MAAQ,qBAA2B,GAAAC,KAAK,OAAQ,CACrD,EAAG,gNACL,CAAC,EAAG,YAAY,EDDhB,IAAAC,GAAwB,QAExBC,KEmBO,SAASC,GACdC,EACAC,EACsB,CACtB,IAAMC,EAAOF,EAAM,KAAK,KACxB,GAAI,CAACE,EACH,OAEF,GAAM,CAAE,eAAAC,CAAe,EAAID,EAAK,mBAC1B,CAAE,QAAAE,EAAS,MAAAC,CAAM,EAAIH,EAAK,gBAAgB,oBAC1CI,EAAIL,IAAc,OAAYI,EAAQ,KAAK,IAAIA,EAAOJ,CAAS,EAC/DM,EAAmB,CAAC,EAC1B,QAASC,EAAI,EAAGA,EAAIF,EAAGE,IACrBD,EAAO,KAAKJ,EAAe,MAAMC,EAAQI,CAAC,CAAE,CAAC,EAE/C,OAAOD,CACT,CAOO,SAASE,GACdF,EACoB,CACpB,MACE,CAAC,CAACA,GACFA,EAAO,OAAS,GAChBA,EAAO,MAAMG,GAAKA,GAAK,GAAKA,GAAK,GAAG,GACpC,IAAI,IAAIH,CAAM,EAAE,KAAO,CAE3B,CCxCA,eAAsBI,GAAkB,CACtC,UAAAC,EACA,OAAAC,CACF,EAG2B,CACzB,GAAM,CAAE,MAAAC,CAAM,EAAIF,EAAU,KACxB,MAAMG,GAAqB,CAAE,KAAMH,EAAU,KAAM,OAAAC,CAAO,CAAC,EAC3DD,EAAU,IACR,MAAMI,GAAoB,CAAE,IAAKJ,EAAU,IAAK,OAAAC,CAAO,CAAC,EACxD,CAAE,MAAO,MAAU,EACnBI,EAAYH,EAAQI,GAA0BJ,CAAK,EAAI,OACvDK,EAAaL,EACfM,GAA4BN,EAAOG,IAAY,CAAC,GAAG,MAAM,EACzD,OACJ,MAAO,CAAE,UAAAA,EAAW,WAAAE,CAAW,CACjC,CCnCA,IAAAE,GAAwB,QAmCjB,SAASC,GAAoBC,EAA2B,CAC7D,IAAMC,EAAoB,IAAI,IAE9B,SAASC,EAASC,EAA8BC,EAAuB,CACrEH,EAAkB,IAAIE,CAAS,EAC/BE,GAAkB,CAAE,UAAAF,EAAW,OAAAC,CAAO,CAAC,EACpC,KAAKE,GAAQ,CACZ,IAAMC,KAAU,YAAQJ,CAAS,EAC7BH,EAAK,qBACL,OACAO,IAAYH,IACdD,EAAU,iBAAiBG,CAAI,EAC/BH,EAAU,mBAAmB,EAAI,GAEnCF,EAAkB,OAAOE,CAAS,EAC9BI,GAAWA,IAAYH,GAAU,CAACD,EAAU,iBAC9CD,EAASC,EAAWI,CAAO,CAE/B,CAAC,EACA,MAAOC,GAAe,CACrBP,EAAkB,OAAOE,CAAS,KAC9B,YAAQH,CAAI,IACdA,EAAK,SAASQ,CAAC,EACf,QAAQ,MAAMA,CAAC,EAEnB,CAAC,CACL,CAEA,OAAO,UAAiC,CACtC,GAAM,CAAE,WAAAC,EAAY,qBAAAC,CAAqB,EAAIV,EAC7C,GAAIU,EACF,QAAWP,KAAaM,EAClB,CAACN,EAAU,iBAAmB,CAACF,EAAkB,IAAIE,CAAS,GAChED,EAASC,EAAWO,CAAoB,CAIhD,CACF,CCzEA,IAAAC,GAA0C,QAC1CC,EAKO,QACPC,GAAwB,QAExBC,KAIAC,KCbAC,KAKAC,KAqBO,IAAMC,GAAgBC,GAAcA,EAEpC,IAAMC,GAAgBC,GAAcA,EAgCpC,SAASC,GACdC,EACkB,CAClB,GAAM,CACJ,oCAAAC,EACA,oCAAAC,CACF,EAAIC,GAA+BH,CAAiB,EAC9CI,EAAQC,GAAgCL,CAAiB,EACzDM,EAAQC,GAAiCP,CAAiB,EAC1DQ,EAAQC,GAAUL,CAAK,EACvBM,EAAQD,GAAUH,CAAK,EAK7B,MAAO,CACL,sBAAuBK,GACrBV,EAAoCU,CAAC,EACvC,sBAAuBA,GACrBT,EAAoCS,CAAC,EACvC,qBAAsBA,GAAKP,EAAMO,CAAC,EAClC,qBAAsBC,GAAKJ,EAAMI,CAAC,EAClC,sBAAuBD,GAAKL,EAAMK,CAAC,EACnC,sBAAuBC,GAAKF,EAAME,CAAC,EACnC,KAAM,CACJ,oCAAAX,EACA,oCAAAC,EACA,gCAAiCE,EACjC,iCAAkCE,EAClC,6BAA8BE,EAC9B,8BAA+BE,CACjC,CACF,CACF,CDnEAG,KEpBA,IAAMC,GAAc,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAE9GC,GAAe,CAEnB,CAAE,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAK,EAAG,GAAI,GAAK,EAAG,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAG,GAAI,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAI,EAAG,GAAK,EAAI,EAAI,EAAI,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAI,EAAG,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAI,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAI,EAAG,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAG,GAAI,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAG,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAK,EAAI,EAAG,GAAK,EAAI,EAAI,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAK,EAAI,EAAI,EAAG,EAAE,EAC/F,CAAE,EAAG,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAK,EAAG,GAAI,GAAK,EAAG,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAE,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,EAAE,EAC/F,CAAC,GAAI,GAAK,EAAI,EAAG,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GAAI,GAAK,EAAI,EAAG,GAAI,EAAE,EAC/F,CAAC,GAAK,EAAI,EAAI,EAAG,GAAK,EAAI,EAAG,GAAK,EAAG,GAAI,GAAK,EAAG,GAAI,GAAI,GAAK,EAAG,GAAI,GAAI,GA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",
|
|
6
|
+
"names": ["require_Plugin", "__commonJSMin", "exports", "module", "require_react", "__commonJSMin", "exports", "module", "require_mobx_react", "__commonJSMin", "exports", "module", "require_util", "__commonJSMin", "exports", "module", "require_mui", "__commonJSMin", "exports", "module", "loadMolstar", "cached", "base", "src", "init_loadMolstar", "__esmMin", "checkHovered", "hovered", "getMolstarStructureSelection", "structure", "selectedResidue", "Script", "loadMolstar", "Q", "invertMap", "arg", "a", "b", "init_util", "__esmMin", "init_loadMolstar", "genomeToTranscriptSeqMapping", "feature", "strand", "refName", "uniqueCds", "f", "key", "cds", "b", "g2p", "p2g", "p2gCodon", "proteinCounter", "lastProteinPos", "length", "i", "genomePos", "proteinPos", "getCodonRange", "init_esm", "__esmMin", "require_mobx", "__commonJSMin", "exports", "module", "structureSeqVsTranscriptSeqMap", "pairwiseAlignment", "structureSeq", "transcriptSeq", "j", "k", "structureSeqToTranscriptSeqPosition", "transcriptSeqToStructureSeqPosition", "i", "c1", "seqPositionToAlignmentMap", "seq", "map", "structurePositionToAlignmentMap", "transcriptPositionToAlignmentMap", "genomeToTranscriptSeqMapping", "feature", "init_mappings", "__esmMin", "init_esm", "import_util", "import_mobx", "Protein1DViewRegistry", "protein1DViewRegistry", "init_Protein1DViewRegistry", "__esmMin", "init_esm", "init_mappings", "info", "viewId", "session", "activeViewIds", "v", "uniprotId", "proteinPos", "feature", "mapping", "genomeToTranscriptSeqMapping", "p2g", "strand", "refName", "result", "getCodonRange", "start", "end", "stripStopCodon", "seq", "getTranscriptFeatures", "feature", "transcripts", "f", "stripTrailingVersion", "s", "getId", "val", "getTranscriptDisplayName", "getGeneDisplayName", "isRecognizedDatabaseId", "id", "ensemblGenePattern", "ensemblTranscriptPattern", "ensemblProteinPattern", "refSeqTranscriptPattern", "refSeqProteinPattern", "ccdsPattern", "hgncPattern", "getDatabaseTypeForId", "parseDbxref", "dbxref", "item", "extractIdsFromDbxref", "dbxrefEntries", "ids", "entry", "parts", "lastPart", "findRecognizedDbIds", "recognizedIds", "attributesToCheck", "attr", "stripped", "hgnc", "hgncStr", "dbxrefIds", "extractFeatureIdentifiers", "featureToProcess", "uniprotIdAttr", "uniprotId", "geneId", "geneName", "selectBestTranscript", "options", "isoformSequences", "structureSequence", "exactMatch", "longestWithData", "a", "b", "init_util", "__esmMin", "require_AdapterType", "__commonJSMin", "exports", "module", "require_configuration", "__commonJSMin", "exports", "module", "require_BaseAdapter", "__commonJSMin", "exports", "module", "require_io", "__commonJSMin", "exports", "module", "require_rxjs", "__commonJSMin", "exports", "module", "AlphaFoldConfidenceAdapter_exports", "__export", "AlphaFoldConfidenceAdapter", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_AlphaFoldConfidenceAdapter", "__esmMin", "scores", "value", "idx", "_opts", "e", "query", "observer", "start", "end", "refName", "data", "f", "AlphaMissensePathogenicityAdapter_exports", "__export", "AlphaMissensePathogenicityAdapter", "parseAlphaMissense", "text", "f", "row", "idx", "protein_variant", "score", "am_class", "ref", "variant", "coord", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_AlphaMissensePathogenicityAdapter", "__esmMin", "scores", "_opts", "e", "s", "_regions", "query", "observer", "start", "end", "refName", "data", "sources", "require_utils", "__commonJSMin", "exports", "module", "import_utils", "init_createSvgIcon", "__esmMin", "require_jsx_runtime", "__commonJSMin", "exports", "module", "require_ui", "__commonJSMin", "exports", "module", "require_material", "__commonJSMin", "exports", "module", "getLaunchSideBySide", "stored", "SIDE_BY_SIDE_KEY", "setLaunchSideBySide", "value", "isSessionWithWorkspaces", "session", "launchViewSideBySide", "viewId", "init_sideBySide", "__esmMin", "getFirstNonEmptyLine", "arr", "line", "init_util", "__esmMin", "isRulerLine", "line", "trimmed", "f", "isSequenceLine", "hasPositionNumbers", "fields", "getSeqBounds", "seqIndex", "seq", "seqStart", "parsePairwiseBlock", "arr", "getFirstNonEmptyLine", "block", "consensusLine", "s", "firstField", "start", "end", "ids", "seqs", "consensus", "firstSeq", "remainder", "parsePairwiseBlocks", "res", "i", "init_pairwise", "__esmMin", "init_util", "parsePairwise", "contents", "filtered", "f", "res", "parsePairwiseBlocks", "alns", "n", "index", "consensus", "firstAln", "init_esm", "__esmMin", "init_pairwise", "init_util", "setupProteinAssembly", "session", "uniprotId", "init_proteinAssemblySetup", "__esmMin", "fetchUniProtFeatureTypes", "uniprotId", "url", "res", "data", "f", "addUniProtFeatureTracks", "session", "featureTypes", "type", "trackId", "addAntigenTrack", "addVariationTrack", "addAlphaFoldConfidenceTrack", "confidenceUrl", "addAlphaMissenseTrack", "addAllProteinTracks", "init_proteinTrackSetup", "__esmMin", "launchProteinAnnotationView", "session", "feature", "selectedTranscript", "uniprotId", "confidenceUrl", "connectedViewId", "setupProteinAssembly", "addAllProteinTracks", "view", "formatViewName", "protein1DViewRegistry", "init_launchProteinAnnotationView", "__esmMin", "init_proteinAssemblySetup", "init_proteinTrackSetup", "init_Protein1DViewRegistry", "init_launchViewUtils", "getAlphaFoldStructureUrl", "uniprotId", "version", "ALPHAFOLD_VERSION", "getAlphaFoldConfidenceUrl", "getAlphaFoldMsaUrl", "getPdbStructureUrl", "pdbId", "extractTargetId", "target", "getUniprotIdFromAlphaFoldTarget", "getStructureUrlFromTarget", "db", "targetId", "getConfidenceUrlFromTarget", "formatViewName", "prefix", "feature", "selectedTranscript", "getGeneDisplayName", "getTranscriptDisplayName", "s", "launch3DProteinView", "session", "view", "url", "data", "userProvidedTranscriptSequence", "alignmentAlgorithm", "displayName", "connectedMsaViewId", "sideBySide", "snap", "proteinView", "getLaunchSideBySide", "launchViewSideBySide", "launch1DProteinView", "confidenceUrl", "launchProteinAnnotationView", "launchMsaView", "hasMsaViewPlugin", "launch3DProteinViewWithMsa", "params", "msaView", "import_util", "init_launchViewUtils", "__esmMin", "init_sideBySide", "init_util", "init_launchProteinAnnotationView", "require_use_sync_external_store_shim_production", "__commonJSMin", "exports", "React", "is", "x", "y", "objectIs", "useState", "useEffect", "useLayoutEffect", "useDebugValue", "useSyncExternalStore$2", "subscribe", "getSnapshot", "value", "_useState", "inst", "forceUpdate", "checkIfSnapshotChanged", "latestGetSnapshot", "nextValue", "useSyncExternalStore$1", "shim", "require_shim", "__commonJSMin", "exports", "module", "events_exports", "__export", "ERROR_REVALIDATE_EVENT", "FOCUS_EVENT", "MUTATE_EVENT", "RECONNECT_EVENT", "init_events", "__esmMin", "dequal", "foo", "bar", "ctor", "len", "has", "init_lite", "__esmMin", "internalMutate", "args", "cache", "_key", "_data", "_opts", "options", "mergeObjects", "populateCache", "rollbackOnErrorOption", "optimisticData", "rollbackOnError", "error", "throwOnError", "isFunction", "keyFilter", "matchedKeys", "it", "key", "mutateByKey", "_k", "serialize", "get", "set", "createCacheHelper", "EVENT_REVALIDATORS", "MUTATION", "FETCH", "PRELOAD", "SWRGlobalState", "startRevalidate", "revalidators", "data", "isError", "beforeMutationTs", "getTimestamp", "hasOptimisticData", "isUndefined", "state", "displayedData", "currentData", "committedData", "err", "isPromiseLike", "UNDEFINED", "populateCachedData", "import_react", "noop", "OBJECT", "EMPTY_CACHE", "INITIAL_CACHE", "STR_UNDEFINED", "isWindowDefined", "isDocumentDefined", "isLegacyDeno", "hasRequestAnimationFrame", "online", "isOnline", "onWindowEvent", "offWindowEvent", "isVisible", "initFocus", "initReconnect", "preset", "defaultConfigOptions", "IS_REACT_LEGACY", "IS_SERVER", "rAF", "useIsomorphicLayoutEffect", "navigatorConnection", "slowConnection", "table", "getTypeName", "isObjectTypeName", "counter", "stableHash", "__timestamp", "revalidateAllKeys", "initCache", "onErrorRetry", "compare", "mutate", "defaultConfig", "mergeConfigs", "SWRConfigContext", "SWRConfig", "init_config_context_12s_CCVTDPOP", "__esmMin", "init_lite", "v", "a", "b", "x", "info", "prev", "visibilityState", "callback", "onOnline", "onOffline", "React", "f", "value", "typeName", "type", "arg", "isDate", "isRegex", "isPlainObject", "result", "index", "keys", "provider", "opts", "unmount", "subscriptions", "subscribe", "subs", "setter", "fn", "initProvider", "releaseFocus", "releaseReconnect", "_", "__", "config", "revalidate", "maxRetryCount", "currentRetryCount", "timeout", "dequal", "u1", "f1", "u2", "f2", "props", "parentConfig", "isFunctionalConfig", "extendedConfig", "cacheContextRef", "cacheContext", "INFINITE_PREFIX", "init_constants", "__esmMin", "init_types", "__esmMin", "import_react", "enableDevtools", "use", "setupDevTools", "normalize", "useSWRConfig", "middleware", "BUILT_IN_MIDDLEWARE", "withArgs", "subscribeCallback", "init_internal", "__esmMin", "init_config_context_12s_CCVTDPOP", "init_events", "init_constants", "init_types", "isWindowDefined", "React", "args", "isFunction", "parentConfig", "SWRConfigContext", "mergeObjects", "defaultConfig", "useSWRNext", "key_", "fetcher_", "config", "key", "serialize", "PRELOAD", "SWRGlobalState", "cache", "INFINITE_PREFIX", "req", "isUndefined", "hook", "fallbackConfig", "fn", "_config", "mergeConfigs", "next", "i", "callbacks", "callback", "keyedRevalidators", "index", "import_react", "import_shim", "noop", "UNDEFINED", "use", "WITH_DEDUPE", "resolvedUndef", "sub", "useSWRHandler", "SWRConfig", "useSWR", "init_index", "__esmMin", "init_internal", "React", "thenable", "v", "e", "_key", "fetcher", "config", "cache", "compare", "suspense", "fallbackData", "revalidateOnMount", "revalidateIfStale", "refreshInterval", "refreshWhenHidden", "refreshWhenOffline", "keepPreviousData", "strictServerPrefetchWarning", "EVENT_REVALIDATORS", "MUTATION", "FETCH", "PRELOAD", "SWRGlobalState", "key", "fnArg", "serialize", "initialMountedRef", "unmountedRef", "keyRef", "fetcherRef", "configRef", "getConfig", "isActive", "getCache", "setCache", "subscribeCache", "getInitialCache", "createCacheHelper", "stateDependencies", "fallback", "isUndefined", "isEqual", "prev", "current", "_", "t", "returnedData", "isInitialMount", "getSnapshot", "cachedData", "initialData", "getSelectedCache", "state", "snapshot", "mergeObjects", "data", "clientSnapshot", "serverSnapshot", "memorizedSnapshot", "newSnapshot", "cached", "callback", "hasRevalidator", "isPromiseLike", "error", "laggyDataRef", "hasKeyButNoData", "hydrationRef", "IS_SERVER", "isHydration", "shouldDoInitialRevalidation", "defaultValidatingState", "isValidating", "isLoading", "revalidate", "revalidateOpts", "currentFetcher", "newData", "startAt", "loading", "opts", "shouldStartNewRequest", "callbackSafeguard", "IS_REACT_LEGACY", "finalState", "finishRequestAndUpdateState", "cleanupState", "requestInfo", "initialState", "getTimestamp", "mutationInfo", "cacheData", "err", "currentConfig", "shouldRetryOnError", "isFunction", "_opts", "revalidators", "events_exports", "boundMutate", "args", "internalMutate", "useIsomorphicLayoutEffect", "softRevalidate", "nextFocusRevalidatedAt", "unsubEvents", "subscribeCallback", "type", "now", "rAF", "timer", "next", "interval", "execute", "req", "mutateReq", "revalidation", "OBJECT", "defaultConfig", "withArgs", "import_jsx_runtime", "Help_default", "init_Help", "__esmMin", "init_createSvgIcon", "_jsx", "HelpDialog_exports", "__export", "HelpDialog", "Typography2", "children", "React", "handleClose", "import_react", "import_ui", "import_material", "init_HelpDialog", "__esmMin", "require_pluggableElementTypes", "__commonJSMin", "exports", "module", "require_mst", "__commonJSMin", "exports", "module", "require_mobx_state_tree", "__commonJSMin", "exports", "module", "applyColorTheme", "plugin", "colorScheme", "structures", "structure", "COLOR_SCHEMES", "COLOR_SCHEME_VALUES", "init_applyColorTheme", "__esmMin", "s", "clearLoci", "plugin", "applyLoci", "loci", "mode", "applyLociInteractivityMultiple", "structure", "residues", "StructureSelection", "Script", "loadMolstar", "sel", "Q", "residue", "applyLociInteractivity", "startResidue", "endResidue", "applyLociInteractivitySingle", "selectedResidue", "getMolstarStructureSelection", "init_applyLociInteractivity", "__esmMin", "init_loadMolstar", "init_util", "HOVER_MARKER_COLOR", "SELECTED_BORDER", "HOVERED_BORDER", "HIDE_BUTTON_COLOR", "init_constants", "__esmMin", "highlightResidueRange", "structure", "startResidue", "endResidue", "plugin", "applyLociInteractivity", "selectResidueRange", "init_highlightResidueRange", "__esmMin", "init_applyLociInteractivity", "proteinToGenomeMapping", "model", "structureSeqPos", "genomeToTranscriptSeqMapping", "pairwiseAlignment", "structureSeqToTranscriptSeqPosition", "p2g", "strand", "transcriptPos", "getCodonRange", "proteinRangeToGenomeMapping", "structureSeqEndPos", "minStart", "maxEnd", "pos", "result", "s", "e", "navigateToProteinPosition", "zoomToBaseLevel", "session", "connectedView", "refName", "assemblyName", "start", "end", "assemblyManager", "canonicalRefName", "clickProteinToGenome", "import_util", "init_proteinToGenomeMapping", "__esmMin", "init_esm", "kyteDoolittleScores", "seq", "aa", "KYTE_DOOLITTLE", "plddtColor", "score", "hydrophobicityColor", "KYTE_DOOLITTLE_MIN", "KYTE_DOOLITTLE_MAX", "r", "g", "b", "mapResidueValuesToColumns", "values", "structurePositionToAlignmentMap", "value", "structurePos", "col", "init_residueTracks", "__esmMin", "import_react", "import_material", "import_mobx_react", "ManualAlignmentDialog", "ManualAlignmentDialog_default", "init_ManualAlignmentDialog", "__esmMin", "init_esm", "model", "alignment", "setAlignment", "parseError", "setParseError", "showManualAlignmentDialog", "primaryStructure", "handleClose", "handleApply", "parsed", "parsePairwise", "e", "React", "import_jsx_runtime", "Tune_default", "init_Tune", "__esmMin", "init_createSvgIcon", "_jsx", "require_Checkbox", "__commonJSMin", "exports", "module", "require_IconButton", "__commonJSMin", "exports", "module", "require_ListItemIcon", "__commonJSMin", "exports", "module", "require_ListItemText", "__commonJSMin", "exports", "module", "require_Menu", "__commonJSMin", "exports", "module", "require_MenuItem", "__commonJSMin", "exports", "module", "require_TextField", "__commonJSMin", "exports", "module", "require_Tooltip", "__commonJSMin", "exports", "module", "import_react", "import_ui", "import_material", "import_mobx_react", "AddStructureDialog", "AddStructureDialog_default", "init_AddStructureDialog", "__esmMin", "init_launchViewUtils", "model", "file", "setFile", "pdbId", "setPdbId", "uniprotId", "setUniprotId", "choice", "setChoice", "structureURL", "setStructureURL", "error", "setError", "showAddStructureDialog", "handleClose", "handleAdd", "url", "data", "getPdbStructureUrl", "getAlphaFoldStructureUrl", "e", "canAdd", "React", "event", "target", "f", "import_react", "import_mobx_react", "HeaderStructureInfo", "HeaderStructureInfo_default", "init_HeaderStructureInfo", "__esmMin", "model", "structures", "hoverText", "structure", "React", "ProteinAlignmentHelpDialog_exports", "__export", "ProteinAlignmentHelpDialog", "Typography2", "children", "React", "handleClose", "import_react", "import_ui", "import_material", "init_ProteinAlignmentHelpDialog", "__esmMin", "ProteinAlignmentHelpButton", "model", "React", "handleClose", "ProteinAlignmentHelpDialog", "Help_default", "import_react", "import_util", "import_material", "init_ProteinAlignmentHelpButton", "__esmMin", "init_Help", "getFeatureColor", "type", "featureColors", "fetchUniProtFeatures", "url", "res", "text", "features", "line", "parts", "start", "end", "attributes", "description", "id", "attr", "key", "value", "uniqueId", "useUniProtFeatures", "uniprotId", "data", "error", "isLoading", "useSWR", "init_useUniProtFeatures", "__esmMin", "init_index", "getFeatureAlignmentRange", "feature", "structurePositionToAlignmentMap", "startAlignmentPos", "endAlignmentPos", "getFeatureGeometry", "startAlnPos", "endAlnPos", "FeatureTooltipContent", "React", "import_react", "import_material", "import_mobx_react", "FeatureBar", "FeatureBar_default", "init_FeatureBar", "__esmMin", "init_constants", "init_highlightResidueRange", "init_useUniProtFeatures", "init_proteinToGenomeMapping", "model", "isHovered", "setIsHovered", "molstarPluginContext", "selectedFeatureId", "isSelected", "handleMouseEnter", "range", "handleMouseLeave", "handleClick", "structure", "newSelected", "selectResidueRange", "e", "clickProteinToGenome", "left", "width", "color", "getFeatureColor", "SELECTED_BORDER", "HOVERED_BORDER", "import_react", "import_material", "import_mobx_react", "FeatureTypeLabel", "FeatureTypeLabel_default", "init_FeatureTypeLabel", "__esmMin", "init_constants", "type", "labelWidth", "model", "React", "e", "HIDE_BUTTON_COLOR", "import_react", "import_mobx_react", "HoverMarker", "HoverMarker_default", "init_HoverMarker", "__esmMin", "init_constants", "model", "alignmentHoverPos", "React", "HOVER_MARKER_COLOR", "getVisibleTypes", "featureTypes", "hiddenFeatureTypes", "type", "import_react", "import_mobx_react", "FeatureTypeTrackContent", "ProteinFeatureTrackLabels", "ProteinFeatureTrackContent", "init_ProteinFeatureTrack", "__esmMin", "init_constants", "init_FeatureBar", "init_FeatureTypeLabel", "init_HoverMarker", "features", "model", "sequenceLength", "React", "feature", "FeatureBar_default", "HoverMarker_default", "data", "labelWidth", "visibleTypes", "FeatureTypeLabel_default", "e", "rect", "x", "alignmentPos", "import_react", "import_material", "import_mobx_react", "ResidueValueTrack", "ResidueValueTrack_default", "init_ResidueValueTrack", "__esmMin", "init_constants", "cells", "colorFor", "formatValue", "sequenceLength", "model", "React", "e", "rect", "alignmentPos", "cell", "import_react", "import_mobx_react", "CharacterSpans", "MatchOverlays", "HoverHighlight", "RangeHighlight", "AlignmentHighlights", "SplitString", "SplitString_default", "init_SplitString", "__esmMin", "init_constants", "str", "char", "i", "React", "model", "height", "showHighlight", "alignmentMatchSet", "strLength", "alignmentHoverPos", "range", "background", "border", "start", "end", "clampedStart", "clampedEnd", "width", "e", "rect", "x", "index", "groupFeaturesByType", "features", "grouped", "feature", "useProteinFeatureTrackData", "model", "uniprotId", "isLoading", "error", "useUniProtFeatures", "pairwiseAlignment", "sequenceLength", "groupedFeatures", "init_useProteinFeatureTrackData", "__esmMin", "init_useUniProtFeatures", "GutterLabel", "label", "title", "height", "React", "import_react", "import_material", "import_mobx", "import_mobx_react", "ProteinAlignment", "ProteinAlignment_default", "init_ProteinAlignment", "__esmMin", "init_constants", "init_ProteinAlignmentHelpButton", "init_ProteinFeatureTrack", "init_ResidueValueTrack", "init_SplitString", "init_useProteinFeatureTrackData", "init_residueTracks", "model", "pairwiseAlignment", "showHighlight", "showProteinTracks", "uniprotId", "confidenceCells", "hydrophobicityCells", "containerRef", "featureData", "featureLoading", "featureError", "useProteinFeatureTrackData", "container", "a0", "a1", "con", "ProteinAlignmentHelpButton", "ProteinFeatureTrackLabels", "AlignmentHighlights", "SplitString_default", "ProteinFeatureTrackContent", "ResidueValueTrack_default", "plddtColor", "v", "hydrophobicityColor", "ToggleMenuItem", "checked", "label", "onToggle", "React", "MenuItem", "ListItemIcon", "Checkbox", "ListItemText", "getDisplayToggles", "model", "import_react", "import_ui", "import_Checkbox", "import_IconButton", "import_ListItemIcon", "import_ListItemText", "import_Menu", "import_MenuItem", "import_TextField", "import_Tooltip", "import_mobx_react", "ColorSchemeSelect", "DisplaySettingsMenu", "ProteinViewHeader", "ProteinViewHeader_default", "init_ProteinViewHeader", "__esmMin", "init_Tune", "init_AddStructureDialog", "init_HeaderStructureInfo", "init_ProteinAlignment", "init_applyColorTheme", "TextField", "event", "scheme", "COLOR_SCHEMES", "s", "anchorEl", "setAnchorEl", "Tooltip", "IconButton", "Tune_default", "Menu", "toggle", "structures", "showAlignment", "HeaderStructureInfo_default", "structure", "idx", "ProteinAlignment_default", "AddStructureDialog_default", "molstar_default", "init_molstar", "__esmMin", "useProteinView", "showControls", "model", "parentRef", "pluginRef", "error", "setError", "loading", "setLoading", "state", "GeometryExport", "MAQualityAssessment", "PluginConfig", "PluginSpec", "DefaultPluginUISpec", "createPluginUI", "renderReact18", "loadMolstar", "host", "defaultSpec", "created", "e", "plugin", "PluginCommands", "import_react", "import_mobx_state_tree", "init_useProteinView", "__esmMin", "init_loadMolstar", "ProteinView_exports", "__export", "ProteinView_default", "import_react", "import_ui", "import_mobx_react", "style", "ProteinView", "ProteinViewContainer", "init_ProteinView", "__esmMin", "init_ManualAlignmentDialog", "init_ProteinViewHeader", "init_molstar", "init_useProteinView", "molstar_default", "model", "showControls", "parentRef", "error", "loading", "useProteinView", "React", "width", "height", "structures", "ready", "s", "ProteinViewHeader_default", "delta", "ManualAlignmentDialog_default", "UniProtVariationAdapter_exports", "__export", "UniProtVariationAdapter", "import_BaseAdapter", "import_util", "import_io", "import_rxjs", "init_UniProtVariationAdapter", "__esmMin", "features", "scoreField", "begin", "end", "rest", "idx", "d", "_opts", "e", "query", "observer", "start", "refName", "data", "f", "index_exports", "__export", "ProteinViewer", "import_Plugin", "import_react", "import_react", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "import_mui", "useStyles", "getProteinView", "session", "v", "Highlight", "assemblyName", "start", "end", "refName", "model", "cx", "classes", "useStyles", "assemblyManager", "offsetPx", "ref", "s", "e", "width", "left", "React", "Highlight_default", "init_util", "GenomeMouseoverHighlight", "model", "session", "views", "hovered", "checkHovered", "s", "assemblyNames", "coord", "refName", "React", "Highlight_default", "GenomeMouseoverHighlight_default", "import_react", "import_util", "import_mobx_react", "init_Protein1DViewRegistry", "init_util", "init_mappings", "GenomeTo1DProteinHoverHighlight", "model", "session", "hovered", "assemblyNames", "viewId", "protein1DInfo", "protein1DViewRegistry", "checkHovered", "coord", "feature", "mapping", "genomeToTranscriptSeqMapping", "g2p", "proteinPos", "React", "Highlight_default", "GenomeTo1DProteinHoverHighlight_default", "import_react", "import_util", "import_mobx_react", "init_Protein1DViewRegistry", "init_util", "Protein1DToGenomeHoverHighlight", "model", "session", "hovered", "assemblyNames", "viewId", "checkHovered", "coord", "refName", "protein1DViewRegistry", "assemblyName", "genomeHighlight", "React", "Highlight_default", "Protein1DToGenomeHoverHighlight_default", "import_react", "import_mobx_react", "import_react", "import_util", "import_mobx_react", "ProteinToGenomeHighlightInner", "model", "field", "session", "assemblyManager", "assemblyNames", "proteinView", "getProteinView", "assemblyName", "React", "structure", "idx", "r", "idx2", "Highlight_default", "ProteinToGenomeHighlightInner_default", "ProteinToGenomeClickHighlight", "model", "React", "ProteinToGenomeHighlightInner_default", "ProteinToGenomeHoverHighlight", "import_react", "import_util", "import_mobx", "import_mobx_react", "ungap", "seq", "findStructureRowName", "rowMap", "structureSeq", "init_util", "ProteinToMsaHoverSync", "model", "session", "views", "proteinView", "getProteinView", "connectedMsaViewId", "msaView", "f", "disposers", "structureRowName", "seq", "findStructureRowName", "stripStopCodon", "setMousePos", "structure", "seqPos", "col", "structureSeqPos", "d", "ProteinToMsaHoverSync_default", "HighlightComponents", "model", "React", "ProteinToGenomeClickHighlight", "ProteinToGenomeHoverHighlight", "Protein1DToGenomeHoverHighlight_default", "GenomeTo1DProteinHoverHighlight_default", "GenomeMouseoverHighlight_default", "ProteinToMsaHoverSync_default", "HighlightComponents_default", "AddHighlightModelF", "pluginManager", "rest", "model", "React", "HighlightComponents_default", "import_AdapterType", "import_configuration", "AlphaFoldConfidenceAdapter", "configSchema_default", "AlphaFoldConfidenceAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "import_AdapterType", "import_configuration", "AlphaMissensePathogenicityAdapter", "configSchema_default", "AlphaMissensePathogenicityAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "import_util", "init_createSvgIcon", "import_jsx_runtime", "Add_default", "_jsx", "import_react", "import_ui", "import_util", "import_material", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "import_react", "import_material", "import_react", "import_util", "import_material", "import_mui", "import_react", "import_material", "import_mui", "useStyles", "Checkbox2", "checked", "disabled", "label", "onChange", "classes", "React", "init_util", "useStyles", "MSATable", "structureName", "structureSequence", "isoformSequences", "classes", "showInFastaFormat", "setShowInFastaFormat", "removedStars", "key", "val", "stripStopCodon", "exactMatchIsoformAndStructureSeq", "_", "sname", "maxKeyLen", "getTranscriptDisplayName", "React", "Checkbox2", "event", "feature", "seq", "k", "f", "IsoformSequencesToggle", "structureSequence", "structureName", "isoformSequences", "show", "setShow", "React", "MSATable", "import_react", "init_createSvgIcon", "import_jsx_runtime", "OpenInNew_default", "_jsx", "import_material", "ExternalLink", "props", "children", "rest", "React", "OpenInNew_default", "init_util", "NotFound", "uniprotId", "React", "ExternalLink", "AlphaFoldDBSearchStatus", "selectedTranscript", "structureSequence", "isoformSequences", "url", "IsoformSequencesToggle", "getTranscriptDisplayName", "import_react", "import_material", "init_util", "getIdLabel", "id", "dbType", "getDatabaseTypeForId", "IdentifierSelector", "recognizedIds", "geneName", "selectedId", "onSelectedIdChange", "expanded", "setExpanded", "options", "React", "e", "opt", "import_react", "import_ui", "init_createSvgIcon", "import_jsx_runtime", "ArrowDropDown_default", "_jsx", "init_createSvgIcon", "import_jsx_runtime", "Settings_default", "_jsx", "import_material", "import_react", "import_material", "LaunchOptionsDialog", "open", "onClose", "options", "React", "opt", "import_react", "import_material", "init_sideBySide", "LaunchSettingsDialog", "open", "onClose", "sideBySide", "setSideBySide", "getLaunchSideBySide", "React", "_", "checked", "setLaunchSideBySide", "import_react", "import_material", "import_react", "import_material", "init_esm", "ALIGNMENT_ALGORITHMS", "DEFAULT_ALIGNMENT_ALGORITHM", "ALIGNMENT_ALGORITHM_VALUES", "coerceAlignmentAlgorithm", "value", "v", "ALIGNMENT_ALGORITHM_LABELS", "AlignmentSettingsButton", "value", "onChange", "onManualAlignment", "open", "setOpen", "tabValue", "setTabValue", "tempAlgorithm", "setTempAlgorithm", "manualAlignment", "setManualAlignment", "parseError", "setParseError", "handleOpen", "handleSave", "parsed", "parsePairwise", "e", "handleCancel", "React", "Settings_default", "_", "val", "event", "ALIGNMENT_ALGORITHMS", "SequenceMismatchNotice", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "React", "ALIGNMENT_ALGORITHM_LABELS", "AlignmentSettingsButton", "safeLaunch", "fn", "onSuccess", "onError", "e", "getLaunchMissingReasons", "uniprotId", "userSelectedProteinSequence", "selectedTranscript", "isLoading", "error", "s", "init_launchViewUtils", "ProteinViewActions", "handleClose", "uniprotId", "userSelectedProteinSequence", "selectedTranscript", "url", "confidenceUrl", "feature", "view", "session", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "sequencesMatch", "isLoading", "error", "dialogOpen", "setDialogOpen", "settingsOpen", "setSettingsOpen", "launchError", "setLaunchError", "canLaunch", "missingReasons", "getLaunchMissingReasons", "closeMenu", "baseParams", "launch3DParams", "runLaunch", "fn", "safeLaunch", "handleLaunch3DView", "launch3DProteinView", "handleLaunch1DView", "launch1DProteinView", "handleLaunchMsa", "launchMsaView", "handleLaunch3DWithMsa", "launch3DProteinViewWithMsa", "launchOptions", "hasMsaViewPlugin", "React", "SequenceMismatchNotice", "Settings_default", "ArrowDropDown_default", "LaunchOptionsDialog", "LaunchSettingsDialog", "import_react", "import_material", "SequenceSearchStatus", "isLoading", "uniprotId", "url", "hasProteinSequence", "sequenceSearchType", "React", "import_react", "import_material", "init_util", "TranscriptSelector", "val", "setVal", "isoforms", "isoformSequences", "structureSequence", "feature", "disabled", "geneName", "getGeneDisplayName", "matches", "nonMatches", "noData", "f", "entry", "stripStopCodon", "byLengthDesc", "a", "b", "React", "event", "getTranscriptDisplayName", "import_react", "import_material", "UniProtIdInput", "lookupMode", "onLookupModeChange", "manualUniprotId", "onManualUniprotIdChange", "featureUniprotId", "hasProteinSequence", "sequenceSearchType", "onSequenceSearchTypeChange", "endContent", "React", "event", "e", "ExternalLink", "import_react", "import_material", "import_mui", "useStyles", "UniProtResultsTable", "entries", "selectedAccession", "onSelect", "classes", "cx", "React", "entry", "ExternalLink", "import_react", "init_index", "STATIC_SWR_OPTIONS", "applyStructurePreset", "plugin", "trajectory", "options", "model", "addStructureFromData", "data", "format", "options", "plugin", "_data", "trajectory", "applyStructurePreset", "addStructureFromURL", "url", "format", "isBinary", "options", "plugin", "data", "trajectory", "applyStructurePreset", "extractStructureSequences", "model", "s", "init_loadMolstar", "withTemporaryMolstarPlugin", "callback", "createPluginUI", "renderReact18", "loadMolstar", "ret", "plugin", "detectStructureFormat", "fileName", "dot", "ext", "fetchSequences", "file", "url", "withTemporaryMolstarPlugin", "plugin", "model", "addStructureFromData", "addStructureFromURL", "extractStructureSequences", "useStructureFileSequence", "key", "data", "error", "isLoading", "isValidating", "useSWR", "seq", "STATIC_SWR_OPTIONS", "init_launchViewUtils", "useAlphaFoldData", "uniprotId", "url", "getAlphaFoldStructureUrl", "confidenceUrl", "getAlphaFoldConfidenceUrl", "sequences", "isLoading", "isValidating", "error", "useStructureFileSequence", "import_react", "init_index", "myfetch", "url", "args", "response", "jsonfetch", "abortError", "signal", "timeout", "time", "resolve", "reject", "id", "safeAdd", "x", "y", "lsw", "bitRotateLeft", "num", "cnt", "md5cmn", "q", "a", "b", "s", "t", "md5ff", "c", "d", "md5gg", "md5hh", "md5ii", "binlMd5", "len", "i", "olda", "oldb", "oldc", "oldd", "binl2hex", "binarray", "hexTab", "str", "str2binl", "bin", "md5", "init_util", "useAlphaFoldSequenceSearch", "sequence", "searchType", "enabled", "searchValue", "cleanSeq", "stripStopCodon", "md5", "data", "error", "isLoading", "isValidating", "useSWR", "jsonfetch", "STATIC_SWR_OPTIONS", "import_react", "useDebouncedValue", "value", "delayMs", "debounced", "setDebounced", "t", "import_util", "init_index", "import_configuration", "import_util", "stitch", "subfeats", "sequence", "sub", "calculateProteinSequence", "cds", "codonTable", "str", "protein", "revlist", "list", "seqlen", "a", "b", "getItemId", "feat", "dedupe", "item", "pos", "ary", "getProteinSequence", "feature", "seq", "featureStart", "strand", "subfeatures", "f", "fetchProteinSeq", "session", "assemblyName", "start", "end", "refName", "assemblyManager", "rpcManager", "assembly", "sessionId", "feats", "init_util", "useIsoformProteinSequences", "feature", "view", "data", "error", "isLoading", "useSWR", "transcripts", "getTranscriptFeatures", "errors", "entries", "f", "seq", "fetchProteinSeq", "e", "r", "STATIC_SWR_OPTIONS", "import_react", "init_util", "useTranscriptSelection", "options", "isoformSequences", "structureSequence", "resetKey", "userSelection", "setUserSelection", "prevResetKey", "setPrevResetKey", "autoSelection", "selectBestTranscript", "init_util", "useTranscriptIsoformSelection", "feature", "view", "structureSequence", "resetKey", "transcripts", "getTranscriptFeatures", "isoformSequences", "isLoading", "error", "useIsoformProteinSequences", "userSelection", "setUserSelection", "useTranscriptSelection", "selectedTranscript", "f", "getId", "selectedIsoform", "init_index", "init_util", "UNIPROT_FIELDS", "mapApiResultToEntry", "result", "buildXrefQuery", "id", "getDatabaseTypeForId", "searchUniProt", "query", "size", "url", "jsonfetch", "searchByXref", "e", "deduplicateEntries", "entries", "seen", "entry", "searchUniProtEntries", "recognizedIds", "geneId", "geneName", "organismId", "idsToSearch", "strippedGeneId", "stripTrailingVersion", "isRecognizedDatabaseId", "xrefResults", "r", "xrefErrors", "geneNameError", "geneNameResults", "attempted", "failed", "a", "b", "init_util", "useUniProtSearch", "recognizedIds", "geneId", "geneName", "selectedQueryId", "enabled", "idsToSearch", "geneNameToSearch", "isRecognizedDatabaseId", "hasValidId", "id", "data", "error", "isLoading", "useSWR", "searchUniProtEntries", "STATIC_SWR_OPTIONS", "getSearchDescription", "selectedQueryId", "recognizedIds", "geneName", "joinWord", "init_util", "useAlphaFoldDBSearch", "feature", "view", "lookupMode", "setLookupMode", "manualUniprotId", "setManualUniprotId", "geneIds", "extractFeatureIdentifiers", "selectedQueryId", "setSelectedQueryId", "sequenceSearchType", "setSequenceSearchType", "selectedUniprotId", "setSelectedUniprotId", "featureUniprotId", "effectiveLookupMode", "isSequenceMode", "isAutoMode", "uniprotEntries", "isLookupLoading", "lookupError", "useUniProtSearch", "debouncedManualUniprotId", "useDebouncedValue", "autoUniprotId", "uniprotId", "isAlphaFoldLoading", "isAlphaFoldValidating", "alphaFoldError", "alphaFoldUrl", "alphaFoldConfidenceUrl", "alphaFoldStructureSequence", "useAlphaFoldData", "transcriptOptions", "isoformSequences", "isIsoformLoading", "isoformError", "effectiveTranscriptId", "setUserSelection", "selectedTranscript", "userSelectedProteinSequence", "useTranscriptIsoformSelection", "seqSearchUniprotId", "seqSearchUrl", "seqSearchConfidenceUrl", "seqSearchStructureSequence", "isSequenceSearchLoading", "isSequenceSearchValidating", "sequenceSearchError", "useAlphaFoldSequenceSearch", "finalUrl", "finalConfidenceUrl", "finalStructureSequence", "finalUniprotId", "isStructureValidating", "loadingStatuses", "s", "isLoading", "error", "stripStopCodon", "getSearchDescription", "useStyles", "AlphaFoldDBSearch", "feature", "session", "view", "handleClose", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "classes", "state", "useAlphaFoldDBSearch", "React", "UniProtIdInput", "IdentifierSelector", "status", "UniProtResultsTable", "ExternalLink", "TranscriptSelector", "SequenceSearchStatus", "AlphaFoldDBSearchStatus", "ProteinViewActions", "AlphaFoldDBSearch_default", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "import_mui", "FOLDSEEK_DATABASES", "DEFAULT_DATABASES", "predict3Di", "aaSequence", "signal", "cleanSequence", "line", "response", "cleanDi3", "submitFoldseekSearch", "di3Sequence", "databases", "fastaContent", "params", "db", "text", "pollFoldseekStatus", "ticketId", "result", "getFoldseekResults", "jsonfetch", "waitForFoldseekResults", "onStatusChange", "attempts", "status", "apiResponse", "r", "timeout", "useStyles", "FoldseekDatabaseSelector", "selected", "onChange", "disabled", "classes", "React", "FOLDSEEK_DATABASES", "db", "id", "import_react", "import_material", "import_mui", "import_react", "import_ui", "import_material", "AA_3LETTER", "padLeft", "str", "len", "padRight", "formatCoord", "val", "caCoordsToPdb", "tCa", "tSeq", "chainId", "title", "coords", "lines", "atomNum", "resNum", "i", "x", "y", "z", "aa", "resName", "line", "hasValidCaCoords", "init_launchViewUtils", "FoldseekActionMenu", "hit", "session", "view", "feature", "selectedTranscript", "userProvidedTranscriptSequence", "onClose", "anchorEl", "setAnchorEl", "launchError", "setLaunchError", "open", "uniprotId", "getUniprotIdFromAlphaFoldTarget", "handleClick", "event", "handleMenuClose", "baseParams", "runLaunch", "fn", "safeLaunch", "handleLaunch3D", "pdbData", "hasValidCaCoords", "caCoordsToPdb", "launch3DProteinView", "handleLaunch1D", "launch1DProteinView", "getConfidenceUrlFromTarget", "handleLaunchMSA", "launchMsaView", "React", "hasMsaViewPlugin", "init_launchViewUtils", "useStyles", "flattenResults", "results", "hits", "dbResult", "alignment", "getStructureUrlFromTarget", "a", "b", "FoldseekResultsTable", "session", "view", "feature", "selectedTranscript", "userProvidedTranscriptSequence", "onClose", "classes", "flatHits", "React", "hit", "idx", "FoldseekActionMenu", "import_react", "useFoldseekSearch", "results", "setResults", "predictData", "setPredictData", "isLoading", "setIsLoading", "isPredicting", "setIsPredicting", "error", "setError", "statusMessage", "setStatusMessage", "abortRef", "startOperation", "controller", "predictStructure", "aaSequence", "signal", "result", "predict3Di", "e", "search", "aaSeq", "di3Seq", "databases", "DEFAULT_DATABASES", "ticket", "submitFoldseekSearch", "waitForFoldseekResults", "reset", "init_util", "useStyles", "FoldseekSearch", "feature", "session", "view", "handleClose", "classes", "userEditedSequence", "setUserEditedSequence", "selectedDatabases", "setSelectedDatabases", "DEFAULT_DATABASES", "results", "cleanedAaSequence", "di3Sequence", "isLoading", "isPredicting", "error", "statusMessage", "predictStructure", "search", "reset", "useFoldseekSearch", "transcripts", "isoformSequences", "isLoadingIsoforms", "isoformError", "effectiveSelectedTranscriptId", "setUserSelection", "selectedTranscript", "selectedIsoformData", "useTranscriptIsoformSelection", "cleanedSequence", "stripStopCodon", "sequence", "setUserSelectionWithReset", "id", "canPredict", "canSearch", "combinedError", "isBusy", "React", "TranscriptSelector", "e", "FoldseekDatabaseSelector", "FoldseekResultsTable", "FoldseekSearch_default", "import_react", "init_Help", "import_material", "HelpDialog", "HelpButton", "show", "setShow", "React", "Help_default", "import_react", "TabPanel", "children", "value", "index", "other", "React", "import_react", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_react", "import_material", "init_launchViewUtils", "StructureSourcePicker", "choice", "setChoice", "structureURL", "setStructureURL", "setFile", "pdbId", "setPdbId", "React", "HelpButton", "event", "target", "f", "s", "getPdbStructureUrl", "init_launchViewUtils", "init_util", "useStyles", "theme", "HelpText", "React", "ExternalLink", "UserProvidedStructure", "feature", "session", "view", "handleClose", "alignmentAlgorithm", "onAlignmentAlgorithmChange", "classes", "file", "setFile", "pdbId", "setPdbId", "choice", "setChoice", "submitError", "setSubmitError", "structureURL", "setStructureURL", "activeFile", "activeURL", "structureSequences", "fileError", "useStructureFileSequence", "structureName", "structureSequence", "options", "isoformSequences", "userSelection", "setUserSelection", "selectedTranscript", "protein", "isoformError", "useTranscriptIsoformSelection", "error", "canLaunch", "sequencesDiffer", "stripStopCodon", "handleLaunch", "structureData", "launch3DProteinView", "getGeneDisplayName", "getTranscriptDisplayName", "e", "StructureSourcePicker", "TranscriptSelector", "IsoformSequencesToggle", "SequenceMismatchNotice", "UserProvidedStructure_default", "import_react", "useLocalStorage", "key", "defaultValue", "value", "setValue", "stored", "setValueAndStore", "newValue", "LaunchProteinViewDialog", "handleClose", "feature", "model", "choice", "setChoice", "alignmentAlgorithm", "setAlignmentAlgorithm", "useLocalStorage", "DEFAULT_ALIGNMENT_ALGORITHM", "session", "view", "React", "HelpButton", "_", "val", "TabPanel", "AlphaFoldDBSearch_default", "FoldseekSearch_default", "UserProvidedStructure_default", "isDisplay", "elt", "extendStateModel", "stateModel", "self", "superContextMenuItems", "feature", "showProteinMenuItem", "Add_default", "track", "handleClose", "LaunchProteinViewDialog", "LaunchProteinViewF", "pluginManager", "import_configuration", "import_util", "init_launchViewUtils", "init_util", "getTrackId", "track", "trackId", "transcriptMatches", "transcript", "transcriptId", "target", "stripTrailingVersion", "candidate", "resolveShortLaunch", "session", "uniprotId", "connectedView", "assemblyName", "loc", "trackSpecs", "assembly", "parsed", "refName", "region", "trackIds", "t", "tracksById", "sessionId", "transcripts", "trackConf", "feats", "feat", "getTranscriptFeatures", "sub", "userProvidedTranscriptSequence", "fetchProteinSeq", "getAlphaFoldStructureUrl", "init_sideBySide", "LaunchProteinViewExtensionPointF", "pluginManager", "session", "url", "uniprotId", "transcriptId", "userProvidedTranscriptSequence", "feature", "connectedViewId", "connectedView", "alignmentAlgorithm", "displayName", "height", "showControls", "showHighlight", "zoomToBaseLevel", "sideBySide", "resolved", "resolveShortLaunch", "e", "finalUrl", "ownsConnectedView", "resolvedConnectedViewId", "proteinView", "getLaunchSideBySide", "launchViewSideBySide", "import_react", "import_pluggableElementTypes", "import_pluggableElementTypes", "import_mst", "import_mobx_state_tree", "init_createSvgIcon", "import_jsx_runtime", "Visibility_default", "_jsx", "import_mobx", "init_applyColorTheme", "extractPerResidueConfidence", "model", "maxLength", "data", "B_iso_or_equiv", "offsets", "count", "n", "values", "i", "looksLikePlddt", "v", "loadStructureData", "structure", "plugin", "model", "addStructureFromData", "addStructureFromURL", "sequences", "extractStructureSequences", "confidence", "extractPerResidueConfidence", "import_mobx_state_tree", "makeStructureLoader", "host", "loadingStructures", "loadInto", "structure", "plugin", "loadStructureData", "data", "current", "e", "structures", "molstarPluginContext", "import_util", "import_mobx_state_tree", "import_mobx", "init_applyLociInteractivity", "init_constants", "init_mappings", "init_util", "structurePos", "n", "alignmentCol", "n", "makeCoordinateMapper", "pairwiseAlignment", "structureSeqToTranscriptSeqPosition", "transcriptSeqToStructureSeqPosition", "structureSeqVsTranscriptSeqMap", "s2aln", "structurePositionToAlignmentMap", "t2aln", "transcriptPositionToAlignmentMap", "aln2s", "invertMap", "aln2t", "p", "c", "init_highlightResidueRange", "AMINO_ACIDS", "BLOSUM62_RAW", "BLOSUM62", "i", "row", "j", "getScore", "a", "b", "GAP_OPEN", "GAP_EXTEND", "needlemanWunsch", "seq1", "seq2", "gapOpen", "gapExtend", "m", "n", "M", "Ix", "Iy", "matchScore", "alignedSeq1", "alignedSeq2", "finalScores", "score", "currentMatrix", "prevM", "prevIx", "smithWaterman", "bestScore", "bestI", "bestJ", "cellMax", "k", "buildConsensus", "chars", "runLocalAlignment", "algorithm", "proteinAbbreviationMapping", "r", "init_proteinToGenomeMapping", "init_residueTracks", "init_loadMolstar", "extractLocationInfo", "molstar", "location", "subscribeMolstarInteraction", "plugin", "kind", "onUpdate", "loadMolstar", "subscription", "e", "loc", "init_util", "init_launchViewUtils", "init_mappings", "Structure", "self", "data", "type", "newSet", "val", "views", "f", "range", "uniqueId", "arg", "structureSeqPos", "r", "url", "getUniprotIdFromAlphaFoldTarget", "makeCoordinateMapper", "c", "looksLikePlddt", "mapResidueValuesToColumns", "seq", "kyteDoolittleScores", "stripStopCodon", "structureLetter", "genomeLetter", "parts", "genomeToTranscriptSeqMapping", "pos", "structurePos", "alignmentHoverRange", "a2s", "start", "end", "s2a", "assemblyName", "mapping", "model", "mapped", "proteinRangeToGenomeMapping", "proteinToGenomeMapping", "code", "proteinAbbreviationMapping", "transcriptPos", "con", "matchSet", "i", "r1", "r2", "coerceAlignmentAlgorithm", "idx", "e", "alignmentPos", "alignmentCol", "clickProteinToGenome", "userProvidedTranscriptSequence", "structureSequences", "exactMatch", "alignmentAlgorithm", "seq1", "seq2", "pairwiseAlignment", "runLocalAlignment", "hovered", "transcriptSeqToStructureSeqPosition", "connectedView", "checkHovered", "hoverPosition", "c0", "molstarPluginContext", "dispose", "subscribeMolstarInteraction", "info", "showHighlight", "structureSeqToTranscriptSeqPosition", "molstarStructure", "residues", "coord", "applyLociInteractivityMultiple", "hoverStructureRange", "structureSeqHoverPos", "highlightResidueRange", "applyLociInteractivitySingle", "structureModel_default", "init_loadMolstar", "SuperpositionTag", "superposeStructures", "plugin", "QueryContext", "StructureElement", "StructureSelection", "StructureSelectionQueries", "PluginCommands", "PluginStateObject", "tmAlign", "loadMolstar", "structures", "query", "validLocis", "s", "structure", "parent", "rootStructure", "q", "loci", "l", "coordinateSystem", "i", "result", "bTransform", "tmScoreA", "tmScoreB", "rmsd", "alignedLength", "applyTransform", "res", "matrix", "Mat4", "StateObjectRef", "StateTransforms", "r", "o", "params", "b", "SETTINGS_KEY", "PERSISTED_SETTINGS", "stateModelFactory", "structureModel_default", "COLOR_SCHEME_VALUES", "DEFAULT_ALIGNMENT_ALGORITHM", "self", "n", "f", "arg", "e", "algorithm", "scheme", "p", "structure", "val", "id", "molstarPluginContext", "newStructure", "loadStructureData", "superposeStructures", "stored", "settings", "key", "init", "structures", "showControls", "showAlignment", "colorScheme", "readyCount", "s", "applyColorTheme", "makeStructureLoader", "Visibility_default", "COLOR_SCHEMES", "Settings_default", "model_default", "ReactComponent", "ProteinViewF", "pluginManager", "model_default", "import_AdapterType", "import_configuration", "UniProtVariationAdapter", "configSchema_default", "UniProtVariationAdapterF", "pluginManager", "AdapterType", "configSchema_default", "r", "version", "ProteinViewer", "Plugin", "version", "pluginManager", "ProteinViewF", "LaunchProteinViewF", "LaunchProteinViewExtensionPointF", "AddHighlightModelF", "AlphaFoldConfidenceAdapterF", "AlphaMissensePathogenicityAdapterF", "UniProtVariationAdapterF", "_pluginManager"]
|
|
7
7
|
}
|