From 2557174452f32db1bb825b7f59d8aaef17bb9429 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 15:31:56 -0500 Subject: [PATCH 1/9] Fix circular view hydration errors --- .../src/BaseChordDisplay/models/renderReaction.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts index f6ddf0b281..d49f170182 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts +++ b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts @@ -1,6 +1,8 @@ import clone from 'clone' import { getRpcSessionId } from '@jbrowse/core/util/tracks' import { getSession, getContainingView } from '@jbrowse/core/util' + +// locals import { CircularViewModel } from '../../CircularView/models/model' export function renderReactionData(self: any) { @@ -51,16 +53,10 @@ export async function renderReactionEffect( return { message: 'Skipping render' } } - // check renderertype compatibility - if (!self.isCompatibleWithRenderer(rendererType)) { - throw new Error( - `renderer ${rendererType.name} is not compatible with this display type`, - ) - } - const { html, ...data } = await rendererType.renderInClient(rpcManager, { ...renderArgs, ...renderProps, + stopToken, exportSVG, }) From 1cc7392a8ae5848d8f18924aaf17e538e7a690dd Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 15:33:54 -0500 Subject: [PATCH 2/9] Remove compatible stuff with instanceof checks --- .../src/BaseChordDisplay/models/model.tsx | 23 ++++--------------- .../BaseChordDisplay/models/renderReaction.ts | 6 +---- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx index 942290e123..c2e7d0eae2 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx +++ b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx @@ -5,8 +5,6 @@ import { getParent, isAlive, types } from 'mobx-state-tree' // jbrowse import { ConfigurationReference, getConf } from '@jbrowse/core/configuration' import { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models' -import CircularChordRendererType from '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType' -import RendererType from '@jbrowse/core/pluggableElementTypes/renderers/RendererType' import { getContainingView, getSession, @@ -131,29 +129,17 @@ export const BaseChordDisplayModel = types return getEnv(self).pluginManager.getRendererType(self.rendererTypeName) }, - /** - * #method - */ - isCompatibleWithRenderer(renderer: RendererType) { - return !!(renderer instanceof CircularChordRendererType) - }, - /** * #getter - * returns a string feature ID if the globally-selected object - * is probably a feature + * returns a string feature ID if the globally-selected object is probably + * a feature */ get selectedFeatureId() { if (!isAlive(self)) { return undefined } - const session = getSession(self) - const { selection } = session - // does it quack like a feature? - if (isFeature(selection)) { - return selection.id() - } - return undefined + const { selection } = getSession(self) + return isFeature(selection) ? selection.id() : undefined }, })) .actions(self => ({ @@ -291,7 +277,6 @@ export const BaseChordDisplayModel = types theme: opts.theme || data.renderProps.theme, }, undefined, - self, ) return }, diff --git a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts index d49f170182..3dbb137efd 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts +++ b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts @@ -26,11 +26,7 @@ export function renderReactionData(self: any) { } } -export async function renderReactionEffect( - props: any, - stopToken: string | undefined, - self: any, -) { +export async function renderReactionEffect(props: any, stopToken?: string) { if (!props) { throw new Error('cannot render with no props') } From e7aa4c9b504e39aefb00b85350a7f64b788402e7 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 16:07:08 -0500 Subject: [PATCH 3/9] More stuff --- .../src/BaseChordDisplay/models/model.tsx | 84 ++++++++++++------- .../BaseChordDisplay/models/renderReaction.ts | 2 +- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx index c2e7d0eae2..802879222f 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx +++ b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx @@ -59,12 +59,33 @@ export const BaseChordDisplayModel = types .volatile(() => ({ // NOTE: all this volatile stuff has to be filled in at once // so that it stays consistent + /** + * #volatile + */ filled: false, + /** + * #volatile + */ reactElement: undefined as React.ReactElement | undefined, + /** + * #volatile + */ data: undefined, + /** + * #volatile + */ html: undefined as string | undefined, + /** + * #volatile + */ message: '', + /** + * #volatile + */ renderingComponent: undefined as undefined | AnyReactComponentType, + /** + * #volatile + */ refNameMap: undefined as Record | undefined, })) .actions(self => { @@ -165,11 +186,11 @@ export const BaseChordDisplayModel = types html, renderingComponent, }: { - message: string - data: any - html: string - reactElement: React.ReactElement - renderingComponent: AnyReactComponentType + message?: string + data?: any + html?: string + reactElement?: React.ReactElement + renderingComponent?: AnyReactComponentType }) { if (message) { self.filled = false @@ -216,12 +237,9 @@ export const BaseChordDisplayModel = types makeAbortableReaction( self, renderReactionData, - - // @ts-expect-error renderReactionEffect, { name: `${self.type} ${self.id} rendering`, - // delay: self.renderDelay || 300, fireImmediately: true, }, self.renderStarted, @@ -231,19 +249,26 @@ export const BaseChordDisplayModel = types makeAbortableReaction( self, - () => ({ - assemblyNames: getTrackAssemblyNames(self.parentTrack), - - adapter: getConf(getParent(self, 2), 'adapter'), - assemblyManager: getSession(self).assemblyManager, - }), - - async ({ assemblyNames, adapter, assemblyManager }: any, stopToken) => { - return assemblyManager.getRefNameMapForAdapter( - adapter, - assemblyNames[0], - { stopToken, sessionId: getRpcSessionId(self) }, - ) + () => + ({ + assemblyNames: getTrackAssemblyNames(self.parentTrack), + adapter: getConf(getParent(self, 2), 'adapter'), + assemblyManager: getSession(self).assemblyManager, + }) as const, + async (args, stopToken) => { + if (!args) { + return + } + return args + ? args.assemblyManager.getRefNameMapForAdapter( + args.adapter, + args.assemblyNames[0], + { + stopToken, + sessionId: getRpcSessionId(self), + }, + ) + : undefined }, { name: `${self.type} ${self.id} getting refNames`, @@ -251,7 +276,9 @@ export const BaseChordDisplayModel = types }, () => {}, refNameMap => { - self.setRefNameMap(refNameMap) + if (refNameMap) { + self.setRefNameMap(refNameMap) + } }, error => { console.error(error) @@ -270,14 +297,11 @@ export const BaseChordDisplayModel = types }, ) { const data = renderReactionData(self) - const rendering = await renderReactionEffect( - { - ...data, - exportSVG: opts, - theme: opts.theme || data.renderProps.theme, - }, - undefined, - ) + const rendering = await renderReactionEffect({ + ...data, + exportSVG: opts, + theme: opts.theme || data.renderProps.theme, + }) return }, })) diff --git a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts index 3dbb137efd..5d93ca2a8a 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts +++ b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts @@ -26,7 +26,7 @@ export function renderReactionData(self: any) { } } -export async function renderReactionEffect(props: any, stopToken?: string) { +export async function renderReactionEffect(props?: any, stopToken?: string) { if (!props) { throw new Error('cannot render with no props') } From d7b6acb4c79f24fbcf5d2ecd2afd0c3309343ba7 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 16:33:34 -0500 Subject: [PATCH 4/9] Misc --- .../models/serverSideRenderedBlock.ts | 54 ++++++------- .../IndexedFastaAdapter.ts | 81 +++++++++++-------- 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts b/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts index d8fb8e77f6..8cce078a1a 100644 --- a/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +++ b/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts @@ -17,7 +17,7 @@ import { makeAbortableReaction, Feature, } from '@jbrowse/core/util' -import { Region } from '@jbrowse/core/util/types/mst' +import { Region } from '@jbrowse/core/util/types' import { AbstractDisplayModel, isRetryException, @@ -49,7 +49,7 @@ const blockState = types /** * #property */ - region: Region, + region: types.frozen(), /** * #property */ @@ -64,6 +64,9 @@ const blockState = types isRightEndOfDisplayedRegion: false, }) .volatile(() => ({ + /** + * #volatile + */ stopToken: undefined as string | undefined, /** * #volatile @@ -283,8 +286,8 @@ export function renderBlockData( const renderProps = display.renderProps() const { config } = renderProps - // This line is to trigger the mobx reaction when the config changes - // It won't trigger the reaction if it doesn't think we're accessing it + // This line is to trigger the mobx reaction when the config changes It + // won't trigger the reaction if it doesn't think we're accessing it readConfObject(config) const sessionId = getRpcSessionId(display) @@ -304,7 +307,7 @@ export function renderBlockData( } }, assemblyName: self.region.assemblyName, - regions: [getSnapshot(self.region)], + regions: [self.region], adapterConfig, rendererType: rendererType.name, sessionId, @@ -337,33 +340,28 @@ async function renderBlockEffect( } = props if (!isAlive(self)) { return undefined - } - - if (displayError) { + } else if (displayError) { self.setError(displayError) return undefined - } - if (cannotBeRenderedReason) { + } else if (cannotBeRenderedReason) { self.setMessage(cannotBeRenderedReason) return undefined - } - - if (renderProps.notReady) { + } else if (renderProps.notReady) { return undefined - } - - const { reactElement, features, layout, maxHeightReached } = - await rendererType.renderInClient(rpcManager, { - ...renderArgs, - ...renderProps, - viewParams: getViewParams(self), - stopToken, - }) - return { - reactElement, - features, - layout, - maxHeightReached, - renderProps, + } else { + const { reactElement, features, layout, maxHeightReached } = + await rendererType.renderInClient(rpcManager, { + ...renderArgs, + ...renderProps, + viewParams: getViewParams(self), + stopToken, + }) + return { + reactElement, + features, + layout, + maxHeightReached, + renderProps, + } } } diff --git a/plugins/sequence/src/IndexedFastaAdapter/IndexedFastaAdapter.ts b/plugins/sequence/src/IndexedFastaAdapter/IndexedFastaAdapter.ts index 61cd1d9eef..1a103febeb 100644 --- a/plugins/sequence/src/IndexedFastaAdapter/IndexedFastaAdapter.ts +++ b/plugins/sequence/src/IndexedFastaAdapter/IndexedFastaAdapter.ts @@ -6,9 +6,10 @@ import { import { FileLocation, NoAssemblyRegion } from '@jbrowse/core/util/types' import { openLocation } from '@jbrowse/core/util/io' import { ObservableCreate } from '@jbrowse/core/util/rxjs' -import { SimpleFeature, Feature } from '@jbrowse/core/util' +import { SimpleFeature, Feature, updateStatus2 } from '@jbrowse/core/util' import AbortablePromiseCache from '@gmod/abortable-promise-cache' import QuickLRU from '@jbrowse/core/util/QuickLRU' +import { checkStopToken } from '@jbrowse/core/util/stopToken' interface T { refName: string @@ -75,40 +76,56 @@ export default class IndexedFastaAdapter extends BaseSequenceAdapter { return this.setupP } - public getFeatures(region: NoAssemblyRegion, _opts?: BaseOptions) { + public getFeatures(region: NoAssemblyRegion, opts?: BaseOptions) { + const { statusCallback = () => {}, stopToken } = opts || {} const { refName, start, end } = region return ObservableCreate(async observer => { - const { fasta } = await this.setup() - // TODO:ABORT - const size = await fasta.getSequenceSize(refName) - const regionEnd = Math.min(size, end) - const chunks = [] - const chunkSize = 128000 + await updateStatus2( + 'Downloading sequence', + statusCallback, + stopToken, + async () => { + const { fasta } = await this.setup() + // TODO:ABORT + const size = await fasta.getSequenceSize(refName) + const regionEnd = Math.min(size, end) + const chunks = [] + const chunkSize = 128000 + + const s = start - (start % chunkSize) + const e = end + (chunkSize - (end % chunkSize)) + for (let chunkStart = s; chunkStart < e; chunkStart += chunkSize) { + const r = { + refName, + start: chunkStart, + end: chunkStart + chunkSize, + } - const s = start - (start % chunkSize) - const e = end + (chunkSize - (end % chunkSize)) - for (let chunkStart = s; chunkStart < e; chunkStart += chunkSize) { - const r = { - refName, - start: chunkStart, - end: chunkStart + chunkSize, - } - // TODO:ABORT - chunks.push(this.seqCache.get(JSON.stringify(r), { ...r, fasta })) - } - const seq = (await Promise.all(chunks)) - .filter(f => !!f) - .join('') - .slice(start - s) - .slice(0, end - start) - if (seq) { - observer.next( - new SimpleFeature({ - id: `${refName} ${start}-${regionEnd}`, - data: { refName, start, end: regionEnd, seq }, - }), - ) - } + checkStopToken(stopToken) + chunks.push( + await this.seqCache.get(JSON.stringify(r), { ...r, fasta }), + ) + } + const seq = chunks + .filter(f => !!f) + .join('') + .slice(start - s) + .slice(0, end - start) + if (seq) { + observer.next( + new SimpleFeature({ + id: `${refName}-${start}-${regionEnd}`, + data: { + refName, + start, + end: regionEnd, + seq, + }, + }), + ) + } + }, + ) observer.complete() }) } From 4c595583fc132ac28e71945600422efaeb15107e Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 17:27:03 -0500 Subject: [PATCH 5/9] TwoBit refactor --- .../src/TwoBitAdapter/TwoBitAdapter.ts | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts b/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts index 57183f2542..bf47486e55 100644 --- a/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts +++ b/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts @@ -5,22 +5,15 @@ import { ObservableCreate } from '@jbrowse/core/util/rxjs' import SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature' import { TwoBitFile } from '@gmod/twobit' import { readConfObject } from '@jbrowse/core/configuration' -import { AnyConfigurationModel } from '@jbrowse/core/configuration' -import PluginManager from '@jbrowse/core/PluginManager' -import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache' export default class TwoBitAdapter extends BaseSequenceAdapter { - private twobit: TwoBitFile - - // the chromSizesData can be used to speed up loading since TwoBit has to do - // many range requests at startup to perform the getRegions request - protected chromSizesData: Promise | undefined> + protected setupP?: Promise<{ + twobit: TwoBitFile + chromSizesData: Record | undefined + }> private async initChromSizes() { const conf = readConfObject(this.config, 'chromSizesLocation') - // check against default and empty in case someone makes the field blank in - // config editor, may want better way to check "optional config slots" in - // future if (conf.uri !== '/path/to/default.chrom.sizes' && conf.uri !== '') { const file = openLocation(conf, this.pluginManager) const data = await file.readFile('utf8') @@ -30,49 +23,57 @@ export default class TwoBitAdapter extends BaseSequenceAdapter { .filter(line => !!line.trim()) .map(line => { const [name, length] = line.split('\t') - return [name!, +length!] + return [name!, +length!] as const }), ) } return undefined } - constructor( - config: AnyConfigurationModel, - getSubAdapter?: getSubAdapterType, - pluginManager?: PluginManager, - ) { - super(config, getSubAdapter, pluginManager) - const pm = this.pluginManager - this.chromSizesData = this.initChromSizes() - this.twobit = new TwoBitFile({ - filehandle: openLocation(this.getConf('twoBitLocation'), pm), - }) + async setupPre() { + return { + twobit: new TwoBitFile({ + filehandle: openLocation( + this.getConf('twoBitLocation'), + this.pluginManager, + ), + }), + chromSizesData: await this.initChromSizes(), + } + } + async setup() { + if (!this.setupP) { + this.setupP = this.setupPre().catch(e => { + this.setupP = undefined + throw e + }) + } + return this.setupP } public async getRefNames() { - const chromSizesData = await this.chromSizesData - if (chromSizesData) { - return Object.keys(chromSizesData) - } - return this.twobit.getSequenceNames() + const { chromSizesData, twobit } = await this.setup() + return chromSizesData + ? Object.keys(chromSizesData) + : twobit.getSequenceNames() } - public async getRegions(): Promise { - const chromSizesData = await this.chromSizesData + public async getRegions() { + const { chromSizesData, twobit } = await this.setup() if (chromSizesData) { return Object.keys(chromSizesData).map(refName => ({ refName, start: 0, end: chromSizesData[refName]!, })) + } else { + const refSizes = await twobit.getSequenceSizes() + return Object.keys(refSizes).map(refName => ({ + refName, + start: 0, + end: refSizes[refName]!, + })) } - const refSizes = await this.twobit.getSequenceSizes() - return Object.keys(refSizes).map(refName => ({ - refName, - start: 0, - end: refSizes[refName]!, - })) } /** @@ -82,9 +83,10 @@ export default class TwoBitAdapter extends BaseSequenceAdapter { */ public getFeatures({ refName, start, end }: NoAssemblyRegion) { return ObservableCreate(async observer => { - const size = await this.twobit.getSequenceSize(refName) + const { twobit } = await this.setup() + const size = await twobit.getSequenceSize(refName) const regionEnd = size !== undefined ? Math.min(size, end) : end - const seq = await this.twobit.getSequence(refName, start, regionEnd) + const seq = await twobit.getSequence(refName, start, regionEnd) if (seq) { observer.next( new SimpleFeature({ @@ -98,9 +100,8 @@ export default class TwoBitAdapter extends BaseSequenceAdapter { } /** - * called to provide a hint that data tied to a certain region - * will not be needed for the foreseeable future and can be purged - * from caches, etc + * called to provide a hint that data tied to a certain region will not be + * needed for the foreseeable future and can be purged from caches, etc */ public freeResources(/* { region } */): void {} } From 18babc1204d388b6f5027453f56c5f61ef5ce15b Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 17:35:10 -0500 Subject: [PATCH 6/9] Misc --- .../src/XYPlotRenderer/XYPlotRenderer.ts | 3 +- plugins/wiggle/src/drawXY.ts | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/plugins/wiggle/src/XYPlotRenderer/XYPlotRenderer.ts b/plugins/wiggle/src/XYPlotRenderer/XYPlotRenderer.ts index 8ec029c1db..5ccaed3c75 100644 --- a/plugins/wiggle/src/XYPlotRenderer/XYPlotRenderer.ts +++ b/plugins/wiggle/src/XYPlotRenderer/XYPlotRenderer.ts @@ -11,7 +11,7 @@ export default class XYPlotRenderer extends WiggleBaseRenderer { ctx: CanvasRenderingContext2D, props: RenderArgsDeserializedWithFeatures, ) { - const { features, config } = props + const { stopToken, features, config } = props // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the // wiggle display, and makes the height of the actual drawn area add @@ -30,6 +30,7 @@ export default class XYPlotRenderer extends WiggleBaseRenderer { readConfObject(config, 'color', { feature }), offset: YSCALEBAR_LABEL_OFFSET, features: [...features.values()], + stopToken, }) } } diff --git a/plugins/wiggle/src/drawXY.ts b/plugins/wiggle/src/drawXY.ts index 0aab2f680f..d3fef4ba3d 100644 --- a/plugins/wiggle/src/drawXY.ts +++ b/plugins/wiggle/src/drawXY.ts @@ -11,6 +11,7 @@ import { clamp, featureSpanPx, Feature, Region } from '@jbrowse/core/util' // locals import { fillRectCtx, getOrigin, getScale, ScaleOpts } from './util' +import { checkStopToken } from '@jbrowse/core/util/stopToken' function lighten(color: Colord, amount: number) { const hslColor = color.toHsl() @@ -30,6 +31,7 @@ const clipHeight = 2 export function drawXY( ctx: CanvasRenderingContext2D, props: { + stopToken?: string features: Map | Feature[] bpPerPx: number regions: Region[] @@ -83,13 +85,20 @@ export function drawXY( const reducedFeatures = [] const crossingOrigin = niceMin < pivotValue && niceMax > pivotValue + let start = performance.now() + // we handle whiskers separately to render max row, min row, and avg in three // passes. this reduces subpixel rendering issues. note: for stylistic // reasons, clipping indicator is only drawn for score, not min/max score if (summaryScoreMode === 'whiskers') { let lastCol: string | undefined let lastMix: string | undefined + start = performance.now() for (const feature of features.values()) { + if (performance.now() - start > 400) { + checkStopToken() + start = performance.now() + } const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx) if (feature.get('summary')) { const w = Math.max(rightPx - leftPx + fudgeFactor, minSize) @@ -106,7 +115,12 @@ export function drawXY( } lastMix = undefined lastCol = undefined + start = performance.now() for (const feature of features.values()) { + if (performance.now() - start > 400) { + checkStopToken() + start = performance.now() + } const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx) const score = feature.get('score') const max = feature.get('maxScore') @@ -133,7 +147,12 @@ export function drawXY( } lastMix = undefined lastCol = undefined + start = performance.now() for (const feature of features.values()) { + if (performance.now() - start > 400) { + checkStopToken() + start = performance.now() + } const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx) if (feature.get('summary')) { @@ -151,7 +170,12 @@ export function drawXY( } } } else { + start = performance.now() for (const feature of features.values()) { + if (performance.now() - start > 400) { + checkStopToken() + start = performance.now() + } const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx) // create reduced features, avoiding multiple features per px @@ -183,7 +207,12 @@ export function drawXY( ctx.save() if (hasClipping) { ctx.fillStyle = clipColor + start = performance.now() for (const feature of features.values()) { + if (performance.now() - start > 400) { + checkStopToken() + start = performance.now() + } const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx) const w = rightPx - leftPx + fudgeFactor const score = feature.get('score') From 916bc11a0e6ffde10ab075e6bc09cb4a9759eb9a Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 17:47:38 -0500 Subject: [PATCH 7/9] Better autorun abort --- .../src/GCContentAdapter/GCContentAdapter.ts | 94 +++++++++++-------- .../wiggle/src/getQuantitativeStatsAutorun.ts | 6 +- .../wiggle/src/shared/SharedWiggleMixin.ts | 8 +- 3 files changed, 65 insertions(+), 43 deletions(-) diff --git a/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts b/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts index ffcee6b34c..9d09f34791 100644 --- a/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts +++ b/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts @@ -4,8 +4,14 @@ import { } from '@jbrowse/core/data_adapters/BaseAdapter' import { firstValueFrom } from 'rxjs' import { ObservableCreate } from '@jbrowse/core/util/rxjs' -import { SimpleFeature, Feature, Region } from '@jbrowse/core/util' +import { + SimpleFeature, + Feature, + Region, + updateStatus, +} from '@jbrowse/core/util' import { toArray } from 'rxjs/operators' +import { checkStopToken } from '@jbrowse/core/util/stopToken' export default class GCContentAdapter extends BaseFeatureDataAdapter { private gcMode = 'content' @@ -26,6 +32,7 @@ export default class GCContentAdapter extends BaseFeatureDataAdapter { } public getFeatures(query: Region, opts: BaseOptions) { + const { statusCallback = () => {}, stopToken } = opts || {} return ObservableCreate(async observer => { const sequenceAdapter = await this.configure() const windowSize = this.getConf('windowSize') @@ -42,50 +49,61 @@ export default class GCContentAdapter extends BaseFeatureDataAdapter { return } - const ret = sequenceAdapter.getFeatures( - { - ...query, - start: queryStart, - end: queryEnd, - }, - opts, + const feats = await firstValueFrom( + sequenceAdapter + .getFeatures( + { + ...query, + start: queryStart, + end: queryEnd, + }, + opts, + ) + .pipe(toArray()), ) - const feats = await firstValueFrom(ret.pipe(toArray())) const residues = feats[0]?.get('seq') || '' - for (let i = hw; i < residues.length - hw; i += windowDelta) { - const r = f ? residues[i] : residues.slice(i - hw, i + hw) - let nc = 0 - let ng = 0 - let len = 0 - for (const letter of r) { - if (letter === 'c' || letter === 'C') { - nc++ - } else if (letter === 'g' || letter === 'G') { - ng++ + let start = performance.now() + await updateStatus('Calculating GC', statusCallback, () => { + for (let i = hw; i < residues.length - hw; i += windowDelta) { + if (performance.now() - start > 400) { + checkStopToken(stopToken) + start = performance.now() } - if (letter !== 'N') { - len++ + const r = f ? residues[i] : residues.slice(i - hw, i + hw) + let nc = 0 + let ng = 0 + let len = 0 + for (const letter of r) { + if (letter === 'c' || letter === 'C') { + nc++ + } else if (letter === 'g' || letter === 'G') { + ng++ + } + if (letter !== 'N') { + len++ + } } + const pos = queryStart + const score = + this.gcMode === 'content' + ? (ng + nc) / (len || 1) + : this.gcMode === 'skew' + ? (ng - nc) / (ng + nc || 1) + : 0 + + observer.next( + new SimpleFeature({ + uniqueId: `${this.id}_${pos + i}`, + refName: query.refName, + start: pos + i, + end: pos + i + windowDelta, + score, + }), + ) } - const pos = queryStart - const score = - this.gcMode === 'content' - ? (ng + nc) / (len || 1) - : this.gcMode === 'skew' - ? (ng - nc) / (ng + nc || 1) - : 0 + }) - observer.next( - new SimpleFeature({ - uniqueId: `${this.id}_${pos + i}`, - refName: query.refName, - start: pos + i, - end: pos + i + windowDelta, - score, - }), - ) - } observer.complete() }) } diff --git a/plugins/wiggle/src/getQuantitativeStatsAutorun.ts b/plugins/wiggle/src/getQuantitativeStatsAutorun.ts index 83f6f5cd9a..abe0924f05 100644 --- a/plugins/wiggle/src/getQuantitativeStatsAutorun.ts +++ b/plugins/wiggle/src/getQuantitativeStatsAutorun.ts @@ -1,7 +1,7 @@ import { autorun } from 'mobx' import { addDisposer, isAlive } from 'mobx-state-tree' // jbrowse -import { getContainingView } from '@jbrowse/core/util' +import { getContainingView, isAbortException } from '@jbrowse/core/util' import { QuantitativeStats } from '@jbrowse/core/util/stats' import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' import { AnyConfigurationModel } from '@jbrowse/core/configuration' @@ -44,8 +44,8 @@ export function getQuantitativeStatsAutorun(self: { } } } catch (e) { - console.error(e) - if (isAlive(self)) { + if (isAlive(self) && !isAbortException(e)) { + console.error(e) self.setError(e) } } diff --git a/plugins/wiggle/src/shared/SharedWiggleMixin.ts b/plugins/wiggle/src/shared/SharedWiggleMixin.ts index 896e367c9a..bfe2f20d2e 100644 --- a/plugins/wiggle/src/shared/SharedWiggleMixin.ts +++ b/plugins/wiggle/src/shared/SharedWiggleMixin.ts @@ -16,6 +16,7 @@ import { types } from 'mobx-state-tree' // locals import { getNiceDomain } from '../util' import { lazy } from 'react' +import { stopStopToken } from '@jbrowse/core/util/stopToken' // lazies const SetMinMaxDialog = lazy(() => import('./SetMinMaxDialog')) @@ -155,8 +156,11 @@ export default function SharedWiggleMixin( /** * #action */ - setStatsLoading() { - /* do nothing */ + setStatsLoading(arg?: string) { + if (self.statsFetchInProgress) { + stopStopToken(self.statsFetchInProgress) + } + self.statsFetchInProgress = arg }, /** From 7db2a1c056601ed5644d9d2da2f381a4d1bae89d Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 17:55:31 -0500 Subject: [PATCH 8/9] Misc --- .../src/BaseChordDisplay/models/model.tsx | 10 ++++------ .../BaseChordDisplay/models/renderReaction.ts | 1 + .../src/GCContentAdapter/GCContentAdapter.ts | 6 +++--- .../models/serverSideRenderedBlock.ts | 9 +-------- .../sequence/src/TwoBitAdapter/TwoBitAdapter.ts | 2 +- .../src/MultiLinearWiggleDisplay/model.ts | 17 +++++++++++++++++ .../wiggle/src/getMultiWiggleSourcesAutorun.ts | 13 ++++++++----- 7 files changed, 35 insertions(+), 23 deletions(-) diff --git a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx index 802879222f..af6ca386c8 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/model.tsx +++ b/plugins/circular-view/src/BaseChordDisplay/models/model.tsx @@ -249,16 +249,14 @@ export const BaseChordDisplayModel = types makeAbortableReaction( self, - () => - ({ + () => { + return { assemblyNames: getTrackAssemblyNames(self.parentTrack), adapter: getConf(getParent(self, 2), 'adapter'), assemblyManager: getSession(self).assemblyManager, - }) as const, + } as const + }, async (args, stopToken) => { - if (!args) { - return - } return args ? args.assemblyManager.getRefNameMapForAdapter( args.adapter, diff --git a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts index 5d93ca2a8a..a77fc7c616 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts +++ b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts @@ -54,6 +54,7 @@ export async function renderReactionEffect(props?: any, stopToken?: string) { ...renderProps, stopToken, exportSVG, + stopToken, }) return { diff --git a/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts b/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts index 9d09f34791..5335822566 100644 --- a/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts +++ b/plugins/gccontent/src/GCContentAdapter/GCContentAdapter.ts @@ -26,12 +26,12 @@ export default class GCContentAdapter extends BaseFeatureDataAdapter { return adapter.dataAdapter as BaseFeatureDataAdapter } - public async getRefNames() { + public async getRefNames(opts?: BaseOptions) { const adapter = await this.configure() - return adapter.getRefNames() + return adapter.getRefNames(opts) } - public getFeatures(query: Region, opts: BaseOptions) { + public getFeatures(query: Region, opts?: BaseOptions) { const { statusCallback = () => {}, stopToken } = opts || {} return ObservableCreate(async observer => { const sequenceAdapter = await this.configure() diff --git a/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts b/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts index 8cce078a1a..2f87572369 100644 --- a/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +++ b/plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts @@ -1,12 +1,5 @@ import React from 'react' -import { - types, - getParent, - isAlive, - cast, - Instance, - getSnapshot, -} from 'mobx-state-tree' +import { types, getParent, isAlive, cast, Instance } from 'mobx-state-tree' import { readConfObject } from '@jbrowse/core/configuration' import { assembleLocString, diff --git a/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts b/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts index bf47486e55..e180026bbe 100644 --- a/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts +++ b/plugins/sequence/src/TwoBitAdapter/TwoBitAdapter.ts @@ -43,7 +43,7 @@ export default class TwoBitAdapter extends BaseSequenceAdapter { } async setup() { if (!this.setupP) { - this.setupP = this.setupPre().catch(e => { + this.setupP = this.setupPre().catch((e: unknown) => { this.setupP = undefined throw e }) diff --git a/plugins/wiggle/src/MultiLinearWiggleDisplay/model.ts b/plugins/wiggle/src/MultiLinearWiggleDisplay/model.ts index af724f5161..95728e0af3 100644 --- a/plugins/wiggle/src/MultiLinearWiggleDisplay/model.ts +++ b/plugins/wiggle/src/MultiLinearWiggleDisplay/model.ts @@ -24,6 +24,7 @@ import { // locals import { getScale, Source, YSCALEBAR_LABEL_OFFSET } from '../util' import SharedWiggleMixin from '../shared/SharedWiggleMixin' +import { stopStopToken } from '@jbrowse/core/util/stopToken' const randomColor = () => '#000000'.replaceAll('0', () => (~~(Math.random() * 16)).toString(16)) @@ -67,10 +68,26 @@ export function stateModelFactory( }), ) .volatile(() => ({ + /** + * #volatile + */ + sourcesLoadingStopToken: undefined as string | undefined, + /** + * #volatile + */ featureUnderMouseVolatile: undefined as Feature | undefined, + /** + * #volatile + */ sourcesVolatile: undefined as Source[] | undefined, })) .actions(self => ({ + setSourcesLoading(str: string) { + if (self.sourcesLoadingStopToken) { + stopStopToken(self.sourcesLoadingStopToken) + } + self.sourcesLoadingStopToken = str + }, /** * #action */ diff --git a/plugins/wiggle/src/getMultiWiggleSourcesAutorun.ts b/plugins/wiggle/src/getMultiWiggleSourcesAutorun.ts index c0f0417dae..d5b5b6b017 100644 --- a/plugins/wiggle/src/getMultiWiggleSourcesAutorun.ts +++ b/plugins/wiggle/src/getMultiWiggleSourcesAutorun.ts @@ -6,6 +6,7 @@ import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' import { AnyConfigurationModel } from '@jbrowse/core/configuration' import { getRpcSessionId } from '@jbrowse/core/util/tracks' import { isAbortException } from '@jbrowse/core/util/aborting' +import { createStopToken } from '@jbrowse/core/util/stopToken' export interface Source { name: string @@ -19,7 +20,7 @@ export function getMultiWiggleSourcesAutorun(self: { adapterConfig: AnyConfigurationModel autoscaleType: string adapterProps: () => Record - setStatsLoading: (aborter: AbortController) => void + setSourcesLoading: (aborter: string) => void setError: (error: unknown) => void setMessage: (str: string) => void setSources: (sources: Source[]) => void @@ -28,13 +29,15 @@ export function getMultiWiggleSourcesAutorun(self: { self, autorun(async () => { try { - const { rpcManager } = getSession(self) - const { adapterConfig } = self - const sessionId = getRpcSessionId(self) const view = getContainingView(self) as LinearGenomeViewModel if (!view.initialized) { return } + const { rpcManager } = getSession(self) + const { adapterConfig } = self + const token = createStopToken() + self.setSourcesLoading(token) + const sessionId = getRpcSessionId(self) const sources = (await rpcManager.call( sessionId, 'MultiWiggleGetSources', @@ -48,8 +51,8 @@ export function getMultiWiggleSourcesAutorun(self: { self.setSources(sources) } } catch (e) { - console.error(e) if (!isAbortException(e) && isAlive(self)) { + console.error(e) getSession(self).notifyError(`${e}`, e) } } From 7a42aa9072c547b8ad4d163bf6d7088de4efe3c4 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 18:24:21 -0500 Subject: [PATCH 9/9] [skip ci] Update snaps --- package.json | 2 +- .../src/BaseChordDisplay/models/renderReaction.ts | 1 - .../linear-comparative-view/src/LGVSyntenyDisplay/model.ts | 7 ++++--- .../__snapshots__/BgzipFastaAdapter.test.ts.snap | 2 +- .../__snapshots__/IndexedFastaAdapter.test.ts.snap | 2 +- products/jbrowse-web/src/tests/GCContent.test.tsx | 2 +- yarn.lock | 7 ++++++- 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 4cbbf8818e..4b08cde24c 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "tslib": "^2.0.1", "tss-react": "^4.0.0", "tsx": "^4.17.0", - "typescript": "^5.5.0", + "typescript": "~5.6.0", "typescript-eslint": "^8.0.1", "webpack": "^5.64.4", "webpack-cli": "^5.1.4", diff --git a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts index a77fc7c616..e734b0e6a9 100644 --- a/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts +++ b/plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts @@ -52,7 +52,6 @@ export async function renderReactionEffect(props?: any, stopToken?: string) { const { html, ...data } = await rendererType.renderInClient(rpcManager, { ...renderArgs, ...renderProps, - stopToken, exportSVG, stopToken, }) diff --git a/plugins/linear-comparative-view/src/LGVSyntenyDisplay/model.ts b/plugins/linear-comparative-view/src/LGVSyntenyDisplay/model.ts index ed9994da20..1d8a1576bb 100644 --- a/plugins/linear-comparative-view/src/LGVSyntenyDisplay/model.ts +++ b/plugins/linear-comparative-view/src/LGVSyntenyDisplay/model.ts @@ -119,12 +119,13 @@ function stateModelFactory(schema: AnyConfigurationSchemaType) { } session.setSelection(feature) }, + /** + * #autorun + */ afterCreate() { // use color by stand to help indicate inversions better on first load, // otherwise use selected orientation - if (self.colorBy) { - self.setColorScheme({ ...self.colorBy }) - } else { + if (!self.colorBySetting && self.colorBy.type === 'normal') { self.setColorScheme({ type: 'strand' }) } }, diff --git a/plugins/sequence/src/BgzipFastaAdapter/__snapshots__/BgzipFastaAdapter.test.ts.snap b/plugins/sequence/src/BgzipFastaAdapter/__snapshots__/BgzipFastaAdapter.test.ts.snap index 4257eb2030..78a52f2651 100644 --- a/plugins/sequence/src/BgzipFastaAdapter/__snapshots__/BgzipFastaAdapter.test.ts.snap +++ b/plugins/sequence/src/BgzipFastaAdapter/__snapshots__/BgzipFastaAdapter.test.ts.snap @@ -7,7 +7,7 @@ exports[`can use a indexed fasta with gzi 1`] = ` "refName": "ctgA", "seq": "cattgttgcggagttgaacaACGGCATTAGGAACACTTCCGTCTCtcacttttatacgattatgattggttctttagccttggtttagattggtagtagtagcggcgctaatgctacctgaattgagaactcgagcgggggctaggcaaattctgattcagcctgacttctcttggaaccctgcccataaatcaaagggttagtgcggccaaaacgttggacaacggtattagaagaccaacctgaccaccaaaccgtcaattaaccggtatcttctcggaaacggcggttctctcctagatagcgatctgtggtctcaccatgcaatttaaacaggtgagtaaagattgctacaaatacgagactagctgtcaccagatgctgttcatctgttggctccttggtcgctccgttgtacccaggctactttgaaagagcgcagaatacttagacggtatcgatcatggtagcatagcattctgataacatgtatggagttcgaacatccgtctggggccggacggtccgtttgaggttggttgatctgggtgatagtcagcaagatagacgttagataacaaattaaaggattttaccttagattgcgactagtacaacggtacatcggtgattcgcgctctactagatcacgctatgggtaccataaacaaacggtggaccttctcaagctggttgacgcctcagcaacataggcttcctcctccacgcatctcagcataaaaggcttataaactgcttctttgtgccagagcaactcaattaagcccttggtaccgtgggcacgcattctgtcacggtgaccaactgttcatcctgaatcgccgaatgggactatttggtacaggaatcaagcggatggcactactgcagcttatttacgacggtattcttaaagtttttaagacaatgtatttcatgggtagttcggtttgttttattgctacacaggctcttgtagacgacctacttagcactacggccgagcgcaataacccccggaaagcacttgctactgggaggcgggtttatccatcggcaataggggttatcagtactaccaagaagattgtgaagatattaacagcattgaaaaaagttcggactgggcatgaaacgtgtgtcagagttagagtccttgagggactgaatgggtttgtcccaggcccaagcttgaggtggatgtcacctcgggtactgcctctattacagaggtatcttaatggcgcatccagccttgtggctgggtctacgtacgcgtgggcaccatacgtatgttggcaggaaaggtcaatcatgcttgtttcctcgtcgcagaaacgttcacactattggctcgcgggatcgaacgggcctgattatttttccagctcctgcgttcctatcacgccaactgtcgctaataaaatgttatatagagataacccattgctatgcaaggatggagaaaccgcttcacaacaccctagaattacttcagcactaacatctaagataccgggaaaaccgtaggtgccacttggttttgagggcaatgcctcttgcactggcgattcgtggagtaaccttgctaccgatttccaccttttctaggtatgattacatgcgatcgccattgtcagtcgtcgtacgaaatccaggaaggaattcgaatacatgaccgaaagctatggcatcataagcgtggctctttactaaggacacgtgtagtcggctgatttcgcgcagaacttcgctcaccggacagtgactgctgtccgaacttgggggcagcgtagattctagctagagaccgcagcgaaaatgccactcgctaggtggctatggacgtccagctataggcccccacattcgtatgtatactccggtaattgagtctacctttcgaaagatcaaagttcacaaaccttctctcacgttaacatagatgctcgcacatagctagtccggtgataaagcggccgtgcatgcgagtatttagcgcacggaacagatattaggctgcgaaataccctcatatgctacagcgcaggtaacagacggttgatctccccgtagaattccctcaaggccggatcgttctcatgagtagcctttgtctgacatttcctctcaatagattgcagactcctgtgtcgtgggaaaacttcgcggaatcgctgtcgttacataaatctaaacagtgcagtccaagctatttactaccacgtatcataatgaacatctctttgtgaaatacgccggtacgccgagagatcgcccacattgcgtgtcaccaagacccagtgtctattgggcgcgctggttatagtatgcggaggcacccgatgtgctgctaatcactacaaactcgacaccaagaggcgaccgcgtgcgggagggctagaacgcgagagccacgtcaacgtggtggtaccgctcctgatgatacgagcactgtgctggcaccgctgccctatgtccagctaacaggtgtcacataatatcgcatctatagttgagtatcttatcgctagcgttacttgtgagttctcgggtagaatcgtcgtagcattctagtccttagcgtaagcaacgatatcgccgatattataggggcaataggtctcacccaccacgggtgtatatttaacgccctaagtagttaacggagactattaaacaattatgcacgtgaaagattagggtactgcacacgtgtcacgttgacgatgtaaacaccataaaggttgttctgtgatgcgatgcccatacctgcggtgcaacgtcctaaacttatgcggatcaccttctaattcagccgacgttgagaacgccagctatactctgtgagtacaaggtgaaagccccagatcaaaatattggagtcttgtccgtagctcttgggtggagagtgtgaccacgtttatcccttaatactgagactcttctcgttccacgccccggacattcgcgatacagcctagtttgataggtggctacaagggctctatccgaatagcacaaaactcagtcctagtgcgtataggtcgtgctctgcggttatacgctccacagaagaaagtacccactgcagtttgtcggtgggacttagcaaaacctgtaaccaaaaccgcacatggactctgttttggtggcgtggagtgtgcccgccgcctttatgctgggtcaaaatactatatgatttgttgtggtcgggcgcgacattggctcttatggtttataactattattcggtgcacagaaccgacttatgccccgattttgcacctcccgagagaaatggtactagtcattgtctcggggttttacaactcaaggataatctgccagcggtaccccgaaaaatcccatcccgaacggctggtacctatgctggagaccgaaatggagccagtgctatgcaaaccctcgctctttctatttggcccgaccagctgcgagagtcattcgacatacattgcgatggctggttcatctctctgcttcggattccgatcctgctgcctatggccacaacacgaaagagatcttggatacgtcctcaccatagtccaacggacaaatatggaggtgtacgcgcacggatacgagtacgacgggccgcccaatgctggtccttcgtgttatactgtttacttgcctccggtaagagtgtacagcttgtacccacgcggtggaggaccttacgcgtcgtccgcaggtgtggagatttcgctacctgttgcattggggcctcgccttacgtttttttcgacggaggcccgacccgccaggccagaccctcatcattgggatttttactgccttggacggcagattctgatgctggtaacgcgcttggcacacaccctggtcgtaattacgtactatcacctctattttaccaggggcgggccccgcctcaacgatcggtagtctcgttagaacagttgcttatactccgttagcactcacaactcggagaatgagcttacacagtccgtaatagtctccacagcttcccctggaaggttcgtacaggggccctggggtctaatgtgctaccgcctaacttcgttagtgtaaggtctcgtgtgcacctccaataacgctgcatttttgtatagaactcctttataggcctgactcttcggaacagcccactaattgacgtgcacgatgctgcatatacccttctcaatgacgcataccggtgactaaatcctgtggctggttgacactttgcataacccaccacgaaaacgcggtttgcacgtggttggaagcgagtaccggttaagggaagttacgtaaacccaacatagtgagcgatgcttaaaacactgcatgcgaacaacgaccggaacgagagcctaatagaaccaaatggataggtggttacgaaatccgcgcacaagtgtcgtgccactctcgtaaagaatgattgcttgcttatctatgagaaacctaataggcacgcacgtgtcgccagggaaaaaccaccatccgacaagacgctgaaaatcgagatagatgcagcccgcgcgtactttaagcacgatagccatcttgagcgcgacgattcagcttacggagattacttctcaaagcggacacctcgacgctgaagctctctatcgatgcacttgcatgtccatctacggcttgagcgaaccatgcttaacgcttggatgacgttgttagtcggattcgatcgtaccatactgtcctatccatcataacttcccgaattaaaactcattttctaccctcatttgtttcattggcgcatatgagcgccccatgggcgctgatcgacacaggcttgtagcgcacggctcgtcttgcagtagataaccatagtctttacgtcgcatatattaatatatcctcagacttccactgcggtattttggatcgtggcgtctgggacagtcacactctttaacgggagcgcgttcaatgtctgagtccatccgtgcagttcggtgcgattttattcttccctgcatcttccggattccttcttcttgtcggagaattcgccgctcgatcaaactcatcattggtacttattgaccgtttcatgctattacaccggtacactgatgataacgctgcggttttatcccccccaatacgcgcacacacgcttctttcggtgcgtcctgtcgtacccctattgcgcatcatggcactccagccgagcaatgctttggacaggtgtaaccaagctggatctagcgtgggttcgacacagctcggttcgtataaccacacgcatgaactgcgagtgcctcgccccagcgccgctgtctacttgctgtttagaggaagaagcaacagcttgcacccaatccgcatatctgcatataggtggccgttcctccgtggcgcgccgctacgttgtagcgcacggatcaaaagcgctgtgttactatacactggttcggagacggttcatgacgagcgcgctatatgtcggcatctgcgccccatgagcggccgctgtccggcggcacgaataatatagtgcaagaaaaaccgaagactacggttatatatgatggaacggccctcacagcattctaacaggtttgacaaacttaataaatgatgggccgcgcctgctgtgaatcccggacggtttggccggaaatacctaggcagtctttggaaaagcttttcctagatcaccatatcgttgtcagtggccaaggtttcgttaactctcggcgtacccagtatcggcgcaataggcctttgatcaacccttggaagattagtcgatcgtaacttcctacatcccggtgaaaggctttaattctaagtcttcgccacaaacgcttcaggagcgtcgagttctatcactttcgaggtactgccacttactatacaccggtacacttgttaagcaagtgtttgcggatgtggttaaattttgatggcagatttctgggtgttttagctatagctgtatcctcgaggtcgtcgtttaaccgctcctgttgctagatcatatgtatcgttgttcgagacgctagtagtcgctcctaccgaatcttacaggttcgatctctgctcggcttttgccgcgggccggtgcttgtgctataattataatgataagggcagtggccgcacaactgcagattactgacacttgagtgagaactaagccttgaagcatagtgttgaatgttgtagaaaagtatactgtgacaaaaacagggcctggtgtcaagtgtcctcagtgatctggatatcatcacgccttgttagcaggatttacccgcatagtaatggccggactttatattgccctgctgcgctagctagtactgcgggggctctcttccccctattgatattccgggcagaatgcgcgggtagtcagcattcatgtcaggcttctatcaacgtctcattcacccttggagtgtgacctacgtgttagaggcaatgtagcccgagagcccgttcaaagacaaactcccgaattaaacagacaccggttatgggagtgtgagtagtgacttccgaccagtgtttggtttcagcctgtcggttaacctcgcagggctaggagaatgagctgctagtaggtgattaccgaagtctccccagaaagggaacagtcttatagagtagagaatgtcaaatagcgttattgagttctgtctactgcactaccaagagcatgcccaccagagatgcgtcgcagtcgtagcgtagacgtcgtaatgacccaggtggcgttcggcctattcgcgtcggacgcgcgcgctactacaacgaagggttctgaaagtgcatgttcacactgaaattctaagtgttagtaaacaaacgcgtgtattccagggtcgtgtgtgacattatggctgtctgcgcccctcaatgatcatcaagacgttcaattgtatgttaacgtagatatcaggtttagttatccgtatactttttacgccgcgcgcttggaacagattctcctaacagccctcgcggtttcaaaaagaaccaaagtctataccatccttgttcccaattctgcctggttgcggagaaaagaccgcctccatacgtacccgactcggtattggtaagtggggaagcagtcgaacgcatatttcttggttatatcacaggccacgttctatatcggaagtggccggattacgatttgacgttctatccccgagagcgcattcttgtttgttactactaccacgcgggcgcttcttattcccagaccagagggaatgtgcggaagctttttccacagattggcggaactccagcgtgcttagtgcaggcggagaacgtccgttcagtggtgcgtgctttatttttcaatctgacccgacctgcgctcaagggttgcaagttgttgtgcgcccgagtaataggcgactcgtcgcaatgggtctggtacattgcattttcatcggtacggcgcttcataaagtgcggcaaatttctcaccccagtactcatgtttatagggtatcaggacccgaagcttctctgttccaaagaaatgtactgtttggctcccctgtccatattggaggtagatcacttgtggattatgcaatgaatgaatgaaagtttggtgctccccaccggggcgctctcaaagagagtgagctaaatttgaacatttaaattgctattccaacccggagtcctgaccggaacagtaatgaaacttcaaccatgccggacagactagaagaagggaaagttgcttgtatatgggagtaaaaatgatgttggtgccgtaatggtgccggaagtgactatagagcatgtcgtgacgcaccggtaggcagtgctataatcgtatgtccttcaggcgccgccggacctacgaagctgaaattagacaccggcacactagccccgtcagcgacggtgcgcggccgctgccctgcagcgaatggggctaacacgcataaaacgcccgcataaccactcgagctacgggaattcactcaggctgttgcttcgacgtgtagtctcattacataatcataatacctccaagaccaacggctgctcatgactctcttaccttgttagggacatttcggcactagggaagagctgaggactttgaaaacgtcgataaaaccatcgcgggaactagctgcgttagaactccatattttacgggtcgcaagcttgaggtcctgtcccggcagctgcaagtgctacggcaggaggggatctacctaacgtgcagtaacgagcccctgcccgtaatgaggcgtactcgtctctaatcgtcagtaagttactatgtccgaggacgcctctacgagttgaactctggctaggcccacctgtccgcgccctgctcgggtaccccatctgcttatccaacttcacctcgccttacggaatctctggttgccagtcatccgatggtcattaagcagcgtggtacatcgtagccaatacttcagggcgccagccatattcccagccaagcggctgcataattacagcgcctggcacgactaatcgatcccacaagcctggtagatgacccttagccctaaagcgccctctgacctatctgcacgtgatacttgattatttgtaatgagcggacagggtagatgactaatatacagggtcgtctaggtttgcacaatgcagacatcatccgcgcaaggcccggacggctgtactcacacagctagctccatctccctcagcagcactaagattcccacgtgaccagggcgacgggcctcagccaaacgtatccttgatatctacttaagtcaaggttgactccgaaccctatgggtcggtgccgttaacagggagtctatatctcggcgttccattgcttgtttcaaactcctgctataaggtgaaagcgctggagggcatagtttatgcccaaagttgcgcgtagatccgtcgggatatgtgctataataaggactgctcgaggtaggcggtaacggctcccgccttcagtaggcgcggaactcgaatcggagttacaggacttgaccgagtcatatccaagtttatgttacccgatcggatccggatgctcgtatctgcgacgaggtcggaagacggacgaaatacgattcaaccgcgcgaaccattagcatctaacctttagcctcaatgggtgttaacgtggtgggctcactcggcgtactctttgtgcaactattccgtatgaacaacagtcaagttgcgacatgatgctcttacgtgattcccacagtttcccacctcaggatgctttctttagctaaacccaatagttatggcggcaccttcagactcccacgaggacggctatgacgttgctaaaccattcgccgccaaaggctagcgctaacgagttctgtgagtttgttccgggccagatctccaggatggtcgcaacaacgcagtaccggttttatactggtgaccctctacctgttattaagttacagcgttgtcctacgtacatggtcgtgagtactcgcgtagtcaaacgccaggactagcagcgagaattattgtcgcgatacttactacaatacttacccgatattgacgtgcagggttgaaagagatggacagttgaatatctattttgacggaatcctcaaaactccctccacctcaggtaacggccctgtccgggaccgcattcttgcatatattggttcccagagcgtatctaagttagtctcttgaccgttcaccgactctagggcgactcgttatcgccctccgaaacgatgctttcgttacctcaatgatgacaggctgtaacgtaagtgatcccaatctcactcgtgccttgtccaccgttccgtgaagacgaagcaatacgcggaatacgtggcttcgtaatattttgacgatatggggctgggacgctcaagacttccatgacaaacaaagtgaagagcaactgcatccctcatcatgatcactattaccagagtagcgatggataacgctaatttggtcagggcagctatcgcatcccgcaggtgtaggcggagactttttcttttgttgcgagttgacaggtaatctcacggtataagcacggttatttacgcaagcgacgtccctgggagaatccgcccacgtaggaccccataatccataaatactgcggtcgaaaccttcatatcgtgacagaaccgctttctagggatgcggtccccgcattcagagttctactttggccagcgtgagacttaacaactccacttacgcggtacattgaagtcgttcagtccagtgtgacctgtgtaccgaataacgtgtagaccagcgcgtctacgacttagcgcggctccactccaaagcaccttttgggactttccaacgagcctgttggccgttaagcggtatttcacaaatagatcaccctagtgtcggtaaccgactaccctattgggatcatcgtgagctcgaaacactagaggcggaccaacggatgacatttgattcggctctacagagcttgtcgccagagaaaaactgtggcaatctacgctcgcggggaattgactttagcggcccctagacaggtgtgggacactagtctagattcacgtcctacacgacataacagcaccttcctggccagcccagaaatagtacctggacgacatccagccttccgacgccataatgtgagccgtagcgcccacgacgatcaacgaggagaaatttacaaaggctgtgtgaatgctacgtcgtctaccattgctcatcgaaacgaacgcaacgcacagcatacaacgtttaccatgccggagcgggatcctcaagtacagaaaacagaggtctaaacatgatccgaacaaatcggtaggtttacacagctacctcgtccattggcgtactgcatcgatcgtgcttactacggtcatgccggcccgcgatgcacgtacgaaggaataccctgtctgcccccgcgcgagttacgctgtctcgcacataccgagcactgtcgttcgaagctaaactatgagcccagccgagctccttatggccgcaacgctggtgcggccagctgataaattccacagtacacgatcctcgtgtaagatctcgggcatagtaagtcatttcacatggttaggagagatagaatacatggttctggtagctcaaccaggatttgtggaacccttggcccttggtgagtgctacaataaaattctccgtatgggacaaccaaagggtgctggatgtgacttcccggcccaggttagatgtccatatcattcatacattgcccgaccgacccaatgcctaaatcagaggcgccttagctagttcttgtagtgtgccacgtccggccacgcagacacgaccctcggcgagtgatcaccattaccggattggcatcgaagtctttttctgggaagttagccagtttggtgtgcggtgcttagaatcttattcccagtcaaacgcccctgggacgaattgctaaccctagttgccacgccggaaccatcttcgggagagtagacaaatccgagttagatatgttagcgtcttcgtgagtctgaaatgtatcacttcaccgcagaatacgcgaatgtctgtttgccctggactgacggaattggcttaaaagccgactagagcattttggtacggttcctatccgcgatgtaattacctatctaggttatcgctagacgaatagcgagtacagtgtagcaggccctttgttagcaagttgctctaaacagttgtcaaaacgtaggcacaatagtgcgattcttctaaatccgggaagctcatggcgctgggcagaaatatcacatacgggaataatcaacctccattttggttcgttttactcgatgagtgccccttgcttgagacgagcgttctgagttgatggcatgtcgaaaggtttacgcggtgagtagagcactttacccctacagatcggaatcctcgaggaggacagttggaacttcacattaacctttgttcgattgcatgaaggttgtgttctgggagtaggctcccaaggtagcggttcatgctgggggcagccctaagtttgtattatgtgagtttgcgtctgaaactacatttagcatgaggaacgtaagctttctggagggatcttctaaagccaggtatcgcccgctacgatgccggagccggtggttcacagctacctgtgctcaaaggcttaaggctaatcatagcaacagtgcgaaaggacgtctttcagatttcgaaaggtgctgacacaacaagggtcagggcggtcctacccttctgattccctacctggttttttagcaagggtcaaggctaggcttatactcccgaacgctttaaacactatcccacccctgacggggggaagttgcgcgttaagtataagaataagatttaacagtacactttaggttcctcttccgcgagccgtcatacagcaccgagcgccgttgaaacgcgattaacgcgtattgtcgtgcgaaaaaaaaacgctcgccagcatattggagtgtcgacttgaaatattgaacaacaccgcatatcaaggacgaatagtagggcttcactacctccacctgacggccctaggacttatactcgaaaaagaccttccatcacgatgtcccttaccggcgagagggctatatacgcatgaatagcagatcttgccgtcgctgagtgtcacccagggttgctccagaaaggagatagggcggagagccatcgacagcagctctcgtctaggtggtagcagctaaggagtcgtgtcgtcgcgccgagttggaacattatcgatgtacatcaatgcagtaatgatgctgatagactcgggagtttcctcaaacccagagttacgagaagacgcaggtctatcagttagaaggagtcagtattggcctttgaaagatcttatgctcatgcccaatcgtagttaaacgcgaatcgggaaggccaatctggcggttttgacccccggactcttaagacgtccaatgtggctagacataagtaacgaattactctataccgaggggcgggaaccggccaatttattacgagagcacgagagccttgtagcggccagcacactatcctcgagtccctctatcctgagacgtagatatacatatacgcctagagagaatagccgtctaggcttccgtcgccctctccgtcgttcgcgtgaaccgtaagtcttccgcattcccttcctcaagcgcgttggtgtgagagtggtattgaggcccagtcttataacgcatatacttgtgcactctattacttaccatgggaaccaatggcactctcgaatcatgctcacagctgagcaacggtgctgctcaccaattacatatgagtcgtggtttagcgttggagcggaagatgaatttccatctgttcgcgcgcatcactaaccaatatacggttatcccagcgctatctagttctgaccgggttggtagcgaacccttttgcaagccggcttagtggatgtgaagtgggagtgataacttaagccgccacgttcgggggggactcgtttatattggtgctggaatacgaacggcgtgattcgtagtcgccctaatcgggcgcgacaacacatgtagtactgtcgaggcggtttaaacccacagtaggtactctatcagcagaattatgctagaagtttcacaacaactttccgcatgaggctcagcggcagcgtcgcactcccaatggccagtgccggtagcgatgtttggtggaattagttccttcggaatacgaaccggatttaaagagcctcggagaacctaaacgaatccgtacgcatcttgcccaaggtgctgagccttgtcgcctttctcagttccacctacattaatgcaatgcgttcgaagctctgaccgcaaacaggaatcaagttcagacagagtgcaagagtttcgcaataattgggaacgacccacttgatataggtgcttttagagatgtgtgtacgaccgtccttcgagcatacctacgggttacaattgctccggtaagtcaaggcacatagaaaacatagccaactgagagtgtatacaagattacctcatgtagactgaaatacacacatcgctttaagctctcaaccgatgtagaacagattttgggcggcgttgacagcgtgcccgctcaccggtttgctcccttctcaccaaataaccatgagacgactttggtgactggactgccagatgacgggctacaaccgttttggttccgaattcgctctaactcaactaacatcatactatatgcgccaggatattctcgcggttggacccccctgccaattcgggttaaaaccactccccccatgtagggagctgccgcaattacaatatcgacgatcccagatggacgctcacaaaatatcagtcctttcacgatccgctcatatagacggatgaagggactgaggctgttagatagtgacgtcgagcatggcgtagacgagcgcaaccgggtcgaggcccgcattaccgtgacacccagttgaaaggatttacactgcttcattcgatatttaccactttgtatgaggagctcaacctaagtcaacacggaccatcatacaggtcgccagtaatgagaaggctgctgtgccatggagaagcgctgctacagcacacaacgaacatcttgcaatgtgaaggagggtgctcttttgggatgagcctacggggatgtgtatccctgccctgtaggcagttgggacttagcgcgactatctagataactaaggcgccagccgcggctgtttgccgaagtcgtgctgatgctgtacaacgaagggcgagcgtgttaacatgctacacgttgacctagactagtccaagtctgaaagtcccaatttaggtcgggtagtacagtcctcggttccagtcccatgttgtgccgacaaggacaagcgatcatcaaatcgactgaaattgaatcagctacctcagaccacattcagctctcggtaacatgggaggcttgtggttgcaccgtaaaagggggatagcccatccatcctgtaaacctacaatcgcgcgtagcttaatacgctcacattagacattcgatcgagagacctggtttcaagagccttcccttttgctttagtgggccaaatcgcaaccctgctcccctcccttacgccttatacacttcagtgcaaattcatgcgttcagcgaacaactggacttctgttgtacgtagtccacgggggcttattcattatagaaagccccctactgtcaccgttatatggttcacacatgagctgatcacctagagagtcgtcatgcacattcgcctaacaaggacatatgagtaaccgggaggggatatcttcgatttgcagcaccaatcgacgttgtactggtctattgtcggttaggtccgattatccgaccggcaatgaggcaagcccatctattcaggaaacttaggcagttccctgtgctggcccgacgtcgatgagttaagtctatacaggccggccgcgagtagttaacgagaccaacatagaactatcatactagccggcaatgatcaatagggtcttagtgccactgtccttcgagccctcgcctaatttagcgcgaccggtttcctattggcctgtggggttgcgggcgcgtccgctttaagaatggtccttaacacctacccggagatccattgcatagcacactctccccattagcctagacacgtcgtcgcccgtcgactttggctggaatttaatcgccggggatatcgaactttcacgccctttaacgacgaggaaacctaccgtcgcctggctggtaaatgggtgccttacggggactcacgatgctgtgaaccgcccgccagtctctggggctcccaaaatccaggttggaattacggacctccgccggtactacgcattacggggtggaaagtcctaagataggtgaatgaaagggcttcgctaaaccagtaagtcattaacaggacatcggcgtcacgtctcgcgggtttacacggcgcacaaatcctattcccatgataaacaccttatgccaatccacatccctcgctgcctaataaaattgtcacacctgcgctactgactaacgtttacgcaatgagagatgaattccgacacccacgcttgttgcaagcacagccgtatgggttctcgggtaaggtaacacgaggcacactccggcgcggccacttcggcccctccctgacgatgaccctcattggtcaagcatcagtcgaatgattcgtaacaaggagcaaccgactcagtagagagggtgaatctcacgcgctagcctgaggaccgcctaagtgcttgctgtgcgtcgcggcagtcgcgaggtgcgggctaaagtaaataattactggtcttacctaattaaagttggtggttagggacaacgttaccactaccagggtgcgcccctgaattcgggtatcggactatccagggcgccttttgcggccttaaatacctttttaatcacgctggagctagaaggccatcgggatagacggggttctaggtactcgaaaaaacaggcctaataactttattgcgcttggactaacctatgtacaacacgttgtagcatactatggaatgttactgacctacacggatagcatttgttcgggagcgtcattgacctcccagaccctatgccgatctgcaccattcagtgaccatccacaagtctctaggtttagccaaaggtgacaggtcaagcacttgcgcatgtccactagtcgattatgcaacgtctctgaacagttagcacttatctcccgccgtgtgactcacgcagtgaacttacctatagcatacgcctactattgaatgttcgttgttctaacacagcgctaatacctcactggcagaggtgcgcacgctcctagtatgggagggagtcaggtcagagtgtatgagactgatttttattcccgataggggttcagtgaaatcgacctctcaaaagagaggcgcagaattcgctgataagctctgctacgatcgctaaggcacgataagcagggcggtgaaggttggagcaagataatatcacccggacgcgggtcctgtcgcaacgagcggccgtgagacctggtgcgcaccgtgtctcgatcggccgaatatcggaacccactgcgtgactcaaatgatatttttgctatctgtgggggatttatgtcccggtagaactctgcttctagcagaggataaactttacaaggacggcgaatatggtgtcagagcgccctaatgatcccgtgctattccgcgggccaccggccgttaatggacttcgggttagaaggatgggttattcatcttccacagaaacgcccagccgcaatcgtgggtttactcgaccgcggttatctgcctacttagctgcattcctaaaacaggattaaaaaggccgcgagggttgcgaacctatggttgagaacagagtcatagagtcagatgcgcagggacggcacggatccacatggcagttaactaatattaatacccccttagcctcgtatatgggcgtgtgcagtcttgtccactcgcggacgcgtatccgagcgattctgtcttccaacgctattcgttaccactttggcacctctttgctaagcaggatgagaacatctcactcactacgagccttgactttcagcacgcggtacgagggcactgggcttctcgtcctttgctagatgtaggtgccttcccgccctcatgacgatgtcacgtctatcggtttattaaggtcggggaccattacgagattaccccgcgaccttcgtccaaatgggatcacggcaacgttccacgaggggcgcgttgcctgagccactcgggtatccccttccgatatccgcagaagtctagctaggagcaccgccaagcattacccgattaagcaaagcctactcatcgcatacacggttcttggggtttgcgtcagatagcaacttccggcggcagtagagatgatattttatccgattgagcttgcccagcgcaccctcgggccccgtggctcttctcttaaatgtgccctgcacgatgttagcggttcctactcctccccgagccctatgggtggacagactcgccctctgaggctgcgtgttcaactggttccaagtccggcgcctgtggatctacgacgcgaccagcaacattataccaatgtctaggcttagctcgaaaactagtaagccttagaactagggtcgtagcttcttctaaatgaagggcagcgtcatagccatccacgttagcgcttactcaatcgcctgtcggctgtcatgttaccgctgccgtaagttcgtgaacataaaatacaacacattttaggtttaacaaggattgtttaccgccacgtactggtgccggtagtgaaacgaaaaacctcagcatcgggaggaggagaacggaatccctaccaatcttatctctacttaaagaacaaagcgcgcggtacatggcgcagacgagaatgaatccccgaacgggccgagttagactcctcaacctgtcgaaaagttgcgatccgctagatcgtagagtacggacttaaaaaagaaaagaaggtctctacccgagcggtgagcccaaccagttccaggttgctgccggattcttccacacggcggtgccatatggacgaccccgtactttgggcattctaggctacctactgcgaacgcctcgcgttcatgcgcaaagttttctctagataggcgcgctttggtaagcatagtaataggttcttcagcgtctaaagcccgcccattaggcctggcgactctgctttagtggtaaagagatagcatcgatgtacatcgatggagagagtattttcacgaaagtgcgcgccgtacactatttatcggcatgcgcgctaaactggagggtctaataaccagatcacgcaacgaggtcccatgtacggttcgcattgcgaaagtatgggatactagaggttttatcgggcctcgcttgaggtctgtctgggactggcgcacatcgctcgtcgcccagtcgatagcggggtgattaaataagaaatatgttagtgcccggatttggaaccaaccagtcccggtagcggtacaaaaagcctttcctgctagttctatgcttaaagcgtactcctgttacaatccgtaggcaacctgaagaggcaacctggttttcctttatttcgactttgtttgccatttccaatgtgatactgtgcggcgaccttaatgctttttggtaaaaccataccgagatccagcgcacgcgacattcagaccggtcccggtttggcggtcaacctcgtactctgcactgttcagctagaggggtctcctatcccgaggtaccggtcgtctaacgggtggttacaggggctggtcctactctaccaacagttaaggagggcaacaagttcgatggggcatcgtataacttgaatgccattggacaaataataattgctccacgtcccaaacctcaactgaccttgtacgcataggtgccacctgcacgcaaccgagctcgttcaagtgtccttcttagctggcgccgagtgaacctgcatctgagagtctacccaacgatctagtatcataatgtctgtagccagcgactatgacacttagagagccgcctaagaaagtgtttgcggctcctgccccggtgcgcttgttcggtgggaggtcgttatatagaaccatggggatataatgaatggtaacatatctgccacgttgacaagccgctattatgaattcagggttggatactattatggcccttcacggtcacttgtaggacggccccaaacaggattagtaaagtcggtggtctaagtgtaagcgataggcaaactgcggttattcgcgtagaccgcttgatgatgtaaaataacagttttcatgtctttgcaattac", "start": 0, - "uniqueId": "ctgA 0-20000", + "uniqueId": "ctgA-0-20000", }, ] `; diff --git a/plugins/sequence/src/IndexedFastaAdapter/__snapshots__/IndexedFastaAdapter.test.ts.snap b/plugins/sequence/src/IndexedFastaAdapter/__snapshots__/IndexedFastaAdapter.test.ts.snap index 32b4a66507..980a97bb35 100644 --- a/plugins/sequence/src/IndexedFastaAdapter/__snapshots__/IndexedFastaAdapter.test.ts.snap +++ b/plugins/sequence/src/IndexedFastaAdapter/__snapshots__/IndexedFastaAdapter.test.ts.snap @@ -7,7 +7,7 @@ exports[`adapter can fetch sequence from volvox.fa 1`] = ` "refName": "ctgA", "seq": "cattgttgcggagttgaacaACGGCATTAGGAACACTTCCGTCTCtcacttttatacgattatgattggttctttagccttggtttagattggtagtagtagcggcgctaatgctacctgaattgagaactcgagcgggggctaggcaaattctgattcagcctgacttctcttggaaccctgcccataaatcaaagggttagtgcggccaaaacgttggacaacggtattagaagaccaacctgaccaccaaaccgtcaattaaccggtatcttctcggaaacggcggttctctcctagatagcgatctgtggtctcaccatgcaatttaaacaggtgagtaaagattgctacaaatacgagactagctgtcaccagatgctgttcatctgttggctccttggtcgctccgttgtacccaggctactttgaaagagcgcagaatacttagacggtatcgatcatggtagcatagcattctgataacatgtatggagttcgaacatccgtctggggccggacggtccgtttgaggttggttgatctgggtgatagtcagcaagatagacgttagataacaaattaaaggattttaccttagattgcgactagtacaacggtacatcggtgattcgcgctctactagatcacgctatgggtaccataaacaaacggtggaccttctcaagctggttgacgcctcagcaacataggcttcctcctccacgcatctcagcataaaaggcttataaactgcttctttgtgccagagcaactcaattaagcccttggtaccgtgggcacgcattctgtcacggtgaccaactgttcatcctgaatcgccgaatgggactatttggtacaggaatcaagcggatggcactactgcagcttatttacgacggtattcttaaagtttttaagacaatgtatttcatgggtagttcggtttgttttattgctacacaggctcttgtagacgacctacttagcactacggccgagcgcaataacccccggaaagcacttgctactgggaggcgggtttatccatcggcaataggggttatcagtactaccaagaagattgtgaagatattaacagcattgaaaaaagttcggactgggcatgaaacgtgtgtcagagttagagtccttgagggactgaatgggtttgtcccaggcccaagcttgaggtggatgtcacctcgggtactgcctctattacagaggtatcttaatggcgcatccagccttgtggctgggtctacgtacgcgtgggcaccatacgtatgttggcaggaaaggtcaatcatgcttgtttcctcgtcgcagaaacgttcacactattggctcgcgggatcgaacgggcctgattatttttccagctcctgcgttcctatcacgccaactgtcgctaataaaatgttatatagagataacccattgctatgcaaggatggagaaaccgcttcacaacaccctagaattacttcagcactaacatctaagataccgggaaaaccgtaggtgccacttggttttgagggcaatgcctcttgcactggcgattcgtggagtaaccttgctaccgatttccaccttttctaggtatgattacatgcgatcgccattgtcagtcgtcgtacgaaatccaggaaggaattcgaatacatgaccgaaagctatggcatcataagcgtggctctttactaaggacacgtgtagtcggctgatttcgcgcagaacttcgctcaccggacagtgactgctgtccgaacttgggggcagcgtagattctagctagagaccgcagcgaaaatgccactcgctaggtggctatggacgtccagctataggcccccacattcgtatgtatactccggtaattgagtctacctttcgaaagatcaaagttcacaaaccttctctcacgttaacatagatgctcgcacatagctagtccggtgataaagcggccgtgcatgcgagtatttagcgcacggaacagatattaggctgcgaaataccctcatatgctacagcgcaggtaacagacggttgatctccccgtagaattccctcaaggccggatcgttctcatgagtagcctttgtctgacatttcctctcaatagattgcagactcctgtgtcgtgggaaaacttcgcggaatcgctgtcgttacataaatctaaacagtgcagtccaagctatttactaccacgtatcataatgaacatctctttgtgaaatacgccggtacgccgagagatcgcccacattgcgtgtcaccaagacccagtgtctattgggcgcgctggttatagtatgcggaggcacccgatgtgctgctaatcactacaaactcgacaccaagaggcgaccgcgtgcgggagggctagaacgcgagagccacgtcaacgtggtggtaccgctcctgatgatacgagcactgtgctggcaccgctgccctatgtccagctaacaggtgtcacataatatcgcatctatagttgagtatcttatcgctagcgttacttgtgagttctcgggtagaatcgtcgtagcattctagtccttagcgtaagcaacgatatcgccgatattataggggcaataggtctcacccaccacgggtgtatatttaacgccctaagtagttaacggagactattaaacaattatgcacgtgaaagattagggtactgcacacgtgtcacgttgacgatgtaaacaccataaaggttgttctgtgatgcgatgcccatacctgcggtgcaacgtcctaaacttatgcggatcaccttctaattcagccgacgttgagaacgccagctatactctgtgagtacaaggtgaaagccccagatcaaaatattggagtcttgtccgtagctcttgggtggagagtgtgaccacgtttatcccttaatactgagactcttctcgttccacgccccggacattcgcgatacagcctagtttgataggtggctacaagggctctatccgaatagcacaaaactcagtcctagtgcgtataggtcgtgctctgcggttatacgctccacagaagaaagtacccactgcagtttgtcggtgggacttagcaaaacctgtaaccaaaaccgcacatggactctgttttggtggcgtggagtgtgcccgccgcctttatgctgggtcaaaatactatatgatttgttgtggtcgggcgcgacattggctcttatggtttataactattattcggtgcacagaaccgacttatgccccgattttgcacctcccgagagaaatggtactagtcattgtctcggggttttacaactcaaggataatctgccagcggtaccccgaaaaatcccatcccgaacggctggtacctatgctggagaccgaaatggagccagtgctatgcaaaccctcgctctttctatttggcccgaccagctgcgagagtcattcgacatacattgcgatggctggttcatctctctgcttcggattccgatcctgctgcctatggccacaacacgaaagagatcttggatacgtcctcaccatagtccaacggacaaatatggaggtgtacgcgcacggatacgagtacgacgggccgcccaatgctggtccttcgtgttatactgtttacttgcctccggtaagagtgtacagcttgtacccacgcggtggaggaccttacgcgtcgtccgcaggtgtggagatttcgctacctgttgcattggggcctcgccttacgtttttttcgacggaggcccgacccgccaggccagaccctcatcattgggatttttactgccttggacggcagattctgatgctggtaacgcgcttggcacacaccctggtcgtaattacgtactatcacctctattttaccaggggcgggccccgcctcaacgatcggtagtctcgttagaacagttgcttatactccgttagcactcacaactcggagaatgagcttacacagtccgtaatagtctccacagcttcccctggaaggttcgtacaggggccctggggtctaatgtgctaccgcctaacttcgttagtgtaaggtctcgtgtgcacctccaataacgctgcatttttgtatagaactcctttataggcctgactcttcggaacagcccactaattgacgtgcacgatgctgcatatacccttctcaatgacgcataccggtgactaaatcctgtggctggttgacactttgcataacccaccacgaaaacgcggtttgcacgtggttggaagcgagtaccggttaagggaagttacgtaaacccaacatagtgagcgatgcttaaaacactgcatgcgaacaacgaccggaacgagagcctaatagaaccaaatggataggtggttacgaaatccgcgcacaagtgtcgtgccactctcgtaaagaatgattgcttgcttatctatgagaaacctaataggcacgcacgtgtcgccagggaaaaaccaccatccgacaagacgctgaaaatcgagatagatgcagcccgcgcgtactttaagcacgatagccatcttgagcgcgacgattcagcttacggagattacttctcaaagcggacacctcgacgctgaagctctctatcgatgcacttgcatgtccatctacggcttgagcgaaccatgcttaacgcttggatgacgttgttagtcggattcgatcgtaccatactgtcctatccatcataacttcccgaattaaaactcattttctaccctcatttgtttcattggcgcatatgagcgccccatgggcgctgatcgacacaggcttgtagcgcacggctcgtcttgcagtagataaccatagtctttacgtcgcatatattaatatatcctcagacttccactgcggtattttggatcgtggcgtctgggacagtcacactctttaacgggagcgcgttcaatgtctgagtccatccgtgcagttcggtgcgattttattcttccctgcatcttccggattccttcttcttgtcggagaattcgccgctcgatcaaactcatcattggtacttattgaccgtttcatgctattacaccggtacactgatgataacgctgcggttttatcccccccaatacgcgcacacacgcttctttcggtgcgtcctgtcgtacccctattgcgcatcatggcactccagccgagcaatgctttggacaggtgtaaccaagctggatctagcgtgggttcgacacagctcggttcgtataaccacacgcatgaactgcgagtgcctcgccccagcgccgctgtctacttgctgtttagaggaagaagcaacagcttgcacccaatccgcatatctgcatataggtggccgttcctccgtggcgcgccgctacgttgtagcgcacggatcaaaagcgctgtgttactatacactggttcggagacggttcatgacgagcgcgctatatgtcggcatctgcgccccatgagcggccgctgtccggcggcacgaataatatagtgcaagaaaaaccgaagactacggttatatatgatggaacggccctcacagcattctaacaggtttgacaaacttaataaatgatgggccgcgcctgctgtgaatcccggacggtttggccggaaatacctaggcagtctttggaaaagcttttcctagatcaccatatcgttgtcagtggccaaggtttcgttaactctcggcgtacccagtatcggcgcaataggcctttgatcaacccttggaagattagtcgatcgtaacttcctacatcccggtgaaaggctttaattctaagtcttcgccacaaacgcttcaggagcgtcgagttctatcactttcgaggtactgccacttactatacaccggtacacttgttaagcaagtgtttgcggatgtggttaaattttgatggcagatttctgggtgttttagctatagctgtatcctcgaggtcgtcgtttaaccgctcctgttgctagatcatatgtatcgttgttcgagacgctagtagtcgctcctaccgaatcttacaggttcgatctctgctcggcttttgccgcgggccggtgcttgtgctataattataatgataagggcagtggccgcacaactgcagattactgacacttgagtgagaactaagccttgaagcatagtgttgaatgttgtagaaaagtatactgtgacaaaaacagggcctggtgtcaagtgtcctcagtgatctggatatcatcacgccttgttagcaggatttacccgcatagtaatggccggactttatattgccctgctgcgctagctagtactgcgggggctctcttccccctattgatattccgggcagaatgcgcgggtagtcagcattcatgtcaggcttctatcaacgtctcattcacccttggagtgtgacctacgtgttagaggcaatgtagcccgagagcccgttcaaagacaaactcccgaattaaacagacaccggttatgggagtgtgagtagtgacttccgaccagtgtttggtttcagcctgtcggttaacctcgcagggctaggagaatgagctgctagtaggtgattaccgaagtctccccagaaagggaacagtcttatagagtagagaatgtcaaatagcgttattgagttctgtctactgcactaccaagagcatgcccaccagagatgcgtcgcagtcgtagcgtagacgtcgtaatgacccaggtggcgttcggcctattcgcgtcggacgcgcgcgctactacaacgaagggttctgaaagtgcatgttcacactgaaattctaagtgttagtaaacaaacgcgtgtattccagggtcgtgtgtgacattatggctgtctgcgcccctcaatgatcatcaagacgttcaattgtatgttaacgtagatatcaggtttagttatccgtatactttttacgccgcgcgcttggaacagattctcctaacagccctcgcggtttcaaaaagaaccaaagtctataccatccttgttcccaattctgcctggttgcggagaaaagaccgcctccatacgtacccgactcggtattggtaagtggggaagcagtcgaacgcatatttcttggttatatcacaggccacgttctatatcggaagtggccggattacgatttgacgttctatccccgagagcgcattcttgtttgttactactaccacgcgggcgcttcttattcccagaccagagggaatgtgcggaagctttttccacagattggcggaactccagcgtgcttagtgcaggcggagaacgtccgttcagtggtgcgtgctttatttttcaatctgacccgacctgcgctcaagggttgcaagttgttgtgcgcccgagtaataggcgactcgtcgcaatgggtctggtacattgcattttcatcggtacggcgcttcataaagtgcggcaaatttctcaccccagtactcatgtttatagggtatcaggacccgaagcttctctgttccaaagaaatgtactgtttggctcccctgtccatattggaggtagatcacttgtggattatgcaatgaatgaatgaaagtttggtgctccccaccggggcgctctcaaagagagtgagctaaatttgaacatttaaattgctattccaacccggagtcctgaccggaacagtaatgaaacttcaaccatgccggacagactagaagaagggaaagttgcttgtatatgggagtaaaaatgatgttggtgccgtaatggtgccggaagtgactatagagcatgtcgtgacgcaccggtaggcagtgctataatcgtatgtccttcaggcgccgccggacctacgaagctgaaattagacaccggcacactagccccgtcagcgacggtgcgcggccgctgccctgcagcgaatggggctaacacgcataaaacgcccgcataaccactcgagctacgggaattcactcaggctgttgcttcgacgtgtagtctcattacataatcataatacctccaagaccaacggctgctcatgactctcttaccttgttagggacatttcggcactagggaagagctgaggactttgaaaacgtcgataaaaccatcgcgggaactagctgcgttagaactccatattttacgggtcgcaagcttgaggtcctgtcccggcagctgcaagtgctacggcaggaggggatctacctaacgtgcagtaacgagcccctgcccgtaatgaggcgtactcgtctctaatcgtcagtaagttactatgtccgaggacgcctctacgagttgaactctggctaggcccacctgtccgcgccctgctcgggtaccccatctgcttatccaacttcacctcgccttacggaatctctggttgccagtcatccgatggtcattaagcagcgtggtacatcgtagccaatacttcagggcgccagccatattcccagccaagcggctgcataattacagcgcctggcacgactaatcgatcccacaagcctggtagatgacccttagccctaaagcgccctctgacctatctgcacgtgatacttgattatttgtaatgagcggacagggtagatgactaatatacagggtcgtctaggtttgcacaatgcagacatcatccgcgcaaggcccggacggctgtactcacacagctagctccatctccctcagcagcactaagattcccacgtgaccagggcgacgggcctcagccaaacgtatccttgatatctacttaagtcaaggttgactccgaaccctatgggtcggtgccgttaacagggagtctatatctcggcgttccattgcttgtttcaaactcctgctataaggtgaaagcgctggagggcatagtttatgcccaaagttgcgcgtagatccgtcgggatatgtgctataataaggactgctcgaggtaggcggtaacggctcccgccttcagtaggcgcggaactcgaatcggagttacaggacttgaccgagtcatatccaagtttatgttacccgatcggatccggatgctcgtatctgcgacgaggtcggaagacggacgaaatacgattcaaccgcgcgaaccattagcatctaacctttagcctcaatgggtgttaacgtggtgggctcactcggcgtactctttgtgcaactattccgtatgaacaacagtcaagttgcgacatgatgctcttacgtgattcccacagtttcccacctcaggatgctttctttagctaaacccaatagttatggcggcaccttcagactcccacgaggacggctatgacgttgctaaaccattcgccgccaaaggctagcgctaacgagttctgtgagtttgttccgggccagatctccaggatggtcgcaacaacgcagtaccggttttatactggtgaccctctacctgttattaagttacagcgttgtcctacgtacatggtcgtgagtactcgcgtagtcaaacgccaggactagcagcgagaattattgtcgcgatacttactacaatacttacccgatattgacgtgcagggttgaaagagatggacagttgaatatctattttgacggaatcctcaaaactccctccacctcaggtaacggccctgtccgggaccgcattcttgcatatattggttcccagagcgtatctaagttagtctcttgaccgttcaccgactctagggcgactcgttatcgccctccgaaacgatgctttcgttacctcaatgatgacaggctgtaacgtaagtgatcccaatctcactcgtgccttgtccaccgttccgtgaagacgaagcaatacgcggaatacgtggcttcgtaatattttgacgatatggggctgggacgctcaagacttccatgacaaacaaagtgaagagcaactgcatccctcatcatgatcactattaccagagtagcgatggataacgctaatttggtcagggcagctatcgcatcccgcaggtgtaggcggagactttttcttttgttgcgagttgacaggtaatctcacggtataagcacggttatttacgcaagcgacgtccctgggagaatccgcccacgtaggaccccataatccataaatactgcggtcgaaaccttcatatcgtgacagaaccgctttctagggatgcggtccccgcattcagagttctactttggccagcgtgagacttaacaactccacttacgcggtacattgaagtcgttcagtccagtgtgacctgtgtaccgaataacgtgtagaccagcgcgtctacgacttagcgcggctccactccaaagcaccttttgggactttccaacgagcctgttggccgttaagcggtatttcacaaatagatcaccctagtgtcggtaaccgactaccctattgggatcatcgtgagctcgaaacactagaggcggaccaacggatgacatttgattcggctctacagagcttgtcgccagagaaaaactgtggcaatctacgctcgcggggaattgactttagcggcccctagacaggtgtgggacactagtctagattcacgtcctacacgacataacagcaccttcctggccagcccagaaatagtacctggacgacatccagccttccgacgccataatgtgagccgtagcgcccacgacgatcaacgaggagaaatttacaaaggctgtgtgaatgctacgtcgtctaccattgctcatcgaaacgaacgcaacgcacagcatacaacgtttaccatgccggagcgggatcctcaagtacagaaaacagaggtctaaacatgatccgaacaaatcggtaggtttacacagctacctcgtccattggcgtactgcatcgatcgtgcttactacggtcatgccggcccgcgatgcacgtacgaaggaataccctgtctgcccccgcgcgagttacgctgtctcgcacataccgagcactgtcgttcgaagctaaactatgagcccagccgagctccttatggccgcaacgctggtgcggccagctgataaattccacagtacacgatcctcgtgtaagatctcgggcatagtaagtcatttcacatggttaggagagatagaatacatggttctggtagctcaaccaggatttgtggaacccttggcccttggtgagtgctacaataaaattctccgtatgggacaaccaaagggtgctggatgtgacttcccggcccaggttagatgtccatatcattcatacattgcccgaccgacccaatgcctaaatcagaggcgccttagctagttcttgtagtgtgccacgtccggccacgcagacacgaccctcggcgagtgatcaccattaccggattggcatcgaagtctttttctgggaagttagccagtttggtgtgcggtgcttagaatcttattcccagtcaaacgcccctgggacgaattgctaaccctagttgccacgccggaaccatcttcgggagagtagacaaatccgagttagatatgttagcgtcttcgtgagtctgaaatgtatcacttcaccgcagaatacgcgaatgtctgtttgccctggactgacggaattggcttaaaagccgactagagcattttggtacggttcctatccgcgatgtaattacctatctaggttatcgctagacgaatagcgagtacagtgtagcaggccctttgttagcaagttgctctaaacagttgtcaaaacgtaggcacaatagtgcgattcttctaaatccgggaagctcatggcgctgggcagaaatatcacatacgggaataatcaacctccattttggttcgttttactcgatgagtgccccttgcttgagacgagcgttctgagttgatggcatgtcgaaaggtttacgcggtgagtagagcactttacccctacagatcggaatcctcgaggaggacagttggaacttcacattaacctttgttcgattgcatgaaggttgtgttctgggagtaggctcccaaggtagcggttcatgctgggggcagccctaagtttgtattatgtgagtttgcgtctgaaactacatttagcatgaggaacgtaagctttctggagggatcttctaaagccaggtatcgcccgctacgatgccggagccggtggttcacagctacctgtgctcaaaggcttaaggctaatcatagcaacagtgcgaaaggacgtctttcagatttcgaaaggtgctgacacaacaagggtcagggcggtcctacccttctgattccctacctggttttttagcaagggtcaaggctaggcttatactcccgaacgctttaaacactatcccacccctgacggggggaagttgcgcgttaagtataagaataagatttaacagtacactttaggttcctcttccgcgagccgtcatacagcaccgagcgccgttgaaacgcgattaacgcgtattgtcgtgcgaaaaaaaaacgctcgccagcatattggagtgtcgacttgaaatattgaacaacaccgcatatcaaggacgaatagtagggcttcactacctccacctgacggccctaggacttatactcgaaaaagaccttccatcacgatgtcccttaccggcgagagggctatatacgcatgaatagcagatcttgccgtcgctgagtgtcacccagggttgctccagaaaggagatagggcggagagccatcgacagcagctctcgtctaggtggtagcagctaaggagtcgtgtcgtcgcgccgagttggaacattatcgatgtacatcaatgcagtaatgatgctgatagactcgggagtttcctcaaacccagagttacgagaagacgcaggtctatcagttagaaggagtcagtattggcctttgaaagatcttatgctcatgcccaatcgtagttaaacgcgaatcgggaaggccaatctggcggttttgacccccggactcttaagacgtccaatgtggctagacataagtaacgaattactctataccgaggggcgggaaccggccaatttattacgagagcacgagagccttgtagcggccagcacactatcctcgagtccctctatcctgagacgtagatatacatatacgcctagagagaatagccgtctaggcttccgtcgccctctccgtcgttcgcgtgaaccgtaagtcttccgcattcccttcctcaagcgcgttggtgtgagagtggtattgaggcccagtcttataacgcatatacttgtgcactctattacttaccatgggaaccaatggcactctcgaatcatgctcacagctgagcaacggtgctgctcaccaattacatatgagtcgtggtttagcgttggagcggaagatgaatttccatctgttcgcgcgcatcactaaccaatatacggttatcccagcgctatctagttctgaccgggttggtagcgaacccttttgcaagccggcttagtggatgtgaagtgggagtgataacttaagccgccacgttcgggggggactcgtttatattggtgctggaatacgaacggcgtgattcgtagtcgccctaatcgggcgcgacaacacatgtagtactgtcgaggcggtttaaacccacagtaggtactctatcagcagaattatgctagaagtttcacaacaactttccgcatgaggctcagcggcagcgtcgcactcccaatggccagtgccggtagcgatgtttggtggaattagttccttcggaatacgaaccggatttaaagagcctcggagaacctaaacgaatccgtacgcatcttgcccaaggtgctgagccttgtcgcctttctcagttccacctacattaatgcaatgcgttcgaagctctgaccgcaaacaggaatcaagttcagacagagtgcaagagtttcgcaataattgggaacgacccacttgatataggtgcttttagagatgtgtgtacgaccgtccttcgagcatacctacgggttacaattgctccggtaagtcaaggcacatagaaaacatagccaactgagagtgtatacaagattacctcatgtagactgaaatacacacatcgctttaagctctcaaccgatgtagaacagattttgggcggcgttgacagcgtgcccgctcaccggtttgctcccttctcaccaaataaccatgagacgactttggtgactggactgccagatgacgggctacaaccgttttggttccgaattcgctctaactcaactaacatcatactatatgcgccaggatattctcgcggttggacccccctgccaattcgggttaaaaccactccccccatgtagggagctgccgcaattacaatatcgacgatcccagatggacgctcacaaaatatcagtcctttcacgatccgctcatatagacggatgaagggactgaggctgttagatagtgacgtcgagcatggcgtagacgagcgcaaccgggtcgaggcccgcattaccgtgacacccagttgaaaggatttacactgcttcattcgatatttaccactttgtatgaggagctcaacctaagtcaacacggaccatcatacaggtcgccagtaatgagaaggctgctgtgccatggagaagcgctgctacagcacacaacgaacatcttgcaatgtgaaggagggtgctcttttgggatgagcctacggggatgtgtatccctgccctgtaggcagttgggacttagcgcgactatctagataactaaggcgccagccgcggctgtttgccgaagtcgtgctgatgctgtacaacgaagggcgagcgtgttaacatgctacacgttgacctagactagtccaagtctgaaagtcccaatttaggtcgggtagtacagtcctcggttccagtcccatgttgtgccgacaaggacaagcgatcatcaaatcgactgaaattgaatcagctacctcagaccacattcagctctcggtaacatgggaggcttgtggttgcaccgtaaaagggggatagcccatccatcctgtaaacctacaatcgcgcgtagcttaatacgctcacattagacattcgatcgagagacctggtttcaagagccttcccttttgctttagtgggccaaatcgcaaccctgctcccctcccttacgccttatacacttcagtgcaaattcatgcgttcagcgaacaactggacttctgttgtacgtagtccacgggggcttattcattatagaaagccccctactgtcaccgttatatggttcacacatgagctgatcacctagagagtcgtcatgcacattcgcctaacaaggacatatgagtaaccgggaggggatatcttcgatttgcagcaccaatcgacgttgtactggtctattgtcggttaggtccgattatccgaccggcaatgaggcaagcccatctattcaggaaacttaggcagttccctgtgctggcccgacgtcgatgagttaagtctatacaggccggccgcgagtagttaacgagaccaacatagaactatcatactagccggcaatgatcaatagggtcttagtgccactgtccttcgagccctcgcctaatttagcgcgaccggtttcctattggcctgtggggttgcgggcgcgtccgctttaagaatggtccttaacacctacccggagatccattgcatagcacactctccccattagcctagacacgtcgtcgcccgtcgactttggctggaatttaatcgccggggatatcgaactttcacgccctttaacgacgaggaaacctaccgtcgcctggctggtaaatgggtgccttacggggactcacgatgctgtgaaccgcccgccagtctctggggctcccaaaatccaggttggaattacggacctccgccggtactacgcattacggggtggaaagtcctaagataggtgaatgaaagggcttcgctaaaccagtaagtcattaacaggacatcggcgtcacgtctcgcgggtttacacggcgcacaaatcctattcccatgataaacaccttatgccaatccacatccctcgctgcctaataaaattgtcacacctgcgctactgactaacgtttacgcaatgagagatgaattccgacacccacgcttgttgcaagcacagccgtatgggttctcgggtaaggtaacacgaggcacactccggcgcggccacttcggcccctccctgacgatgaccctcattggtcaagcatcagtcgaatgattcgtaacaaggagcaaccgactcagtagagagggtgaatctcacgcgctagcctgaggaccgcctaagtgcttgctgtgcgtcgcggcagtcgcgaggtgcgggctaaagtaaataattactggtcttacctaattaaagttggtggttagggacaacgttaccactaccagggtgcgcccctgaattcgggtatcggactatccagggcgccttttgcggccttaaatacctttttaatcacgctggagctagaaggccatcgggatagacggggttctaggtactcgaaaaaacaggcctaataactttattgcgcttggactaacctatgtacaacacgttgtagcatactatggaatgttactgacctacacggatagcatttgttcgggagcgtcattgacctcccagaccctatgccgatctgcaccattcagtgaccatccacaagtctctaggtttagccaaaggtgacaggtcaagcacttgcgcatgtccactagtcgattatgcaacgtctctgaacagttagcacttatctcccgccgtgtgactcacgcagtgaacttacctatagcatacgcctactattgaatgttcgttgttctaacacagcgctaatacctcactggcagaggtgcgcacgctcctagtatgggagggagtcaggtcagagtgtatgagactgatttttattcccgataggggttcagtgaaatcgacctctcaaaagagaggcgcagaattcgctgataagctctgctacgatcgctaaggcacgataagcagggcggtgaaggttggagcaagataatatcacccggacgcgggtcctgtcgcaacgagcggccgtgagacctggtgcgcaccgtgtctcgatcggccgaatatcggaacccactgcgtgactcaaatgatatttttgctatctgtgggggatttatgtcccggtagaactctgcttctagcagaggataaactttacaaggacggcgaatatggtgtcagagcgccctaatgatcccgtgctattccgcgggccaccggccgttaatggacttcgggttagaaggatgggttattcatcttccacagaaacgcccagccgcaatcgtgggtttactcgaccgcggttatctgcctacttagctgcattcctaaaacaggattaaaaaggccgcgagggttgcgaacctatggttgagaacagagtcatagagtcagatgcgcagggacggcacggatccacatggcagttaactaatattaatacccccttagcctcgtatatgggcgtgtgcagtcttgtccactcgcggacgcgtatccgagcgattctgtcttccaacgctattcgttaccactttggcacctctttgctaagcaggatgagaacatctcactcactacgagccttgactttcagcacgcggtacgagggcactgggcttctcgtcctttgctagatgtaggtgccttcccgccctcatgacgatgtcacgtctatcggtttattaaggtcggggaccattacgagattaccccgcgaccttcgtccaaatgggatcacggcaacgttccacgaggggcgcgttgcctgagccactcgggtatccccttccgatatccgcagaagtctagctaggagcaccgccaagcattacccgattaagcaaagcctactcatcgcatacacggttcttggggtttgcgtcagatagcaacttccggcggcagtagagatgatattttatccgattgagcttgcccagcgcaccctcgggccccgtggctcttctcttaaatgtgccctgcacgatgttagcggttcctactcctccccgagccctatgggtggacagactcgccctctgaggctgcgtgttcaactggttccaagtccggcgcctgtggatctacgacgcgaccagcaacattataccaatgtctaggcttagctcgaaaactagtaagccttagaactagggtcgtagcttcttctaaatgaagggcagcgtcatagccatccacgttagcgcttactcaatcgcctgtcggctgtcatgttaccgctgccgtaagttcgtgaacataaaatacaacacattttaggtttaacaaggattgtttaccgccacgtactggtgccggtagtgaaacgaaaaacctcagcatcgggaggaggagaacggaatccctaccaatcttatctctacttaaagaacaaagcgcgcggtacatggcgcagacgagaatgaatccccgaacgggccgagttagactcctcaacctgtcgaaaagttgcgatccgctagatcgtagagtacggacttaaaaaagaaaagaaggtctctacccgagcggtgagcccaaccagttccaggttgctgccggattcttccacacggcggtgccatatggacgaccccgtactttgggcattctaggctacctactgcgaacgcctcgcgttcatgcgcaaagttttctctagataggcgcgctttggtaagcatagtaataggttcttcagcgtctaaagcccgcccattaggcctggcgactctgctttagtggtaaagagatagcatcgatgtacatcgatggagagagtattttcacgaaagtgcgcgccgtacactatttatcggcatgcgcgctaaactggagggtctaataaccagatcacgcaacgaggtcccatgtacggttcgcattgcgaaagtatgggatactagaggttttatcgggcctcgcttgaggtctgtctgggactggcgcacatcgctcgtcgcccagtcgatagcggggtgattaaataagaaatatgttagtgcccggatttggaaccaaccagtcccggtagcggtacaaaaagcctttcctgctagttctatgcttaaagcgtactcctgttacaatccgtaggcaacctgaagaggcaacctggttttcctttatttcgactttgtttgccatttccaatgtgatactgtgcggcgaccttaatgctttttggtaaaaccataccgagatccagcgcacgcgacattcagaccggtcccggtttggcggtcaacctcgtactctgcactgttcagctagaggggtctcctatcccgaggtaccggtcgtctaacgggtggttacaggggctggtcctactctaccaacagttaaggagggcaacaagttcgatggggcatcgtataacttgaatgccattggacaaataataattgctccacgtcccaaacctcaactgaccttgtacgcataggtgccacctgcacgcaaccgagctcgttcaagtgtccttcttagctggcgccgagtgaacctgcatctgagagtctacccaacgatctagtatcataatgtctgtagccagcgactatgacacttagagagccgcctaagaaagtgtttgcggctcctgccccggtgcgcttgttcggtgggaggtcgttatatagaaccatggggatataatgaatggtaacatatctgccacgttgacaagccgctattatgaattcagggttggatactattatggcccttcacggtcacttgtaggacggccccaaacaggattagtaaagtcggtggtctaagtgtaagcgataggcaaactgcggttattcgcgtagaccgcttgatgatgtaaaataacagttttcatgtctttgcaattac", "start": 0, - "uniqueId": "ctgA 0-20000", + "uniqueId": "ctgA-0-20000", }, ] `; diff --git a/products/jbrowse-web/src/tests/GCContent.test.tsx b/products/jbrowse-web/src/tests/GCContent.test.tsx index 440e2db1a2..e472a723a7 100644 --- a/products/jbrowse-web/src/tests/GCContent.test.tsx +++ b/products/jbrowse-web/src/tests/GCContent.test.tsx @@ -25,6 +25,6 @@ test('gccontent', async () => { const { view } = await createView() view.setNewView(0.465, 85055) await user.click(await screen.findByTestId(hts('volvox_gc'), ...opts)) - const f1 = within(await screen.findByTestId(/wiggle-rendering/)) + const f1 = within(await screen.findByTestId('wiggle-rendering-test', ...opts)) expectCanvasMatch(await f1.findByTestId(pv('39433..39804-0'), ...opts)) }, 50000) diff --git a/yarn.lock b/yarn.lock index 93e1777c49..23c6837b35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15798,11 +15798,16 @@ typescript-eslint@^8.0.1: "@typescript-eslint/parser" "8.15.0" "@typescript-eslint/utils" "8.15.0" -"typescript@>=3 < 6", typescript@^5.1.3, typescript@^5.4.3, typescript@^5.5.0: +"typescript@>=3 < 6", typescript@^5.1.3, typescript@^5.4.3: version "5.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +typescript@~5.6.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + uglify-js@^3.1.4: version "3.19.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"