igv 2.15.2 → 2.15.4

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/igv.js CHANGED
@@ -18366,7 +18366,7 @@
18366
18366
 
18367
18367
  function getScopeForURL(url) {
18368
18368
  if (isGoogleDriveURL(url)) {
18369
- return "https://www.googleapis.com/auth/drive.file"
18369
+ return "https://www.googleapis.com/auth/drive.readonly"
18370
18370
  } else if (isGoogleStorageURL(url)) {
18371
18371
  return "https://www.googleapis.com/auth/devstorage.read_only"
18372
18372
  } else {
@@ -18395,7 +18395,8 @@
18395
18395
  const response = await fetch(endPoint);
18396
18396
  let json = await response.json();
18397
18397
  if (json.error && json.error.code === 404) {
18398
- const access_token = await getAccessToken("https://www.googleapis.com/auth/drive.readonly");
18398
+ let scope = "https://www.googleapis.com/auth/drive.readonly";
18399
+ const access_token = await getAccessToken(scope);
18399
18400
  if (access_token) {
18400
18401
  const response = await fetch(endPoint, {
18401
18402
  headers: {
@@ -18876,29 +18877,41 @@
18876
18877
  this.oauth.setToken(token, host);
18877
18878
  }
18878
18879
 
18880
+ /**
18881
+ * Return an oauth token for the URL if we have one. This method does not force sign-in, and the token may
18882
+ * or may not be valid. Sign-in is triggered on request failure.
18883
+ * *
18884
+ * @param url
18885
+ * @returns {*}
18886
+ */
18879
18887
  getOauthToken(url) {
18880
18888
 
18881
18889
  // Google is the default provider, don't try to parse host for google URLs
18882
18890
  const host = isGoogleURL(url) ?
18883
18891
  undefined :
18884
18892
  parseUri(url).host;
18893
+
18894
+ // First check the explicit settings (i.e. token set through the API)
18885
18895
  let token = this.oauth.getToken(host);
18886
18896
  if (token) {
18887
18897
  return token
18888
18898
  } else if (host === undefined) {
18899
+ // Now try Google oauth tokens previously obtained. This will return undefined if google oauth is not
18900
+ // configured.
18889
18901
  const googleToken = getCurrentGoogleAccessToken();
18890
18902
  if (googleToken && googleToken.expires_at > Date.now()) {
18891
18903
  return googleToken.access_token
18892
18904
  }
18893
18905
  }
18894
18906
  }
18895
-
18896
18907
  }
18897
18908
 
18898
18909
  function isGoogleStorageSigned(url) {
18899
18910
  return url.indexOf("X-Goog-Signature") > -1
18900
18911
  }
18901
18912
 
18913
+
18914
+
18902
18915
  /**
18903
18916
  * Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
18904
18917
  * a token is required, that is until we've tried the url and received a 401, 403, or 404.
@@ -23937,7 +23950,7 @@
23937
23950
  }
23938
23951
  };
23939
23952
 
23940
- const _version = "2.15.2";
23953
+ const _version = "2.15.4";
23941
23954
  function version() {
23942
23955
  return _version
23943
23956
  }
@@ -23989,7 +24002,7 @@
23989
24002
 
23990
24003
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
23991
24004
  if (cytobandUrl) {
23992
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24005
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
23993
24006
  }
23994
24007
 
23995
24008
  return genome
@@ -24091,7 +24104,7 @@
24091
24104
  this.sequence = sequence;
24092
24105
  this.chromosomeNames = sequence.chromosomeNames;
24093
24106
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24094
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24107
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24095
24108
 
24096
24109
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24097
24110
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24295,6 +24308,40 @@
24295
24308
  chr = this.getChromosomeName(chr);
24296
24309
  return this.sequence.getSequence(chr, start, end)
24297
24310
  }
24311
+
24312
+ addFeaturesToDB(featureList, config) {
24313
+
24314
+ const insertFeature = (name, feature) => {
24315
+ const current = this.featureDB.get(name);
24316
+ if (current) {
24317
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24318
+
24319
+ }
24320
+ this.featureDB.set(name, feature);
24321
+ };
24322
+
24323
+ for (let feature of featureList) {
24324
+ if (feature.name) {
24325
+ insertFeature(feature.name.toUpperCase(), feature);
24326
+ }
24327
+ if (feature.gene && feature.gene.name) {
24328
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24329
+ }
24330
+
24331
+ if (config.searchableFields) {
24332
+ for (let f of config.searchableFields) {
24333
+ const value = feature.getAttributeValue(f);
24334
+ if (value) {
24335
+ if (value.indexOf(" ") > 0) {
24336
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24337
+ } else {
24338
+ insertFeature(value.toUpperCase(), feature);
24339
+ }
24340
+ }
24341
+ }
24342
+ }
24343
+ }
24344
+ }
24298
24345
  }
24299
24346
 
24300
24347
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27022,8 +27069,6 @@
27022
27069
  * THE SOFTWARE.
27023
27070
  */
27024
27071
 
27025
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27026
-
27027
27072
  const fixColor = (colorString) => {
27028
27073
  if (isString$2(colorString)) {
27029
27074
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27042,6 +27087,15 @@
27042
27087
  */
27043
27088
  class TrackBase {
27044
27089
 
27090
+ static defaults = {
27091
+ height: 50,
27092
+ color: 'rgb(0, 0, 150)',
27093
+ altColor: 'rgb(0, 0, 150)',
27094
+ autoHeight: false,
27095
+ visibilityWindow: undefined,
27096
+ supportHiDPI: true
27097
+ }
27098
+
27045
27099
  constructor(config, browser) {
27046
27100
  this.browser = browser;
27047
27101
  this.init(config);
@@ -27055,15 +27109,25 @@
27055
27109
  */
27056
27110
  init(config) {
27057
27111
 
27112
+ this.config = config;
27113
+
27058
27114
  if (config.displayMode) {
27059
27115
  config.displayMode = config.displayMode.toUpperCase();
27060
27116
  }
27061
27117
 
27062
- this.config = config;
27063
- this.url = config.url;
27064
- this.type = config.type;
27065
-
27066
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27118
+ // Set default properties
27119
+ const defaults = Object.assign({}, TrackBase.defaults);
27120
+ if(this.constructor.defaults) {
27121
+ for(let key of Object.keys(this.constructor.defaults)) {
27122
+ defaults[key] = this.constructor.defaults[key];
27123
+ }
27124
+ }
27125
+ for(let key of Object.keys(defaults)) {
27126
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27127
+ if(key === 'color' || key === 'altColor') {
27128
+ this[key] = fixColor(this[key]);
27129
+ }
27130
+ }
27067
27131
 
27068
27132
  if (config.name || config.label) {
27069
27133
  this.name = config.name || config.label;
@@ -27073,29 +27137,15 @@
27073
27137
  this.name = getFilename$2(config.url);
27074
27138
  }
27075
27139
 
27140
+ this.url = config.url;
27141
+ if(this.config.type) this.type = this.config.type;
27076
27142
  this.id = this.config.id === undefined ? this.name : this.config.id;
27077
-
27078
27143
  this.order = config.order;
27079
-
27080
- if (config.color) this.color = fixColor(config.color);
27081
- if (config.altColor) this.altColor = fixColor(config.altColor);
27082
- if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
27083
- this.defaultColor = "rgb(155,20,20)";
27084
- } else {
27085
- this.defaultColor = "rgb(0,0,150)";
27086
- }
27087
-
27088
27144
  this.autoscaleGroup = config.autoscaleGroup;
27089
-
27090
27145
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27091
-
27092
- this.height = config.height || 100;
27093
- this.autoHeight = config.autoHeight;
27094
27146
  this.minHeight = config.minHeight || Math.min(25, this.height);
27095
27147
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27096
27148
 
27097
- this.visibilityWindow = config.visibilityWindow;
27098
-
27099
27149
  if (config.onclick) {
27100
27150
  this.onclick = config.onclick;
27101
27151
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27152,17 +27202,18 @@
27152
27202
  }
27153
27203
 
27154
27204
  /**
27155
- * Default implementation -- update config with current values.
27156
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27157
- * current state. Only simple properties (string, number, boolean) are updated.
27205
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27206
+ * are saved.
27158
27207
  */
27159
27208
  getState() {
27160
27209
 
27210
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27211
+
27161
27212
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27162
27213
  // function properties are transient as they cannot be saved in json
27163
27214
  const state = {};
27164
27215
  for (let key of Object.keys(this.config)) {
27165
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27216
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27166
27217
  state[key] = this.config[key];
27167
27218
  }
27168
27219
  }
@@ -27176,8 +27227,18 @@
27176
27227
  }
27177
27228
  }
27178
27229
 
27179
- if (this.color) state.color = this.color;
27180
- if (this.altColor) state.altColor = this.altColor;
27230
+ // If user has changed other properties from defaults update state.
27231
+ const defs = TrackBase.defaults;
27232
+ if (this.constructor.defaults) {
27233
+ for (let key of Object.keys(this.constructor.defaults)) {
27234
+ defs[key] = this.constructor.defaults[key];
27235
+ }
27236
+ }
27237
+ for (let key of Object.keys(defs)) {
27238
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27239
+ state[key] = this[key];
27240
+ }
27241
+ }
27181
27242
 
27182
27243
  // Flatten dataRange if present
27183
27244
  if (!this.autoscale && this.dataRange) {
@@ -27185,22 +27246,6 @@
27185
27246
  state.max = this.dataRange.max;
27186
27247
  }
27187
27248
 
27188
-
27189
- // Check for non-json-if-yable properties. Perhaps we should test what can be saved.
27190
- for (let key of Object.keys(state)) {
27191
- const value = state[key];
27192
- if (typeof value === 'function') {
27193
- throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
27194
- }
27195
- if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
27196
- const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
27197
- throw Error(str)
27198
- }
27199
- if (value instanceof Promise) {
27200
- throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
27201
- }
27202
- }
27203
-
27204
27249
  return state
27205
27250
  }
27206
27251
 
@@ -27496,7 +27541,7 @@
27496
27541
  * @returns {*|string|string}
27497
27542
  */
27498
27543
  getColorForFeature(f) {
27499
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27544
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27500
27545
  }
27501
27546
 
27502
27547
  /**
@@ -31900,6 +31945,7 @@
31900
31945
 
31901
31946
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31902
31947
 
31948
+ this.queryable = config.queryable === true; // False by default, unless explicitly set
31903
31949
  if (config.reader) {
31904
31950
  // Explicit reader implementation
31905
31951
  this.reader = config.reader;
@@ -31933,6 +31979,11 @@
31933
31979
  this.queryable = true;
31934
31980
  } else ;
31935
31981
  }
31982
+
31983
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
31984
+ // feature source. queryable => features loaded on demand (by query)
31985
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
31986
+
31936
31987
  }
31937
31988
 
31938
31989
  async defaultVisibilityWindow() {
@@ -32073,39 +32124,13 @@
32073
32124
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32074
32125
 
32075
32126
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32076
- if (this.config.searchable || this.config.searchableFields) {
32077
- this.addFeaturesToDB(features);
32127
+ if (this.searchable) {
32128
+ this.genome.addFeaturesToDB(features, this.config);
32078
32129
  }
32079
32130
  } else {
32080
32131
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32081
32132
  }
32082
32133
  }
32083
-
32084
- addFeaturesToDB(featureList) {
32085
- for (let feature of featureList) {
32086
- if (feature.name) {
32087
- this.genome.featureDB[feature.name.toUpperCase()] = feature;
32088
- }
32089
- if (feature.gene && feature.gene.name) {
32090
- this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
32091
- }
32092
-
32093
- if (this.config.searchableFields) {
32094
- for (let f of this.config.searchableFields) {
32095
- const value = feature.getAttributeValue(f);
32096
- if (value) {
32097
- if (value.indexOf(" ") > 0) {
32098
- this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
32099
- this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
32100
- } else {
32101
- this.genome.featureDB[value.toUpperCase()] = feature;
32102
- }
32103
- }
32104
- }
32105
- }
32106
- }
32107
- }
32108
-
32109
32134
  }
32110
32135
 
32111
32136
  /*
@@ -32921,7 +32946,8 @@
32921
32946
 
32922
32947
  const binaryParser = new BinaryParser(data);
32923
32948
  const chromId = binaryParser.getInt();
32924
- let chromStart = binaryParser.getInt();
32949
+ const blockStart = binaryParser.getInt();
32950
+ let chromStart = blockStart;
32925
32951
  let chromEnd = binaryParser.getInt();
32926
32952
  const itemStep = binaryParser.getInt();
32927
32953
  const itemSpan = binaryParser.getInt();
@@ -32931,6 +32957,7 @@
32931
32957
 
32932
32958
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32933
32959
 
32960
+ let idx = 0;
32934
32961
  while (itemCount-- > 0) {
32935
32962
  let value;
32936
32963
  switch (type) {
@@ -32946,8 +32973,9 @@
32946
32973
  break
32947
32974
  case 3: // Fixed step
32948
32975
  value = binaryParser.getFloat();
32976
+ chromStart = blockStart + idx * itemStep;
32949
32977
  chromEnd = chromStart + itemSpan;
32950
- chromStart += itemStep;
32978
+ idx++;
32951
32979
  break
32952
32980
  }
32953
32981
 
@@ -32957,8 +32985,8 @@
32957
32985
  if (Number.isFinite(value)) {
32958
32986
  const chr = chrDict[chromId];
32959
32987
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32960
-
32961
32988
  }
32989
+
32962
32990
  }
32963
32991
  }
32964
32992
  }
@@ -33094,6 +33122,7 @@
33094
33122
  this.genome = genome;
33095
33123
  this.format = config.format || "bigwig";
33096
33124
  this.wgValues = {};
33125
+ this.queryable = true;
33097
33126
  }
33098
33127
 
33099
33128
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33635,6 +33664,7 @@
33635
33664
  this.genome = genome;
33636
33665
  this.windowFunction = config.windowFunction || "mean";
33637
33666
  this.reader = new TDFReader(config, genome);
33667
+ this.queryable = true;
33638
33668
  }
33639
33669
 
33640
33670
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33844,8 +33874,8 @@
33844
33874
  this.config = config;
33845
33875
  this.genome = genome;
33846
33876
  this.queryable = false;
33877
+ this.searchable = config.searchable !== false; // searchable by default
33847
33878
  this.updateFeatures(config.features);
33848
-
33849
33879
  }
33850
33880
 
33851
33881
  updateFeatures(features) {
@@ -33855,6 +33885,10 @@
33855
33885
  mapProperties(features, this.config.mappings);
33856
33886
  }
33857
33887
  this.featureCache = new FeatureCache$1(features, this.genome);
33888
+
33889
+ if (this.searchable || this.config.searchableFields) {
33890
+ this.genome.addFeaturesToDB(features, this.config);
33891
+ }
33858
33892
  }
33859
33893
 
33860
33894
  /**
@@ -40048,8 +40082,8 @@
40048
40082
 
40049
40083
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40050
40084
  // this default will be used.
40051
- ctx.fillStyle = this.defaultColor;
40052
- ctx.strokeStyle = this.defaultColor;
40085
+ ctx.fillStyle = this.color;
40086
+ ctx.strokeStyle = this.color;
40053
40087
 
40054
40088
  const color = this.getColorForFeature(feature);
40055
40089
  ctx.fillStyle = color;
@@ -40373,6 +40407,17 @@
40373
40407
 
40374
40408
  class FeatureTrack extends TrackBase {
40375
40409
 
40410
+ static defaults = {
40411
+ type: "annotation",
40412
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40413
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40414
+ margin: 10,
40415
+ featureHeight: 14,
40416
+ autoHeight: false,
40417
+ useScore: false
40418
+ }
40419
+
40420
+
40376
40421
  constructor(config, browser) {
40377
40422
  super(config, browser);
40378
40423
  }
@@ -40380,12 +40425,8 @@
40380
40425
  init(config) {
40381
40426
  super.init(config);
40382
40427
 
40383
- this.type = config.type || "annotation";
40384
40428
 
40385
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40386
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40387
-
40388
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40429
+ // Obscure option, not common or supoorted, included for backward compatibility
40389
40430
  this.labelDisplayMode = config.labelDisplayMode;
40390
40431
 
40391
40432
  if (config._featureSource) {
@@ -40397,12 +40438,6 @@
40397
40438
  FeatureSource(config, this.browser.genome);
40398
40439
  }
40399
40440
 
40400
- // Set default heights
40401
- this.autoHeight = config.autoHeight;
40402
- this.margin = config.margin === undefined ? 10 : config.margin;
40403
-
40404
- this.featureHeight = config.featureHeight || 14;
40405
-
40406
40441
  if ("FusionJuncSpan" === config.type) {
40407
40442
  this.render = config.render || renderFusionJuncSpan;
40408
40443
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40439,9 +40474,6 @@
40439
40474
  }
40440
40475
  }
40441
40476
  }
40442
-
40443
- //UCSC useScore option
40444
- this.useScore = config.useScore;
40445
40477
  }
40446
40478
 
40447
40479
  async postInit() {
@@ -40805,7 +40837,7 @@
40805
40837
  } else if (feature.color) {
40806
40838
  color = feature.color; // Explicit color for feature
40807
40839
  } else {
40808
- color = this.defaultColor; // Track default
40840
+ color = this.color; // Track default
40809
40841
  }
40810
40842
 
40811
40843
  if (feature.alpha && feature.alpha !== 1) {
@@ -40871,21 +40903,27 @@
40871
40903
 
40872
40904
  this.browser = config.browser;
40873
40905
 
40874
- this.container = domUtils.div({ class: 'igv-roi-table' });
40906
+ this.columnFormat = config.columnFormat;
40875
40907
 
40876
- config.parent.appendChild(this.container);
40908
+ this.tableRowSelectionList = [];
40877
40909
 
40878
- this.headerDOM = config;
40910
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40911
+ // if(config.width) {
40912
+ // let [ w ] = config.width.split('px')
40913
+ // w = parseInt(w, 10)
40914
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40915
+ //
40916
+ // }
40879
40917
 
40880
- this.columnTitleDOM = config.columnFormat;
40918
+ config.parent.appendChild(this.tableDOM);
40881
40919
 
40882
- this.rowContainerDOM = this.container;
40920
+ this.headerDOM = config;
40883
40921
 
40884
- this.footerDOM = config.gotoButtonHandler;
40922
+ this.tableColumnTitles = this.tableDOM;
40885
40923
 
40886
- this.columnFormat = config.columnFormat;
40924
+ this.tableRowContainer = this.tableDOM;
40887
40925
 
40888
- this.tableRowSelectionList = [];
40926
+ this.footerDOM = config.gotoButtonHandler;
40889
40927
 
40890
40928
  }
40891
40929
 
@@ -40893,12 +40931,12 @@
40893
40931
 
40894
40932
  // header
40895
40933
  const dom = domUtils.div();
40896
- this.container.appendChild(dom);
40934
+ this.tableDOM.appendChild(dom);
40897
40935
 
40898
40936
  // header title
40899
40937
  const div = domUtils.div();
40900
40938
  dom.appendChild(div);
40901
- div.innerText = headerTitle;
40939
+ div.innerHTML = headerTitle;
40902
40940
 
40903
40941
  // table dismiss button
40904
40942
  const dismiss = domUtils.div();
@@ -40917,46 +40955,51 @@
40917
40955
  const { y:y_root } = browser.root.getBoundingClientRect();
40918
40956
  const { y:y_parent } = parent.getBoundingClientRect();
40919
40957
  const constraint = -(y_parent - y_root);
40920
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40958
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40921
40959
 
40922
- this.container.style.display = 'none';
40960
+ this.tableDOM.style.display = 'none';
40923
40961
 
40924
40962
  this._headerDOM = dom;
40925
40963
 
40926
40964
  }
40927
40965
 
40928
- set columnTitleDOM(columnFormat) {
40966
+ set tableColumnTitles(tableDOM) {
40929
40967
 
40930
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40931
- this.container.appendChild(dom);
40968
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40969
+ tableDOM.appendChild(tblColumnTitles);
40932
40970
 
40933
- for (const { label, width } of columnFormat) {
40971
+ for (const { label, width } of this.columnFormat) {
40934
40972
  const col = domUtils.div();
40935
- dom.appendChild(col);
40973
+ tblColumnTitles.appendChild(col);
40936
40974
  col.style.width = width;
40937
40975
  col.innerText = label;
40938
40976
  }
40939
40977
 
40978
+ this._tableColumnTitlesDOM = tblColumnTitles;
40979
+
40980
+ }
40981
+
40982
+ get tableColumnTitles() {
40983
+ return this._tableColumnTitlesDOM
40940
40984
  }
40941
40985
 
40942
- set rowContainerDOM(container) {
40986
+ set tableRowContainer(container) {
40943
40987
 
40944
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40945
- container.appendChild(dom);
40988
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
40989
+ container.appendChild(tblRowContainer);
40946
40990
 
40947
- dom.style.minWidth = this.config.width;
40991
+ this._tableRowContainerDOM = tblRowContainer;
40948
40992
 
40949
- this._rowContainerDOM = dom;
40950
40993
  }
40951
40994
 
40952
- get rowContainerDOM() {
40953
- return this._rowContainerDOM
40995
+ get tableRowContainer() {
40996
+ return this._tableRowContainerDOM
40954
40997
  }
40955
40998
 
40956
40999
  set footerDOM(gotoButtonHandler) {
40957
41000
 
40958
41001
  const dom = domUtils.div();
40959
- this.container.appendChild(dom);
41002
+ this.tableDOM.appendChild(dom);
40960
41003
 
40961
41004
  // Go To Button
40962
41005
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -40998,7 +41041,7 @@
40998
41041
  }
40999
41042
 
41000
41043
  clearTable() {
41001
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41044
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
41002
41045
  for (let el of elements) {
41003
41046
  el.remove();
41004
41047
  }
@@ -41010,23 +41053,23 @@
41010
41053
  }
41011
41054
 
41012
41055
  present() {
41013
- this.container.style.left = `${ 0 }px`;
41056
+ this.tableDOM.style.left = `${ 0 }px`;
41014
41057
 
41015
41058
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41016
41059
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41017
41060
 
41018
- this.container.style.top = `${ y_root - y_parent }px`;
41019
- this.container.style.display = 'flex';
41061
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41062
+ this.tableDOM.style.display = 'flex';
41020
41063
  }
41021
41064
 
41022
41065
  dismiss() {
41023
- this.container.style.display = 'none';
41066
+ this.tableDOM.style.display = 'none';
41024
41067
  }
41025
41068
 
41026
41069
  dispose() {
41027
41070
 
41028
- this.container.innerHTML = '';
41029
- this.container.remove();
41071
+ this.tableDOM.innerHTML = '';
41072
+ this.tableDOM.remove();
41030
41073
 
41031
41074
  for (const key of Object.keys(this)) {
41032
41075
  this[key] = undefined;
@@ -41042,41 +41085,35 @@
41042
41085
 
41043
41086
  constructor(config) {
41044
41087
 
41045
- const cooked = Object.assign({ 'width':'1040px' }, config);
41088
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41046
41089
  super(cooked);
41047
41090
 
41048
41091
  this.descriptionDOM = config;
41049
41092
 
41050
41093
  }
41051
41094
 
41052
-
41053
- set columnTitleDOM(columnFormat) {
41054
-
41055
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
41056
- this.container.appendChild(dom);
41057
-
41058
- for (const format of columnFormat) {
41059
- const col = domUtils.div();
41060
- dom.appendChild(col);
41061
- col.style.width = format.width || 'fit-content';
41062
- col.innerText = format.label;
41063
- }
41064
-
41065
- }
41066
-
41067
41095
  set descriptionDOM(config) {
41068
41096
 
41069
41097
  if (config.description) {
41070
41098
 
41071
41099
  let dom;
41072
41100
 
41073
- const found = this.container.querySelector('.igv-roi-table-column-titles');
41101
+ // BLAT result for query sequence
41074
41102
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41075
- this.container.insertBefore(dom, found);
41103
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41104
+ dom.style.height = 'auto';
41105
+ dom.innerHTML = `BLAT result for query sequence:`;
41106
+
41107
+ // CTAATCAtctacactggtttctactg ...
41108
+ dom = domUtils.div({ class: 'igv-roi-table-description' });
41109
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41110
+ dom.style.height = 'auto';
41111
+ dom.style.maxHeight = '128px';
41076
41112
  dom.innerHTML = config.description;
41077
41113
 
41114
+ // Select one or more rows ...
41078
41115
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41079
- this.container.insertBefore(dom, found);
41116
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41080
41117
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41081
41118
 
41082
41119
  }
@@ -41106,13 +41143,13 @@
41106
41143
 
41107
41144
  renderTable(records) {
41108
41145
 
41109
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41146
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41110
41147
 
41111
41148
  if (records.length > 0) {
41112
41149
 
41113
41150
  for (let record of records) {
41114
41151
  const row = this.tableRowDOM(record);
41115
- this.rowContainerDOM.appendChild(row);
41152
+ this.tableRowContainer.appendChild(row);
41116
41153
  }
41117
41154
 
41118
41155
  }
@@ -41160,7 +41197,7 @@
41160
41197
 
41161
41198
  event.stopPropagation();
41162
41199
 
41163
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41200
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41164
41201
 
41165
41202
  const loci = [];
41166
41203
  for (const row of selectedRows) {
@@ -41172,7 +41209,7 @@
41172
41209
  loci.push(`${ chr }:${ start }-${ end }`);
41173
41210
  }
41174
41211
 
41175
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41212
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41176
41213
  el.classList.remove('igv-roi-table-row-selected');
41177
41214
  }
41178
41215
 
@@ -41194,16 +41231,16 @@
41194
41231
  &output=json
41195
41232
  */
41196
41233
 
41197
-
41198
41234
  //const blatServer = "https://genome.ucsc.edu/cgi-bin/hgBlat"
41199
- const blatServer = "https://igv.org/services/blat.php";
41235
+ const defaultBlatServer = "https://igv.org/services/blatUCSC.php";
41236
+ //const blatServer = "http://localhost:8000/blatUCSC.php"
41200
41237
 
41201
41238
 
41202
- async function blat(userSeq, db) {
41239
+ async function blat({url, userSeq, db}) {
41203
41240
 
41204
- const url = `${blatServer}?userSeq=${userSeq}&type=DNA&db=${db}&output=json`;
41241
+ url = url || defaultBlatServer;
41205
41242
 
41206
- const results = await igvxhr.loadJson(url, {});
41243
+ const results = await postData(url, userSeq, db);
41207
41244
 
41208
41245
  results.fields;
41209
41246
 
@@ -41212,8 +41249,19 @@
41212
41249
  return features
41213
41250
  }
41214
41251
 
41215
- class BlatTrack extends FeatureTrack {
41252
+ async function postData(url = "", userSeq, db) {
41216
41253
 
41254
+ const data = new URLSearchParams();
41255
+ data.append("userSeq", userSeq);
41256
+ data.append("db", db);
41257
+
41258
+ const response = await fetch(url, { method: "post", body: data });
41259
+ return response.json(); // parses JSON response into native JavaScript objects
41260
+ }
41261
+
41262
+ const maxSequenceSize = 25000;
41263
+
41264
+ class BlatTrack extends FeatureTrack {
41217
41265
 
41218
41266
  constructor(config, browser) {
41219
41267
  super(config, browser);
@@ -41249,7 +41297,7 @@
41249
41297
  browser: this.browser,
41250
41298
  parent: this.browser.parent,
41251
41299
  headerTitle: this.config.title,
41252
- description: `BLAT result for query sequence:<br>${ this.sequence }`,
41300
+ description: this.sequence,
41253
41301
  dismissHandler: () => {
41254
41302
  this.table.dismiss();
41255
41303
  this.table.dispose();
@@ -41298,21 +41346,34 @@
41298
41346
 
41299
41347
  async function createBlatTrack({sequence, browser, name, title}) {
41300
41348
 
41349
+ if (sequence.length > maxSequenceSize) {
41350
+ browser.alert.present(`Sequence size exceeds maximum allowed length (${sequence.length} > ${maxSequenceSize})`);
41351
+ return
41352
+ }
41353
+
41301
41354
  const db = browser.genome.id; // TODO -- blat specific property
41302
41355
 
41303
- const features = await blat(sequence, db);
41356
+ const url = browser.config["blatServerURL"];
41304
41357
 
41305
- const trackConfig = {
41306
- type: 'blat',
41307
- name: name || 'blat results',
41308
- title: title || 'blat results',
41309
- sequence: sequence,
41310
- features: features
41311
- };
41358
+ try {
41359
+
41360
+ const features = await blat({url, userSeq: sequence, db});
41361
+ const trackConfig = {
41362
+ type: 'blat',
41363
+ name: name || 'blat results',
41364
+ title: title || 'blat results',
41365
+ sequence: sequence,
41366
+ altColor: 'rgb(176, 176, 236)',
41367
+ color: 'rgb(236, 176, 176)',
41368
+ features: features
41369
+ };
41312
41370
 
41313
- const track = await browser.loadTrack(trackConfig);
41371
+ const track = await browser.loadTrack(trackConfig);
41372
+ track.openTableView();
41314
41373
 
41315
- track.openTableView();
41374
+ } catch (e) {
41375
+ browser.alert.present(`Error performing blat search: ${e}`);
41376
+ }
41316
41377
 
41317
41378
  }
41318
41379
 
@@ -41343,8 +41404,6 @@
41343
41404
 
41344
41405
  const alignmentStartGap = 5;
41345
41406
  const downsampleRowHeight = 5;
41346
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41347
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41348
41407
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41349
41408
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41350
41409
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41352,35 +41411,37 @@
41352
41411
 
41353
41412
  class BAMTrack extends TrackBase {
41354
41413
 
41414
+ static defaults = {
41415
+ alleleFreqThreshold: 0.2,
41416
+ visibilityWindow: 30000,
41417
+ showCoverage: true,
41418
+ showAlignments: true,
41419
+ viewAsPairs: false,
41420
+ pairsSupported: true,
41421
+ showSoftClips: false,
41422
+ showAllBases: false,
41423
+ showInsertions: true,
41424
+ showMismatches: true,
41425
+ color: DEFAULT_ALIGNMENT_COLOR,
41426
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41427
+ height: 300,
41428
+ coverageTrackHeight: 50
41429
+ }
41430
+
41355
41431
  constructor(config, browser) {
41356
41432
  super(config, browser);
41357
41433
  }
41358
41434
 
41359
41435
  init(config) {
41360
- super.init(config);
41361
- this.type = "alignment";
41362
-
41363
- if (config.alleleFreqThreshold === undefined) {
41364
- config.alleleFreqThreshold = 0.2;
41365
- }
41366
41436
 
41437
+ this.type = "alignment";
41367
41438
  this.featureSource = new BamSource(config, this.browser);
41368
-
41369
- this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
41370
- this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
41371
-
41372
41439
  this.coverageTrack = new CoverageTrack(config, this);
41373
41440
  this.alignmentTrack = new AlignmentTrack(config, this);
41441
+
41442
+ super.init(config);
41443
+
41374
41444
  this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
41375
- this.visibilityWindow = config.visibilityWindow || 30000;
41376
- this.viewAsPairs = config.viewAsPairs;
41377
- this.pairsSupported = config.pairsSupported !== false;
41378
- this.showSoftClips = config.showSoftClips;
41379
- this.showAllBases = config.showAllBases;
41380
- this.showInsertions = false !== config.showInsertions;
41381
- this.showMismatches = false !== config.showMismatches;
41382
- this.color = config.color;
41383
- this.coverageColor = config.coverageColor;
41384
41445
 
41385
41446
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41386
41447
  // are present for a given reference frame the last one will take precedence
@@ -41393,14 +41454,12 @@
41393
41454
  }
41394
41455
  }
41395
41456
 
41396
- // Invoke height setter last to allocated to coverage and alignment tracks
41397
- this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
41398
41457
  }
41399
41458
 
41400
41459
  set height(h) {
41401
41460
  this._height = h;
41402
- if (this.coverageTrack && this.showAlignments) {
41403
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41461
+ if (this.showAlignments) {
41462
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41404
41463
  }
41405
41464
  }
41406
41465
 
@@ -41487,16 +41546,15 @@
41487
41546
  * @returns {number}
41488
41547
  */
41489
41548
  computePixelHeight(alignmentContainer) {
41490
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41491
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41492
- 15
41549
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41550
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41493
41551
  }
41494
41552
 
41495
41553
  draw(options) {
41496
41554
 
41497
41555
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41498
41556
 
41499
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41557
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41500
41558
  this.trackView.axisCanvas.style.display = 'block';
41501
41559
  this.coverageTrack.draw(options);
41502
41560
  } else {
@@ -41511,12 +41569,12 @@
41511
41569
 
41512
41570
  paintAxis(ctx, pixelWidth, pixelHeight) {
41513
41571
 
41514
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41572
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41515
41573
 
41516
41574
  // if (this.browser.isMultiLocusMode()) {
41517
41575
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41518
41576
  // } else {
41519
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41577
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41520
41578
  // }
41521
41579
  }
41522
41580
 
@@ -41525,7 +41583,7 @@
41525
41583
  }
41526
41584
 
41527
41585
  popupData(clickState) {
41528
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41586
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41529
41587
  return this.coverageTrack.popupData(clickState)
41530
41588
  } else {
41531
41589
  return this.alignmentTrack.popupData(clickState)
@@ -41540,7 +41598,7 @@
41540
41598
  clickedFeatures(clickState) {
41541
41599
 
41542
41600
  let clickedObject;
41543
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41601
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41544
41602
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41545
41603
  } else {
41546
41604
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41549,7 +41607,7 @@
41549
41607
  }
41550
41608
 
41551
41609
  hoverText(clickState) {
41552
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41610
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41553
41611
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41554
41612
  if (clickedObject) {
41555
41613
  return clickedObject.hoverText()
@@ -41589,8 +41647,8 @@
41589
41647
  // Show coverage / alignment options
41590
41648
  const adjustTrackHeight = () => {
41591
41649
  if (!this.autoHeight) {
41592
- const h = 15 +
41593
- (this.showCoverage ? this.coverageTrack.height : 0) +
41650
+ const h =
41651
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41594
41652
  (this.showAlignments ? this.alignmentTrack.height : 0);
41595
41653
  this.trackView.setTrackHeight(h);
41596
41654
  }
@@ -41904,7 +41962,6 @@
41904
41962
  constructor(config, parent) {
41905
41963
  this.parent = parent;
41906
41964
  this.featureSource = parent.featureSource;
41907
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41908
41965
 
41909
41966
  this.paintAxis = paintAxis;
41910
41967
  this.top = 0;
@@ -41919,6 +41976,10 @@
41919
41976
 
41920
41977
  }
41921
41978
 
41979
+ get height() {
41980
+ return this.parent.coverageTrackHeight
41981
+ }
41982
+
41922
41983
  draw(options) {
41923
41984
 
41924
41985
  const pixelTop = options.pixelTop;
@@ -42665,18 +42726,21 @@
42665
42726
  // TODO if genome supports blat
42666
42727
  const seqstring = clickedAlignment.seq;
42667
42728
  if (seqstring && "*" != seqstring) {
42668
- list.push({
42669
- label: 'BLAT read sequence',
42670
- click: () => {
42671
- const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
42672
- const name = `${clickedAlignment.readName} - blat`;
42673
- const title = `${this.parent.name} - ${name}`;
42674
- createBlatTrack({sequence, browser: this.browser, name, title});
42675
- }
42676
- });
42729
+
42730
+ if (seqstring.length < maxSequenceSize) {
42731
+ list.push({
42732
+ label: 'BLAT read sequence',
42733
+ click: () => {
42734
+ const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
42735
+ const name = `${clickedAlignment.readName} - blat`;
42736
+ const title = `${this.parent.name} - ${name}`;
42737
+ createBlatTrack({sequence, browser: this.browser, name, title});
42738
+ }
42739
+ });
42740
+ }
42677
42741
 
42678
42742
  const softClips = clickedAlignment.softClippedBlocks();
42679
- if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH) {
42743
+ if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH && softClips.left.len < maxSequenceSize) {
42680
42744
  list.push({
42681
42745
  label: 'BLAT left soft-clipped sequence',
42682
42746
  click: () => {
@@ -42688,7 +42752,7 @@
42688
42752
  }
42689
42753
  });
42690
42754
  }
42691
- if (softClips.right && softClips.right.length > MINIMUM_BLAT_LENGTH) {
42755
+ if (softClips.right && softClips.right.len > MINIMUM_BLAT_LENGTH && softClips.right.len < maxSequenceSize) {
42692
42756
  list.push({
42693
42757
  label: 'BLAT right soft-clipped sequence',
42694
42758
  click: () => {
@@ -44610,25 +44674,34 @@
44610
44674
  * THE SOFTWARE.
44611
44675
  */
44612
44676
 
44613
- const DEFAULT_COLOR = "rgb(150,150,150)";
44614
-
44615
44677
  class WigTrack extends TrackBase {
44616
44678
 
44679
+ static defaults = {
44680
+ height: 50,
44681
+ color: 'rgb(150, 150, 150)',
44682
+ altColor: 'rgb(150, 150, 150)',
44683
+ flipAxis: false,
44684
+ logScale: false,
44685
+ windowFunction: 'mean',
44686
+ graphType: 'bar',
44687
+ autoscale: true,
44688
+ normalize: undefined,
44689
+ scaleFactor: undefined
44690
+ }
44691
+
44617
44692
  constructor(config, browser) {
44618
44693
  super(config, browser);
44619
44694
  }
44620
44695
 
44621
44696
  init(config) {
44697
+
44622
44698
  super.init(config);
44623
44699
 
44624
44700
  this.type = "wig";
44625
- this.height = config.height || 50;
44626
44701
  this.featureType = 'numeric';
44627
44702
  this.paintAxis = paintAxis;
44628
44703
 
44629
44704
  const format = config.format ? config.format.toLowerCase() : config.format;
44630
- this.flipAxis = config.flipAxis ? config.flipAxis : false;
44631
- this.logScale = config.logScale ? config.logScale : false;
44632
44705
  if (config.featureSource) {
44633
44706
  this.featureSource = config.featureSource;
44634
44707
  delete config.featureSource;
@@ -44640,18 +44713,16 @@
44640
44713
  this.featureSource = FeatureSource(config, this.browser.genome);
44641
44714
  }
44642
44715
 
44643
- this.autoscale = config.autoscale || config.max === undefined;
44644
- if (!this.autoscale) {
44716
+
44717
+ // Override autoscale default
44718
+ if(config.max === undefined || config.autoscale === true) {
44719
+ this.autoscale = true;
44720
+ } else {
44645
44721
  this.dataRange = {
44646
44722
  min: config.min || 0,
44647
44723
  max: config.max
44648
44724
  };
44649
44725
  }
44650
-
44651
- this.windowFunction = config.windowFunction || "mean";
44652
- this.graphType = config.graphType || "bar";
44653
- this.normalize = config.normalize; // boolean, for use with "TDF" files
44654
- this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
44655
44726
  }
44656
44727
 
44657
44728
  async postInit() {
@@ -44741,7 +44812,7 @@
44741
44812
  const pixelWidth = options.pixelWidth;
44742
44813
  options.pixelHeight;
44743
44814
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44744
- const posColor = this.color || DEFAULT_COLOR;
44815
+ const posColor = this.color || WigTrack.defaults.color;
44745
44816
 
44746
44817
  let baselineColor;
44747
44818
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44885,7 +44956,7 @@
44885
44956
  */
44886
44957
 
44887
44958
  getColorForFeature(f) {
44888
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44959
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44889
44960
  return (typeof c === "function") ? c(f.value) : c
44890
44961
  }
44891
44962
 
@@ -44896,20 +44967,6 @@
44896
44967
  this.trackView = undefined;
44897
44968
  }
44898
44969
 
44899
- /**
44900
- * Return the current state of the track. Used to create sessions and bookmarks.
44901
- *
44902
- * @returns {*|{}}
44903
- */
44904
- getState() {
44905
-
44906
- const config = super.getState();
44907
-
44908
- if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
44909
- if (this.logScale !== undefined) config.logScale = this.logScale;
44910
-
44911
- return config
44912
- }
44913
44970
  }
44914
44971
 
44915
44972
  /**
@@ -45797,6 +45854,17 @@
45797
45854
 
45798
45855
  class InteractionTrack extends TrackBase {
45799
45856
 
45857
+ static defaults = {
45858
+ height: 250,
45859
+ theta: Math.PI / 4,
45860
+ arcOrientation: true,
45861
+ showBlocks: true,
45862
+ blockHeight: 3,
45863
+ thickness: 1,
45864
+ alpha: 0.02,
45865
+ logScale: true,
45866
+ }
45867
+
45800
45868
  constructor(config, browser) {
45801
45869
  super(config, browser);
45802
45870
  }
@@ -45804,16 +45872,10 @@
45804
45872
  init(config) {
45805
45873
 
45806
45874
  super.init(config);
45807
- this.theta = config.theta || Math.PI / 4;
45875
+
45808
45876
  this.sinTheta = Math.sin(this.theta);
45809
45877
  this.cosTheta = Math.cos(this.theta);
45810
- this.height = config.height || 250;
45811
45878
  this.arcType = getArcType(config); // nested | proportional | inView | partialInView
45812
- this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
45813
- this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
45814
- this.blockHeight = config.blockHeight || 3;
45815
- this.thickness = config.thickness || 1;
45816
- this.color = config.color;
45817
45879
  this.alpha = config.alpha || 0.02; // was: 0.15
45818
45880
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45819
45881
 
@@ -45825,7 +45887,6 @@
45825
45887
  this.valueColumn = "score";
45826
45888
  }
45827
45889
 
45828
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45829
45890
  if (config.max) {
45830
45891
  this.dataRange = {
45831
45892
  min: config.min || 0,
@@ -45850,7 +45911,7 @@
45850
45911
 
45851
45912
  if (typeof this.featureSource.getHeader === "function") {
45852
45913
  this.header = await this.featureSource.getHeader();
45853
- if(this.disposed) return; // This track was removed during async load
45914
+ if (this.disposed) return; // This track was removed during async load
45854
45915
  }
45855
45916
 
45856
45917
  // Set properties from track line
@@ -45923,7 +45984,7 @@
45923
45984
  feature.drawState = undefined;
45924
45985
 
45925
45986
  let color;
45926
- if(typeof this.color === 'function') {
45987
+ if (typeof this.color === 'function') {
45927
45988
  color = this.color(feature);
45928
45989
  } else {
45929
45990
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46268,7 +46329,7 @@
46268
46329
  contextMenuItemList(clickState) {
46269
46330
 
46270
46331
  // Experimental JBrowse feature
46271
- if (this.browser.circularView ) {
46332
+ if (this.browser.circularView) {
46272
46333
  const viewport = clickState.viewport;
46273
46334
  const list = [];
46274
46335
 
@@ -46297,7 +46358,7 @@
46297
46358
 
46298
46359
  // inView features are simply features that have been drawn, i.e. have a drawState
46299
46360
  const inView = cachedFeatures.filter(f => f.drawState);
46300
- if(inView.length === 0) return;
46361
+ if (inView.length === 0) return;
46301
46362
 
46302
46363
  const chords = makeBedPEChords(inView);
46303
46364
  sendChords(chords, this, refFrame, 0.5);
@@ -46333,7 +46394,7 @@
46333
46394
 
46334
46395
  popupData(clickState, features) {
46335
46396
 
46336
- if(features === undefined) features = this.clickedFeatures(clickState);
46397
+ if (features === undefined) features = this.clickedFeatures(clickState);
46337
46398
 
46338
46399
  const data = [];
46339
46400
  for (let feature of features) {
@@ -46357,7 +46418,7 @@
46357
46418
  const columnNames = this.header.columnNames;
46358
46419
  const stdColumns = this.header.hiccups ? 6 : 10;
46359
46420
  for (let i = stdColumns; i < columnNames.length; i++) {
46360
- if(this.header.colorColumn === i) continue;
46421
+ if (this.header.colorColumn === i) continue;
46361
46422
  if (columnNames[i] === 'info') {
46362
46423
  extractInfoColumn(data, f.extras[i - stdColumns]);
46363
46424
  } else {
@@ -46379,7 +46440,7 @@
46379
46440
 
46380
46441
  // We use the cached features rather than method to avoid async load. If the
46381
46442
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46382
- const featureList = clickState.viewport.cachedFeatures;
46443
+ const featureList = clickState.viewport.cachedFeatures;
46383
46444
  const candidates = [];
46384
46445
  if (featureList) {
46385
46446
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46425,26 +46486,6 @@
46425
46486
  }
46426
46487
  return candidates.map((c) => c.feature)
46427
46488
  }
46428
-
46429
- /**
46430
- * Return the current state of the track. Used to create sessions and bookmarks.
46431
- *
46432
- * @returns {*|{}}
46433
- */
46434
- getState() {
46435
-
46436
- const config = super.getState();
46437
-
46438
- // if (this.height !== undefined) config.height = this.height;
46439
- if (this.arcType !== undefined) config.arcType = this.arcType;
46440
- if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
46441
- if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
46442
- if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
46443
- if (this.thickness !== undefined) config.thickness = this.thickness;
46444
- if (this.alpha !== undefined) config.alpha = this.alpha;
46445
-
46446
- return config
46447
- }
46448
46489
  }
46449
46490
 
46450
46491
  function getMidpoints(feature, genome) {
@@ -46651,6 +46692,31 @@
46651
46692
 
46652
46693
  class VariantTrack extends TrackBase {
46653
46694
 
46695
+ static defaults = {
46696
+ displayMode: "EXPANDED",
46697
+ sortDirection: "ASC",
46698
+ showGenotypes: true,
46699
+ squishedVariantHeight: 2,
46700
+ squishedCallHeight: 1,
46701
+ expandedCallHeight: 10,
46702
+ expandedVGap: 2,
46703
+ squishedVGap: 1,
46704
+ expandedGroupGap: 10,
46705
+ squishedGroupGap: 5,
46706
+ featureHeight: 14,
46707
+ noGenotypeColor: "rgb(200,180,180)",
46708
+ noCallColor: "rgb(225, 225, 225)",
46709
+ nonRefColor: "rgb(200, 200, 215)",
46710
+ mixedColor: "rgb(200, 220, 200)",
46711
+ homrefColor: "rgb(200, 200, 200)",
46712
+ homvarColor: "rgb(17,248,254)",
46713
+ hetvarColor: "rgb(34,12,253)",
46714
+ colorBy: undefined,
46715
+ visibilityWindow: undefined,
46716
+ labelDisplayMode: undefined,
46717
+ type: "variant"
46718
+ }
46719
+
46654
46720
  constructor(config, browser) {
46655
46721
  super(config, browser);
46656
46722
  }
@@ -46659,41 +46725,18 @@
46659
46725
 
46660
46726
  super.init(config);
46661
46727
 
46662
- this.visibilityWindow = config.visibilityWindow;
46663
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46664
- this.labelDisplayMode = config.labelDisplayMode;
46665
46728
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46666
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
46667
- this.squishedCallHeight = config.squishedCallHeight || 1;
46668
- this.expandedCallHeight = config.expandedCallHeight || 10;
46669
- this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
46670
- this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
46671
- this.expandedGroupGap = config.expandedGroupGap || 10;
46672
- this.squishedGroupGap = config.squishedGroupGap || 5;
46673
- this.featureHeight = config.featureHeight || 14;
46674
- this.visibilityWindow = config.visibilityWindow;
46729
+
46675
46730
  this.featureSource = FeatureSource(config, this.browser.genome);
46676
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
46677
- this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
46678
- this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
46679
- this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
46680
- this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
46681
- this.homvarColor = config.homvarColor || "rgb(17,248,254)";
46682
- this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
46683
- this.sortDirection = "ASC";
46684
- this.type = config.type || "variant";
46685
-
46686
- this.colorBy = config.colorBy; // Can be undefined => default
46731
+
46687
46732
  this._initColorBy = config.colorBy;
46688
46733
  if (config.colorTable) {
46689
46734
  this.colorTables = new Map();
46690
46735
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46691
46736
  }
46692
-
46693
46737
  this._strokecolor = config.strokecolor;
46694
46738
  this._context_hook = config.context_hook;
46695
46739
 
46696
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46697
46740
 
46698
46741
  // The number of variant rows are computed dynamically, but start with "1" by default
46699
46742
  this.variantRowCount(1);
@@ -46703,7 +46746,7 @@
46703
46746
  async postInit() {
46704
46747
 
46705
46748
  this.header = await this.getHeader(); // cricital, don't remove'
46706
- if(this.disposed) return; // This track was removed during async load
46749
+ if (this.disposed) return // This track was removed during async load
46707
46750
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46708
46751
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46709
46752
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46806,7 +46849,7 @@
46806
46849
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46807
46850
 
46808
46851
  let callSets = this.callSets;
46809
- if(!callSets && this._f) {
46852
+ if (!callSets && this._f) {
46810
46853
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46811
46854
  }
46812
46855
  const nCalls = this.getCallsetsLength();
@@ -46846,9 +46889,9 @@
46846
46889
 
46847
46890
  //only paint stroke if a color is defined
46848
46891
  let strokecolor = this.getVariantStrokecolor(variant);
46849
- if (strokecolor){
46850
- context.strokeStyle = strokecolor;
46851
- context.strokeRect(x, y, w, h);
46892
+ if (strokecolor) {
46893
+ context.strokeStyle = strokecolor;
46894
+ context.strokeRect(x, y, w, h);
46852
46895
  }
46853
46896
 
46854
46897
  // call hook if _context_hook fn is defined
@@ -46864,7 +46907,7 @@
46864
46907
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46865
46908
 
46866
46909
  let sampleNumber = 0;
46867
- if(callSets && variant.calls) {
46910
+ if (callSets && variant.calls) {
46868
46911
  for (let callSet of callSets) {
46869
46912
  const call = variant.calls[callSet.id];
46870
46913
  if (call) {
@@ -46940,13 +46983,12 @@
46940
46983
  } else if ("MIXED" === v.type) {
46941
46984
  variantColor = this.mixedColor;
46942
46985
  } else {
46943
- variantColor = this.defaultColor;
46986
+ variantColor = this.color;
46944
46987
  }
46945
46988
  return variantColor
46946
46989
  }
46947
46990
 
46948
46991
 
46949
-
46950
46992
  getVariantStrokecolor(variant) {
46951
46993
 
46952
46994
  const v = variant._f || variant;
@@ -46962,13 +47004,13 @@
46962
47004
 
46963
47005
  callContextHook(variant, context, x, y, w, h) {
46964
47006
  if (this._context_hook) {
46965
- if (typeof this._context_hook === "function") {
46966
- const v = variant._f || variant;
47007
+ if (typeof this._context_hook === "function") {
47008
+ const v = variant._f || variant;
46967
47009
 
46968
- context.save();
46969
- this._context_hook(v, context, x, y, w, h);
46970
- context.restore();
46971
- }
47010
+ context.save();
47011
+ this._context_hook(v, context, x, y, w, h);
47012
+ context.restore();
47013
+ }
46972
47014
  }
46973
47015
  }
46974
47016
 
@@ -47012,7 +47054,7 @@
47012
47054
  */
47013
47055
  popupData(clickState, featureList) {
47014
47056
 
47015
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47057
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47016
47058
  const genomicLocation = clickState.genomicLocation;
47017
47059
  const genomeID = this.browser.genome.id;
47018
47060
  const sampleInformation = this.browser.sampleInformation;
@@ -47240,12 +47282,12 @@
47240
47282
  sendChordsForViewport(viewport) {
47241
47283
  const refFrame = viewport.referenceFrame;
47242
47284
  let inView;
47243
- if("all" === refFrame.chr) {
47285
+ if ("all" === refFrame.chr) {
47244
47286
  const all = this.featureSource.getAllFeatures();
47245
47287
  const arrays = Object.keys(all).map(k => all[k]);
47246
47288
  inView = [].concat(...arrays);
47247
47289
  } else {
47248
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47290
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47249
47291
 
47250
47292
  }
47251
47293
 
@@ -57483,7 +57525,7 @@
57483
57525
  let locusObject = parseLocusString(browser, locus);
57484
57526
 
57485
57527
  if (!locusObject) {
57486
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57528
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57487
57529
  if (feature) {
57488
57530
  locusObject = {
57489
57531
  chr: feature.chr,
@@ -59336,7 +59378,7 @@
59336
59378
 
59337
59379
  renderTable(records) {
59338
59380
 
59339
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59381
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59340
59382
 
59341
59383
  if (records.length > 0) {
59342
59384
 
@@ -59344,7 +59386,7 @@
59344
59386
 
59345
59387
  for (let record of sortedRecords) {
59346
59388
  const row = this.tableRowDOM(record);
59347
- this.rowContainerDOM.appendChild(row);
59389
+ this.tableRowContainer.appendChild(row);
59348
59390
  }
59349
59391
 
59350
59392
  }
@@ -59384,14 +59426,14 @@
59384
59426
 
59385
59427
  event.stopPropagation();
59386
59428
 
59387
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59429
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59388
59430
  const loci = [];
59389
59431
  for (let el of selected) {
59390
59432
  const { locus } = parseRegionKey(el.dataset.region);
59391
59433
  loci.push(locus);
59392
59434
  }
59393
59435
 
59394
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59436
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59395
59437
  el.classList.remove('igv-roi-table-row-selected');
59396
59438
  }
59397
59439
 
@@ -60929,6 +60971,7 @@
60929
60971
 
60930
60972
  updateLocusSearchWidget() {
60931
60973
 
60974
+ if(!this.referenceFrameList) return
60932
60975
  const referenceFrameList = this.referenceFrameList;
60933
60976
 
60934
60977
  // Update end position of reference frames based on pixel widths. This is hacky, but its been done here
@@ -60982,6 +61025,8 @@
60982
61025
 
60983
61026
  async zoomWithScaleFactor(scaleFactor, centerBPOrUndefined, referenceFrameOrUndefined) {
60984
61027
 
61028
+ if(!this.referenceFrameList) return
61029
+
60985
61030
  const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
60986
61031
 
60987
61032
  let referenceFrames = referenceFrameOrUndefined ? [referenceFrameOrUndefined] : this.referenceFrameList;
@@ -61000,6 +61045,8 @@
61000
61045
  */
61001
61046
  async addMultiLocusPanel(chr, start, end, referenceFrameLeft) {
61002
61047
 
61048
+ if(!this.referenceFrameList) return
61049
+
61003
61050
  // account for reduced viewport width as a result of adding right mate pair panel
61004
61051
  const viewportWidth = this.calculateViewportWidth(1 + this.referenceFrameList.length);
61005
61052
  const scaleFactor = this.calculateViewportWidth(this.referenceFrameList.length) / this.calculateViewportWidth(1 + this.referenceFrameList.length);
@@ -61613,6 +61660,8 @@
61613
61660
  */
61614
61661
  async function resize() {
61615
61662
 
61663
+ if(!this.referenceFrameList) return
61664
+
61616
61665
  const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
61617
61666
 
61618
61667
  for (let referenceFrame of this.referenceFrameList) {
@@ -62017,7 +62066,7 @@
62017
62066
 
62018
62067
  function embedCSS() {
62019
62068
 
62020
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62069
+ var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: min-content;\n max-width: 1600px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62021
62070
 
62022
62071
  var style = document.createElement('style');
62023
62072
  style.setAttribute('type', 'text/css');