aboutsummaryrefslogtreecommitdiff
path: root/app/src/web
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2019-02-05 22:13:41 -0500
committerGitHub <noreply@github.com>2019-02-05 22:13:41 -0500
commit330bf2857396b15752afadb030c981a1cb2848fe (patch)
treece224b4ce241ccc58af32614052b2a407f3e89c0 /app/src/web
parentc484c2728c1688ed695205a420eba3f2b2ba179d (diff)
downloadfrost-330bf2857396b15752afadb030c981a1cb2848fe.tar.gz
frost-330bf2857396b15752afadb030c981a1cb2848fe.tar.bz2
frost-330bf2857396b15752afadb030c981a1cb2848fe.zip
Enhancement/js (#1344)
* Attempt to add package json * Add initial typescript components * Convert remaining files * Remove some null checks * Reorganize folders * Add missing js and tests for file paths * Delete unused babelrc * Remove unused packages
Diffstat (limited to 'app/src/web')
-rw-r--r--app/src/web/.gitignore25
-rw-r--r--app/src/web/.idea/compiler.xml6
-rw-r--r--app/src/web/.idea/encodings.xml4
-rw-r--r--app/src/web/.idea/misc.xml6
-rw-r--r--app/src/web/.idea/modules.xml8
-rw-r--r--app/src/web/.idea/vcs.xml6
-rw-r--r--app/src/web/.idea/watcherTasks.xml25
-rw-r--r--app/src/web/README.md4
-rw-r--r--app/src/web/assets/adblock.txt2347
-rw-r--r--app/src/web/assets/css/components/round_icons.css4
-rw-r--r--app/src/web/assets/css/components/round_icons.scss4
-rw-r--r--app/src/web/assets/css/core/_base.scss107
-rw-r--r--app/src/web/assets/css/core/_colors.scss18
-rw-r--r--app/src/web/assets/css/core/_core_bg.scss86
-rw-r--r--app/src/web/assets/css/core/_core_border.scss94
-rw-r--r--app/src/web/assets/css/core/_core_messenger.scss20
-rw-r--r--app/src/web/assets/css/core/_core_text.scss39
-rw-r--r--app/src/web/assets/css/core/_main.scss6
-rw-r--r--app/src/web/assets/css/core/_svg.scss74
-rw-r--r--app/src/web/assets/css/core/core.css306
-rw-r--r--app/src/web/assets/css/core/core.scss54
-rw-r--r--app/src/web/assets/css/themes/.gitignore2
-rw-r--r--app/src/web/assets/css/themes/custom.css338
-rw-r--r--app/src/web/assets/css/themes/custom.scss14
-rw-r--r--app/src/web/assets/css/themes/material_amoled.css338
-rw-r--r--app/src/web/assets/css/themes/material_amoled.scss11
-rw-r--r--app/src/web/assets/css/themes/material_dark.css338
-rw-r--r--app/src/web/assets/css/themes/material_dark.scss10
-rw-r--r--app/src/web/assets/css/themes/material_glass.css338
-rw-r--r--app/src/web/assets/css/themes/material_glass.scss10
-rw-r--r--app/src/web/assets/css/themes/material_light.css338
-rw-r--r--app/src/web/assets/css/themes/material_light.scss15
-rw-r--r--app/src/web/assets/js/click_a.js55
-rw-r--r--app/src/web/assets/js/click_a.ts57
-rw-r--r--app/src/web/assets/js/click_debugger.js14
-rw-r--r--app/src/web/assets/js/click_debugger.ts15
-rw-r--r--app/src/web/assets/js/context_a.js68
-rw-r--r--app/src/web/assets/js/context_a.ts69
-rw-r--r--app/src/web/assets/js/document_watcher.js24
-rw-r--r--app/src/web/assets/js/document_watcher.ts27
-rw-r--r--app/src/web/assets/js/header_badges.js8
-rw-r--r--app/src/web/assets/js/header_badges.ts7
-rw-r--r--app/src/web/assets/js/header_hider.js12
-rw-r--r--app/src/web/assets/js/header_hider.ts17
-rw-r--r--app/src/web/assets/js/media.js43
-rw-r--r--app/src/web/assets/js/media.ts47
-rw-r--r--app/src/web/assets/js/menu.js57
-rw-r--r--app/src/web/assets/js/menu.ts59
-rw-r--r--app/src/web/assets/js/notif_msg.js26
-rw-r--r--app/src/web/assets/js/notif_msg.ts25
-rw-r--r--app/src/web/assets/js/textarea_listener.js31
-rw-r--r--app/src/web/assets/js/textarea_listener.ts31
-rw-r--r--app/src/web/assets/pgl.yoyo.org.txt2409
-rw-r--r--app/src/web/assets/typings/frost.d.ts27
-rw-r--r--app/src/web/package.json5
-rw-r--r--app/src/web/tsconfig.json24
56 files changed, 8152 insertions, 0 deletions
diff --git a/app/src/web/.gitignore b/app/src/web/.gitignore
new file mode 100644
index 00000000..76a547ef
--- /dev/null
+++ b/app/src/web/.gitignore
@@ -0,0 +1,25 @@
+node_modules/
+.sass-cache/
+package-lock.json
+
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
diff --git a/app/src/web/.idea/compiler.xml b/app/src/web/.idea/compiler.xml
new file mode 100644
index 00000000..1a2fb332
--- /dev/null
+++ b/app/src/web/.idea/compiler.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="TypeScriptCompiler">
+ <option name="recompileOnChanges" value="true" />
+ </component>
+</project> \ No newline at end of file
diff --git a/app/src/web/.idea/encodings.xml b/app/src/web/.idea/encodings.xml
new file mode 100644
index 00000000..15a15b21
--- /dev/null
+++ b/app/src/web/.idea/encodings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Encoding" addBOMForNewFiles="with NO BOM" />
+</project> \ No newline at end of file
diff --git a/app/src/web/.idea/misc.xml b/app/src/web/.idea/misc.xml
new file mode 100644
index 00000000..28a804d8
--- /dev/null
+++ b/app/src/web/.idea/misc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptSettings">
+ <option name="languageLevel" value="ES6" />
+ </component>
+</project> \ No newline at end of file
diff --git a/app/src/web/.idea/modules.xml b/app/src/web/.idea/modules.xml
new file mode 100644
index 00000000..e2d63b96
--- /dev/null
+++ b/app/src/web/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/assets.iml" filepath="$PROJECT_DIR$/.idea/assets.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/app/src/web/.idea/vcs.xml b/app/src/web/.idea/vcs.xml
new file mode 100644
index 00000000..c2365ab1
--- /dev/null
+++ b/app/src/web/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
+ </component>
+</project> \ No newline at end of file
diff --git a/app/src/web/.idea/watcherTasks.xml b/app/src/web/.idea/watcherTasks.xml
new file mode 100644
index 00000000..32d1e6f4
--- /dev/null
+++ b/app/src/web/.idea/watcherTasks.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectTasksOptions">
+ <TaskOptions isEnabled="true">
+ <option name="arguments" value="--no-source-map --update $FileName$:$FileNameWithoutExtension$.css" />
+ <option name="checkSyntaxErrors" value="true" />
+ <option name="description" />
+ <option name="exitCodeBehavior" value="ERROR" />
+ <option name="fileExtension" value="scss" />
+ <option name="immediateSync" value="true" />
+ <option name="name" value="SCSS" />
+ <option name="output" value="$FileNameWithoutExtension$.css" />
+ <option name="outputFilters">
+ <array />
+ </option>
+ <option name="outputFromStdout" value="false" />
+ <option name="program" value="sass" />
+ <option name="runOnExternalChanges" value="true" />
+ <option name="scopeName" value="Project Files" />
+ <option name="trackOnlyRoot" value="true" />
+ <option name="workingDir" value="$FileDir$" />
+ <envs />
+ </TaskOptions>
+ </component>
+</project> \ No newline at end of file
diff --git a/app/src/web/README.md b/app/src/web/README.md
new file mode 100644
index 00000000..29981033
--- /dev/null
+++ b/app/src/web/README.md
@@ -0,0 +1,4 @@
+# Frost for Facebook Assets
+
+This is the root project for the assets, which is primarily css and js.
+The assets that will be added to Android are within the `assets` folder.
diff --git a/app/src/web/assets/adblock.txt b/app/src/web/assets/adblock.txt
new file mode 100644
index 00000000..a35d95c8
--- /dev/null
+++ b/app/src/web/assets/adblock.txt
@@ -0,0 +1,2347 @@
+# Ad server list for use with hosts files to block ads
+#
+# For more information about this list, see: https://pgl.yoyo.org/adservers/
+# ----
+# last updated: Wed, 12 Jul 2017 13:54:58 GMT
+# entries: 2331
+# format: hosts (hosts -- in hosts file format)
+# credits: Peter Lowe - pgl@yoyo.org - https://pgl.yoyo.org/ - https://twitter.com/pgl
+# this URL: https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext&useip=0.0.0.0
+# other formats: https://pgl.yoyo.org/adservers/formats.php
+# policy: https://pgl.yoyo.org/adservers/policy.php
+#
+# start date: Wed, 12 Jul 2017 00:00:00
+101com.com
+101order.com
+123found.com
+180hits.de
+180searchassistant.com
+207.net
+247media.com
+24log.com
+24log.de
+24pm-affiliation.com
+2mdn.net
+2o7.net
+360yield.com
+4affiliate.net
+4d5.net
+50websads.com
+518ad.com
+51yes.com
+600z.com
+777partner.com
+77tracking.com
+7bpeople.com
+7search.com
+99count.com
+a-ads.com
+a-counter.kiev.ua
+a.0day.kiev.ua
+a.aproductmsg.com
+a.collective-media.net
+a.consumer.net
+a.mktw.net
+a.sakh.com
+a.ucoz.net
+a.ucoz.ru
+a.xanga.com
+a32.g.a.yimg.com
+aaddzz.com
+abacho.net
+abc-ads.com
+absoluteclickscom.com
+abz.com
+ac.rnm.ca
+accounts.pkr.com.invalid
+acsseo.com
+actionsplash.com
+actualdeals.com
+acuityads.com
+ad-balancer.at
+ad-balancer.net
+ad-center.com
+ad-pay.de
+ad-rotator.com
+ad-server.gulasidorna.se
+ad-serverparc.nl
+ad-souk.com
+ad-space.net
+ad-tech.com
+ad-up.com
+ad.100.tbn.ru
+ad.71i.de
+ad.a8.net
+ad.abcnews.com
+ad.abctv.com
+ad.aboutwebservices.com
+ad.abum.com
+ad.afy11.net
+ad.allstar.cz
+ad.altervista.org
+ad.amgdgt.com
+ad.anuntis.com
+ad.auditude.com
+ad.bizo.com
+ad.bnmla.com
+ad.bondage.com
+ad.caradisiac.com
+ad.centrum.cz
+ad.cgi.cz
+ad.choiceradio.com
+ad.clix.pt
+ad.cooks.com
+ad.crwdcntrl.net
+ad.digitallook.com
+ad.directrev.com
+ad.doctissimo.fr
+ad.domainfactory.de
+ad.e-kolay.net
+ad.eurosport.com
+ad.f1cd.ru
+ad.flurry.com
+ad.foxnetworks.com
+ad.freecity.de
+ad.gate24.ch
+ad.globe7.com
+ad.grafika.cz
+ad.hbv.de
+ad.hodomobile.com
+ad.httpool.com
+ad.hyena.cz
+ad.iinfo.cz
+ad.ilove.ch
+ad.infoseek.com
+ad.jamba.net
+ad.jamster.co.uk
+ad.jetsoftware.com
+ad.keenspace.com
+ad.leadbolt.net
+ad.liveinternet.ru
+ad.lupa.cz
+ad.media-servers.net
+ad.mediastorm.hu
+ad.mgd.de
+ad.musicmatch.com
+ad.nachtagenten.de
+ad.nozonedata.com
+ad.nttnavi.co.jp
+ad.nwt.cz
+ad.onad.eu
+ad.pandora.tv
+ad.preferances.com
+ad.profiwin.de
+ad.prv.pl
+ad.rambler.ru
+ad.reunion.com
+ad.scanmedios.com
+ad.sensismediasmart.com.au
+ad.seznam.cz
+ad.simgames.net
+ad.slutload.com
+ad.smartclip.net
+ad.tbn.ru
+ad.technoratimedia.com
+ad.thewheelof.com
+ad.turn.com
+ad.tv2.no
+ad.twitchguru.com
+ad.usatoday.com
+ad.virtual-nights.com
+ad.wavu.hu
+ad.way.cz
+ad.weatherbug.com
+ad.wsod.com
+ad.wz.cz
+ad.yadro.ru
+ad.yourmedia.com
+ad.zanox.com
+ad0.bigmir.net
+ad01.mediacorpsingapore.com
+ad1.emediate.dk
+ad1.emule-project.org
+ad1.kde.cz
+ad1.pamedia.com.au
+ad2.iinfo.cz
+ad2.linxcz.cz
+ad2.lupa.cz
+ad2flash.com
+ad2games.com
+ad3.iinfo.cz
+ad3.pamedia.com.au
+ad4game.com
+adaction.de
+adadvisor.net
+adap.tv
+adapt.tv
+adbanner.ro
+adbard.net
+adbers.com
+adblade.com
+adblockanalytics.com
+adboost.de.vu
+adboost.net
+adbooth.net
+adbot.com
+adbrite.com
+adbroker.de
+adbunker.com
+adbutler.com
+adbutler.de
+adbuyer.com
+adbuyer3.lycos.com
+adcash.com
+adcast.deviantart.com
+adcell.de
+adcenter.mdf.se
+adcenter.net
+adcentriconline.com
+adcept.net
+adclick.com
+adclient.uimserv.net
+adclient1.tucows.com
+adcomplete.com
+adconion.com
+adcontent.gamespy.com
+adcycle.com
+add.newmedia.cz
+addealing.com
+addfreestats.com
+addme.com
+adecn.com
+ademails.com
+adengage.com
+adexchangeprediction.com
+adexpose.com
+adext.inkclub.com
+adf.ly
+adfactor.nl
+adfarm.mediaplex.com
+adflight.com
+adforce.com
+adform.com
+adgardener.com
+adgoto.com
+adgridwork.com
+adhese.be
+adhese.com
+adimage.asiaone.com.sg
+adimage.guardian.co.uk
+adimages.been.com
+adimages.carsoup.com
+adimages.go.com
+adimages.homestore.com
+adimages.omroepzeeland.nl
+adimages.sanomawsoy.fi
+adimg.cnet.com
+adimg.com.com
+adimg.uimserv.net
+adimg1.chosun.com
+adimgs.sapo.pt
+adimpact.com
+adinjector.net
+adinterax.com
+adisfy.com
+adition.com
+adition.de
+adition.net
+adizio.com
+adjix.com
+adjug.com
+adjuggler.com
+adjuggler.yourdictionary.com
+adjustnetwork.com
+adk2.com
+adk2ads.tictacti.com
+adland.ru
+adlantic.nl
+adledge.com
+adlegend.com
+adlog.com.com
+adloox.com
+adlooxtracking.com
+adlure.net
+admagnet.net
+admailtiser.com
+adman.gr
+adman.in.gr
+adman.otenet.gr
+admanagement.ch
+admanager.btopenworld.com
+admanager.carsoup.com
+admarketplace.net
+admarvel.com
+admax.nexage.com
+admedia.com
+admedia.ro
+admeld.com
+admerize.be
+admeta.com
+admex.com
+adminder.com
+adminshop.com
+admized.com
+admob.com
+admonitor.com
+admotion.com.ar
+adnet-media.net
+adnet.asahi.com
+adnet.biz
+adnet.de
+adnet.ru
+adnet.worldreviewer.com
+adnetinteractive.com
+adnetwork.net
+adnetworkperformance.com
+adnews.maddog2000.de
+adnotch.com
+adnxs.com
+adocean.pl
+adonspot.com
+adoperator.com
+adorigin.com
+adpepper.dk
+adpepper.nl
+adperium.com
+adpia.vn
+adplus.co.id
+adplxmd.com
+adprofile.net
+adprojekt.pl
+adq.nextag.com
+adrazzi.com
+adreactor.com
+adrecreate.com
+adremedy.com
+adreporting.com
+adres.internet.com
+adrevolver.com
+adriver.ru
+adrolays.de
+adrotate.de
+adrotator.se
+adrta.com
+ads-click.com
+ads.4tube.com
+ads.5ci.lt
+ads.abovetopsecret.com
+ads.aceweb.net
+ads.activestate.com
+ads.adfox.ru
+ads.administrator.de
+ads.adshareware.net
+ads.adultfriendfinder.com
+ads.adultswim.com
+ads.advance.net
+ads.adverline.com
+ads.affiliates.match.com
+ads.ak.facebook.com.edgesuite.net
+ads.allvatar.com
+ads.alt.com
+ads.amdmb.com
+ads.amigos.com
+ads.aol.co.uk
+ads.aol.com
+ads.apn.co.nz
+ads.appsgeyser.com
+ads.as4x.tmcs.net
+ads.as4x.tmcs.ticketmaster.com
+ads.asia1.com.sg
+ads.asiafriendfinder.com
+ads.ask.com
+ads.aspalliance.com
+ads.avazu.net
+ads.batpmturner.com
+ads.beenetworks.net
+ads.belointeractive.com
+ads.berlinonline.de
+ads.betanews.com
+ads.betfair.com
+ads.betfair.com.au
+ads.bigchurch.com
+ads.bigfoot.com
+ads.bing.com
+ads.bittorrent.com
+ads.blog.com
+ads.bloomberg.com
+ads.bluelithium.com
+ads.bluemountain.com
+ads.bluesq.com
+ads.bonniercorp.com
+ads.boylesports.com
+ads.brabys.com
+ads.brazzers.com
+ads.bumq.com
+ads.businessweek.com
+ads.canalblog.com
+ads.canoe.ca
+ads.casinocity.com
+ads.cbc.ca
+ads.cc
+ads.cc-dt.com
+ads.centraliprom.com
+ads.cgnetworks.com
+ads.channel4.com
+ads.clearchannel.com
+ads.co.com
+ads.com.com
+ads.contactmusic.com
+ads.contentabc.com
+ads.contextweb.com
+ads.crakmedia.com
+ads.creative-serving.com
+ads.creativematch.com
+ads.cricbuzz.com
+ads.cybersales.cz
+ads.dada.it
+ads.datinggold.com
+ads.datingyes.com
+ads.dazoot.ro
+ads.deltha.hu
+ads.dennisnet.co.uk
+ads.desmoinesregister.com
+ads.detelefoongids.nl
+ads.deviantart.com
+ads.digital-digest.com
+ads.digitalmedianet.com
+ads.digitalpoint.com
+ads.directionsmag.com
+ads.domain.com
+ads.domeus.com
+ads.eagletribune.com
+ads.easy-forex.com
+ads.eatinparis.com
+ads.economist.com
+ads.edbindex.dk
+ads.egrana.com.br
+ads.einmedia.com
+ads.electrocelt.com
+ads.elitetrader.com
+ads.emirates.net.ae
+ads.epltalk.com
+ads.eu.msn.com
+ads.exactdrive.com
+ads.expat-blog.biz
+ads.expedia.com
+ads.ezboard.com
+ads.factorymedia.com
+ads.fairfax.com.au
+ads.faxo.com
+ads.ferianc.com
+ads.filmup.com
+ads.financialcontent.com
+ads.flooble.com
+ads.fool.com
+ads.footymad.net
+ads.forbes.com
+ads.forbes.net
+ads.forium.de
+ads.fortunecity.com
+ads.fotosidan.se
+ads.foxkidseurope.net
+ads.foxnetworks.com
+ads.foxnews.com
+ads.freecity.de
+ads.friendfinder.com
+ads.ft.com
+ads.futurenet.com
+ads.gamecity.net
+ads.gamershell.com
+ads.gamespyid.com
+ads.gamigo.de
+ads.gaming-universe.de
+ads.gawker.com
+ads.geekswithblogs.net
+ads.glispa.com
+ads.gmodules.com
+ads.godlikeproductions.com
+ads.goyk.com
+ads.gplusmedia.com
+ads.gradfinder.com
+ads.grindinggears.com
+ads.groundspeak.com
+ads.gsm-exchange.com
+ads.gsmexchange.com
+ads.guardian.co.uk
+ads.guardianunlimited.co.uk
+ads.guru3d.com
+ads.hardwaresecrets.com
+ads.harpers.org
+ads.hbv.de
+ads.hearstmags.com
+ads.heartlight.org
+ads.heias.com
+ads.hideyourarms.com
+ads.hollywood.com
+ads.horsehero.com
+ads.horyzon-media.com
+ads.iafrica.com
+ads.ibest.com.br
+ads.ibryte.com
+ads.icq.com
+ads.ign.com
+ads.img.co.za
+ads.imgur.com
+ads.indiatimes.com
+ads.infi.net
+ads.internic.co.il
+ads.ipowerweb.com
+ads.isoftmarketing.com
+ads.itv.com
+ads.iwon.com
+ads.jewishfriendfinder.com
+ads.jiwire.com
+ads.jobsite.co.uk
+ads.jpost.com
+ads.jubii.dk
+ads.justhungry.com
+ads.kaktuz.net
+ads.kelbymediagroup.com
+ads.kinobox.cz
+ads.kinxxx.com
+ads.kompass.com
+ads.krawall.de
+ads.lesbianpersonals.com
+ads.linuxfoundation.org
+ads.linuxjournal.com
+ads.linuxsecurity.com
+ads.livenation.com
+ads.mariuana.it
+ads.massinfra.nl
+ads.mcafee.com
+ads.mediaodyssey.com
+ads.medienhaus.de
+ads.mgnetwork.com
+ads.mmania.com
+ads.moceanads.com
+ads.motor-forum.nl
+ads.motormedia.nl
+ads.msn.com
+ads.multimania.lycos.fr
+ads.nationalgeographic.com
+ads.ncm.com
+ads.netmechanic.com
+ads.networksolutions.com
+ads.newdream.net
+ads.newgrounds.com
+ads.newmedia.cz
+ads.newsint.co.uk
+ads.newsquest.co.uk
+ads.ninemsn.com.au
+ads.nj.com
+ads.nola.com
+ads.nordichardware.com
+ads.nordichardware.se
+ads.nwsource.com
+ads.nyi.net
+ads.nytimes.com
+ads.nyx.cz
+ads.nzcity.co.nz
+ads.o2.pl
+ads.oddschecker.com
+ads.okcimg.com
+ads.ole.com
+ads.olivebrandresponse.com
+ads.oneplace.com
+ads.ookla.com
+ads.optusnet.com.au
+ads.outpersonals.com
+ads.passion.com
+ads.pennet.com
+ads.penny-arcade.com
+ads.pheedo.com
+ads.phpclasses.org
+ads.pickmeup-ltd.com
+ads.planet.nl
+ads.pni.com
+ads.pof.com
+ads.powweb.com
+ads.primissima.it
+ads.printscr.com
+ads.prisacom.com
+ads.program3.com
+ads.psd2html.com
+ads.pushplay.com
+ads.quoka.de
+ads.rcs.it
+ads.recoletos.es
+ads.rediff.com
+ads.redlightcenter.com
+ads.redtube.com
+ads.resoom.de
+ads.returnpath.net
+ads.s3.sitepoint.com
+ads.satyamonline.com
+ads.savannahnow.com
+ads.saymedia.com
+ads.scifi.com
+ads.seniorfriendfinder.com
+ads.servebom.com
+ads.sexinyourcity.com
+ads.shizmoo.com
+ads.shopstyle.com
+ads.sift.co.uk
+ads.silverdisc.co.uk
+ads.slim.com
+ads.smartclick.com
+ads.soft32.com
+ads.space.com
+ads.sptimes.com
+ads.stackoverflow.com
+ads.sun.com
+ads.supplyframe.com
+ads.t-online.de
+ads.tahono.com
+ads.techtv.com
+ads.telegraph.co.uk
+ads.themovienation.com
+ads.thestar.com
+ads.tmcs.net
+ads.totallyfreestuff.com
+ads.townhall.com
+ads.trinitymirror.co.uk
+ads.tripod.com
+ads.tripod.lycos.co.uk
+ads.tripod.lycos.de
+ads.tripod.lycos.es
+ads.tripod.lycos.it
+ads.tripod.lycos.nl
+ads.tripod.spray.se
+ads.tso.dennisnet.co.uk
+ads.uknetguide.co.uk
+ads.ultimate-guitar.com
+ads.uncrate.com
+ads.undertone.com
+ads.usatoday.com
+ads.v3.com
+ads.verticalresponse.com
+ads.vgchartz.com
+ads.videosz.com
+ads.virtual-nights.com
+ads.virtualcountries.com
+ads.vnumedia.com
+ads.waps.cn
+ads.wapx.cn
+ads.weather.ca
+ads.web.aol.com
+ads.web.cs.com
+ads.web.de
+ads.webmasterpoint.org
+ads.websiteservices.com
+ads.whi.co.nz
+ads.whoishostingthis.com
+ads.wiezoekje.nl
+ads.wikia.nocookie.net
+ads.wineenthusiast.com
+ads.wwe.biz
+ads.xhamster.com
+ads.xtra.co.nz
+ads.y-0.net
+ads.yahoo.com
+ads.yimg.com
+ads.yldmgrimg.net
+ads.yourfreedvds.com
+ads.youtube.com
+ads.zdnet.com
+ads.ztod.com
+ads03.redtube.com
+ads1.canoe.ca
+ads1.mediacapital.pt
+ads1.msn.com
+ads1.rne.com
+ads1.virtual-nights.com
+ads10.speedbit.com
+ads180.com
+ads2.brazzers.com
+ads2.clearchannel.com
+ads2.contentabc.com
+ads2.gamecity.net
+ads2.jubii.dk
+ads2.net-communities.co.uk
+ads2.oneplace.com
+ads2.rne.com
+ads2.virtual-nights.com
+ads2.xnet.cz
+ads2004.treiberupdate.de
+ads3.contentabc.com
+ads3.gamecity.net
+ads3.virtual-nights.com
+ads4.clearchannel.com
+ads4.gamecity.net
+ads4.virtual-nights.com
+ads4homes.com
+ads5.canoe.ca
+ads5.virtual-nights.com
+ads6.gamecity.net
+ads7.gamecity.net
+ads8.com
+adsatt.abc.starwave.com
+Adsatt.ABCNews.starwave.com
+adsatt.espn.go.com
+adsatt.espn.starwave.com
+Adsatt.go.starwave.com
+adsby.bidtheatre.com
+adscale.de
+adscholar.com
+adscience.nl
+adscpm.com
+adsdaq.com
+adsdk.com
+adsend.de
+adserv.evo-x.de
+adserv.gamezone.de
+adserv.iafrica.com
+adserv.qconline.com
+adserve.ams.rhythmxchange.com
+adserver-live.yoc.mobi
+adserver.43plc.com
+adserver.71i.de
+adserver.adultfriendfinder.com
+adserver.aidameter.com
+adserver.aol.fr
+adserver.beggarspromo.com
+adserver.betandwin.de
+adserver.bing.com
+adserver.bizhat.com
+adserver.break-even.it
+adserver.cams.com
+adserver.com
+adserver.digitoday.com
+adserver.dotcommedia.de
+adserver.finditquick.com
+adserver.flossiemediagroup.com
+adserver.freecity.de
+adserver.freenet.de
+adserver.friendfinder.com
+adserver.hardsextube.com
+adserver.hardwareanalysis.com
+adserver.html.it
+adserver.irishwebmasterforum.com
+adserver.janes.com
+adserver.libero.it
+adserver.news.com.au
+adserver.ngz-network.de
+adserver.nydailynews.com
+adserver.o2.pl
+adserver.oddschecker.com
+adserver.omroepzeeland.nl
+adserver.pl
+adserver.portalofevil.com
+adserver.portugalmail.net
+adserver.portugalmail.pt
+adserver.sanomawsoy.fi
+adserver.sciflicks.com
+adserver.sharewareonline.com
+adserver.spankaway.com
+adserver.startnow.com
+adserver.theonering.net
+adserver.twitpic.com
+adserver.viagogo.com
+adserver.virginmedia.com
+adserver.yahoo.com
+adserver01.de
+adserver1-images.backbeatmedia.com
+adserver1.backbeatmedia.com
+adserver1.mindshare.de
+adserver1.ogilvy-interactive.de
+adserver2.mindshare.de
+adserverplus.com
+adserversolutions.com
+adservinginternational.com
+adsfac.eu
+adsfac.net
+adsfac.us
+adshost1.com
+adside.com
+adsk2.co
+adskape.ru
+adsklick.de
+adsmarket.com
+adsmart.co.uk
+adsmart.com
+adsmart.net
+adsmogo.com
+adsnative.com
+adsoftware.com
+adsoldier.com
+adsonar.com
+adspace.ro
+adspeed.net
+adspirit.de
+adsponse.de
+adsremote.scrippsnetworks.com
+adsrevenue.net
+adsrv.deviantart.com
+adsrv.eacdn.com
+adsrv.iol.co.za
+adsrvr.org
+adsstat.com
+adstat.4u.pl
+adstest.weather.com
+adsupply.com
+adsymptotic.com
+adsynergy.com
+adsys.townnews.com
+adsystem.simplemachines.org
+adtech.de
+adtechus.com
+adtegrity.net
+adthis.com
+adtiger.de
+adtoll.com
+adtology.com
+adtoma.com
+adtrace.org
+adtrade.net
+adtrading.de
+adtrak.net
+adtriplex.com
+adultadvertising.com
+adv-adserver.com
+adv-banner.libero.it
+adv.cooperhosting.net
+adv.freeonline.it
+adv.hwupgrade.it
+adv.livedoor.com
+adv.webmd.com
+adv.wp.pl
+adv.yo.cz
+advariant.com
+adventory.com
+advert.bayarea.com
+advert.dyna.ultraweb.hu
+adverticum.com
+adverticum.net
+adverticus.de
+advertise.com
+advertiseireland.com
+advertisespace.com
+advertising.com
+advertising.guildlaunch.net
+advertisingbanners.com
+advertisingbox.com
+advertisingtag.net
+advertmarket.com
+advertmedia.de
+advertpro.sitepoint.com
+advertpro.ya.com
+adverts.carltononline.com
+advertserve.com
+advertstream.com
+advertwizard.com
+advideo.uimserv.net
+adview.ppro.de
+advisormedia.cz
+adviva.net
+advnt.com
+adwareremovergold.com
+adwhirl.com
+adwitserver.com
+adworldnetwork.com
+adworx.at
+adworx.be
+adworx.nl
+adx.allstar.cz
+adx.atnext.com
+adxpansion.com
+adxpose.com
+adxvalue.com
+adyea.com
+adzerk.net
+adzerk.s3.amazonaws.com
+adzones.com
+af-ad.co.uk
+affbuzzads.com
+affili.net
+affiliate.1800flowers.com
+affiliate.doubleyourdating.com
+affiliate.dtiserv.com
+affiliate.gamestop.com
+affiliate.mercola.com
+affiliate.mogs.com
+affiliate.offgamers.com
+affiliate.travelnow.com
+affiliate.viator.com
+affiliatefuel.com
+affiliatefuture.com
+affiliates.allposters.com
+affiliates.babylon.com
+affiliates.digitalriver.com
+affiliates.globat.com
+affiliates.internationaljock.com
+affiliates.streamray.com
+affiliates.thinkhost.net
+affiliates.thrixxx.com
+affiliates.ultrahosting.com
+affiliatetracking.com
+affiliatetracking.net
+affiliatewindow.com
+affiliation-france.com
+afftracking.justanswer.com
+ah-ha.com
+ahalogy.com
+aidu-ads.de
+aim4media.com
+aistat.net
+aktrack.pubmatic.com
+alclick.com
+alenty.com
+alexa-sitestats.s3.amazonaws.com
+alipromo.com
+all4spy.com
+alladvantage.com
+allosponsor.com
+amazingcounters.com
+amazon-adsystem.com
+americash.com
+amung.us
+an.tacoda.net
+anahtars.com
+analytics.adpost.org
+analytics.google.com
+analytics.live.com
+analytics.yahoo.com
+anm.intelli-direct.com
+annonser.dagbladet.no
+api.intensifier.de
+apture.com
+arc1.msn.com
+arcadebanners.com
+ard.xxxblackbook.com
+are-ter.com
+as.webmd.com
+as1.advfn.com
+assets1.exgfnetwork.com
+assoc-amazon.com
+at-adserver.alltop.com
+atdmt.com
+athena-ads.wikia.com
+atwola.com
+auctionads.com
+auctionads.net
+audience2media.com
+audit.median.hu
+audit.webinform.hu
+auto-bannertausch.de
+autohits.dk
+avenuea.com
+avpa.javalobby.org
+avres.net
+avsads.com
+awempire.com
+awin1.com
+azfront.com
+b-1st.com
+b.aol.com
+b.engadget.com
+ba.afl.rakuten.co.jp
+babs.tv2.dk
+backbeatmedia.com
+banik.redigy.cz
+banner-exchange-24.de
+banner.ad.nu
+banner.ambercoastcasino.com
+banner.blogranking.net
+banner.buempliz-online.ch
+banner.casino.net
+banner.casinodelrio.com
+banner.cotedazurpalace.com
+banner.coza.com
+banner.cz
+banner.easyspace.com
+banner.elisa.net
+banner.eurogrand.com
+banner.featuredusers.com
+banner.getgo.de
+banner.goldenpalace.com
+banner.img.co.za
+banner.inyourpocket.com
+banner.kiev.ua
+banner.linux.se
+banner.media-system.de
+banner.mindshare.de
+banner.nixnet.cz
+banner.noblepoker.com
+banner.northsky.com
+banner.orb.net
+banner.penguin.cz
+banner.rbc.ru
+banner.relcom.ru
+banner.tanto.de
+banner.titan-dsl.de
+banner.vadian.net
+banner.webmersion.com
+banner.wirenode.com
+bannerads.de
+bannerboxes.com
+bannercommunity.de
+bannerconnect.com
+bannerconnect.net
+bannerexchange.cjb.net
+bannerflow.com
+bannergrabber.internet.gr
+bannerhost.com
+bannerimage.com
+bannerlandia.com.ar
+bannermall.com
+bannermarkt.nl
+bannerpower.com
+banners.adultfriendfinder.com
+banners.amigos.com
+banners.asiafriendfinder.com
+banners.audioholics.com
+banners.babylon-x.com
+banners.bol.com.br
+banners.cams.com
+banners.clubseventeen.com
+banners.czi.cz
+banners.dine.com
+banners.direction-x.com
+banners.directnic.com
+banners.easydns.com
+banners.freett.com
+banners.friendfinder.com
+banners.getiton.com
+banners.iq.pl
+banners.isoftmarketing.com
+banners.lifeserv.com
+banners.linkbuddies.com
+banners.passion.com
+banners.resultonline.com
+banners.sexsearch.com
+banners.sys-con.com
+banners.thomsonlocal.com
+banners.videosz.com
+banners.virtuagirlhd.com
+banners.wunderground.com
+bannerserver.com
+bannersgomlm.com
+bannershotlink.perfectgonzo.com
+bannersng.yell.com
+bannerspace.com
+bannerswap.com
+bannertesting.com
+bannery.cz
+bannieres.acces-contenu.com
+bans.adserver.co.il
+bans.bride.ru
+barnesandnoble.bfast.com
+basebanner.com
+baypops.com
+bbelements.com
+bbn.img.com.ua
+begun.ru
+belstat.com
+belstat.nl
+berp.com
+best-pr.info
+best-top.ro
+bestsearch.net
+bhclicks.com
+bidclix.com
+bidclix.net
+bidswitch.net
+bidtrk.com
+bidvertiser.com
+bigbangmedia.com
+bigclicks.com
+billboard.cz
+bitads.net
+bitmedianetwork.com
+bizad.nikkeibp.co.jp
+bizrate.com
+blast4traffic.com
+blingbucks.com
+blogads.com
+blogcounter.de
+blogherads.com
+blogrush.com
+blogtoplist.se
+blogtopsites.com
+blueadvertise.com
+bluekai.com
+bluelithium.com
+bluewhaleweb.com
+bm.annonce.cz
+bn.bfast.com
+boersego-ads.de
+boldchat.com
+boom.ro
+boomads.com
+boost-my-pr.de
+box.anchorfree.net
+bpath.com
+braincash.com
+brandreachsys.com
+bravenet.com.invalid
+bridgetrack.com
+brightinfo.com
+british-banners.com
+bs.yandex.ru
+bttrack.com
+budsinc.com
+bullseye.backbeatmedia.com
+buyhitscheap.com
+buysellads.com
+buzzonclick.com
+bvalphaserver.com
+bwp.download.com
+c.bigmir.net
+c1.nowlinux.com
+c1exchange.com
+campaign.bharatmatrimony.com
+caniamedia.com
+carbonads.com
+carbonads.net
+casalemedia.com
+casalmedia.com
+cash4members.com
+cash4popup.de
+cashcrate.com
+cashengines.com
+cashfiesta.com
+cashlayer.com
+cashpartner.com
+casinogames.com
+casinopays.com
+casinorewards.com
+casinotraffic.com
+casinotreasure.com
+cbanners.virtuagirlhd.com
+cbmall.com
+cdn.freefacti.com
+cdn.freefarcy.com
+cecash.com
+centerpointmedia.com
+ceskydomov.alias.ngs.modry.cz
+cetrk.com
+cgicounter.puretec.de
+ch.questionmarket.com
+chameleon.ad
+channelintelligence.com
+chart.dk
+chartbeat.com
+chartbeat.net
+checkm8.com
+checkstat.nl
+chestionar.ro
+chitika.net
+cibleclick.com.invalid
+cityads.telus.net
+cj.com
+cjbmanagement.com
+cjlog.com
+claria.com
+class-act-clicks.com
+click.absoluteagency.com
+click.fool.com
+click.kmindex.ru
+click2freemoney.com
+click2paid.com
+clickability.com
+clickadz.com
+clickagents.com
+clickbank.com
+clickbank.net
+clickbooth.com
+clickboothlnk.com
+clickbrokers.com
+clickcompare.co.uk
+clickdensity.com
+clickedyclick.com
+clickhereforcellphones.com
+clickhouse.com
+clickhype.com
+clicklink.jp
+clickmedia.ro
+clickonometrics.pl
+clicks.equantum.com
+clicks.mods.de
+clickserve.cc-dt.com
+clicksor.com
+clicktag.de
+clickthruserver.com
+clickthrutraffic.com
+clicktrace.info
+clicktrack.ziyu.net
+clicktracks.com
+clicktrade.com
+clickxchange.com
+clickz.com
+clickzxc.com
+clicmanager.fr
+clientmetrics-pa.googleapis.com
+clients.tbo.com
+clixgalore.com
+clk.konflab.com
+clkads.com
+clkrev.com
+cluster.adultworld.com
+clustrmaps.com
+cmpstar.com
+cnomy.com
+cnt.spbland.ru
+cnt1.pocitadlo.cz
+code-server.biz
+colonize.com
+comclick.com
+commindo-media-ressourcen.de
+commissionmonster.com
+compactbanner.com
+comprabanner.it
+confirmed-profits.com
+connextra.com
+contaxe.de
+content.acc-hd.de
+content.ad
+contextweb.com
+conversantmedia.com
+conversionruler.com
+cookies.cmpnet.com
+coremetrics.com
+count.rbc.ru
+count.rin.ru
+count.west263.com
+counted.com
+counter.bloke.com
+counter.cnw.cz
+counter.cz
+counter.dreamhost.com
+counter.fateback.com
+counter.mirohost.net
+counter.mojgorod.ru
+counter.nowlinux.com
+counter.rambler.ru
+counter.search.bg
+counter.sparklit.com
+counter.yadro.ru
+counters.honesty.com
+counting.kmindex.ru
+counts.tucows.com
+coupling-media.de
+cpalead.com
+cpays.com
+cpmaffiliation.com
+cpmstar.com
+cpxinteractive.com
+cqcounter.com
+crakmedia.com
+craktraffic.com
+crawlability.com
+crazypopups.com
+creafi-online-media.com
+creative.whi.co.nz
+creatives.as4x.tmcs.net
+creatives.livejasmin.com
+crispads.com
+criteo.com
+crowdgravity.com
+crtv.mate1.com
+crwdcntrl.net
+ctnetwork.hu
+cubics.com
+customad.cnn.com
+cyberbounty.com
+cybermonitor.com
+d.adroll.com
+dakic-ia-300.com
+danban.com
+dapper.net
+datashreddergold.com
+dbbsrv.com
+dc-storm.com
+de17a.com
+dealdotcom.com
+debtbusterloans.com
+decknetwork.net
+deloo.de
+demandbase.com
+demdex.net
+di1.shopping.com
+dialerporn.com
+didtheyreadit.com
+direct-xxx-access.com
+directaclick.com
+directivepub.com
+directleads.com
+directorym.com
+directtrack.com
+discountclick.com
+displayadsmedia.com
+dist.belnk.com
+dmtracker.com
+dmtracking.alibaba.com
+dmtracking2.alibaba.com
+dnads.directnic.com
+domaining.in
+domainsponsor.com
+domainsteam.de
+domdex.com
+doubleclick.com
+doubleclick.de
+doubleclick.net
+doublepimp.com
+drumcash.com
+dynamic.fmpub.net
+e-adimages.scrippsnetworks.com
+e-bannerx.com
+e-debtconsolidation.com
+e-m.fr
+e-n-t-e-r-n-e-x.com
+e-planning.net
+e.kde.cz
+eadexchange.com
+eas.almamedia.fi
+easyhits4u.com
+ebayadvertising.com
+ebocornac.com
+ebuzzing.com
+ecircle-ag.com
+eclick.vn
+ecoupons.com
+edgeio.com
+effectivemeasure.com
+effectivemeasure.net
+eiv.baidu.com
+elitedollars.com
+elitetoplist.com
+emarketer.com
+emediate.dk
+emediate.eu
+engine.espace.netavenir.com
+enginenetwork.com
+enoratraffic.com
+enquisite.com
+entercasino.com
+entrecard.s3.amazonaws.com
+eqads.com
+ero-advertising.com
+esellerate.net
+estat.com
+etahub.com
+etargetnet.com
+etracker.de
+eu-adcenter.net
+eu1.madsone.com
+eur.a1.yimg.com
+eurekster.com
+euroclick.com
+euros4click.de
+eusta.de
+evergage.com
+evidencecleanergold.com
+ewebcounter.com
+exchange-it.com
+exchange.bg
+exchangead.com
+exchangeclicksonline.com
+exelator.com
+exit76.com
+exitexchange.com
+exitfuel.com
+exoclick.com
+exogripper.com
+experteerads.com
+exponential.com
+express-submit.de
+extractorandburner.com
+extreme-dm.com
+extremetracking.com
+eyeblaster.com
+eyereturn.com
+eyeviewads.com
+eyewonder.com
+ezula.com
+f5biz.com
+fast-adv.it
+fastclick.com
+fastclick.com.edgesuite.net
+fastclick.net
+fb-promotions.com
+fc.webmasterpro.de
+feedbackresearch.com
+feedjit.com
+ffxcam.fairfax.com.au
+fimc.net
+fimserve.com
+findcommerce.com
+findyourcasino.com
+fineclicks.com
+first.nova.cz
+firstlightera.com
+flashtalking.com
+fleshlightcash.com
+flexbanner.com
+flowgo.com
+flurry.com
+fonecta.leiki.com
+foo.cosmocode.de
+forex-affiliate.net
+fpctraffic.com
+fpctraffic2.com
+fragmentserv.iac-online.de
+free-banners.com
+freebanner.com
+freelogs.com
+freeonlineusers.com
+freepay.com
+freestats.com
+freestats.tv
+freewebcounter.com
+funklicks.com
+funpageexchange.com
+fusionads.net
+fusionquest.com
+fxstyle.net
+galaxien.com
+game-advertising-online.com
+gamehouse.com
+gamesites100.net
+gamesites200.com
+gamesitestop100.com
+gator.com
+gbanners.hornymatches.com
+gemius.pl
+geo.digitalpoint.com
+geobanner.adultfriendfinder.com
+geovisite.com
+getclicky.com
+globalismedia.com
+globaltakeoff.net
+globaltrack.com.invalid
+globe7.com
+globus-inter.com
+gmads.net
+go-rank.de
+goingplatinum.com
+goldstats.com
+google-analytics.com
+googleadservices.com
+googleads.g.doubleclick.net
+googlesyndication.com
+gostats.com
+gp.dejanews.com
+gpr.hu
+grafstat.ro
+grapeshot.co.uk
+greystripe.com
+gtop100.com
+gunggo.com
+harrenmedia.com
+harrenmedianetwork.com
+havamedia.net
+heias.com
+hentaicounter.com
+herbalaffiliateprogram.com
+hexusads.fluent.ltd.uk
+heyos.com
+hgads.com
+hidden.gogoceleb.com
+hightrafficads.com
+histats.com
+hit-parade.com
+hit.bg
+hit.ua
+hit.webcentre.lycos.co.uk
+hitbox.com
+hitcents.com
+hitfarm.com
+hitiz.com
+hitlist.ru
+hitlounge.com
+hitometer.com
+hits.europuls.eu
+hits.informer.com
+hits.puls.lv
+hits.theguardian.com
+hits4me.com
+hits4pay.com
+hitslink.com
+hittail.com
+hollandbusinessadvertising.nl
+homepageking.de
+hostedads.realitykings.com
+hotjar.com
+hotkeys.com
+hotlog.ru
+hotrank.com.tw
+hs-analytics.net
+htmlhubing.xyz
+httpool.com
+hurricanedigitalmedia.com
+hydramedia.com
+hyperbanner.net
+hypertracker.com
+i-clicks.net
+i.xx.openx.com
+i1img.com
+i1media.no
+ia.iinfo.cz
+iad.anm.co.uk
+iadnet.com
+iasds01.com
+iconadserver.com
+icptrack.com
+idcounter.com
+identads.com
+idregie.com
+idtargeting.com
+ientrymail.com
+iesnare.com
+ifa.tube8live.com
+ilbanner.com
+ilead.itrack.it
+ilovecheating.com
+imageads.canoe.ca
+imagecash.net
+images-pw.secureserver.net
+images.v3.com
+imarketservices.com
+img.prohardver.hu
+imgpromo.easyrencontre.com
+imonitor.nethost.cz
+imprese.cz
+impressionmedia.cz
+impressionz.co.uk
+imrworldwide.com
+inboxdollars.com
+incentaclick.com
+indexstats.com
+indieclick.com
+industrybrains.com
+inetlog.ru
+infinite-ads.com
+infinityads.com
+infolinks.com
+information.com
+inringtone.com
+insightexpress.com
+insightexpressai.com
+instantmadness.com
+intelliads.com
+intellitxt.com
+interactive.forthnet.gr
+intergi.com
+internetfuel.com
+interreklame.de
+interstat.hu
+ip.ro
+ip193.cn
+iperceptions.com
+ipro.com
+ireklama.cz
+itfarm.com
+itop.cz
+its-that-easy.com
+itsptp.com
+jcount.com
+jinkads.de
+joetec.net
+js.users.51.la
+juicyads.com
+jumptap.com
+justrelevant.com
+justwebads.com
+k.iinfo.cz
+kanoodle.com
+keymedia.hu
+kindads.com
+kissmetrics.com
+kliks.nl
+kniverto.com
+komoona.com
+kompasads.com
+kontera.com
+kt-g.de
+ktu.sv2.biz
+lakequincy.com
+launchbit.com
+layer-ad.de
+layer-ads.de
+lbn.ru
+lct.salesforce.com
+lead-analytics.nl
+leadboltads.net
+leadclick.com
+leadingedgecash.com
+leadzupc.com
+levelrate.de
+lfstmedia.com
+liftdna.com
+ligatus.com
+ligatus.de
+lightningcast.net
+lightspeedcash.com
+link-booster.de
+link4ads.com
+linkadd.de
+linkbuddies.com
+linkexchange.com
+linkprice.com
+linkrain.com
+linkreferral.com
+links-ranking.de
+linkshighway.com
+linkstorms.com
+linkswaper.com
+linktarget.com
+liquidad.narrowcastmedia.com
+liveintent.com
+liverail.com
+loading321.com
+log.btopenworld.com
+logua.com
+lop.com
+lucidmedia.com
+lzjl.com
+m.webtrends.com
+m1.webstats4u.com
+m4n.nl
+mackeeperapp.mackeeper.com
+madclient.uimserv.net
+madisonavenue.com
+mads.cnet.com
+madvertise.de
+marchex.com
+market-buster.com
+marketing.888.com
+marketing.hearstmagazines.nl
+marketing.nyi.net
+marketing.osijek031.com
+marketingsolutions.yahoo.com
+maroonspider.com
+mas.sector.sk
+mastermind.com
+matchcraft.com
+mathtag.com
+max.i12.de
+maximumcash.com
+mbn.com.ua
+mbs.megaroticlive.com
+mbuyu.nl
+mdotm.com
+measuremap.com
+media-adrunner.mycomputer.com
+media-servers.net
+media.ftv-publicite.fr
+media.funpic.de
+media6degrees.com
+mediaarea.eu
+mediacharger.com
+mediadvertising.ro
+mediageneral.com
+mediamath.com
+mediamgr.ugo.com
+mediaplazza.com
+mediaplex.com
+mediascale.de
+mediatext.com
+mediax.angloinfo.com
+mediaz.angloinfo.com
+medleyads.com
+medyanetads.com
+megacash.de
+megago.com
+megastats.com
+megawerbung.de
+metaffiliation.com
+metanetwork.com
+methodcash.com
+metrics.cnn.com
+metrics.windowsitpro.com
+mgid.com
+miarroba.com
+microstatic.pl
+microticker.com
+midnightclicking.com
+misstrends.com
+mixpanel.com
+mixtraffic.com
+mjxads.internet.com
+mlm.de
+mmismm.com
+mmtro.com
+moatads.com
+mobclix.com
+mocean.mobi
+moneyexpert.com
+monsterpops.com
+mopub.com
+mouseflow.com
+mpstat.us
+mr-rank.de
+mrskincash.com
+mtree.com
+musiccounter.ru
+muwmedia.com
+myaffiliateprogram.com
+mybloglog.com
+mycounter.ua
+mymoneymakingapp.com
+mypagerank.net
+mypagerank.ru
+mypowermall.com
+mystat-in.net
+mystat.pl
+mytop-in.net
+n69.com
+naiadsystems.com.invalid
+naj.sk
+namimedia.com
+nastydollars.com
+navigator.io
+navrcholu.cz
+nbjmp.com
+ndparking.com
+nedstat.com
+nedstat.nl
+nedstatbasic.net
+nedstatpro.net
+nend.net
+neocounter.neoworx-blog-tools.net
+neoffic.com
+net-filter.com
+netaffiliation.com
+netagent.cz
+netclickstats.com
+netcommunities.com
+netdirect.nl
+netincap.com
+netpool.netbookia.net
+netshelter.net
+neudesicmediagroup.com
+newads.bangbros.com
+newbie.com
+newnet.qsrch.com
+newnudecash.com
+newopenx.detik.com
+newt1.adultadworld.com
+newt1.adultworld.com
+newtopsites.com
+ng3.ads.warnerbros.com
+ngs.impress.co.jp
+nitroclicks.com
+novem.pl
+nuggad.net
+numax.nu-1.com
+nuseek.com
+oas.benchmark.fr
+oas.foxnews.com
+oas.repubblica.it
+oas.roanoke.com
+oas.salon.com
+oas.toronto.com
+oas.uniontrib.com
+oas.villagevoice.com
+oascentral.businessweek.com
+oascentral.chicagobusiness.com
+oascentral.fortunecity.com
+oascentral.register.com
+oewa.at
+oewabox.at
+offerforge.com
+offermatica.com
+olivebrandresponse.com
+omniture.com
+onclasrv.com
+onclickads.net
+oneandonlynetwork.com
+onenetworkdirect.com
+onestat.com
+onestatfree.com
+online-metrix.net
+onlinecash.com
+onlinecashmethod.com
+onlinerewardcenter.com
+openad.tf1.fr
+openad.travelnow.com
+openads.friendfinder.com
+openads.org
+openx.angelsgroup.org.uk
+openx.blindferret.com
+opienetwork.com
+optimost.com
+optmd.com
+ordingly.com
+ota.cartrawler.com
+otto-images.developershed.com
+outbrain.com
+overture.com
+owebmoney.ru
+oxado.com
+oxcash.com
+oxen.hillcountrytexas.com
+p.adpdx.com
+pagead.l.google.com
+pagefair.com
+pagerank-ranking.de
+pagerank-submitter.de
+pagerank-united.de
+pagerank4you.com
+pageranktop.com
+pagead2.googlesyndication.com
+parse.ly.invalid
+parsely.com
+partage-facile.com
+partner-ads.com
+partner.pelikan.cz
+partner.topcities.com
+partnerad.l.google.com
+partnercash.de
+partners.priceline.com
+passion-4.net
+pay-ads.com
+paycounter.com
+paypopup.com
+payserve.com
+pbnet.ru
+pcash.imlive.com
+peep-auktion.de
+peer39.com
+pennyweb.com
+pepperjamnetwork.com
+percentmobile.com
+perfectaudience.com
+perfiliate.com
+performancerevenue.com
+performancerevenues.com
+performancing.com
+pgmediaserve.com
+pgpartner.com
+pheedo.com
+phoenix-adrunner.mycomputer.com
+phpadsnew.new.natuurpark.nl
+phpmyvisites.net
+picadmedia.com
+pillscash.com
+pimproll.com
+pixel.adsafeprotected.com
+pixel.jumptap.com
+pixel.redditmedia.com
+play4traffic.com
+playhaven.com
+plista.com
+plugrush.com
+pointroll.com
+pop-under.ru
+popads.net
+popub.com
+popunder.ru
+popup.msn.com
+popupmoney.com
+popupnation.com
+popups.infostart.com
+popuptraffic.com
+porngraph.com
+porntrack.com
+postrelease.com
+potenza.cz
+pr-ten.de
+praddpro.de
+prchecker.info
+precisioncounter.com
+predictad.com
+primaryads.com
+primetime.net
+privatecash.com
+pro-advertising.com
+pro.i-doctor.co.kr
+proext.com
+profero.com
+projectwonderful.com
+promo.badoink.com
+promo.ulust.com
+promo1.webcams.nl
+promobenef.com
+promos.fling.com
+promote.pair.com
+promotion-campaigns.com
+pronetadvertising.com
+propellerads.com
+proranktracker.com
+proton-tm.com
+protraffic.com
+provexia.com
+prsitecheck.com
+psstt.com
+pub.chez.com
+pub.club-internet.fr
+pub.hardware.fr
+pub.realmedia.fr
+pubdirecte.com
+publicidad.elmundo.es
+pubmatic.com
+pubs.lemonde.fr
+pulse360.com
+q.azcentral.com
+qctop.com
+qnsr.com
+quantcast.com
+quantserve.com
+quarterserver.de
+questaffiliates.net
+quigo.com
+quinst.com
+quisma.com
+rad.msn.com
+radar.cedexis.com
+radarurl.com
+radiate.com
+rampidads.com
+rank-master.com
+rank-master.de
+rankchamp.de
+ranking-charts.de
+ranking-hits.de
+ranking-id.de
+ranking-links.de
+ranking-liste.de
+ranking-street.de
+rankingchart.de
+rankingscout.com
+rankyou.com
+rapidcounter.com
+rate.ru
+ratings.lycos.com
+rb1.design.ru
+re-directme.com
+reachjunction.com
+reactx.com
+readserver.net
+realcastmedia.com
+realclix.com
+realmedia-a800.d4p.net
+realtechnetwork.com
+realtracker.com
+reduxmedia.com
+reedbusiness.com.invalid
+referralware.com
+regnow.com
+reinvigorate.net
+reklam.rfsl.se
+reklama.mironet.cz
+reklama.reflektor.cz
+reklamcsere.hu
+reklame.unwired-i.net
+reklamer.com.ua
+relevanz10.de
+relmaxtop.com
+remotead.cnet.com
+republika.onet.pl
+retargeter.com
+revenue.net
+revenuedirect.com
+revsci.net
+revstats.com
+richmails.com
+richmedia.yimg.com
+richwebmaster.com
+rightstats.com
+rlcdn.com
+rle.ru
+rmads.msn.com
+rmedia.boston.com
+roar.com
+robotreplay.com
+roia.biz
+rok.com.com
+rose.ixbt.com
+rotabanner.com
+roxr.net
+rtbpop.com
+rtbpopd.com
+ru-traffic.com
+ru4.com
+rubiconproject.com
+s.adroll.com
+s2d6.com
+sageanalyst.net
+sail-horizon.com
+samsungacr.com
+samsungads.com
+sbx.pagesjaunes.fr
+scambiobanner.aruba.it
+scanscout.com
+scopelight.com
+scorecardresearch.com
+scratch2cash.com
+scripte-monster.de
+searchfeast.com
+searchmarketing.com
+searchramp.com
+secure.webconnect.net
+sedoparking.com
+sedotracker.com
+seeq.com.invalid
+sensismediasmart.com.au
+seo4india.com
+serv0.com
+servedby-buysellads.com
+servedbyadbutler.com
+servedbyopenx.com
+servethis.com
+services.hearstmags.com
+serving-sys.com
+sexaddpro.de
+sexadvertentiesite.nl
+sexcounter.com
+sexinyourcity.com
+sexlist.com
+sextracker.com
+sexystat.com
+shareadspace.com
+shareasale.com
+sharepointads.com
+sher.index.hu
+shinystat.com
+shinystat.it
+shoppingads.com
+siccash.com
+sidebar.angelfire.com
+sinoa.com
+sitemeter.com
+sitestat.com
+sixsigmatraffic.com
+skimresources.com
+skylink.vn
+slickaffiliate.com
+slopeaota.com
+smart4ads.com
+smartadserver.com
+smowtion.com
+snapads.com
+snoobi.com
+socialspark.com
+softclick.com.br
+spacash.com
+sparkstudios.com
+specificmedia.co.uk
+specificpop.com
+spezialreporte.de
+spinbox.techtracker.com
+spinbox.versiontracker.com
+sponsorads.de
+sponsorpro.de
+sponsors.thoughtsmedia.com
+spot.fitness.com
+spotxchange.com
+spylog.com
+spywarelabs.com
+spywarenuker.com
+spywords.com
+srwww1.com
+starffa.com
+start.freeze.com
+stat.cliche.se
+stat.dealtime.com
+stat.dyna.ultraweb.hu
+stat.pl
+stat.webmedia.pl
+stat.zenon.net
+stat24.com
+stat24.meta.ua
+statcounter.com
+static.fmpub.net
+static.itrack.it
+staticads.btopenworld.com
+statistik-gallup.net
+statm.the-adult-company.com
+stats.blogger.com
+stats.cts-bv.nl
+stats.directnic.com
+stats.hyperinzerce.cz
+stats.mirrorfootball.co.uk
+stats.multiup.org
+stats.olark.com
+stats.self.com
+stats.townnews.com
+stats.unwired-i.net
+stats.wordpress.com
+stats.x14.eu
+stats2.self.com
+stats4all.com
+statsie.com
+statxpress.com
+steelhouse.com
+steelhousemedia.com
+stickyadstv.com
+suavalds.com
+subscribe.hearstmags.com
+sugoicounter.com
+sumo.com
+sumome.com
+superclix.de
+superstats.com
+supertop.ru
+supertop100.com
+suptullog.com
+surfmusik-adserver.de
+swan-swan-goose.com
+swissadsolutions.com
+swordfishdc.com
+sx.trhnt.com
+t.insigit.com
+t.pusk.ru
+taboola.com
+tacoda.net
+tagular.com
+tailsweep.co.uk
+tailsweep.com
+tailsweep.se
+takru.com
+tangerinenet.biz
+tapad.com
+targad.de
+targetingnow.com
+targetnet.com
+targetpoint.com
+tatsumi-sys.jp
+tcads.net
+tpc.googlesyndication.com
+teads.tv
+techclicks.net
+teenrevenue.com
+teliad.de
+text-link-ads.com
+textad.sexsearch.com
+textads.biz
+textads.opera.com
+textlinks.com
+tfag.de
+theadhost.com
+theads.me
+thebugs.ws
+thecounter.com
+therapistla.com
+therichkids.com
+thrnt.com
+thruport.com
+tinybar.com
+tizers.net
+tlvmedia.com
+tntclix.co.uk
+top-casting-termine.de
+top-site-list.com
+top.list.ru
+top.mail.ru
+top.proext.com
+top100-images.rambler.ru
+top100.mafia.ru
+top123.ro
+top20.com.invalid
+top20free.com
+top90.ro
+topbarh.box.sk
+topbucks.com
+topforall.com
+topgamesites.net
+toplist.cz
+toplist.pornhost.com
+toplista.mw.hu
+toplistcity.com
+topmmorpgsites.com.invalid
+topping.com.ua
+toprebates.com
+topsafelist.net
+topsearcher.com
+topsir.com
+topsite.lv
+topsites.com.br
+topstats.com
+totemcash.com
+touchclarity.com
+touchclarity.natwest.com
+tour.brazzers.com
+tpnads.com
+track.adform.net
+track.anchorfree.com
+track.gawker.com
+trackalyzer.com
+tracker.icerocket.com
+tracker.marinsm.com
+tracking.crunchiemedia.com
+tracking.gajmp.com
+tracking.internetstores.de
+tracking.yourfilehost.com
+tracking101.com
+trackingsoft.com
+trackmysales.com
+tradeadexchange.com
+tradedoubler.com
+traffic-exchange.com
+traffic.liveuniversenetwork.com
+trafficadept.com
+trafficbalancerouting.com
+trafficcdn.liveuniversenetwork.com
+trafficfactory.biz
+trafficholder.com
+traffichunt.com
+trafficjunky.net
+trafficleader.com
+trafficsecrets.com
+trafficspaces.net
+trafficstrategies.com
+trafficswarm.com
+traffictrader.net
+trafficz.com
+trafficz.net
+traffiq.com
+trafic.ro
+travis.bosscasinos.com
+trekblue.com
+trekdata.com
+trendcounter.com
+trendmd.com
+trhunt.com
+tribalfusion.com
+trix.net
+truehits.net
+truehits1.gits.net.th
+truehits2.gits.net.th
+tsms-ad.tsms.com
+tubemogul.com
+turn.com
+tvmtracker.com
+twittad.com
+tyroo.com
+uarating.com
+ukbanners.com
+ultramercial.com
+unanimis.co.uk
+untd.com
+updated.com
+urlcash.net
+us.a1.yimg.com
+usapromotravel.com
+usmsad.tom.com
+utarget.co.uk
+utils.mediageneral.net
+v1.cnzz.com
+validclick.com
+valuead.com
+valueclick.com
+valueclickmedia.com
+valuecommerce.com
+valuesponsor.com
+veille-referencement.com
+ventivmedia.com
+vericlick.com
+vertadnet.com
+veruta.com
+vervewireless.com
+vibrantmedia.com
+video-stats.video.google.com
+videoegg.com
+view4cash.de
+viewpoint.com
+visistat.com
+visit.webhosting.yahoo.com
+visitbox.de
+visual-pagerank.fr
+visualrevenue.com
+voicefive.com
+vpon.com
+vrs.cz
+vs.tucows.com
+vungle.com
+warlog.ru
+wdads.sx.atl.publicus.com
+web-stat.com
+web.informer.com
+web2.deja.com
+webads.co.nz
+webads.nl
+webangel.ru
+webcash.nl
+webcounter.cz
+webcounter.goweb.de
+webgains.com
+webmaster-partnerprogramme24.de
+webmasterplan.com
+webmasterplan.de
+weborama.fr
+webpower.com
+webreseau.com
+webseoanalytics.com
+websponsors.com
+webstat.channel4.com
+webstat.com
+webstat.net
+webstats4u.com
+webtrackerplus.com
+webtraffic.se
+webtraxx.de
+webtrendslive.com
+werbung.meteoxpress.com
+wetrack.it
+whaleads.com
+whenu.com
+whispa.com
+whoisonline.net
+wholesaletraffic.info
+widespace.com
+widgetbucks.com
+wikia-ads.wikia.com
+window.nixnet.cz
+wintricksbanner.googlepages.com
+witch-counter.de
+wlmarketing.com
+wmirk.ru
+wonderlandads.com
+wondoads.de
+woopra.com
+worldwide-cash.net
+wtlive.com
+www-banner.chat.ru
+www-google-analytics.l.google.com
+www.banner-link.com.br
+www.dnps.com
+www.kaplanindex.com
+www.money4exit.de
+www.photo-ads.co.uk
+www1.gto-media.com
+www8.glam.com
+wwwpromoter.com
+x-traceur.com
+x6.yakiuchi.com
+xchange.ro
+xclicks.net
+xertive.com
+xg4ken.com
+xiti.com
+xplusone.com
+xponsor.com
+xq1.net
+xrea.com
+xtendmedia.com
+xtremetop100.com
+xxxcounter.com
+xxxmyself.com
+y.ibsys.com
+yab-adimages.s3.amazonaws.com
+yabuka.com
+yadro.ru
+yesads.com
+yesadvertising.com
+yieldads.com
+yieldlab.net
+yieldmanager.com
+yieldmanager.net
+yieldmo.com
+yieldtraffic.com
+yoc.mobi
+yoggrt.com
+z5x.net
+zangocash.com
+zanox-affiliate.de
+zanox.com
+zantracker.com
+zedo.com
+zencudo.co.uk
+zenkreka.com
+zenzuu.com
+zeus.developershed.com
+zeusclicks.com
+zintext.com
+zmedia.com
+zv1.november-lax.com \ No newline at end of file
diff --git a/app/src/web/assets/css/components/round_icons.css b/app/src/web/assets/css/components/round_icons.css
new file mode 100644
index 00000000..c765d2ab
--- /dev/null
+++ b/app/src/web/assets/css/components/round_icons.css
@@ -0,0 +1,4 @@
+#threadlist_rows, [role*=presentation] img._1e_c,
+i.img.profpic:not(._1_0m), ._42b6._42b6._42b6, ._5i9c.img, img._2cu2, i.img.l, [id*=threadlist] i.img:not(._1_0m) {
+ border-radius: 50% !important;
+}
diff --git a/app/src/web/assets/css/components/round_icons.scss b/app/src/web/assets/css/components/round_icons.scss
new file mode 100644
index 00000000..c00fe1bf
--- /dev/null
+++ b/app/src/web/assets/css/components/round_icons.scss
@@ -0,0 +1,4 @@
+#threadlist_rows, [role*=presentation] img._1e_c,
+i.img.profpic:not(._1_0m), ._42b6._42b6._42b6, ._5i9c.img, img._2cu2, i.img.l, [id*=threadlist] i.img:not(._1_0m) {
+ border-radius: 50% !important;
+}
diff --git a/app/src/web/assets/css/core/_base.scss b/app/src/web/assets/css/core/_base.scss
new file mode 100644
index 00000000..472319fe
--- /dev/null
+++ b/app/src/web/assets/css/core/_base.scss
@@ -0,0 +1,107 @@
+@mixin placeholder {
+ ::-webkit-input-placeholder {
+ @content;
+ }
+
+ :-moz-placeholder {
+ @content;
+ }
+
+ ::-moz-placeholder {
+ @content;
+ }
+
+ :-ms-input-placeholder {
+ @content;
+ }
+}
+
+@mixin keyframes($name) {
+ @-webkit-keyframes #{$name} {
+ @content;
+ }
+
+ @-moz-keyframes #{$name} {
+ @content;
+ }
+
+ //@-ms-keyframes #{$name} {
+ // @content;
+ //}
+
+ @keyframes #{$name} {
+ @content;
+ }
+}
+
+// Helper function to replace characters in a string
+@function str-replace($string, $search, $replace: "") {
+ $index: str-index($string, $search);
+
+ @return if($index, str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace), $string);
+}
+
+// https://css-tricks.com/probably-dont-base64-svg/
+// SVG optimization thanks to https://codepen.io/jakob-e/pen/doMoML
+// Function to create an optimized svg url
+// Version: 1.0.6
+@function svg-url($svg) {
+ //
+ // Add missing namespace
+ //
+ @if not str-index($svg, xmlns) {
+ $svg: str-replace($svg, "<svg", '<svg xmlns="http://www.w3.org/2000/svg"');
+ }
+
+ //
+ // Chunk up string in order to avoid
+ // "stack level too deep" error
+ //
+ $encoded: "";
+ $slice: 2000;
+ $index: 0;
+ $loops: ceil(str-length($svg) / $slice);
+
+ @for $i from 1 through $loops {
+ $chunk: str-slice($svg, $index, $index + $slice - 1);
+
+ //
+ // Encode
+ //
+ //$chunk: str-replace($chunk, '"', "&quot;");
+ $chunk: str-replace($chunk, "%", "%25");
+ $chunk: str-replace($chunk, "#", "%23");
+ $chunk: str-replace($chunk, "{", "%7B");
+ $chunk: str-replace($chunk, "}", "%7D");
+ $chunk: str-replace($chunk, "<", "%3C");
+ $chunk: str-replace($chunk, ">", "%3E");
+
+ //
+ // The maybe list
+ //
+ // Keep size and compile time down
+ // ... only add on documented fail
+ //
+ // $chunk: str-replace($chunk, '&', '%26');
+ // $chunk: str-replace($chunk, '|', '%7C');
+ // $chunk: str-replace($chunk, '[', '%5B');
+ // $chunk: str-replace($chunk, ']', '%5D');
+ // $chunk: str-replace($chunk, '^', '%5E');
+ // $chunk: str-replace($chunk, '`', '%60');
+ // $chunk: str-replace($chunk, ';', '%3B');
+ // $chunk: str-replace($chunk, '?', '%3F');
+ // $chunk: str-replace($chunk, ':', '%3A');
+ // $chunk: str-replace($chunk, '@', '%40');
+ // $chunk: str-replace($chunk, '=', '%3D');
+
+ $encoded: #{$encoded}#{$chunk};
+ $index: $index + $slice;
+ }
+
+ @return url("data:image/svg+xml,#{$encoded}");
+}
+
+// Background svg mixin
+@mixin background-svg($svg, $extra: "no-repeat") {
+ background: svg-url($svg) unquote($extra) !important;
+}
diff --git a/app/src/web/assets/css/core/_colors.scss b/app/src/web/assets/css/core/_colors.scss
new file mode 100644
index 00000000..1411a857
--- /dev/null
+++ b/app/src/web/assets/css/core/_colors.scss
@@ -0,0 +1,18 @@
+$bg_transparent: rgba(#f0f, 0.02) !default;
+
+//Keep above as first line so partials aren't compiled
+//Our default colors are test colors; production files should always import the actual colors
+
+$text: #d7b0d7 !default;
+// must be visible with accent as the background
+$accent_text: #76d7c2 !default;
+$link: #9266d5 !default;
+$accent: #3b5998 !default;
+$background: #451515 !default;
+// background2 must be transparent
+$background2: rgba(lighten($background, 35%), 0.35) !default; //Also change ratio in material_light
+$bg_opaque: rgba($background, 1.0) !default;
+$bg_opaque2: rgba($background2, 1.0) !default;
+$card: #239645 !default;
+$tint: #ff4682 !default; // must be different from $background
+$divider: rgba($text, 0.3) !default;
diff --git a/app/src/web/assets/css/core/_core_bg.scss b/app/src/web/assets/css/core/_core_bg.scss
new file mode 100644
index 00000000..21c20bcc
--- /dev/null
+++ b/app/src/web/assets/css/core/_core_bg.scss
@@ -0,0 +1,86 @@
+#viewport {
+ background: $background !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*="background-color"], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: $bg_transparent !important;
+}
+
+//card related
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: $card !important;
+}
+
+// unread related
+
+.aclb {
+ background: $tint !important;
+}
+
+//contains images so must have background-color
+._cv_, ._2sq8 {
+ background-color: $bg_transparent !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: $bg_opaque !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: $bg_opaque2 !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: $background2 !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: $accent !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: $divider !important;
+}
+
+//fab
+button ._v89 ._54k8._1fl1 {
+ background: $accent !important;
+} \ No newline at end of file
diff --git a/app/src/web/assets/css/core/_core_border.scss b/app/src/web/assets/css/core/_core_border.scss
new file mode 100644
index 00000000..c366bc14
--- /dev/null
+++ b/app/src/web/assets/css/core/_core_border.scss
@@ -0,0 +1,94 @@
+//border between like and comment
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid $divider !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid $divider !important;
+}
+
+//above see more
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid $divider !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid $divider !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid $divider !important;
+ border-bottom: 1px solid $divider !important;
+}
+
+//friend card border
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid $divider !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid $text !important;
+}
+
+._3gka {
+ border: 1px dashed $divider !important;
+}
+
+//link card bottom border
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: $divider !important;
+}
+
+// like, comment, share divider
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+//page side tab layout
+._2cis {
+ border-left: 10px solid $bg_transparent !important;
+ border-right: 10px solid $bg_transparent !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid $text !important;
+}
+
+._1ss6 {
+ border-left: 2px solid $text !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid $text !important;
+} \ No newline at end of file
diff --git a/app/src/web/assets/css/core/_core_messenger.scss b/app/src/web/assets/css/core/_core_messenger.scss
new file mode 100644
index 00000000..608fc23d
--- /dev/null
+++ b/app/src/web/assets/css/core/_core_messenger.scss
@@ -0,0 +1,20 @@
+// Not all messenger related components are here; only the main ones.
+// Borders for instance are merged into core_border
+
+// Other person's message bubble
+._34ee {
+ background: $background2 !important;
+ color: $text !important;
+
+}
+
+// Your message bubble; order matters
+._34em ._34ee {
+ background: $accent !important;
+ color: $accent_text !important;
+}
+
+// Sticker page
+._5as0, ._5cni, ._5as2 {
+ background: $bg_opaque !important;
+} \ No newline at end of file
diff --git a/app/src/web/assets/css/core/_core_text.scss b/app/src/web/assets/css/core/_core_text.scss
new file mode 100644
index 00000000..154cee84
--- /dev/null
+++ b/app/src/web/assets/css/core/_core_text.scss
@@ -0,0 +1,39 @@
+[style*="color"], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: $text !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: $accent !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+// most links do not have a special color. We will highlight those in posts and messages
+p > a, .msg span > a {
+ color: $link !important;
+} \ No newline at end of file
diff --git a/app/src/web/assets/css/core/_main.scss b/app/src/web/assets/css/core/_main.scss
new file mode 100644
index 00000000..3e972f93
--- /dev/null
+++ b/app/src/web/assets/css/core/_main.scss
@@ -0,0 +1,6 @@
+@import "core";
+@import "svg";
+
+//this file is used as the base for all themes
+//given that svgs take a lot of characters, we won't compile them when testing
+//therefore we use the core scss
diff --git a/app/src/web/assets/css/core/_svg.scss b/app/src/web/assets/css/core/_svg.scss
new file mode 100644
index 00000000..8c714438
--- /dev/null
+++ b/app/src/web/assets/css/core/_svg.scss
@@ -0,0 +1,74 @@
+// icons courtesy of https://material.io/icons/
+
+$camera: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$text}" viewBox="0 -10 50 50"><circle cx="25" cy="23" r="3.2"/><path d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/><path fill="none" d="M13 11h24v24H13z"/></svg>';
+
+// status upload image
+._50uu {
+ @include background-svg($camera);
+}
+
+$video: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$text}" viewBox="0 0 50 50"><path fill="none" d="M13 26h24v24H13z"/><path d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/></svg>';
+
+// status upload video
+._50uw {
+ @include background-svg($video);
+}
+
+$like: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$text}" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/></svg>';
+$like_selected: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$accent}" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/></svg>';
+
+// 2018/12/29
+// Previously ._15km ._15ko::before and ._15km ._15ko._77la::before; however, reaction changes no longer affect this element
+// The robust measure seems to be the parent of a[data-sigil~="like-reaction-flyout"] along with [data-sigil~="like"] for an unliked post
+// and [data-sigil~="unlike"] for a liked post
+._15km ._15ko::before {
+ @include background-svg($like);
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ @include background-svg($like_selected);
+ background-position: center !important;
+}
+
+$comment: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$text}" viewBox="0 0 24 24"><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/><path fill="none" d="M0 0h24v24H0z"/></svg>';
+
+._15km ._15kq::before {
+ @include background-svg($comment);
+ background-position: center !important;
+}
+
+$share: '<svg xmlns="http://www.w3.org/2000/svg" fill="#{$text}" viewBox="0 0 24 24"><path d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/><path fill="none" d="M24 0H0v24h24z"/></svg>';
+
+._15km ._15kr::before {
+ @include background-svg($share);
+ background-position: center !important;
+}
+
+$more_horiz: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path fill="#{$text}" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>';
+
+//$menus: ".sp_89zNula0Qh5",
+//".sp_MP2OtCXORz9",
+//".sp_NIWBacTn8LF",
+//// 2018/12/31
+//".sp_9ZFVhnFyWsw",
+//// 2019/01/03
+//".sp_SJIJjSlGEIO";
+//
+//$menu_collector: ();
+//
+//@each $menu in $menus {
+// $menu_collector: append($menu_collector, unquote('#{$menu}'), 'comma');
+// $menu_collector: append($menu_collector, unquote('#{$menu}_2x'), 'comma');
+// $menu_collector: append($menu_collector, unquote('#{$menu}_3x'), 'comma');
+//}
+//
+//#{$menu_collector} {
+// @include background-svg($more_horiz);
+// background-position: center !important;
+//}
+
+.story_body_container i.img[data-sigil*="story-popup-context"] {
+ @include background-svg($more_horiz);
+ background-position: center !important;
+} \ No newline at end of file
diff --git a/app/src/web/assets/css/core/core.css b/app/src/web/assets/css/core/core.css
new file mode 100644
index 00000000..1d48fa35
--- /dev/null
+++ b/app/src/web/assets/css/core/core.css
@@ -0,0 +1,306 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: #d7b0d7 !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: #3b5998 !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: #9266d5 !important;
+}
+
+#viewport {
+ background: #451515 !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: rgba(255, 0, 255, 0.02) !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: #239645 !important;
+}
+
+.aclb {
+ background: #ff4682 !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: rgba(255, 0, 255, 0.02) !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: #451515 !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: #c74646 !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: rgba(199, 70, 70, 0.35) !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: #3b5998 !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: rgba(215, 176, 215, 0.3) !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: #3b5998 !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid rgba(215, 176, 215, 0.3) !important;
+ border-bottom: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid rgba(215, 176, 215, 0.3) !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid #d7b0d7 !important;
+}
+
+._3gka {
+ border: 1px dashed rgba(215, 176, 215, 0.3) !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: rgba(215, 176, 215, 0.3) !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid rgba(255, 0, 255, 0.02) !important;
+ border-right: 10px solid rgba(255, 0, 255, 0.02) !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid #d7b0d7 !important;
+}
+
+._1ss6 {
+ border-left: 2px solid #d7b0d7 !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid #d7b0d7 !important;
+}
+
+._34ee {
+ background: rgba(199, 70, 70, 0.35) !important;
+ color: #d7b0d7 !important;
+}
+
+._34em ._34ee {
+ background: #3b5998 !important;
+ color: #76d7c2 !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: #451515 !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: #d7b0d7 !important;
+}
+
+:-moz-placeholder {
+ color: #d7b0d7 !important;
+}
+
+::-moz-placeholder {
+ color: #d7b0d7 !important;
+}
+
+:-ms-input-placeholder {
+ color: #d7b0d7 !important;
+}
+
+.excessItem {
+ outline: rgba(215, 176, 215, 0.3) !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, #451515) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+ 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+ 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+ 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+ 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+ 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: rgba(255, 0, 255, 0.02);
+ }
+ 50% {
+ background: rgba(199, 70, 70, 0.35);
+ }
+}
diff --git a/app/src/web/assets/css/core/core.scss b/app/src/web/assets/css/core/core.scss
new file mode 100644
index 00000000..38086529
--- /dev/null
+++ b/app/src/web/assets/css/core/core.scss
@@ -0,0 +1,54 @@
+@import "colors";
+@import "base";
+@import "core_text";
+@import "core_bg";
+@import "core_border";
+@import "core_messenger";
+
+//GLOBAL overrides; use with caution
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+// .touch .btnS, button, ._94v, ._590n {
+// box-shadow: none !important;
+// }
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+@include placeholder {
+ color: $text !important;
+}
+
+.excessItem {
+ outline: $divider !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, $bg_opaque) !important;
+}
+
+//new comment
+@include keyframes(highlightFade) {
+ 0%, 50% {
+ background: $background2;
+ }
+
+ 100% {
+ background: $bg_transparent;
+ }
+}
+
+@include keyframes(chatHighlightAnimation) {
+ 0%, 100% {
+ background: $bg_transparent;
+ }
+
+ 50% {
+ background: $background2;
+ }
+}
diff --git a/app/src/web/assets/css/themes/.gitignore b/app/src/web/assets/css/themes/.gitignore
new file mode 100644
index 00000000..01d06441
--- /dev/null
+++ b/app/src/web/assets/css/themes/.gitignore
@@ -0,0 +1,2 @@
+test.scss
+test.css \ No newline at end of file
diff --git a/app/src/web/assets/css/themes/custom.css b/app/src/web/assets/css/themes/custom.css
new file mode 100644
index 00000000..e38c6de0
--- /dev/null
+++ b/app/src/web/assets/css/themes/custom.css
@@ -0,0 +1,338 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: $T$ !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: $A$ !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: $TT$ !important;
+}
+
+#viewport {
+ background: $B$ !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: $BT$ !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: $C$ !important;
+}
+
+.aclb {
+ background: $TI$ !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: $BT$ !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: $O$ !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: $OO$ !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: $BBT$ !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: $A$ !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: $D$ !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: $A$ !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid $D$ !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid $D$ !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid $D$ !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid $D$ !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid $D$ !important;
+ border-bottom: 1px solid $D$ !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid $D$ !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid $T$ !important;
+}
+
+._3gka {
+ border: 1px dashed $D$ !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: $D$ !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid $BT$ !important;
+ border-right: 10px solid $BT$ !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid $T$ !important;
+}
+
+._1ss6 {
+ border-left: 2px solid $T$ !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid $T$ !important;
+}
+
+._34ee {
+ background: $BBT$ !important;
+ color: $T$ !important;
+}
+
+._34em ._34ee {
+ background: $A$ !important;
+ color: $AT$ !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: $O$ !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: $T$ !important;
+}
+
+:-moz-placeholder {
+ color: $T$ !important;
+}
+
+::-moz-placeholder {
+ color: $T$ !important;
+}
+
+:-ms-input-placeholder {
+ color: $T$ !important;
+}
+
+.excessItem {
+ outline: $D$ !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, $O$) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: $BBT$;
+ }
+ 100% {
+ background: $BT$;
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: $BBT$;
+ }
+ 100% {
+ background: $BT$;
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: $BBT$;
+ }
+ 100% {
+ background: $BT$;
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: $BT$;
+ }
+ 50% {
+ background: $BBT$;
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: $BT$;
+ }
+ 50% {
+ background: $BBT$;
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: $BT$;
+ }
+ 50% {
+ background: $BBT$;
+ }
+}
+._50uu {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$T$" viewBox="0 -10 50 50"%3E%3Ccircle cx="25" cy="23" r="3.2"/%3E%3Cpath d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/%3E%3Cpath fill="none" d="M13 11h24v24H13z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._50uw {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$T$" viewBox="0 0 50 50"%3E%3Cpath fill="none" d="M13 26h24v24H13z"/%3E%3Cpath d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._15km ._15ko::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$T$" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$A$" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kq::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$T$" viewBox="0 0 24 24"%3E%3Cpath d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kr::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="$T$" viewBox="0 0 24 24"%3E%3Cpath d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/%3E%3Cpath fill="none" d="M24 0H0v24h24z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+.story_body_container i.img[data-sigil*=story-popup-context] {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath fill="$T$" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
diff --git a/app/src/web/assets/css/themes/custom.scss b/app/src/web/assets/css/themes/custom.scss
new file mode 100644
index 00000000..50c029fb
--- /dev/null
+++ b/app/src/web/assets/css/themes/custom.scss
@@ -0,0 +1,14 @@
+$bg_transparent: unquote('$BT$');
+$text: unquote('$T$');
+$link: unquote('$TT$');
+$accent: unquote('$A$');
+$accent_text: unquote('$AT$');
+$background: unquote('$B$');
+$background2: unquote('$BBT$');
+$bg_opaque: unquote('$O$');
+$bg_opaque2: unquote('$OO$');
+$divider: unquote('$D$');
+$card: unquote('$C$');
+$tint: unquote('$TI$');
+
+@import "../core/main";
diff --git a/app/src/web/assets/css/themes/material_amoled.css b/app/src/web/assets/css/themes/material_amoled.css
new file mode 100644
index 00000000..c821003e
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_amoled.css
@@ -0,0 +1,338 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: #fff !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: #5d86dd !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: #5d86dd !important;
+}
+
+#viewport {
+ background: #000 !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: #000 !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: rgba(0, 0, 0, 0.35) !important;
+}
+
+.aclb {
+ background: rgba(255, 255, 255, 0.2) !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: #000 !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: black !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: black !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: rgba(0, 0, 0, 0.35) !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: #5d86dd !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: rgba(255, 255, 255, 0.3) !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: #5d86dd !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid #fff !important;
+}
+
+._3gka {
+ border: 1px dashed rgba(255, 255, 255, 0.3) !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid #000 !important;
+ border-right: 10px solid #000 !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid #fff !important;
+}
+
+._1ss6 {
+ border-left: 2px solid #fff !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid #fff !important;
+}
+
+._34ee {
+ background: rgba(0, 0, 0, 0.35) !important;
+ color: #fff !important;
+}
+
+._34em ._34ee {
+ background: #5d86dd !important;
+ color: #fff !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: black !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: #fff !important;
+}
+
+:-moz-placeholder {
+ color: #fff !important;
+}
+
+::-moz-placeholder {
+ color: #fff !important;
+}
+
+:-ms-input-placeholder {
+ color: #fff !important;
+}
+
+.excessItem {
+ outline: rgba(255, 255, 255, 0.3) !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, black) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+ 100% {
+ background: #000;
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+ 100% {
+ background: #000;
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+ 100% {
+ background: #000;
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #000;
+ }
+ 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #000;
+ }
+ 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #000;
+ }
+ 50% {
+ background: rgba(0, 0, 0, 0.35);
+ }
+}
+._50uu {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 -10 50 50"%3E%3Ccircle cx="25" cy="23" r="3.2"/%3E%3Cpath d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/%3E%3Cpath fill="none" d="M13 11h24v24H13z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._50uw {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 50 50"%3E%3Cpath fill="none" d="M13 26h24v24H13z"/%3E%3Cpath d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._15km ._15ko::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%235d86dd" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kq::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kr::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/%3E%3Cpath fill="none" d="M24 0H0v24h24z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+.story_body_container i.img[data-sigil*=story-popup-context] {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath fill="%23fff" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
diff --git a/app/src/web/assets/css/themes/material_amoled.scss b/app/src/web/assets/css/themes/material_amoled.scss
new file mode 100644
index 00000000..19190126
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_amoled.scss
@@ -0,0 +1,11 @@
+$text: #fff;
+$accent_text: #fff;
+$link: #5d86dd;
+$accent: #5d86dd;
+$background: #000;
+$background2: rgba($background, 0.35);
+$bg_transparent: $background;
+$card: $background2;
+$tint: rgba(#fff, 0.2);
+
+@import "../core/main";
diff --git a/app/src/web/assets/css/themes/material_dark.css b/app/src/web/assets/css/themes/material_dark.css
new file mode 100644
index 00000000..0dc739eb
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_dark.css
@@ -0,0 +1,338 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: #fff !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: #5d86dd !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: #5d86dd !important;
+}
+
+#viewport {
+ background: #303030 !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: #303030 !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: #353535 !important;
+}
+
+.aclb {
+ background: rgba(255, 255, 255, 0.2) !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: #303030 !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: #303030 !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: #898989 !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: rgba(137, 137, 137, 0.35) !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: #5d86dd !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: rgba(255, 255, 255, 0.3) !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: #5d86dd !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid #fff !important;
+}
+
+._3gka {
+ border: 1px dashed rgba(255, 255, 255, 0.3) !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid #303030 !important;
+ border-right: 10px solid #303030 !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid #fff !important;
+}
+
+._1ss6 {
+ border-left: 2px solid #fff !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid #fff !important;
+}
+
+._34ee {
+ background: rgba(137, 137, 137, 0.35) !important;
+ color: #fff !important;
+}
+
+._34em ._34ee {
+ background: #5d86dd !important;
+ color: #fff !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: #303030 !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: #fff !important;
+}
+
+:-moz-placeholder {
+ color: #fff !important;
+}
+
+::-moz-placeholder {
+ color: #fff !important;
+}
+
+:-ms-input-placeholder {
+ color: #fff !important;
+}
+
+.excessItem {
+ outline: rgba(255, 255, 255, 0.3) !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, #303030) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+ 100% {
+ background: #303030;
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+ 100% {
+ background: #303030;
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+ 100% {
+ background: #303030;
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #303030;
+ }
+ 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #303030;
+ }
+ 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #303030;
+ }
+ 50% {
+ background: rgba(137, 137, 137, 0.35);
+ }
+}
+._50uu {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 -10 50 50"%3E%3Ccircle cx="25" cy="23" r="3.2"/%3E%3Cpath d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/%3E%3Cpath fill="none" d="M13 11h24v24H13z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._50uw {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 50 50"%3E%3Cpath fill="none" d="M13 26h24v24H13z"/%3E%3Cpath d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._15km ._15ko::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%235d86dd" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kq::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kr::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/%3E%3Cpath fill="none" d="M24 0H0v24h24z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+.story_body_container i.img[data-sigil*=story-popup-context] {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath fill="%23fff" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
diff --git a/app/src/web/assets/css/themes/material_dark.scss b/app/src/web/assets/css/themes/material_dark.scss
new file mode 100644
index 00000000..18b8b461
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_dark.scss
@@ -0,0 +1,10 @@
+$text: #fff;
+$accent_text: #fff;
+$link: #5d86dd;
+$accent: #5d86dd;
+$background: #303030;
+$bg_transparent: $background;
+$card: #353535;
+$tint: rgba(#fff, 0.2);
+
+@import "../core/main";
diff --git a/app/src/web/assets/css/themes/material_glass.css b/app/src/web/assets/css/themes/material_glass.css
new file mode 100644
index 00000000..3bf9530f
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_glass.css
@@ -0,0 +1,338 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: #fff !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: #5d86dd !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: #5d86dd !important;
+}
+
+#viewport {
+ background: rgba(0, 0, 0, 0.1) !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: transparent !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: rgba(0, 0, 0, 0.25) !important;
+}
+
+.aclb {
+ background: rgba(255, 255, 255, 0.15) !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: transparent !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: black !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: #595959 !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: rgba(89, 89, 89, 0.35) !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: #5d86dd !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: rgba(255, 255, 255, 0.3) !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: #5d86dd !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid rgba(255, 255, 255, 0.3) !important;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid #fff !important;
+}
+
+._3gka {
+ border: 1px dashed rgba(255, 255, 255, 0.3) !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: rgba(255, 255, 255, 0.3) !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid transparent !important;
+ border-right: 10px solid transparent !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid #fff !important;
+}
+
+._1ss6 {
+ border-left: 2px solid #fff !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid #fff !important;
+}
+
+._34ee {
+ background: rgba(89, 89, 89, 0.35) !important;
+ color: #fff !important;
+}
+
+._34em ._34ee {
+ background: #5d86dd !important;
+ color: #fff !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: black !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: #fff !important;
+}
+
+:-moz-placeholder {
+ color: #fff !important;
+}
+
+::-moz-placeholder {
+ color: #fff !important;
+}
+
+:-ms-input-placeholder {
+ color: #fff !important;
+}
+
+.excessItem {
+ outline: rgba(255, 255, 255, 0.3) !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, black) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+ 100% {
+ background: transparent;
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+ 100% {
+ background: transparent;
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+ 100% {
+ background: transparent;
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: transparent;
+ }
+ 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: transparent;
+ }
+ 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: transparent;
+ }
+ 50% {
+ background: rgba(89, 89, 89, 0.35);
+ }
+}
+._50uu {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 -10 50 50"%3E%3Ccircle cx="25" cy="23" r="3.2"/%3E%3Cpath d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/%3E%3Cpath fill="none" d="M13 11h24v24H13z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._50uw {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 50 50"%3E%3Cpath fill="none" d="M13 26h24v24H13z"/%3E%3Cpath d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._15km ._15ko::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%235d86dd" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kq::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kr::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 24 24"%3E%3Cpath d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/%3E%3Cpath fill="none" d="M24 0H0v24h24z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+.story_body_container i.img[data-sigil*=story-popup-context] {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath fill="%23fff" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
diff --git a/app/src/web/assets/css/themes/material_glass.scss b/app/src/web/assets/css/themes/material_glass.scss
new file mode 100644
index 00000000..0c61a38c
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_glass.scss
@@ -0,0 +1,10 @@
+$text: #fff;
+$accent_text: #fff;
+$link: #5d86dd;
+$accent: #5d86dd;
+$background: rgba(#000, 0.1);
+$bg_transparent: transparent;
+$card: rgba(#000, 0.25);
+$tint: rgba(#fff, 0.15);
+
+@import "../core/main";
diff --git a/app/src/web/assets/css/themes/material_light.css b/app/src/web/assets/css/themes/material_light.css
new file mode 100644
index 00000000..c00dd12f
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_light.css
@@ -0,0 +1,338 @@
+[style*=color], body, input, ._42rv, ._4qau, ._dwm .descArea, ._eu5,
+._1tcc, ._3g9-, ._29z_, ._3xz7, ._ib-, ._3bg5 ._56dq, ._477i, ._2vxk,
+.touched *, ._1_yj, ._1_yl, ._4pj9, ._2bdc, ._3qdh ._3qdn ._3qdk, ._3qdk ._48_q,
+._z-z, ._z-v, ._1e8d, ._36nl, ._36nm, ._2_11, ._2_rf, ._2ip_, ._403p, .cq, ._usr,
+._5xu2, ._3ml8, ._3mla, ._50vk, ._1m2u, ._31y7, ._4kcb, ._1lf6, ._1lf5,
+._1lf4, ._1hiz, ._xod, ._5ag5, ._zmk, ._3t_h, ._5lm6, ._3clv, ._3zlc, ._36rd,
+._31zk, ._31zl, ._3xsa, ._3xs9, ._2-4s, ._2fzz ul, ._3z10,
+._43mh, .touch .btn, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35,
+._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu,
+._18qg, ._1_ac, ._529p, ._4dwt ._1vh3, ._4a5f, ._23_t, ._2rzc, ._23_s, ._2rzd,
+._5aga, ._5ag9, ._537a, .acy, ._5ro_, ._6-l ._2us7, ._4mp, ._2b08, ._36e0, ._4-dy,
+._14v5 ._14v8, ._1440, ._1442, ._1448, ._4ks_, .mCount, ._27vc, ._24e1, ._2rbw, ._3iyw ._3mzw,
+textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782,
+._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh,
+._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._38d-, ._3n8y, ._38dt, ._3oyg,
+._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions,
+._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g,
+._2new, .appCenterCategorySelectorButton, ._1ksq, ._1kt6, ._6ber, ._mxb, ._3oyd,
+div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
+a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
+.mentions-input, .mentions-placeholder, .largeStatusBox .placeHolder, .fcw,
+._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
+._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
+h1, h2, h3, h4, h5, h6 {
+ color: #000 !important;
+}
+
+strong > a, ._15ks ._2q8z._2q8z, ._1e3e, .blueName {
+ color: #3b5998 !important;
+}
+
+._42nf ._42ng {
+ color: transparent !important;
+}
+
+p > a, .msg span > a {
+ color: #3b5998 !important;
+}
+
+#viewport {
+ background: #fafafa !important;
+}
+
+body, :root, #root, #header, #MComposer, [style*=background-color], ._1upc, input, ._2f9r, ._59e9, ._5pz4, ._5lp4,
+._5lp5, .container, .subpage, ._5n_f, #static_templates, ._22_8, ._1t4h, ._uoq, ._3qdh, ._8ca, ._3h8i,
+._6-l ._2us7, ._6-l ._6-p, ._333v, div.sharerSelector, ._529j, ._305j, ._1pph, ._3t_l, ._4pvz,
+._1g05, .acy, ._51-g, ._533c, ._ib-, .sharerAttachmentEmpty, .sharerBottomWrapper, ._24e1, ._-j7,
+._3bg5 ._56do, ._5hfh, ._52e-, .mQuestionsPollResultsBar, ._5hoc, ._5oxw, ._32_4, ._1hiz,
+._38do, .bo, .cq, ._234-, ._a-5, ._2zh4, ._15ks, ._3oyc, ._36dc, ._3iyw ._3iyx, ._6bes, ._55wo, ._4-dy,
+.tlBody, #timelineBody, .timelineX, .timeline, .feed, .tlPrelude, .tlFeedPlaceholder, ._4_d0,
+.al, ._1gkq, ._5c5b, ._1qxg, ._5luf, ._2new, ._cld, ._3zvb, ._2nk0, .btnD, .btnI, ._2bdb, ._3ci9,
+._11ub, ._5p7j, ._55wm, ._5rgs, ._5xuj, ._1sv1, ._45fu, ._18qg, ._1_ac, ._5w3g, ._3e18, ._6be7,
+._5q_r, ._5yt8, ._idb, ._2ip_, ._f6s, ._2l5v, ._8i2, ._kr5, ._2q7u, ._2q7v, ._5xp2, div.fullwidthMore,
+._577z, ._2u4w, ._3u9p, ._3u9t, ._cw4, ._5_y-, ._5_y_, ._5_z3, ._cwy, ._5_z0, ._voz, ._vos,
+._5_z1, ._5_z2, ._2mtc, ._206a, ._1_-1, ._1ybg, .appCenterCategorySelectorButton, ._5_ee, ._3clk,
+._5c9u, div._5y57::before, ._59f6._55so::before, .structuredPublisher, ._94v, ._vqv, ._5lp5,
+._55wm, ._2om3, ._2ol-, ._1f9d, ._vee, ._31a-, ._3r8b, ._3r9d, ._5vq5, ._3tl8, ._65wz, ._4edl,
+.acw, ._4_xl, ._1p70, ._1p70, ._1ih_, ._51v6, ._u2c, ._484w, ._3ils, ._rm7, ._32qk, ._d01, ._1glm,
+._ue6, ._hdn._hdn,
+._2y60, ._5fu3, ._2foa, ._2y5_, ._38o9, ._1kb, .mAppCenterFatLabel, ._3bmj, ._5zmb, ._2x2s, ._3kac, ._3kad,
+._3f50, .mentions-placeholder, .mentions, .mentions-shadow, .mentions-measurer, .acg, ._59tu,
+._4l9b, ._4gj3, .groupChromeView, ._i3g, ._3jcf, .error, ._1dbp, ._5zma, ._6beq, ._vi6,
+._uww, textarea, ._15n_, ._skt, ._5f28, ._14_j, ._3bg5, ._53_-, ._52x1, ._35au, ._cwy,
+._1rfn ._1rfk ._4vc-, ._1rfk, ._1rfk ._2v9s, ._301x {
+ background: #fafafa !important;
+}
+
+._31nf, ._2v9s, ._d4i, article._55wo, ._10c_, ._2jl2, ._55wo, ._6150, ._50mi, ._4-dw, ._4_2z {
+ background: #fff !important;
+}
+
+.aclb {
+ background: #ddd !important;
+}
+
+._cv_, ._2sq8 {
+ background-color: #fafafa !important;
+}
+
+#page, ._8l7, ._-j8, ._-j9, ._6o5v {
+ background: transparent !important;
+}
+
+.jewel, .flyout, ._52z5, ._13e_, ._5-lw, ._5c0e, .jx-result, ._336p, .mentions-suggest-item, ._2suk,
+.mentions-suggest, ._1xoz, ._1xow {
+ background: #fafafa !important;
+}
+
+._403n, ._14v5 ._14v8, ._1-kc {
+ background: #e6e6e6 !important;
+}
+
+button:not([style*=image]):not(.privacyButtons), button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before,
+._590n, ._4g8h, ._2cpp, ._58a0.touched:after,
+.timeline .timelinePublisher, .touched, .sharerAttachment,
+.item a.primary.touched .primarywrap, ._38nq, ._537a,
+._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj,
+.excessItem, .acr, ._5-lx, ._3g9-, ._55ws, ._6dsj ._3gin, ._69aj,
+._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51,
+._10sb li.selected, ._2z4j, ._ib-, ._1bhl, ._5a5j,
+._2b06, ._2tsf, ._3gka, .mCount, ._27vc, ._4pv-, ._6pk5,
+._4qax, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, ._z-w, ._t21, .mToken,
+#addMembersTypeahead .mToken.mTokenWeakReference,
+.acbk {
+ background: rgba(230, 230, 230, 0.35) !important;
+}
+
+.mQuestionsPollResultsBar .shaded {
+ background: #3b5998 !important;
+}
+
+._220g, ._1_y8:after, ._6pk6,
+._2zh4::before, ._2ip_ ._2zh4::before, ._2ip_ ._15kk::before, ._2ip_ ._15kk + ._4u3j::before,
+._58a0:before, ._43mh::before, ._43mh::after, ._1_-1::before, ._1kmv:after, ._1_ac:before {
+ background: rgba(0, 0, 0, 0.3) !important;
+}
+
+button ._v89 ._54k8._1fl1 {
+ background: #3b5998 !important;
+}
+
+._15kl::before, ._37fd .inlineComposerButton, ._1hb:before,
+._5j35::after, ._2k4b, ._3to7, ._4nw8 {
+ border-left: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+._4_d1, ._5cni {
+ border-right: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+._1mx0, ._1rbr, ._5yt8, ._idb, ._cld, ._1e8h, ._z-w, ._1ha, ._1n8h ._1oby, ._5f99, ._2t39,
+._2pbp, ._5rou:first-child, ._egf:first-child, ._io2, ._3qdi ._48_m::after,
+._15n_, ._3-2-, ._27ve, ._2s20, ._gui, ._2s21 > *::after, ._32qk, ._d00, ._d01, ._38o9,
+._3u9t, ._55fj, .mEventProfileSection.useBorder td, ._3ils, ._5as0, ._5as2,
+._52x1, ._3wjp, ._usq, ._2cul:before, ._13e_, .jewel .flyout, ._3bg5 ._52x6, ._56d8, .al {
+ border-top: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+._15ny::after, ._z-w, ._8i2, ._2nk0, ._22_8, ._1t4h, ._37fd, ._1ha, ._3bg5 ._56do, ._8he,
+._400s, ._5hoc, ._1bhn, ._5ag6, ._4pvz,
+._301x, ._x08 ._x0a:after, ._36dc, ._6-l ._57jn, ._527k, ._g_k,
+._577z:not(:last-child) ._ygd, ._3u9u, ._3mgz, ._52x6, ._2066, ._5luf, ._2bdc, ._3ci9,
+.mAppCenterFatLabel, .appCenterCategorySelectorButton, ._1q6v, ._5q_r, ._5yt8, ._38do, ._38dt,
+._ap1, ._52x1, ._59tu, ._usq, ._13e_, ._59f6._55so::before, ._4gj3, .error, ._35--, ._1wev,
+.jx-result, ._1f9d, ._vef, ._55x2 > *, .al, ._44qk, ._5rgs, ._5xuj, ._1sv1, ._idb,
+._5lp5, ._3-2-, ._3to6, ._ir5, ._4nw6, ._4nwh, ._27ve, div._51v6::before,
+._3c9h::before, ._2s20, ._gui, ._5jku, ._2foa, ._2y60, ._5fu3, ._4en9, ._1kb:not(:last-child) ._1kc,
+._5pz4, ._5lp4, ._5lp5, ._5h6z, ._5h6x, ._2om4, ._5fjw > div, ._5fjv > :first-child,
+._5fjw > :first-child {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+.item a.primary.touched .primarywrap, ._4dwt ._5y33, ._1ih_, ._5_50, ._6beq, ._69aj,
+._5fjv, ._3on6, ._2u4w, ._2om3, ._2ol-, ._5fjw, ._4z83, ._1gkq, ._4-dy {
+ border-top: 1px solid rgba(0, 0, 0, 0.3) !important;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+._d4i, ._f6s, .mentions-suggest-item, .mentions-suggest, .sharerAttachment,
+.mToken, #addMembersTypeahead .mToken.mTokenWeakReference, .mQuestionsPollResultsBar,
+._15q7, ._2q7v, ._4dwt ._16ii, ._3qdi::after,
+._2q7w, .acy, ._58ak, ._3t_l, ._4msa, ._3h8i, ._3clk, ._1kt6, ._1ksq,
+._1_y5, ._lr0, ._5hgt, ._2cpp, ._50uu, ._50uw, ._31yd, ._1e3d, ._3xz7, ._1xoz,
+._4kcb, ._2lut, .jewel .touchable-notification.touched, .touchable-notification .touchable.touched,
+.home-notification .touchable.touched, ._6beo ._6ber,
+._73ku ._73jw,
+._4e8n, ._uww, .mentions-placeholder, .mentions-shadow, .mentions-measurer,
+._5whq, ._59tt, ._41ft::after, .jx-tokenizer, ._3uqf, ._4756, ._1rrd, ._5n_f {
+ border: 1px solid rgba(0, 0, 0, 0.3) !important;
+}
+
+.mQuestionsPollResultsBar .shaded, ._1027._13sm {
+ border: 1px solid #000 !important;
+}
+
+._3gka {
+ border: 1px dashed rgba(0, 0, 0, 0.3) !important;
+}
+
+._4o58::after, .acr, ._t21, ._2bdb,
+.acw, .aclb, ._4qax, ._5h8f {
+ border-color: rgba(0, 0, 0, 0.3) !important;
+}
+
+._15ks ._15kl::before {
+ border-left: 1px solid transparent !important;
+}
+
+._56bf, .touch .btn {
+ border-radius: 0 !important;
+ border: 0 !important;
+}
+
+._2cis {
+ border-left: 10px solid #fafafa !important;
+ border-right: 10px solid #fafafa !important;
+}
+
+._2cir.selected, ._42rv, ._5zma, ._2x2s {
+ border-bottom: 3px solid #000 !important;
+}
+
+._1ss6 {
+ border-left: 2px solid #000 !important;
+}
+
+._484w.selected > ._6zf, ._5kqs::after, ._3lvo ._5xum._5xuk, ._x0b {
+ border-bottom: 1px solid #000 !important;
+}
+
+._34ee {
+ background: rgba(230, 230, 230, 0.35) !important;
+ color: #000 !important;
+}
+
+._34em ._34ee {
+ background: #3b5998 !important;
+ color: #fff !important;
+}
+
+._5as0, ._5cni, ._5as2 {
+ background: #fafafa !important;
+}
+
+*, *::after, *::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+}
+
+[data-sigil=m_login_upsell],
+[data-sigil="m-loading-indicator-animate m-loading-indicator-root"] {
+ display: none !important;
+}
+
+::-webkit-input-placeholder {
+ color: #000 !important;
+}
+
+:-moz-placeholder {
+ color: #000 !important;
+}
+
+::-moz-placeholder {
+ color: #000 !important;
+}
+
+:-ms-input-placeholder {
+ color: #000 !important;
+}
+
+.excessItem {
+ outline: rgba(0, 0, 0, 0.3) !important;
+}
+
+._3m1m {
+ background: linear-gradient(transparent, #fafafa) !important;
+}
+
+@-webkit-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+ 100% {
+ background: #fafafa;
+ }
+}
+@-moz-keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+ 100% {
+ background: #fafafa;
+ }
+}
+@keyframes highlightFade {
+ 0%, 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+ 100% {
+ background: #fafafa;
+ }
+}
+@-webkit-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #fafafa;
+ }
+ 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+}
+@-moz-keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #fafafa;
+ }
+ 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+}
+@keyframes chatHighlightAnimation {
+ 0%, 100% {
+ background: #fafafa;
+ }
+ 50% {
+ background: rgba(230, 230, 230, 0.35);
+ }
+}
+._50uu {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23000" viewBox="0 -10 50 50"%3E%3Ccircle cx="25" cy="23" r="3.2"/%3E%3Cpath d="M22 13l-1.83 2H17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V17c0-1.1-.9-2-2-2h-3.17L28 13h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/%3E%3Cpath fill="none" d="M13 11h24v24H13z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._50uw {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23000" viewBox="0 0 50 50"%3E%3Cpath fill="none" d="M13 26h24v24H13z"/%3E%3Cpath d="M30 31.5V28c0-.55-.45-1-1-1H17c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/%3E%3C/svg%3E') no-repeat !important;
+}
+
+._15km ._15ko::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23000" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15ko._77la::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%233b5998" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kq::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23000" viewBox="0 0 24 24"%3E%3Cpath d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+._15km ._15kr::before {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23000" viewBox="0 0 24 24"%3E%3Cpath d="M14 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11z"/%3E%3Cpath fill="none" d="M24 0H0v24h24z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
+
+.story_body_container i.img[data-sigil*=story-popup-context] {
+ background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath fill="none" d="M0 0h24v24H0z"/%3E%3Cpath fill="%23000" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/%3E%3C/svg%3E') no-repeat !important;
+ background-position: center !important;
+}
diff --git a/app/src/web/assets/css/themes/material_light.scss b/app/src/web/assets/css/themes/material_light.scss
new file mode 100644
index 00000000..7ec58463
--- /dev/null
+++ b/app/src/web/assets/css/themes/material_light.scss
@@ -0,0 +1,15 @@
+$text: #000;
+$accent_text: #fff;
+$link: #3b5998;
+$accent: #3b5998;
+$background: #fafafa;
+// this is actually the inverse of material light (bg should be gray, cards should be white),
+// but it looks better than the alternative
+$background2: rgba(darken($background, 8%), 0.35);
+
+$bg_transparent: $background;
+
+$card: #fff;
+$tint: #ddd;
+
+@import "../core/main"; \ No newline at end of file
diff --git a/app/src/web/assets/js/click_a.js b/app/src/web/assets/js/click_a.js
new file mode 100644
index 00000000..7faafc15
--- /dev/null
+++ b/app/src/web/assets/js/click_a.js
@@ -0,0 +1,55 @@
+"use strict";
+(function () {
+ var prevented = false;
+ var _frostAClick = function (e) {
+ // check for valid target
+ var target = e.target || e.currentTarget || e.srcElement;
+ if (!(target instanceof Element)) {
+ console.log("No element found");
+ return;
+ }
+ var element = target;
+ // Notifications are two layers under
+ for (var i = 0; i < 2; i++) {
+ if (element.tagName !== 'A') {
+ element = element.parentElement;
+ }
+ }
+ if (element.tagName === 'A') {
+ if (!prevented) {
+ var url = element.getAttribute('href');
+ if (!url || url === '#') {
+ return;
+ }
+ console.log("Click intercept " + url);
+ // If Frost is injected, check if loading the url through an overlay works
+ if (Frost.loadUrl(url)) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ }
+ else {
+ console.log("Click intercept prevented");
+ }
+ }
+ };
+ /*
+ * On top of the click event, we must stop it for long presses
+ * Since that will conflict with the context menu
+ * Note that we only override it on conditions where the context menu
+ * Will occur
+ */
+ var _frostPreventClick = function () {
+ console.log("Click _frostPrevented");
+ prevented = true;
+ };
+ document.addEventListener('click', _frostAClick, true);
+ var clickTimeout = undefined;
+ document.addEventListener('touchstart', function () {
+ clickTimeout = setTimeout(_frostPreventClick, 400);
+ }, true);
+ document.addEventListener('touchend', function () {
+ prevented = false;
+ clearTimeout(clickTimeout);
+ }, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/click_a.ts b/app/src/web/assets/js/click_a.ts
new file mode 100644
index 00000000..5023610e
--- /dev/null
+++ b/app/src/web/assets/js/click_a.ts
@@ -0,0 +1,57 @@
+(function () {
+ let prevented = false;
+
+ const _frostAClick = (e: Event) => {
+ // check for valid target
+ const target = e.target || e.currentTarget || e.srcElement;
+ if (!(target instanceof Element)) {
+ console.log("No element found");
+ return
+ }
+ let element: Element = target;
+ // Notifications are two layers under
+ for (let i = 0; i < 2; i++) {
+ if (element.tagName !== 'A') {
+ element = <Element>element.parentElement;
+ }
+ }
+ if (element.tagName === 'A') {
+ if (!prevented) {
+ const url = element.getAttribute('href');
+ if (!url || url === '#') {
+ return
+ }
+ console.log(`Click intercept ${url}`);
+ // If Frost is injected, check if loading the url through an overlay works
+ if (Frost.loadUrl(url)) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ } else {
+ console.log("Click intercept prevented")
+ }
+ }
+ };
+
+ /*
+ * On top of the click event, we must stop it for long presses
+ * Since that will conflict with the context menu
+ * Note that we only override it on conditions where the context menu
+ * Will occur
+ */
+ const _frostPreventClick = () => {
+ console.log("Click _frostPrevented");
+ prevented = true;
+ };
+
+ document.addEventListener('click', _frostAClick, true);
+ let clickTimeout: number | undefined = undefined;
+ document.addEventListener('touchstart', () => {
+ clickTimeout = setTimeout(_frostPreventClick, 400);
+ }, true);
+ document.addEventListener('touchend', () => {
+ prevented = false;
+ clearTimeout(clickTimeout)
+ }, true);
+}).call(undefined);
+
diff --git a/app/src/web/assets/js/click_debugger.js b/app/src/web/assets/js/click_debugger.js
new file mode 100644
index 00000000..aab4572d
--- /dev/null
+++ b/app/src/web/assets/js/click_debugger.js
@@ -0,0 +1,14 @@
+"use strict";
+// For desktop only
+(function () {
+ var _frostAContext = function (e) {
+ // Commonality; check for valid target
+ var element = e.target || e.currentTarget || e.srcElement;
+ if (!(element instanceof Element)) {
+ console.log("No element found");
+ return;
+ }
+ console.log("Clicked element " + element.tagName + " " + element.className);
+ };
+ document.addEventListener('contextmenu', _frostAContext, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/click_debugger.ts b/app/src/web/assets/js/click_debugger.ts
new file mode 100644
index 00000000..088271fa
--- /dev/null
+++ b/app/src/web/assets/js/click_debugger.ts
@@ -0,0 +1,15 @@
+// For desktop only
+
+(function () {
+ const _frostAContext = (e: Event) => {
+ // Commonality; check for valid target
+ const element = e.target || e.currentTarget || e.srcElement;
+ if (!(element instanceof Element)) {
+ console.log("No element found");
+ return
+ }
+ console.log(`Clicked element ${element.tagName} ${element.className}`);
+ };
+
+ document.addEventListener('contextmenu', _frostAContext, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/context_a.js b/app/src/web/assets/js/context_a.js
new file mode 100644
index 00000000..7e636cea
--- /dev/null
+++ b/app/src/web/assets/js/context_a.js
@@ -0,0 +1,68 @@
+"use strict";
+/**
+ * Context menu for links
+ * Largely mimics click_a.js
+ */
+(function () {
+ var longClick = false;
+ var _frostAContext = function (e) {
+ Frost.longClick(true);
+ longClick = true;
+ /*
+ * Commonality; check for valid target
+ */
+ var target = e.target || e.currentTarget || e.srcElement;
+ if (!(target instanceof Element)) {
+ console.log("No element found");
+ return;
+ }
+ var element = target;
+ // Notifications are two layers under
+ for (var i = 0; i < 2; i++) {
+ if (element.tagName != 'A') {
+ element = element.parentElement;
+ }
+ }
+ if (element.tagName == 'A') {
+ var url = element.getAttribute('href');
+ if (!url || url == '#') {
+ return;
+ }
+ var text = element.parentElement.innerText;
+ // Check if image item exists, first in children and then in parent
+ var image = element.querySelector("[style*=\"background-image: url(\"]");
+ if (!image) {
+ image = element.parentElement.querySelector("[style*=\"background-image: url(\"]");
+ }
+ if (image) {
+ var imageUrl = window.getComputedStyle(image, null).backgroundImage.trim().slice(4, -1);
+ console.log("Context image: " + imageUrl);
+ Frost.loadImage(imageUrl, text);
+ e.stopPropagation();
+ e.preventDefault();
+ return;
+ }
+ // Check if true img exists
+ var img = element.querySelector("img[src*=scontent]");
+ if (img instanceof HTMLMediaElement) {
+ var imgUrl = img.src;
+ console.log("Context img: " + imgUrl);
+ Frost.loadImage(imgUrl, text);
+ e.stopPropagation();
+ e.preventDefault();
+ return;
+ }
+ console.log("Context content " + url + " " + text);
+ Frost.contextMenu(url, text);
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ };
+ document.addEventListener('contextmenu', _frostAContext, true);
+ document.addEventListener('touchend', function () {
+ if (longClick) {
+ Frost.longClick(false);
+ longClick = false;
+ }
+ }, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/context_a.ts b/app/src/web/assets/js/context_a.ts
new file mode 100644
index 00000000..16ed33a9
--- /dev/null
+++ b/app/src/web/assets/js/context_a.ts
@@ -0,0 +1,69 @@
+/**
+ * Context menu for links
+ * Largely mimics click_a.js
+ */
+(function () {
+ let longClick = false;
+ const _frostAContext = (e: Event) => {
+ Frost.longClick(true);
+ longClick = true;
+
+ /*
+ * Commonality; check for valid target
+ */
+ const target = e.target || e.currentTarget || e.srcElement;
+ if (!(target instanceof Element)) {
+ console.log("No element found");
+ return
+ }
+ let element: Element = target;
+ // Notifications are two layers under
+ for (let i = 0; i < 2; i++) {
+ if (element.tagName != 'A') {
+ element = <Element>element.parentElement;
+ }
+ }
+ if (element.tagName == 'A') {
+ const url = element.getAttribute('href');
+ if (!url || url == '#') {
+ return
+ }
+ const text = (<HTMLElement>element.parentElement).innerText;
+ // Check if image item exists, first in children and then in parent
+ let image = element.querySelector("[style*=\"background-image: url(\"]");
+ if (!image) {
+ image = (<Element>element.parentElement).querySelector("[style*=\"background-image: url(\"]")
+ }
+ if (image) {
+ const imageUrl = (<String>window.getComputedStyle(image, null).backgroundImage).trim().slice(4, -1);
+ console.log(`Context image: ${imageUrl}`);
+ Frost.loadImage(imageUrl, text);
+ e.stopPropagation();
+ e.preventDefault();
+ return
+ }
+ // Check if true img exists
+ const img = element.querySelector("img[src*=scontent]");
+ if (img instanceof HTMLMediaElement) {
+ const imgUrl = img.src;
+ console.log(`Context img: ${imgUrl}`);
+ Frost.loadImage(imgUrl, text);
+ e.stopPropagation();
+ e.preventDefault();
+ return
+ }
+ console.log(`Context content ${url} ${text}`);
+ Frost.contextMenu(url, text);
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ };
+
+ document.addEventListener('contextmenu', _frostAContext, true);
+ document.addEventListener('touchend', () => {
+ if (longClick) {
+ Frost.longClick(false);
+ longClick = false
+ }
+ }, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/document_watcher.js b/app/src/web/assets/js/document_watcher.js
new file mode 100644
index 00000000..f3c4ab25
--- /dev/null
+++ b/app/src/web/assets/js/document_watcher.js
@@ -0,0 +1,24 @@
+"use strict";
+// Emit key once half the viewport is covered
+(function () {
+ var isReady = function () {
+ return document.body.scrollHeight > innerHeight + 100;
+ };
+ if (isReady()) {
+ console.log('Already ready');
+ Frost.isReady();
+ return;
+ }
+ console.log('Injected document watcher');
+ var observer = new MutationObserver(function () {
+ if (isReady()) {
+ observer.disconnect();
+ Frost.isReady();
+ console.log("Documented surpassed height in " + performance.now());
+ }
+ });
+ observer.observe(document, {
+ childList: true,
+ subtree: true
+ });
+}).call(undefined);
diff --git a/app/src/web/assets/js/document_watcher.ts b/app/src/web/assets/js/document_watcher.ts
new file mode 100644
index 00000000..e671149c
--- /dev/null
+++ b/app/src/web/assets/js/document_watcher.ts
@@ -0,0 +1,27 @@
+// Emit key once half the viewport is covered
+(function () {
+ const isReady = () => {
+ return document.body.scrollHeight > innerHeight + 100
+ };
+
+ if (isReady()) {
+ console.log('Already ready');
+ Frost.isReady();
+ return
+ }
+
+ console.log('Injected document watcher');
+
+ const observer = new MutationObserver(() => {
+ if (isReady()) {
+ observer.disconnect();
+ Frost.isReady();
+ console.log(`Documented surpassed height in ${performance.now()}`);
+ }
+ });
+
+ observer.observe(document, {
+ childList: true,
+ subtree: true
+ })
+}).call(undefined);
diff --git a/app/src/web/assets/js/header_badges.js b/app/src/web/assets/js/header_badges.js
new file mode 100644
index 00000000..daaf540a
--- /dev/null
+++ b/app/src/web/assets/js/header_badges.js
@@ -0,0 +1,8 @@
+"use strict";
+// Fetches the header contents if it exists
+(function () {
+ var header = document.getElementById('mJewelNav');
+ if (header) {
+ Frost.handleHeader(header.outerHTML);
+ }
+}).call(undefined);
diff --git a/app/src/web/assets/js/header_badges.ts b/app/src/web/assets/js/header_badges.ts
new file mode 100644
index 00000000..473749f2
--- /dev/null
+++ b/app/src/web/assets/js/header_badges.ts
@@ -0,0 +1,7 @@
+// Fetches the header contents if it exists
+(function() {
+ const header = document.getElementById('mJewelNav');
+ if (header) {
+ Frost.handleHeader(header.outerHTML);
+ }
+}).call(undefined);
diff --git a/app/src/web/assets/js/header_hider.js b/app/src/web/assets/js/header_hider.js
new file mode 100644
index 00000000..faa9f66d
--- /dev/null
+++ b/app/src/web/assets/js/header_hider.js
@@ -0,0 +1,12 @@
+"use strict";
+(function () {
+ var header = document.querySelector('#header');
+ if (!header) {
+ return;
+ }
+ var jewel = header.querySelector('#mJewelNav');
+ if (!jewel) {
+ return;
+ }
+ header.style.display = 'none';
+}).call(undefined);
diff --git a/app/src/web/assets/js/header_hider.ts b/app/src/web/assets/js/header_hider.ts
new file mode 100644
index 00000000..1a8f27f2
--- /dev/null
+++ b/app/src/web/assets/js/header_hider.ts
@@ -0,0 +1,17 @@
+(function () {
+ const header = document.querySelector('#header');
+
+ if (!header) {
+ return
+ }
+
+ const jewel = header.querySelector('#mJewelNav');
+
+ if (!jewel) {
+ return
+ }
+
+ (<HTMLElement>header).style.display = 'none'
+}).call(undefined);
+
+
diff --git a/app/src/web/assets/js/media.js b/app/src/web/assets/js/media.js
new file mode 100644
index 00000000..571168d6
--- /dev/null
+++ b/app/src/web/assets/js/media.js
@@ -0,0 +1,43 @@
+"use strict";
+// Handles media events
+(function () {
+ var _frostMediaClick = function (e) {
+ var target = e.target || e.srcElement;
+ if (!(target instanceof HTMLElement)) {
+ return;
+ }
+ var element = target;
+ var dataset = element.dataset;
+ if (!dataset || !dataset.sigil || dataset.sigil.toLowerCase().indexOf('inlinevideo') == -1) {
+ return;
+ }
+ var i = 0;
+ while (!element.hasAttribute('data-store')) {
+ if (++i > 2) {
+ return;
+ }
+ element = element.parentNode;
+ }
+ var store = element.dataset.store;
+ if (!store) {
+ return;
+ }
+ var dataStore;
+ try {
+ dataStore = JSON.parse(store);
+ }
+ catch (e) {
+ return;
+ }
+ var url = dataStore.src;
+ // !startsWith; see https://stackoverflow.com/a/36876507/4407321
+ if (!url || url.lastIndexOf('http', 0) !== 0) {
+ return;
+ }
+ console.log("Inline video " + url);
+ if (Frost.loadVideo(url, dataStore.animatedGifVideo || false)) {
+ e.stopPropagation();
+ }
+ };
+ document.addEventListener('click', _frostMediaClick, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/media.ts b/app/src/web/assets/js/media.ts
new file mode 100644
index 00000000..5b9b1a54
--- /dev/null
+++ b/app/src/web/assets/js/media.ts
@@ -0,0 +1,47 @@
+// Handles media events
+(function () {
+ const _frostMediaClick = (e: Event) => {
+ const target = e.target || e.srcElement;
+ if (!(target instanceof HTMLElement)) {
+ return
+ }
+ let element: HTMLElement = target;
+ const dataset = element.dataset;
+ if (!dataset || !dataset.sigil || dataset.sigil.toLowerCase().indexOf('inlinevideo') == -1) {
+ return
+ }
+ let i = 0;
+ while (!element.hasAttribute('data-store')) {
+ if (++i > 2) {
+ return
+ }
+ element = <HTMLElement>element.parentNode;
+ }
+ const store = element.dataset.store;
+ if (!store) {
+ return
+ }
+
+ let dataStore;
+
+ try {
+ dataStore = JSON.parse(store)
+ } catch (e) {
+ return
+ }
+
+ const url = dataStore.src;
+
+ // !startsWith; see https://stackoverflow.com/a/36876507/4407321
+ if (!url || url.lastIndexOf('http', 0) !== 0) {
+ return
+ }
+
+ console.log(`Inline video ${url}`);
+ if (Frost.loadVideo(url, dataStore.animatedGifVideo || false)) {
+ e.stopPropagation()
+ }
+ };
+
+ document.addEventListener('click', _frostMediaClick, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/menu.js b/app/src/web/assets/js/menu.js
new file mode 100644
index 00000000..c30e93cf
--- /dev/null
+++ b/app/src/web/assets/js/menu.js
@@ -0,0 +1,57 @@
+"use strict";
+// Click menu and move contents to main view
+(function () {
+ var viewport = document.querySelector("#viewport");
+ var root = document.querySelector("#root");
+ var bookmarkJewel = document.querySelector("#bookmarks_jewel");
+ if (!viewport || !root || !bookmarkJewel) {
+ console.log('Menu.js: main elements not found');
+ Frost.emit(0);
+ return;
+ }
+ var menuA = bookmarkJewel.querySelector("a");
+ if (!menuA) {
+ console.log('Menu.js: menu links not found');
+ Frost.emit(0);
+ return;
+ }
+ var jewel = document.querySelector('#mJewelNav');
+ if (!jewel) {
+ console.log('Menu.js: jewel is null');
+ return;
+ }
+ var y = new MutationObserver(function () {
+ viewport.removeAttribute('style');
+ root.removeAttribute('style');
+ });
+ y.observe(viewport, {
+ attributes: true
+ });
+ y.observe(root, {
+ attributes: true
+ });
+ var x = new MutationObserver(function () {
+ var menu = document.querySelector('.mSideMenu');
+ if (menu) {
+ x.disconnect();
+ console.log("Found side menu");
+ // Transfer elements
+ while (root.firstChild) {
+ root.removeChild(root.firstChild);
+ }
+ while (menu.childNodes.length) {
+ viewport.appendChild(menu.childNodes[0]);
+ }
+ Frost.emit(0);
+ setTimeout(function () {
+ y.disconnect();
+ console.log('Unhook styler');
+ }, 500);
+ }
+ });
+ x.observe(jewel, {
+ childList: true,
+ subtree: true
+ });
+ menuA.click();
+}).call(undefined);
diff --git a/app/src/web/assets/js/menu.ts b/app/src/web/assets/js/menu.ts
new file mode 100644
index 00000000..6f9dbf16
--- /dev/null
+++ b/app/src/web/assets/js/menu.ts
@@ -0,0 +1,59 @@
+// Click menu and move contents to main view
+(function () {
+ const viewport = document.querySelector("#viewport");
+ const root = document.querySelector("#root");
+ const bookmarkJewel = document.querySelector("#bookmarks_jewel");
+ if (!viewport || !root || !bookmarkJewel) {
+ console.log('Menu.js: main elements not found');
+ Frost.emit(0);
+ return
+ }
+ const menuA = bookmarkJewel.querySelector("a");
+ if (!menuA) {
+ console.log('Menu.js: menu links not found');
+ Frost.emit(0);
+ return
+ }
+ const jewel = document.querySelector('#mJewelNav');
+ if (!jewel) {
+ console.log('Menu.js: jewel is null');
+ return
+ }
+
+ const y = new MutationObserver(() => {
+ viewport.removeAttribute('style');
+ root.removeAttribute('style');
+ });
+
+ y.observe(viewport, {
+ attributes: true
+ });
+ y.observe(root, {
+ attributes: true
+ });
+
+ const x = new MutationObserver(() => {
+ const menu = document.querySelector('.mSideMenu');
+ if (menu) {
+ x.disconnect();
+ console.log("Found side menu");
+ // Transfer elements
+ while (root.firstChild) {
+ root.removeChild(root.firstChild);
+ }
+ while (menu.childNodes.length) {
+ viewport.appendChild(menu.childNodes[0]);
+ }
+ Frost.emit(0);
+ setTimeout(() => {
+ y.disconnect();
+ console.log('Unhook styler');
+ }, 500);
+ }
+ });
+ x.observe(jewel, {
+ childList: true,
+ subtree: true
+ });
+ menuA.click();
+}).call(undefined);
diff --git a/app/src/web/assets/js/notif_msg.js b/app/src/web/assets/js/notif_msg.js
new file mode 100644
index 00000000..20a89e88
--- /dev/null
+++ b/app/src/web/assets/js/notif_msg.js
@@ -0,0 +1,26 @@
+"use strict";
+// Binds callback to an invisible webview to take in the search events
+(function () {
+ var finished = false;
+ var x = new MutationObserver(function () {
+ var _f_thread = document.querySelector('#threadlist_rows');
+ if (!_f_thread) {
+ return;
+ }
+ console.log("Found message threads " + _f_thread.outerHTML);
+ Frost.handleHtml(_f_thread.outerHTML);
+ finished = true;
+ x.disconnect();
+ });
+ x.observe(document, {
+ childList: true,
+ subtree: true
+ });
+ setTimeout(function () {
+ if (!finished) {
+ finished = true;
+ console.log('Message thread timeout cancellation');
+ Frost.handleHtml("");
+ }
+ }, 20000);
+}).call(undefined);
diff --git a/app/src/web/assets/js/notif_msg.ts b/app/src/web/assets/js/notif_msg.ts
new file mode 100644
index 00000000..b7ce7a19
--- /dev/null
+++ b/app/src/web/assets/js/notif_msg.ts
@@ -0,0 +1,25 @@
+// Binds callback to an invisible webview to take in the search events
+(function () {
+ let finished = false;
+ const x = new MutationObserver(() => {
+ const _f_thread = document.querySelector('#threadlist_rows');
+ if (!_f_thread) {
+ return
+ }
+ console.log(`Found message threads ${_f_thread.outerHTML}`);
+ Frost.handleHtml(_f_thread.outerHTML);
+ finished = true;
+ x.disconnect();
+ });
+ x.observe(document, {
+ childList: true,
+ subtree: true
+ });
+ setTimeout(() => {
+ if (!finished) {
+ finished = true;
+ console.log('Message thread timeout cancellation');
+ Frost.handleHtml("")
+ }
+ }, 20000);
+}).call(undefined);
diff --git a/app/src/web/assets/js/textarea_listener.js b/app/src/web/assets/js/textarea_listener.js
new file mode 100644
index 00000000..9a8783c1
--- /dev/null
+++ b/app/src/web/assets/js/textarea_listener.js
@@ -0,0 +1,31 @@
+"use strict";
+/*
+ * focus listener for textareas
+ * since swipe to refresh is quite sensitive, we will disable it
+ * when we detect a user typing
+ * note that this extends passed having a keyboard opened,
+ * as a user may still be reviewing his/her post
+ * swiping should automatically be reset on refresh
+ */
+(function () {
+ var _frostFocus = function (e) {
+ var element = e.target || e.srcElement;
+ if (!(element instanceof Element)) {
+ return;
+ }
+ console.log("FrostJSI focus, " + element.tagName);
+ if (element.tagName == 'TEXTAREA') {
+ Frost.disableSwipeRefresh(true);
+ }
+ };
+ var _frostBlur = function (e) {
+ var element = e.target || e.srcElement;
+ if (!(element instanceof Element)) {
+ return;
+ }
+ console.log("FrostJSI blur, " + element.tagName);
+ Frost.disableSwipeRefresh(false);
+ };
+ document.addEventListener("focus", _frostFocus, true);
+ document.addEventListener("blur", _frostBlur, true);
+}).call(undefined);
diff --git a/app/src/web/assets/js/textarea_listener.ts b/app/src/web/assets/js/textarea_listener.ts
new file mode 100644
index 00000000..9d5fd388
--- /dev/null
+++ b/app/src/web/assets/js/textarea_listener.ts
@@ -0,0 +1,31 @@
+/*
+ * focus listener for textareas
+ * since swipe to refresh is quite sensitive, we will disable it
+ * when we detect a user typing
+ * note that this extends passed having a keyboard opened,
+ * as a user may still be reviewing his/her post
+ * swiping should automatically be reset on refresh
+ */
+(function () {
+ const _frostFocus = (e: Event) => {
+ const element = e.target || e.srcElement;
+ if (!(element instanceof Element)) {
+ return
+ }
+ console.log(`FrostJSI focus, ${element.tagName}`);
+ if (element.tagName == 'TEXTAREA') {
+ Frost.disableSwipeRefresh(true);
+ }
+ };
+
+ const _frostBlur = (e: Event) => {
+ const element = e.target || e.srcElement;
+ if (!(element instanceof Element)) {
+ return
+ }
+ console.log(`FrostJSI blur, ${element.tagName}`);
+ Frost.disableSwipeRefresh(false);
+ };
+ document.addEventListener("focus", _frostFocus, true);
+ document.addEventListener("blur", _frostBlur, true);
+}).call(undefined);
diff --git a/app/src/web/assets/pgl.yoyo.org.txt b/app/src/web/assets/pgl.yoyo.org.txt
new file mode 100644
index 00000000..63d6fa41
--- /dev/null
+++ b/app/src/web/assets/pgl.yoyo.org.txt
@@ -0,0 +1,2409 @@
+101com.com
+101order.com
+123found.com
+180hits.de
+180searchassistant.com
+1x1rank.com
+207.net
+247media.com
+24log.com
+24log.de
+24pm-affiliation.com
+2mdn.net
+2o7.net
+360yield.com
+4affiliate.net
+4d5.net
+50websads.com
+518ad.com
+51yes.com
+600z.com
+777partner.com
+777seo.com
+77tracking.com
+7bpeople.com
+7search.com
+99count.com
+a-ads.com
+a-counter.kiev.ua
+a.0day.kiev.ua
+a.aproductmsg.com
+a.collective-media.net
+a.consumer.net
+a.mktw.net
+a.sakh.com
+a.ucoz.net
+a.ucoz.ru
+a.xanga.com
+a32.g.a.yimg.com
+aaddzz.com
+abacho.net
+abc-ads.com
+absoluteclickscom.com
+abz.com
+ac.rnm.ca
+accounts.pkr.com.invalid
+acsseo.com
+actionsplash.com
+actualdeals.com
+acuityads.com
+ad-balancer.at
+ad-balancer.net
+ad-center.com
+ad-images.suntimes.com
+ad-pay.de
+ad-rotator.com
+ad-server.gulasidorna.se
+ad-serverparc.nl
+ad-souk.com
+ad-space.net
+ad-tech.com
+ad-up.com
+ad.100.tbn.ru
+ad.71i.de
+ad.980x.com
+ad.a8.net
+ad.abcnews.com
+ad.abctv.com
+ad.about.com
+ad.aboutit.de
+ad.aboutwebservices.com
+ad.abum.com
+ad.afy11.net
+ad.allstar.cz
+ad.altervista.org
+ad.amgdgt.com
+ad.anuntis.com
+ad.auditude.com
+ad.bizo.com
+ad.bnmla.com
+ad.bondage.com
+ad.caradisiac.com
+ad.centrum.cz
+ad.cgi.cz
+ad.choiceradio.com
+ad.clix.pt
+ad.cooks.com
+ad.crwdcntrl.net
+ad.digitallook.com
+ad.directrev.com
+ad.doctissimo.fr
+ad.domainfactory.de
+ad.e-kolay.net
+ad.eurosport.com
+ad.f1cd.ru
+ad.flurry.com
+ad.foxnetworks.com
+ad.freecity.de
+ad.gate24.ch
+ad.globe7.com
+ad.grafika.cz
+ad.hbv.de
+ad.hodomobile.com
+ad.httpool.com
+ad.hyena.cz
+ad.iinfo.cz
+ad.ilove.ch
+ad.infoseek.com
+ad.jamba.net
+ad.jamster.co.uk
+ad.jetsoftware.com
+ad.keenspace.com
+ad.leadbolt.net
+ad.liveinternet.ru
+ad.lupa.cz
+ad.m5prod.net
+ad.media-servers.net
+ad.mediastorm.hu
+ad.mgd.de
+ad.musicmatch.com
+ad.nachtagenten.de
+ad.nozonedata.com
+ad.nttnavi.co.jp
+ad.nwt.cz
+ad.onad.eu
+ad.pandora.tv
+ad.playground.ru
+ad.preferances.com
+ad.profiwin.de
+ad.prv.pl
+ad.rambler.ru
+ad.reunion.com
+ad.scanmedios.com
+ad.sensismediasmart.com.au
+ad.seznam.cz
+ad.simgames.net
+ad.slutload.com
+ad.smartclip.net
+ad.tbn.ru
+ad.technoratimedia.com
+ad.thewheelof.com
+ad.top50.to
+ad.turn.com
+ad.tv2.no
+ad.twitchguru.com
+ad.usatoday.com
+ad.virtual-nights.com
+ad.watch.impress.co.jp
+ad.wavu.hu
+ad.way.cz
+ad.weatherbug.com
+ad.wsod.com
+ad.wz.cz
+ad.yadro.ru
+ad.yourmedia.com
+ad.zanox.com
+ad0.bigmir.net
+ad01.mediacorpsingapore.com
+ad1.emediate.dk
+ad1.emule-project.org
+ad1.kde.cz
+ad1.pamedia.com.au
+ad2.iinfo.cz
+ad2.ip.ro
+ad2.linxcz.cz
+ad2.lupa.cz
+ad2flash.com
+ad2games.com
+ad3.iinfo.cz
+ad3.pamedia.com.au
+ad4game.com
+adaction.de
+adadvisor.net
+adap.tv
+adapt.tv
+adbanner.ro
+adbard.net
+adblade.com
+adblockanalytics.com
+adboost.de.vu
+adboost.net
+adbooth.net
+adbot.com
+adbrite.com
+adbroker.de
+adbunker.com
+adbutler.com
+adbutler.de
+adbuyer.com
+adbuyer3.lycos.com
+adcash.com
+adcast.deviantart.com
+adcell.de
+adcenter.mdf.se
+adcenter.net
+adcentriconline.com
+adcept.net
+adclick.com
+adclient.uimserv.net
+adclient1.tucows.com
+adcloud.net
+adcomplete.com
+adconion.com
+adcontent.gamespy.com
+adcycle.com
+add.newmedia.cz
+addealing.com
+addesktop.com
+addfreestats.com
+addme.com
+adecn.com
+ademails.com
+adengage.com
+adexpose.com
+adext.inkclub.com
+adf.ly
+adfactor.nl
+adfarm.mediaplex.com
+adflight.com
+adforce.com
+adform.com
+adgardener.com
+adgoto.com
+adgridwork.com
+adhese.be
+adhese.com
+adi.mainichi.co.jp
+adimage.asiaone.com.sg
+adimage.guardian.co.uk
+adimages.been.com
+adimages.carsoup.com
+adimages.go.com
+adimages.homestore.com
+adimages.omroepzeeland.nl
+adimages.sanomawsoy.fi
+adimg.cnet.com
+adimg.com.com
+adimg.uimserv.net
+adimg1.chosun.com
+adimgs.sapo.pt
+adimpact.com
+adinjector.net
+adinterax.com
+adisfy.com
+adition.com
+adition.de
+adition.net
+adizio.com
+adjix.com
+adjug.com
+adjuggler.com
+adjuggler.yourdictionary.com
+adjustnetwork.com
+adk2.com
+adk2ads.tictacti.com
+adland.ru
+adlantic.nl
+adledge.com
+adlegend.com
+adlink.de
+adlog.com.com
+adloox.com
+adlooxtracking.com
+adlure.net
+admagnet.net
+admailtiser.com
+adman.gr
+adman.in.gr
+adman.otenet.gr
+admanagement.ch
+admanager.btopenworld.com
+admanager.carsoup.com
+admarketplace.net
+admarvel.com
+admax.nexage.com
+admedia.com
+admedia.ro
+admeld.com
+admerize.be
+admeta.com
+admex.com
+adminder.com
+adminshop.com
+admized.com
+admob.com
+admonitor.com
+admotion.com.ar
+adnet-media.net
+adnet.asahi.com
+adnet.biz
+adnet.de
+adnet.ru
+adnet.worldreviewer.com
+adnetinteractive.com
+adnetwork.net
+adnetworkperformance.com
+adnews.maddog2000.de
+adnotch.com
+adnxs.com
+adocean.pl
+adonspot.com
+adoperator.com
+adorigin.com
+adpepper.dk
+adpepper.nl
+adperium.com
+adpia.vn
+adplus.co.id
+adplxmd.com
+adprofile.net
+adprojekt.pl
+adq.nextag.com
+adrazzi.com
+adreactor.com
+adremedy.com
+adreporting.com
+adres.internet.com
+adrevolver.com
+adriver.ru
+adrolays.de
+adrotate.de
+adrotator.se
+ads-click.com
+ads.4tube.com
+ads.5ci.lt
+ads.abovetopsecret.com
+ads.aceweb.net
+ads.activestate.com
+ads.adfox.ru
+ads.administrator.de
+ads.adshareware.net
+ads.adultfriendfinder.com
+ads.adultswim.com
+ads.advance.net
+ads.adverline.com
+ads.affiliates.match.com
+ads.ak.facebook.com.edgesuite.net
+ads.allvatar.com
+ads.alt.com
+ads.alwayson-network.com
+ads.amdmb.com
+ads.amigos.com
+ads.aol.co.uk
+ads.aol.com
+ads.apn.co.nz
+ads.appsgeyser.com
+ads.as4x.tmcs.net
+ads.as4x.tmcs.ticketmaster.com
+ads.asia1.com.sg
+ads.asiafriendfinder.com
+ads.ask.com
+ads.aspalliance.com
+ads.avazu.net
+ads.batpmturner.com
+ads.beenetworks.net
+ads.belointeractive.com
+ads.berlinonline.de
+ads.betanews.com
+ads.betfair.com
+ads.betfair.com.au
+ads.bigchurch.com
+ads.bigfoot.com
+ads.billiton.de
+ads.bing.com
+ads.bittorrent.com
+ads.blog.com
+ads.bloomberg.com
+ads.bluelithium.com
+ads.bluemountain.com
+ads.bluesq.com
+ads.bonniercorp.com
+ads.boylesports.com
+ads.brabys.com
+ads.brain.pk
+ads.brazzers.com
+ads.bumq.com
+ads.businessweek.com
+ads.canalblog.com
+ads.canoe.ca
+ads.casinocity.com
+ads.cbc.ca
+ads.cc
+ads.cc-dt.com
+ads.centraliprom.com
+ads.cgnetworks.com
+ads.channel4.com
+ads.cimedia.com
+ads.clearchannel.com
+ads.co.com
+ads.com.com
+ads.contactmusic.com
+ads.contentabc.com
+ads.contextweb.com
+ads.crakmedia.com
+ads.creative-serving.com
+ads.creativematch.com
+ads.cricbuzz.com
+ads.cybersales.cz
+ads.dada.it
+ads.datinggold.com
+ads.datingyes.com
+ads.dazoot.ro
+ads.deltha.hu
+ads.dennisnet.co.uk
+ads.desmoinesregister.com
+ads.detelefoongids.nl
+ads.deviantart.com
+ads.digital-digest.com
+ads.digitalmedianet.com
+ads.digitalpoint.com
+ads.directionsmag.com
+ads.domeus.com
+ads.eagletribune.com
+ads.easy-forex.com
+ads.eatinparis.com
+ads.economist.com
+ads.edbindex.dk
+ads.egrana.com.br
+ads.einmedia.com
+ads.electrocelt.com
+ads.elitetrader.com
+ads.emirates.net.ae
+ads.epltalk.com
+ads.esmas.com
+ads.eu.msn.com
+ads.exactdrive.com
+ads.expat-blog.biz
+ads.expedia.com
+ads.ezboard.com
+ads.factorymedia.com
+ads.fairfax.com.au
+ads.faxo.com
+ads.ferianc.com
+ads.filmup.com
+ads.financialcontent.com
+ads.flooble.com
+ads.fool.com
+ads.footymad.net
+ads.forbes.com
+ads.forbes.net
+ads.forium.de
+ads.fortunecity.com
+ads.fotosidan.se
+ads.foxkidseurope.net
+ads.foxnetworks.com
+ads.foxnews.com
+ads.freecity.de
+ads.friendfinder.com
+ads.ft.com
+ads.futurenet.com
+ads.gamecity.net
+ads.gameforgeads.de
+ads.gamershell.com
+ads.gamespyid.com
+ads.gamigo.de
+ads.gaming-universe.de
+ads.gawker.com
+ads.geekswithblogs.net
+ads.glispa.com
+ads.globeandmail.com
+ads.gmodules.com
+ads.godlikeproductions.com
+ads.goyk.com
+ads.gplusmedia.com
+ads.gradfinder.com
+ads.grindinggears.com
+ads.groundspeak.com
+ads.gsm-exchange.com
+ads.gsmexchange.com
+ads.guardian.co.uk
+ads.guardianunlimited.co.uk
+ads.guru3d.com
+ads.hardwaresecrets.com
+ads.harpers.org
+ads.hbv.de
+ads.hearstmags.com
+ads.heartlight.org
+ads.heias.com
+ads.hideyourarms.com
+ads.hollywood.com
+ads.horsehero.com
+ads.horyzon-media.com
+ads.iafrica.com
+ads.ibest.com.br
+ads.ibryte.com
+ads.icq.com
+ads.ign.com
+ads.img.co.za
+ads.imgur.com
+ads.indiatimes.com
+ads.infi.net
+ads.internic.co.il
+ads.ipowerweb.com
+ads.isoftmarketing.com
+ads.itv.com
+ads.iwon.com
+ads.jewishfriendfinder.com
+ads.jiwire.com
+ads.jobsite.co.uk
+ads.jpost.com
+ads.jubii.dk
+ads.justhungry.com
+ads.kaktuz.net
+ads.kelbymediagroup.com
+ads.kinobox.cz
+ads.kinxxx.com
+ads.kompass.com
+ads.krawall.de
+ads.lesbianpersonals.com
+ads.linuxfoundation.org
+ads.linuxjournal.com
+ads.linuxsecurity.com
+ads.livenation.com
+ads.mariuana.it
+ads.massinfra.nl
+ads.mcafee.com
+ads.mediaodyssey.com
+ads.mediaturf.net
+ads.medienhaus.de
+ads.mgnetwork.com
+ads.mmania.com
+ads.moceanads.com
+ads.motor-forum.nl
+ads.motormedia.nl
+ads.msn.com
+ads.multimania.lycos.fr
+ads.nationalgeographic.com
+ads.ncm.com
+ads.netclusive.de
+ads.netmechanic.com
+ads.networksolutions.com
+ads.newdream.net
+ads.newgrounds.com
+ads.newmedia.cz
+ads.newsint.co.uk
+ads.newsquest.co.uk
+ads.ninemsn.com.au
+ads.nj.com
+ads.nola.com
+ads.nordichardware.com
+ads.nordichardware.se
+ads.nwsource.com
+ads.nyi.net
+ads.nytimes.com
+ads.nyx.cz
+ads.nzcity.co.nz
+ads.o2.pl
+ads.oddschecker.com
+ads.okcimg.com
+ads.ole.com
+ads.olivebrandresponse.com
+ads.oneplace.com
+ads.ookla.com
+ads.optusnet.com.au
+ads.outpersonals.com
+ads.p161.net
+ads.passion.com
+ads.pennet.com
+ads.penny-arcade.com
+ads.pheedo.com
+ads.phpclasses.org
+ads.pickmeup-ltd.com
+ads.pkr.com
+ads.planet.nl
+ads.pni.com
+ads.pof.com
+ads.powweb.com
+ads.primissima.it
+ads.printscr.com
+ads.prisacom.com
+ads.program3.com
+ads.psd2html.com
+ads.pushplay.com
+ads.quoka.de
+ads.rcs.it
+ads.recoletos.es
+ads.rediff.com
+ads.redlightcenter.com
+ads.redtube.com
+ads.resoom.de
+ads.returnpath.net
+ads.rottentomatoes.com
+ads.rpgdot.com
+ads.s3.sitepoint.com
+ads.satyamonline.com
+ads.savannahnow.com
+ads.saymedia.com
+ads.scifi.com
+ads.seniorfriendfinder.com
+ads.sexinyourcity.com
+ads.shizmoo.com
+ads.shopstyle.com
+ads.sift.co.uk
+ads.silverdisc.co.uk
+ads.slim.com
+ads.smartclick.com
+ads.soft32.com
+ads.space.com
+ads.spoonfeduk.com
+ads.sptimes.com
+ads.stackoverflow.com
+ads.stationplay.com
+ads.struq.com
+ads.sun.com
+ads.supplyframe.com
+ads.t-online.de
+ads.tahono.com
+ads.techtv.com
+ads.techweb.com
+ads.telegraph.co.uk
+ads.theglobeandmail.com
+ads.themovienation.com
+ads.thestar.com
+ads.timeout.com
+ads.tjwi.info
+ads.tmcs.net
+ads.totallyfreestuff.com
+ads.townhall.com
+ads.trinitymirror.co.uk
+ads.tripod.com
+ads.tripod.lycos.co.uk
+ads.tripod.lycos.de
+ads.tripod.lycos.es
+ads.tripod.lycos.it
+ads.tripod.lycos.nl
+ads.tripod.spray.se
+ads.tso.dennisnet.co.uk
+ads.uknetguide.co.uk
+ads.ultimate-guitar.com
+ads.uncrate.com
+ads.undertone.com
+ads.usatoday.com
+ads.v3.com
+ads.verticalresponse.com
+ads.vgchartz.com
+ads.videosz.com
+ads.virtual-nights.com
+ads.virtualcountries.com
+ads.vnumedia.com
+ads.waps.cn
+ads.wapx.cn
+ads.weather.ca
+ads.web.aol.com
+ads.web.cs.com
+ads.web.de
+ads.webmasterpoint.org
+ads.websiteservices.com
+ads.whi.co.nz
+ads.whoishostingthis.com
+ads.wiezoekje.nl
+ads.wikia.nocookie.net
+ads.wineenthusiast.com
+ads.wunderground.com
+ads.wwe.biz
+ads.xhamster.com
+ads.xtra.co.nz
+ads.y-0.net
+ads.yimg.com
+ads.yldmgrimg.net
+ads.yourfreedvds.com
+ads.youtube.com
+ads.zdnet.com
+ads.ztod.com
+ads03.redtube.com
+ads1.canoe.ca
+ads1.mediacapital.pt
+ads1.msn.com
+ads1.rne.com
+ads1.theglobeandmail.com
+ads1.virtual-nights.com
+ads10.speedbit.com
+ads180.com
+ads2.brazzers.com
+ads2.clearchannel.com
+ads2.contentabc.com
+ads2.gamecity.net
+ads2.jubii.dk
+ads2.net-communities.co.uk
+ads2.oneplace.com
+ads2.rne.com
+ads2.virtual-nights.com
+ads2.xnet.cz
+ads2004.treiberupdate.de
+ads3.contentabc.com
+ads3.gamecity.net
+ads3.virtual-nights.com
+ads4.clearchannel.com
+ads4.gamecity.net
+ads4.virtual-nights.com
+ads4homes.com
+ads5.canoe.ca
+ads5.virtual-nights.com
+ads6.gamecity.net
+ads7.gamecity.net
+ads8.com
+adsatt.abc.starwave.com
+Adsatt.ABCNews.starwave.com
+adsatt.espn.go.com
+adsatt.espn.starwave.com
+Adsatt.go.starwave.com
+adsby.bidtheatre.com
+adscale.de
+adscholar.com
+adscience.nl
+adscpm.com
+adsdaq.com
+adsdk.com
+adsend.de
+adserv.evo-x.de
+adserv.gamezone.de
+adserv.iafrica.com
+adserv.qconline.com
+adserv.quality-channel.de
+adserve.ams.rhythmxchange.com
+adserver-live.yoc.mobi
+adserver.43plc.com
+adserver.71i.de
+adserver.adultfriendfinder.com
+adserver.aidameter.com
+adserver.aol.fr
+adserver.barrapunto.com
+adserver.beggarspromo.com
+adserver.betandwin.de
+adserver.bing.com
+adserver.bizhat.com
+adserver.break-even.it
+adserver.cams.com
+adserver.clashmusic.com
+adserver.com
+adserver.digitoday.com
+adserver.dotcommedia.de
+adserver.finditquick.com
+adserver.flossiemediagroup.com
+adserver.freecity.de
+adserver.freenet.de
+adserver.friendfinder.com
+adserver.hardsextube.com
+adserver.hardwareanalysis.com
+adserver.html.it
+adserver.irishwebmasterforum.com
+adserver.janes.com
+adserver.kyoceramita-europe.com
+adserver.libero.it
+adserver.news.com.au
+adserver.ngz-network.de
+adserver.nydailynews.com
+adserver.o2.pl
+adserver.oddschecker.com
+adserver.omroepzeeland.nl
+adserver.pl
+adserver.portalofevil.com
+adserver.portugalmail.net
+adserver.portugalmail.pt
+adserver.quizdingo.com
+adserver.realhomesex.net
+adserver.sanomawsoy.fi
+adserver.sciflicks.com
+adserver.sharewareonline.com
+adserver.spankaway.com
+adserver.startnow.com
+adserver.theonering.net
+adserver.twitpic.com
+adserver.viagogo.com
+adserver.virginmedia.com
+adserver.yahoo.com
+adserver01.de
+adserver1-images.backbeatmedia.com
+adserver1.backbeatmedia.com
+adserver1.mindshare.de
+adserver1.mokono.com
+adserver1.ogilvy-interactive.de
+adserver2.mindshare.de
+adserver2.popdata.de
+adserverplus.com
+adserversolutions.com
+adservinginternational.com
+adsfac.eu
+adsfac.net
+adsfac.us
+adshost1.com
+adside.com
+adsk2.co
+adskape.ru
+adsklick.de
+adsmarket.com
+adsmart.co.uk
+adsmart.com
+adsmart.net
+adsmogo.com
+adsnative.com
+adsoftware.com
+adsoldier.com
+adsonar.com
+adspace.ro
+adspeed.net
+adspirit.de
+adsponse.de
+adsremote.scrippsnetworks.com
+adsrevenue.net
+adsrv.deviantart.com
+adsrv.eacdn.com
+adsrv.iol.co.za
+adsrvr.org
+adsstat.com
+adstat.4u.pl
+adstest.weather.com
+adsupply.com
+adsupplyads.com
+adswitcher.com
+adsymptotic.com
+adsynergy.com
+adsys.townnews.com
+adsystem.simplemachines.org
+adtech.de
+adtechus.com
+adtegrity.net
+adthis.com
+adtiger.de
+adtoll.com
+adtology.com
+adtoma.com
+adtrace.org
+adtrade.net
+adtrading.de
+adtrak.net
+adtriplex.com
+adultadvertising.com
+adv-adserver.com
+adv-banner.libero.it
+adv.cooperhosting.net
+adv.freeonline.it
+adv.hwupgrade.it
+adv.livedoor.com
+adv.webmd.com
+adv.wp.pl
+adv.yo.cz
+advariant.com
+adventory.com
+advert.bayarea.com
+advert.dyna.ultraweb.hu
+adverticum.com
+adverticum.net
+adverticus.de
+advertise.com
+advertiseireland.com
+advertisespace.com
+advertising.com
+advertising.guildlaunch.net
+advertisingbanners.com
+advertisingbox.com
+advertmarket.com
+advertmedia.de
+advertpro.sitepoint.com
+advertpro.ya.com
+adverts.carltononline.com
+advertserve.com
+advertstream.com
+advertwizard.com
+advideo.uimserv.net
+adview.ppro.de
+advisormedia.cz
+adviva.com
+adviva.net
+advnt.com
+adwareremovergold.com
+adwhirl.com
+adwitserver.com
+adworldnetwork.com
+adworx.at
+adworx.be
+adworx.nl
+adx.allstar.cz
+adx.atnext.com
+adxpansion.com
+adxpose.com
+adxvalue.com
+adyea.com
+adzerk.net
+adzerk.s3.amazonaws.com
+adzones.com
+af-ad.co.uk
+affbuzzads.com
+affili.net
+affiliate.1800flowers.com
+affiliate.7host.com
+affiliate.doubleyourdating.com
+affiliate.dtiserv.com
+affiliate.gamestop.com
+affiliate.mercola.com
+affiliate.mogs.com
+affiliate.offgamers.com
+affiliate.travelnow.com
+affiliate.viator.com
+affiliatefuel.com
+affiliatefuture.com
+affiliates.allposters.com
+affiliates.babylon.com
+affiliates.devilfishpartners.com
+affiliates.digitalriver.com
+affiliates.globat.com
+affiliates.ige.com
+affiliates.internationaljock.com
+affiliates.jlist.com
+affiliates.streamray.com
+affiliates.thinkhost.net
+affiliates.thrixxx.com
+affiliates.ultrahosting.com
+affiliatetracking.com
+affiliatetracking.net
+affiliatewindow.com
+affiliation-france.com
+afftracking.justanswer.com
+ah-ha.com
+ahalogy.com
+aidu-ads.de
+aim4media.com
+aistat.net
+aktrack.pubmatic.com
+alclick.com
+alenty.com
+alexa-sitestats.s3.amazonaws.com
+all4spy.com
+alladvantage.com
+allosponsor.com
+amazingcounters.com
+amazon-adsystem.com
+amung.us
+an.tacoda.net
+anahtars.com
+analytics.adpost.org
+analytics.google.com
+analytics.live.com
+analytics.yahoo.com
+anm.intelli-direct.com
+annonser.dagbladet.no
+apex-ad.com
+api.intensifier.de
+apture.com
+arc1.msn.com
+arcadebanners.com
+ard.xxxblackbook.com
+are-ter.com
+as.webmd.com
+as1.advfn.com
+as2.advfn.com
+as5000.com
+assets1.exgfnetwork.com
+assoc-amazon.com
+at-adserver.alltop.com
+atdmt.com
+athena-ads.wikia.com
+atwola.com
+auctionads.com
+auctionads.net
+audience2media.com
+audit.median.hu
+audit.webinform.hu
+auto-bannertausch.de
+autohits.dk
+avenuea.com
+avpa.javalobby.org
+avres.net
+avsads.com
+awempire.com
+awin1.com
+aylarl.com
+azfront.com
+b-1st.com
+b.aol.com
+b.engadget.com
+ba.afl.rakuten.co.jp
+babs.tv2.dk
+backbeatmedia.com
+banik.redigy.cz
+banner-exchange-24.de
+banner.ad.nu
+banner.alphacool.de
+banner.ambercoastcasino.com
+banner.blogranking.net
+banner.buempliz-online.ch
+banner.casino.net
+banner.casinodelrio.com
+banner.cotedazurpalace.com
+banner.coza.com
+banner.cz
+banner.easyspace.com
+banner.elisa.net
+banner.eurogrand.com
+banner.featuredusers.com
+banner.getgo.de
+banner.goldenpalace.com
+banner.img.co.za
+banner.inyourpocket.com
+banner.jobsahead.com
+banner.joylandcasino.com
+banner.kiev.ua
+banner.linux.se
+banner.media-system.de
+banner.mindshare.de
+banner.nixnet.cz
+banner.noblepoker.com
+banner.northsky.com
+banner.orb.net
+banner.penguin.cz
+banner.prestigecasino.com
+banner.rbc.ru
+banner.relcom.ru
+banner.tanto.de
+banner.titan-dsl.de
+banner.vadian.net
+banner.webmersion.com
+banner.wirenode.com
+bannerads.de
+bannerboxes.com
+bannercommunity.de
+bannerconnect.com
+bannerconnect.net
+bannerexchange.cjb.net
+bannerflow.com
+bannergrabber.internet.gr
+bannerhost.com
+bannerimage.com
+bannerlandia.com.ar
+bannermall.com
+bannermarkt.nl
+bannerpower.com
+banners.adultfriendfinder.com
+banners.amigos.com
+banners.apnuk.com
+banners.asiafriendfinder.com
+banners.audioholics.com
+banners.babylon-x.com
+banners.bol.com.br
+banners.cams.com
+banners.clubseventeen.com
+banners.czi.cz
+banners.dine.com
+banners.direction-x.com
+banners.directnic.com
+banners.easydns.com
+banners.ebay.com
+banners.freett.com
+banners.friendfinder.com
+banners.getiton.com
+banners.iq.pl
+banners.isoftmarketing.com
+banners.lifeserv.com
+banners.linkbuddies.com
+banners.passion.com
+banners.resultonline.com
+banners.sexsearch.com
+banners.sys-con.com
+banners.thomsonlocal.com
+banners.videosz.com
+banners.virtuagirlhd.com
+banners.wunderground.com
+bannerserver.com
+bannersgomlm.com
+bannershotlink.perfectgonzo.com
+bannersng.yell.com
+bannerspace.com
+bannerswap.com
+bannery.cz
+bannieres.acces-contenu.com
+bans.adserver.co.il
+bans.bride.ru
+barnesandnoble.bfast.com
+baypops.com
+bbelements.com
+bbn.img.com.ua
+begun.ru
+belstat.com
+belstat.nl
+berp.com
+best-pr.info
+best-top.ro
+bestsearch.net
+bhclicks.com
+bidclix.com
+bidclix.net
+bidtrk.com
+bidvertiser.com
+bigads.guj.de
+bigbangmedia.com
+bigclicks.com
+billboard.cz
+bitads.net
+bitmedianetwork.com
+bizad.nikkeibp.co.jp
+bizrate.com
+blast4traffic.com
+blingbucks.com
+blogads.com
+blogcounter.de
+blogherads.com
+blogrush.com
+blogtoplist.se
+blogtopsites.com
+blueadvertise.com
+bluekai.com
+bluelithium.com
+bluewhaleweb.com
+bm.annonce.cz
+bn.bfast.com
+boersego-ads.de
+boldchat.com
+boom.ro
+boomads.com
+boost-my-pr.de
+box.anchorfree.net
+bpath.com
+braincash.com
+brandreachsys.com
+bravenet.com.invalid
+bridgetrack.com
+brightinfo.com
+british-banners.com
+bs.yandex.ru
+budsinc.com
+bullseye.backbeatmedia.com
+buyhitscheap.com
+buysellads.com
+buzzonclick.com
+bvalphaserver.com
+bwp.download.com
+c.bigmir.net
+c.compete.com
+c1.nowlinux.com
+campaign.bharatmatrimony.com
+caniamedia.com
+carbonads.com
+carbonads.net
+casalemedia.com
+casalmedia.com
+cash4members.com
+cash4popup.de
+cashcrate.com
+cashengines.com
+cashfiesta.com
+cashlayer.com
+cashpartner.com
+casinogames.com
+casinopays.com
+casinorewards.com
+casinotraffic.com
+casinotreasure.com
+cbanners.virtuagirlhd.com
+cben1.net
+cbmall.com
+cbx.net
+cdn.freefacti.com
+cecash.com
+ceskydomov.alias.ngs.modry.cz
+cetrk.com
+cgicounter.puretec.de
+ch.questionmarket.com
+channelintelligence.com
+chart.dk
+chartbeat.com
+chartbeat.net
+checkm8.com
+checkstat.nl
+chestionar.ro
+chitika.net
+cibleclick.com
+cityads.telus.net
+cj.com
+cjbmanagement.com
+cjlog.com
+claria.com
+class-act-clicks.com
+click.absoluteagency.com
+click.fool.com
+click.kmindex.ru
+click2freemoney.com
+click2paid.com
+clickability.com
+clickadz.com
+clickagents.com
+clickbank.com
+clickbank.net
+clickbooth.com
+clickboothlnk.com
+clickbrokers.com
+clickcompare.co.uk
+clickdensity.com
+clickedyclick.com
+clickhereforcellphones.com
+clickhouse.com
+clickhype.com
+clicklink.jp
+clickmedia.ro
+clicks.equantum.com
+clicks.mods.de
+clickserve.cc-dt.com
+clicksor.com
+clicktag.de
+clickthrucash.com
+clickthruserver.com
+clickthrutraffic.com
+clicktrace.info
+clicktrack.ziyu.net
+clicktracks.com
+clicktrade.com
+clickxchange.com
+clickz.com
+clickzxc.com
+clicmanager.fr
+clients.tbo.com
+clixgalore.com
+clkads.com
+clkrev.com
+cluster.adultworld.com
+clustrmaps.com
+cmpstar.com
+cnomy.com
+cnt.spbland.ru
+cnt1.pocitadlo.cz
+code-server.biz
+colonize.com
+comclick.com
+commindo-media-ressourcen.de
+commissionmonster.com
+compactbanner.com
+comprabanner.it
+connextra.com
+contaxe.de
+content.acc-hd.de
+content.ad
+contextweb.com
+conversantmedia.com
+conversionruler.com
+cookies.cmpnet.com
+coremetrics.com
+count.rbc.ru
+count.rin.ru
+count.west263.com
+counted.com
+counter.avtoindex.com
+counter.bloke.com
+counter.cnw.cz
+counter.cz
+counter.dreamhost.com
+counter.fateback.com
+counter.mirohost.net
+counter.mojgorod.ru
+counter.nowlinux.com
+counter.rambler.ru
+counter.search.bg
+counter.sparklit.com
+counter.yadro.ru
+counters.honesty.com
+counting.kmindex.ru
+counts.tucows.com
+coupling-media.de
+cpalead.com
+cpays.com
+cpmaffiliation.com
+cpmstar.com
+cpxadroit.com
+cpxinteractive.com
+cqcounter.com
+crakmedia.com
+craktraffic.com
+crawlability.com
+crazypopups.com
+creafi-online-media.com
+creative.ak.facebook.com
+creative.whi.co.nz
+creatives.as4x.tmcs.net
+creatives.livejasmin.com
+crispads.com
+criteo.com
+crowdgravity.com
+crtv.mate1.com
+crwdcntrl.net
+ctnetwork.hu
+cubics.com
+customad.cnn.com
+cyberbounty.com
+cybermonitor.com
+d.adroll.com
+dakic-ia-300.com
+danban.com
+dapper.net
+datashreddergold.com
+dbbsrv.com
+dc-storm.com
+de17a.com
+dealdotcom.com
+debtbusterloans.com
+decknetwork.net
+deloo.de
+demandbase.com
+depilflash.tv
+di1.shopping.com
+dialerporn.com
+didtheyreadit.com
+direct-xxx-access.com
+directaclick.com
+directivepub.com
+directleads.com
+directorym.com
+directtrack.com
+discountclick.com
+displayadsmedia.com
+displaypagerank.com
+dist.belnk.com
+dmtracker.com
+dmtracking.alibaba.com
+dmtracking2.alibaba.com
+dnads.directnic.com
+domaining.in
+domainsponsor.com
+domainsteam.de
+doubleclick.com
+doubleclick.de
+doubleclick.net
+doublepimp.com
+drumcash.com
+dynamic.fmpub.net
+e-adimages.scrippsnetworks.com
+e-bannerx.com
+e-debtconsolidation.com
+e-m.fr
+e-n-t-e-r-n-e-x.com
+e-planning.net
+e.kde.cz
+eadexchange.com
+eas.almamedia.fi
+easyhits4u.com
+ebayadvertising.com
+ebocornac.com
+ebuzzing.com
+ecircle-ag.com
+eclick.vn
+ecoupons.com
+edgeio.com
+effectivemeasure.com
+effectivemeasure.net
+eiv.baidu.com
+elitedollars.com
+elitetoplist.com
+emarketer.com
+emediate.dk
+emediate.eu
+emonitor.takeit.cz
+engine.awaps.net
+engine.espace.netavenir.com
+enginenetwork.com
+enoratraffic.com
+enquisite.com
+entercasino.com
+entrecard.s3.amazonaws.com
+epiccash.com
+eqads.com
+ero-advertising.com
+esellerate.net
+estat.com
+etahub.com
+etargetnet.com
+ethicalads.net
+etracker.de
+eu-adcenter.net
+eu1.madsone.com
+eur.a1.yimg.com
+eurekster.com
+euro-linkindex.de
+euroclick.com
+european-toplist.de
+euroranking.de
+euros4click.de
+eusta.de
+evergage.com
+evidencecleanergold.com
+ewebcounter.com
+exchange-it.com
+exchange.bg
+exchangead.com
+exchangeclicksonline.com
+exit76.com
+exitexchange.com
+exitfuel.com
+exoclick.com
+exogripper.com
+experteerads.com
+exponential.com
+express-submit.de
+extractorandburner.com
+extreme-dm.com
+extremetracking.com
+eyeblaster.com
+eyereturn.com
+eyeviewads.com
+eyewonder.com
+ezula.com
+f5biz.com
+fast-adv.it
+fastclick.com
+fastclick.com.edgesuite.net
+fastclick.net
+fb-promotions.com
+fc.webmasterpro.de
+feedbackresearch.com
+feedjit.com
+ffxcam.fairfax.com.au
+fimc.net
+fimserve.com
+findcommerce.com
+findyourcasino.com
+fineclicks.com
+first.nova.cz
+firstlightera.com
+flashtalking.com
+fleshlightcash.com
+flexbanner.com
+flowgo.com
+flurry.com
+fonecta.leiki.com
+foo.cosmocode.de
+forex-affiliate.net
+fpctraffic.com
+fpctraffic2.com
+fragmentserv.iac-online.de
+free-banners.com
+freebanner.com
+freelogs.com
+freeonlineusers.com
+freepay.com
+freestats.com
+freestats.tv
+freewebcounter.com
+funklicks.com
+funpageexchange.com
+fusionads.net
+fusionquest.com
+fxclix.com
+fxstyle.net
+galaxien.com
+game-advertising-online.com
+gamehouse.com
+gamesites100.net
+gamesites200.com
+gamesitestop100.com
+gator.com
+gbanners.hornymatches.com
+gemius.pl
+geo.digitalpoint.com
+geobanner.adultfriendfinder.com
+geovisite.com
+german-linkindex.de
+getclicky.com
+globalismedia.com
+globaltakeoff.net
+globaltrack.com
+globe7.com
+globus-inter.com
+gmads.net
+go-clicks.de
+go-rank.de
+goingplatinum.com
+gold.weborama.fr
+goldstats.com
+google-analytics.com
+googleadservices.com
+googlesyndication.com
+gostats.com
+gp.dejanews.com
+gpr.hu
+grafstat.ro
+grapeshot.co.uk
+greystripe.com
+gtop.ro
+gtop100.com
+harrenmedia.com
+harrenmedianetwork.com
+havamedia.net
+heias.com
+hentaicounter.com
+herbalaffiliateprogram.com
+hexusads.fluent.ltd.uk
+heyos.com
+hgads.com
+hidden.gogoceleb.com
+hightrafficads.com
+histats.com
+hit-parade.com
+hit-ranking.de
+hit.bg
+hit.ua
+hit.webcentre.lycos.co.uk
+hitbox.com
+hitcents.com
+hitexchange.net
+hitfarm.com
+hitiz.com
+hitlist.ru
+hitlounge.com
+hitometer.com
+hits.europuls.eu
+hits.informer.com
+hits.puls.lv
+hits.theguardian.com
+hits4me.com
+hits4pay.com
+hitslink.com
+hittail.com
+hollandbusinessadvertising.nl
+homepageking.de
+hostedads.realitykings.com
+hotkeys.com
+hotlog.ru
+hotrank.com.tw
+htmlhubing.xyz
+httpool.com
+hurricanedigitalmedia.com
+hydramedia.com
+hyperbanner.net
+hypertracker.com
+i-clicks.net
+i.xx.openx.com
+i1img.com
+i1media.no
+ia.iinfo.cz
+iad.anm.co.uk
+iadnet.com
+iasds01.com
+iconadserver.com
+icptrack.com
+idcounter.com
+identads.com
+idot.cz
+idregie.com
+idtargeting.com
+ientrymail.com
+iesnare.com
+ifa.tube8live.com
+ilbanner.com
+ilead.itrack.it
+iliillliO00OO0.321.cn
+ilovecheating.com
+imageads.canoe.ca
+imagecash.net
+images-pw.secureserver.net
+images.v3.com
+imarketservices.com
+img.prohardver.hu
+imgpromo.easyrencontre.com
+imitrk.com
+imonitor.nethost.cz
+imprese.cz
+impressionmedia.cz
+impressionz.co.uk
+imrworldwide.com
+inboxdollars.com
+incentaclick.com
+indexstats.com
+indieclick.com
+industrybrains.com
+inetlog.ru
+infinite-ads.com
+infinityads.com
+infolinks.com
+information.com
+inringtone.com
+insightexpress.com
+insightexpressai.com
+inspectorclick.com
+instantmadness.com
+intelliads.com
+intellitxt.com
+interactive.forthnet.gr
+intergi.com
+internetfuel.com
+interreklame.de
+interstat.hu
+ip.ro
+ip193.cn
+iperceptions.com
+ipro.com
+ireklama.cz
+itfarm.com
+itop.cz
+its-that-easy.com
+itsptp.com
+jcount.com
+jinkads.de
+joetec.net
+jokedollars.com
+js.users.51.la
+juicyads.com
+jumptap.com
+justrelevant.com
+justwebads.com
+k.iinfo.cz
+kanoodle.com
+keymedia.hu
+kindads.com
+kissmetrics.com
+kliks.nl
+komoona.com
+kompasads.com
+kontera.com
+kt-g.de
+ktu.sv2.biz
+lakequincy.com
+layer-ad.de
+layer-ads.de
+lbn.ru
+lct.salesforce.com
+lead-analytics.nl
+leadaffiliates.com
+leadboltads.net
+leadclick.com
+leadingedgecash.com
+leadzupc.com
+leanoisgo.com
+levelrate.de
+lfstmedia.com
+liftdna.com
+ligatus.com
+ligatus.de
+lightningcast.net
+lightspeedcash.com
+link-booster.de
+link4ads.com
+linkadd.de
+linkbuddies.com
+linkexchange.com
+linkexchange.ru
+linkprice.com
+linkrain.com
+linkreferral.com
+links-ranking.de
+linkshighway.com
+linkshighway.net
+linkstorms.com
+linkswaper.com
+linktarget.com
+liquidad.narrowcastmedia.com
+liveintent.com
+liverail.com
+loading321.com
+log.btopenworld.com
+logua.com
+lop.com
+lucidmedia.com
+lzjl.com
+m.webtrends.com
+m1.webstats4u.com
+m4n.nl
+madclient.uimserv.net
+madisonavenue.com
+mads.cnet.com
+madvertise.de
+marchex.com
+market-buster.com
+marketing.888.com
+marketing.hearstmagazines.nl
+marketing.nyi.net
+marketing.osijek031.com
+marketingsolutions.yahoo.com
+maroonspider.com
+mas.sector.sk
+mastermind.com
+matchcraft.com
+mathtag.com
+max.i12.de
+maximumcash.com
+mbn.com.ua
+mbs.megaroticlive.com
+mbuyu.nl
+mdotm.com
+measuremap.com
+media-adrunner.mycomputer.com
+media-servers.net
+media.ftv-publicite.fr
+media.funpic.de
+media6degrees.com
+mediaarea.eu
+mediacharger.com
+mediadvertising.ro
+mediageneral.com
+mediamath.com
+mediamgr.ugo.com
+mediaplazza.com
+mediaplex.com
+mediascale.de
+mediatext.com
+mediax.angloinfo.com
+mediaz.angloinfo.com
+medleyads.com
+medyanetads.com
+megacash.de
+megago.com
+megastats.com
+megawerbung.de
+memorix.sdv.fr
+metaffiliation.com
+metanetwork.com
+methodcash.com
+metrics.windowsitpro.com
+mgid.com
+miarroba.com
+microstatic.pl
+microticker.com
+midnightclicking.com
+misstrends.com
+mixpanel.com
+mixtraffic.com
+mlm.de
+mmismm.com
+mmtro.com
+moatads.com
+mobclix.com
+mocean.mobi
+moneyexpert.com
+monsterpops.com
+mopub.com
+mouseflow.com
+mpstat.us
+mr-rank.de
+mrskincash.com
+mtree.com
+musiccounter.ru
+muwmedia.com
+myaffiliateprogram.com
+mybloglog.com
+mycounter.ua
+mypagerank.net
+mypagerank.ru
+mypowermall.com
+mystat-in.net
+mystat.pl
+mytop-in.net
+n69.com
+naiadsystems.com
+naj.sk
+namimedia.com
+nastydollars.com
+navigator.io
+navrcholu.cz
+nbjmp.com
+ndparking.com
+nedstat.com
+nedstat.nl
+nedstatbasic.net
+nedstatpro.net
+nend.net
+neocounter.neoworx-blog-tools.net
+neoffic.com
+net-filter.com
+netaffiliation.com
+netagent.cz
+netclickstats.com
+netcommunities.com
+netdirect.nl
+netflame.cc
+netincap.com
+netpool.netbookia.net
+netshelter.net
+network.business.com
+neudesicmediagroup.com
+newads.bangbros.com
+newbie.com
+newnet.qsrch.com
+newnudecash.com
+newopenx.detik.com
+newt1.adultadworld.com
+newt1.adultworld.com
+newtopsites.com
+ng3.ads.warnerbros.com
+ngs.impress.co.jp
+nitroclicks.com
+novem.pl
+nuggad.net
+numax.nu-1.com
+nuseek.com
+oas.benchmark.fr
+oas.foxnews.com
+oas.repubblica.it
+oas.roanoke.com
+oas.salon.com
+oas.toronto.com
+oas.uniontrib.com
+oas.villagevoice.com
+oascentral.businessweek.com
+oascentral.chicagobusiness.com
+oascentral.fortunecity.com
+oascentral.register.com
+oewa.at
+oewabox.at
+offerforge.com
+offermatica.com
+olivebrandresponse.com
+omniture.com
+onclasrv.com
+onclickads.net
+oneandonlynetwork.com
+onenetworkdirect.com
+onestat.com
+onestatfree.com
+onewaylinkexchange.net
+online-metrix.net
+onlinecash.com
+onlinecashmethod.com
+onlinerewardcenter.com
+openad.tf1.fr
+openad.travelnow.com
+openads.friendfinder.com
+openads.org
+openclick.com
+openx.angelsgroup.org.uk
+openx.blindferret.com
+opienetwork.com
+optimost.com
+optmd.com
+ordingly.com
+ota.cartrawler.com
+otto-images.developershed.com
+outbrain.com
+overture.com
+owebmoney.ru
+oxado.com
+oxcash.com
+oxen.hillcountrytexas.com
+p.adpdx.com
+pagead.l.google.com
+pagefair.com
+pagerank-estate-spb.ru
+pagerank-ranking.com
+pagerank-ranking.de
+pagerank-server7.de
+pagerank-submitter.com
+pagerank-submitter.de
+pagerank-suchmaschine.de
+pagerank-united.de
+pagerank4u.eu
+pagerank4you.com
+pageranktop.com
+partage-facile.com
+partner-ads.com
+partner.pelikan.cz
+partner.topcities.com
+partnerad.l.google.com
+partnercash.de
+partners.priceline.com
+passion-4.net
+pay-ads.com
+paycounter.com
+paypopup.com
+payserve.com
+pbnet.ru
+pcash.imlive.com
+peep-auktion.de
+peer39.com
+pennyweb.com
+pepperjamnetwork.com
+percentmobile.com
+perf.weborama.fr
+perfectaudience.com
+perfiliate.com
+performancerevenue.com
+performancerevenues.com
+performancing.com
+pgmediaserve.com
+pgpartner.com
+pheedo.com
+phoenix-adrunner.mycomputer.com
+phpadsnew.new.natuurpark.nl
+phpmyvisites.net
+picadmedia.com
+pillscash.com
+pimproll.com
+pixel.adsafeprotected.com
+pixel.jumptap.com
+planetactive.com
+play4traffic.com
+playhaven.com
+plista.com
+plugrush.com
+pointroll.com
+pop-under.ru
+popads.net
+popub.com
+popunder.ru
+popup.msn.com
+popupmoney.com
+popupnation.com
+popups.infostart.com
+popuptraffic.com
+porngraph.com
+porntrack.com
+postrelease.com
+potenza.cz
+pr-star.de
+pr-ten.de
+pr5dir.com
+praddpro.de
+prchecker.info
+precisioncounter.com
+predictad.com
+premium-offers.com
+primaryads.com
+primetime.net
+privatecash.com
+pro-advertising.com
+pro.i-doctor.co.kr
+proext.com
+profero.com
+projectwonderful.com
+promo.badoink.com
+promo.ulust.com
+promo1.webcams.nl
+promobenef.com
+promos.fling.com
+promote.pair.com
+promotion-campaigns.com
+pronetadvertising.com
+propellerads.com
+proranktracker.com
+proton-tm.com
+protraffic.com
+provexia.com
+prsitecheck.com
+psstt.com
+pub.chez.com
+pub.club-internet.fr
+pub.hardware.fr
+pub.realmedia.fr
+pubdirecte.com
+publicidad.elmundo.es
+pubmatic.com
+pubs.lemonde.fr
+pulse360.com
+q.azcentral.com
+qctop.com
+qnsr.com
+quantcast.com
+quantserve.com
+quarterserver.de
+questaffiliates.net
+quigo.com
+quinst.com
+quisma.com
+rad.msn.com
+radar.cedexis.com
+radarurl.com
+radiate.com
+rampidads.com
+rank-master.com
+rank-master.de
+rankchamp.de
+ranking-charts.de
+ranking-hits.de
+ranking-id.de
+ranking-links.de
+ranking-liste.de
+ranking-street.de
+rankingchart.de
+rankingscout.com
+rankyou.com
+rapidcounter.com
+rate.ru
+ratings.lycos.com
+rb1.design.ru
+re-directme.com
+reachjunction.com
+reactx.com
+readserver.net
+realcastmedia.com
+realclix.com
+realmedia-a800.d4p.net
+realtechnetwork.com
+realtracker.com
+reduxmedia.com
+reduxmediagroup.com
+reedbusiness.com
+reefaquarium.biz
+referralware.com
+regnow.com
+reinvigorate.net
+reklam.rfsl.se
+reklama.mironet.cz
+reklama.reflektor.cz
+reklamcsere.hu
+reklame.unwired-i.net
+reklamer.com.ua
+relevanz10.de
+relmaxtop.com
+remotead.cnet.com
+republika.onet.pl
+retargeter.com
+revenue.net
+revenuedirect.com
+revsci.net
+revstats.com
+richmails.com
+richmedia.yimg.com
+richwebmaster.com
+rightstats.com
+rlcdn.com
+rle.ru
+rmads.msn.com
+rmedia.boston.com
+roar.com
+robotreplay.com
+roia.biz
+rok.com.com
+rose.ixbt.com
+rotabanner.com
+roxr.net
+rtbpop.com
+rtbpopd.com
+ru-traffic.com
+ru4.com
+rubiconproject.com
+s.adroll.com
+s2d6.com
+sageanalyst.net
+sbx.pagesjaunes.fr
+scambiobanner.aruba.it
+scanscout.com
+scopelight.com
+scorecardresearch.com
+scratch2cash.com
+scripte-monster.de
+searchfeast.com
+searchmarketing.com
+searchramp.com
+secure.webconnect.net
+sedoparking.com
+sedotracker.com
+seeq.com.invalid
+sensismediasmart.com.au
+seo4india.com
+serv0.com
+servedbyadbutler.com
+servedbyopenx.com
+servethis.com
+services.hearstmags.com
+serving-sys.com
+sexaddpro.de
+sexadvertentiesite.nl
+sexcounter.com
+sexinyourcity.com
+sexlist.com
+sextracker.com
+sexystat.com
+sezwho.com
+shareadspace.com
+shareasale.com
+sharepointads.com
+sher.index.hu
+shinystat.com
+shinystat.it
+shoppingads.com
+siccash.com
+sidebar.angelfire.com
+sinoa.com
+sitebrand.geeks.com
+sitemerkezi.net
+sitemeter.com
+sitestat.com
+sixsigmatraffic.com
+skylink.vn
+slickaffiliate.com
+slopeaota.com
+sma.punto.net
+smart4ads.com
+smartadserver.com
+smartbase.cdnservices.com
+smowtion.com
+snapads.com
+snoobi.com
+socialspark.com
+softclick.com.br
+spacash.com
+sparkstudios.com
+specificmedia.co.uk
+specificpop.com
+spezialreporte.de
+spinbox.techtracker.com
+spinbox.versiontracker.com
+sponsorads.de
+sponsorpro.de
+sponsors.thoughtsmedia.com
+spot.fitness.com
+spotxchange.com
+sprinks-clicks.about.com
+spylog.com
+spywarelabs.com
+spywarenuker.com
+spywords.com
+srbijacafe.org
+srwww1.com
+starffa.com
+start.freeze.com
+stat.cliche.se
+stat.dealtime.com
+stat.dyna.ultraweb.hu
+stat.pl
+stat.su
+stat.tudou.com
+stat.webmedia.pl
+stat.zenon.net
+stat24.com
+stat24.meta.ua
+statcounter.com
+static.fmpub.net
+static.itrack.it
+staticads.btopenworld.com
+statistik-gallup.net
+statm.the-adult-company.com
+stats.blogger.com
+stats.cts-bv.nl
+stats.directnic.com
+stats.hyperinzerce.cz
+stats.mirrorfootball.co.uk
+stats.olark.com
+stats.suite101.com
+stats.surfaid.ihost.com
+stats.townnews.com
+stats.unwired-i.net
+stats.wordpress.com
+stats.x14.eu
+stats4all.com
+statsie.com
+statxpress.com
+steelhouse.com
+steelhousemedia.com
+stickyadstv.com
+suavalds.com
+subscribe.hearstmags.com
+sugoicounter.com
+superclix.de
+superstats.com
+supertop.ru
+supertop100.com
+suptullog.com
+surfmusik-adserver.de
+swissadsolutions.com
+swordfishdc.com
+sx.trhnt.com
+t.insigit.com
+t.pusk.ru
+taboola.com
+tacoda.net
+tagular.com
+tailsweep.co.uk
+tailsweep.com
+tailsweep.se
+takru.com
+tangerinenet.biz
+tapad.com
+targad.de
+targetingnow.com
+targetnet.com
+targetpoint.com
+tatsumi-sys.jp
+tcads.net
+techclicks.net
+teenrevenue.com
+teliad.de
+text-link-ads.com
+textad.sexsearch.com
+textads.biz
+textads.opera.com
+textlinks.com
+tfag.de
+theadhost.com
+theads.me
+thebugs.ws
+thecounter.com
+therapistla.com
+therichkids.com
+thrnt.com
+thruport.com
+tinybar.com
+tizers.net
+tlvmedia.com
+tntclix.co.uk
+top-casting-termine.de
+top-site-list.com
+top.list.ru
+top.mail.ru
+top.proext.com
+top100-images.rambler.ru
+top100.mafia.ru
+top123.ro
+top20.com
+top20free.com
+top90.ro
+topbarh.box.sk
+topblogarea.se
+topbucks.com
+topforall.com
+topgamesites.net
+toplist.cz
+toplist.pornhost.com
+toplista.mw.hu
+toplistcity.com
+topmmorpgsites.com
+topping.com.ua
+toprebates.com
+topsafelist.net
+topsearcher.com
+topsir.com
+topsite.lv
+topsites.com.br
+topstats.com
+totemcash.com
+touchclarity.com
+touchclarity.natwest.com
+tour.brazzers.com
+tpnads.com
+track.adform.net
+track.anchorfree.com
+track.gawker.com
+trackalyzer.com
+tracker.icerocket.com
+tracker.marinsm.com
+tracking.crunchiemedia.com
+tracking.gajmp.com
+tracking.internetstores.de
+tracking.yourfilehost.com
+tracking101.com
+trackingsoft.com
+trackmysales.com
+tradeadexchange.com
+tradedoubler.com
+traffic-exchange.com
+traffic.liveuniversenetwork.com
+trafficadept.com
+trafficcdn.liveuniversenetwork.com
+trafficfactory.biz
+trafficholder.com
+traffichunt.com
+trafficjunky.net
+trafficleader.com
+trafficsecrets.com
+trafficspaces.net
+trafficstrategies.com
+trafficswarm.com
+traffictrader.net
+trafficz.com
+trafficz.net
+traffiq.com
+trafic.ro
+travis.bosscasinos.com
+trekblue.com
+trekdata.com
+trendcounter.com
+trhunt.com
+tribalfusion.com
+trix.net
+truehits.net
+truehits1.gits.net.th
+truehits2.gits.net.th
+tsms-ad.tsms.com
+tubedspots.com
+tubemogul.com
+turn.com
+tvas-a.pw
+tvas-c.pw
+tvmtracker.com
+twittad.com
+tyroo.com
+uarating.com
+ukbanners.com
+ultramercial.com
+ultsearch.com
+unanimis.co.uk
+untd.com
+updated.com
+urlcash.net
+us.a1.yimg.com
+usapromotravel.com
+usmsad.tom.com
+utarget.co.uk
+utils.mediageneral.net
+v1.cnzz.com
+validclick.com
+valuead.com
+valueclick.com
+valueclickmedia.com
+valuecommerce.com
+valuesponsor.com
+veille-referencement.com
+ventivmedia.com
+vericlick.com
+vertadnet.com
+veruta.com
+vervewireless.com
+vibrantmedia.com
+video-stats.video.google.com
+videoegg.com
+view4cash.de
+viewpoint.com
+visistat.com
+visit.webhosting.yahoo.com
+visitbox.de
+visual-pagerank.fr
+visualrevenue.com
+voicefive.com
+vpon.com
+vrs.cz
+vs.tucows.com
+vungle.com
+wads.webteh.com
+warlog.info
+warlog.ru
+wdads.sx.atl.publicus.com
+web-stat.com
+web.informer.com
+web2.deja.com
+webads.co.nz
+webads.nl
+webangel.ru
+webcash.nl
+webcounter.cz
+webcounter.goweb.de
+webgains.com
+webmaster-partnerprogramme24.de
+webmasterplan.com
+webmasterplan.de
+weborama.fr
+webpower.com
+webreseau.com
+webseoanalytics.com
+websponsors.com
+webstat.channel4.com
+webstat.com
+webstat.net
+webstats4u.com
+webtrackerplus.com
+webtraffic.se
+webtraxx.de
+webtrendslive.com
+wegcash.com
+werbung.meteoxpress.com
+wetrack.it
+whaleads.com
+whenu.com
+whispa.com
+whoisonline.net
+wholesaletraffic.info
+widespace.com
+widgetbucks.com
+wikia-ads.wikia.com
+window.nixnet.cz
+wintricksbanner.googlepages.com
+witch-counter.de
+wlmarketing.com
+wmirk.ru
+wonderlandads.com
+wondoads.de
+woopra.com
+worldwide-cash.net
+wtlive.com
+www-banner.chat.ru
+www-google-analytics.l.google.com
+www.banner-link.com.br
+www.dnps.com
+www.kaplanindex.com
+www.money4exit.de
+www.photo-ads.co.uk
+www1.gto-media.com
+www8.glam.com
+x-traceur.com
+x6.yakiuchi.com
+xchange.ro
+xclicks.net
+xertive.com
+xg4ken.com
+xiti.com
+xplusone.com
+xponsor.com
+xq1.net
+xrea.com
+xtendmedia.com
+xtremetop100.com
+xxxcounter.com
+xxxmyself.com
+y.ibsys.com
+yab-adimages.s3.amazonaws.com
+yabuka.com
+yadro.ru
+yesads.com
+yesadvertising.com
+yieldads.com
+yieldlab.net
+yieldmanager.com
+yieldmanager.net
+yieldtraffic.com
+yoc.mobi
+yoggrt.com
+z5x.net
+zangocash.com
+zanox-affiliate.de
+zanox.com
+zantracker.com
+zedo.com
+zencudo.co.uk
+zenkreka.com
+zenzuu.com
+zeus.developershed.com
+zeusclicks.com
+zintext.com
+zmedia.com \ No newline at end of file
diff --git a/app/src/web/assets/typings/frost.d.ts b/app/src/web/assets/typings/frost.d.ts
new file mode 100644
index 00000000..a3591f66
--- /dev/null
+++ b/app/src/web/assets/typings/frost.d.ts
@@ -0,0 +1,27 @@
+declare interface FrostJSI {
+ loadUrl(url: string | null): boolean
+
+ loadVideo(url: string | null, isGif: boolean): boolean
+
+ reloadBaseUrl(animate: boolean)
+
+ contextMenu(url: string, text: string | null)
+
+ longClick(start: boolean)
+
+ disableSwipeRefresh(disable: boolean)
+
+ loadLogin()
+
+ loadImage(imageUrl: string, text: string | null)
+
+ emit(flag: number)
+
+ isReady()
+
+ handleHtml(html: string | null)
+
+ handleHeader(html: string | null)
+}
+
+declare var Frost: FrostJSI;
diff --git a/app/src/web/package.json b/app/src/web/package.json
new file mode 100644
index 00000000..c80696b3
--- /dev/null
+++ b/app/src/web/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "typescript": "^3.3.1"
+ }
+}
diff --git a/app/src/web/tsconfig.json b/app/src/web/tsconfig.json
new file mode 100644
index 00000000..711fdcbb
--- /dev/null
+++ b/app/src/web/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "es3",
+ "allowJs": true,
+ "skipLibCheck": true,
+// "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+// "resolveJsonModule": true,
+ "isolatedModules": false,
+// "noEmit": true,
+ // Extras
+ "strictNullChecks": true,
+ "noImplicitAny": true,
+ "allowUnreachableCode": true,
+ "allowUnusedLabels": true
+ },
+ "include": [
+ "assets/js", "assets/typings"
+ ]
+}