├── .gitignore ├── .eslintrc.js ├── .DS_Store ├── icon.png ├── .vscode └── settings.json ├── src ├── misc │ ├── entitlements.mac.plist │ └── notarize.js ├── style.css ├── renderer_utils │ ├── darkMode.js │ └── autoUpdate.js ├── preload.js ├── main_utils │ └── menu.js └── renderer.js ├── appveyor.yml ├── index.html ├── test └── index.js ├── old_package_json_app_store_friendly ├── package.json ├── README.md ├── LICENSE.md ├── main.js ├── CHANGELOG.md ├── pA11990.gb └── pA11990 copy.gb /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/ 3 | .env 4 | .DS_Store -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: "teselagen/node" 3 | } -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeselaGen/ove-electron/HEAD/.DS_Store -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeselaGen/ove-electron/HEAD/icon.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/.git": true, 4 | "**/.svn": true, 5 | "**/.hg": true, 6 | "**/CVS": true, 7 | "**/.DS_Store": true, 8 | "**/Thumbs.db": true, 9 | "**/build":false 10 | } 11 | } -------------------------------------------------------------------------------- /src/misc/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-unsigned-executable-memory 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | 10 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Visual Studio 2019 2 | environment: 3 | GH_TOKEN: 4 | secure: kvUWbn2M0QD68917ZIXoOaIR0fPBkFP/VhABUpEIjs+/AHjQjj9L3+qmVeJYeQ9G 5 | 6 | platform: 7 | - x64 8 | 9 | cache: 10 | - node_modules 11 | - '%USERPROFILE%\.electron' 12 | 13 | init: 14 | - git config --global core.autocrlf input 15 | 16 | install: 17 | - ps: Install-Product node 14 x64 18 | - yarn 19 | 20 | build_script: 21 | - yarn deploy-win 22 | 23 | test: off -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | #notification { 2 | position: fixed; 3 | bottom: 20px; 4 | left: 20px; 5 | width: 200px; 6 | z-index: 100000; 7 | padding: 20px; 8 | border-radius: 5px; 9 | background-color: white; 10 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); 11 | } 12 | .hidden { 13 | display: none; 14 | } 15 | .darkModeBtn { 16 | z-index: 100000; 17 | position: absolute; 18 | top: 5px; 19 | right: 5px; 20 | } 21 | .bp3-toast-container { 22 | z-index: 100000000; 23 | } -------------------------------------------------------------------------------- /src/renderer_utils/darkMode.js: -------------------------------------------------------------------------------- 1 | //run once per window initialization 2 | if (window.localStorage.getItem("isDarkMode") === "true") { 3 | document.body.classList.add("bp3-dark"); 4 | } 5 | 6 | window.toggleDarkMode = () => { 7 | if (document.body.classList.contains("bp3-dark")) { 8 | window.localStorage.setItem("isDarkMode", "false"); 9 | document.body.classList.remove("bp3-dark"); 10 | } else { 11 | window.localStorage.setItem("isDarkMode", "true"); 12 | 13 | document.body.classList.add("bp3-dark"); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /src/misc/notarize.js: -------------------------------------------------------------------------------- 1 | const { notarize } = require('electron-notarize'); 2 | 3 | exports.default = async function notarizing(context) { 4 | const { electronPlatformName, appOutDir } = context; 5 | if (electronPlatformName !== 'darwin') { 6 | return; 7 | } 8 | 9 | const appName = context.packager.appInfo.productFilename; 10 | 11 | return await notarize({ 12 | appBundleId: 'com.teselagen.openVectorEditor', 13 | appPath: `${appOutDir}/${appName}.app`, 14 | appleId: process.env.APPLEID, 15 | appleIdPassword: process.env.APPLEIDPASS, 16 | }); 17 | }; -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Open Vector Editor 6 | 7 | 8 | 9 | 14 | 15 | 16 | 25 | 26 | 32 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | // tnr: running `yarn test` will run this file. It doesn't do much at the moment because we can't actually interact with the native dialogs.. 2 | 3 | const Application = require("spectron").Application; 4 | const assert = require("assert"); 5 | const electronPath = require("electron"); // Require Electron from the binaries included in node_modules. 6 | const path = require("path"); 7 | 8 | describe("Application launch", function () { 9 | this.timeout(10000); 10 | 11 | const startApp = async () => { 12 | const app = new Application({ 13 | connectionRetryCount: 1, 14 | path: electronPath, 15 | args: [path.join(__dirname, "..")], 16 | }); 17 | this.app = app; 18 | await app.start(); 19 | return app; 20 | }; 21 | 22 | afterEach(() => { 23 | if (this.app && this.app.isRunning()) { 24 | return this.app.stop(); 25 | } 26 | }); 27 | 28 | it("saving works", async () => { 29 | const app = await startApp(); 30 | await app.client.getWindowCount().then((count) => { 31 | assert.equal(count, 1); 32 | // Please note that getWindowCount() will return 2 if `dev tools` are opened. 33 | // assert.equal(count, 2) 34 | }); 35 | const elem = await app.client.$(`//button[contains(.//span, 'File')]`); 36 | await elem.click(); 37 | await (await app.client.$(`//a[contains(.//div, 'Save')]`)).click(); 38 | 39 | //tnr.. spectron doesn't actually support interacting with the dialogs or with menus so this is kind of pointless... 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /src/preload.js: -------------------------------------------------------------------------------- 1 | // tnr: We now only access the ipcRenderer from here and 2 | // create a bridge called "api" to communicate back to the 3 | // main process from renderer. I also am now setting the initial sequence data 4 | // using a querystring - https://stackoverflow.com/questions/38335004/how-to-pass-parameters-from-main-process-to-render-processes-in-electron/38401579#38401579 5 | 6 | const { ipcRenderer, contextBridge } = require("electron"); 7 | 8 | // Adds an object 'api' to the global window object: 9 | contextBridge.exposeInMainWorld("api", { 10 | send: async (type, arg) => { 11 | return await ipcRenderer.invoke(type, arg); 12 | }, 13 | }); 14 | 15 | // Add the initial seq data to the renderer window 16 | 17 | const urlParams = new URLSearchParams(global.location.search); 18 | 19 | try { 20 | const datastring = urlParams.get('initialSeqJson'); 21 | if (datastring) { 22 | const data = JSON.parse(datastring); 23 | contextBridge.exposeInMainWorld("initialSeqJson", data); 24 | } 25 | } catch (error) { 26 | console.error(`error with initialSeqJson:`, error); 27 | } 28 | // Add the filepath to the renderer window 29 | try { 30 | const datastring = urlParams.get('filePath'); 31 | if (datastring) { 32 | const data = JSON.parse(datastring); 33 | contextBridge.exposeInMainWorld("filePath", data); 34 | } 35 | } catch (error) { 36 | console.error(`error with filePath:`, error); 37 | } 38 | 39 | // function getParameterByName(name, url ) { 40 | // name = name.replace(/[\[\]]/g, '\\$&'); 41 | // const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), 42 | // results = regex.exec(url); 43 | // if (!results) return null; 44 | // if (!results[2]) return ''; 45 | // return decodeURIComponent(results[2].replace(/\+/g, ' ')); 46 | // } -------------------------------------------------------------------------------- /src/renderer_utils/autoUpdate.js: -------------------------------------------------------------------------------- 1 | //tnr: DEPRECATING FOR NOW 2 | const notification = document.getElementById("notification"); 3 | const message = document.getElementById("message"); 4 | const restartButton = document.getElementById("restart-button"); 5 | window.ipcRenderer.on("checking-for-update", () => { 6 | window.ipcRenderer.removeAllListeners("checking-for-update"); 7 | message.innerText = "Checking for updates..."; 8 | notification.classList.remove("hidden"); 9 | }); 10 | // window.ipcRenderer.on("update-not-available", () => { 11 | // window.ipcRenderer.removeAllListeners("update-not-available"); 12 | // message.innerText = "No updates available"; 13 | // notification.classList.remove("hidden"); 14 | // setTimeout(() => { 15 | // notification.classList.add("hidden"); 16 | // }, 2000); 17 | // }); 18 | window.ipcRenderer.on("download-progress", (e, text) => { 19 | message.innerText = text; 20 | notification.classList.remove("hidden"); //tnrtodo comment this out 21 | }); 22 | window.ipcRenderer.on("error", (e, text) => { 23 | window.ipcRenderer.removeAllListeners("error"); 24 | message.innerText = "Error updating: " + text; 25 | }); 26 | window.ipcRenderer.on("update_available", () => { 27 | window.ipcRenderer.removeAllListeners("update_available"); 28 | message.innerText = "A new update is available. Downloading now..."; 29 | notification.classList.remove("hidden"); 30 | }); 31 | window.ipcRenderer.on("update_downloaded", () => { 32 | window.ipcRenderer.removeAllListeners("update_downloaded"); 33 | message.innerText = 34 | "Update Downloaded. It will be installed on restart. Restart now?"; 35 | restartButton.classList.remove("hidden"); 36 | notification.classList.remove("hidden"); 37 | }); 38 | 39 | window.closeNotification = function closeNotification() { 40 | notification.classList.add("hidden"); 41 | }; 42 | window.restartApp = function restartApp() { 43 | window.ipcRenderer.send("restart_app"); 44 | }; 45 | -------------------------------------------------------------------------------- /old_package_json_app_store_friendly: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ove-electron", 3 | "version": "1.4.3", 4 | "description": "An open source vector or plasmid editor", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "electron . ./pA11990.gb", 8 | "test": "mocha", 9 | "build": "env-cmd electron-builder -wml --publish never", 10 | "build-win": "env-cmd electron-builder --win --publish never", 11 | "build-mac": "env-cmd electron-builder --mac --publish never", 12 | "deploy": "env-cmd electron-builder --mac --linux --publish always", 13 | "deploy-win": "electron-builder --win --publish always", 14 | "deploy-mac": "env-cmd electron-builder --mac --publish always", 15 | "deploy-linux": "env-cmd electron-builder --linux --publish always", 16 | "generateChangelog": "auto-changelog -p && git add . && git commit -m 'Updating CHANGELOG' && git push" 17 | }, 18 | "build": { 19 | "appx": { 20 | "identityName": "56560Teselagen.OpenVectorEditor", 21 | "publisher": "CN=D373F92F-3481-433F-9DC5-0BE55DE5500D", 22 | "publisherDisplayName": "Teselagen", 23 | "applicationId": "OpenVectorEditor", 24 | "displayName": "OpenVectorEditor" 25 | }, 26 | "win": { 27 | "target": "appx" 28 | }, 29 | "productName": "OpenVectorEditor", 30 | "publish": { 31 | "provider": "github", 32 | "repo": "ove-electron", 33 | "owner": "tnrich" 34 | }, 35 | "afterSign": "src/misc/notarize.js", 36 | "mac": { 37 | "hardenedRuntime": true, 38 | "gatekeeperAssess": false, 39 | "target": { 40 | "target": "default", 41 | "arch": [ 42 | "x64", 43 | "arm64" 44 | ] 45 | }, 46 | "entitlements": "src/misc/entitlements.mac.plist", 47 | "entitlementsInherit": "src/misc/entitlements.mac.plist" 48 | }, 49 | "appId": "com.teselagen.openVectorEditor", 50 | "fileAssociations": [ 51 | { 52 | "ext": "json" 53 | }, 54 | { 55 | "ext": "gb" 56 | }, 57 | { 58 | "ext": "dna" 59 | }, 60 | { 61 | "ext": "gbk" 62 | }, 63 | { 64 | "ext": "gp" 65 | }, 66 | { 67 | "ext": "fas" 68 | }, 69 | { 70 | "ext": "fasta" 71 | }, 72 | { 73 | "ext": "fa" 74 | }, 75 | { 76 | "ext": "fna" 77 | }, 78 | { 79 | "ext": "ffn" 80 | }, 81 | { 82 | "ext": "gff" 83 | }, 84 | { 85 | "ext": "gff3" 86 | } 87 | ] 88 | }, 89 | "repository": "https://github.com/electron/ove-electron", 90 | "keywords": [ 91 | "Electron", 92 | "open-vector-editor", 93 | "plasmid", 94 | "editor", 95 | "dna", 96 | "ove" 97 | ], 98 | "author": "tnrich", 99 | "license": "MIT", 100 | "devDependencies": { 101 | "auto-changelog": "^2.4.0", 102 | "electron": "^21.1.0", 103 | "electron-builder": "^23.6.0", 104 | "electron-notarize": "^1.2.1", 105 | "env-cmd": "^10.1.0", 106 | "eslint": "^8.24.0", 107 | "eslint-config-teselagen": "^6.0.6", 108 | "mocha": "^10.0.0", 109 | "spectron": "^19.0.0" 110 | }, 111 | "dependencies": { 112 | "bio-parsers": "^8.3.32", 113 | "electron-updater": "^5.3.0", 114 | "electron-window-state": "^5.0.3", 115 | "open-vector-editor": "^18.1.37", 116 | "ove-auto-annotate": "^0.0.5", 117 | "querystring": "^0.2.1", 118 | "ve-range-utils": "^2.6.6", 119 | "ve-sequence-utils": "^5.1.38" 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ove-electron", 3 | "version": "1.5.5", 4 | "description": "An open source vector or plasmid editor", 5 | "main": "main.js", 6 | "author": "Thomas (tnrich) Willheim ", 7 | "scripts": { 8 | "start": "electron . ./pA11990.gb", 9 | "test": "mocha", 10 | "build": "env-cmd electron-builder -wml --publish never", 11 | "build-win": "env-cmd electron-builder --win --publish never", 12 | "build-mac": "env-cmd electron-builder --mac --publish never", 13 | "build-linux": "env-cmd electron-builder --linux --publish never", 14 | "deploy": "env-cmd electron-builder --mac --linux --win --publish always", 15 | "deploy-win": "electron-builder --win --publish always", 16 | "deploy-mac": "env-cmd electron-builder --mac --publish always", 17 | "deploy-linux": "env-cmd electron-builder --linux --publish always", 18 | "generateChangelog": "auto-changelog -p && git add . && git commit -m 'Updating CHANGELOG' && git push" 19 | }, 20 | "build": { 21 | "appx": { 22 | "identityName": "56560Teselagen.OpenVectorEditor", 23 | "publisher": "CN=D373F92F-3481-433F-9DC5-0BE55DE5500D", 24 | "publisherDisplayName": "Teselagen", 25 | "applicationId": "OpenVectorEditor", 26 | "displayName": "OpenVectorEditor" 27 | }, 28 | "win": { 29 | "target": "nsis" 30 | }, 31 | "linux": { 32 | "target": { 33 | "target": "deb", 34 | "arch": [ 35 | "x64", 36 | "arm64" 37 | ] 38 | }, 39 | "icon": "build/icon.icns" 40 | }, 41 | "productName": "OpenVectorEditor", 42 | "publish": { 43 | "provider": "github", 44 | "repo": "ove-electron", 45 | "owner": "tnrich" 46 | }, 47 | "afterSign": "src/misc/notarize.js", 48 | "mac": { 49 | "hardenedRuntime": true, 50 | "gatekeeperAssess": false, 51 | "target": { 52 | "target": "dmg", 53 | "arch": [ 54 | "x64", 55 | "arm64" 56 | ] 57 | }, 58 | "entitlements": "src/misc/entitlements.mac.plist", 59 | "entitlementsInherit": "src/misc/entitlements.mac.plist" 60 | }, 61 | "appId": "com.teselagen.openVectorEditor", 62 | "fileAssociations": [ 63 | { 64 | "ext": "json" 65 | }, 66 | { 67 | "ext": "gb" 68 | }, 69 | { 70 | "ext": "dna" 71 | }, 72 | { 73 | "ext": "gbk" 74 | }, 75 | { 76 | "ext": "gp" 77 | }, 78 | { 79 | "ext": "fas" 80 | }, 81 | { 82 | "ext": "fasta" 83 | }, 84 | { 85 | "ext": "fa" 86 | }, 87 | { 88 | "ext": "fna" 89 | }, 90 | { 91 | "ext": "ffn" 92 | }, 93 | { 94 | "ext": "gff" 95 | }, 96 | { 97 | "ext": "gff3" 98 | } 99 | ] 100 | }, 101 | "repository": "https://github.com/electron/ove-electron", 102 | "keywords": [ 103 | "Electron", 104 | "open-vector-editor", 105 | "plasmid", 106 | "editor", 107 | "dna", 108 | "ove" 109 | ], 110 | "license": "MIT", 111 | "devDependencies": { 112 | "auto-changelog": "^2.4.0", 113 | "electron": "22.0.0", 114 | "electron-builder": "^23.6.0", 115 | "electron-notarize": "^1.2.1", 116 | "env-cmd": "^10.1.0", 117 | "eslint": "^8.28.0", 118 | "eslint-config-teselagen": "^6.0.16", 119 | "mocha": "^10.1.0", 120 | "spectron": "^19.0.0" 121 | }, 122 | "dependencies": { 123 | "bio-parsers": "^9.0.1", 124 | "electron-updater": "^5.3.0", 125 | "electron-window-state": "^5.0.3", 126 | "open-vector-editor": "^18.1.53", 127 | "ove-auto-annotate": "^0.0.5", 128 | "querystring": "^0.2.1", 129 | "ve-range-utils": "^2.6.6", 130 | "ve-sequence-utils": "^5.2.8" 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/main_utils/menu.js: -------------------------------------------------------------------------------- 1 | const { Menu } = require("electron"); 2 | 3 | const { dialog } = require("electron"); 4 | 5 | const isMac = process.platform === "darwin"; 6 | 7 | module.exports = function createMenu({ createWindow, getSeqJsonFromPath }) { 8 | const template = [ 9 | // { role: 'appMenu' } 10 | ...(isMac 11 | ? [ 12 | { 13 | label: "OVE", 14 | submenu: [ 15 | { role: "about" }, 16 | { type: "separator" }, 17 | { role: "services" }, 18 | { type: "separator" }, 19 | { role: "hide" }, 20 | { role: "hideothers" }, 21 | { role: "unhide" }, 22 | { type: "separator" }, 23 | { role: "quit" }, 24 | ], 25 | }, 26 | ] 27 | : []), 28 | // { role: 'fileMenu' } 29 | { 30 | label: "File", 31 | submenu: [ 32 | { 33 | label: "New File", 34 | accelerator: "CmdOrCtrl+N", 35 | click: () => { 36 | createWindow({ 37 | initialSeqJson: undefined, 38 | }); 39 | }, 40 | }, 41 | { 42 | label: "Open", 43 | accelerator: "CmdOrCtrl+O", 44 | click: async () => { 45 | const { filePaths } = await dialog.showOpenDialog({ 46 | filters: [ 47 | { 48 | name: "Sequence Files", 49 | extensions: [ 50 | "gb", 51 | "json", 52 | "dna", 53 | "gbk", 54 | "gp", 55 | "fas", 56 | "fasta", 57 | "fa", 58 | "fna", 59 | "ffn", 60 | "gff", 61 | "gff3", 62 | ], 63 | }, 64 | ], 65 | properties: ["openFile", "multiSelections"], 66 | }); 67 | 68 | filePaths.forEach(async (p) => { 69 | const initialSeqJson = await getSeqJsonFromPath(p); 70 | createWindow({ 71 | initialSeqJson, 72 | filePath: p 73 | }); 74 | }); 75 | }, 76 | }, 77 | isMac ? { role: "close" } : { role: "quit" }, 78 | ], 79 | }, 80 | // { role: 'editMenu' } 81 | { 82 | label: "Edit", 83 | submenu: [ 84 | // { role: 'undo' }, 85 | // { role: 'redo' }, 86 | // { type: 'separator' }, 87 | { role: "cut" }, 88 | { role: "copy" }, 89 | { role: "paste" }, 90 | // ...(isMac ? [ 91 | // { role: 'pasteAndMatchStyle' }, 92 | // { role: 'delete' }, 93 | // { role: 'selectAll' }, 94 | // { type: 'separator' }, 95 | // { 96 | // label: 'Speech', 97 | // submenu: [ 98 | // { role: 'startspeaking' }, 99 | // { role: 'stopspeaking' } 100 | // ] 101 | // } 102 | // ] : [ 103 | // { role: 'delete' }, 104 | // { type: 'separator' }, 105 | // { role: 'selectAll' } 106 | // ]) 107 | ], 108 | }, 109 | // { role: 'viewMenu' } 110 | { 111 | label: "View", 112 | submenu: [ 113 | { role: "reload" }, 114 | { role: "forcereload" }, 115 | { role: "toggledevtools" }, 116 | { type: "separator" }, 117 | { role: "resetzoom" }, 118 | { role: "zoomin" }, 119 | { role: "zoomout" }, 120 | { type: "separator" }, 121 | { role: "togglefullscreen" }, 122 | ], 123 | }, 124 | // { role: 'windowMenu' } 125 | { 126 | label: "Window", 127 | submenu: [ 128 | { role: "minimize" }, 129 | { role: "zoom" }, 130 | ...(isMac 131 | ? [ 132 | { type: "separator" }, 133 | { role: "front" }, 134 | { type: "separator" }, 135 | { role: "window" }, 136 | ] 137 | : [{ role: "close" }]), 138 | ], 139 | }, 140 | ]; 141 | 142 | // const menu = Menu.buildFromTemplate([ 143 | // {label: "a", click: } 144 | // ]) 145 | const menu = Menu.buildFromTemplate(template); 146 | Menu.setApplicationMenu(menu); 147 | }; 148 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![image](https://user-images.githubusercontent.com/2730609/67169732-df3ca800-f348-11e9-8003-baa91cd8cfec.png) 2 | 3 | # ove-electron 4 | 5 | This packages the open-vector-editor web app as an electron tool that can be used on windows/mac/linux 6 | 7 | ![image](https://user-images.githubusercontent.com/2730609/67169717-c59b6080-f348-11e9-995a-89b7213428ff.png) 8 | 9 | # Installation Instructions: 10 | - windows -- go to the windows store https://www.microsoft.com/en-us/p/openvectoreditor/9nxcc5vc41k9?activetab=pivot:overviewtab and download it! (old instructions: download the .exe file and double click to install it) 11 | 12 | - Mac/Linux: Go to https://github.com/tnrich/ove-electron/releases and find the latest release for the platform you're on (win/mac/linux) 13 | - mac -- download the DMG file and double click to install it 14 | - linux -- download the .AppImage file and open a terminal. Run: 15 | 16 | ``` 17 | chmod +x Open-Vector-Editor-0.1.5.AppImage 18 | ./Open-Vector-Editor-0.1.5.AppImage 19 | ``` 20 | 21 | # Developing 22 | 23 | ``` 24 | yarn 25 | yarn start 26 | ``` 27 | 28 | ## To speed up trying out changes from OVE 29 | 30 | ``` 31 | cd open-vector-editor; 32 | yarn link; 33 | cd ove-electron; 34 | yarn link open-vector-editor 35 | 36 | 37 | esModules: console.log("commentMeBackOut") || false, 38 | cjs: console.log("commentMeBackOut") || false 39 | 40 | cd open-vector-editor; 41 | yarn build; //this will now build only the UMD file that ove-electron uses 42 | ``` 43 | # Releasing 44 | - Bump the package.json version number 45 | - Build mac, windows and linux: 46 | ``` 47 | yarn deploy 48 | ``` 49 | - (despite having tried to remove macOS code signing from the process because it takes way too long to run, it looks like mac says the file is Damaged unless it has been code-signed - https://github.com/TeselaGen/openVectorEditor/issues/862#issuecomment-1333771642) 50 | - Go to https://github.com/tnrich/ove-electron/releases 51 | - Edit the most recently pushed release to publish it 52 | - Add the following instructions to the release notes 53 | <---------------Copy Paste The Following into the Release Notes-------------------> 54 | # Installing on Mac 55 | - Download the correct mac file (arm64.dmg for M1/M2 macs or .dmg for intel macs) 56 | - Right click the downloaded file and hit open (can't double click to open it) 57 | - Accept the unknown developer warning 58 | 59 | # Installing on Ubuntu (or other .deb linux flavors): 60 | - Download the .deb file (either the AMD or ARM file based on the chip you're computer is using) 61 | - From the terminal run: 62 | ``` 63 | sudo dpkg -i ./Downloads/ove-electron_1.5.0_arm64.deb 64 | ``` 65 | 66 | # Installing on Windows 67 | - Download the .exe file 68 | - Choose to keep the file (if it warns you it might be malicious) 69 | - Open it (it should start the installer) 70 | <---------------Copy Paste The Above into the Release Notes-------------------> 71 | # Testing 72 | 73 | I've set up a single spectron test under /test 74 | It can be run via `yarn test` 75 | Unfortunately spectron doesn't support interacting with native dialogs so I'd need to mock those to have the tests be at all useful. I should probably do this sometime down the line. (note OVE itself is close to full test coverage https://github.com/TeselaGen/openVectorEditor) 76 | 77 | 78 | # DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED:: 79 | # OLD -- Releasing 80 | 81 | These environment variables will need to be set in a local .env file: 82 | 83 | ``` 84 | APPLEID=yourstringhere //my apple id 85 | //this needs to be an app-specific password (not just my apple password) https://appleid.apple.com/account/manage 86 | APPLEIDPASS=yourstringhere 87 | GH_TOKEN=yourstringhere 88 | ``` 89 | 90 | - Bump the package.json version number 91 | Login to snapcraft (credentials under https://passwords.google.com/ --> ubuntu.com) 92 | snapcraft login 93 | Go to https://developer.apple.com/account and make sure all notices are signed 94 | - Build mac and linux: 95 | ``` 96 | yarn deploy 97 | ``` 98 | wait for it to finish 99 | - Go to https://github.com/tnrich/ove-electron/releases 100 | - Edit the most recently pushed release to publish it 101 | - Keep all the files (the blockmap and latest.yml files as they are used by the auto-updater) 102 | - Commit changes 103 | - yarn generateChangelog 104 | 105 | - Windows needs to be built by appveyor. Hit the "New Build" button here to start the windows build - https://ci.appveyor.com/project/tnrich/ove-electron 106 | - after it finishes building it should automatically be pushed to the draft release page https://github.com/tnrich/ove-electron/releases 107 | - go to https://partner.microsoft.com/en-us/dashboard/products and add a new submission for the store using the appx file in the draft release 108 | 109 | ## Troubleshooting release process 110 | 111 | How auto-updating works : 112 | https://medium.com/@johndyer24/creating-and-deploying-an-auto-updating-electron-app-for-mac-and-windows-using-electron-builder-6a3982c0cee6 113 | 114 | If apple notarize isn't working, this can help to troubleshoot: 115 | https://stackoverflow.com/questions/58358449/notarizing-electron-apps-throws-you-must-first-sign-the-relevant-contracts-on 116 | 117 | If you're seeing an itunes signing in error, maybe the app specific password needs to be updated: 118 | https://david.dev/how-to-notarize-your-electron-app 119 | 120 | If you're seeing this error: 121 | The request is missing an Authorization header field containing a valid macaroon 122 | You'll need to re-login to snapcraft.io (credentials under ubuntu.com) 123 | 124 | ``` 125 | snapcraft login 126 | ``` 127 | # DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED:: -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | ================== 3 | 4 | Statement of Purpose 5 | --------------------- 6 | 7 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). 8 | 9 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. 10 | 11 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 12 | 13 | 1. Copyright and Related Rights. 14 | -------------------------------- 15 | A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: 16 | 17 | i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; 18 | ii. moral rights retained by the original author(s) and/or performer(s); 19 | iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; 20 | iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; 21 | v. rights protecting the extraction, dissemination, use and reuse of data in a Work; 22 | vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and 23 | vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 24 | 25 | 2. Waiver. 26 | ----------- 27 | To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 28 | 29 | 3. Public License Fallback. 30 | ---------------------------- 31 | Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 32 | 33 | 4. Limitations and Disclaimers. 34 | -------------------------------- 35 | 36 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. 37 | b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. 38 | c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. 39 | d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. 40 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console*/ 2 | // Modules to control application life and create native browser window 3 | const { app, BrowserWindow, ipcMain, dialog } = require("electron"); 4 | const path = require("path"); 5 | const bioParsers = require("bio-parsers"); 6 | const fs = require("fs"); 7 | const createMenu = require("./src/main_utils/menu"); 8 | const windowStateKeeper = require("electron-window-state"); 9 | const { autoUpdater } = require("electron-updater"); 10 | 11 | let isAppReady = false; 12 | let isMacOpenTriggered = false; 13 | // Keep a global reference of the window object, if you don't, the window will 14 | // be closed automatically when the JavaScript object is garbage collected. 15 | const windows = []; 16 | createMenu({ windows, createWindow, getSeqJsonFromPath }); 17 | 18 | async function getSeqJsonFromPath(_filePath) { 19 | const filePath = _filePath || process.argv[1]; 20 | // const filePath = _filePath || process.argv[2] || process.argv[1]; 21 | if (filePath === ".") return; 22 | const data = fs.readFileSync(path.resolve(filePath)); 23 | //open, read, handle file 24 | if (!data) return; 25 | const fileName = filePath.replace(/^.*[\\/]/, ""); 26 | try { 27 | if (fileName.endsWith(".json") && (data.sequence || data.proteinSequence)) { 28 | return data; 29 | } 30 | const res = await bioParsers.anyToJson(data, { fileName }); 31 | return res[0].parsedSequence; 32 | } catch (error) { 33 | console.error(`error:`, error); 34 | return {}; 35 | } 36 | } 37 | 38 | function waitTillAppReady() { 39 | return new Promise((resolve, reject) => { 40 | const waitTillReadyInterval = setInterval(() => { 41 | if (isAppReady) { 42 | resolve(); 43 | clearInterval(waitTillReadyInterval); 44 | } 45 | }, 100); 46 | }); 47 | } 48 | 49 | async function createWindow({ initialSeqJson, filePath, windowToUse } = {}) { 50 | await waitTillAppReady(); 51 | //if no windowVars are passed then we should 52 | // Create the browser window. 53 | 54 | if (filePath) { 55 | let alreadyOpen = false; 56 | windows.forEach((w) => { 57 | if (w.__filePath === filePath) { 58 | w.bw.show(); 59 | alreadyOpen = true; 60 | } 61 | }); 62 | if (alreadyOpen) { 63 | return; 64 | } 65 | } 66 | const mainWindowState = windowStateKeeper({ 67 | defaultWidth: 1000, 68 | defaultHeight: 800, 69 | }); 70 | 71 | let newWindow = 72 | windowToUse || 73 | new BrowserWindow({ 74 | x: mainWindowState.x, 75 | y: mainWindowState.y, 76 | width: mainWindowState.width, 77 | height: mainWindowState.height, 78 | show: false, 79 | webPreferences: { 80 | contextIsolation: true, 81 | // nodeIntegration: true, //we don't want to enable this because it is a security risk and slows down the app 82 | preload: path.join(__dirname, "src/preload.js"), 83 | }, 84 | }); 85 | 86 | newWindow.once("ready-to-show", () => { 87 | newWindow.show(); 88 | }); 89 | 90 | // Let us register listeners on the window, so we can update the state 91 | // automatically (the listeners will be removed when the window is closed) 92 | // and restore the maximized or full screen state 93 | mainWindowState.manage(newWindow); 94 | 95 | !windowToUse && 96 | windows.push({ 97 | bw: newWindow, 98 | //set a __filePath property so we can reference this if a user tries to open the same file multiple times 99 | __filePath: filePath, 100 | }); 101 | console.log(`initialSeqJson:`,initialSeqJson) 102 | newWindow.loadFile("index.html", { 103 | query: { initialSeqJson: JSON.stringify(initialSeqJson), filePath }, 104 | }); 105 | 106 | // Open the DevTools. 107 | // newWindow.webContents.openDevTools() 108 | 109 | // Emitted when the window is closed. 110 | newWindow.on("closed", function () { 111 | // Dereference the window object, usually you would store windows 112 | // in an array if your app supports multi windows, this is the time 113 | // when you should delete the corresponding element. 114 | let indexToSplice; 115 | windows.forEach((w, i) => { 116 | if (w.bw === newWindow) { 117 | indexToSplice = i; 118 | } 119 | }); 120 | windows.splice(indexToSplice, 1); 121 | newWindow = null; 122 | }); 123 | } 124 | 125 | app.on("open-file", async (event, path) => { 126 | isMacOpenTriggered = true; 127 | //mac only 128 | event.preventDefault(); 129 | console.log(`open-file`) 130 | try { 131 | console.log("trying to open gb file"); 132 | const initialSeqJson = await getSeqJsonFromPath(path); 133 | createWindow({ filePath: path, initialSeqJson }); 134 | } catch (e) { 135 | console.error(`e73562891230:`, e); 136 | } 137 | }); 138 | 139 | // This method will be called when Electron has finished 140 | // initialization and is ready to create browser windows. 141 | // Some APIs can only be used after this event occurs. 142 | app.on("ready", async () => { 143 | console.info(`App Starting Up`); 144 | autoUpdater.checkForUpdatesAndNotify(); 145 | isAppReady = true; 146 | if (!windows.length && !isMacOpenTriggered) { 147 | let initialSeqJson; 148 | if ( process.argv.length >= 2) { 149 | initialSeqJson = await getSeqJsonFromPath(); 150 | } 151 | createWindow({ filePath: path, initialSeqJson }); 152 | } 153 | }); 154 | 155 | // Quit when all windows are closed. 156 | app.on("window-all-closed", function () { 157 | // On macOS it is common for applications and their menu bar 158 | // to stay active until the user quits explicitly with Cmd + Q 159 | if (process.platform !== "darwin") app.quit(); 160 | }); 161 | 162 | app.on("activate", function () { 163 | // On macOS it's common to re-create a window in the app when the 164 | // dock icon is clicked and there are no other windows open. 165 | if (!windows.length) { 166 | console.log(`onActivate`); 167 | createWindow(); 168 | } 169 | }); 170 | 171 | // ipcMain.on("restart_app", () => { 172 | // setImmediate(() => { 173 | // autoUpdater.quitAndInstall(); 174 | // }); 175 | // }); 176 | 177 | /* HANDLE THE API CALLS FROM THE RENDERER PROCESS */ 178 | 179 | ipcMain.handle( 180 | "ove_saveFile", 181 | (event, { sequenceDataToSave, filePath, isSaveAs }) => { 182 | const browserWindow = BrowserWindow.fromWebContents(event.sender); 183 | 184 | const ext = path.extname(filePath); 185 | 186 | let formattedSeqString; 187 | if (ext === ".fasta") { 188 | formattedSeqString = bioParsers.jsonToFasta(sequenceDataToSave); 189 | } else if (ext === ".bed") { 190 | formattedSeqString = bioParsers.jsonToBed(sequenceDataToSave); 191 | } else if (ext === ".json") { 192 | formattedSeqString = JSON.stringify(sequenceDataToSave, null, 2); 193 | } else { 194 | formattedSeqString = bioParsers.jsonToGenbank(sequenceDataToSave); 195 | } 196 | fs.writeFileSync(filePath, formattedSeqString); 197 | !isSaveAs && 198 | windows.forEach((w) => { 199 | if (w.bw === browserWindow) { 200 | //update the __filePath prop we're saving on the window to prevent opening the same file twice 201 | w.__filePath = filePath; 202 | } 203 | }); 204 | } 205 | ); 206 | 207 | ipcMain.handle("ove_showSaveDialog", async (event, opts) => { 208 | return dialog.showSaveDialogSync( 209 | BrowserWindow.fromWebContents(event.sender), 210 | opts 211 | ); 212 | }); 213 | 214 | /* ************************************************** */ 215 | -------------------------------------------------------------------------------- /src/renderer.js: -------------------------------------------------------------------------------- 1 | // This window.initialSeqJson is getting set in preload from the query string from the main process load() call 2 | const seqDataToUse = window.initialSeqJson || { circular: true }; 3 | // export default generateSequenceData() 4 | const originalTitle = document.title; 5 | 6 | setNewTitle(seqDataToUse.name); 7 | 8 | function setNewTitle(name) { 9 | document.title = originalTitle + " -- " + (name || "Untitled Sequence"); 10 | } 11 | 12 | const handleSave = 13 | (isSaveAs) => 14 | async (event, sequenceDataToSave, editorProps, onSuccessCallback) => { 15 | const filters = [ 16 | { name: "Genbank", extensions: ["gb"] }, 17 | { name: "Fasta", extensions: ["fasta"] }, 18 | { name: "TeselaGen JSON", extensions: ["json"] }, 19 | { name: "Bed", extensions: ["bed"] }, 20 | ]; 21 | 22 | let nameToUse; 23 | let defaultPath = "~/Downloads/"; 24 | if (window.filePath) { 25 | nameToUse = window.filePath.slice(window.filePath.lastIndexOf("/") + 1); 26 | defaultPath = window.filePath.slice( 27 | 0, 28 | window.filePath.lastIndexOf("/") + 1 29 | ); 30 | } 31 | //we need to get the newFilePath 32 | nameToUse = 33 | nameToUse || `${sequenceDataToSave.name || "Untitled_Sequence"}.gb`; 34 | const newFilePath = await window.api.send("ove_showSaveDialog", { 35 | filters, 36 | title: nameToUse, 37 | defaultPath: defaultPath + nameToUse, 38 | buttonLabel: `Save file ${isSaveAs ? "as" : ""}`, 39 | }); 40 | 41 | if (!newFilePath) { 42 | return; //cancel the save! 43 | } 44 | 45 | sequenceDataToSave.name = newFilePath.slice( 46 | newFilePath.lastIndexOf("/") + 1 47 | ); 48 | filters.forEach(({ extensions }) => { 49 | //strip the extension from the name 50 | sequenceDataToSave.name = sequenceDataToSave.name.replace( 51 | `.${extensions[0]}`, 52 | "" 53 | ); 54 | }); 55 | 56 | if (!isSaveAs) { 57 | setNewTitle(sequenceDataToSave.name); 58 | window.filePath = newFilePath; 59 | editor.updateEditor({ 60 | //update the name of the seq without triggering the undo/redo stack tracking 61 | sequenceData: sequenceDataToSave, 62 | }); 63 | } 64 | 65 | window.api.send("ove_saveFile", { 66 | filePath: newFilePath, 67 | sequenceDataToSave, 68 | isSaveAs, 69 | }); 70 | onSuccessCallback(); 71 | window.toastr.success(`Sequence Saved to ${newFilePath}`); 72 | }; 73 | 74 | const editor = window.createVectorEditor("createDomNodeForMe", { 75 | autoAnnotateFeatures: window._ove_addons.autoAnnotateFeatures, 76 | autoAnnotateParts: window._ove_addons.autoAnnotateParts, 77 | autoAnnotatePrimers: window._ove_addons.autoAnnotatePrimers, 78 | isFullscreen: true, 79 | // or you can pass "createDomNodeForMe" but make sure to use editor.close() to clean up the dom node! 80 | 81 | //you can also pass a DOM node as the first arg here 82 | // showReadOnly: false, 83 | // disableSetReadOnly: true, 84 | allowPrimerBasesToBeEdited: true, 85 | defaultLinkedOligoMessage: '', 86 | shouldAutosave: false, 87 | alwaysAllowSave: true, 88 | // rightClickOverrides: { 89 | // selectionLayerRightClicked: (items /* { annotation }, props */) => { 90 | // return [ 91 | // ...items, 92 | // { 93 | // text: "Create Part", 94 | // onClick: () => console.info("hey!≈") 95 | // } 96 | // ]; 97 | // } 98 | // }, 99 | // handleFullscreenClose: () => { //comment this function in to make the editor fullscreen by default 100 | // editor.close() //this calls reactDom.unmountComponent at the node you passed as the first arg 101 | // }, 102 | onRename: (newName) => { 103 | setNewTitle(newName); 104 | }, //this option should be shown by default 105 | // onNew: () => {}, //unless this callback is defined, don't show the option to create a new seq 106 | // onDuplicate: () => {}, //unless this callback is defined, don't show the option to create a new seq 107 | onSaveAs: handleSave(true), 108 | onSave: handleSave(), 109 | onImport: (sequenceData) => { 110 | try { 111 | editor.updateEditor({ 112 | sequenceData, 113 | }); 114 | } catch (error) { 115 | console.error(`error 129821:`, error); 116 | } 117 | }, 118 | // onDelete: data => { 119 | // console.warn("would delete", data); 120 | // }, 121 | // onCopy: function(event, copiedSequenceData /* , editorState */) { 122 | // //the copiedSequenceData is the subset of the sequence that has been copied in the teselagen sequence format 123 | // const clipboardData = event.clipboardData; 124 | // clipboardData.setData("text/plain", copiedSequenceData.sequence); 125 | // clipboardData.setData( 126 | // "application/json", 127 | // //for example here you could change teselagen parts into jbei parts 128 | // JSON.stringify(copiedSequenceData) 129 | // ); 130 | // event.preventDefault(); 131 | // //in onPaste in your app you can do: 132 | // // e.clipboardData.getData('application/json') 133 | // }, 134 | // onPaste: function(event /* , editorState */) { 135 | // //the onPaste here must return sequenceData in the teselagen data format 136 | // const clipboardData = event.clipboardData; 137 | // let jsonData = clipboardData.getData("application/json"); 138 | // if (jsonData) { 139 | // jsonData = JSON.parse(jsonData); 140 | // if (jsonData.isJbeiSeq) { 141 | // jsonData = convertJbeiToTeselagen(jsonData); 142 | // } 143 | // } 144 | // const sequenceData = jsonData || { 145 | // sequence: clipboardData.getData("text/plain") 146 | // }; 147 | // return sequenceData; 148 | // }, 149 | // getSequenceAtVersion: versionId => { 150 | // if (versionId === 2) { 151 | // return { 152 | // sequence: "thomaswashere" 153 | // }; 154 | // } else if ((versionId = 3)) { 155 | // return { 156 | // features: [{ start: 4, end: 6 }], 157 | // sequence: 158 | // "GGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacacccccc" 159 | // }; 160 | // } else { 161 | // console.error("we shouldn't be here..."); 162 | // return { 163 | // sequence: "taa" 164 | // }; 165 | // } 166 | // }, 167 | // getVersionList: () => { 168 | // return [ 169 | // { 170 | // dateChanged: "12/30/2211", 171 | // editedBy: "Nara", 172 | // // revisionType: "Sequence Deletion", 173 | // versionId: 2 174 | // }, 175 | // { 176 | // dateChanged: "8/30/2211", 177 | // editedBy: "Ralph", 178 | // // revisionType: "Feature Edit", 179 | // versionId: 3 180 | // } 181 | // ]; 182 | // }, 183 | showMenuBar: true, 184 | PropertiesProps: { 185 | propertiesList: [ 186 | "general", 187 | "features", 188 | "parts", 189 | "primers", 190 | "translations", 191 | "cutsites", 192 | "orfs", 193 | "genbank", 194 | ], 195 | }, 196 | ToolBarProps: { 197 | toolList: [ 198 | "saveTool", 199 | "downloadTool", 200 | "importTool", 201 | "undoTool", 202 | "redoTool", 203 | "cutsiteTool", 204 | "featureTool", 205 | "alignmentTool", 206 | "versionHistoryTool", 207 | // "oligoTool", 208 | "orfTool", 209 | // "viewTool", 210 | "editTool", 211 | "findTool", 212 | "visibilityTool", 213 | // "propertiesTool" 214 | ], 215 | }, 216 | }); /* createDomNodeForMe will make a dom node for you and append it to the document.body*/ 217 | 218 | const isCircular = seqDataToUse && seqDataToUse.circular; 219 | editor.updateEditor({ 220 | sequenceData: seqDataToUse, 221 | sequenceDataHistory: {}, //clear the sequenceDataHistory if there is any left over from a previous sequence 222 | annotationVisibility: { 223 | // features: false, 224 | orfTranslations: false, 225 | }, 226 | readOnly: false, 227 | panelsShown: [ 228 | [ 229 | { 230 | // fullScreen: true, 231 | active: !!isCircular, 232 | id: "circular", 233 | name: "Circular Map", 234 | }, 235 | { 236 | id: "rail", 237 | name: "Linear Map", 238 | active: !isCircular, 239 | }, 240 | ], 241 | [ 242 | { 243 | id: "sequence", 244 | name: "Sequence Map", 245 | active: true, 246 | }, 247 | 248 | { 249 | id: "properties", 250 | name: "Properties", 251 | }, 252 | ], 253 | ], 254 | annotationsToSupport: { 255 | features: true, 256 | translations: true, 257 | parts: true, 258 | orfs: true, 259 | cutsites: true, 260 | primers: true, 261 | }, 262 | }); 263 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### Changelog 2 | 3 | All notable changes to this project will be documented in this file. Dates are displayed in UTC. 4 | 5 | Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). 6 | 7 | #### [v1.4.0](https://github.com/tnrich/ove-electron/compare/v1.4.0...v1.4.0) 8 | 9 | - updating preload script to fix improper use of npm package [`0967dba`](https://github.com/tnrich/ove-electron/commit/0967dba2c58b1088b275fb1a74a3c7630930b6c1) 10 | 11 | #### [v1.4.0](https://github.com/tnrich/ove-electron/compare/v1.3.0...v1.4.0) 12 | 13 | > 3 August 2022 14 | 15 | - updating deps [`d0363c7`](https://github.com/tnrich/ove-electron/commit/d0363c788dbda02e7bd12cf34179a31bffcd82c7) 16 | - Updating CHANGELOG [`98900dd`](https://github.com/tnrich/ove-electron/commit/98900ddbc0b200888fcafaf9cc5b0f89928aee0a) 17 | - bumping version [`66b118b`](https://github.com/tnrich/ove-electron/commit/66b118b3162fc0bb8e63895fabc8f45efcfbb264) 18 | 19 | #### [v1.3.0](https://github.com/tnrich/ove-electron/compare/v1.2.8...v1.3.0) 20 | 21 | > 5 January 2022 22 | 23 | - bumping deps [`9d8f4e2`](https://github.com/tnrich/ove-electron/commit/9d8f4e27ba7629ed45b343c48fc7ae81583cfcf5) 24 | - adding in build icons for appx [`5acaa41`](https://github.com/tnrich/ove-electron/commit/5acaa4135dea4831fa551d4167dd9054558a54fb) 25 | - updating data [`494c832`](https://github.com/tnrich/ove-electron/commit/494c832719681962356f7ab9942d02f27000980d) 26 | 27 | #### [v1.2.8](https://github.com/tnrich/ove-electron/compare/v1.2.6...v1.2.8) 28 | 29 | > 24 September 2021 30 | 31 | - adding encrypted appveyor env vars and removing env-cmd [`03231db`](https://github.com/tnrich/ove-electron/commit/03231db7e56b94293b2823630adea95f99eb5517) 32 | - adding appveyor.yml [`d954224`](https://github.com/tnrich/ove-electron/commit/d954224217d21f63ce13961968aba4074f60149b) 33 | - updating appveyor to only build windows [`777a8e0`](https://github.com/tnrich/ove-electron/commit/777a8e0a79776309e0f902704334aef0d670cd90) 34 | 35 | #### [v1.2.6](https://github.com/tnrich/ove-electron/compare/v1.2.5...v1.2.6) 36 | 37 | > 19 August 2021 38 | 39 | - releasing with updated deps [`59bd94d`](https://github.com/tnrich/ove-electron/commit/59bd94d3cdf3c2d9045e0e1a911e761e74dfb735) 40 | 41 | #### [v1.2.5](https://github.com/tnrich/ove-electron/compare/v1.2.4...v1.2.5) 42 | 43 | > 28 July 2021 44 | 45 | - adding back linux [`7544874`](https://github.com/tnrich/ove-electron/commit/75448746b98627a191347c987d4769cd06fa6b37) 46 | - update readme [`953d4bf`](https://github.com/tnrich/ove-electron/commit/953d4bf24c50f457f37ee0b8f82ea886060d2f75) 47 | 48 | #### [v1.2.4](https://github.com/tnrich/ove-electron/compare/v1.2.2...v1.2.4) 49 | 50 | > 20 July 2021 51 | 52 | - updating to allow .json files to be opened [`e9213ed`](https://github.com/tnrich/ove-electron/commit/e9213ed1009981c57a643aaec1667dd3b6bbc89a) 53 | 54 | #### [v1.2.2](https://github.com/tnrich/ove-electron/compare/v1.2.1...v1.2.2) 55 | 56 | > 8 July 2021 57 | 58 | - adding in auto annotate addon [`bfa932c`](https://github.com/tnrich/ove-electron/commit/bfa932cd7a5706de6f2dc852a48f105e98759977) 59 | - undoing test [`169a8ee`](https://github.com/tnrich/ove-electron/commit/169a8ee9ee6ad8c8db25c6ca1a7d7a6e17e8e289) 60 | - zoink [`8b62b60`](https://github.com/tnrich/ove-electron/commit/8b62b6013bdf9423b3e7e93d54025a375a0538ae) 61 | 62 | #### [v1.2.1](https://github.com/tnrich/ove-electron/compare/v1.1.1...v1.2.1) 63 | 64 | > 28 April 2021 65 | 66 | - updating readme and bumping version; commenting out --linux from build process for now (it still seems to generate an appImage even without that but just doesn't publish to snapcraft) [`b8d5e58`](https://github.com/tnrich/ove-electron/commit/b8d5e58f0da131f1ddca2c1939d4b297039d88c0) 67 | 68 | #### [v1.1.1](https://github.com/tnrich/ove-electron/compare/v1.1.0...v1.1.1) 69 | 70 | > 16 April 2021 71 | 72 | #### [v1.1.0](https://github.com/tnrich/ove-electron/compare/v1.0.1...v1.1.0) 73 | 74 | > 16 April 2021 75 | 76 | - fixing broken saving functionality https://github.com/tnrich/ove-electron/issues/18; updating all deps; refactoring to use ipcRenderer correctly instead of deprecated electron.remote module [`fc35367`](https://github.com/tnrich/ove-electron/commit/fc353675e3286219c87d90bcadceac982c885aef) 77 | - fixing modules issue; https://github.com/tnrich/ove-electron/issues/15#issuecomment-768174633 [`9dbad1a`](https://github.com/tnrich/ove-electron/commit/9dbad1a96c94317275136c8e4fe3975baae7b054) 78 | - Updating CHANGELOG [`d8abbe7`](https://github.com/tnrich/ove-electron/commit/d8abbe766ccd8244db09c34e5751098344131863) 79 | 80 | #### [v1.0.1](https://github.com/tnrich/ove-electron/compare/v1.0.0...v1.0.1) 81 | 82 | > 27 January 2021 83 | 84 | - updating readme and changelog [`ee02562`](https://github.com/tnrich/ove-electron/commit/ee02562b2ee5951bc39c2e2379881145b156a2aa) 85 | - updating deps [`f01298f`](https://github.com/tnrich/ove-electron/commit/f01298f41ef0fb8e9741f2e3deead504c98e2474) 86 | 87 | ### [v1.0.0](https://github.com/tnrich/ove-electron/compare/v0.1.10...v1.0.0) 88 | 89 | > 26 January 2021 90 | 91 | - fixing https://github.com/tnrich/ove-electron/issues/15; upgrading to electron 11 [`75c1a8f`](https://github.com/tnrich/ove-electron/commit/75c1a8fa95e1363e76fdce7a088167c2aaa28d39) 92 | 93 | #### [v0.1.10](https://github.com/tnrich/ove-electron/compare/v0.1.9...v0.1.10) 94 | 95 | > 30 July 2020 96 | 97 | - adding loggin [`5fc739b`](https://github.com/tnrich/ove-electron/commit/5fc739b757c7a66542a53e7244246c9f8a28519b) 98 | - tiny [`1409a08`](https://github.com/tnrich/ove-electron/commit/1409a086dfe14ce066c9ff23f32f34e975668087) 99 | - trying out passing the window onOpen [`915467d`](https://github.com/tnrich/ove-electron/commit/915467dc4770eda0a2780de2cc76cbe96ce1d518) 100 | 101 | #### [v0.1.9](https://github.com/tnrich/ove-electron/compare/v0.1.8...v0.1.9) 102 | 103 | > 12 April 2020 104 | 105 | - fixing new feature note create [`c0608d1`](https://github.com/tnrich/ove-electron/commit/c0608d12b05b2ef3720640b28ccfd33aded89719) 106 | 107 | #### [v0.1.8](https://github.com/tnrich/ove-electron/compare/v0.1.6...v0.1.8) 108 | 109 | > 10 April 2020 110 | 111 | - updating to latest version of OVE [`8d76441`](https://github.com/tnrich/ove-electron/commit/8d76441d60c4529bfc32aea4c00cd30af1ebcd76) 112 | - updating package.json [`0670bc2`](https://github.com/tnrich/ove-electron/commit/0670bc2407cd931c260dd65e2d3d162d5ffcbb67) 113 | - bumping version [`32b0b35`](https://github.com/tnrich/ove-electron/commit/32b0b35039e0a47d538ce02b93f954f0d5316cc4) 114 | 115 | #### [v0.1.6](https://github.com/tnrich/ove-electron/compare/v0.1.5...v0.1.6) 116 | 117 | > 17 December 2019 118 | 119 | - adding save functionality; bumping ove version to get multiple fixes-- drag fix -- window resize fix [`367ff69`](https://github.com/tnrich/ove-electron/commit/367ff69cc2cd664215f5f3d846b7eb85ee83e01e) 120 | - Update README.md [`8d278a8`](https://github.com/tnrich/ove-electron/commit/8d278a8845e5e589d22e10d69bf83822c905c2e9) 121 | - adding ability to publish linux releases [`3c7ab9a`](https://github.com/tnrich/ove-electron/commit/3c7ab9ab711b70785ec7ebd93825ed77fb9cffa8) 122 | 123 | #### [v0.1.5](https://github.com/tnrich/ove-electron/compare/v0.1.4...v0.1.5) 124 | 125 | > 30 September 2019 126 | 127 | - tiny [`e445e5e`](https://github.com/tnrich/ove-electron/commit/e445e5ee30a3a0b7b09c590e8c047f9fe31f775c) 128 | 129 | #### [v0.1.4](https://github.com/tnrich/ove-electron/compare/v0.1.3...v0.1.4) 130 | 131 | > 23 September 2019 132 | 133 | #### [v0.1.3](https://github.com/tnrich/ove-electron/compare/v0.1.2...v0.1.3) 134 | 135 | > 23 September 2019 136 | 137 | - adding dark mode, file reconfigure [`041ea40`](https://github.com/tnrich/ove-electron/commit/041ea40c10fd7c597ea7570b13890da030891489) 138 | - updating dark mode btn [`afff50d`](https://github.com/tnrich/ove-electron/commit/afff50d852fd22ce26587f6fcb7c205be6a03c7f) 139 | 140 | #### [v0.1.2](https://github.com/tnrich/ove-electron/compare/v0.1.1...v0.1.2) 141 | 142 | > 23 September 2019 143 | 144 | #### [v0.1.1](https://github.com/tnrich/ove-electron/compare/v0.1.0...v0.1.1) 145 | 146 | > 23 September 2019 147 | 148 | - test release [`ff9c67c`](https://github.com/tnrich/ove-electron/commit/ff9c67c250185842e60827d79ef9e0b1a52cb5dd) 149 | 150 | #### [v0.1.0](https://github.com/tnrich/ove-electron/compare/v0.0.7...v0.1.0) 151 | 152 | > 23 September 2019 153 | 154 | - removing unecessary popup; bumping to v0.1.0 [`d71ad89`](https://github.com/tnrich/ove-electron/commit/d71ad89773493b00fcc481d65cea84597ee2a477) 155 | - tiny [`a63be5d`](https://github.com/tnrich/ove-electron/commit/a63be5d7143b229aae9c1a0817ce5fc6132f9d62) 156 | 157 | #### [v0.0.7](https://github.com/tnrich/ove-electron/compare/v0.0.6...v0.0.7) 158 | 159 | > 23 September 2019 160 | 161 | - bumping [`3576a79`](https://github.com/tnrich/ove-electron/commit/3576a791231fafcbafd3bbebc4b1442d3b52e5a3) 162 | 163 | #### [v0.0.6](https://github.com/tnrich/ove-electron/compare/v0.0.5...v0.0.6) 164 | 165 | > 23 September 2019 166 | 167 | - adding mac notarization [`533916c`](https://github.com/tnrich/ove-electron/commit/533916c18084da34a95d94f7635f9a0f9cfdf481) 168 | - bumping version [`f9f0b6d`](https://github.com/tnrich/ove-electron/commit/f9f0b6d2fa98255f02170989415f9157d5d903a6) 169 | 170 | #### [v0.0.5](https://github.com/tnrich/ove-electron/compare/v0.0.4...v0.0.5) 171 | 172 | > 23 September 2019 173 | 174 | - fixing issues with autoupdater [`90469b0`](https://github.com/tnrich/ove-electron/commit/90469b0a1f61df893883f540b97735a33483f0cb) 175 | - tiny [`57e5056`](https://github.com/tnrich/ove-electron/commit/57e50562bd827138ce25574288b85e51412df629) 176 | - updating gitignore [`f63fc8e`](https://github.com/tnrich/ove-electron/commit/f63fc8ef91983843a22aa31b7e6fb481046ec1f1) 177 | 178 | #### [v0.0.4](https://github.com/tnrich/ove-electron/compare/v0.0.3...v0.0.4) 179 | 180 | > 19 September 2019 181 | 182 | #### [v0.0.3](https://github.com/tnrich/ove-electron/compare/0.0.2...v0.0.3) 183 | 184 | > 19 September 2019 185 | 186 | - setting up auto-updates [`0cba703`](https://github.com/tnrich/ove-electron/commit/0cba703d608b3d2827f1021c6ff885a61a633427) 187 | - adding readme; adding back preload; fixing initial open [`1ecfb41`](https://github.com/tnrich/ove-electron/commit/1ecfb4195feb4e69b36e42b0c994ad51c25bb507) 188 | 189 | #### [0.0.2](https://github.com/tnrich/ove-electron/compare/0.0.1...0.0.2) 190 | 191 | > 18 September 2019 192 | 193 | - fixing import filename passing [`223b957`](https://github.com/tnrich/ove-electron/commit/223b957eaa9adad63693c739c978ddd857ff0376) 194 | - bumping version [`3e2d717`](https://github.com/tnrich/ove-electron/commit/3e2d7172c84ad87dc89196a8c48b97b73611ce71) 195 | - fixing initial open [`cc09899`](https://github.com/tnrich/ove-electron/commit/cc09899928a0f40ea980b4516a362f5466b06c0a) 196 | 197 | #### 0.0.1 198 | 199 | > 17 September 2019 200 | 201 | - updating history [`54251c0`](https://github.com/tnrich/ove-electron/commit/54251c087b6852a576af49806a902880f10dfea0) 202 | - first commit [`9118369`](https://github.com/tnrich/ove-electron/commit/9118369b0c6f160ea8fb1f283ae79fc6456f2553) 203 | - updating dist [`8a8be66`](https://github.com/tnrich/ove-electron/commit/8a8be66a8a6e0df701647dac4f1cb2a187994ffb) 204 | -------------------------------------------------------------------------------- /pA11990.gb: -------------------------------------------------------------------------------- 1 | LOCUS pA11990 6705 bp DNA circular 06-FEB-2019 2 | FEATURES Location/Qualifiers 3 | promoter 1..19 4 | /label="T7 prom" 5 | misc_feature 19..46 6 | /label="lacO reg" 7 | misc_feature 53..127 8 | /label="RiboJ10" 9 | primer_bind 89..106 10 | /label="oIG00007" 11 | primer complement(94..127) 12 | /label="pARZ4_backbone_new_REV" 13 | primer_bind complement(94..122) 14 | /label="oIG00006" 15 | RBS 128..169 16 | /label="RiboJ10-RBSmax-F13557" 17 | CDS 170..1315 18 | /label="F13557" 19 | misc_feature 170..1315 20 | /label="insert synthon" 21 | primer_bind 424..469 22 | /label="oIG00005" 23 | primer_bind complement(424..453) 24 | /label="oIG00008" 25 | primer 1316..1344 26 | /label="pARZ4_backbone_new_FOR" 27 | terminator 1316..1516 28 | /label="DT10" 29 | plasmid 1316..127 30 | /label="backbone plasmid" 31 | misc_feature 1517..1556 32 | /label="INS230" 33 | misc_structure 1557..1562 34 | /label="linker" 35 | misc_feature 1563..1580 36 | /label="6X His tag" 37 | terminator 1591..1719 38 | /label="T7 term" 39 | rep_origin 1730..2174 40 | /label="M13 origin" 41 | rep_origin 1747..2053 42 | /label="f1 origin" 43 | CDS complement(2278..3093) 44 | /label="kan2 marker" 45 | rep_origin 3139..3821 46 | /label="colE1 origin" 47 | terminator 3195..3237 48 | /label="terminator" 49 | rep_origin 3199..3818 50 | /label="pBR322 origin" 51 | terminator 3688..3728 52 | /label="putative terminator" 53 | terminator 3796..3863 54 | /label="putative terminator(1)" 55 | terminator 4419..4458 56 | /label="putative terminator(2)" 57 | CDS 4456..4824 58 | /label="uncharacterized protein" 59 | CDS complement(4821..5177) 60 | /label="tet" 61 | CDS complement(5233..6315) 62 | /label="lacI" 63 | 5'UTR complement(6316..6343) 64 | /label="lacI 5' UTR" 65 | misc_feature complement(6407..6670) 66 | /label="tet(1)" 67 | ORIGIN 68 | 1 TAATACGACT CACTATAGGG GAATTGTGAG CGGATAACAA TTCCCCTCTA GAAGCGCTCA 69 | 61 ACGGGTGTGC TTCCCGTTCT GATGAGTCCG TGAGGACGAA AGCGCCTCTA CAAATAATTT 70 | 121 TGTTTAAAGT AGAGCTCGCG TTTTTTAGCG ATAAGGAGGT TTTTTTTTTA TGCGTGTAGG 71 | 181 AATCCCGACT GAAACCAAAA ACAATGAGTT CCGTGTTGCG ATTACCCCAG CGGGCGTGGC 72 | 241 GGAACTGACC CGTCGTGGTC ACGAAGTGCT GATTCAGGCG GGTGCGGGCG AAGGTTCTGC 73 | 301 GATTACCGAT GCAGATTTCA AAGCGGCAGG TGCCCAGTTG GTGGGCACCG CTGACCAGGT 74 | 361 GTGGGCGGAT GCCGACCTGC TGTTGAAAGT CAAAGAACCG ATTGCCGCAG AGTATGGTCG 75 | 421 TCTGCGTCAC GGTCAGATTC TGTTTACCTT TCTCCACCTG GCGGCAAGCC GTGCCTGTAC 76 | 481 CGATGCCCTG CTGGATAGCG GCACGACCAG CATTGCCTAT GAAACCGTTC AGACCGCAGA 77 | 541 TGGTGCCCTG CCGTTACTGG CACCGATGAG TGAAGTGGCG GGTCGACTTG CGGCACAAGT 78 | 601 TGGTGCGTAT CACCTGATGC GTACCCAGGG CGGTCGTGGC GTGCTGATGG GCGGTGTTCC 79 | 661 AGGAGTGGAA CCAGCGGATG TGGTTGTGAT TGGTGCTGGC ACCGCAGGCT ATAATGCGGC 80 | 721 ACGCATTGCC AATGGTATGG GTGCGACGGT GACCGTTCTG GACATCAACA TTGATAAACT 81 | 781 GCGTCAACTG GATGCCGAGT TTTGCGGTCG TATTCACACC CGTTATTCCA GTGCGTATGA 82 | 841 ACTGGAAGGT GCGGTGAAGC GTGCGGATTT AGTTATTGGT GCCGTGCTGG TGCCAGGTGC 83 | 901 GAAAGCCCCG AAACTGGTGA GCAACAGCCT GGTTGCCCAC ATGAAACCAG GTGCCGTTCT 84 | 961 GGTGGACATT GCCATTGACC AGGGCGGTTG CTTTGAAGGC AGCCGCCCGA CCACCTATGA 85 | 1021 CCATCCGACC TTCGCCGTTC ACGATACCCT GTTTTATTGC GTGGCGAATA TGCCAGCGTC 86 | 1081 GGTGCCGAAA ACCAGCACCT ATGCCCTGAC CAACGCCACG ATGCCGTATG TTCTGGAACT 87 | 1141 GGCGGACCAC GGCTGGCGTG CGGCGTGTCG AAGCAATCCA GCACTGGCGA AAGGTCTGAG 88 | 1201 CACCCACGAA GGTGCTCTGC TGAGCGAACG GGTTGCAACC GATTTAGGCG TGCCGTTTAC 89 | 1261 CGAACCAGCG TCTGTTCTGG CGGGCAGCGG CAGTCACCAT CATCATCACC ATTAATTCAG 90 | 1321 CCAAAAAACT TAAGACCGCC GGTCTTGTCC ACTACCTTGC AGTAATGCGG TGGACAGGAT 91 | 1381 CGGCGGTTTT CTTTTCTCTT CTCAATACAA ATGAAAGTAC ATAGAAATTA CTCGGTACCA 92 | 1441 AATTCCAGAA AAGAGGCCTC CCGAAAGGGG GGCCTTTTTT CGTTTTGGTC CTCATAGGCA 93 | 1501 ATACGATCGC ATGTCCGTTC TACCCTGGAC TTACAGTTGT CGGCTGAAAG CGAAACCTCG 94 | 1561 AGCACCACCA CCACCACCAC TGAGATCCGG CTGCTAACAA AGCCCGAAAG GAAGCTGAGT 95 | 1621 TGGCTGCTGC CACCGCTGAG CAATAACTAG CATAACCCCT TGGGGCCTCT AAACGGGTCT 96 | 1681 TGAGGGGTTT TTTGCTGAAA GGAGGAACTA TATCCGGATG GCGAATGGGA CGCGCCCTGT 97 | 1741 AGCGGCGCAT TAAGCGCGGC GGGTGTGGTG GTTACGCGCA GCGTGACCGC TACACTTGCC 98 | 1801 AGCGCCCTAG CGCCCGCTCC TTTCGCTTTC TTCCCTTCCT TTCTCGCCAC GTTCGCCGGC 99 | 1861 TTTCCCCGTC AAGCTCTAAA TCGGGGGCTC CCTTTAGGGT TCCGATTTAG TGCTTTACGG 100 | 1921 CACCTCGACC CCAAAAAACT TGATTAGGGT GATGGTTCAC GTAGTGGGCC ATCGCCCTGA 101 | 1981 TAGACGGTTT TTCGCCCTTT GACGTTGGAG TCCACGTTCT TTAATAGTGG ACTCTTGTTC 102 | 2041 CAAACTGGAA CAACACTCAA CCCTATCTCG GTCTATTCTT TTGATTTATA AGGGATTTTG 103 | 2101 CCGATTTCGG CCTATTGGTT AAAAAATGAG CTGATTTAAC AAAAATTTAA CGCGAATTTT 104 | 2161 AACAAAATAT TAACGTTTAC AATTTCAGGT GGCACTTTTC GGGGAAATGT GCGCGGAACC 105 | 2221 CCTATTTGTT TATTTTTCTA AATACATTCA AATATGTATC CGCTCATGAA TTAATTCTTA 106 | 2281 GAAAAACTCA TCGAGCATCA AATGAAACTG CAATTTATTC ATATCAGGAT TATCAATACC 107 | 2341 ATATTTTTGA AAAAGCCGTT TCTGTAATGA AGGAGAAAAC TCACCGAGGC AGTTCCATAG 108 | 2401 GATGGCAAGA TCCTGGTATC GGTCTGCGAT TCCGACTCGT CCAACATCAA TACAACCTAT 109 | 2461 TAATTTCCCC TCGTCAAAAA TAAGGTTATC AAGTGAGAAA TCACCATGAG TGACGACTGA 110 | 2521 ATCCGGTGAG AATGGCAAAA GTTTATGCAT TTCTTTCCAG ACTTGTTCAA CAGGCCAGCC 111 | 2581 ATTACGCTCG TCATCAAAAT CACTCGCATC AACCAAACCG TTATTCATTC GTGATTGCGC 112 | 2641 CTGAGCGAGA CGAAATACGC GATCGCTGTT AAAAGGACAA TTACAAACAG GAATCGAATG 113 | 2701 CAACCGGCGC AGGAACACTG CCAGCGCATC AACAATATTT TCACCTGAAT CAGGATATTC 114 | 2761 TTCTAATACC TGGAATGCTG TTTTCCCGGG GATCGCAGTG GTGAGTAACC ATGCATCATC 115 | 2821 AGGAGTACGG ATAAAATGCT TGATGGTCGG AAGAGGCATA AATTCCGTCA GCCAGTTTAG 116 | 2881 TCTGACCATC TCATCTGTAA CATCATTGGC AACGCTACCT TTGCCATGTT TCAGAAACAA 117 | 2941 CTCTGGCGCA TCGGGCTTCC CATACAATCG ATAGATTGTC GCACCTGATT GCCCGACATT 118 | 3001 ATCGCGAGCC CATTTATACC CATATAAATC AGCATCCATG TTGGAATTTA ATCGCGGCCT 119 | 3061 AGAGCAAGAC GTTTCCCGTT GAATATGGCT CATAACACCC CTTGTATTAC TGTTTATGTA 120 | 3121 AGCAGACAGT TTTATTGTTC ATGACCAAAA TCCCTTAACG TGAGTTTTCG TTCCACTGAG 121 | 3181 CGTCAGACCC CGTAGAAAAG ATCAAAGGAT CTTCTTGAGA TCCTTTTTTT CTGCGCGTAA 122 | 3241 TCTGCTGCTT GCAAACAAAA AAACCACCGC TACCAGCGGT GGTTTGTTTG CCGGATCAAG 123 | 3301 AGCTACCAAC TCTTTTTCCG AAGGTAACTG GCTTCAGCAG AGCGCAGATA CCAAATACTG 124 | 3361 TCCTTCTAGT GTAGCCGTAG TTAGGCCACC ACTTCAAGAA CTCTGTAGCA CCGCCTACAT 125 | 3421 ACCTCGCTCT GCTAATCCTG TTACCAGTGG CTGCTGCCAG TGGCGATAAG TCGTGTCTTA 126 | 3481 CCGGGTTGGA CTCAAGACGA TAGTTACCGG ATAAGGCGCA GCGGTCGGGC TGAACGGGGG 127 | 3541 GTTCGTGCAC ACAGCCCAGC TTGGAGCGAA CGACCTACAC CGAACTGAGA TACCTACAGC 128 | 3601 GTGAGCTATG AGAAAGCGCC ACGCTTCCCG AAGGGAGAAA GGCGGACAGG TATCCGGTAA 129 | 3661 GCGGCAGGGT CGGAACAGGA GAGCGCACGA GGGAGCTTCC AGGGGGAAAC GCCTGGTATC 130 | 3721 TTTATAGTCC TGTCGGGTTT CGCCACCTCT GACTTGAGCG TCGATTTTTG TGATGCTCGT 131 | 3781 CAGGGGGGCG GAGCCTATGG AAAAACGCCA GCAACGCGGC CTTTTTACGG TTCCTGGCCT 132 | 3841 TTTGCTGGCC TTTTGCTCAC ATGTTCTTTC CTGCGTTATC CCCTGATTCT GTGGATAACC 133 | 3901 GTATTACCGC CTTTGAGTGA GCTGATACCG CTCGCCGCAG CCGAACGACC GAGCGCAGCG 134 | 3961 AGTCAGTGAG CGAGGAAGCG GAAGAGCGCC TGATGCGGTA TTTTCTCCTT ACGCATCTGT 135 | 4021 GCGGTATTTC ACACCGCATA TATGGTGCAC TCTCAGTACA ATCTGCTCTG ATGCCGCATA 136 | 4081 GTTAAGCCAG TATACACTCC GCTATCGCTA CGTGACTGGG TCATGGCTGC GCCCCGACAC 137 | 4141 CCGCCAACAC CCGCTGACGC GCCCTGACGG GCTTGTCTGC TCCCGGCATC CGCTTACAGA 138 | 4201 CAAGCTGTGA CCGTCTCCGG GAGCTGCATG TGTCAGAGGT TTTCACCGTC ATCACCGAAA 139 | 4261 CGCGCGAGGC AGCTGCGGTA AAGCTCATCA GCGTGGTCGT GAAGCGATTC ACAGATGTCT 140 | 4321 GCCTGTTCAT CCGCGTCCAG CTCGTTGAGT TTCTCCAGAA GCGTTAATGT CTGGCTTCTG 141 | 4381 ATAAAGCGGG CCATGTTAAG GGCGGTTTTT TCCTGTTTGG TCACTGATGC CTCCGTGTAA 142 | 4441 GGGGGATTTC TGTTCATGGG GGTAATGATA CCGATGAAAC GAGAGAGGAT GCTCACGATA 143 | 4501 CGGGTTACTG ATGATGAACA TGCCCGGTTA CTGGAACGTT GTGAGGGTAA ACAACTGGCG 144 | 4561 GTATGGATGC GGCGGGACCA GAGAAAAATC ACTCAGGGTC AATGCCAGCG CTTCGTTAAT 145 | 4621 ACAGATGTAG GTGTTCCACA GGGTAGCCAG CAGCATCCTG CGATGCAGAT CCGGAACATA 146 | 4681 ATGGTGCAGG GCGCTGACTT CCGCGTTTCC AGACTTTACG AAACACGGAA ACCGAAGACC 147 | 4741 ATTCATGTTG TTGCTCAGGT CGCAGACGTT TTGCAGCAGC AGTCGCTTCA CGTTCGCTCG 148 | 4801 CGTATCGGTG ATTCATTCTG CTAACCAGTA AGGCAACCCC GCCAGCCTAG CCGGGTCCTC 149 | 4861 AACGACAGGA GCACGATCAT GCGCACCCGT GGGGCCGCCA TGCCGGCGAT AATGGCCTGC 150 | 4921 TTCTCGCCGA AACGTTTGGT GGCGGGACCA GTGACGAAGG CTTGAGCGAG GGCGTGCAAG 151 | 4981 ATTCCGAATA CCGCAAGCGA CAGGCCGATC ATCGTCGCGC TCCAGCGAAA GCGGTCCTCG 152 | 5041 CCGAAAATGA CCCAGAGCGC TGCCGGCACC TGTCCTACGA GTTGCATGAT AAAGAAGACA 153 | 5101 GTCATAAGTG CGGCGACGAT AGTCATGCCC CGCGCCCACC GGAAGGAGCT GACTGGGTTG 154 | 5161 AAGGCTCTCA AGGGCATCGG TCGAGATCCC GGTGCCTAAT GAGTGAGCTA ACTTACATTA 155 | 5221 ATTGCGTTGC GCTCACTGCC CGCTTTCCAG TCGGGAAACC TGTCGTGCCA GCTGCATTAA 156 | 5281 TGAATCGGCC AACGCGCGGG GAGAGGCGGT TTGCGTATTG GGCGCCAGGG TGGTTTTTCT 157 | 5341 TTTCACCAGT GAGACGGGCA ACAGCTGATT GCCCTTCACC GCCTGGCCCT GAGAGAGTTG 158 | 5401 CAGCAAGCGG TCCACGCTGG TTTGCCCCAG CAGGCGAAAA TCCTGTTTGA TGGTGGTTAA 159 | 5461 CGGCGGGATA TAACATGAGC TGTCTTCGGT ATCGTCGTAT CCCACTACCG AGATGTCCGC 160 | 5521 ACCAACGCGC AGCCCGGACT CGGTAATGGC GCGCATTGCG CCCAGCGCCA TCTGATCGTT 161 | 5581 GGCAACCAGC ATCGCAGTGG GAACGATGCC CTCATTCAGC ATTTGCATGG TTTGTTGAAA 162 | 5641 ACCGGACATG GCACTCCAGT CGCCTTCCCG TTCCGCTATC GGCTGAATTT GATTGCGAGT 163 | 5701 GAGATATTTA TGCCAGCCAG CCAGACGCAG ACGCGCCGAG ACAGAACTTA ATGGGCCCGC 164 | 5761 TAACAGCGCG ATTTGCTGGT GACCCAATGC GACCAGATGC TCCACGCCCA GTCGCGTACC 165 | 5821 GTCTTCATGG GAGAAAATAA TACTGTTGAT GGGTGTCTGG TCAGAGACAT CAAGAAATAA 166 | 5881 CGCCGGAACA TTAGTGCAGG CAGCTTCCAC AGCAATGGCA TCCTGGTCAT CCAGCGGATA 167 | 5941 GTTAATGATC AGCCCACTGA CGCGTTGCGC GAGAAGATTG TGCACCGCCG CTTTACAGGC 168 | 6001 TTCGACGCCG CTTCGTTCTA CCATCGACAC CACCACGCTG GCACCCAGTT GATCGGCGCG 169 | 6061 AGATTTAATC GCCGCGACAA TTTGCGACGG CGCGTGCAGG GCCAGACTGG AGGTGGCAAC 170 | 6121 GCCAATCAGC AACGACTGTT TGCCCGCCAG TTGTTGTGCC ACGCGGTTGG GAATGTAATT 171 | 6181 CAGCTCCGCC ATCGCCGCTT CCACTTTTTC CCGCGTTTTC GCAGAAACGT GGCTGGCCTG 172 | 6241 GTTCACCACG CGGGAAACGG TCTGATAAGA GACACCGGCA TACTCTGCGA CATCGTATAA 173 | 6301 CGTTACTGGT TTCACATTCA CCACCCTGAA TTGACTCTCT TCCGGGCGCT ATCATGCCAT 174 | 6361 ACCGCGAAAG GTTTTGCGCC ATTCGATGGT GTCCGGGATC TCGACGCTCT CCCTTATGCG 175 | 6421 ACTCCTGCAT TAGGAAGCAG CCCAGTAGTA GGTTGAGGCC GTTGAGCACC GCCGCCGCAA 176 | 6481 GGAATGGTGC ATGCAAGGAG ATGGCGCCCA ACAGTCCCCC GGCCACGGGG CCTGCCACCA 177 | 6541 TACCCACGCC GAAACAAGCG CTCATGAGCC CGAAGTGGCG AGCCCGATCT TCCCCATCGG 178 | 6601 TGATGTCGGC GATATAGGCG CCAGCAACCG CACCTGTGGC GCCGGTGATG CCGGCCACGA 179 | 6661 TGCGTCCGGC GTAGAGGATC GAGATCGATC TCGATCCCGC GAAAT 180 | // -------------------------------------------------------------------------------- /pA11990 copy.gb: -------------------------------------------------------------------------------- 1 | LOCUS pA11990 6705 bp DNA circular 06-FEB-2019 2 | FEATURES Location/Qualifiers 3 | promoter 1..19 4 | /label="T7 prom" 5 | misc_feature 19..46 6 | /label="lacO reg" 7 | misc_feature 53..127 8 | /label="RiboJ10" 9 | primer_bind 89..106 10 | /label="oIG00007" 11 | primer complement(94..127) 12 | /label="pARZ4_backbone_new_REV" 13 | primer_bind complement(94..122) 14 | /label="oIG00006" 15 | RBS 128..169 16 | /label="RiboJ10-RBSmax-F13557" 17 | CDS 170..1315 18 | /label="F13557" 19 | misc_feature 170..1315 20 | /label="insert synthon" 21 | primer_bind 424..469 22 | /label="oIG00005" 23 | primer_bind complement(424..453) 24 | /label="oIG00008" 25 | primer 1316..1344 26 | /label="pARZ4_backbone_new_FOR" 27 | terminator 1316..1516 28 | /label="DT10" 29 | plasmid 1316..127 30 | /label="backbone plasmid" 31 | misc_feature 1517..1556 32 | /label="INS230" 33 | misc_structure 1557..1562 34 | /label="linker" 35 | misc_feature 1563..1580 36 | /label="6X His tag" 37 | terminator 1591..1719 38 | /label="T7 term" 39 | rep_origin 1730..2174 40 | /label="M13 origin" 41 | rep_origin 1747..2053 42 | /label="f1 origin" 43 | CDS complement(2278..3093) 44 | /label="kan2 marker" 45 | rep_origin 3139..3821 46 | /label="colE1 origin" 47 | terminator 3195..3237 48 | /label="terminator" 49 | rep_origin 3199..3818 50 | /label="pBR322 origin" 51 | terminator 3688..3728 52 | /label="putative terminator" 53 | terminator 3796..3863 54 | /label="putative terminator(1)" 55 | terminator 4419..4458 56 | /label="putative terminator(2)" 57 | CDS 4456..4824 58 | /label="uncharacterized protein" 59 | CDS complement(4821..5177) 60 | /label="tet" 61 | CDS complement(5233..6315) 62 | /label="lacI" 63 | 5'UTR complement(6316..6343) 64 | /label="lacI 5' UTR" 65 | misc_feature complement(6407..6670) 66 | /label="tet(1)" 67 | ORIGIN 68 | 1 TAATACGACT CACTATAGGG GAATTGTGAG CGGATAACAA TTCCCCTCTA GAAGCGCTCA 69 | 61 ACGGGTGTGC TTCCCGTTCT GATGAGTCCG TGAGGACGAA AGCGCCTCTA CAAATAATTT 70 | 121 TGTTTAAAGT AGAGCTCGCG TTTTTTAGCG ATAAGGAGGT TTTTTTTTTA TGCGTGTAGG 71 | 181 AATCCCGACT GAAACCAAAA ACAATGAGTT CCGTGTTGCG ATTACCCCAG CGGGCGTGGC 72 | 241 GGAACTGACC CGTCGTGGTC ACGAAGTGCT GATTCAGGCG GGTGCGGGCG AAGGTTCTGC 73 | 301 GATTACCGAT GCAGATTTCA AAGCGGCAGG TGCCCAGTTG GTGGGCACCG CTGACCAGGT 74 | 361 GTGGGCGGAT GCCGACCTGC TGTTGAAAGT CAAAGAACCG ATTGCCGCAG AGTATGGTCG 75 | 421 TCTGCGTCAC GGTCAGATTC TGTTTACCTT TCTCCACCTG GCGGCAAGCC GTGCCTGTAC 76 | 481 CGATGCCCTG CTGGATAGCG GCACGACCAG CATTGCCTAT GAAACCGTTC AGACCGCAGA 77 | 541 TGGTGCCCTG CCGTTACTGG CACCGATGAG TGAAGTGGCG GGTCGACTTG CGGCACAAGT 78 | 601 TGGTGCGTAT CACCTGATGC GTACCCAGGG CGGTCGTGGC GTGCTGATGG GCGGTGTTCC 79 | 661 AGGAGTGGAA CCAGCGGATG TGGTTGTGAT TGGTGCTGGC ACCGCAGGCT ATAATGCGGC 80 | 721 ACGCATTGCC AATGGTATGG GTGCGACGGT GACCGTTCTG GACATCAACA TTGATAAACT 81 | 781 GCGTCAACTG GATGCCGAGT TTTGCGGTCG TATTCACACC CGTTATTCCA GTGCGTATGA 82 | 841 ACTGGAAGGT GCGGTGAAGC GTGCGGATTT AGTTATTGGT GCCGTGCTGG TGCCAGGTGC 83 | 901 GAAAGCCCCG AAACTGGTGA GCAACAGCCT GGTTGCCCAC ATGAAACCAG GTGCCGTTCT 84 | 961 GGTGGACATT GCCATTGACC AGGGCGGTTG CTTTGAAGGC AGCCGCCCGA CCACCTATGA 85 | 1021 CCATCCGACC TTCGCCGTTC ACGATACCCT GTTTTATTGC GTGGCGAATA TGCCAGCGTC 86 | 1081 GGTGCCGAAA ACCAGCACCT ATGCCCTGAC CAACGCCACG ATGCCGTATG TTCTGGAACT 87 | 1141 GGCGGACCAC GGCTGGCGTG CGGCGTGTCG AAGCAATCCA GCACTGGCGA AAGGTCTGAG 88 | 1201 CACCCACGAA GGTGCTCTGC TGAGCGAACG GGTTGCAACC GATTTAGGCG TGCCGTTTAC 89 | 1261 CGAACCAGCG TCTGTTCTGG CGGGCAGCGG CAGTCACCAT CATCATCACC ATTAATTCAG 90 | 1321 CCAAAAAACT TAAGACCGCC GGTCTTGTCC ACTACCTTGC AGTAATGCGG TGGACAGGAT 91 | 1381 CGGCGGTTTT CTTTTCTCTT CTCAATACAA ATGAAAGTAC ATAGAAATTA CTCGGTACCA 92 | 1441 AATTCCAGAA AAGAGGCCTC CCGAAAGGGG GGCCTTTTTT CGTTTTGGTC CTCATAGGCA 93 | 1501 ATACGATCGC ATGTCCGTTC TACCCTGGAC TTACAGTTGT CGGCTGAAAG CGAAACCTCG 94 | 1561 AGCACCACCA CCACCACCAC TGAGATCCGG CTGCTAACAA AGCCCGAAAG GAAGCTGAGT 95 | 1621 TGGCTGCTGC CACCGCTGAG CAATAACTAG CATAACCCCT TGGGGCCTCT AAACGGGTCT 96 | 1681 TGAGGGGTTT TTTGCTGAAA GGAGGAACTA TATCCGGATG GCGAATGGGA CGCGCCCTGT 97 | 1741 AGCGGCGCAT TAAGCGCGGC GGGTGTGGTG GTTACGCGCA GCGTGACCGC TACACTTGCC 98 | 1801 AGCGCCCTAG CGCCCGCTCC TTTCGCTTTC TTCCCTTCCT TTCTCGCCAC GTTCGCCGGC 99 | 1861 TTTCCCCGTC AAGCTCTAAA TCGGGGGCTC CCTTTAGGGT TCCGATTTAG TGCTTTACGG 100 | 1921 CACCTCGACC CCAAAAAACT TGATTAGGGT GATGGTTCAC GTAGTGGGCC ATCGCCCTGA 101 | 1981 TAGACGGTTT TTCGCCCTTT GACGTTGGAG TCCACGTTCT TTAATAGTGG ACTCTTGTTC 102 | 2041 CAAACTGGAA CAACACTCAA CCCTATCTCG GTCTATTCTT TTGATTTATA AGGGATTTTG 103 | 2101 CCGATTTCGG CCTATTGGTT AAAAAATGAG CTGATTTAAC AAAAATTTAA CGCGAATTTT 104 | 2161 AACAAAATAT TAACGTTTAC AATTTCAGGT GGCACTTTTC GGGGAAATGT GCGCGGAACC 105 | 2221 CCTATTTGTT TATTTTTCTA AATACATTCA AATATGTATC CGCTCATGAA TTAATTCTTA 106 | 2281 GAAAAACTCA TCGAGCATCA AATGAAACTG CAATTTATTC ATATCAGGAT TATCAATACC 107 | 2341 ATATTTTTGA AAAAGCCGTT TCTGTAATGA AGGAGAAAAC TCACCGAGGC AGTTCCATAG 108 | 2401 GATGGCAAGA TCCTGGTATC GGTCTGCGAT TCCGACTCGT CCAACATCAA TACAACCTAT 109 | 2461 TAATTTCCCC TCGTCAAAAA TAAGGTTATC AAGTGAGAAA TCACCATGAG TGACGACTGA 110 | 2521 ATCCGGTGAG AATGGCAAAA GTTTATGCAT TTCTTTCCAG ACTTGTTCAA CAGGCCAGCC 111 | 2581 ATTACGCTCG TCATCAAAAT CACTCGCATC AACCAAACCG TTATTCATTC GTGATTGCGC 112 | 2641 CTGAGCGAGA CGAAATACGC GATCGCTGTT AAAAGGACAA TTACAAACAG GAATCGAATG 113 | 2701 CAACCGGCGC AGGAACACTG CCAGCGCATC AACAATATTT TCACCTGAAT CAGGATATTC 114 | 2761 TTCTAATACC TGGAATGCTG TTTTCCCGGG GATCGCAGTG GTGAGTAACC ATGCATCATC 115 | 2821 AGGAGTACGG ATAAAATGCT TGATGGTCGG AAGAGGCATA AATTCCGTCA GCCAGTTTAG 116 | 2881 TCTGACCATC TCATCTGTAA CATCATTGGC AACGCTACCT TTGCCATGTT TCAGAAACAA 117 | 2941 CTCTGGCGCA TCGGGCTTCC CATACAATCG ATAGATTGTC GCACCTGATT GCCCGACATT 118 | 3001 ATCGCGAGCC CATTTATACC CATATAAATC AGCATCCATG TTGGAATTTA ATCGCGGCCT 119 | 3061 AGAGCAAGAC GTTTCCCGTT GAATATGGCT CATAACACCC CTTGTATTAC TGTTTATGTA 120 | 3121 AGCAGACAGT TTTATTGTTC ATGACCAAAA TCCCTTAACG TGAGTTTTCG TTCCACTGAG 121 | 3181 CGTCAGACCC CGTAGAAAAG ATCAAAGGAT CTTCTTGAGA TCCTTTTTTT CTGCGCGTAA 122 | 3241 TCTGCTGCTT GCAAACAAAA AAACCACCGC TACCAGCGGT GGTTTGTTTG CCGGATCAAG 123 | 3301 AGCTACCAAC TCTTTTTCCG AAGGTAACTG GCTTCAGCAG AGCGCAGATA CCAAATACTG 124 | 3361 TCCTTCTAGT GTAGCCGTAG TTAGGCCACC ACTTCAAGAA CTCTGTAGCA CCGCCTACAT 125 | 3421 ACCTCGCTCT GCTAATCCTG TTACCAGTGG CTGCTGCCAG TGGCGATAAG TCGTGTCTTA 126 | 3481 CCGGGTTGGA CTCAAGACGA TAGTTACCGG ATAAGGCGCA GCGGTCGGGC TGAACGGGGG 127 | 3541 GTTCGTGCAC ACAGCCCAGC TTGGAGCGAA CGACCTACAC CGAACTGAGA TACCTACAGC 128 | 3601 GTGAGCTATG AGAAAGCGCC ACGCTTCCCG AAGGGAGAAA GGCGGACAGG TATCCGGTAA 129 | 3661 GCGGCAGGGT CGGAACAGGA GAGCGCACGA GGGAGCTTCC AGGGGGAAAC GCCTGGTATC 130 | 3721 TTTATAGTCC TGTCGGGTTT CGCCACCTCT GACTTGAGCG TCGATTTTTG TGATGCTCGT 131 | 3781 CAGGGGGGCG GAGCCTATGG AAAAACGCCA GCAACGCGGC CTTTTTACGG TTCCTGGCCT 132 | 3841 TTTGCTGGCC TTTTGCTCAC ATGTTCTTTC CTGCGTTATC CCCTGATTCT GTGGATAACC 133 | 3901 GTATTACCGC CTTTGAGTGA GCTGATACCG CTCGCCGCAG CCGAACGACC GAGCGCAGCG 134 | 3961 AGTCAGTGAG CGAGGAAGCG GAAGAGCGCC TGATGCGGTA TTTTCTCCTT ACGCATCTGT 135 | 4021 GCGGTATTTC ACACCGCATA TATGGTGCAC TCTCAGTACA ATCTGCTCTG ATGCCGCATA 136 | 4081 GTTAAGCCAG TATACACTCC GCTATCGCTA CGTGACTGGG TCATGGCTGC GCCCCGACAC 137 | 4141 CCGCCAACAC CCGCTGACGC GCCCTGACGG GCTTGTCTGC TCCCGGCATC CGCTTACAGA 138 | 4201 CAAGCTGTGA CCGTCTCCGG GAGCTGCATG TGTCAGAGGT TTTCACCGTC ATCACCGAAA 139 | 4261 CGCGCGAGGC AGCTGCGGTA AAGCTCATCA GCGTGGTCGT GAAGCGATTC ACAGATGTCT 140 | 4321 GCCTGTTCAT CCGCGTCCAG CTCGTTGAGT TTCTCCAGAA GCGTTAATGT CTGGCTTCTG 141 | 4381 ATAAAGCGGG CCATGTTAAG GGCGGTTTTT TCCTGTTTGG TCACTGATGC CTCCGTGTAA 142 | 4441 GGGGGATTTC TGTTCATGGG GGTAATGATA CCGATGAAAC GAGAGAGGAT GCTCACGATA 143 | 4501 CGGGTTACTG ATGATGAACA TGCCCGGTTA CTGGAACGTT GTGAGGGTAA ACAACTGGCG 144 | 4561 GTATGGATGC GGCGGGACCA GAGAAAAATC ACTCAGGGTC AATGCCAGCG CTTCGTTAAT 145 | 4621 ACAGATGTAG GTGTTCCACA GGGTAGCCAG CAGCATCCTG CGATGCAGAT CCGGAACATA 146 | 4681 ATGGTGCAGG GCGCTGACTT CCGCGTTTCC AGACTTTACG AAACACGGAA ACCGAAGACC 147 | 4741 ATTCATGTTG TTGCTCAGGT CGCAGACGTT TTGCAGCAGC AGTCGCTTCA CGTTCGCTCG 148 | 4801 CGTATCGGTG ATTCATTCTG CTAACCAGTA AGGCAACCCC GCCAGCCTAG CCGGGTCCTC 149 | 4861 AACGACAGGA GCACGATCAT GCGCACCCGT GGGGCCGCCA TGCCGGCGAT AATGGCCTGC 150 | 4921 TTCTCGCCGA AACGTTTGGT GGCGGGACCA GTGACGAAGG CTTGAGCGAG GGCGTGCAAG 151 | 4981 ATTCCGAATA CCGCAAGCGA CAGGCCGATC ATCGTCGCGC TCCAGCGAAA GCGGTCCTCG 152 | 5041 CCGAAAATGA CCCAGAGCGC TGCCGGCACC TGTCCTACGA GTTGCATGAT AAAGAAGACA 153 | 5101 GTCATAAGTG CGGCGACGAT AGTCATGCCC CGCGCCCACC GGAAGGAGCT GACTGGGTTG 154 | 5161 AAGGCTCTCA AGGGCATCGG TCGAGATCCC GGTGCCTAAT GAGTGAGCTA ACTTACATTA 155 | 5221 ATTGCGTTGC GCTCACTGCC CGCTTTCCAG TCGGGAAACC TGTCGTGCCA GCTGCATTAA 156 | 5281 TGAATCGGCC AACGCGCGGG GAGAGGCGGT TTGCGTATTG GGCGCCAGGG TGGTTTTTCT 157 | 5341 TTTCACCAGT GAGACGGGCA ACAGCTGATT GCCCTTCACC GCCTGGCCCT GAGAGAGTTG 158 | 5401 CAGCAAGCGG TCCACGCTGG TTTGCCCCAG CAGGCGAAAA TCCTGTTTGA TGGTGGTTAA 159 | 5461 CGGCGGGATA TAACATGAGC TGTCTTCGGT ATCGTCGTAT CCCACTACCG AGATGTCCGC 160 | 5521 ACCAACGCGC AGCCCGGACT CGGTAATGGC GCGCATTGCG CCCAGCGCCA TCTGATCGTT 161 | 5581 GGCAACCAGC ATCGCAGTGG GAACGATGCC CTCATTCAGC ATTTGCATGG TTTGTTGAAA 162 | 5641 ACCGGACATG GCACTCCAGT CGCCTTCCCG TTCCGCTATC GGCTGAATTT GATTGCGAGT 163 | 5701 GAGATATTTA TGCCAGCCAG CCAGACGCAG ACGCGCCGAG ACAGAACTTA ATGGGCCCGC 164 | 5761 TAACAGCGCG ATTTGCTGGT GACCCAATGC GACCAGATGC TCCACGCCCA GTCGCGTACC 165 | 5821 GTCTTCATGG GAGAAAATAA TACTGTTGAT GGGTGTCTGG TCAGAGACAT CAAGAAATAA 166 | 5881 CGCCGGAACA TTAGTGCAGG CAGCTTCCAC AGCAATGGCA TCCTGGTCAT CCAGCGGATA 167 | 5941 GTTAATGATC AGCCCACTGA CGCGTTGCGC GAGAAGATTG TGCACCGCCG CTTTACAGGC 168 | 6001 TTCGACGCCG CTTCGTTCTA CCATCGACAC CACCACGCTG GCACCCAGTT GATCGGCGCG 169 | 6061 AGATTTAATC GCCGCGACAA TTTGCGACGG CGCGTGCAGG GCCAGACTGG AGGTGGCAAC 170 | 6121 GCCAATCAGC AACGACTGTT TGCCCGCCAG TTGTTGTGCC ACGCGGTTGG GAATGTAATT 171 | 6181 CAGCTCCGCC ATCGCCGCTT CCACTTTTTC CCGCGTTTTC GCAGAAACGT GGCTGGCCTG 172 | 6241 GTTCACCACG CGGGAAACGG TCTGATAAGA GACACCGGCA TACTCTGCGA CATCGTATAA 173 | 6301 CGTTACTGGT TTCACATTCA CCACCCTGAA TTGACTCTCT TCCGGGCGCT ATCATGCCAT 174 | 6361 ACCGCGAAAG GTTTTGCGCC ATTCGATGGT GTCCGGGATC TCGACGCTCT CCCTTATGCG 175 | 6421 ACTCCTGCAT TAGGAAGCAG CCCAGTAGTA GGTTGAGGCC GTTGAGCACC GCCGCCGCAA 176 | 6481 GGAATGGTGC ATGCAAGGAG ATGGCGCCCA ACAGTCCCCC GGCCACGGGG CCTGCCACCA 177 | 6541 TACCCACGCC GAAACAAGCG CTCATGAGCC CGAAGTGGCG AGCCCGATCT TCCCCATCGG 178 | 6601 TGATGTCGGC GATATAGGCG CCAGCAACCG CACCTGTGGC GCCGGTGATG CCGGCCACGA 179 | 6661 TGCGTCCGGC GTAGAGGATC GAGATCGATC TCGATCCCGC GAAAT 180 | // --------------------------------------------------------------------------------