lib/Genesis.js
async function symbolPhase2(val) {
						if (typeof val === 'object') {
							if (Array.isArray(val)) {
								val = await Promise.all(val.map(v => symbolPhase2(v)));
							} else {
								for (let key in val) {
									val[key] = await symbolPhase2(val[key]);
								}
							}
							return val;
						}

						if (typeof val !== 'string' || (!val.startsWith('@')))
							return val;
						let [directive, path] = val.split(':').map(v => v.toLocaleLowerCase().trim());

						if (directive == '@system') {
							let directiveTimer = log.time(val);
							let stepTimer = log.time('fs');
							let systemPath = Params.config ? Path.dirname(Params.config) : CWD;

							if (!(Path.isAbsolute(path))) {
								path = Path.join(Path.resolve(systemPath), path);
							}

							let tempConfig;

							if (!fs.existsSync(path)) {
								rejectSetup(`Specified configuration file does not exist: ${path}`);
								return;
							}
							try {
								tempConfig = JSON.parse(fs.readFileSync(path));
							} catch (e) {
								rejectSetup('Specified configuration file is in an unparsable format.');
								return;
							}
							log.timeEnd(stepTimer);

							//TODO parse out all $'s, replace with \\$
							let systemObject;
							try {
								systemObject = await setup(tempConfig, false);
							} catch (e) {
								rejectSetup(`Error processing subsystem at: ${path}`);
								return;
							}

							try { fs.mkdirSync(Path.join(CWD, 'Static')); } catch (e) {
								log.v(e);
							}

							stepTimer = log.time('bower');
							await new Promise(async resolve => {
								// let zip = new jszip();
								// let cacheBuffer = Buffer.from(systemObject.Cache, 'base64');
								// zip.loadAsync(cacheBuffer).then(async (a) => {
								// 	for (let key in a.files) {
								// 		if (key === 'manifest.json') continue;
								for (let moduleType in systemObject.ModCache) {
									let modZip = new jszip();
									// let moduleZipBinary = await zip.file(key).async('base64');
									modZip = await new Promise((res) => {
										let modZipBuffer = Buffer.from(systemObject.ModCache[moduleType], 'base64');
										modZip.loadAsync(modZipBuffer).then(zip => {
											res(zip);
										});
									});
									if (!('bower.json' in modZip.files)) continue;

									let bowerjson = await modZip.file('bower.json').async('string');
									let dependencies = JSON.parse(bowerjson).dependencies;
									let packageArray = [];
									for (let bowerModuleName in dependencies) {
										if (dependencies[bowerModuleName].indexOf('/') > 0) {
											packageArray.push(`${dependencies[bowerModuleName]}`);
										}
										else {
											packageArray.push(`${bowerModuleName}#`
												+ `${dependencies[bowerModuleName]}`);
										}
										await new Promise(res => {
											proc.execSync('bower install "--config.directory='
												+ `${Path.join(CWD, 'Static',
													'bower_components')}" "${packageArray.join('" "')}"`);
											log.v(`[BOWER] Installed ${packageArray.join(', ')}`);
											res();
										});
									}
									let bowerComponentsDir = Path.join(CWD, 'Static',
										'bower_components');
									proc.execSync('bower install "--config.directory='
										+ `${bowerComponentsDir}" "${packageArray.join('" "')}"`);
									log.v(`[BOWER] Installed ${packageArray.join(', ')}`);
								}
								resolve();
							});
							log.timeEnd(stepTimer);

							stepTimer = log.time('zip it');
							//zip up the ModCache for export to the browser or other subsystems
							let zip = await new Promise(resolveZip => {
								let zip = new jszip();
								let man = [];
								for (let folder in systemObject.ModCache) {
									let mod = Buffer.from(systemObject.ModCache[folder], 'base64');
									man.push(folder);
									zip.file(folder, mod, {
										date: new Date('April 2, 2010 00:00:01')
										//the date is required for zip consistency
									});
								}
								zip.file('manifest.json', JSON.stringify(man), {
									date: new Date('April 2, 2010 00:00:01')
									//the date is required for zip consistency
								});
								zip.generateAsync({ type: 'base64' }).then(function (data) {
									resolveZip({
										'Config': systemObject.Config,
										'Cache': data
									});
								});
							});
							log.timeEnd(stepTimer);
							log.timeEnd(directiveTimer);

							return zip;

						}
						return val;
					}
async function symbolPhase2(val) {
						if (typeof val === 'object') {
							if (Array.isArray(val)) {
								val = await Promise.all(val.map(v => symbolPhase2(v)));
							} else {
								for (let key in val) {
									val[key] = await symbolPhase2(val[key]);
								}
							}
							return val;
						}

						if (typeof val !== 'string' || (!val.startsWith('@')))
							return val;
						let [directive, path] = val.split(':').map(v => v.toLocaleLowerCase().trim());

						if (directive == '@system') {
							let directiveTimer = log.time(val);
							let stepTimer = log.time('fs');
							let systemPath = Params.config ? Path.dirname(Params.config) : CWD;

							if (!(Path.isAbsolute(path))) {
								path = Path.join(Path.resolve(systemPath), path);
							}

							let tempConfig;

							if (!fs.existsSync(path)) {
								rejectSetup(`Specified configuration file does not exist: ${path}`);
								return;
							}
							try {
								tempConfig = JSON.parse(fs.readFileSync(path));
							} catch (e) {
								rejectSetup('Specified configuration file is in an unparsable format.');
								return;
							}
							log.timeEnd(stepTimer);

							//TODO parse out all $'s, replace with \\$
							let systemObject;
							try {
								systemObject = await setup(tempConfig, false);
							} catch (e) {
								rejectSetup(`Error processing subsystem at: ${path}`);
								return;
							}

							try { fs.mkdirSync(Path.join(CWD, 'Static')); } catch (e) {
								log.v(e);
							}

							stepTimer = log.time('bower');
							await new Promise(async resolve => {
								// let zip = new jszip();
								// let cacheBuffer = Buffer.from(systemObject.Cache, 'base64');
								// zip.loadAsync(cacheBuffer).then(async (a) => {
								// 	for (let key in a.files) {
								// 		if (key === 'manifest.json') continue;
								for (let moduleType in systemObject.ModCache) {
									let modZip = new jszip();
									// let moduleZipBinary = await zip.file(key).async('base64');
									modZip = await new Promise((res) => {
										let modZipBuffer = Buffer.from(systemObject.ModCache[moduleType], 'base64');
										modZip.loadAsync(modZipBuffer).then(zip => {
											res(zip);
										});
									});
									if (!('bower.json' in modZip.files)) continue;

									let bowerjson = await modZip.file('bower.json').async('string');
									let dependencies = JSON.parse(bowerjson).dependencies;
									let packageArray = [];
									for (let bowerModuleName in dependencies) {
										if (dependencies[bowerModuleName].indexOf('/') > 0) {
											packageArray.push(`${dependencies[bowerModuleName]}`);
										}
										else {
											packageArray.push(`${bowerModuleName}#`
												+ `${dependencies[bowerModuleName]}`);
										}
										await new Promise(res => {
											proc.execSync('bower install "--config.directory='
												+ `${Path.join(CWD, 'Static',
													'bower_components')}" "${packageArray.join('" "')}"`);
											log.v(`[BOWER] Installed ${packageArray.join(', ')}`);
											res();
										});
									}
									let bowerComponentsDir = Path.join(CWD, 'Static',
										'bower_components');
									proc.execSync('bower install "--config.directory='
										+ `${bowerComponentsDir}" "${packageArray.join('" "')}"`);
									log.v(`[BOWER] Installed ${packageArray.join(', ')}`);
								}
								resolve();
							});
							log.timeEnd(stepTimer);

							stepTimer = log.time('zip it');
							//zip up the ModCache for export to the browser or other subsystems
							let zip = await new Promise(resolveZip => {
								let zip = new jszip();
								let man = [];
								for (let folder in systemObject.ModCache) {
									let mod = Buffer.from(systemObject.ModCache[folder], 'base64');
									man.push(folder);
									zip.file(folder, mod, {
										date: new Date('April 2, 2010 00:00:01')
										//the date is required for zip consistency
									});
								}
								zip.file('manifest.json', JSON.stringify(man), {
									date: new Date('April 2, 2010 00:00:01')
									//the date is required for zip consistency
								});
								zip.generateAsync({ type: 'base64' }).then(function (data) {
									resolveZip({
										'Config': systemObject.Config,
										'Cache': data
									});
								});
							});
							log.timeEnd(stepTimer);
							log.timeEnd(directiveTimer);

							return zip;

						}
						return val;
					}
process @ system directives