From b845c829f6eab054b4f6ddd4eff7a803e071b409 Mon Sep 17 00:00:00 2001
From: Cotes Chung <11371340+cotes2020@users.noreply.github.com>
Date: Mon, 30 Sep 2019 20:38:41 +0800
Subject: [PATCH] Import the framework.
---
404.html | 24 +
Gemfile | 13 +
LICENSE | 21 +
_config.yml | 166 ++
_data/label.yml | 17 +
_includes/date-format.html | 8 +
_includes/disqus.html | 24 +
_includes/favicons.html | 34 +
_includes/fixlinenos.html | 9 +
_includes/footer.html | 24 +
_includes/google-analytics.html | 14 +
_includes/head.html | 53 +
_includes/panel.html | 72 +
_includes/search-results.html | 15 +
_includes/search.html | 13 +
_includes/sidebar.html | 65 +
_includes/topbar.html | 49 +
_layouts/category.html | 26 +
_layouts/compress.html | 10 +
_layouts/default.html | 44 +
_layouts/home.html | 128 ++
_layouts/page.html | 29 +
_layouts/post.html | 117 ++
_layouts/tag.html | 25 +
_scripts/py/init_all.py | 16 +
_scripts/py/pages_generator.py | 190 +++
_scripts/py/update_posts_lastmod.py | 121 ++
_scripts/py/utils/common.py | 43 +
assets/css/_src/fonts.scss | 312 ++++
assets/css/_src/main.scss | 1518 +++++++++++++++++
assets/css/_src/syntax.scss | 157 ++
assets/css/styles.scss | 9 +
assets/data/proxy.json | 1 +
assets/img/favicons/android-icon-144x144.png | Bin 0 -> 15762 bytes
assets/img/favicons/android-icon-192x192.png | Bin 0 -> 21277 bytes
assets/img/favicons/android-icon-36x36.png | Bin 0 -> 2928 bytes
assets/img/favicons/android-icon-48x48.png | Bin 0 -> 3978 bytes
assets/img/favicons/android-icon-72x72.png | Bin 0 -> 6302 bytes
assets/img/favicons/android-icon-96x96.png | Bin 0 -> 9203 bytes
assets/img/favicons/apple-icon-114x114.png | Bin 0 -> 11500 bytes
assets/img/favicons/apple-icon-120x120.png | Bin 0 -> 12426 bytes
assets/img/favicons/apple-icon-144x144.png | Bin 0 -> 15762 bytes
assets/img/favicons/apple-icon-152x152.png | Bin 0 -> 17139 bytes
assets/img/favicons/apple-icon-180x180.png | Bin 0 -> 21529 bytes
assets/img/favicons/apple-icon-57x57.png | Bin 0 -> 4797 bytes
assets/img/favicons/apple-icon-60x60.png | Bin 0 -> 5002 bytes
assets/img/favicons/apple-icon-72x72.png | Bin 0 -> 6302 bytes
assets/img/favicons/apple-icon-76x76.png | Bin 0 -> 6833 bytes
.../img/favicons/apple-icon-precomposed.png | Bin 0 -> 21851 bytes
assets/img/favicons/apple-icon.png | Bin 0 -> 21851 bytes
assets/img/favicons/browserconfig.xml | 17 +
assets/img/favicons/favicon-16x16.png | Bin 0 -> 1545 bytes
assets/img/favicons/favicon-32x32.png | Bin 0 -> 2515 bytes
assets/img/favicons/favicon-96x96.png | Bin 0 -> 9203 bytes
assets/img/favicons/favicon.ico | Bin 0 -> 1150 bytes
assets/img/favicons/manifest.json | 48 +
assets/img/favicons/ms-icon-144x144.png | Bin 0 -> 15762 bytes
assets/img/favicons/ms-icon-150x150.png | Bin 0 -> 16765 bytes
assets/img/favicons/ms-icon-310x310.png | Bin 0 -> 46986 bytes
assets/img/favicons/ms-icon-70x70.png | Bin 0 -> 6105 bytes
assets/img/sample/devices-mockup.png | Bin 0 -> 227162 bytes
assets/img/sample/download-icons.png | Bin 0 -> 9832 bytes
assets/img/sample/mockup.png | Bin 0 -> 32004 bytes
assets/img/sample/profile.jpg | Bin 0 -> 18126 bytes
assets/img/sample/upload-image.png | Bin 0 -> 35990 bytes
assets/js/_src/_commons/back-to-top.js | 18 +
assets/js/_src/_commons/search-display.js | 88 +
assets/js/_src/_commons/sidebar.js | 54 +
assets/js/_src/_commons/tooltip.js | 8 +
assets/js/_src/_commons/topbar-switch.js | 64 +
assets/js/_src/_commons/topbar-title.js | 44 +
assets/js/_src/category-collapse.js | 31 +
assets/js/_src/pageviews.js | 111 ++
assets/js/_src/timeago.js | 77 +
assets/js/dist/_commons/back-to-top.min.js | 1 +
assets/js/dist/_commons/search-display.min.js | 1 +
assets/js/dist/_commons/sidebar.min.js | 1 +
assets/js/dist/_commons/tooltip.min.js | 1 +
assets/js/dist/_commons/topbar-switch.min.js | 1 +
assets/js/dist/_commons/topbar-title.min.js | 1 +
assets/js/dist/category-collapse.min.js | 1 +
assets/js/dist/commons.js | 12 +
assets/js/dist/countUp.min.js | 1 +
assets/js/dist/pageviews.min.js | 1 +
assets/js/dist/timeago.min.js | 1 +
.../bootstrap-toc-1.0.1/bootstrap-toc.min.css | 4 +
.../bootstrap-toc-1.0.1/bootstrap-toc.min.js | 5 +
assets/lib/jquery-3.4.1.min.js | 2 +
assets/lib/jquery.disqusloader.min.js | 8 +
assets/lib/simple-jekyll-search-1.7.1.min.js | 6 +
build.sh | 106 ++
feed.xml | 58 +
index.html | 11 +
init.sh | 56 +
pv.sh | 21 +
robots.txt | 13 +
run.sh | 106 ++
search.json | 14 +
sitemap.xml | 77 +
tabs/about.md | 35 +
tabs/archives.md | 60 +
tabs/categories.md | 82 +
tabs/tags.md | 27 +
103 files changed, 4640 insertions(+)
create mode 100644 404.html
create mode 100644 Gemfile
create mode 100644 LICENSE
create mode 100644 _config.yml
create mode 100644 _data/label.yml
create mode 100644 _includes/date-format.html
create mode 100644 _includes/disqus.html
create mode 100644 _includes/favicons.html
create mode 100644 _includes/fixlinenos.html
create mode 100644 _includes/footer.html
create mode 100644 _includes/google-analytics.html
create mode 100644 _includes/head.html
create mode 100644 _includes/panel.html
create mode 100644 _includes/search-results.html
create mode 100644 _includes/search.html
create mode 100644 _includes/sidebar.html
create mode 100644 _includes/topbar.html
create mode 100644 _layouts/category.html
create mode 100644 _layouts/compress.html
create mode 100644 _layouts/default.html
create mode 100644 _layouts/home.html
create mode 100644 _layouts/page.html
create mode 100644 _layouts/post.html
create mode 100644 _layouts/tag.html
create mode 100755 _scripts/py/init_all.py
create mode 100755 _scripts/py/pages_generator.py
create mode 100755 _scripts/py/update_posts_lastmod.py
create mode 100644 _scripts/py/utils/common.py
create mode 100644 assets/css/_src/fonts.scss
create mode 100644 assets/css/_src/main.scss
create mode 100644 assets/css/_src/syntax.scss
create mode 100644 assets/css/styles.scss
create mode 100644 assets/data/proxy.json
create mode 100644 assets/img/favicons/android-icon-144x144.png
create mode 100644 assets/img/favicons/android-icon-192x192.png
create mode 100644 assets/img/favicons/android-icon-36x36.png
create mode 100644 assets/img/favicons/android-icon-48x48.png
create mode 100644 assets/img/favicons/android-icon-72x72.png
create mode 100644 assets/img/favicons/android-icon-96x96.png
create mode 100644 assets/img/favicons/apple-icon-114x114.png
create mode 100644 assets/img/favicons/apple-icon-120x120.png
create mode 100644 assets/img/favicons/apple-icon-144x144.png
create mode 100644 assets/img/favicons/apple-icon-152x152.png
create mode 100644 assets/img/favicons/apple-icon-180x180.png
create mode 100644 assets/img/favicons/apple-icon-57x57.png
create mode 100644 assets/img/favicons/apple-icon-60x60.png
create mode 100644 assets/img/favicons/apple-icon-72x72.png
create mode 100644 assets/img/favicons/apple-icon-76x76.png
create mode 100644 assets/img/favicons/apple-icon-precomposed.png
create mode 100644 assets/img/favicons/apple-icon.png
create mode 100644 assets/img/favicons/browserconfig.xml
create mode 100644 assets/img/favicons/favicon-16x16.png
create mode 100644 assets/img/favicons/favicon-32x32.png
create mode 100644 assets/img/favicons/favicon-96x96.png
create mode 100644 assets/img/favicons/favicon.ico
create mode 100644 assets/img/favicons/manifest.json
create mode 100644 assets/img/favicons/ms-icon-144x144.png
create mode 100644 assets/img/favicons/ms-icon-150x150.png
create mode 100644 assets/img/favicons/ms-icon-310x310.png
create mode 100644 assets/img/favicons/ms-icon-70x70.png
create mode 100644 assets/img/sample/devices-mockup.png
create mode 100644 assets/img/sample/download-icons.png
create mode 100644 assets/img/sample/mockup.png
create mode 100644 assets/img/sample/profile.jpg
create mode 100644 assets/img/sample/upload-image.png
create mode 100644 assets/js/_src/_commons/back-to-top.js
create mode 100644 assets/js/_src/_commons/search-display.js
create mode 100644 assets/js/_src/_commons/sidebar.js
create mode 100644 assets/js/_src/_commons/tooltip.js
create mode 100644 assets/js/_src/_commons/topbar-switch.js
create mode 100644 assets/js/_src/_commons/topbar-title.js
create mode 100644 assets/js/_src/category-collapse.js
create mode 100644 assets/js/_src/pageviews.js
create mode 100644 assets/js/_src/timeago.js
create mode 100644 assets/js/dist/_commons/back-to-top.min.js
create mode 100644 assets/js/dist/_commons/search-display.min.js
create mode 100644 assets/js/dist/_commons/sidebar.min.js
create mode 100644 assets/js/dist/_commons/tooltip.min.js
create mode 100644 assets/js/dist/_commons/topbar-switch.min.js
create mode 100644 assets/js/dist/_commons/topbar-title.min.js
create mode 100644 assets/js/dist/category-collapse.min.js
create mode 100644 assets/js/dist/commons.js
create mode 100644 assets/js/dist/countUp.min.js
create mode 100644 assets/js/dist/pageviews.min.js
create mode 100644 assets/js/dist/timeago.min.js
create mode 100644 assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.css
create mode 100644 assets/lib/bootstrap-toc-1.0.1/bootstrap-toc.min.js
create mode 100644 assets/lib/jquery-3.4.1.min.js
create mode 100644 assets/lib/jquery.disqusloader.min.js
create mode 100644 assets/lib/simple-jekyll-search-1.7.1.min.js
create mode 100755 build.sh
create mode 100644 feed.xml
create mode 100644 index.html
create mode 100755 init.sh
create mode 100755 pv.sh
create mode 100644 robots.txt
create mode 100755 run.sh
create mode 100644 search.json
create mode 100644 sitemap.xml
create mode 100644 tabs/about.md
create mode 100644 tabs/archives.md
create mode 100644 tabs/categories.md
create mode 100644 tabs/tags.md
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..bf20d63
--- /dev/null
+++ b/404.html
@@ -0,0 +1,24 @@
+---
+# The 404 page
+# © 2017-2019 Cotes Chung
+# MIT License
+layout: page
+title: "404: Page not found"
+
+permalink: /404.html
+
+redirect_from: # Same as site.blocklist
+- /norobots/
+- /assets/
+- /tabs/
+- /categories/
+- /tags/
+- /posts/
+
+dynamic_title: true
+---
+
+
+
Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
+
Head back Home to try finding it again, or search for it on the Archives page .
+
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..73267dd
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,13 @@
+source 'https://rubygems.org'
+
+gem 'jekyll', '>=3.8.6'
+
+# Official Plugins
+group :jekyll_plugins do
+ gem 'jekyll-paginate'
+ gem 'jekyll-redirect-from'
+ gem 'jekyll-seo-tag'
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..299d89f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Cotes Chung
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..7c3b7e6
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,166 @@
+# The Site Settings
+# © 2017-2019 Cotes Chung
+# MIT licensed
+
+
+# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
+#--------------------------
+
+title: Chirpy
+
+description: 'A text-based Jekyll theme.'
+
+# Replace with your domain, e.g. "https://username.github.io"
+url: 'https://www.example.com'
+
+author: Chirpy # change to your full name
+
+logo: /assets/img/sample/profile.jpg # Support network resources.
+
+github:
+ username: github_username # change to your github username
+
+twitter:
+ username: twitter_username # change to your twitter username
+
+social:
+ name: Chirpy # change to your full name
+ email: example@doamin.com # change to your email address
+ links:
+ - https://twitter.com/username # change to your twitter homepage
+ - https://github.com/username # change to your github homepage
+ # - https://www.facebook.com/username
+ # - https://www.linkedin.com/in/username
+
+google_site_verification: google_meta_tag_verification # change to your verification string
+
+#--------------------------
+
+# Change to your Google Analytics ID
+google_analytics:
+ id: 'UA-*********-*'
+ # Switch for Google Analytics pageviews. DO NOT enable it unless you know how to deploy the Google Analytics superProxy.
+ pv: false
+
+disqus:
+ shortname: 'disqus' # Change to your Disqus shortname.
+ comments: true # boolean type, the gobal switch of posts' comments.
+
+# The year your website was first run.
+first_run: 2019
+
+# boolean type, gobal switch for ToC in posts.
+toc: true
+
+
+# if your site type is Project Pages site, change below value to '/projectname'
+baseurl: ''
+
+paginate: 10
+
+markdown: kramdown
+
+highlighter: rouge
+
+kramdown:
+ input: GFM
+ syntax_highlighter: rouge
+ syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options
+ css_class: 'highlight'
+ # default_lang: console
+ span:
+ line_numbers: false
+ block:
+ line_numbers: true
+ start_line: 1
+
+permalink: /posts/:title/
+
+defaults:
+ -
+ scope:
+ path: "" # An empty string here means all files in the project
+ type: posts
+ values:
+ layout: post
+ comments: true # Enable comments in posts.
+ toc: true # Display TOC column in posts.
+ location: Post
+ breadcrumb:
+ -
+ label: Posts
+ url: /
+ -
+ scope:
+ path: _drafts
+ values:
+ comments: false
+ -
+ scope:
+ path: tags
+ values:
+ location: Tag
+ breadcrumb:
+ -
+ label: Home
+ url: /
+ -
+ label: Tags
+ url: /tabs/tags/
+ -
+ scope:
+ path: categories
+ values:
+ location: Category
+ breadcrumb:
+ -
+ label: Home
+ url: /
+ -
+ label: Categories
+ url: /tabs/categories/
+ -
+ scope:
+ path: tabs
+ values:
+ layout: page
+ dynamic_title: true # hide title in mobile screens.
+ breadcrumb:
+ -
+ label: Home
+ url: /
+
+timezone: Asia/Shanghai
+
+sass:
+ sass_dir: /assets/css
+ style: compressed
+
+compress_html:
+ clippings: all
+ comments: [""]
+ endings: [html, head, body, dt, dd, rt, rp, optgroup, option, colgroup, caption, thead, tbody, tfoot, tr, td, th]
+ profile: false
+ blanklines: false
+ ignore:
+ envs: []
+
+exclude:
+ - vendor/ # Avoid Jekyll mistakenly read the vender directory in Travis-CI's VM .
+ - Gemfile.lock
+ - Gemfile
+ - run.sh
+ - build.sh
+ - init.sh
+ - pv.sh
+
+sitemap_exclude: # Sitemap will exclude the following items.
+ - /norobots/
+ - /assets/
+ - /tabs/
+ - /categories/
+ - /tags/
+ - /posts/
+ - /404.html
+ - /redirects.json
+ - /search.json
diff --git a/_data/label.yml b/_data/label.yml
new file mode 100644
index 0000000..a53c2d9
--- /dev/null
+++ b/_data/label.yml
@@ -0,0 +1,17 @@
+# The label text of site.
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+
+tabs:
+ - { name: "Home" }
+ - { name: "Categories", path: tabs, url: categories }
+ - { name: "Tags", path: tabs, url: tags }
+ - { name: "Archives", path: tabs, url: archives }
+ - { name: "About", path: tabs, url: about }
+
+panel:
+ lastmod: "Recent Update"
+ trending_tags: "Trending Tags"
+ toc: "Contents"
+
+search_hint: "Search" # text show on search bar
\ No newline at end of file
diff --git a/_includes/date-format.html b/_includes/date-format.html
new file mode 100644
index 0000000..9c83b37
--- /dev/null
+++ b/_includes/date-format.html
@@ -0,0 +1,8 @@
+
+
+{% assign TOOLTIP_DATE = "%a, %b %e, %Y, %l:%M %p %z" %}
+{% assign POST_DATE = "%b %e, %Y" %}
\ No newline at end of file
diff --git a/_includes/disqus.html b/_includes/disqus.html
new file mode 100644
index 0000000..b97c809
--- /dev/null
+++ b/_includes/disqus.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_includes/favicons.html b/_includes/favicons.html
new file mode 100644
index 0000000..e21aece
--- /dev/null
+++ b/_includes/favicons.html
@@ -0,0 +1,34 @@
+
+
+{% capture icon_url %}{{ site.baseurl }}/assets/img/favicons{% endcapture %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/_includes/fixlinenos.html b/_includes/fixlinenos.html
new file mode 100644
index 0000000..2f88865
--- /dev/null
+++ b/_includes/fixlinenos.html
@@ -0,0 +1,9 @@
+
+{% if _content contains '' %}
+ {% assign _content = _content | replace: ' ', '' %}
+{% endif %}
\ No newline at end of file
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000..659f6df
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+ {% assign first = site.first_run | plus: 0 %}
+ {% assign last = 'now' | date: "%Y" | plus: 0 %}
+
+ © {% if last > first %}{{ first }}-{% endif %}{{-last-}}
+ {{ site.social.name }} .
+ Powered by Jekyll & Chirpy , hosted on GitHub Pages .
+
+
+
+
+
diff --git a/_includes/google-analytics.html b/_includes/google-analytics.html
new file mode 100644
index 0000000..983746b
--- /dev/null
+++ b/_includes/google-analytics.html
@@ -0,0 +1,14 @@
+
+
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 0000000..b81ce0b
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,53 @@
+
+
+
+
+ {%- if page.layout == "home" -%}
+ {{- site.title -}}
+ {%- else -%}
+ {{ page.title }} | {{ site.title }}
+ {%- endif -%}
+
+
+
+
+ {% seo title=false %}
+
+ {% include favicons.html %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if jekyll.environment == 'production' %}
+ {% include google-analytics.html %}
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/_includes/panel.html b/_includes/panel.html
new file mode 100644
index 0000000..2550816
--- /dev/null
+++ b/_includes/panel.html
@@ -0,0 +1,72 @@
+
+
+
+
+ {% assign lastmod_list = "" | split: "" %}
+
+ {% for post in site.posts %}
+ {% if post.date >= post.seo.date_modified or post.seo.date_modified == nil %}
+ {% continue %}
+ {% endif%}
+ {% capture item %}
+ {{ post.seo.date_modified }}::{{ post.title }}::{{ post.url }}
+ {% endcapture %}
+ {% assign lastmod_list = lastmod_list | push: item %}
+ {% endfor %}
+
+ {% if lastmod_list.size > 0 %}
+
+
+ {{ site.data.label.panel.lastmod }}
+
+
+ {% assign MAX_SIZE = 5 %}
+ {% assign sum = 0 %}
+ {% assign sorted_posts = lastmod_list | sort | reverse %}
+ {% for post in sorted_posts %}
+ {% assign meta = post | split: "::" %}
+ {{ meta[1] }}
+ {% assign sum = sum | plus: 1 %}
+ {% if sum >= MAX_SIZE %}
+ {% break %}
+ {% endif %}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+
\ No newline at end of file
diff --git a/_includes/search-results.html b/_includes/search-results.html
new file mode 100644
index 0000000..d9a87f6
--- /dev/null
+++ b/_includes/search-results.html
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/_includes/search.html b/_includes/search.html
new file mode 100644
index 0000000..04ee7c3
--- /dev/null
+++ b/_includes/search.html
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/_includes/sidebar.html b/_includes/sidebar.html
new file mode 100644
index 0000000..6d609b1
--- /dev/null
+++ b/_includes/sidebar.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
{{ site.description }}
+
+
+ {% assign page_urls = page.url | split: "/" %}
+
+ {% for item in site.data.label.tabs %}
+ {% assign ref = site.baseurl | append: "/" %}
+
+ {% if item.path %}
+ {% assign ref = ref | append: item.path | append: "/" %}
+ {% if item.url %}
+ {% assign ref = ref | append: item.url | append: "/" %}
+ {% endif %}
+ {% endif %}
+
+
+
+ {{ item.name | upcase }}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% assign email = site.social.email | split: '@' %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_includes/topbar.html b/_includes/topbar.html
new file mode 100644
index 0000000..a730ba4
--- /dev/null
+++ b/_includes/topbar.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ {% for item in page.breadcrumb %}
+ {% if item.url %}
+
+
+ {{ item.label }}
+
+
+ {% else %}
+ {{ item.label }}
+ {% endif %}
+ {% endfor %}
+
+ {% unless page.layout == "home" %}
+ {{ page.title }}
+ {% endunless %}
+
+
+
+
+
+
+ {% if page.location %}
+ {{- page.location -}}
+ {% elsif page.layout == "home" %}
+ {{- site.title -}}
+ {% else %}
+ {{- page.title -}}
+ {% endif %}
+
+
+
+
+
+
+
+
Cancel
+
+
+
\ No newline at end of file
diff --git a/_layouts/category.html b/_layouts/category.html
new file mode 100644
index 0000000..c633a65
--- /dev/null
+++ b/_layouts/category.html
@@ -0,0 +1,26 @@
+---
+layout: page
+# The Category layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+ {{ page.title }}
+ {{ site.categories[page.category] | size }}
+
+
+
+ {% for post in site.categories[page.category] %}
+
+ {{ post.title }}
+
+ {{ post.date | date: POST_DATE }}
+
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/_layouts/compress.html b/_layouts/compress.html
new file mode 100644
index 0000000..bb34487
--- /dev/null
+++ b/_layouts/compress.html
@@ -0,0 +1,10 @@
+---
+# Jekyll layout that compresses HTML
+# v3.1.0
+# http://jch.penibelst.de/
+# © 2014–2015 Anatol Broder
+# MIT License
+---
+
+{% capture _LINE_FEED %}
+{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains " " %}{% endif %}{% unless _pre_before contains " " and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ; ; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} Step Bytes raw {{ content | size }}{% if _profile_endings %} endings {{ _profile_endings }}{% endif %}{% if _profile_startings %} startings {{ _profile_startings }}{% endif %}{% if _profile_comments %} comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %} collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %} clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %}
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 0000000..1cf913e
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,44 @@
+---
+layout: compress
+# Default layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+
+
+
+ {% include head.html %}
+
+
+
+ {% include sidebar.html %}
+
+
+ {% include topbar.html %}
+
+
+
+ {% capture _content %}
+ {{ content }}
+ {% endcapture %}
+
+ {% include fixlinenos.html %}
+ {{ _content }}
+
+
+ {% include footer.html %}
+
+ {% include search-results.html %}
+
+
+
+
+ {% include search.html %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_layouts/home.html b/_layouts/home.html
new file mode 100644
index 0000000..03d7d96
--- /dev/null
+++ b/_layouts/home.html
@@ -0,0 +1,128 @@
+---
+layout: page
+# The Home page layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+ {% for post in paginator.posts %}
+
+
+
+
+ {{ post.content | strip_html | truncate: 200 }}
+
+
+
+
+
+
+
+ {{ post.date | date: POST_DATE }}
+ {{ post.date | date_to_xmlschema }}
+
+
+ {% if site.google_analytics.pv %}
+
+
+
+
+ {% endif %}
+
+
+ {% endfor %}
+
+
+{% if paginator.total_pages > 0 %}
+
+{% endif %}
+
+
+
+{% if site.google_analytics.pv %}
+
+
+{% endif %}
diff --git a/_layouts/page.html b/_layouts/page.html
new file mode 100644
index 0000000..660c96e
--- /dev/null
+++ b/_layouts/page.html
@@ -0,0 +1,29 @@
+---
+layout: default
+# The page layout
+# © 2017-2019 Cotes Chung
+# MIT License
+---
+
+
+
+
+ {% if page.dynamic_title %}
+
+
{{ page.title }}
+
+ {{ content }}
+
+
+ {% else %}
+
+ {{ content }}
+
+ {% endif %}
+
+
+
+
+
+ {% include panel.html %}
+
\ No newline at end of file
diff --git a/_layouts/post.html b/_layouts/post.html
new file mode 100644
index 0000000..83e4230
--- /dev/null
+++ b/_layouts/post.html
@@ -0,0 +1,117 @@
+---
+layout: default
+# The posts' layout
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+
{{ page.title }}
+
+
+
+
+ {{ page.date | date: POST_DATE }}
+ {{ page.date | date_to_xmlschema }}
+
+ {% if page.categories.size > 0 %}on{% endif %}
+ {% for category in page.categories %}
+
{{ category }}
+ {%- unless forloop.last -%}, {%- endunless -%}
+ {% endfor %}
+
+
+ {% if page.seo.date_modified > page.date %}
+
+ Updated
+
+ {{ page.seo.date_modified | date: POST_DATE }}
+ {{ page.seo.date_modified | date_to_xmlschema}}
+
+
+ {% endif %}
+
+ {% if site.google_analytics.pv %}
+
+ views
+
+ {% endif %}
+
+
+
+ {% if page.image %}
+
+ {% endif %}
+ {{ content }}
+
+
+
+
+ {% if page.tags.size > 0 %}
+
+ {% for tag in page.tags %}
+
+ {{- tag -}}
+ {%- if forloop.last != true -%} {%- endif -%}
+ {% endfor %}
+
+ {% endif %}
+
+
+
+
+
+
+
+ {% if site.disqus.comments and page.comments %}
+ {% include disqus.html %}
+ {% else %}
+
+ {% endif %}
+
+
+
+
+
+ {% include panel.html %}
+ {% if site.toc and page.toc %}
+
+
+ {{ site.data.label.panel.toc }}
+
+
+
+
+
+ {% endif %}
+
+
+
+
+{% if site.google_analytics.pv %}
+
+
+{% endif %}
diff --git a/_layouts/tag.html b/_layouts/tag.html
new file mode 100644
index 0000000..45993da
--- /dev/null
+++ b/_layouts/tag.html
@@ -0,0 +1,25 @@
+---
+layout: page
+# The layout for Tag page
+# © 2017-2019 Cotes Chung
+# MIT Licensed
+---
+
+{% include date-format.html %}
+
+
+
+
+ {{ page.title }}
+ {{ site.tags[page.tag] | size }}
+
+
+ {% for post in site.tags[page.tag] %}
+
+ {{ post.title }}
+
+ {{ post.date | date: POST_DATE }}
+
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/_scripts/py/init_all.py b/_scripts/py/init_all.py
new file mode 100755
index 0000000..1fb4544
--- /dev/null
+++ b/_scripts/py/init_all.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Automatic invokes all initial scripts for project.
+© 2018-2019 Cotes Chung
+Licensed under MIT
+"""
+
+import update_posts_lastmod
+import pages_generator
+
+
+update_posts_lastmod
+
+pages_generator
diff --git a/_scripts/py/pages_generator.py b/_scripts/py/pages_generator.py
new file mode 100755
index 0000000..11baacb
--- /dev/null
+++ b/_scripts/py/pages_generator.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Generates HTML pages for Categories and Tags in posts.
+
+Dependencies:
+ - git
+ - ruamel.yaml
+
+© 2018-2019 Cotes Chung
+MIT License
+'''
+
+
+import os
+import glob
+import shutil
+import sys
+import subprocess
+
+from ruamel.yaml import YAML
+from utils.common import get_yaml
+from utils.common import check_py_version
+
+
+DRAFTS_DIR = '_drafts'
+POSTS_DIR = ['_posts']
+
+CATEGORIES_DIR = 'categories'
+CATEGORY_LAYOUT = 'category'
+
+TAG_DIR = 'tags'
+TAG_LAYOUT = 'tag'
+
+LEVEL = 3 # Tree level for current script file.
+
+
+def help():
+ print("Usage: "
+ " python pages_generator.py [Option]\n\n"
+ "Options:\n"
+ " -d, --drafts Enable drafts\n"
+ " -v, --verbose Print verbose logs\n")
+
+
+def get_path(dir):
+ path = os.path.abspath(__file__)
+ count = LEVEL
+ r_index = len(path)
+ while r_index > 0:
+ r_index -= 1
+ if (path[r_index] == '/' or path[r_index] == '\\'):
+ count -= 1
+ if count == 0:
+ return path[:r_index + 1] + dir
+
+
+def get_categories():
+ all_categories = []
+ yaml = YAML()
+
+ for dir in POSTS_DIR:
+ path = get_path(dir)
+ for file in glob.glob(os.path.join(path, '*.md')):
+ meta = yaml.load(get_yaml(file)[0])
+
+ if 'category' in meta:
+ if type(meta['category']) == list:
+ err_msg = (
+ "[Error] File {} 'category' type"
+ " can not be LIST!").format(file)
+ raise Exception(err_msg)
+ else:
+ if meta['category'] not in all_categories:
+ all_categories.append(meta['category'])
+ else:
+ if 'categories' in meta:
+ if type(meta['categories']) == str:
+ error_msg = (
+ "[Error] File {} 'categories' type"
+ " can not be STR!").format(file)
+ raise Exception(error_msg)
+
+ for ctg in meta['categories']:
+ if ctg not in all_categories:
+ all_categories.append(ctg)
+ else:
+ err_msg = (
+ "[Error] File:{} at least "
+ "have one category.").format(file)
+ print(err_msg)
+
+ return all_categories
+
+
+def generate_category_pages(is_verbose):
+ categories = get_categories()
+ path = get_path(CATEGORIES_DIR)
+
+ if os.path.exists(path):
+ shutil.rmtree(path)
+
+ os.makedirs(path)
+
+ for category in categories:
+ new_page = path + '/' + category.replace(' ', '-').lower() + '.html'
+ with open(new_page, 'w+', encoding='utf-8') as html:
+ html.write("---\n")
+ html.write("layout: {}\n".format(CATEGORY_LAYOUT))
+ html.write("title: {}\n".format(category))
+ html.write("category: {}\n".format(category))
+ html.write("---")
+
+ if is_verbose:
+ print("[INFO] Created page: " + new_page)
+
+ change = subprocess.getoutput("git status categories -s")
+ if change:
+ print("[INFO] Succeed! {} category-pages created."
+ .format(len(categories)))
+
+
+def get_all_tags():
+ all_tags = []
+ yaml = YAML()
+
+ for dir in POSTS_DIR:
+ path = get_path(dir)
+ for file in glob.glob(os.path.join(path, '*.md')):
+ meta = yaml.load(get_yaml(file)[0])
+
+ if 'tags' in meta:
+ for tag in meta['tags']:
+ if tag not in all_tags:
+ all_tags.append(tag)
+ else:
+ raise Exception("Didn't find 'tags' in \
+ post '{}' !".format(file))
+
+ return all_tags
+
+
+def generate_tag_pages(is_verbose):
+ all_tags = get_all_tags()
+ tag_path = get_path(TAG_DIR)
+
+ if os.path.exists(tag_path):
+ shutil.rmtree(tag_path)
+
+ os.makedirs(tag_path)
+
+ for tag in all_tags:
+ tag_page = tag_path + '/' + tag.replace(' ', '-').lower() + '.html'
+ with open(tag_page, 'w+', encoding='utf-8') as html:
+ html.write("---\n")
+ html.write("layout: {}\n".format(TAG_LAYOUT))
+ html.write("title: {}\n".format(tag))
+ html.write("tag: {}\n".format(tag))
+ html.write("---")
+
+ if is_verbose:
+ print("[INFO] Created page: " + tag_page)
+
+ change = subprocess.getoutput("git status tags -s")
+ if change:
+ print("[INFO] Succeed! {} tag-pages created.".format(len(all_tags)))
+
+
+def main():
+ check_py_version()
+
+ is_verbose = False
+
+ if len(sys.argv) > 1:
+ for arg in sys.argv:
+ if arg != sys.argv[0]:
+ if arg == '-d' or arg == '--drafts':
+ POSTS_DIR.insert(0, DRAFTS_DIR)
+ elif arg == '-v' or arg == '--verbose':
+ is_verbose = True
+ else:
+ help()
+ return
+
+ generate_category_pages(is_verbose)
+ generate_tag_pages(is_verbose)
+
+
+main()
diff --git a/_scripts/py/update_posts_lastmod.py b/_scripts/py/update_posts_lastmod.py
new file mode 100755
index 0000000..fb5db8b
--- /dev/null
+++ b/_scripts/py/update_posts_lastmod.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Update (or create if not existed) field 'seo.date_modified'
+in posts' Front Matter by their latest git commit date.
+
+Dependencies:
+ - git
+ - ruamel.yaml
+
+© 2018-2019 Cotes Chung
+Licensed under MIT
+"""
+
+import sys
+import glob
+import os
+import subprocess
+import shutil
+
+from ruamel.yaml import YAML
+from utils.common import get_yaml
+from utils.common import check_py_version
+
+
+POSTS_PATH = "_posts"
+
+
+def help():
+ print("Usage: "
+ " python update_posts_lastmod.py [option]\n"
+ "Options:\n"
+ " -v, --verbose Print verbose logs\n")
+
+
+def update_lastmod(verbose):
+ count = 0
+ yaml = YAML()
+
+ for post in glob.glob(os.path.join(POSTS_PATH, "*.md")):
+ git_log_count = subprocess.getoutput(
+ "git log --pretty=%ad \"{}\" | wc -l".format(post))
+
+ if git_log_count == "1":
+ continue
+
+ git_lastmod = subprocess.getoutput(
+ "git log -1 --pretty=%ad --date=iso \"{}\"".format(post))
+
+ if not git_lastmod:
+ continue
+
+ lates_commit = subprocess.check_output(
+ ['git', 'log', '-1', '--pretty=%B', post]).decode('utf-8')
+
+ if "[Automation]" in lates_commit and "Lastmod" in lates_commit:
+ continue
+
+ frontmatter, line_num = get_yaml(post)
+ meta = yaml.load(frontmatter)
+
+ if 'seo' in meta:
+ if ('date_modified' in meta['seo'] and
+ meta['seo']['date_modified'] == git_lastmod):
+ continue
+ else:
+ meta['seo']['date_modified'] = git_lastmod
+ else:
+ meta.insert(line_num, 'seo', dict(date_modified=git_lastmod))
+
+ output = 'new.md'
+ if os.path.isfile(output):
+ os.remove(output)
+
+ with open(output, 'w', encoding='utf-8') as new, \
+ open(post, 'r', encoding='utf-8') as old:
+ new.write("---\n")
+ yaml.dump(meta, new)
+ new.write("---\n")
+ line_num += 2
+
+ lines = old.readlines()
+
+ for line in lines:
+ if line_num > 0:
+ line_num -= 1
+ continue
+ else:
+ new.write(line)
+
+ shutil.move(output, post)
+ count += 1
+
+ if verbose:
+ print("[INFO] update 'lastmod' for:" + post)
+
+ if count > 0:
+ print("[INFO] Success to update lastmod for {} post(s).".format(count))
+
+
+def main():
+ check_py_version()
+
+ verbose = False
+
+ if len(sys.argv) > 1:
+ for arg in sys.argv:
+ if arg == sys.argv[0]:
+ continue
+ else:
+ if arg == '-v' or arg == '--verbose':
+ verbose = True
+ else:
+ help()
+ return
+
+ update_lastmod(verbose)
+
+
+main()
diff --git a/_scripts/py/utils/common.py b/_scripts/py/utils/common.py
new file mode 100644
index 0000000..2b5d701
--- /dev/null
+++ b/_scripts/py/utils/common.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+'''
+Common functions to other scripts.
+
+© 2018-2019 Cotes Chung
+MIT License
+'''
+
+import sys
+
+
+def get_yaml(path):
+ """
+ Return the Yaml block of a post and the linenumbers of it.
+ """
+ end = False
+ yaml = ""
+ num = 0
+
+ with open(path, 'r', encoding='utf-8') as f:
+ for line in f.readlines():
+ if line.strip() == '---':
+ if end:
+ break
+ else:
+ end = True
+ continue
+ else:
+ num += 1
+
+ yaml += line
+
+ return yaml, num
+
+
+def check_py_version():
+ if not sys.version_info.major == 3 and sys.version_info.minor >= 5:
+ print("WARNING: This script requires Python 3.5 or higher, "
+ "however you are using Python {}.{}."
+ .format(sys.version_info.major, sys.version_info.minor))
+ sys.exit(1)
diff --git a/assets/css/_src/fonts.scss b/assets/css/_src/fonts.scss
new file mode 100644
index 0000000..afda8aa
--- /dev/null
+++ b/assets/css/_src/fonts.scss
@@ -0,0 +1,312 @@
+/*
+ * The field 'font-display' is added for Google-fonts.
+ *
+ * See https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700,900|Oswald|Lato
+ *
+ */
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752HT8Ghe4.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752Fj8Ghe4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752Fz8Ghe4.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Oswald Regular'), local('Oswald-Regular'), url(https://fonts.gstatic.com/s/oswald/v16/TK3iWkUHHAIjg752GT8G.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmhduz8A.woff2) format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwkxduz8A.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmxduz8A.woff2) format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwlBduz8A.woff2) format('woff2');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmBduz8A.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmRduz8A.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Source Sans Pro';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: local('Source Sans Pro Black'), local('SourceSansPro-Black'), url(https://fonts.gstatic.com/s/sourcesanspro/v11/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwlxdu.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
\ No newline at end of file
diff --git a/assets/css/_src/main.scss b/assets/css/_src/main.scss
new file mode 100644
index 0000000..ddebfe6
--- /dev/null
+++ b/assets/css/_src/main.scss
@@ -0,0 +1,1518 @@
+
+/*!
+* The main styles.
+* © 2018-2019 Cotes Chung
+* MIT Licensed
+*/
+
+html, body {
+ height: 100%;
+}
+
+/* Solved jumping scrollbar */
+html {
+ overflow-y: scroll;
+}
+
+body {
+ line-height: 1.75rem;
+ background: #fafafa;
+ color: #212529;
+ -webkit-font-smoothing: antialiased;
+ font-family: 'Source Sans Pro', 'Microsoft Yahei', sans-serif;
+}
+
+/*--- sidebar layout ---*/
+
+#sidebar {
+ padding-left: 0;
+ padding-right: 0;
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ overflow-y: auto;
+ width: 260px;
+ background: rgb(35, 37, 46);
+ z-index: 99;
+ transition: transform 0.4s ease;
+ -webkit-transition: transform 0.4s ease;
+}
+
+#sidebar a {
+ color: rgba(255, 255, 255, 0.5);
+ transition: color 0.35s ease-in-out;
+}
+
+#sidebar .nav-item {
+ height: 20%;
+ padding: 0 2rem;
+}
+
+#sidebar .nav-link {
+ border-radius: 0;
+ font-size: .95rem;
+ font-weight: 600;
+ letter-spacing: 1px;
+}
+
+#sidebar .nav-item:hover .nav-link {
+ color: #f8f9facf;
+}
+
+#sidebar .nav-item.active .nav-link {
+ color: #fcfcfc;
+}
+
+#sidebar ul {
+ height: 16.5rem;
+ display: -webkit-box;
+ display: -ms-flexbox;
+}
+
+.cursor {
+ background: #fcfcfc;
+ position: relative;
+ display: none;
+ top: 0;
+ left: 98.5%;
+ width: 3px;
+ height: 10%;
+ -webkit-transition: top 0.5s ease;
+ -moz-transition: top 0.5s ease;
+ transition: top 0.5s ease;
+}
+
+#sidebar ul>li.active:nth-child(1)~.cursor,
+#sidebar ul>li.nav-item:nth-child(1):hover~.cursor {
+ top: -95%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(2)~.cursor,
+#sidebar ul>li.nav-item:nth-child(2):hover~.cursor {
+ top: -75%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(3)~.cursor,
+#sidebar ul>li.nav-item:nth-child(3):hover~.cursor {
+ top: -55%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(4)~.cursor,
+#sidebar ul>li.nav-item:nth-child(4):hover~.cursor {
+ top: -35%;
+ display: block;
+}
+
+#sidebar ul>li.active:nth-child(5)~.cursor,
+#sidebar ul>li.nav-item:nth-child(5):hover~.cursor {
+ top: -15%;
+ display: block;
+}
+
+#nav-wrap {
+ width: 100%;
+ flex-grow: 1;
+}
+
+#profile-wrap {
+ padding-top: 2rem;
+ padding-bottom: 1rem;
+}
+
+#profile {
+ width: 6rem;
+ height: 6rem;
+ border-radius: 50%;
+ border: 2px solid #b6b6b6;
+ overflow: hidden;
+ transform: translateZ(0); /* fixed the zoom in Safari */
+ -webkit-transition: border-color 0.35s ease-in-out;
+ -moz-transition: border-color 0.35s ease-in-out;
+ transition: border-color 0.35s ease-in-out;
+}
+
+#profile:hover {
+ border-color: #fff;
+}
+
+#profile img {
+ width: 100%;
+ height: 100%;
+ display: block;
+ background-size: cover;
+ background-repeat: no-repeat;
+ -webkit-transition: all .5s !important;
+ -moz-transition: all .5s !important;
+ transition: all .5s !important;
+}
+
+#profile img:hover {
+ -ms-transform: scale(1.2);
+ -moz-transform: scale(1.2);
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2);
+}
+
+#site-title a {
+ color: #b6b6b6;
+ font-weight: 900;
+ font-size: 1.5rem;
+ letter-spacing: .5px;
+}
+
+#site-title a:hover {
+ color: #fff;
+ text-decoration: none;
+}
+
+#site-subtitle {
+ font-size: 95%;
+ text-align: center;
+ color: #828282;
+ line-height: 1.2rem;
+ word-spacing: 1px;
+ padding: .6rem 1.5rem 2rem 1.5rem;
+}
+
+.sidebar-expand {
+ box-shadow: 4px 0 8px 0 rgba(0, 0, 0, 0.2), 6px 0 20px 0 rgba(0, 0, 0, 0.19) !important;
+}
+
+#search-result-wrap {
+ display: none;
+ position: fixed;
+ top: 3rem;
+ height: 100%;
+ width: calc(100% - 260px);
+ overflow: auto;
+}
+
+#search-result-wrap>div.row>div {
+ min-height: calc(100vh - 3rem - 2rem);
+}
+
+#search-result-wrap .post-content {
+ margin-top: 2rem;
+}
+
+.contact {
+ font-size: 1.2rem;
+ padding: 2rem 2.5rem;
+ flex-shrink: 0;
+ -webkit-flex-shrink: 0;
+ -ms-flex-shrink: 0;
+ /*box-shadow: inset 0 0 0.25em 0 rgba(0, 0, 0, 0.22);*/
+}
+
+#sidebar .contact a:hover {
+ color: #fff;
+}
+
+/*--- top-bar ---*/
+
+#topbar {
+ height: 3rem;
+ position: fixed;
+ top: 0;
+ left: 260px; /* same as sidebar width */
+ right: 0;
+ transition: top 0.2s ease-in-out;
+ z-index: 1;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.07);
+ box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.05);
+}
+
+#topbar i.fas { // icons
+ color: #999;
+}
+
+#breadcrumb {
+ font-size: 1rem;
+ color: gray;
+ padding-left: 1rem;
+}
+
+#breadcrumb span:not(:last-child)::after {
+ content: "›";
+ padding: 0 .3rem;
+}
+
+#sidebar-trigger,
+#search-trigger {
+ margin: 0 1rem;
+ display: none;
+}
+
+#search-wrap i {
+ position: relative;
+ top: 1rem;
+ left: .5rem;
+ z-index: 2;
+ font-size: .9rem;
+ color: #c2c6cc!important;
+}
+
+#search-input {
+ position: relative;
+ top: -.86rem;
+ background: #f5f5f5;
+ border-color: #e9ecef;
+ border-radius: 0.9rem;
+ padding: .18rem .75rem .18rem 2rem;
+ color: #797878;
+}
+
+#search-input:focus {
+ box-shadow: none;
+ background: center;
+}
+
+#topbar-title {
+ display: none;
+ font-size: 1.1rem;
+ font-weight: 600;
+ font-family: sans-serif;
+ color: rgb(78, 78, 78);
+ text-align: center;
+ width: 70%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: keep-all;
+ white-space: nowrap;
+}
+
+#search-wrap+a {
+ color: #2a408e;
+ display: none;
+}
+
+#mask {
+ display: none;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ background: #c1c3c5;
+ opacity: 0.5;
+ z-index: 1;
+}
+
+.sidebar-expand~#mask {
+ display: block!important;
+}
+
+/*--- main wrap ---*/
+
+#main-wrap {
+ position: relative;
+ min-height: 100%;
+ padding-bottom: 6rem; /* equals to or greatter than footer's height */
+ padding-left: 0;
+ padding-right: 0;
+ margin-left: 260px;
+ transition: transform 0.4s ease;
+ -webkit-transition: transform 0.4s ease;
+}
+
+#main>div.row>div {
+ margin-top: 3rem; /* same as the height of topbar */
+}
+
+#main>div.row>div:first-child {
+ min-height: calc(100vh - 3rem - 6rem); /* 3rem for topbar, 6rem for footer */
+}
+
+#topbar.row,
+#main>.row,
+#search-result-wrap>.row {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+footer {
+ position: absolute;
+ bottom: 0;
+ height: 6rem; /* see the height of #main-wrap */
+ padding: 1rem;
+ font-size: 0.8rem;
+ color: #7a7b7d;
+ background: #f3f3f3;
+}
+
+footer>div.d-flex {
+ line-height: 1.2rem;
+ width: 90%;
+}
+
+footer a:link,
+footer a:hover {
+ text-decoration: none;
+}
+
+footer>.d-flex>div {
+ width: 350px;
+}
+
+footer .copyright a,
+footer .license a {
+ font-weight: 600;
+ color: inherit;
+}
+
+
+/*--- Panels ---*/
+.panel-group {
+ position: -webkit-sticky; /* Safari */
+ position: sticky;
+ top: 2rem;
+ transition: top 0.2s ease-in-out;
+ padding-right: 1.5rem;
+ margin-top: 3rem;
+ margin-bottom: 6rem;
+ color: #6c757d;
+}
+
+.panel-group.topbar-down {
+ top: 6rem;
+}
+
+.panel-group>div {
+ padding-left: 1rem;
+ border-left: 1px solid rgba(158, 158, 158, 0.17);
+}
+
+.panel-group>div:not(:first-child) {
+ margin-top: 4rem;
+}
+
+.panel-group h3 {
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+ margin-top: 0;
+ margin-bottom: 0;
+ letter-spacing: -0.02em;
+ font-size: 1rem;
+ font-family: 'Oswald', sans-serif;
+}
+
+.panel-group .post-content {
+ font-size: .9rem;
+}
+
+#panel-tags>div.post-content>div {
+ max-width: 80%;
+}
+
+#panel-tags .post-tag {
+ display: inline-block;
+ line-height: 1rem;
+ font-size: 0.85rem;
+ background: none;
+ border: 1px solid #ced4da;
+ border-radius: .8rem;
+ padding: .25rem .5rem;
+ margin-bottom: .2rem;
+}
+
+#panel-tags .post-tag:hover {
+ background-color: #2a408e;
+ border-color: #2a408e;
+ color: #fff;
+ transition: none;
+}
+
+#panel-update ul>li {
+ height: 1.8rem;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ list-style: none;
+}
+
+#panel-update ul>li::before {
+ background: #999;
+ width: 4px;
+ height: 4px;
+ border-radius: 50%;
+ display: inline-block;
+ content: "";
+ position: relative;
+ bottom: .2rem;
+ margin-right: .4rem;
+}
+
+#panel-update ul a {
+ color: #6c757d;
+}
+
+/*--- button back-to-top ---*/
+
+#back-to-top {
+ display: none;
+ z-index: 1;
+ cursor: pointer;
+ position: fixed;
+ background: #fff;
+ color: #686868;
+ height: 2.6em;
+ width: 2.7em;
+ border-radius: 50%;
+ border: 1px solid #f1f1f1;
+ transition: 0.2s ease-out;
+ -webkit-transition: 0.2s ease-out;
+}
+
+#back-to-top:hover {
+ transform: translate3d(0, -5px, 0);
+ -webkit-transform: translate3d(0, -5px, 0);
+}
+
+/*--- Typography ---*/
+
+h1 {
+ font-size: 1.8rem;
+ font-weight: 400;
+}
+
+h2 {
+ font-size: 1.35rem;
+ font-weight: 400;
+}
+
+h3 {
+ font-size: 1.25rem;
+}
+
+h4 {
+ font-size: 1.15rem;
+}
+
+h5 {
+ font-size: 1.1rem;
+}
+
+h2, h3, h4 {
+ line-height: 1.2;
+ margin-bottom: 1rem;
+}
+
+blockquote {
+ border-left: 5px solid #eee;
+ padding-left: 1rem;
+ color: #9a9a9a;
+}
+
+.post-content blockquote a {
+ color: #2a408e;
+}
+
+kbd {
+ margin: 0 .3rem;
+}
+
+h2, h3, h4, sup {
+ padding-top: 4rem;
+ margin-top: -2.5rem;
+}
+
+div.footnotes>ol {
+ padding-inline-start: 2rem;
+ margin-top: .5rem;
+}
+
+div.footnotes>ol>li>p {
+ padding-left: .2em;
+}
+
+div.footnotes>ol>li:not(:last-child) {
+ margin-bottom: -.8rem;
+}
+
+div.footnotes>ol>li:target>p {
+ background-color: lightcyan;
+ width: fit-content;
+ -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */
+ transition: background-color 1.5s ease-in-out;
+}
+
+a.footnote {
+ margin: 0 .2em;
+ -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */
+ transition: background-color 1.5s ease-in-out;
+}
+
+sup:target>a.footnote {
+ background-color: lightcyan;
+ padding: 0 2px;
+ outline: thin dotted;
+}
+
+a.reversefootnote {
+ font-size: .6rem;
+ position: absolute;
+ line-height: 1;
+ padding-top: .5em;
+ margin-left: .5em;
+ border-bottom-style: none !important;
+}
+
+.post-content a {
+ color: #2a408e;
+ border-bottom: 1px dotted #c2c6cc;
+}
+
+#search-results a {
+ font-size: 1.1rem;
+ line-height: 2.5rem;
+}
+
+p>a, span>a,
+.post-preview a,
+.categories a,
+#tags a,
+#page-category a,
+#page-tag a,
+#archives a,
+#search-results a {
+ color: #2a408e;
+}
+
+.categories a,
+.panel-group a,
+#archives a,
+#page-tag a,
+#page-category a,
+#search-results a {
+ border-bottom: none;
+}
+
+.post h1 {
+ margin-top: 3rem;
+}
+
+#breadcrumb a:hover,
+#search-results a:hover,
+.post-preview a:hover,
+.post-meta a:hover,
+.post-content a:hover,
+.post a:hover code,
+footer a:hover,
+#post-wrap .post-content a:hover,
+#page .post-content a:hover,
+#panel-update a:hover {
+ color: #d2603a;
+ border-bottom: 1px solid #d2603a;
+ text-decoration: none;
+}
+
+.post em { /* MarkDown italic */
+ padding-right: .2rem;
+}
+
+/*--- Begin of Markdown table style ---*/
+
+div.post-content>table,
+div.post-content li>table {
+ min-width: 40%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ margin-bottom: 1.5rem;
+}
+
+table thead {
+ border-bottom: solid 2px rgba(210, 215, 217, 0.75);
+}
+
+table thead+tbody tr {
+ border-bottom: solid 1px rgba(210, 215, 217, 0.75);
+}
+
+table thead+tbody tr:nth-child(2n + 1) {
+ background-color: #f8f9fa;
+}
+
+table thead th,
+table tbody td {
+ padding: .35rem .8rem;
+ font-size: 95%;
+}
+
+
+/*--- Home page ---*/
+
+#post-list {
+ margin-top: 1rem;
+ padding-right: .5rem;
+}
+
+.pagination {
+ font-size: 1rem;
+}
+
+.pagination a:hover {
+ text-decoration: none;
+}
+
+.post-preview {
+ padding-top: 1.5rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid rgba(158, 158, 158, 0.17);
+}
+
+.post-preview>h1 {
+ font-size: 1.4rem;
+ margin: 0;
+}
+
+.post-preview i.far {
+ /* fontawesome icons */
+ font-size: 86%;
+}
+
+.post-preview .post-content {
+ margin-top: .6rem;
+ margin-bottom: .6rem;
+ color: dimgray;
+}
+
+/* Make preview shorter in Home page*/
+.post-preview .post-content>p {
+ margin: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.page-item .page-link {
+ color: #555555;
+ width: 2.5rem;
+ height: 2.5rem;
+ padding: 0;
+ text-align: center;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ border-radius: 50%;
+ border: 1px solid #f1f1f1;
+ font-family: 'Lato', sans-serif;
+}
+
+.page-item.active .page-link {
+ background-color: #2a408e;
+ box-shadow: 0 0 8px 0 #4b92d2 !important;
+ color: #f8f8f8;
+}
+
+.page-item.disabled .page-link {
+ color: rgba(108, 117, 125, 0.57);
+ border-color: #f1f1f1;
+}
+
+.page-item.disabled {
+ cursor: not-allowed;
+}
+
+.page-item:first-child .page-link,
+.page-item:last-child .page-link {
+ border-radius: 50%;
+}
+
+.page-item:not(:last-child) {
+ margin-right: 0.6rem;
+}
+
+/*--- post ---*/
+
+.post-meta {
+ font-size: 0.85rem;
+ word-spacing: 1px;
+}
+
+.post-meta a {
+ color: #2a408e;
+ border-bottom: 1px dotted #c2c6cc;
+}
+
+.post-meta a:not(:last-child) {
+ margin-right: 2px;
+}
+
+.post-content {
+ line-height: 1.8;
+ font-size: 1rem;
+ margin-top: 2rem;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+
+#post-list .post-meta i:not(:first-child) { // post-meta icons on HOME
+ margin-left: 1.5rem;
+}
+
+.post-tail {
+ margin-top: 4rem;
+ border-bottom: 2px solid #f2f2f2;
+ font-size: 0.85rem;
+}
+
+.post-tag {
+ background: rgba(0, 0, 0, 0.075);
+ border-radius: .34rem;
+ padding: .15rem .4rem;
+ margin: 0 .1rem;
+ color: #818182;
+ line-height: 1.6rem;
+}
+
+.tag:hover,
+.post-tag:hover {
+ background: rgb(222, 226, 230);
+ transition: background 0.35s ease-in-out;
+}
+
+.post-tag:hover {
+ border-bottom: none;
+ text-decoration: none;
+ color: #d2603a;
+}
+
+.post-pager {
+ margin: 1rem 0 2rem;
+}
+
+.post-pager .btn,
+.post-pager .btn.disabled {
+ color: #2a408e;
+ border-color: #2a408e;
+}
+
+.post-pager .btn:hover {
+ background: #2a408e;
+ color: #fff;
+}
+
+.post-pager a.btn.disabled {
+ pointer-events: auto;
+ cursor: not-allowed;
+ background: none;
+ color: gray;
+ border-color: gray;
+}
+
+.post img {
+ margin-top: .5rem;
+ margin-bottom: 1.5rem;
+ max-width: 100%;
+ height: auto;
+ filter: drop-shadow(2px 4px 6px rgba(0,0,0,0.08));
+}
+
+#post-panel .panel-group {
+ position: static;
+}
+
+#toc-wrap {
+ border-left: 1px solid rgba(158, 158, 158, 0.17);
+ position: -webkit-sticky;
+ position: sticky;
+ top: 2rem;
+ transition: top 0.2s ease-in-out;
+}
+
+#toc-wrap.topbar-down {
+ top: 6rem;
+}
+
+#toc-wrap>h3 {
+ font-size: 1rem;
+ font-family: 'Oswald', sans-serif;
+ color: gray;
+}
+
+#toc li>a {
+ padding-top: 0;
+}
+
+/* sharing */
+#sharing a>i{
+ font-size: 1.2em;
+}
+
+#sharing .fab.fa-facebook-square {
+ color: #3b549f;
+}
+
+#sharing .fab.fa-google-plus-g {
+ color: #d42a2a;
+}
+
+/*--- Tab Categories ---*/
+
+.categories {
+ margin-bottom: 2rem;
+}
+
+.categories .card-header {
+ padding-right: 12px;
+}
+
+.categories .card-header>span>i:first-child,
+.categories .list-group-item>i {
+ color: gray;
+}
+
+.categories .list-group-item {
+ border-left: none;
+ border-right: none;
+ padding-left: 2rem;
+}
+
+.categories .collapsing .list-group-item:first-child,
+.categories .collapse .list-group-item:first-child {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.categories i.far,
+.categories i.fas { // fontawesome icons
+ font-size: 86%;
+}
+
+.category-trigger {
+ width: 1.7rem;
+ height: 1.7rem;
+ border-radius: 50%;
+ text-align: center;
+ color: #6c757d!important;
+}
+
+@media (hover: hover) { // only works on desktop
+ .category-trigger:hover {
+ background-color: #e9ecef;
+ }
+}
+
+.category-trigger>i.fas.fa-angle-up {
+ position: relative;
+ bottom: 8%;
+ transition: 300ms ease all;
+}
+
+.disabled {
+ color: rgb(206, 196, 196);
+ pointer-events: auto;
+ cursor: not-allowed;
+}
+
+.hide-border-bottom {
+ border-bottom: none!important;
+}
+
+
+/*--- Tab Tags and Tag-Page ---*/
+
+.tag {
+ border-radius: 0.55em;
+ padding: 4px 8px 5px;
+ margin-right: .8rem;
+ line-height: 3rem;
+ letter-spacing: 0;
+ border: 1px solid #c5c6c7 !important;
+ box-shadow: 0 0 3px 0 #e9ecef;
+}
+
+.tag span {
+ margin-left: 0.6em;
+ font-size: 0.7em;
+ font-family: 'Oswald', sans-serif;
+}
+
+a.tag:hover {
+ text-decoration: none;
+}
+
+/*--- Tab Archives --*/
+
+#archives {
+ letter-spacing: 0.03rem;
+}
+
+#archives li {
+ font-size: 1.1rem;
+ line-height: 3rem;
+}
+
+#archives li:nth-child(odd) {
+ background-color: #fff;
+ background-image: linear-gradient(to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff);
+}
+
+#archives span.lead {
+ font-size: 1.5rem;
+ font-family: 'Oswald', sans-serif;
+ position: relative;
+ left: 5px;
+}
+
+#archives span.lead:not(:first-child) {
+ position: relative;
+ left: 3px;
+}
+
+#archives span.lead:not(:first-child)::after {
+ left: 65px;
+}
+
+#archives span.lead::after { /* Year dot */
+ content: "";
+ display: block;
+ position: relative;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+ width: 10px;
+ height: 10px;
+ top: -26px;
+ left: 63px;
+ border: 2px solid;
+ background-color: #ffffff;
+ border-color: #9e9e9e;
+}
+
+#archives .date {
+ display: inline-block;
+}
+
+#archives .date.month {
+ width: 1.4rem;
+ text-align: center;
+ font-family: 'Oswald', sans-serif;
+ // background: yellowgreen;
+}
+
+#archives .date.day {
+ font-size: 85%;
+ font-family: sans-serif;
+ text-align: center;
+ margin-right: -2px;
+ width: 1.2rem;
+ position: relative;
+ left: -.15rem;
+ // background: aquamarine;
+}
+
+#archives ul>li>div>a {
+/* post title in Archvies */
+ margin-left: 2.5rem;
+ position: relative;
+ top: .1rem;
+}
+
+#archives .date.month~a::before {
+ /* A dot for Month and Day */
+ content: "";
+ display: inline-block;
+ position: relative;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+ width: 6px;
+ height: 6px;
+ float: left;
+ top: 20px;
+ left: 68px;
+ background-color: #9e9e9e;
+}
+
+#archives ul>li::after {
+ /* timeline for date */
+ content: "";
+ height: 39px;
+ top: -19px;
+ left: 72px;
+ display: inline-block;
+ float: left;
+ position: relative;
+ background-color: #ffffff;
+ border: 1px dashed silver;
+}
+
+#archives ul>li:first-child::before {
+ content: "";
+ width: 2px;
+ height: 44px;
+ top: -24px;
+ left: 72px;
+ display: inline-block;
+ float: left;
+ position: relative;
+ background-color: #ffffff;
+ border: 1px dashed silver;
+}
+
+#archives ul:not(:last-child)>li:last-child::after {
+ height: 50px;
+}
+
+#archives ul:last-child>li:last-child::after {
+ display: none;
+}
+
+
+/*--- Page Category and Tag ---*/
+
+#page-category ul>li,
+#page-tag ul>li {
+ line-height: 1.5rem;
+ padding: .6rem 0;
+}
+
+#page-category ul>li::before,
+#page-tag ul>li::before {
+ background: #999;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ display: block;
+ content: "";
+ position: relative;
+ top: .6rem;
+ margin-right: .5rem;
+}
+
+#page-tag ul>li>a,
+#page-category ul>li>a, { /* post's title */
+ font-size: 1.1rem;
+}
+
+#page-category ul>li>span:last-child,
+#page-tag ul>li>span:last-child { /* post's date */
+ white-space: nowrap;
+}
+
+#page-tag h1>i { // tag icon
+ font-size: 1.2rem;
+}
+
+#page-category h1>i {
+ font-size: 1.25rem;
+}
+
+#page-category a:hover,
+#page-tag a:hover,
+#panel-update a:hover {
+ margin-bottom: -1px; // Avoid jumping
+}
+
+.dash {
+ margin: 0 .5rem .6rem .5rem;
+ border-bottom: 2px dotted silver;
+}
+
+
+/* --- Effects classes --- */
+
+.hidden {
+ display: none!important;
+}
+
+.shown {
+ display: block!important;
+}
+
+.no-scroll {
+ position: fixed;
+ width: 100%;
+}
+
+.flex-grow-1 {
+ -ms-flex-positive: 1!important;
+ flex-grow: 1!important;
+}
+
+.btn-box-shadow {
+ box-shadow: 0 0 8px 0 #eaeaea!important;
+}
+
+.topbar-up {
+ top: -3rem !important; /* same as topbar height. */
+}
+
+.flip {
+ -ms-transform: rotate(180deg); /* IE 9 */
+ -webkit-transform: rotate(180deg); /* Safari 3-8 */
+ transform: rotate(180deg);
+}
+
+.no-text-decoration {
+ text-decoration: none;
+}
+
+div.tooltip-inner { /* Overrided BS4 Tooltip */
+ font-size: .7rem;
+ max-width: 220px;
+}
+
+
+/*--- Responsive Design ---*/
+
+@media all and (max-width: 576px) {
+
+ #main>div.row>div:first-child {
+ min-height: calc(100vh - 3rem - 10rem); /* topbar is 3rem and footer is 10rem */
+ }
+
+ #main-wrap {
+ padding-bottom: 10rem; /* footer height */
+ }
+
+ #post-wrap h1 {
+ margin-top: 2.2rem;
+ font-size: 1.55rem;
+ }
+
+ #post-list .post-meta>span i:not(:first-child) {
+ margin-left: 1rem;
+ }
+
+ .post-content {
+ font-size: 1.08rem;
+ }
+
+ /* table text in small screens */
+ div>table, p~table {
+ width: 100%;
+ table-layout: fixed;
+ word-wrap: break-word;
+ }
+
+ #archives {
+ margin-top: -1rem;
+ }
+
+ #archives ul {
+ letter-spacing: 0;
+ }
+
+ #archives li>div {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ #page-tag ul>li>a,
+ #page-category ul>li>a {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ /* footer and #main-wrap expand vertical */
+ footer {
+ height: 10rem;
+ }
+
+ footer>div.d-flex {
+ flex-wrap: wrap;
+ justify-content: left!important;
+ -ms-flex-pack: distribute!important;
+ justify-content: space-around!important;
+ }
+
+}
+
+@media all and (max-width: 768px) {
+ .post img {
+ max-width: calc(100% + 1rem);
+ }
+}
+
+@media all and (min-width: 768px) {
+ .post .post-meta>div:not(:first-child)::before {
+ content: "\2022";
+ color: rgba(158, 158, 158, 0.8);
+ font-weight: bold;
+ padding-left: .5rem;
+ padding-right: .3rem;
+ }
+
+ .post .post-meta.flex-column {
+ -webkit-box-orient: horizontal!important;
+ -webkit-box-direction: normal!important;
+ -ms-flex-direction: row!important;
+ flex-direction: row!important;
+ }
+}
+
+@media all and (min-width: 831px) {
+ /* button 'back-to-Top' position */
+ #back-to-top {
+ bottom: 9.2rem;
+ right: 1.2rem;
+ }
+
+ .topbar-up {
+ box-shadow: none !important;
+ }
+
+ #topbar-title {
+ text-align: left;
+ }
+
+}
+
+/* iPad 9.7" horizontal */
+@media all and (min-width: 992px) and (max-width: 1024px) {
+ #main-wrap .col-lg-11 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 96%;
+ flex: 0 0 96%;
+ max-width: 96%;
+ }
+}
+
+
+@media all and (min-width: 768px) and (max-width: 831px) {
+ .post img {
+ max-width: calc(100% + 2rem);
+ }
+}
+
+
+/* Hide SideBar and TOC */
+@media all and (max-width: 831px) {
+
+ .sidebar-expand {
+ transform: translateX(0) !important;
+ }
+
+ .sidebar-expand~#main-wrap {
+ transform: translateX(260px) !important;
+ }
+
+ #sidebar {
+ transform: translateX(-260px); /* hide */
+ -webkit-transform: translateX(-260px);
+ }
+
+ #sidebar .cursor {
+ -webkit-transition: none;
+ -moz-transition: none;
+ transition: none;
+ }
+
+ #main-wrap {
+ margin-left: 0;
+ }
+
+ #search-result-wrap {
+ width: 100%
+ }
+
+ #page h1.dynamic-title {
+ display: none;
+ }
+
+ #page h1.dynamic-title ~ .post-content {
+ margin-top: 3rem;
+ }
+
+ #breadcrumb,
+ #search-wrap {
+ display: none;
+ }
+
+ #topbar {
+ position: -webkit-sticky;
+ position: sticky;
+ left: 0;
+ }
+
+ .topbar-up {
+ top: 0 !important;
+ }
+
+ #main>div.row>div {
+ margin-top: 0;
+ }
+
+ .post img {
+ position: relative;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ -ms-transform: translateX(-50%);
+ transform: translateX(-50%);
+ }
+
+ #topbar-title,
+ #sidebar-trigger,
+ #search-trigger {
+ display: block;
+ }
+
+ #search-wrap.shown {
+ padding-left: 1rem;
+ }
+
+ #search-wrap.shown~a {
+ padding-right: 1rem;
+ }
+
+ #search-input {
+ margin-left: 0;
+ width: 95%;
+ }
+
+ #search-result-wrap .post-content {
+ letter-spacing: 0;
+ }
+
+ #tags {
+ -webkit-box-pack: center!important;
+ -ms-flex-pack: center!important;
+ justify-content: center!important;
+ }
+
+ sup {
+ padding-top: 3.4rem;
+ }
+
+ div.footnotes>ol>li {
+ padding-top: 3.5rem;
+ margin-top: -4.3rem;
+ }
+
+ div.footnotes>ol>li:first-child {
+ margin-top: -3.5rem;
+ }
+}
+
+/* Compact icons in sidebar & TOC hidden */
+@media all and (min-width: 832px) and (max-width: 1200px) {
+
+ #sidebar {
+ width: 210px;
+ }
+
+ #topbar {
+ left: 210px;
+ }
+
+ #search-result-wrap {
+ width: calc(100% - 210px);
+ }
+
+ #site-title {
+ font-size: 1.3rem;
+ margin-left: 0!important;
+ }
+
+ #site-subtitle {
+ font-size: 90%;
+ padding-left: 1rem;
+ padding-right: 1rem;
+ }
+
+ .contact a {
+ padding: 0 0.6rem;
+ }
+
+ #main-wrap {
+ margin-left: 210px;
+ }
+
+ #breadcrumb {
+ width: 65%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: keep-all;
+ white-space: nowrap;
+ }
+
+}
+
+/* Pannel hidden */
+@media all and (max-width: 1200px) {
+ #post-list {
+ padding-right: 0;
+ }
+
+ #panel-wrap, #post-panel {
+ display: none;
+ }
+
+ .pagination {
+ justify-content: center;
+ }
+
+ #topbar-main {
+ padding: 0;
+ }
+
+ footer>div.d-flex {
+ width: 95%;
+ }
+
+}
+
+
+/*--- Large screens ---*/
+
+@media all and (min-width: 1200px) {
+
+ #main>div.row .col-xl-8 {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ padding-left: 3.5rem;
+ }
+
+ #back-to-top {
+ bottom: 9rem;
+ right: 4.3rem;
+ }
+
+ #search-input {
+ width: 15rem;
+ -webkit-transition: all .3s ease-in-out;
+ transition: all .3s ease-in-out;
+ }
+
+ #search-input:focus {
+ width: 20rem;
+ }
+
+}
+
+@media all and (min-width: 1441px) {
+ #topbar-main {
+ max-width: 73%;
+ }
+
+ #main>div.row .col-xl-8 {
+ max-width: 60%;
+ }
+
+ #main-wrap .col-xl-3 {
+ max-width: 18%;
+ }
+
+ footer>div.d-flex {
+ width: 70%;
+ }
+}
diff --git a/assets/css/_src/syntax.scss b/assets/css/_src/syntax.scss
new file mode 100644
index 0000000..cc1ace6
--- /dev/null
+++ b/assets/css/_src/syntax.scss
@@ -0,0 +1,157 @@
+/*!
+* The syntax highlight.
+* © 2018-2019 Cotes Chung
+* MIT Licensed
+*/
+
+.highlight .hll { background-color: #ffc; }
+.highlight .c { color: #999; } /* Comment */
+.highlight .err { color: #a00; background-color: #faa } /* Error */
+.highlight .k { color: #069; } /* Keyword */
+.highlight .o { color: #555 } /* Operator */
+.highlight .cm { color: #09f; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #099 } /* Comment.Preproc */
+.highlight .c1 { color: #999; } /* Comment.Single */
+.highlight .cs { color: #999; } /* Comment.Special */
+.highlight .gd { background-color: #fcc; border: 1px solid #c00 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #f00 } /* Generic.Error */
+.highlight .gh { color: #030; } /* Generic.Heading */
+.highlight .gi { background-color: #cfc; border: 1px solid #0c0 } /* Generic.Inserted */
+.highlight .go { color: #aaa } /* Generic.Output */
+.highlight .gp { color: #009; } /* Generic.Prompt */
+.highlight .gs { } /* Generic.Strong */
+.highlight .gu { color: #030; } /* Generic.Subheading */
+.highlight .gt { color: #9c6 } /* Generic.Traceback */
+.highlight .kc { color: #069; } /* Keyword.Constant */
+.highlight .kd { color: #069; } /* Keyword.Declaration */
+.highlight .kn { color: #069; } /* Keyword.Namespace */
+.highlight .kp { color: #069 } /* Keyword.Pseudo */
+.highlight .kr { color: #069; } /* Keyword.Reserved */
+.highlight .kt { color: #078; } /* Keyword.Type */
+.highlight .m { color: #f60 } /* Literal.Number */
+.highlight .s { color: #d44950 } /* Literal.String */
+.highlight .na { color: #4f9fcf } /* Name.Attribute */
+.highlight .nb { color: #366 } /* Name.Builtin */
+.highlight .nc { color: #0a8; } /* Name.Class */
+.highlight .no { color: #360 } /* Name.Constant */
+.highlight .nd { color: #99f } /* Name.Decorator */
+.highlight .ni { color: #999; } /* Name.Entity */
+.highlight .ne { color: #c00; } /* Name.Exception */
+.highlight .nf { color: #c0f } /* Name.Function */
+.highlight .nl { color: #99f } /* Name.Label */
+.highlight .nn { color: #0cf; } /* Name.Namespace */
+.highlight .nt { color: #2f6f9f; } /* Name.Tag */
+.highlight .nv { color: #033 } /* Name.Variable */
+.highlight .ow { color: #000; } /* Operator.Word */
+.highlight .w { color: #bbb } /* Text.Whitespace */
+.highlight .mf { color: #f60 } /* Literal.Number.Float */
+.highlight .mh { color: #f60 } /* Literal.Number.Hex */
+.highlight .mi { color: #f60 } /* Literal.Number.Integer */
+.highlight .mo { color: #f60 } /* Literal.Number.Oct */
+.highlight .sb { color: #c30 } /* Literal.String.Backtick */
+.highlight .sc { color: #c30 } /* Literal.String.Char */
+.highlight .sd { color: #c30; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #c30 } /* Literal.String.Double */
+.highlight .se { color: #c30; } /* Literal.String.Escape */
+.highlight .sh { color: #c30 } /* Literal.String.Heredoc */
+.highlight .si { color: #a00 } /* Literal.String.Interpol */
+.highlight .sx { color: #c30 } /* Literal.String.Other */
+.highlight .sr { color: #3aa } /* Literal.String.Regex */
+.highlight .s1 { color: #c30 } /* Literal.String.Single */
+.highlight .ss { color: #fc3 } /* Literal.String.Symbol */
+.highlight .bp { color: #366 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #033 } /* Name.Variable.Class */
+.highlight .vg { color: #033 } /* Name.Variable.Global */
+.highlight .vi { color: #033 } /* Name.Variable.Instance */
+.highlight .il { color: #f60 } /* Literal.Number.Integer.Long */
+
+/*-- Codes Snippet --*/
+
+div.highlight,
+figure.highlight,
+.highlighter-rouge {
+ background: #f7f7f7;
+}
+
+.highlight {
+ overflow: auto;
+ -moz-box-shadow: inset 0 0 2px #e9ecef;
+ -webkit-box-shadow: inset 0 0 2px #e9ecef;
+ box-shadow: inset 0 0 2px #e9ecef;
+}
+
+.highlight .lineno {
+ padding: .8rem .5rem;
+ min-width: 2rem;
+ text-align: right;
+ color: rgba(140, 134, 126, 0.67);
+ background: rgb(234, 236, 242);
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+.highlight table {
+ padding: 0;
+ border: 0;
+}
+
+.highlight td {
+ padding: 0;
+ border: 0;
+}
+
+.highlight pre {
+ margin-bottom: 0;
+ font-size: .85rem;
+ line-height: 1.4rem;
+ word-wrap: normal; /* Fixed Safari overflow-x */
+}
+
+.highlight table td pre {
+ overflow: visible; /* Fixed iOS safari overflow-x */
+ word-break: normal; /* Fixed iOS safari linenos code break */
+}
+
+/* Override BS Inline-code style */
+.highlighter-rouge {
+ color: black;
+ margin-bottom: 1.2em;
+}
+
+code {
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ -moz-hyphens: none;
+ hyphens: none;
+}
+
+code.highlighter-rouge {
+ padding: 2px 4px;
+ margin: 0 .3rem;
+ border-radius: 4px;
+ border: 1px solid #e9ecef;
+}
+
+td.rouge-code {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+/* code snippet radius */
+.highlighter-rouge,
+.highlight {
+ border-radius: 5px;
+}
+
+
+/* Hide line numbers for code snippets without specific language */
+div[class^='highlighter-rouge'] pre.lineno {
+ display: none;
+}
+div[class^='highlighter-rouge'] td.rouge-code {
+ padding: .8rem 1rem;
+}
diff --git a/assets/css/styles.scss b/assets/css/styles.scss
new file mode 100644
index 0000000..354a8b1
--- /dev/null
+++ b/assets/css/styles.scss
@@ -0,0 +1,9 @@
+---
+# Aggregation of CSS files.
+# © 2018-2019 Cotes Chung
+# MIT License
+---
+
+@import "_src/main";
+@import "_src/syntax";
+@import "_src/fonts";
\ No newline at end of file
diff --git a/assets/data/proxy.json b/assets/data/proxy.json
new file mode 100644
index 0000000..d84ebdd
--- /dev/null
+++ b/assets/data/proxy.json
@@ -0,0 +1 @@
+{"proxyUrl":"https://your-gae.appspot.com/query?id=the_secrt_id"}
\ No newline at end of file
diff --git a/assets/img/favicons/android-icon-144x144.png b/assets/img/favicons/android-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..782cf3a9437428c4609ab98f4a6a8e272209e956
GIT binary patch
literal 15762
zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Bd2>4A0#j?ONH@0A#{`m@w;fC{=u~u2IA*3Yp`}H2KYLS)z$ax+
zMs*G$g(tQ?In5v2HXh`TIQB^?`kG$!Z4as5wEMfNt5&YFdf)%*)ytVLB~Q9t>p3PP
z(ZB5XwYSlw`)j`yuj47%ew{H^bZhUQd3FBFy_sWW8A`=2nBMH3*^zTw?(?iwN=g;;
z+8R_kI~FIZ&LRyJ2~qO>zpQ@1l|Jf
z0?7bIivxBK_J@4UyS=SFXyuiZ^`A|>gT)*o-(BXZ;j3U5;JPO~(Jg^Zfcf3_+}qaI
z9ZV)>*iCfrqe1r|0pv+HgyS*5r@qGQ6{{s4_H
z)@LitPR@D5+T%Vg_2vP2W^v}$64Qh1{@N25g4z--mSrYIimiL?_f5CQJMx_{nQaq0>lDML2JMEgB5VQH(ABPL_-fI@$9xXYCEneEay~6xIouv$T|o8@(GprUbLeyL@io
zy}7abqh-+U*SlV>WLQ*S(UbYBKg#8RInO`2h~ppRIQD5+^LKQfxV-Llnp)|@<&ME(
z4(nd8%A92=7|C`fT}M2N@n3N0d?7*c_&H}8!X6ec$r8*Ay?QS|!$ebo%fe60ViV&T
z`ybE##&m_r_rT8sOoEo0O6oeNKb>Ria9Sv^FhC=sUSh`TRnr;kRg~%%t&(Ta6P1LH=v8Lj!d-m}E9eA?S_aL0CLdDd%b@%Pzk
zIDd#f*fUG5XkMlqlh}jenc9t_KMwHi+aM<#eZaa=I%wsUcj5mv|L2)3Wn?)#TZpUm
zM2b<{Dy;<$=i-e{El*nc>Zj7D@E_6znt~*hpqa%IRGtSUj#{0J-xz3#Z_lCXi`Pp(e4eo@~CTBmpKFM#C{`fb9>kVt3
z_{93~tN%qN&S%=s=;CsY+3W9nmJScLAG#m(4=g+x_Rqh4nN352gu+kz))Sxi$UN}5
z{3i73T?f&995cJud*_<^78^{qG-m6|y}csK!$nVgqCRszvsa_?0se;n+;`TkvTl$Q
z^jwuC6Q6FaxUX$4Ltn>`wh9jEpKnTy6x?f+}r#&w$)C}y}k6Nq4JTOz(B!=
z1v3IPQf_U#J0Ui?*g{6{=bh(v<$hIHmaC?k`{mrOo1A;wdXw~?%iG>|D^ENzbH?p0
zxxcw?Z=28EemG8S!R*}IadKR(Jx&ieHDvhue{eb(K9{OE$0_*D>tt!H&S|Gm|1J;1
z4UVDGt|<0>zG*|F+X<&Sx}ANG3)E=alJ&tg!UzGMA&i8jR_3N^BI2H)!*
zB-W%qOu7Foa=GU0i4|%ZGJNcfXBxPVHrhH!&FGvTw2^DY;qQW?t5-29D9P=sUlt#_
zyP>RRuBXeBwLcEtZa(1Oc<|)D>n9gwaxSRZymQm0N&o)+OA^dv3VW=5sl!9^Lwe+b
z8x5*Ti!C>`pHIE?BP?ut2hSsGHO8`)uex8BL@^iJ&h`5o^~fdIPV8HeX8-FM2Y5nb
z)s^zYu6A$!>H0KfzlDDJV&=SQ?(HF8>mDQuR>rwl*_VD^PZSb)nzem
zE`ChsSG_vl7~gqeZ_uVPQcrF+LVD=OUvSS8C0BKJjFV$I_r9j|
zPaA?f=5%s2vWlIV?zdc0MrO(4#m(EcneE!Wo3l%LvqMl#>uVnOV#p>j1CtiN2Q4hQ@tj7Ej^K9q-@cZ
zIjhBKVT_KpP-j3)j89=_bzO?0m;sfO&U-JZC@-tY>
zeKCh+LhkK1x3+dq)eb**Y<<+<%qFdZ
zUAlgK`sdRk1_$faPdyJ?7|`+Q(@KXa=RWe^EF=1!#-Q`g~?B^0tbC@pXJte0&`PSQ?FdV
zzIfFfi^8VByUsxeWDkgkY)!R#;T$aFz*ym;vS`)m(64J({Sp(jT)$+=l100A-I`^X
z%(glG{IZoRI~OfdvN^wa|Ni;&=E?cZv2cuzmX3{$RT1KBkeR^b(DTn$Ztt9rjNwMU
zlOHA7zciHVe_R>&Zv)E*Tfv{~hYkGLUR#G}o?_JCmScRj;#KK^ugfymty#Ugdric~
zrmfl6H&uPjnx+$ZXiem14Nc9HjfYEPg*sVcV`F9PYG&l#-nKFIv{>1j8;GMJpudjSHpD{cvG&D4(lianF=(8wJaiy*)i24*Ci)TEa%O(K_kG{=UTO27;9%#-NJu
zQ{|?mKWCfBl^4cNKitk=d^>mhNBjSu?dMn&zG^xjzDS#OzARU(hL+Z%EnB86TC^xe
zFVJYFid;W?9!u!e+_uCTf0sICCHD|h*5_g!%UBvd9Vp(qs_y2tx2fyv|Gs|eEdNX3
z^mKi75w5_fs9D8qekoo4TRt{7H{U5fZ(H+u_WhLa@9r-CYpVR>DZ`1+Hckr#zJC3x
z6TffHRPFFh2?v>G&6>4h)v80=a%GMu78Dpfueh_bSpD|){Ogm|{l6{0{PM0+QGdrB
zW|?O)U5kCK8a6#JY%pK>D%^SD1=jq!&$EBNaJN5osFj=1KE^OAr+4}Jp5<@Y>X%>6
ztowO7{?pX;HLcI**Vi4{y4?Ba=c;+_sgY-9oA;mA-#-V0MYY2M!o#NrFX9f=n!0HB
z?%8i|Z~y$Dng7#|$Nj}mPE5=&nt4Y_>As=w=fqH1D{-6aljmKUmFu)YBY=2=E%9d&Dz>p
zoR61xZFuNmgC22L6~n8+De9sQk?(@J{#X|LeRQ<@@cbV~)FZa#MCSRpy0V6bhAP+C
zGCplqwf}sfP{wE`&%wj|PC^gzmu1d6GuK*N@Zrzr^UrHu`&pv3ZcE9_pns3_|26g3
z|9QM7Vx!XX=}*@enzYO4R`DKQuw%!JS+k_Xbfa8?gD01imxq^^maZ+0HP=z9);Znf
z-zw++_~H^~kI?%sD(~G72?@DU|A1Nk!KTxChfRD#L~m~^_9|Z3%hB+-QchM@*5>Dv
z$#<&X@4Zv^`|X|D?|1)vn!Z2f_qVqtrKN>s2_e+!k^R13I2PON)w%y0N?beP-vO
z2lunDuY1ZJ|AXm$<@xFrt5!*Eo_Fz)Y5lz#E}6Lt12_Z|udM;c<-2$9CT-icZR)z$
zt2*9o;?3gOZxoUY4hgI6UynkPnODti{m1uDmal!~nl&m@y*8$u
zm9qQy5me$_4feM!UHp1i?16eWrHNNU-gMe#%4kH(ZH^25zh>F8W$)Ug^AgU^GHv*u
zpnH1JvSn%~zMqVpzCZGKpX}rN|K8sJam;+*!EL#>B_t#y9)9ID)0yaT;nuBFm;LR}
zPE>ZEVOgwZoPO?z0Z|mPO4E1M9Lk5}z#>|8*^XcIM&c`G0l7<7-R%CNo;}Is5zb
zuU)%#j!osHdGq9iI$iW$e+)@7=QzhU@z>|k8Gc5Thu?D)s~|Nq|q^5x5g
zd-m8&-!;*1`SBRxhy?w;UxeEE<K8cD9E~)ALH3Z#R;UByDV3cVx-eZY&CJM9km1{$eSO`n3L81Lc_zNbW>;NqrZBB=49(|hb<)27
z>)Q5Bg^!O3-mF(uRo&TcH%r=OaiCfLy)*THuh$Fqx@G3&Jqw=yOJw_v@8Wk1LYHpcI`!SVyld;@{X;`VCwjE3joyCg(j}vHpK4C3PX93Td`;W2V{SI*
zlmGwwTl4$&{b#S^|66^(TP|Py?ajiiTc`H*@%hcOIXO|;{l>mp>;3<}uD`jr+WhFz
zqb8=Ny&3Zier@)-eCBDw>}8(G$;xx*&i!=BTi>)|UU`7aw;k)OmwMT$u{uO{rwV>}
z*wxk5R=)rDU7eU61uaHVadCd0o+mqAGcn}c+|&vxjkj#wD#+DZ@qPFGv+;kg#&68I
zX%x05Vxq8Tt46@C+qZ75SiL&=?yk})Q>JVve;+rm_S;Rv$F}DeFI(2;U-xNpOx4S!
zE40qr{nm;9_i6gh$9>ir`T6HH&o&0lS?|No%Uk&10OP#+f0a%P1-ixc^(5L(nsc3(jg5?^JdZyXSjf!wT9gx{6}(yQ+Dr%M)Kt~Y>F4DRrt%y<5$e(N
z%zcPgmK;5TU%p_PO8pW
zcJkfb-9Jx-?>p4YZ|9*jQDSk$;S)W_7A;cZIsD*2BlDln_WzB`?-aW0-CQ$aUh3^{
z9e!WEr|YHu{q;2|@>*5G)zy-Rt5r=j8ML&tgckUPp3ct7($LpGzgIjbVPP+0{P&x?
zO11kQD=4KHNy^oJ34FKrdt6-AOVxM#e&@;6ez|y2Q-rl~WBz@+ZTa{44xE{3tf{Ym
zzLz^G+SSz+6lP~;nRdT>m$&cp-1kqO$-jMhZuz81Lic{2EB|y(8u*REZ<
zb?emH?e|Vi_P4WqR{ZI424h3W)JvCw%yMoxxVpM7e!Xk`c`*SW$yp-CaiOgD8#AU&
zo%&Q~ZRaHqX2Xk@E*1`TP6(
zV++2iQ>RXuI`yfG(2qx}w{4qN`udt6Uwh@BkH>!=)vs%OY@sYOyY<=r7mK=oT$;Y`
zNE0jfi#KnMe733kvREDzyLr3cnuV>4@yyMAJL5IeyV?K0H?eZhu&plJv3vLLn(L*f
zKb~%1#^M`R%*v>8;?e2r(p-W6*h3e+P
z>Qz^*si)q*wMlxjCUSE|UY?p*_s0j#{6(LhoHV?%@xq_8XV0FQXDfZ#Br_u;;p3yD
zGnRR(O@6q2|6kqRWpAZ^2Wy+yY|Vj
z`97kvbo{qGN`JJo(y6nTv^L5jno}PaB(xpR}{q5)Op1*LRBA>jSkJ3borx*PkH#%HX
zPg|XJ_vYPIotZ|AS9o21|N7OHwDE>S?SVoWoAc6#13|6$)YQ~-FT*vm;ylzfMQ(Go
zI+>W7Cf+uam6cVlac?x=vuYLB=}j+QzC0NkIp^G;zQ-S~1p7a2m@I#xG*!P_
zttHc+^mG2PK0RIkxB(BJtd+^GY1-mR8dH>tR{i{3I`fadwCDLR1a01
z>NU~!UuK5T_Z%KywT4}d&nKNsDSCcxE)Ne+&&D-Pd=fvCj&94n_ifwuja6S?U0!D-
z>pSmxV0`@f((AFu&&)Kg{CHIS=I-+MGYZ$ezI6L`_hSoC=AAWbR(Qw~i&?>9qN0ZN
z|7y6tuHq}2*|f27eRe^C!1dB#pN+}4)P)@~A8cP$Rdarx?VH=%^N-A4&Brb+o;}CXcb`yq
zRe8JX-Lb~T##61_;zsG`<`}A4E)3}KP%%}Z)5uTd7Ro-
zYNwXYv#++U3UfeEIKpiv4%(-~V5ITB_}wlPSx5
z{EmYffwuc)9ddQVqRlNVGS)_I?dt045>#9J*y7+rmE-G5g(!Vb_^MCBkuW3Ga?p$H^i_0%fo<4mVQ}glYmFw4y
zv#;s!$=RH^xY(V0+3r5~b+3(*kMY?3Jn8>wUHRT@mp$4Q`?qhOzHs40t4)tBY(5-d
zw)uEOSl#CQZ~oic;^%lxm6|;3(k!o~8*;6+laxCmmUu(!)~-@*{XHL;Kpm#Yy;Y|3f8Tj-;5%72dYgzy?ZKFz
zSMJ<7<7 $!1#ZF>EkGj*}X>DDUOC6^25
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
N%+uA+Wt~$(695CS2S@+_
literal 0
HcmV?d00001
diff --git a/assets/img/favicons/android-icon-192x192.png b/assets/img/favicons/android-icon-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..db2d8e67a4c5823d5a151cf0c03e2f7cfb7b47ab
GIT binary patch
literal 21277
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
QCQyKRy85}Sb4q9e0P#06j{pDw
literal 0
HcmV?d00001
diff --git a/assets/img/favicons/android-icon-48x48.png b/assets/img/favicons/android-icon-48x48.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b01aa734ab27f8f0dd69f20d33366d7d0604d74
GIT binary patch
literal 3978
zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F!lvNA9*
zFct^7J29*~C-ahlfk7eJBgmJ5p-PQ`p`nF=;THn~L&FOOhEf9thF1v;3|2E37{m+a
z>ZnLqRXM|jRq
zOL#r;PVuw(cW1uey}$bX_uB9GB&WX13U8Pa7E-LUF;{x2hy!N;_ZG&?h8ny2GtZ9)
zUz#h+;F{YPE_0l5LnC`*c0+i>`+l~h0-fv&5|Rg`dj-!-ypt0t)-3#wVFsrU>oR7&
zf)kr`>^YkBWe;!5by|2~g5p2MAK?i~8=h9olNWBtoW;PpG(=v2wT^KQcMbOp?mz2O
zBO_05`tiT(#x`FSA;)Z6#vf`0(jR0Kq>dKU@Oku$B)BND9A0PMU@(E%B!Ke{=MlEO
zm&;2mcPN~7)m%meYv`&sLFb|~{M7G$pB43Yd${J>Q(a_JPM`RC=={;@o;
z_dq?PG-J3+&H|s-rjcPap6q+`h9C6HacBf7puKG
zeEl@*_j`x-P;)HZefx^>gsF@9)+B|Jz#o`b7`gQW*Hr_Aaz9mT8BTNP5bud=HYqLlQ@Od4D#>UFc{6``B^h>+qP|f3({5CZyQeDS!3rf!180?
z|7*v3rRUGJEPmE29#haL$k#s8JYO#R+M2}UeX=Q=Bh${!>3siNCw7;}^-{))r&Gft
z_SIO{*4F0S-o|_X`^q(Ip7dG2d+=uSd9~SRC!I|L1^&{dsmcXMKJS@m@$g4VLAu4m
z9^-RA&a=x^9JsryboG|)+q>WYR#JMjYu%ndpH5%8a6w^PE`R*Vl%TM+QL3`CvY(Dg
z=bzx#-=na*{QWeig$nCldwF|z=iJ`ro44!bvhRy8zKFkao61jbX3dg{xt{v|-rhHNb{6m0P#!D3RODjDluw_E-tBxYw{GV%
zsYMqxqOvc&G>MIkm9Z-6D1CkHZRGa6yKCpy{d)OY+4RkdzV`=beb>2cGT(&fvB}!f
z!VQkChaVceERniwvU1(JXCEFOw&-(qc4q$k{CxVQC7z46o-;8wFW>k5UbVidsp;CB
z{QUceImAD#V9dGgmff2<>p8=Jzl|{_Z3;r2EY4pYtmdlCKFg|%@KYxM3p_DGyy%WzrKbf|fhlj^t%VLeC
zHHQuCL?^a?{`sfh%iDYQu3ft>9XN4I;PJ!8#i=*{PJbZ!rzMYBc749=gHQYIyKn1NHMO~3UT1ybM%g`H^)t`D
zxR@$6sn5z*zg}GUwdB?5RZ8i8D=c4h|5;~xyMCwqi~o!^Ymf68EZgQ~5$98VdF2{G
ze(NbNGCux+LPZ5W-E(c<&Y83#B`nhP^V*Z!!&{QVmmT@)|Nq;T;C=faZTeoer}jYn
zwuGlM82Zd-{$BiP@#-+f57&0t-fRDT`{vEU8PjinU+B7`bIOC447yI$dd*9Fez^Z#
zdD*BfJl=ZgpYYw~GFGKFS{n=*Wh`eL+m`#hS(p7a|CVJH8?)uRSNScw)Ope9!s(Su
z)f1%EjD@Ej(V0Ehw%xK~$?+Q>e;s$9ldE&hqQq^6))7S1+Ql%fBkaB{}&%f8Z>xMhE{*4yPmS+?TP~=B+C*pQY||`osS1
zFQzAdJFsJmQQgj`Vs%xg*-mLCFF$(f(0bFFz3Y~3+to9pCE!5A!{QyA^||jF
zsNa{FADg~?vF+klyau9Q1P9#yP|C!Qy{$-`DJWm$Opj`V0*Thn3p}UancA
z`*flB|8oKlO%_Bt*4^B>_`cWiBEC5eADiEWnDzy|GU7QG7_ffI
zuPI5t3RJz$W@o?53h`=nSjRSx