├── .DS_Store
├── README.md
└── ShangzengBlog
├── .DS_Store
├── arctales
├── .DS_Store
├── GoBackChangchun.md
├── GrafanaLFI.md
├── HfishCodeAudit.md
├── JsonpLearn.md
├── SpringDat.md
├── TheBeginningOfEverything.md
├── WinhexDataRecovery.md
├── about.html
└── friends.html
├── conf
└── app.conf
├── controllers
├── .DS_Store
├── articleshow.go
├── dnslog.go
└── feed.go
├── go.mod
├── go.sum
├── main.go
├── routers
└── router.go
├── static
├── .DS_Store
├── css
│ ├── .DS_Store
│ ├── font-awesome.min.css
│ ├── md02.css
│ └── style.css
├── fonts
│ └── .DS_Store
├── img
│ ├── .DS_Store
│ ├── 10.png
│ ├── 11.png
│ ├── 12.png
│ ├── 13.png
│ ├── 14.png
│ ├── 15.png
│ ├── 16.png
│ ├── 17.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ ├── 6.png
│ ├── 7.png
│ ├── 9.png
│ ├── GoBackChangchun_1.png
│ ├── GoBackChangchun_2.png
│ ├── GoBackChangchun_3.jpeg
│ ├── GoBackChangchun_4.jpg
│ ├── IMG_5018.PNG
│ ├── WechatIMG2464.png
│ ├── WechatIMG2465.png
│ ├── WechatIMG2466.png
│ ├── WechatIMG2467.png
│ ├── WechatIMG2468.png
│ ├── WechatIMG2648.png
│ ├── WechatIMG2649.png
│ ├── WechatIMG2650.png
│ ├── beijing.jpg
│ └── image.png
└── js
│ ├── .DS_Store
│ ├── axios.min.js
│ └── vue.js
├── test.go
├── view
└── views
├── .DS_Store
├── 404.html
├── article.html
├── category.html
├── dnslog.html
├── foot.html
├── head.html
├── index.html
└── page.html
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/.DS_Store
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # GolangTools
2 |
3 | go语言学习与日常实践使用
4 |
5 |
6 | # 目录结构
7 |
8 | * `ShangzengBlog` : 基于beego编写的markdown格式的blog , 支持 DNSlog , RSS 等功能
9 |
10 |
11 |
12 |
13 | # Data
14 |
15 | 打算定期整理下
16 |
17 | - [x] 20220607 重新整理,删除过期
--------------------------------------------------------------------------------
/ShangzengBlog/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/arctales/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/GoBackChangchun.md:
--------------------------------------------------------------------------------
1 | Time: 20220419:other: 在之前,我一直会思考一个问题:那就是从北京回到长春是否会适应 ?
2 | 说实话,确实是有点不适应的,很多之前讨厌的东西到头来发现自...: 2022年返回长春的总结
3 | --------
4 |
5 | # 时间线
6 |
7 | 在之前,我一直会思考一个问题:从北京回到长春是否会适应 ?
8 |
9 | 说实话,确实是有点不适应的,很多之前讨厌的东西到头来发现自己还是很依赖的:便利的交通,丰富的活动,一些合理化的流程管理balabala......好在这些落差我心里还是有点预期的,毕竟不想背那种几百万的房贷嘛,这些都是过客,一线城市建设的再好,和我有什么关系呢?
10 |
11 | 但是确实也有一些是始料未及的,比如说找工作,在一个经济不发达、人情社会情节比较重的城市找一份网络安全这种技术性较强的工作,属实是不好找:甲方岗位基本全是外包或者第三方合同,说裁员就裁员,可以说毫无保障了 ;乙方也是,工资直接给超级打折--我知道工资肯定会打折,但是没想到会打折这么多,不过这不重要,最重要的是没那么多的工作量,没错,是没啥活--我虽然不愿意卷,但是也不愿意天天无所事事的坐办公室摸鱼啊,终究还是想搞点东西的 。
12 |
13 | 再就是社会不适应吧,虽然我是个东北人,但是真的一点不会这些所谓的“人情往来” ,大概属于领导夹菜我转桌,领导敬酒我不喝的那种人 ,不想学人情世故。
14 |
15 | 
16 |
17 |
18 | 接下来就是说好处了.
19 |
20 | 首先就是社交变多了,本来我就是属于“比较宅”的性格,在北京那就更是除了工作基本不会出屋子;而回来后,就可以和朋友们线下面基了。基本每周末都会排满:剧本杀,密室逃脱,各种逛商场,漫展,公园,脱口秀等等等等,总之有了点生活的样子吧。
21 |
22 | 再就是时间明显变得"充裕"起来了: 回老家的路程只要三个小时,基本周末就能回去一趟;之前买了微单也买了课程 ,学习学习摄影 ; 买了性能超高的台式,3060ti搞起来(但是也不玩吃灰)。总之,个人娱乐变丰富了。
23 |
24 | 
25 |
26 | 再就是敢真正研究一下“长久”的事情了,也有勇气看看房子,车子,并且觉得自己能买得起了。
27 |
28 | 女朋友就随缘吧,已经是放弃的状态了我 ==
29 |
30 |
31 | # 疫情
32 |
33 | 2022年3月份,长春开始了新一轮疫情,被迫开始了居家隔离的生活。
34 |
35 | 之前总会想居家隔离有多么多么爽,但是要是呆着一个多月,那就有点无聊了,更重要的是整个人会颓废起来。整个人就是在颓废->振作->颓废这个循环中不断地重复。
36 |
37 | 好在租的小区很是靠谱,因此在物资方面倒不会匮乏,只不过买到什么就只能随缘了,物价也时高时低,全看供应商与物流靠谱不靠谱。
38 |
39 | 在隔离期间成功学会了做饭(各种炒菜、炖菜等等),虽然样子可能不好看,但是是真的好吃 !!
40 |
41 | 
42 |
43 |
44 | # 关于未来
45 |
46 | 总而言之,对于回来这个决定总体来说,目前还是不后悔的(以后那就不知道了),来之后的生活也确实是有些怠惰了,很多东西不想搞,得振作起来。
47 |
48 | 在搭建第一篇博客时候,立下了几个**flag** :
49 |
50 | 1. 第一个是拍摄一组照片,发布出来,照片拍摄了,但是并不满意,打算回炉重造下吧 ;
51 | 2. 第二个是博客完成完成`浏览量` ,`标签搜索` , `DNSlog` ,`相邻文章`, `RSS`等功能 , 这个已经都**圆满完成**了,后续可能会增加一些更有意思的功能 ;
52 | 3. 第三个是要健身,目标瘦20斤 , 算是完成了一半吧 ,目前已经瘦了十斤 。
53 |
54 | 还算是有所完成吧,也有所不足。对于今年说实话也没什么比较突出的期望,还是希望吧日常这些事情做好就行了,多把心思放在生活上面一些,多积累一些东西,学习学习Java,多写几篇文章赚赚零花,考点证书,最好能出去旅游,陪伴父母出去走走等等。
55 |
56 | 多看看书,不要活的太焦虑,条条大路通罗马,但是并不是到了罗马就会幸福。
57 |
58 | 
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/GrafanaLFI.md:
--------------------------------------------------------------------------------
1 | Time: 20211222:golang: 第一次在没有获取到漏洞细节,反推出漏洞存在点,感觉还是很有成就感的...:Grafana 任意文件读取漏洞 CVE-2021-43798
2 | --------
3 |
4 |
5 | # 背景
6 |
7 |
8 | payload如下:
9 |
10 | ```golang
11 | public/plugins/grafana-clock-panel/../../../../../../etc/passwd
12 | ```
13 |
14 | 
15 |
16 |
17 |
18 | # 下载/安装
19 |
20 | 进入 **pkg/api/api.go**文件夹,寻找路由,跟进 **getPluginAssets** ,换 **Goland** 方便跟进函数,函数**getPluginAssets** 在 **plugins.go** 中,这里**filepath.Join** 直接获取了插件的名字**plugin.PluginDir**和路径**requestedFile**进行了拼接(但是在之前有判断插件是否存在,因此得是存在的插件),然后直接使用 **os.Open** 打开了插件,这时候导致了问题的存在:
21 |
22 |
23 | * **filepath.Join** 用于拼接URL路径 filepath.Join("a","a"). => "a/a"
24 | * **filepath.Clean** 清理路径中的多余字符 , 也就是这里出现了问题,导致 **../** 进行了拼接
25 |
26 | 
27 |
28 | ## 关于 filepath.Clean
29 |
30 | 在过滤时候, **/../../../**可以进行处理
31 |
32 | 
33 |
34 | 但是 **../../../** 并不会被处理
35 |
36 | 
37 |
38 | 使用 `os.Open` 打开文件,使用ServeContent
39 |
40 |
41 | * 关于**ServeContent** https://pkg.go.dev/net/http#ServeContent
42 |
43 | 
44 |
45 |
46 | ## 查看修复方式
47 |
48 | 在最新版本已经修复了,修复方式就是在数组前加上 **/**
49 |
50 | ```golang
51 | // https://github.com/grafana/grafana/blob/main/pkg/api/plugins.go
52 | requestedFile := filepath.Clean(filepath.Join("/", web.Params(c.Req)["*"]))
53 | rel, err := filepath.Rel("/", requestedFile)
54 | ```
55 |
56 | # 其他 TIPS
57 |
58 | 可以通过在前面加上//../,让nginx不处理后的锚点
59 |
60 |
61 | ```golang
62 | /public/plugins/alertlist/#/../..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f/etc/hosts
63 | ```
64 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/HfishCodeAudit.md:
--------------------------------------------------------------------------------
1 | Time: 20210921:golang: 首发 「 SecIN」 这里做个记录:...:HFish初版审计学习
2 | --------
3 |
4 |
5 | # 背景
6 |
7 |
8 | * 首发 https://sec-in.com/article/949
9 |
10 | 在之前学习golang的靶场之后,下来开始尝试一些真实环境的代码审计工作,于是我找到了HFsih并下载了最初的版本。
11 |
12 | 到这里可能有师傅问了:为什么不直接梭哈最新版本?当然是因为最初版本比较简单并且适合新人(并不是担心高版本找不到问题会很尴尬),哈哈
13 |
14 | 话不多说,我们开干
15 |
16 | # 下载/安装
17 |
18 | Hfish是使用golang编写的一款开源蜜罐,其中下载地址如下: https://github.com/hacklcx/HFish/releases?after=0.4
19 |
20 | 在安装golang环境后,我们还需要安装gin框架:
21 |
22 | ```goalng
23 | go get -u github.com/gin-gonic/gin
24 | ```
25 | 设置go mode
26 |
27 | ```golang
28 | go env -w GOBIN=$HOME/bin
29 | go env -w GO111MODULE=on
30 | go env -w GOPROXY=https://goproxy.cn,direct
31 | ```
32 |
33 | 接下来进入目录就可以运行了
34 |
35 | ```goalng
36 | go run main.go run
37 | ```
38 |
39 |
40 | # 代码审计/学习
41 |
42 | 首先看入口 **main.go** 中 **setting.Run()** 为运行入口,进入进入**HFish/utils/setting/setting.go**, 我们可以看到使用**conf.Get("xxx", "xxx")**的方式进行读取**config.ini**中的配置文件,以此判断蜜罐是否启动,如果开启使用**Start()**进行运行
43 |
44 | ```golang
45 | // 启动 Redis 钓鱼
46 | redisStatus := conf.Get("redis", "status")
47 |
48 | // 判断 Redis 钓鱼 是否开启
49 | if redisStatus == "1" {
50 | redisAddr := conf.Get("redis", "addr")
51 | go redis.Start(redisAddr)
52 | ```
53 |
54 | 这里后面再来看蜜罐,先来看看管理端是是怎么设置的,读取**config.txt** 中设置的管理员地址,并在 **http.Server**中进行设置:
55 |
56 | ```golang
57 | // 启动 admin 管理后台
58 | adminbAddr := conf.Get("admin", "addr")
59 | serverAdmin := &http.Server{
60 | Addr: adminbAddr,
61 | Handler: RunAdmin(),
62 | ReadTimeout: 5 * time.Second,
63 | WriteTimeout: 10 * time.Second,
64 | }
65 | serverAdmin.ListenAndServe()
66 | }
67 | ```
68 | 看`RunAdmin() `中设置的路由,这里使用的gin框架,生成日志并写入静态资源
69 |
70 | ```goalng
71 | func RunAdmin() http.Handler {
72 | gin.DisableConsoleColor()
73 | f, _ := os.Create("./logs/hfish.log")
74 | gin.DefaultWriter = io.MultiWriter(f)
75 | // 引入gin
76 | r := gin.Default()
77 |
78 | r.Use(gin.Recovery())
79 | // 引入html资源
80 | r.LoadHTMLGlob("admin/*")
81 |
82 | // 引入静态资源
83 | r.Static("/static", "./static")
84 |
85 | // 加载路由
86 | view.LoadUrl(r)
87 |
88 | return r
89 | }
90 | ```
91 |
92 | 跟进**view.LoadUrl(r)**,查看加载的路由功能 ,进入**HFish/view/url.go**,访问**http://127.0.0.1/login**黑白结合进行查看,首先是登陆页面:直接夹在静态资源:
93 |
94 |
95 | ```goalng
96 |
97 | func Html(c *gin.Context) {
98 | data := getSetting() //订阅通知等
99 | c.HTML(http.StatusOK, "setting.html", gin.H{
100 | "dataList": data,
101 | })
102 | }
103 | ```
104 |
105 | 尝试登陆,这里是直接post提交 loginName和 loginPwd 为账号密码,我们在HFish/view/login/view.go中查看登陆逻辑 — 获取用户的登陆账号和密码,与config.ini重的账号密码进行比对,如果一直就在cookie中写入登陆的用户名:
106 |
107 | ```golang
108 | func Login(c *gin.Context) {
109 | loginName := c.PostForm("loginName")
110 | loginPwd := c.PostForm("loginPwd")
111 |
112 | account := conf.Get("admin", "account")
113 | password := conf.Get("admin", "password")
114 |
115 | if loginName == account {
116 | if loginPwd == password {
117 | c.SetCookie("is_login", loginName, 60*60*24, "/", "*", false, true)
118 | c.JSON(http.StatusOK, error.ErrSuccessNull())
119 | return
120 | }
121 | }
122 |
123 | c.JSON(http.StatusOK, error.ErrLoginFail())
124 | }
125 |
126 | ```
127 |
128 | ## 无验证码-容易爆破
129 |
130 | 其实这也不算是什么问题,但是这玩意万一有用呢?抱着这种想法,我写了脚本,结果居然大约爆破出来二十多个公网的蜜罐管理员账号密码,脚本如下:
131 |
132 | * https://github.com/shangzeng/GolangTools/tree/master/12.HFishPassScan
133 |
134 | ## 绕过密码登陆管理员
135 |
136 | 继续查看学习管理员的路由设置,发现在登出操作中,就是清除cookie中的is_login 的用户名,从而达到目的
137 |
138 |
139 | ```golang
140 | func Logout(c *gin.Context) {
141 | c.SetCookie("is_login", "", -1, "/", "*", false, true)
142 | c.Redirect(http.StatusFound, "/login")
143 | }
144 | ```
145 | 而FHish怎么判断用户是否登陆的呢,这里使用login.Jump函数进行判断,HFish/view/login/view.go 的jump函数进行查看,这里出现了问题: 只是判断了cookie中的用户名为管理员用户名,就判断用户是已经登陆的状态,进入了管理员界面,根本没有用到密码:
146 |
147 |
148 | ```golang
149 | func Jump(c *gin.Context) {
150 | account := conf.Get("admin", "account")
151 | loginCookie, _ := c.Cookie("is_login")
152 | if account != loginCookie {
153 | c.Redirect(http.StatusFound, "/login")
154 | c.Abort()
155 | return
156 | } else {
157 | c.Next()
158 | }
159 | }
160 | ```
161 | 那么问题来了:如果我们知道管理员账号(一般都是admin),那么我们只要修改cookie中的内容,就可以进行登陆了。测试一下:当不存在的时候,登陆mail界面会跳转到登陆页面
162 |
163 | 
164 |
165 | 但是is_login=admin时,就可以通过login.Jump函数验证,访问管理员界面
166 |
167 | 
168 |
169 |
170 | 也就是说:只要我们知道了管理员账号名,我们可以越过密码进行登录(划重点)。
171 |
172 |
173 | ## 前台存储XSS
174 |
175 | 继续查看,仪表盘功能和上钩列表功能主要是展示,没有什么输入操作,接下来查看邮件群发功能:接收邮件,并且在send.SendMail 中使用golang的gomail(https://gopkg.in/gomail.v2)进行发送邮件,使用的是sqlite数据库,但是这里只是用来一个查询并不可控。
176 |
177 | 
178 |
179 | 接着查看配置功能,其中view.go中的GetSettingInfo 接收了ID参数用于查询邮件配置,但是这里使用占位符,不存在注入问题,
180 |
181 | ```golang
182 | /*发送邮件*/
183 | func SendEmailToUsers(c *gin.Context) {
184 | emails := c.PostForm("emails")
185 | title := c.PostForm("title")
186 | from := c.PostForm("from")
187 | content := c.PostForm("content")
188 |
189 | eArr := strings.Split(emails, ",")
190 | sql := `select status,info from hfish_setting where type = "mail"`
191 | isAlertStatus := dbUtil.Query(sql)
192 | info := isAlertStatus[0]["info"]
193 | config := strings.Split(info.(string), "&&")
194 |
195 | if from != "" {
196 | config[2] = from
197 | }
198 |
199 | send.SendMail(eArr, title, content, config)
200 | c.JSON(http.StatusOK, error.ErrSuccessNull())
201 | }
202 | ```
203 |
204 | 接下来就是看API接口,主要的目的就是上报we蜜罐的信息,默认开启(这个重要),我们可以看到上报的信息直接写入了sqlite数据库中,虽然用占位符不存在注入问题了,但是是是否会存在XSS呢?
205 |
206 |
207 | ```golang
208 | // 获取钓鱼信息
209 | func GetFishInfo(c *gin.Context) {
210 | id, _ := c.GetQuery("id")
211 | sql := `select info from hfish_info where id=?;`
212 | result := dbUtil.Query(sql, id)
213 | c.JSON(http.StatusOK, error.ErrSuccess(result))
214 | }
215 | ```
216 |
217 | 我们看看蜜罐是怎么上传数据的 HFish/web/github/static/github.js 文件,sec_key直接写在js里面的可控:
218 |
219 |
220 | ```golang
221 | function report() {
222 | var login_field = $("#login_field").val();
223 | var password = $("#password").val();
224 |
225 | $.ajax({
226 | type: "POST",
227 | url: "http://localhost:9001/api/v1/post/report",
228 | dataType: "json",
229 | data: {
230 | "name": "Github钓鱼",
231 | "info": login_field + "&&" + password,
232 | "sec_key": "9cbf8a4dcb8e30682b927f352d6559a0"
233 | },
234 | success: function (e) {
235 | if (e.code == "200") {
236 | window.location.href = "https://github.com";
237 | } else {
238 | console.log(e.msg)
239 | }
240 | },
241 | error: function (e) {
242 | console.log("fail")
243 | }
244 | });
245 | }
246 | ```
247 |
248 | 查看fish. GetFishList而管理员界面也是直接读取数据,没有编码,很有可能存在XSS,使用钓鱼接口发送XSS测试
249 |
250 | 
251 |
252 | 查看管理员界面,触发XSS http://127.0.0.1/fish
253 |
254 | 
255 |
256 |
257 | # 最后
258 |
259 | 到这里代码就大致分析完毕了,还是有一些收获的哈哈(虽然是没人说的Nday)接下如果有时间可以继续学习蜜罐的编写或者查看下一个版本的HFih进行学习。最后感谢观看哈~
260 |
261 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/JsonpLearn.md:
--------------------------------------------------------------------------------
1 | Time: 20220208:other: 首发于微信公众号「Yakit」,关于一个简单漏洞的发现到自动脚本化...:JSONP漏洞发现到漏洞挖掘
2 | --------
3 |
4 | # 什么是JSONP劫持漏洞
5 |
6 | **同源策略**(同协议、同域名、同端口)导致的不同域名的网站无法传输数据,但是在某些时刻我们有需要进行跨域传输数据。
7 | 这时候**jsonp**身为跨域的方法中的一个就孕育而生了,由于html标签中的`
41 |
42 | ```
43 |
44 |
45 | # 自动化漏洞扫描JSONP漏洞
46 |
47 |
48 | * 被动扫描,类似X-ray
49 | * 主动扫描,爬虫爬取链接识别
50 | * 可以在疑似存在jsonp的地方加上`callback` 看看是否存在回调
51 |
52 | **思路**
53 |
54 | * 利用 https://github.com/JonCooperWorks/judas 这种网络钓鱼的插件的方式来进行筛选
55 | * xray使用的是 google martian 这个库,去康康
56 | * 搜索 golang proxy http 进行学习
57 | * 被动扫描案例 https://github.com/Buzz2d0/taser
58 | * 但是最好可以结合BP来搞,就像是xray代理那样
59 |
60 |
61 | **主动扫描**
62 |
63 | 使用[RAD](https://github.com/chaitin/rad)爬虫手机网址,使用[check_jsonp_based_on_ast](https://github.com/jweny/check_jsonp_based_on_ast)进行漏洞检测,这里使用携程的的一个jsonp进行验证
64 |
65 | ```
66 | https://accounts.ctrip.com/ssoproxy/ssoGetUserInfo?jsonp=jQuery2398423949823
67 | ```
68 | 脚本已经上传GitHub: https://github.com/shangzeng/GolangTools
69 |
70 | 
71 |
72 | **被动扫描**
73 |
74 | 简而言之,还是需要先了解`代理`相关的的资料,再根据代理相关的数据进行修改。流量转发到我们设定的端口,然后在端口进行循环监听,筛选数据,在匹配到合适的数据就进行输出:
75 |
76 | ```golang
77 | package main
78 |
79 | import (
80 | "fmt"
81 | "bufio"
82 | "log"
83 | "net"
84 | "net/http"
85 | "io/ioutil"
86 | )
87 | var client = http.Client{}
88 | func main() {
89 | listener, err := net.Listen("tcp", "127.0.0.1:7777") // 监听端口
90 | if err != nil {
91 | log.Fatal(err)
92 | }
93 | for {
94 | conn, err := listener.Accept()
95 | if err != nil {
96 | log.Fatal(err)
97 | }
98 | go handleConn(conn)
99 | }
100 | }
101 |
102 | func handleConn(conn net.Conn) {
103 | req, err := http.ReadRequest(bufio.NewReader(conn)) // 读取代理中的请求
104 | if err != nil {
105 | log.Println(err)
106 | return
107 | }
108 | req.RequestURI = ""
109 | resp, err := client.Do(req) // 发送请求获取响应
110 | if err != nil {
111 | log.Println(err)
112 | return
113 | }
114 | body, _ := ioutil.ReadAll(resp.Body)
115 | fmt.Println(string(body)) // 输出测试
116 | _ = resp.Write(conn) // 将响应返还给客户端
117 | _ = conn.Close()
118 | }
119 | ```
120 |
121 | 下面是http版本的被动扫描,https 的不会证书相关
122 |
123 |
124 | ```goalng
125 |
126 | package main
127 |
128 | import (
129 | "fmt"
130 | "bufio"
131 | "log"
132 | "net"
133 | "net/http"
134 | _"io/ioutil"
135 | "github.com/robertkrimen/otto/ast"
136 | "github.com/robertkrimen/otto/parser"
137 | _"encoding/json"
138 | "io/ioutil"
139 | "net/url"
140 | "regexp"
141 | _"os"
142 | )
143 | var client = http.Client{}
144 | func main() {
145 | listener, err := net.Listen("tcp", "127.0.0.1:7777") // 监听端口
146 | if err != nil {
147 | log.Fatal(err)
148 | }
149 | for {
150 | conn, err := listener.Accept()
151 | if err != nil {
152 | log.Fatal(err)
153 | }
154 | go handleConn(conn)
155 | }
156 | }
157 |
158 | func handleConn(conn net.Conn) {
159 | // 读取代理中的请求
160 | req, err := http.ReadRequest(bufio.NewReader(conn))
161 | if err != nil {
162 | log.Println(err)
163 | return
164 | }
165 | req.RequestURI = ""
166 | // 发送请求获取响应
167 | resp, err := client.Do(req)
168 | if err != nil {
169 | log.Println(err)
170 | return
171 | }
172 | // 输出测试
173 | //body, _ := ioutil.ReadAll(resp.Body)
174 | //fmt.Println(req.URL.String())
175 | // 检测
176 | result, _ := CheckSenseJsonp(req.URL.String())
177 | if result {
178 | fmt.Println("存在jsonp",req.URL.String())
179 | }
180 | _ = resp.Write(conn) // 将响应返还给客户端
181 | _ = conn.Close()
182 | }
183 | //基于AST的JSONP劫持漏洞检测
184 | //1.解析js路径,检查query所有key是否满足正则 (?m)(?i)(callback)|(jsonp)|(^cb$)|(function)
185 | //2.referer配置为同域,请求js获取响应
186 | //3.js响应生成AST,如果满足
187 | // a) Callee.Name == callback函数名
188 | // b) 递归遍历AST 获取所有的字段和对应的value
189 | // c) 字段为敏感字段(满足正则(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick)),且value不为空
190 | //4.替换Referer后再请求一次,重新验证步骤3
191 | //
192 | //调用方式
193 | //入参:js路径
194 | //返回:是否存在漏洞,err
195 | //result, err := CheckSenseJsonp("http://127.0.0.1/jsonp_env/getUser.php?id=1&jsoncallback=callbackFunction")
196 | func CheckSenseJsonp(jsUrl string)(bool, error){
197 | // 准备referer
198 | queryMap, domainString, err := UrlParser(jsUrl)
199 | if err != nil{
200 | return false, err
201 | }
202 | // 检查jsonp关键字
203 | isCallback, callbackFuncName, err := CheckJSIsCallback(queryMap)
204 | if isCallback{
205 | // referer: host 请求
206 | normalRespContent, err := GetJsResponse(jsUrl, domainString)
207 | if err != nil{
208 | return false, err
209 | }
210 | // 检查JS语句
211 | isJsonpNormal , err := CheckJsRespAst(normalRespContent, callbackFuncName)
212 | if err != nil{
213 | return false, err
214 | }
215 | // 如果包含敏感字段 将 referer 置空 再请求一次
216 | if isJsonpNormal{
217 | noRefererContent, err := GetJsResponse(jsUrl, "")
218 | if err != nil{
219 | return false, err
220 | }
221 | isJsonp , err := CheckJsRespAst(noRefererContent, callbackFuncName)
222 | if err != nil{
223 | return false, err
224 | }
225 | return isJsonp, nil
226 | }
227 | }
228 | return false, nil
229 | }
230 | func UrlParser(jsUrl string)(url.Values, string, error){
231 | urlParser, err := url.Parse(jsUrl)
232 | if err != nil{
233 | return nil, "", err
234 | }
235 | // 拼接原始referer
236 | domainString := urlParser.Scheme + "://" + urlParser.Host
237 | return urlParser.Query(), domainString, nil
238 | }
239 | func CheckJSIsCallback(queryMap url.Values) (bool,string, error){
240 | var re = regexp.MustCompile(`(?m)(?i)(callback)|(jsonp)|(^cb$)|(function)`)
241 | for k, v :=range queryMap {
242 | regResult := re.FindAllString(k, -1)
243 | if len(regResult) > 0 && len(v)>0 {
244 | return true, v[0], nil
245 | }
246 | }
247 | return false, "",nil
248 | }
249 | func CheckIsSensitiveKey(key string) (bool,error) {
250 | var re = regexp.MustCompile(`(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick)`)
251 | regResult := re.FindAllString(key, -1)
252 | if len(regResult) > 0 {
253 | return true, nil
254 | }
255 | return false, nil
256 | }
257 | func GetJsResponse(jsUrl string, referer string) (string, error) {
258 | req, err := http.NewRequest("GET", jsUrl, nil)
259 | if err != nil {
260 | return "", nil
261 | }
262 | req.Header.Set("Referer", referer)
263 | resp, err := http.DefaultClient.Do(req)
264 | if err != nil {
265 | return "", err
266 | }
267 | defer resp.Body.Close()
268 | body, err := ioutil.ReadAll(resp.Body)
269 | if err != nil {
270 | return "", err
271 | }
272 | if resp.StatusCode == 200 {
273 | return string(body), nil
274 | }
275 | return "", nil
276 | }
277 | func CheckJsRespAst(content string, funcName string) (bool,error){
278 | // 解析js语句,生成 *ast.Program 或 ErrorList
279 | program, err := parser.ParseFile(nil, "", content, 0)
280 | if err != nil{
281 | return false, err
282 | }
283 | if len(program.Body) > 0 {
284 | statement := program.Body[0]
285 | expression := statement.(*ast.ExpressionStatement).Expression
286 | expName := expression.(*ast.CallExpression).Callee.(*ast.Identifier).Name
287 | // 表达式中函数名与query函数名不一致 直接返回false
288 | if funcName != expName{
289 | return false, err
290 | }
291 | argList := expression.(*ast.CallExpression).ArgumentList
292 | for _, arg := range argList{
293 | result := DealAstExpression(arg)
294 | if result != true{
295 | continue
296 | }
297 | return result, nil
298 | }
299 | }
300 | //ast树为空 直接返回
301 | return false, nil
302 | }
303 | func DealAstExpression(expression ast.Expression)bool{
304 | objectLiteral, isObjectLiteral := expression.(*ast.ObjectLiteral)
305 | if isObjectLiteral{
306 | values := objectLiteral.Value
307 | for _, value := range values{
308 | result := DealAstProperty(value)
309 | if result != true{
310 | continue
311 | }
312 | return result
313 | }
314 | }
315 | return false
316 | }
317 | func DealAstProperty(value ast.Property)bool{
318 | secondLevelValue := value.Value
319 | // 表达式中是数组/对象的 递归
320 | objectLiteral, isObjectLiteral := secondLevelValue.(*ast.ObjectLiteral)
321 | arrayLiteral, isArrayLiteral := secondLevelValue.(*ast.ArrayLiteral)
322 | stringLiteral, isStringLiteral := secondLevelValue.(*ast.StringLiteral)
323 | numberLiteral, isNumberLiteral := secondLevelValue.(*ast.NumberLiteral)
324 | if isObjectLiteral {
325 | thirdLevelValue := objectLiteral.Value
326 | for _, v := range thirdLevelValue {
327 | DealAstProperty(v)
328 | }
329 | } else if isArrayLiteral {
330 | thirdLevelValue := arrayLiteral.Value
331 | for _, v := range thirdLevelValue {
332 | DealAstExpression(v)
333 | }
334 | } else if isStringLiteral{
335 | // 表达式中value为字符串/数字的 才会检测key value
336 | thirdLevelValue := stringLiteral.Value
337 | isSensitiveKey, _ := CheckIsSensitiveKey(value.Key)
338 | if isSensitiveKey && thirdLevelValue != ""{
339 | return true
340 | }
341 | } else if isNumberLiteral {
342 | thirdLevelValue := numberLiteral.Value
343 | isSensitiveKey, _ := CheckIsSensitiveKey(value.Key)
344 | if isSensitiveKey && thirdLevelValue != 0{
345 | return true
346 | }
347 | }
348 | return false
349 | }
350 | ```
351 |
352 | # 使用Yak被动扫描jsonp漏洞
353 |
354 | 通过上面我们可以知道,jsonp的搜索与发现是个比较容易流程化的操作,而且相对于主动扫描,被动发现也更加适合,因此我们这里可以写一个被动扫描插件,来代替手工操作,而且解决了HTTPS的问题
355 |
356 | 其中Yak的开发文档如下:
357 |
358 | ```html
359 | https://www.yaklang.io/docs
360 | ```
361 | 打开Yakit,选择【插件仓库】,选择【+新插件】,这里的插件有三种模式:
362 |
363 | * 以 Webhook 为通信媒介的原生 Yak 模块,通过核心引擎启动新的 yak 执行进程来控制执行过程;
364 | * 以 MITM 劫持过程为基础 Hook 点的 Yak 模块,
365 | * 以 Yaml 为媒介封装 Nuclei PoC 的模块,本质上也是执行一段 Yak 代码,原理与(1)相同
366 |
367 | 我们使用**MITM**模块,这里我们需要了解的几个函数已经存在注释了,讲的很清楚。 **jsonp** 主要出现在请求参数里面,因此使用`mirrorNewWebsitePathParams` 模块,其他的不用注释掉就好
368 |
369 | ```
370 | # mitm plugin template
371 | yakit_output(MITM_PARAMS)
372 | __test__ = func() {
373 | results, err := yakit.GenerateYakitMITMHooksParams("GET", "https://example.com")
374 | if err != nil {
375 | return
376 | }
377 | isHttps, url, reqRaw, rspRaw, body = results
378 | mirrorNewWebsitePathParams(results...)
379 | }
380 | # mirrorNewWebsitePathParams 每新出现一个网站路径且带有一些参数,参数通过常见位置和参数名去重,去重的第一个 HTTPFlow 在这里被调用
381 | mirrorNewWebsitePathParams = func(isHttps /*bool*/, url /*string*/, req /*[]byte*/, rsp /*[]byte*/, body /*[]byte*/) {
382 | }
383 | ```
384 |
385 | 在被动接收流量后,我们首先应当删选出包含**jsonp**的请求,这里使用关键字匹配的方式进行搜索:
386 |
387 | ```go
388 | # 请求存在关键词检测为jsonp数据
389 | availableJSONPParamNames = [
390 | "jsonp","jsoncb","jsonpcb","cb","json","jsonpcall","jsoncall","jQuery","callback","back",
391 | ]
392 | ```
393 |
394 | 在字符串的比对中,时使用 **[str](https://www.yaklang.io/docs/buildinlibs/lib_str)** 工具库进行,这里注意大小写问题
395 |
396 |
397 | ```go
398 | str.StringSliceContains(availableJSONPParamNames, str.ToLower(paramName))
399 | ```
400 |
401 | 在**Yak**中,提供了 **[fuzz](https://www.yaklang.io/docs/buildinlibs/lib_fuzz)** 工具库来进行请求的发送与接收,例如官方提供的POC如下:
402 |
403 | ```golang
404 | # fuzz.HTTPRequest 可以直接 接收 req 数据 进行发送,并允许一定的错误
405 | fReq, err := fuzz.HTTPRequest(`
406 | POST /index.php?s=captcha HTTP/1.1
407 | Host: localhost:8080
408 | User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
409 | Connection: close
410 | Content-Type: application/x-www-form-urlencoded
411 | Content-Length: 72
412 |
413 | _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
414 | `)
415 | # Yak 的报错处理类似于golang
416 | if err != nil {
417 | die(err)
418 | }
419 | # 发送请求,接收返回数据
420 | reqs, err := fReq.Exec()
421 | if err != nil {
422 | die(err)
423 | }
424 |
425 | for rsp = range reqs {
426 | if rsp.Error != nil {
427 | log.error(rsp.Error)
428 | continue
429 | }
430 | if re.Match(`((uid\=\d*)|(gid\=\d*)|(groups=\d*))`, rsp.ResponseRaw) {
431 | println("found thinkphp vuls...")
432 | break
433 | }
434 | }
435 | ```
436 |
437 | 在获取jsonp的URL后,我们还要判断返回的数据中是否存在敏感信息,这里使用正则表达式**[re](https://www.yaklang.io/docs/buildinlibs/lib_re)**进行匹配
438 |
439 | ```go
440 | re.Match(`(nick)|(pass)|(name)|(data)`,rsp.ResponseRaw)
441 | ```
442 |
443 | 最后的逻辑思维如下:
444 | 1. 首先从流量中筛选出可能存在jsonp的流量
445 | 2. 发送请求包,看返回值是否存在敏感信息
446 | 3. 去掉referer,cookie等信息,看是否还会返回敏感信息【还没写完】
447 |
448 |
449 | 不得不说**Yak**的插件做到了简单快速,在不到半天的情况下,就从 **0基础** 到可以的写出一个脚本来,最后效果如下:
450 |
451 | 
452 |
453 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/SpringDat.md:
--------------------------------------------------------------------------------
1 | Time: 20220531:other:日常记录...:[日常笔记] SpringBootActuator未授权与钓鱼邮件
2 | --------
3 |
4 |
5 |
6 |
7 |
8 | ## 背景
9 |
10 | 鸽了好久了,想写点啥但是也没啥指得写的最近,只好谢谢日常记录水水文字吧 ==
11 |
12 | 修图摄影也鸽了很久,这么长时间就修了几张图,待久了啥也不想干了属于是。
13 |
14 | 
15 |
16 |
17 |
18 | ## 关于 Spring Boot Actuator
19 | `Actuator` 是 `Spring Boot` 提供的服务监控和管理中间件。当 `Spring Boot `应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些系统信息泄露、XXE、甚至是 RCE 等安全问题。`Actuator`提供了13个接口:
20 |
21 | ```bash
22 | GET /actuator 显示能够所有打开的接口
23 | GET /auditevents 显示应用暴露的审计事件 (比如认证进入、订单失败)
24 | GET /beans 描述应用程序上下文里全部的 Bean,以及它们的关系
25 | GET /conditions 就是 1.0 的 /autoconfig ,提供一份自动配置生效的条件情况,记录哪些自动配置条件通过了,哪些没通过
26 | GET /configprops 描述配置属性(包含默认值)如何注入Bean
27 | GET /env 获取全部环境属性
28 | GET /env/{name} 根据名称获取特定的环境属性值
29 | GET /flyway 提供一份 Flyway 数据库迁移信息
30 | GET /liquidbase 显示Liquibase 数据库迁移的纤细信息
31 | GET /health 报告应用程序的健康指标,这些值由 HealthIndicator 的实现类提供
32 | GET /heapdump dump 一份应用的 JVM 堆信息
33 | GET /httptrace 显示HTTP足迹,最近100个HTTP request/repsponse
34 | GET /info 获取应用程序的定制信息,这些信息由info打头的属性提供
35 | GET /logfile 返回log file中的内容(如果 logging.file 或者 logging.path 被设置)
36 | GET /loggers 显示和修改配置的loggers
37 | GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
38 | GET /metrics/{name} 报告指定名称的应用程序度量值
39 | GET /scheduledtasks 展示应用中的定时任务信息
40 | GET /sessions 如果我们使用了 Spring Session 展示应用中的 HTTP sessions 信息
41 | POST /shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
42 | GET /mappings 描述全部的 URI路径,以及它们和控制器(包含Actuator端点)的映射关系
43 | GET /threaddump 获取线程活动的快照
44 | ```
45 |
46 |
47 | `Spring Boot` 也主要分成 `1.X` 和 `2.X` 两个版本, 上文是`1.x`版本。 在 `2.X` 的 `Actuator` 也有所不同:
48 |
49 |
50 |
51 | ```bash
52 | # 只默认开放这两个端口
53 | /actuator // 显示能够所有打开的接口
54 | /actuator/health // 主要用于 查看系统的运行状态
55 | /actuator/info
56 | # 其他的需要手动开启
57 | management.endpoints.web.exposure.include=* // 全部打开
58 | management.endpoints.web.exposure.exclude=beans,trace //打开部分
59 | management.endpoints.web.base-path=/manage // Actuator 默认所有的监控点路径都在/actuator/* 当然如果有需要这个路径也支持定制,设置完重启后,再次访问地址就会变成/manage/*
60 | ```
61 |
62 | 所有的接口都是可以关闭的(默认开启), 在`application.properties` 文件中进行设置
63 | ```bash
64 | management.endpoint.shutdown.enabled=true
65 | ```
66 |
67 | ### heapdump 信息泄漏
68 |
69 | 在`/heapdump` 接口会泄漏内存信息,我们可以通过分析内存在获取敏感信息 , 这里我使用的是`MAC` 中的`MAT` 工具来进行分析
70 |
71 |
72 | * 选择`File` , `Open Heap Dump` , 打开后点击左上角的`OQL`图标,搜索敏感信息命令如下, 点击感叹号图标执行:
73 | ```bash
74 | select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
75 | ```
76 |
77 | 也可以使用[heapdump_tool](https://github.com/wyzxxz/heapdump_tool), [JDumpSpider-1.0-SNAPSHOT-full](https://github.com/whwlsfb/JDumpSpider)等工具 记性分析,但是会有遗漏(数据库信息,堆栈中的用户信息,加密解密秘钥信息),比如下面这条
78 |
79 | ```bash
80 | jdbc:mysql://rds.prod.na.v2.naiot.com:3306/api_test?useUnicode=true&characterEncoding=UTF-8§{user=api_test, password=Midea1234%}
81 | ```
82 |
83 | ### access 阿里云数据泄漏
84 |
85 | 主要还是搜索关键词 `application.aliyun.accesskey` , `application.aliyun.accesssecret` 等等 ,然后使用工具测试。
86 |
87 |
88 | ## 钓鱼流程指南
89 |
90 | BOSS要求做一下简单的钓鱼攻击,并提出流程。目标环境有以下特点:
91 |
92 | 1. 内外网系统隔离,有策略管理
93 | 2. 存在邮件安全网关和邮件沙箱
94 | 3. 邮箱、OA 等系统全部存在内网,VPN等使用PIN码进行验证
95 |
96 | 这样一来,获取权限就比较困难,目标降级为获取敏感信息。采取的方式就很简单了:钓鱼邮件+手机二维码进行钓鱼。
97 |
98 |
99 | ### 使用smtp2go进行钓鱼邮件分发
100 |
101 | 这里主要是用于发件人信息伪造,经过测试发现其实伪造发件人是个很鸡肋的行为: 能点击邮件的憨憨也基本不会在乎发件人,在乎发件人的也不会点击邮件,麻。
102 |
103 | 在使用自己注册[smtp2go](https://www.smtp2go.com/)的邮箱后,建立密码,需要手机号码(支持中国手机号),登陆,增加自己的域名 , 选择 `Settings` , `STMPUsers` , `ADD STMP Users`
104 |
105 | ### 使用gophish进行搭建
106 |
107 | * 官方文档: https://docs.getgophish.com/user-guide/template-reference
108 | * 下载地址: https://github.com/gophish/gophish
109 |
110 | Gopdish 是一个功能强大的开源网络钓鱼框架,可以有一个强大的api,任何操作都能可以通过api来进行,他可以自动化的进行钓鱼,并且能够统计钓鱼的结果,例如邮件钓鱼的送达率,点开率,触发率,成功率等等,然后汇总成一个报表,让安全人员能够清晰明了的了解到本次钓鱼测试结果。默认账号admin密码在运行终端生成,安装命令如下:
111 |
112 | ```bash
113 | // 使用ubuntu 系统
114 | wget https://github.com/gophish/gophish/releases/download/v0.11.0/gophish-v0.11.0-linux-64bit.zip
115 | apt install unzip
116 | unzip gophish-v0.11.0-linux-64bit.zip -d gophish
117 | cd gophish
118 |
119 | ```
120 |
121 | 在启动之前需要在`config.json`中将管理端口的`127.0.0.1:3333`修改为`0.0.0.0:333`,这样可以在外网进行访问(钓鱼端口和协议也是在这里设置)。账号密码在命令行中随机生成。如果不需要https服务也可以在`config.json`关闭。
122 | ```bash
123 | chmod 777 gophish
124 | vi config.json // 修改配置文件
125 | tmux // 新建窗口
126 | ./gophish
127 | ```
128 |
129 |
130 | ### 使用gophish进行邮件伪造发送
131 |
132 | 在`gophish`的流程如下:
133 |
134 | ```bash
135 |
136 | 设置邮件发送服务器 -> 设置钓鱼网站页面 -> 设置邮件模版 -> 添加钓鱼用户组 -> 实施攻击
137 |
138 | ```
139 |
140 | * 登陆后,在`Sending Profiles` 设置发送邮件的邮箱设置,找qq或者网易邮箱都可以进行设置
141 | * 在 `Landing Pages`配置钓鱼网站模版,这里可以使用`import Site` 爬虫爬取模版,但是有一些不准确。下面的选项为抓取密码。注意,在加载钓鱼模版 的时候,有一个加载连接的选项需要勾选,否则使用`gophish`很难接收到数据。再就是需要在页面中存在连接,`gophish`会替换成自己的网址,没有的话就无法返回数据。 最后有一个跳转选项,也可以让中招者在输入敏感数据后跳转到真正的页面上去(总之就是能全勾选就全勾上)
142 | 在钓鱼邮件建立这里还需要注意一点: 接收的账号密码格式也是需要一定程度的修改,否则就抓不到获取的密码,最好还是from表单进行提交的数据,比如最常见的格式如下:
143 | ```html
144 |
149 | ```
150 | 上述的请求格式是可以进行转换的,但是后续抓包可以大致看到数据是经过POST传入的, 总之, 要是自动的没生效,那就手动修改传参就行了 :
151 | ```http
152 | POST /?rid=HmS249p HTTP/1.1
153 |
154 | Host: XX.XX.XX.XX
155 | User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
156 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
157 | Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
158 | Accept-Encoding: gzip, deflate
159 | Content-Type: application/x-www-form-urlencoded
160 | Content-Length: 42
161 | Origin: http://XX.XX.XX.XX
162 | Connection: close
163 | Referer: http://XX.XX.XX.XX/?rid=HmS249p
164 | Cookie: __aegis_uid=1652952007292-7968
165 | Upgrade-Insecure-Requests: 1
166 |
167 | username=testaaa&password=qqqqqq&bianhao=1
168 | ```
169 |
170 | * 在 `Email Templates`配置钓鱼网站模版,这里可以使用`import Email` 加载 `eml` 格式的邮件信息,这里需要注意邮件编码格式问题,可以先发送几个实验。这里需要勾选`Add Tracking Image` 这个选项后就可以根据图像知道这封邮件有没有被打开了(内外网隔离无效)。这里要注意 ,当我们想要使用钓鱼功能的时候,就需要在邮件模板的HTML中假如如下的内容来获取钓鱼网址
171 | ```bash
172 | {{.URL}}
173 | ```
174 |
175 | * `campaigns` 新建一个钓鱼攻击活动,需要输入上文编写的邮件模版名字,钓鱼页面,钓鱼网址,发送日期,配置文件,使用的组。这里需要注意:还是需要在`longing page` 页面进行设置,否则无法正常发送页面的, (重点)URL:
176 | URL 是用来替换选定钓鱼邮件模板中超链接的值 ,这里的URL需要填写当前运行gophish脚本主机的ip。因为启动gophish后,gophish默认监听了3333和80端口,其中3333端口是后台管理系统,而80端口就是用来部署钓鱼页面的。
177 | 当URL填写了http://主机IP/,并成功创建了当前的钓鱼事件后。gophish会在主机的80端口部署当前钓鱼事件所选定的钓鱼页面,并在发送的钓鱼邮件里,将其中所有的超链接都替换成部署在80端口的钓鱼页面的url。所以,这里的URL填写我本地当前运行gophish主机的IP对应的url,即`http://192.168.141.1` , 再就是倒是第三行的 `Send Emails By ` 这里可以进行 时间延后发送,这样发送的邮件就是邮件数量除以这段时间的发送,避免了被封的危险。最后的结果在展示面板进行观看。
178 |
179 |
180 | ### 使用EwoMail搭建邮件服务器
181 |
182 | 要是想整点真实的,可以考虑自己购买域名+国外服务搭建邮箱(国内的服务器不行,25端口不给开)进行测试 , 这是我的搭建环境:
183 |
184 | * 购买服务器需要开启25端口(阿里腾讯等云服务器厂商一般都不给开)
185 | * 需要纯净centos7/8服务器
186 | * centos7/8服务器需要关闭默认防火墙
187 |
188 | **命令如下**:
189 |
190 | ```bash
191 | systemctl status firewalld // 查看防火墙设置
192 | systemctl stop firewalld // 关闭防火墙
193 | systemctl disable firewalld // 关闭防火墙
194 | #mail.symail.club 换成 mail.你的域名
195 | hostnamectl set-hostname mail.polarnightsec.com
196 | #修改hosts
197 | vi /etc/hosts
198 | #把symail.club 全换成你的域名,在下加入这一行, esc+:wq 进行保存
199 | 127.0.0.1 mail.polarnightsec.com polarnightsec.com smtp.polarnightsec.com imap.polarnightsec.com
200 | # 安装git
201 | yum -y install git
202 | # git下载EwoMail
203 | git clone https://github.com/gyxuehu/EwoMail.git
204 | cd EwoMail/install
205 | #下面的symail.club请换成你注册的域名
206 | #要是外网服务器 ,设置en参数解析
207 | #sh ./start.sh polarnightsec.com en
208 | sh ./start.sh polarnightsec.com
209 | ```
210 | **域名解析**
211 |
212 | 参考`EwoMail`官方配置解析方式: `v=spf1 ip4:45.32.212.223 -all`
213 |
214 | **搭建进入**
215 |
216 | 默认账号`admin`密码`ewomail123`
217 |
218 | ```bash
219 | 管理端:http://45.32.212.223:8010/Center/Index/login
220 | 邮件端:http://45.32.212.223:8000/
221 | ```
222 |
223 |
224 |
225 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/TheBeginningOfEverything.md:
--------------------------------------------------------------------------------
1 | Time: 20211217:other:记录下这一切的开始...:开始:我的第一篇博客
2 | --------
3 |
4 |
5 | # 背景
6 |
7 | 离开北京后,能明显感觉到节奏慢了很多很多,也有了一些时间来干自己想干的事情,就比如现在 - 好好弄下我的博客。
8 |
9 | 之前主要是为了简历好看而建立的,不过现在也不需要通过这些东西来展现自己的能力了,反而可以实现博客真正的功能来 - 用它来记录生活。
10 |
11 |
12 | # 技术环节
13 |
14 | 之前的博客是静态部署在**GitHub**上面的,效果很好但是问题也很明显:有时候需要科学上网才能访问。
15 |
16 | 于是有了现在的计划:自己写个小轮子,并搞个好点的VPS
17 |
18 | 目前使用 **beego** 框架 , 照着几个 **GitHub** 的博客抄抄删删, 就有了现在的博客。 不能说完美无缺,只能说勉强能用,以后慢慢改吧 。
19 |
20 |
21 |
22 | # 未来要做的
23 |
24 | * 拍摄一组照片,发布出来
25 | * 完成 **浏览量** , **标签搜索** , **DNSlog** ,**相邻文章**, **RSS**等功能
26 | * 要健身,目标瘦20斤
27 |
28 | 最后附上一张离京时拍摄的照片,也希望疫情能早日过去吧 :
29 |
30 | 
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/WinhexDataRecovery.md:
--------------------------------------------------------------------------------
1 | Time: 20200913:other:大学打取证比赛学的技能,属于炒冷饭了。这里就是记录下...:winhex之从数据恢复到删盘跑路
2 | --------
3 |
4 |
5 | # 背景
6 |
7 | 首发于公众号**酒仙桥六号部队**: https://mp.weixin.qq.com/s/Fw9zbUMt0qp5JMEpyfzxRg
8 |
9 |
10 | # 什么是WINHEX
11 |
12 | WINHEX 是一款用于查看和编辑底层十六进制数据的软件,我们可以利用这个软件修改文件格式数据,从而达到数据恢复的效果。
13 | 当然,WINHEX也不仅仅用于数据恢复,也可以用于磁盘恢复,RAID重组,镜像转换,CTF 隐写杂项等等。WINHEX 支持中文,在设置栏中进行修改.
14 |
15 | * 下载网址: https://www.x-ways.net/winhex/index-m.html
16 |
17 | WINHEX 基本界面如下,我们数据恢复用到的功能很少因此只介绍一部分。
18 |
19 | 
20 |
21 | 在安装和了解WINHEX的基本结构后,我们就可以愉快的进行数(删)据(盘)恢(跑)复(路)了。
22 |
23 |
24 |
25 |
26 | # winhex自动数据恢复
27 |
28 | 如同字面意思一样,自动恢复就是利用HINHEX 自动在存储数据的扇区中搜索文件类型(根据文件头进行判断),并自动进行查找数据进行恢复。自动回复不需要我们掌握技术原理,操作方式如下:
29 |
30 | 首先打开你错删文件存储的磁盘,我这里删除的是C盘的文件,因此需要打开的C盘:
31 |
32 | 
33 |
34 | 然后选择工具 -> 磁盘工具 -> 按文件类型进行恢复
35 | 这里要注意恢复的文件最好是在一个新的磁盘中,以免造成文件覆盖。
36 |
37 | 
38 |
39 | 选中我们要恢复的数据类型(可以多选),选中输出目录,点击确定:
40 |
41 | 
42 |
43 | 恢复速度和磁盘大小有关,耐心等待数据恢复就好:
44 |
45 | 
46 |
47 | 虽然恢复出来了,但是问题还是有很多的: 按照文件类型恢复的数据量多而复杂(因为是无差别寻找),在其中查找我们想要的数据也要花费不少时间;按照文件类型恢复的数据名会丢失(因为在文件系统中,数据内容和数据名不是存放在一个地方)。
48 | 因此,如果我们想完整的恢复特定的文件,还是需要进行手动操作恢复的。而在进行手动恢复之前,我们需要了解以下基础知识。
49 |
50 | ## 什么是文件系统
51 |
52 | 就像电脑对应的操作系统一样,我们日常使用的移动介质中,也存在相应的文件系统,每种文件系统有自己的存储方式(大同小异),而比较常见的文件系统如下:
53 |
54 | 1. FAT32/64 常见于U盘,内存卡等文件系统
55 | 2. NTFS WIN的文件系统
56 | 3. APFS MAC的文件系统
57 | 由于文章篇幅原因,这里我们只讲解最常见的HTFS文件系统,也就是使用WINHEX基于WINDOWS的数据恢复。既然我们知道数据是存储在NTFS系统中,那么我们就要了解下NTFS文件系统的存储规则。
58 |
59 |
60 | ## NTFS 文件存储规则
61 |
62 | 在使用WINHEX查看NTFS文件系统的时候,我们能看见一些以$开头的文件,这些文件就是NTFS操作系统的元文件,元文件用于管理存储介质中的内容:
63 |
64 | 
65 |
66 | 其中每个元文件的功能如下:
67 |
68 | 1. $MFT 又叫主文件表,用于存储数据名和文件区间的索引(简单理解就是这里存放着文件名信息在内的文件属性信息,是我们数据恢复重点关注的对象)。
69 | 2. MFTMIRR就是 MFT的备份文件(但是只备份一部分)
70 | 3. $BOOT 引导文件,记录了用于引导的数据
71 | 4. DBR备份文件,其中DBR 源文件在0号扇区
72 |
73 | ## $MFT 元文件结构
74 |
75 | 上文我们知道文件属性存储在MFT,那么接下来我们需要了解部分数据属性具体在MFT 中的存储状况:在WINHEX中表现如下:
76 |
77 | 
78 |
79 | 其中文件名是存储在30属性中的,而文件内容是存储在80属性中,然而80属性的容量一般无法存储文件所有的数据,因此,这里涉及到了一个“簇流运行”的概念。
80 |
81 | ## 什么是簇流运行
82 |
83 | “簇流”是指存放数据的一块区域,而“簇流运行”就是指记录“簇流”文件具体在那个位置的数据(这里涉及了80属性的一个“常驻属性”和“非常驻属性”的概念)。
84 | 简单说,“簇流运行”就是指文件存储位置的一段字节。而“簇流运行”中存储数据有自己的一套规则。举个例子,某“簇流运行”结构如下:
85 |
86 | 
87 |
88 |
89 | ## 删除文件后NTFS的变化
90 |
91 | 在我们彻底删除一个文件后,在NTFS中到底是有什么变化呢?
92 |
93 | 在彻底删除一个文件后,只是在$MFT 中的10属性发生变化了,表示这个文件可以被写入数据(这也是为什么我们不建议对要数据恢复的磁盘进行写入操作的原因,害怕会覆盖掉我们要进行数据恢复的文件)。但是数据和数据属性仍然存在。也就是数据恢复的基础。
94 |
95 | 了解NTFS文件的存储规律后,接下来数据恢复的思路就很明显了:我们使用WINHEX定位到MFT或者MFTMIRR文件,再从MFT/MFTMIRR文件中找到要恢复的文件属性和数据存储扇区,导出扇区中的数据进行数据恢复了。
96 |
97 | 可能听起来有点懵逼,所以我们接下来手动尝试一遍。
98 |
99 | # 使用winhex手工数据恢复
100 |
101 | 首先,shift+delect彻底删除一张图片作为数据恢复的对象:
102 |
103 | 
104 |
105 | 使用winhex 打开被删除文件的磁盘,定位到$MFT 项目,使用winhex搜索文件名:WechatIMG648.jpeg 转换为十六进制:
106 |
107 | 点击任务栏中的查找十六进制数值,搜索十六进制的文件名,选择向下搜索,点击确定。
108 |
109 |
110 | 
111 |
112 | 找到文件80属性,找到簇流运行的文件
113 |
114 | 
115 |
116 |
117 | 5DECCA(这里读取扇区是需要倒着顺序的)转换成十进制为6155466,使用winhex跳转
118 |
119 | 
120 |
121 | 这里我们看到JFIF文件头就能判断是文件开头了,而文件大小是09,转换成十进制也是09,这里我们首先右键,选择标记为文件起始块:
122 |
123 |
124 | 
125 |
126 | 跳转到文件结尾(6155466+9),扇区,右键选择结尾。右键选择编辑,置入新文件,保存。
127 |
128 | 
129 |
130 | 接下来就能看见我们数据恢复出来的文件了~
131 |
132 | 
133 |
134 |
135 |
136 |
137 |
138 |
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/about.html:
--------------------------------------------------------------------------------
1 | # 关于我
2 |
3 | 网络安全/CTF/SRC/视频制作/吉他
4 |
5 | 以上内容全不精通 ,互联网安全从业者,由于不想「 卷 」了而北漂归来,现在基本上啥都学一点。
6 |
7 |
8 | # 会记录些什么
9 |
10 | * 放一些网络安全的学习笔记
11 | * 拍摄的「 风景 」或者「 人物 」照片
12 | * 实验一些功能,作为我的公开日记
13 |
14 |
15 | # 假如或许想要联系我
16 |
17 | 蓝队老哥们不要溯源我了,我已经金盆洗手了属于是 :)
18 |
19 | * email (并不常用): shang_zeng@foxmail.com
20 | * 微信 (说明来源): shangzeng_club
21 |
22 | # I Hacked
23 |
24 |
25 |
26 | | BiliBili | 百度 | 腾讯 | 马蜂窝 | 网易 | 法大大 | 360 | 微博 | 奇安信 | 贝贝 | 格力 |
27 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
28 | |  |  |  |  |  |  |  |  |  |  |
29 |
30 | # 版权说明
31 |
32 | 本博客所有文章除特别声明外,均采用「 [知识共享署名4.0](https://creativecommons.org/licenses/by/4.0/) 」创作共享协议。通俗地讲,只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作,允许商业性使用。如有其他侵权请联系删除。
--------------------------------------------------------------------------------
/ShangzengBlog/arctales/friends.html:
--------------------------------------------------------------------------------
1 | # 朋友们
2 |
3 | * [7i4n2h3n9](http://blog.tianzheng.cool/) 》》 二进制方向的鸽子精
4 | * [shawroot ](https://www.shawroot.cc/) 》》 做CTF的妹子
5 | * [purplet ](http://purplet.top/) 》》 憨憨的红队带佬
6 |
7 |
8 | # 值得一看的链接
9 |
10 | * 鸽子精编写爬虫中 》》进度0.2%
11 | * [Security Blog ](https://github.com/shangzeng/SecurityBlog) 》》在写出来之前可以看看这个~
12 |
13 | # 版权说明
14 |
15 | 本博客所有文章除特别声明外,均采用「 [知识共享署名4.0](https://creativecommons.org/licenses/by/4.0/) 」创作共享协议。通俗地讲,只要在使用时署名,那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作,允许商业性使用。如有其他侵权请联系删除。
--------------------------------------------------------------------------------
/ShangzengBlog/conf/app.conf:
--------------------------------------------------------------------------------
1 | appname = ShangzengBlog
2 | httpport = 80
3 | runmode = dev
4 | DNSlogToke = jljcxy@stu
5 | CeyeToken = 597a2b94b1816bf0638574399daa24dd
6 | Views = 1001
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ShangzengBlog/controllers/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/controllers/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/controllers/articleshow.go:
--------------------------------------------------------------------------------
1 | package controllers
2 |
3 | import (
4 | "bufio"
5 | "github.com/astaxie/beego"
6 | "github.com/russross/blackfriday"
7 | "io/ioutil"
8 | "os"
9 | "sort"
10 | "strconv"
11 | "strings"
12 | "fmt"
13 | )
14 |
15 |
16 |
17 | type MainController struct {
18 | beego.Controller
19 | }
20 |
21 | // 自我介绍页面 AboutMe
22 | func (c *MainController) AboutMe() {
23 | AddViews()
24 | fileread, _ := ioutil.ReadFile("arctales/about.html")
25 | unsafe := blackfriday.MarkdownCommon(fileread)
26 | c.Data["Content"] = string(unsafe)
27 | c.Data["Number"] = lognumber()
28 | c.TplName = "page.html"
29 | }
30 |
31 | // 友链 Friends
32 | func (c *MainController) Friends() {
33 | AddViews()
34 | fileread, _ := ioutil.ReadFile("arctales/friends.html")
35 | unsafe := blackfriday.MarkdownCommon(fileread)
36 | c.Data["Content"] = string(unsafe)
37 | c.Data["Number"] = lognumber()
38 | c.TplName = "page.html"
39 | }
40 |
41 | // 写类型,用于存储文章名 文章时间 文章标签
42 | type ArctlsInfo struct {
43 | Name string // 文件名字
44 | ArcName string // 文章标题
45 | Time string // 文章编写时间
46 | Tag string // 文章标签
47 | Information string // 文章介绍信息
48 | }
49 |
50 | // 获取信息
51 | // 在这里最好还要根据时间把文章进行排名
52 | func GetArctlsInfo() []ArctlsInfo {
53 | var ArctlsInfos []ArctlsInfo
54 | for _, filename := range findarctlename() {
55 | fileread, _ := ioutil.ReadFile("arctales/"+filename+".md")
56 | title := strings.Split(string(fileread), "--------")[0]
57 | titleline := strings.Split(title, ":")
58 | ArctlsInfos= append(ArctlsInfos,ArctlsInfo{Name:filename,Time:titleline[1],Tag:titleline[2],Information:titleline[3],ArcName:titleline[4]})
59 | fmt.Println(ArctlsInfos)
60 | }
61 | // 文章按照时间顺序进行排序
62 | sort.SliceStable(ArctlsInfos, func(i, j int) bool {
63 | return ArctlsInfos[i].Time > ArctlsInfos[j].Time
64 | })
65 | return ArctlsInfos
66 | }
67 |
68 | //尝试显示首页的展示
69 | func (c *MainController) Index() {
70 | var (
71 | page int // 页面设置
72 | //number int // 浏览量设置
73 | )
74 | // GetInt 是beego中的函数,在默认无的情况下为 1 , 这里主要用于限制页面刷领
75 | if page, _ = c.GetInt("page"); page < 1 {
76 | page = 1
77 | }
78 |
79 | AddViews()
80 | c.Data["CurrentPage"] = page
81 | c.Data["Len"] = len(GetArctlsInfo())
82 | c.Data["Title"] = "Shangzeng's blog"
83 | c.Data["Number"] = lognumber()
84 | c.Data["Data"] = GetArctlsInfo()
85 | c.TplName = "index.html"
86 | }
87 |
88 |
89 |
90 |
91 |
92 | // 拆解成为两种: 一个函数记录浏览量并写入 配置文件 一个函数读取
93 | // 查看日志浏览量
94 | func lognumber() int {
95 | file, _ := os.Open("view")
96 | fileScanner := bufio.NewScanner(file)
97 | var lines []string
98 | for fileScanner.Scan() {
99 | lines = append(lines, fileScanner.Text())
100 | }
101 | intVar, _ := strconv.Atoi(lines[0])
102 | //保存浏览量并输出
103 | return intVar
104 | }
105 | // 增加日志量
106 | func AddViews() {
107 | add := lognumber() + 1
108 | tracefile(strconv.Itoa(add))
109 | }
110 | func tracefile(str_content string) {
111 | fd,_:=os.OpenFile("view",os.O_WRONLY|os.O_TRUNC|os.O_APPEND,0644)
112 | fd_content:=str_content
113 | buf:=[]byte(fd_content)
114 | fd.Write(buf)
115 | fd.Close()
116 | }
117 |
118 | // 遍历获取 arctales 文件夹中以 md 结尾的文件名 ,准备输出到首页上
119 | func findarctlename() (files []string){
120 | file, err := ioutil.ReadDir("arctales")
121 | if err != nil {
122 | beego.Info(err)
123 | }
124 | for _, file := range file {
125 | //判断是否是md 文件
126 | if strings.Index(file.Name(), ".md") > -1 {
127 | //fmt.Println(strings.Trim(file.Name(),".md"))
128 | files = append(files,strings.Trim(file.Name(),".md"))
129 | }
130 | }
131 | return files
132 | }
133 |
134 | // 寻找文件是否正确
135 | func findarctleconnect(name string) (bool) {
136 | file, err := ioutil.ReadDir("arctales")
137 | if err != nil {
138 | beego.Info(err)
139 | }
140 | for _, file := range file {
141 | if file.Name() == name {
142 | return true
143 | }
144 | }
145 | return false
146 | }
147 |
148 | // 并返回 md 内容
149 | func readarctleconnect(name string) (file string) {
150 | fileread, _ := ioutil.ReadFile("arctales/"+name)
151 | title := strings.Split(string(fileread), "--------")[1]
152 | unsafe := blackfriday.MarkdownCommon([]byte(title))
153 | // 内容处理下 , "---" 之前的不要了
154 | //fmt.Println(string(unsafe))
155 | return string(unsafe)
156 | }
157 |
158 | // 实现动态解析分析 ArticleInfo
159 | func (c *MainController) ArticleInfo() {
160 | AddViews()
161 | slug := c.Ctx.Input.Param(":slug")+".md"
162 | // 根据 slug 读取 相关的 md 文件代码, 如果不存在返回 404
163 | // 先判断文件是是否存在
164 | if findarctleconnect(slug) {
165 | c.Data["Content"] = readarctleconnect(slug)
166 | c.Data["Title"] = check(slug).ArcName
167 | c.Data["Time"] = check(slug).Time
168 | c.Data["Tag"] = check(slug).Tag
169 | c.Data["Information"] = check(slug).Information
170 | c.Data["Number"] = lognumber()
171 | c.TplName = "article.html"
172 | return
173 | }
174 | c.TplName = "404.html"
175 | }
176 |
177 | // 循环判断GetArctlsInfo() 中内容返回合适的
178 | func check(filename string ) ArctlsInfo {
179 | for _, name := range GetArctlsInfo() {
180 | if name.Name+".md" == filename {
181 | return name
182 | }
183 | }
184 | return ArctlsInfo{}
185 | }
186 |
187 | // 文章分类展示 Categories
188 | func (c *MainController) Categories() {
189 | AddViews()
190 | tag := c.Ctx.Input.Param(":link")
191 | // 搜索包含关键词的所有文章
192 | //frintln(checkTag(tag))
193 | c.Data["Tag"] = tag
194 | c.Data["Data"] = checkTag(tag)
195 | c.Data["Number"] = lognumber()
196 | c.TplName = "category.html"
197 | }
198 |
199 | // 循环判断GetArctlsInfo() 中内容返回合适的 tag
200 | func checkTag(tag string ) []ArctlsInfo {
201 | var TagArctlsInfo []ArctlsInfo
202 | for _, name := range GetArctlsInfo() {
203 | if name.Tag == tag {
204 | //return name
205 | TagArctlsInfo = append(TagArctlsInfo ,name)
206 | }
207 | }
208 | return TagArctlsInfo
209 | }
210 |
211 |
--------------------------------------------------------------------------------
/ShangzengBlog/controllers/dnslog.go:
--------------------------------------------------------------------------------
1 | package controllers
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "github.com/astaxie/beego"
7 | "io/ioutil"
8 | "math/rand"
9 | "net/http"
10 | "strconv"
11 | "time"
12 | )
13 |
14 | type DNSController struct {
15 | beego.Controller
16 | }
17 |
18 | type Autogenerated struct {
19 | Meta struct {
20 | Code int `json:"code"`
21 | Message string `json:"message"`
22 | } `json:"meta"`
23 | Data []struct {
24 | ID string `json:"id"`
25 | Name string `json:"name"`
26 | RemoteAddr string `json:"remote_addr"`
27 | CreatedAt string `json:"created_at"`
28 | } `json:"data"`
29 | }
30 |
31 |
32 | func (c *DNSController) Index() {
33 | if c.GetString("token") == beego.AppConfig.String("DNSlogToke") {
34 | domain ,_ := c.GetInt("domainname")
35 | strdomain := strconv.Itoa(domain)
36 | if strdomain != "0" {
37 | c.Data["Domainname"] = strdomain
38 | // 解析返回请求
39 | var ReqJson Autogenerated
40 | errs := json.Unmarshal(GetCeyeData(strdomain), &ReqJson)
41 | if errs != nil {
42 | fmt.Println(errs)
43 | }
44 | c.Data["DomainInfo"] = ReqJson.Data
45 | c.Data["Token"] = c.GetString("token")
46 | c.TplName = "dnslog.html"
47 | return
48 | } else {
49 | // 这里是获取域名信息 输出一个随机的三级域名
50 | c.Data["Domainname"] = CreateCaptcha()
51 | c.Data["Token"] = c.GetString("token")
52 | c.TplName = "dnslog.html"
53 | return
54 | }
55 | } else {
56 | c.Ctx.Redirect(302, "/")
57 | }
58 | }
59 |
60 | // 刷新记录获取
61 | func GetCeyeData(filter string) []byte {
62 | //http://api.ceye.io/v1/records\?token\=597a2b94b1816bf0638574399daa24d3\&type\=dns\&filter\=jljcxy
63 | CeyeToken := beego.AppConfig.String("CeyeToken")
64 | RequesrUrl := "http://api.ceye.io/v1/records?token="+CeyeToken+"&type=dns&filter="+filter
65 | resp, err := http.Get(RequesrUrl)
66 | if err != nil {
67 | fmt.Println("HTTP GET ",err)
68 | }
69 | defer resp.Body.Close()
70 | body, _ := ioutil.ReadAll(resp.Body)
71 | //fmt.Println(string(body))
72 | return body
73 | }
74 |
75 | // 生成六位随机数字
76 | func CreateCaptcha() string {
77 | return fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
78 | }
79 |
--------------------------------------------------------------------------------
/ShangzengBlog/controllers/feed.go:
--------------------------------------------------------------------------------
1 | package controllers
2 |
3 | import (
4 | "github.com/astaxie/beego"
5 | "github.com/gorilla/feeds"
6 | "time"
7 | )
8 |
9 | type FeedController struct {
10 | beego.Controller
11 | }
12 |
13 |
14 | func (c *FeedController) Index() {
15 | now := time.Now()
16 | feed := &feeds.Feed{
17 | Title: "shangzeng blog",
18 | Link: &feeds.Link{Href: "http://shangzeng.club"},
19 | Description: "discussion about security, photos",
20 | Author: &feeds.Author{Name: "shangzeng", Email: "shang_zeng@foxmail.com"},
21 | Created: now,
22 | }
23 | lennum := len(GetArctlsInfo())
24 | for i:=0;ili{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
--------------------------------------------------------------------------------
/ShangzengBlog/static/css/md02.css:
--------------------------------------------------------------------------------
1 | html{font-size:62.5%;-webkit-text-size-adjust:none;}
2 | body,h1,h2,h3,h4,h5,h6,hr,p,dl,dt,dd,ul,ol,li,form,fieldset,input,label,table,td,th{margin:0;padding:0;font-weight:normal;}
3 | body,input,textarea,button,td{-webkit-text-size-adjust:none;}
4 | table{text-align: center;margin:0 auto;}
5 | a{text-decoration:none;}
6 | em,i,s{font-style:normal;}
7 | table{border-collapse:collapse;}
8 | td{empty-cells:show;}
9 | button{border:0;}
10 | i,cite{font-style:normal;}
11 | input[type="text"],input[type="number"],input[type="password"],input[type="button"]{-webkit-appearance:none;}
12 | input::-webkit-input-placeholder {color:#b6b6b6;}
13 | :-moz-placeholder {color:#b6b6b6;}
14 | ::-moz-placeholder {color:#b6b6b6;}
15 | a,img,button,input,textarea{-webkit-tap-highlight-color:rgba(255,255,255,0);}
16 | input,textare{-webkit-appearance:none;border-radius:0;}
17 | .fix{clear:both;float:none;height:1px;width:100%;line-height:1px;}
18 | body{width:98%;margin:10px auto;}
19 |
20 | @font-face {
21 | font-family: fontawesome-mini;
22 | src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAzUABAAAAAAFNgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABbAAAABwAAAAcZMzaOEdERUYAAAGIAAAAHQAAACAAOQAET1MvMgAAAagAAAA+AAAAYHqhde9jbWFwAAAB6AAAAFIAAAFa4azkLWN2dCAAAAI8AAAAKAAAACgFgwioZnBnbQAAAmQAAAGxAAACZVO0L6dnYXNwAAAEGAAAAAgAAAAIAAAAEGdseWYAAAQgAAAFDgAACMz7eroHaGVhZAAACTAAAAAwAAAANgWEOEloaGVhAAAJYAAAAB0AAAAkDGEGa2htdHgAAAmAAAAAEwAAADBEgAAQbG9jYQAACZQAAAAaAAAAGgsICJBtYXhwAAAJsAAAACAAAAAgASgBD25hbWUAAAnQAAACZwAABOD4no+3cG9zdAAADDgAAABsAAAAmF+yXM9wcmVwAAAMpAAAAC4AAAAusPIrFAAAAAEAAAAAyYlvMQAAAADLVHQgAAAAAM/u9uZ4nGNgZGBg4ANiCQYQYGJgBEJuIGYB8xgABMMAPgAAAHicY2Bm42OcwMDKwMLSw2LMwMDQBqGZihmiwHycoKCyqJjB4YPDh4NsDP+BfNb3DIuAFCOSEgUGRgAKDgt4AAB4nGNgYGBmgGAZBkYGEAgB8hjBfBYGCyDNxcDBwMTA9MHhQ9SHrA8H//9nYACyQyFs/sP86/kX8HtB9UIBIxsDXICRCUgwMaACRoZhDwA3fxKSAAAAAAHyAHABJQB/AIEAdAFGAOsBIwC/ALgAxACGAGYAugBNACcA/wCIeJxdUbtOW0EQ3Q0PA4HE2CA52hSzmZDGe6EFCcTVjWJkO4XlCGk3cpGLcQEfQIFEDdqvGaChpEibBiEXSHxCPiESM2uIojQ7O7NzzpkzS8qRqnfpa89T5ySQwt0GzTb9Tki1swD3pOvrjYy0gwdabGb0ynX7/gsGm9GUO2oA5T1vKQ8ZTTuBWrSn/tH8Cob7/B/zOxi0NNP01DoJ6SEE5ptxS4PvGc26yw/6gtXhYjAwpJim4i4/plL+tzTnasuwtZHRvIMzEfnJNEBTa20Emv7UIdXzcRRLkMumsTaYmLL+JBPBhcl0VVO1zPjawV2ys+hggyrNgQfYw1Z5DB4ODyYU0rckyiwNEfZiq8QIEZMcCjnl3Mn+pED5SBLGvElKO+OGtQbGkdfAoDZPs/88m01tbx3C+FkcwXe/GUs6+MiG2hgRYjtiKYAJREJGVfmGGs+9LAbkUvvPQJSA5fGPf50ItO7YRDyXtXUOMVYIen7b3PLLirtWuc6LQndvqmqo0inN+17OvscDnh4Lw0FjwZvP+/5Kgfo8LK40aA4EQ3o3ev+iteqIq7wXPrIn07+xWgAAAAABAAH//wAPeJyFlctvG1UUh+/12DPN1B7P3JnYjj2Ox4/MuDHxJH5N3UdaEUQLqBIkfQQioJWQ6AMEQkIqsPGCPwA1otuWSmTBhjtps2ADWbJg3EpIXbGouqSbCraJw7kzNo2dRN1cnXN1ZvT7zuuiMEI7ncizyA0URofRBJpCdbQuIFShYY+GZRrxMDVtih5TwQPHtXDFFSIKoWIbuREBjLH27Ny4MsbVx+uOJThavebgVrNRLAiYx06rXsvhxLgWx9xpfHdrs/ekc2Pl2cpPCVEITQpwbj8VQhfXSq2m+Wxqaq2D73Kne5e3NjHqQNj3CRYlJlgUl/jRNP+2Gs2pNYRQiOnmUaQDqm30KqKiTTWPWjboxnTWpvgxjXo0KrtZXAHt7hwIz0YVcj88JnKlJKi3NPAwLyDwZudSmJSMMJFDYaOkaol6XtESx3Gt1VTytdZJ3DCLeaVhVnCBH1fycHTxFXwPX+l2e3d6H/TufGGmMTLTnbSJUdo00zuBswMO/nl3YLeL/wnu9/limCuD3vC54h5NBVz6Li414AI8Vx3iiosKcQXUbrvhFFiYb++HN4DaF4XzFW0fIN4XDWJ3a3XQoq9V8WiyRmdsatV9xUcHims1JloH0YUa090G3Tro3mC6c01f+YwCPquINr1PTaCP6rVTOOmf0GE2dBc7zWIhji3/5MchSuBHgDbU99RMWt3YUNMZMJmx92YP6NsHx/5/M1yvInpnkIOM3Z8fA3JQ2lW1RFC1KaBPDFXNAHYYvGy73aYZZZ3HifbeuiVZCpwA3oQBs0wGPYJbJfg60xrKEbKiNtTe1adwrpBRwlAuQ3q3VRaX0QmQ9a49BTSCuF1MLfQ6+tinOubRBZuWPNoMevGMT+V41KitO1is3D/tpMcq1JHZqDHGs8DoYGDkxJgKjHROeTCmhZvzPm9pod+ltKm4PN7Dyvvldlpsg8D+4AUJZ3F/JBstZz7cbFRxsaAGV6yX/dkcycWf8eS3QlQea+YLjdm3yrOnrhFpUyKVvFE4lpv4bO3Svx/6F/4xmiDu/RT5iI++lko18mY1oX+5UGKR6kmVjM/Zb76yfHtxy+h/SyQ0lLdpdKy/lWB6szatetQJ8nZ80A2Qt6ift6gJeavU3BO4gtxs/KCtNPVibCtYCWY3SIlSBPKXZALXiIR9oZeJ1AuMyxLpHIy/yO7vSiSE+kZvk0ihJ30HgHfzZtEMmvV58x6dtqns0XTAW7Vdm4HJ04OCp/crOO7rd9SGxQAE/mVA9xRN+kVSMRFF6S9JFGUtthkjBA5tFCWc2l4V43Ex9GmUP3SI37Jjmir9KqlaDJ4S4JB3vuM/jzyH1+8MuoZ+QGzfnvPoJb96cZlWjMcKLfgDwB7E634JTY+asjsPzS5CiVnEWY+KsrsIN5rn3mAPjqmQBxGjcGKB9f9ZxY3mYC2L85CJ2FXIxKKyHk+dg0FHbuEc7D5NzWUX32WxFcWNGRAbvwSx0RmIXVDuYySafluQBmzA/ssqJAMLnli+WIC90Gw4lm85wcp0qjArEDPJJV/sSx4P9ungTpgMw5gVC1XO4uULq0s3v1rqLi0vX/z65vlH50f8T/RHmSPTk5xxWBWOluMT6WiOy+tdvWxlV/XQb3o3c6Ssr+r6I708GsX9/nzp1tKFh0s3v7m4vAy/Hnb/KMOvc1wump6Il48K6mGDy02X9Yd65pa+nQIjk76lWxCkG8NBCP0HQS9IpAAAeJxjYGRgYGBhcCrq214Qz2/zlUGenQEEzr/77oug/zewFbB+AHI5GJhAogBwKQ0qeJxjYGRgYH3/P46BgZ0BBNgKGBgZUAEPAE/7At0AAAB4nGNngAB2IGYjhBsYBAAIYADVAAAAAAAAAAAAAFwAyAEeAaACCgKmAx4DggRmAAAAAQAAAAwAagAEAAAAAAACAAEAAgAWAAABAAChAAAAAHiclZI7bxQxFIWPd/JkUYQChEhIyAVKgdBMskm1QkKrRETpQiLRUczueB/K7HhlOxttg8LvoKPgP9DxFxANDR0tHRWi4NjrPIBEgh1p/dm+vufcawNYFWsQmP6e4jSyQB2fI9cwj++RE9wTjyPP4LYoI89iWbyLPIe6+Bh5Hs9rryMv4GbtW+RF3EhuRa7jbrIbeQkPkjdUETOLnL0Kip4FVvAhco1RXyMnSPEz8gzWxE7kWTwUp5HnsCLeR57HW/El8gJWa58iL+JO7UfkOh4l9yMv4UnyEtvQGGECgwF66MNBooF1bGCL1ELB/TYU+ZBRlvsKQ44Se6jQ4a7hef+fh72Crv25kp+8lNWGmeKoOI5jJLb1aGIGvb6TjfWNLdkqdFvJw4l1amjlXtXRZqRN7lSRylZZyhBqpVFWmTEXgWfUrpi/hZOQXdOd4rKuXOtEWT3k5IArPRzTUU5tHKjecZkTpnVbNOnt6jzN8240GD4xtikvZW56043rPMg/dS+dlOceXoR+WPbJ55Dsekq1lJpnypsMUsYOdCW30o103Ytu/lvh+5RWFLfBjm9/N8hJntPhvx92rnoE/kyHdGasGy754kw36vsVf/lFeBi+0COu+cfgQr42G3CRpeLoZ53gmfe3X6rcKt5oVxnptHR9JS8ehVUd5wvvahN2uqxOOpMXapibI5k7Zwbt4xBSaTfoKBufhAnO/uqNcfK8OTs0OQ6l7JIqFjDhYj5WcjevCnI/1DDiI8j4ndWb/5YzDZWh79yomWXeXj7Nnw70/2TIeFPTrlSh89k1ObOSRVZWZfgF0r/zJQB4nG2JUQuCQBCEd07TTg36fb2IyBaLd3vWaUh/vmSJnvpgmG8YcmS8X3Shf3R7QA4OBUocUKHGER5NNbOOEvwc1txnuWkTRb/aPjimJ5vXabI+3VfOiyS15UWvyezM2xiGOPyuMohOH8O8JiO4Af+FsAGNAEuwCFBYsQEBjlmxRgYrWCGwEFlLsBRSWCGwgFkdsAYrXFhZsBQrAAA=) format('woff');
23 | }
24 |
25 |
26 | .markdown-body {
27 | padding: 15px;
28 | border: 1px solid #ddd;
29 | border-radius: 5px;
30 | font-family: sans-serif;
31 | -ms-text-size-adjust: 100%;
32 | -webkit-text-size-adjust: 100%;
33 | color: #333333;
34 | overflow: hidden;
35 | font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
36 | font-size: 16px;
37 | line-height: 1.8;
38 | word-wrap: break-word;
39 | }
40 |
41 | .markdown-body a {
42 | background: transparent;
43 | }
44 |
45 | .markdown-body a:active,
46 | .markdown-body a:hover {
47 | outline: 0;
48 | }
49 |
50 | .markdown-body b,
51 | .markdown-body strong {
52 | font-weight: bold;
53 | }
54 |
55 | .markdown-body mark {
56 | background: #ff0;
57 | color: #000;
58 | font-style: italic;
59 | font-weight: bold;
60 | }
61 |
62 | .markdown-body sub,
63 | .markdown-body sup {
64 | font-size: 75%;
65 | line-height: 0;
66 | position: relative;
67 | vertical-align: baseline;
68 | }
69 | .markdown-body sup {
70 | top: -0.5em;
71 | }
72 | .markdown-body sub {
73 | bottom: -0.25em;
74 | }
75 |
76 | .markdown-body h1 {
77 | font-size: 2em;
78 | margin: 0.67em 0;
79 | }
80 |
81 | .markdown-body img {
82 | border: 0;
83 | }
84 |
85 | .markdown-body hr {
86 | -moz-box-sizing: content-box;
87 | box-sizing: content-box;
88 | height: 0;
89 | }
90 |
91 | .markdown-body pre {
92 | overflow: auto;
93 | }
94 |
95 | .markdown-body code,
96 | .markdown-body kbd,
97 | .markdown-body pre,
98 | .markdown-body samp {
99 | font-family: monospace, monospace;
100 | font-size: 1em;
101 | }
102 |
103 | .markdown-body input {
104 | color: inherit;
105 | font: inherit;
106 | margin: 0;
107 | }
108 |
109 | .markdown-body html input[disabled] {
110 | cursor: default;
111 | }
112 |
113 | .markdown-body input {
114 | line-height: normal;
115 | }
116 |
117 | .markdown-body input[type="checkbox"] {
118 | box-sizing: border-box;
119 | padding: 0;
120 | }
121 |
122 | .markdown-body table {
123 | border-collapse: collapse;
124 | border-spacing: 0;
125 | }
126 |
127 | .markdown-body td,
128 | .markdown-body th {
129 | padding: 0;
130 | }
131 |
132 | .markdown-body .codehilitetable {
133 | border: 0;
134 | border-spacing: 0;
135 | }
136 |
137 | .markdown-body .codehilitetable tr {
138 | border: 0;
139 | }
140 |
141 | .markdown-body .codehilitetable pre,
142 | .markdown-body .codehilitetable div.codehilite {
143 | margin: 0;
144 | }
145 |
146 | .markdown-body .linenos,
147 | .markdown-body .code,
148 | .markdown-body .codehilitetable td {
149 | border: 0;
150 | padding: 0;
151 | }
152 |
153 | .markdown-body td:not(.linenos) .linenodiv {
154 | padding: 0 !important;
155 | }
156 |
157 | .markdown-body .code {
158 | width: 100%;
159 | }
160 |
161 | .markdown-body .linenos div pre,
162 | .markdown-body .linenodiv pre,
163 | .markdown-body .linenodiv {
164 | border: 0;
165 | -webkit-border-radius: 0;
166 | -moz-border-radius: 0;
167 | border-radius: 0;
168 | -webkit-border-top-left-radius: 3px;
169 | -webkit-border-bottom-left-radius: 3px;
170 | -moz-border-radius-topleft: 3px;
171 | -moz-border-radius-bottomleft: 3px;
172 | border-top-left-radius: 3px;
173 | border-bottom-left-radius: 3px;
174 | }
175 |
176 | .markdown-body .code div pre,
177 | .markdown-body .code div {
178 | border: 0;
179 | -webkit-border-radius: 0;
180 | -moz-border-radius: 0;
181 | border-radius: 0;
182 | -webkit-border-top-right-radius: 3px;
183 | -webkit-border-bottom-right-radius: 3px;
184 | -moz-border-radius-topright: 3px;
185 | -moz-border-radius-bottomright: 3px;
186 | border-top-right-radius: 3px;
187 | border-bottom-right-radius: 3px;
188 | }
189 |
190 | .markdown-body * {
191 | -moz-box-sizing: border-box;
192 | box-sizing: border-box;
193 | }
194 |
195 | .markdown-body input {
196 | font: 13px Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
197 | line-height: 1.4;
198 | }
199 |
200 | .markdown-body a {
201 | color: #4183c4;
202 | text-decoration: none;
203 | }
204 |
205 | .markdown-body a:hover,
206 | .markdown-body a:focus,
207 | .markdown-body a:active {
208 | text-decoration: underline;
209 | }
210 |
211 | .markdown-body hr {
212 | height: 0;
213 | margin: 15px 0;
214 | overflow: hidden;
215 | background: transparent;
216 | border: 0;
217 | border-bottom: 1px solid #ddd;
218 | }
219 |
220 | .markdown-body hr:before,
221 | .markdown-body hr:after {
222 | display: table;
223 | content: " ";
224 | }
225 |
226 | .markdown-body hr:after {
227 | clear: both;
228 | }
229 |
230 | .markdown-body h1,
231 | .markdown-body h2,
232 | .markdown-body h3,
233 | .markdown-body h4,
234 | .markdown-body h5,
235 | .markdown-body h6 {
236 | margin-top: 15px;
237 | margin-bottom: 15px;
238 | line-height: 1.1;
239 | }
240 |
241 | .markdown-body h1 {
242 | font-size: 30px;
243 | }
244 |
245 | .markdown-body h2 {
246 | font-size: 21px;
247 | }
248 |
249 | .markdown-body h3 {
250 | font-size: 16px;
251 | }
252 |
253 | .markdown-body h4 {
254 | font-size: 14px;
255 | }
256 |
257 | .markdown-body h5 {
258 | font-size: 12px;
259 | }
260 |
261 | .markdown-body h6 {
262 | font-size: 11px;
263 | }
264 |
265 | .markdown-body blockquote {
266 | margin: 0;
267 | }
268 |
269 | .markdown-body ul,
270 | .markdown-body ol {
271 | padding: 0;
272 | margin-top: 0;
273 | margin-bottom: 0;
274 | }
275 |
276 | .markdown-body ol ol,
277 | .markdown-body ul ol {
278 | list-style-type: lower-roman;
279 | }
280 |
281 | .markdown-body ul ul ol,
282 | .markdown-body ul ol ol,
283 | .markdown-body ol ul ol,
284 | .markdown-body ol ol ol {
285 | list-style-type: lower-alpha;
286 | }
287 |
288 | .markdown-body dd {
289 | margin-left: 0;
290 | }
291 |
292 | .markdown-body code,
293 | .markdown-body pre,
294 | .markdown-body samp {
295 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
296 | font-size: 12px;
297 | }
298 |
299 | .markdown-body pre {
300 | margin-top: 0;
301 | margin-bottom: 0;
302 | }
303 |
304 | .markdown-body kbd {
305 | background-color: #e7e7e7;
306 | background-image: -moz-linear-gradient(#fefefe, #e7e7e7);
307 | background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
308 | background-image: linear-gradient(#fefefe, #e7e7e7);
309 | background-repeat: repeat-x;
310 | border-radius: 2px;
311 | border: 1px solid #cfcfcf;
312 | color: #000;
313 | padding: 3px 5px;
314 | line-height: 10px;
315 | font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
316 | display: inline-block;
317 | }
318 |
319 | .markdown-body>*:first-child {
320 | margin-top: 0 !important;
321 | }
322 |
323 | .markdown-body>*:last-child {
324 | margin-bottom: 0 !important;
325 | }
326 |
327 | .markdown-body .headeranchor-link {
328 | position: absolute;
329 | top: 0;
330 | bottom: 0;
331 | left: 0;
332 | display: block;
333 | padding-right: 6px;
334 | padding-left: 30px;
335 | margin-left: -30px;
336 | }
337 |
338 | .markdown-body .headeranchor-link:focus {
339 | outline: none;
340 | }
341 |
342 | .markdown-body h1,
343 | .markdown-body h2,
344 | .markdown-body h3,
345 | .markdown-body h4,
346 | .markdown-body h5,
347 | .markdown-body h6 {
348 | position: relative;
349 | margin-top: 1em;
350 | margin-bottom: 16px;
351 | font-weight: bold;
352 | line-height: 1.4;
353 | }
354 |
355 | .markdown-body h1 .headeranchor,
356 | .markdown-body h2 .headeranchor,
357 | .markdown-body h3 .headeranchor,
358 | .markdown-body h4 .headeranchor,
359 | .markdown-body h5 .headeranchor,
360 | .markdown-body h6 .headeranchor {
361 | display: none;
362 | color: #000;
363 | vertical-align: middle;
364 | }
365 |
366 | .markdown-body h1:hover .headeranchor-link,
367 | .markdown-body h2:hover .headeranchor-link,
368 | .markdown-body h3:hover .headeranchor-link,
369 | .markdown-body h4:hover .headeranchor-link,
370 | .markdown-body h5:hover .headeranchor-link,
371 | .markdown-body h6:hover .headeranchor-link {
372 | height: 1em;
373 | padding-left: 8px;
374 | margin-left: -30px;
375 | line-height: 1;
376 | text-decoration: none;
377 | }
378 |
379 | .markdown-body h1:hover .headeranchor-link .headeranchor,
380 | .markdown-body h2:hover .headeranchor-link .headeranchor,
381 | .markdown-body h3:hover .headeranchor-link .headeranchor,
382 | .markdown-body h4:hover .headeranchor-link .headeranchor,
383 | .markdown-body h5:hover .headeranchor-link .headeranchor,
384 | .markdown-body h6:hover .headeranchor-link .headeranchor {
385 | display: inline-block;
386 | }
387 |
388 | .markdown-body h1 {
389 | padding-bottom: 0.3em;
390 | font-size: 2.25em;
391 | line-height: 1.2;
392 | border-bottom: 1px solid #eee;
393 | }
394 |
395 | .markdown-body h2 {
396 | padding-bottom: 0.3em;
397 | font-size: 1.75em;
398 | line-height: 1.225;
399 | border-bottom: 1px solid #eee;
400 | }
401 |
402 | .markdown-body h3 {
403 | font-size: 1.5em;
404 | line-height: 1.43;
405 | }
406 |
407 | .markdown-body h4 {
408 | font-size: 1.25em;
409 | }
410 |
411 | .markdown-body h5 {
412 | font-size: 1em;
413 | }
414 |
415 | .markdown-body h6 {
416 | font-size: 1em;
417 | color: #777;
418 | }
419 |
420 | .markdown-body p,
421 | .markdown-body blockquote,
422 | .markdown-body ul,
423 | .markdown-body ol,
424 | .markdown-body dl,
425 | .markdown-body table,
426 | .markdown-body pre,
427 | .markdown-body .admonition {
428 | margin-top: 0;
429 | margin-bottom: 16px;
430 | }
431 |
432 | .markdown-body hr {
433 | height: 4px;
434 | padding: 0;
435 | margin: 16px 0;
436 | background-color: #e7e7e7;
437 | border: 0 none;
438 | }
439 |
440 | .markdown-body ul,
441 | .markdown-body ol {
442 | padding-left: 2em;
443 | }
444 |
445 | .markdown-body ul ul,
446 | .markdown-body ul ol,
447 | .markdown-body ol ol,
448 | .markdown-body ol ul {
449 | margin-top: 0;
450 | margin-bottom: 0;
451 | }
452 |
453 | .markdown-body li>p {
454 | margin-top: 16px;
455 | }
456 |
457 | .markdown-body dl {
458 | padding: 0;
459 | }
460 |
461 | .markdown-body dl dt {
462 | padding: 0;
463 | margin-top: 16px;
464 | font-size: 1em;
465 | font-style: italic;
466 | font-weight: bold;
467 | }
468 |
469 | .markdown-body dl dd {
470 | padding: 0 16px;
471 | margin-bottom: 16px;
472 | }
473 |
474 | .markdown-body blockquote {
475 | padding: 0 15px;
476 | color: #777;
477 | border-left: 4px solid #ddd;
478 | }
479 |
480 | .markdown-body blockquote>:first-child {
481 | margin-top: 0;
482 | }
483 |
484 | .markdown-body blockquote>:last-child {
485 | margin-bottom: 0;
486 | }
487 |
488 | .markdown-body table {
489 | display: block;
490 | width: 100%;
491 | overflow: auto;
492 | word-break: normal;
493 | word-break: keep-all;
494 | }
495 |
496 | .markdown-body table th {
497 | font-weight: bold;
498 | }
499 |
500 | .markdown-body table th,
501 | .markdown-body table td {
502 | padding: 6px 13px;
503 | border: 1px solid #ddd;
504 | }
505 |
506 | .markdown-body table tr {
507 | background-color: #fff;
508 | border-top: 1px solid #ccc;
509 | }
510 |
511 | .markdown-body table tr:nth-child(2n) {
512 | background-color: #f8f8f8;
513 | }
514 |
515 | .markdown-body img {
516 | max-width: 100%;
517 | -moz-box-sizing: border-box;
518 | box-sizing: border-box;
519 | height:auto;width:auto\9;
520 | overflow: hidden;
521 | }
522 |
523 | .markdown-body code,
524 | .markdown-body samp {
525 | padding: 0;
526 | padding-top: 0.2em;
527 | padding-bottom: 0.2em;
528 | margin: 0;
529 | font-size: 85%;
530 | background-color: rgba(0,0,0,0.04);
531 | border-radius: 3px;
532 | }
533 |
534 | .markdown-body code:before,
535 | .markdown-body code:after {
536 | letter-spacing: -0.2em;
537 | content: "\00a0";
538 | }
539 |
540 | .markdown-body pre>code {
541 | padding: 0;
542 | margin: 0;
543 | font-size: 100%;
544 | word-break: normal;
545 | white-space: pre;
546 | background: transparent;
547 | border: 0;
548 | }
549 |
550 | .markdown-body .codehilite {
551 | margin-bottom: 16px;
552 | }
553 |
554 | .markdown-body .codehilite pre,
555 | .markdown-body pre {
556 | padding: 16px;
557 | overflow: auto;
558 | font-size: 85%;
559 | line-height: 1.45;
560 | background-color: #f7f7f7;
561 | border-radius: 3px;
562 | }
563 |
564 | .markdown-body .codehilite pre {
565 | margin-bottom: 0;
566 | word-break: normal;
567 | }
568 |
569 | .markdown-body pre {
570 | word-wrap: normal;
571 | }
572 |
573 | .markdown-body pre code {
574 | display: inline;
575 | max-width: initial;
576 | padding: 0;
577 | margin: 0;
578 | overflow: initial;
579 | line-height: inherit;
580 | word-wrap: normal;
581 | background-color: transparent;
582 | border: 0;
583 | }
584 |
585 | .markdown-body pre code:before,
586 | .markdown-body pre code:after {
587 | content: normal;
588 | }
589 |
590 | /* Admonition */
591 | .markdown-body .admonition {
592 | -webkit-border-radius: 3px;
593 | -moz-border-radius: 3px;
594 | position: relative;
595 | border-radius: 3px;
596 | border: 1px solid #e0e0e0;
597 | border-left: 6px solid #333;
598 | padding: 10px 10px 10px 30px;
599 | }
600 |
601 | .markdown-body .admonition table {
602 | color: #333;
603 | }
604 |
605 | .markdown-body .admonition p {
606 | padding: 0;
607 | }
608 |
609 | .markdown-body .admonition-title {
610 | font-weight: bold;
611 | margin: 0;
612 | }
613 |
614 | .markdown-body .admonition>.admonition-title {
615 | color: #333;
616 | }
617 |
618 | .markdown-body .attention>.admonition-title {
619 | color: #a6d796;
620 | }
621 |
622 | .markdown-body .caution>.admonition-title {
623 | color: #d7a796;
624 | }
625 |
626 | .markdown-body .hint>.admonition-title {
627 | color: #96c6d7;
628 | }
629 |
630 | .markdown-body .danger>.admonition-title {
631 | color: #c25f77;
632 | }
633 |
634 | .markdown-body .question>.admonition-title {
635 | color: #96a6d7;
636 | }
637 |
638 | .markdown-body .note>.admonition-title {
639 | color: #d7c896;
640 | }
641 |
642 | .markdown-body .admonition:before,
643 | .markdown-body .attention:before,
644 | .markdown-body .caution:before,
645 | .markdown-body .hint:before,
646 | .markdown-body .danger:before,
647 | .markdown-body .question:before,
648 | .markdown-body .note:before {
649 | font: normal normal 16px fontawesome-mini;
650 | -moz-osx-font-smoothing: grayscale;
651 | -webkit-user-select: none;
652 | -moz-user-select: none;
653 | -ms-user-select: none;
654 | user-select: none;
655 | line-height: 1.5;
656 | color: #333;
657 | position: absolute;
658 | left: 0;
659 | top: 0;
660 | padding-top: 10px;
661 | padding-left: 10px;
662 | }
663 |
664 | .markdown-body .admonition:before {
665 | content: "\f056\00a0";
666 | color: 333;
667 | }
668 |
669 | .markdown-body .attention:before {
670 | content: "\f058\00a0";
671 | color: #a6d796;
672 | }
673 |
674 | .markdown-body .caution:before {
675 | content: "\f06a\00a0";
676 | color: #d7a796;
677 | }
678 |
679 | .markdown-body .hint:before {
680 | content: "\f05a\00a0";
681 | color: #96c6d7;
682 | }
683 |
684 | .markdown-body .danger:before {
685 | content: "\f057\00a0";
686 | color: #c25f77;
687 | }
688 |
689 | .markdown-body .question:before {
690 | content: "\f059\00a0";
691 | color: #96a6d7;
692 | }
693 |
694 | .markdown-body .note:before {
695 | content: "\f040\00a0";
696 | color: #d7c896;
697 | }
698 |
699 | .markdown-body .admonition::after {
700 | content: normal;
701 | }
702 |
703 | .markdown-body .attention {
704 | border-left: 6px solid #a6d796;
705 | }
706 |
707 | .markdown-body .caution {
708 | border-left: 6px solid #d7a796;
709 | }
710 |
711 | .markdown-body .hint {
712 | border-left: 6px solid #96c6d7;
713 | }
714 |
715 | .markdown-body .danger {
716 | border-left: 6px solid #c25f77;
717 | }
718 |
719 | .markdown-body .question {
720 | border-left: 6px solid #96a6d7;
721 | }
722 |
723 | .markdown-body .note {
724 | border-left: 6px solid #d7c896;
725 | }
726 |
727 | .markdown-body .admonition>*:first-child {
728 | margin-top: 0 !important;
729 | }
730 |
731 | .markdown-body .admonition>*:last-child {
732 | margin-bottom: 0 !important;
733 | }
734 |
735 | /* progress bar*/
736 | .markdown-body .progress {
737 | display: block;
738 | width: 300px;
739 | margin: 10px 0;
740 | height: 24px;
741 | -webkit-border-radius: 3px;
742 | -moz-border-radius: 3px;
743 | border-radius: 3px;
744 | background-color: #ededed;
745 | position: relative;
746 | box-shadow: inset -1px 1px 3px rgba(0, 0, 0, .1);
747 | }
748 |
749 | .markdown-body .progress-label {
750 | position: absolute;
751 | text-align: center;
752 | font-weight: bold;
753 | width: 100%; margin: 0;
754 | line-height: 24px;
755 | color: #333;
756 | text-shadow: 1px 1px 0 #fefefe, -1px -1px 0 #fefefe, -1px 1px 0 #fefefe, 1px -1px 0 #fefefe, 0 1px 0 #fefefe, 0 -1px 0 #fefefe, 1px 0 0 #fefefe, -1px 0 0 #fefefe, 1px 1px 2px #000;
757 | -webkit-font-smoothing: antialiased !important;
758 | white-space: nowrap;
759 | overflow: hidden;
760 | }
761 |
762 | .markdown-body .progress-bar {
763 | height: 24px;
764 | float: left;
765 | -webkit-border-radius: 3px;
766 | -moz-border-radius: 3px;
767 | border-radius: 3px;
768 | background-color: #96c6d7;
769 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .5), inset 0 -1px 0 rgba(0, 0, 0, .1);
770 | background-size: 30px 30px;
771 | background-image: -webkit-linear-gradient(
772 | 135deg, rgba(255, 255, 255, .4) 27%,
773 | transparent 27%,
774 | transparent 52%, rgba(255, 255, 255, .4) 52%,
775 | rgba(255, 255, 255, .4) 77%,
776 | transparent 77%, transparent
777 | );
778 | background-image: -moz-linear-gradient(
779 | 135deg,
780 | rgba(255, 255, 255, .4) 27%, transparent 27%,
781 | transparent 52%, rgba(255, 255, 255, .4) 52%,
782 | rgba(255, 255, 255, .4) 77%, transparent 77%,
783 | transparent
784 | );
785 | background-image: -ms-linear-gradient(
786 | 135deg,
787 | rgba(255, 255, 255, .4) 27%, transparent 27%,
788 | transparent 52%, rgba(255, 255, 255, .4) 52%,
789 | rgba(255, 255, 255, .4) 77%, transparent 77%,
790 | transparent
791 | );
792 | background-image: -o-linear-gradient(
793 | 135deg,
794 | rgba(255, 255, 255, .4) 27%, transparent 27%,
795 | transparent 52%, rgba(255, 255, 255, .4) 52%,
796 | rgba(255, 255, 255, .4) 77%, transparent 77%,
797 | transparent
798 | );
799 | background-image: linear-gradient(
800 | 135deg,
801 | rgba(255, 255, 255, .4) 27%, transparent 27%,
802 | transparent 52%, rgba(255, 255, 255, .4) 52%,
803 | rgba(255, 255, 255, .4) 77%, transparent 77%,
804 | transparent
805 | );
806 | }
807 |
808 | .markdown-body .progress-100plus .progress-bar {
809 | background-color: #a6d796;
810 | }
811 |
812 | .markdown-body .progress-80plus .progress-bar {
813 | background-color: #c6d796;
814 | }
815 |
816 | .markdown-body .progress-60plus .progress-bar {
817 | background-color: #d7c896;
818 | }
819 |
820 | .markdown-body .progress-40plus .progress-bar {
821 | background-color: #d7a796;
822 | }
823 |
824 | .markdown-body .progress-20plus .progress-bar {
825 | background-color: #d796a6;
826 | }
827 |
828 | .markdown-body .progress-0plus .progress-bar {
829 | background-color: #c25f77;
830 | }
831 |
832 | .markdown-body .candystripe-animate .progress-bar{
833 | -webkit-animation: animate-stripes 3s linear infinite;
834 | -moz-animation: animate-stripes 3s linear infinite;
835 | animation: animate-stripes 3s linear infinite;
836 | }
837 |
838 | @-webkit-keyframes animate-stripes {
839 | 0% {
840 | background-position: 0 0;
841 | }
842 |
843 | 100% {
844 | background-position: 60px 0;
845 | }
846 | }
847 |
848 | @-moz-keyframes animate-stripes {
849 | 0% {
850 | background-position: 0 0;
851 | }
852 |
853 | 100% {
854 | background-position: 60px 0;
855 | }
856 | }
857 |
858 | @keyframes animate-stripes {
859 | 0% {
860 | background-position: 0 0;
861 | }
862 |
863 | 100% {
864 | background-position: 60px 0;
865 | }
866 | }
867 |
868 | .markdown-body .gloss .progress-bar {
869 | box-shadow:
870 | inset 0 4px 12px rgba(255, 255, 255, .7),
871 | inset 0 -12px 0 rgba(0, 0, 0, .05);
872 | }
873 |
874 | /* Multimarkdown Critic Blocks */
875 | .markdown-body .critic_mark {
876 | background: #ff0;
877 | }
878 |
879 | .markdown-body .critic_delete {
880 | color: #c82829;
881 | text-decoration: line-through;
882 | }
883 |
884 | .markdown-body .critic_insert {
885 | color: #718c00 ;
886 | text-decoration: underline;
887 | }
888 |
889 | .markdown-body .critic_comment {
890 | color: #8e908c;
891 | font-style: italic;
892 | }
893 |
894 | .markdown-body .headeranchor {
895 | font: normal normal 16px octicons-anchor;
896 | line-height: 1;
897 | display: inline-block;
898 | text-decoration: none;
899 | -webkit-font-smoothing: antialiased;
900 | -moz-osx-font-smoothing: grayscale;
901 | -webkit-user-select: none;
902 | -moz-user-select: none;
903 | -ms-user-select: none;
904 | user-select: none;
905 | }
906 |
907 | .headeranchor:before {
908 | content: '\f05c';
909 | }
910 |
911 | .markdown-body .task-list-item {
912 | list-style-type: none;
913 | }
914 |
915 | .markdown-body .task-list-item+.task-list-item {
916 | margin-top: 3px;
917 | }
918 |
919 | .markdown-body .task-list-item input {
920 | margin: 0 4px 0.25em -20px;
921 | vertical-align: middle;
922 | }
923 |
924 | /* Media */
925 | @media only screen and (min-width: 480px) {
926 | .markdown-body {
927 | font-size:14px;
928 | }
929 | }
930 |
931 | @media only screen and (min-width: 768px) {
932 | .markdown-body {
933 | font-size:16px;
934 | }
935 | }
936 |
937 | @media print {
938 | .markdown-body * {
939 | background: transparent !important;
940 | color: black !important;
941 | filter:none !important;
942 | -ms-filter: none !important;
943 | }
944 |
945 | .markdown-body {
946 | font-size:12pt;
947 | max-width:100%;
948 | outline:none;
949 | border: 0;
950 | }
951 |
952 | .markdown-body a,
953 | .markdown-body a:visited {
954 | text-decoration: underline;
955 | }
956 |
957 | .markdown-body .headeranchor-link {
958 | display: none;
959 | }
960 |
961 | .markdown-body a[href]:after {
962 | content: " (" attr(href) ")";
963 | }
964 |
965 | .markdown-body abbr[title]:after {
966 | content: " (" attr(title) ")";
967 | }
968 |
969 | .markdown-body .ir a:after,
970 | .markdown-body a[href^="javascript:"]:after,
971 | .markdown-body a[href^="#"]:after {
972 | content: "";
973 | }
974 |
975 | .markdown-body pre {
976 | white-space: pre;
977 | white-space: pre-wrap;
978 | word-wrap: break-word;
979 | }
980 |
981 | .markdown-body pre,
982 | .markdown-body blockquote {
983 | border: 1px solid #999;
984 | padding-right: 1em;
985 | page-break-inside: avoid;
986 | }
987 |
988 | .markdown-body .progress,
989 | .markdown-body .progress-bar {
990 | -moz-box-shadow: none;
991 | -webkit-box-shadow: none;
992 | box-shadow: none;
993 | }
994 |
995 | .markdown-body .progress {
996 | border: 1px solid #ddd;
997 | }
998 |
999 | .markdown-body .progress-bar {
1000 | height: 22px;
1001 | border-right: 1px solid #ddd;
1002 | }
1003 |
1004 | .markdown-body tr,
1005 | .markdown-body img {
1006 | page-break-inside: avoid;
1007 | }
1008 |
1009 | .markdown-body img {
1010 | max-width: 100% !important;
1011 | }
1012 |
1013 | .markdown-body p,
1014 | .markdown-body h2,
1015 | .markdown-body h3 {
1016 | orphans: 3;
1017 | widows: 3;
1018 | }
1019 |
1020 | .markdown-body h2,
1021 | .markdown-body h3 {
1022 | page-break-after: avoid;
1023 | }
1024 | }
1025 |
1026 |
--------------------------------------------------------------------------------
/ShangzengBlog/static/css/style.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 |
3 | * {
4 | -webkit-box-sizing: border-box;
5 | -moz-box-sizing: border-box;
6 | box-sizing: border-box;
7 | margin: 0;
8 | padding: 0;
9 | border: 0;
10 | -webkit-font-smoothing: antialiased;
11 | -moz-osx-font-smoothing: grayscale;
12 | }
13 |
14 | *,:after,:before {
15 | -webkit-box-sizing: border-box;
16 | -moz-box-sizing: border-box;
17 | box-sizing: border-box;
18 | }
19 |
20 | html {
21 | overflow-x: hidden;
22 | -ms-text-size-adjust: 100%;
23 | -webkit-text-size-adjust: 100%;
24 | }
25 |
26 | ::-moz-selection {
27 | color: #414141;
28 | background-color: #1565c0;
29 | }
30 |
31 | ::selection {
32 | color: #fff;
33 | background-color: #1565c0;
34 | }
35 |
36 | body {
37 | font-family: 'Lato', "PingFang SC", "Microsoft YaHei", sans-serif;
38 | font-size: 14px;
39 | line-height: 1.8;
40 | margin: 0 auto;
41 | color: #313131;
42 | background-color: #fafafa;
43 | text-rendering: geometricPrecision;
44 | -webkit-font-smoothing: antialiased;
45 | -moz-osx-font-smoothing: grayscale;
46 | }
47 |
48 | body>*:first-child {
49 | margin-top: 0!important;
50 | }
51 |
52 | body>*:last-child {
53 | margin-bottom: 0!important;
54 | }
55 |
56 | p,blockquote,ul,ol,dl,table,pre {
57 | margin: 20px 0;
58 | vertical-align: baseline;
59 | }
60 |
61 | h1,h2,h3,h4,h5,h6 {
62 | font-weight: normal;
63 | -webkit-font-smoothing: antialiased;
64 | }
65 |
66 | h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code {
67 | font-size: inherit;
68 | }
69 |
70 | h1 {
71 | font-size: 1.4em;
72 | color: #222;
73 | }
74 |
75 | h2 {
76 | font-size: 1.3em;
77 | color: #333;
78 | }
79 |
80 | h3 {
81 | font-size: 1.2em;
82 | color: #444;
83 | }
84 |
85 | h4 {
86 | font-size: 1.1em;
87 | color: #555;
88 | }
89 |
90 | h5 {
91 | font-size: 1.0em;
92 | color: #555;
93 | }
94 |
95 | h6 {
96 | font-size: 1.0em;
97 | color: #555;
98 | }
99 |
100 | body>h2:first-child,body>h1:first-child,body>h1:first-child+h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child {
101 | margin-top: 0;
102 | padding-top: 0;
103 | }
104 |
105 | a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 {
106 | margin-top: 0;
107 | padding-top: 0;
108 | }
109 |
110 | a {
111 | text-decoration: none;
112 | color: #313131;
113 | outline: 0;
114 | cursor: pointer;
115 | }
116 |
117 | a:active,a:focus,a:hover {
118 | color: #1565c0;
119 | outline: 0;
120 | border-bottom: 1px solid #1565c0;
121 | }
122 |
123 |
124 | ul,ol {
125 | padding-left: 30px;
126 | }
127 |
128 | ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type {
129 | margin-top: 0;
130 | }
131 |
132 | li {
133 | word-wrap: break-word;
134 | }
135 |
136 | li p {
137 | margin: 0;
138 | }
139 |
140 | ul ul,ul ol,ol ol,ol ul {
141 | margin-bottom: 0;
142 | }
143 |
144 | pre {
145 | position: relative;
146 | margin: 20px 0;
147 | }
148 |
149 | code {
150 | font-family: Menlo,Bitstream Vera Sans Mono,DejaVu Sans Mono,Monaco,Consolas,monospace;
151 | font-size: 13px;
152 | margin: 0 3px;
153 | padding: 2px 6px;
154 | border-radius: 3px;
155 | background-color: #F7F7CB;
156 | }
157 |
158 | pre code {
159 | font-size: 13px;
160 | display: block;
161 | overflow: auto;
162 | padding: 1.3em;
163 | border: 0;
164 | }
165 |
166 | blockquote {
167 | padding: 0 10px 0 20px;
168 | border-left: 4px solid #ddd;
169 | }
170 |
171 | blockquote>:first-child {
172 | margin-top: 0;
173 | }
174 |
175 | blockquote>:last-child {
176 | margin-bottom: 0;
177 | }
178 |
179 | hr {
180 | clear: both;
181 | overflow: hidden;
182 | height: 0;
183 | margin: 15px 0;
184 | padding: 0;
185 | border: 0;
186 | border-bottom: 2px solid #ddd;
187 | background: transparent;
188 | }
189 |
190 | table {
191 | font-size: 13px;
192 | display: block;
193 | overflow: auto;
194 | width: 100%;
195 | border-spacing: 0;
196 | border-collapse: collapse;
197 | word-wrap: normal;
198 | word-break: normal;
199 | }
200 |
201 | table th {
202 | font-weight: bold;
203 | }
204 |
205 | table th,table td {
206 | padding: 6px 13px;
207 | white-space: nowrap;
208 | border: 1px solid #ddd;
209 | }
210 |
211 | table tr {
212 | border-top: 1px solid #ccc;
213 | background-color: #fff;
214 | }
215 |
216 | table thead tr {
217 | background-color: #f7f7f7;
218 | }
219 |
220 | button,input,select,textarea {
221 | font-family: -apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif;
222 | font-size: 13px;
223 | line-height: 1.6;
224 | resize: none;
225 | }
226 |
227 | input:required:invalid,input:focus:invalid,textarea:required:invalid,textarea:focus:invalid {
228 | box-shadow: none;
229 | }
230 |
231 | input::-webkit-input-placeholder,textarea::-webkit-input-placeholder {
232 | color: #5f5f5f;
233 | }
234 |
235 | input:-moz-placeholder,textarea:-moz-placeholder {
236 | color: #5f5f5f;
237 | }
238 |
239 | input::-moz-placeholder,textarea::-moz-placeholder {
240 | color: #5f5f5f;
241 | }
242 |
243 | input:-ms-input-placeholder,textarea:-ms-input-placeholder {
244 | color: #5f5f5f;
245 | }
246 |
247 | .clearfix:after,.clearfix:before {
248 | display: table;
249 | content: '';
250 | }
251 |
252 | .clearfix:after {
253 | clear: both;
254 | }
255 |
256 | .clearfix {
257 | zoom: 1;
258 | }
259 |
260 | .left {
261 | float: left;
262 | }
263 |
264 | .right {
265 | float: right;
266 | }
267 |
268 | .browsehappy {
269 | position: fixed;
270 | z-index: 999;
271 | top: 0;
272 | bottom: 0;
273 | width: 100%;
274 | height: 40px;
275 | padding: 10px;
276 | text-align: center;
277 | color: #8a1f11;
278 | background: #fbe3e4;
279 | }
280 |
281 | .browsehappy a {
282 | font-weight: 700;
283 | text-decoration: underline;
284 | color: #8a1f11
285 | }
286 |
287 | .bg-white {
288 | background-color: #fff!important;
289 | }
290 |
291 | .bg-grey {
292 | background-color: #f7f7f7!important;
293 | }
294 |
295 | .bg-deepgrey {
296 | background-color: rgba(0,0,0,.5)!important;
297 | }
298 |
299 | .bg-blue {
300 | background-color: #1565c0!important;
301 | }
302 |
303 | .bg-purple {
304 | background-color: #bc99c4!important;
305 | }
306 |
307 | .bg-green {
308 | background-color: #46c47c!important;
309 | }
310 |
311 | .bg-yellow {
312 | background-color: #f9bb3c!important;
313 | }
314 |
315 | .bg-red {
316 | background-color: #e8583d!important;
317 | }
318 |
319 | .bg-orange {
320 | background-color: #f68e5f!important;
321 | }
322 |
323 | .icon-search {
324 | position: relative;
325 | z-index: 1;
326 | display: inline-block;
327 | width: 13px;
328 | height: 13px;
329 | margin: 2px 0 0 3px;
330 | -webkit-transform: rotate(-45deg);
331 | -ms-transform: rotate(-45deg);
332 | transform: rotate(-45deg);
333 | color: #313131;
334 | border: solid 2px currentColor;
335 | border-radius: 50%;
336 | }
337 |
338 | .icon-search:before {
339 | position: absolute;
340 | top: 11px;
341 | left: 3px;
342 | width: 2px;
343 | height: 4px;
344 | content: '';
345 | background-color: currentColor;
346 | }
347 |
348 | .icon-menu {
349 | position: relative;
350 | display: inline-block;
351 | width: 20px;
352 | height: 12px;
353 | -webkit-transition: all .4s ease-in-out;
354 | transition: all .4s ease-in-out;
355 | -webkit-transition-timing-function: cubic-bezier(.61,.04,.17,1.32);
356 | transition-timing-function: cubic-bezier(.61,.04,.17,1.32);
357 | }
358 |
359 | .icon-menu .middle {
360 | position: absolute;
361 | top: 50%;
362 | left: -.25em;
363 | display: inline-block;
364 | width: 20px;
365 | height: 2px;
366 | margin-top: -1px;
367 | -webkit-transition: all .4s ease-in-out;
368 | transition: all .4s ease-in-out;
369 | background: #313131;
370 | }
371 |
372 | .icon-menu:after,.icon-menu:before {
373 | position: absolute;
374 | left: -.25em;
375 | width: 20px;
376 | height: 2px;
377 | content: '';
378 | -webkit-transition: all .4s ease-in-out;
379 | transition: all .4s ease-in-out;
380 | -webkit-transform-origin: 50% 50% 0;
381 | -ms-transform-origin: 50% 50% 0;
382 | transform-origin: 50% 50% 0;
383 | background: #313131;
384 | }
385 |
386 | .icon-menu:after {
387 | bottom: 0;
388 | }
389 |
390 | .icon-menu:before {
391 | top: 0;
392 | }
393 |
394 | .bg-ico-book {
395 | background-position: 0 0!important;
396 | }
397 |
398 | .bg-ico-game {
399 | background-position: 0 -40px!important;
400 | }
401 |
402 | .bg-ico-note {
403 | background-position: 0 -80px!important;
404 | }
405 |
406 | .bg-ico-chat {
407 | background-position: 0 -120px!important;
408 | }
409 |
410 | .bg-ico-code {
411 | background-position: 0 -160px!important;
412 | }
413 |
414 | .bg-ico-image {
415 | background-position: 0 -200px!important;
416 | }
417 |
418 | .bg-ico-web {
419 | background-position: 0 -240px!important;
420 | }
421 |
422 | .bg-ico-link {
423 | background-position: 0 -280px!important;
424 | }
425 |
426 | .bg-ico-design {
427 | background-position: 0 -320px!important;
428 | }
429 |
430 | .bg-ico-lock {
431 | background-position: 0 -360px!important;
432 | }
433 |
434 | .headband {
435 | height: 3px;
436 | background: #222;
437 | }
438 |
439 | .header {
440 | line-height: 78px;
441 | /*position: fixed;*/
442 | top: 0;
443 | z-index: 10;
444 | display: block;
445 | width: 100%;
446 | height: 80px;
447 | padding: 0;
448 | text-align: right;
449 | /*-webkit-box-shadow: 0 1px 5px rgba(0,0,0,.1);*/
450 | /*-moz-box-shadow: 0 1px 5px rgba(0,0,0,.1);*/
451 | /*box-shadow: 0 1px 5px rgba(0,0,0,.1);*/
452 | }
453 |
454 | .navbar-container {
455 | position: relative;
456 | width: 1040px;
457 | max-width: 100%;
458 | height: 80px;
459 | margin: 0 auto;
460 | font-weight: bold;
461 | }
462 |
463 | .navbar-logo {
464 | font-size: 22px;
465 | line-height: 22px;
466 | position: absolute;
467 | top: 50%;
468 | left: 0;
469 | display: block;
470 | width: auto;
471 | max-width: 50%;
472 | height: 22px;
473 | margin-top: -10px;
474 | margin-left: 25px;
475 | text-decoration: none;
476 | }
477 |
478 | .navbar-logo img {
479 | width: auto;
480 | height: 22px;
481 | outline: 0;
482 | }
483 |
484 | .navbar-menu {
485 | z-index: 10;
486 | display: inline-block;
487 | width: auto;
488 | padding-right: 5px;
489 | }
490 |
491 | .navbar-menu a {
492 | font-size: 14px;
493 | padding: 0 15px;
494 | }
495 |
496 | .navbar-mobile-menu {
497 | line-height: 80px;
498 | z-index: 1;
499 | display: none;
500 | width: 28px;
501 | padding: 0 45px 0 10px;
502 | cursor: pointer;
503 | }
504 |
505 | .navbar-mobile-menu:active,.navbar-mobile-menu:hover {
506 | cursor: pointer;
507 | }
508 |
509 | .navbar-mobile-menu:active:before,.navbar-mobile-menu:hover:before {
510 | -webkit-animation: pointer-ball .3s ease 1;
511 | animation: pointer-ball .3s ease 1;
512 | -webkit-animation-timing-function: cubic-bezier(.61,.04,.17,1.32);
513 | animation-timing-function: cubic-bezier(.61,.04,.17,1.32);
514 | }
515 |
516 | .navbar-mobile-menu:active .icon-menu,.navbar-mobile-menu:hover .icon-menu {
517 | -webkit-transform: rotateZ(360deg);
518 | -ms-transform: rotateZ(360deg);
519 | transform: rotateZ(360deg);
520 | }
521 |
522 | .navbar-mobile-menu:active .icon-menu.cross .middle,.navbar-mobile-menu:active .icon-menu.cross:after,.navbar-mobile-menu:active .icon-menu.cross:before,.navbar-mobile-menu:hover .icon-menu.cross .middle,.navbar-mobile-menu:hover .icon-menu.cross:after,.navbar-mobile-menu:hover .icon-menu.cross:before {
523 | background: #1565c0;
524 | }
525 |
526 | .navbar-mobile-menu:active .icon-menu.cross .middle,.navbar-mobile-menu:hover .icon-menu.cross .middle {
527 | opacity: 0;
528 | }
529 |
530 | .navbar-mobile-menu:active .icon-menu.cross:after,.navbar-mobile-menu:hover .icon-menu.cross:after {
531 | bottom: 5px;
532 | -webkit-transform: rotate(135deg);
533 | -ms-transform: rotate(135deg);
534 | transform: rotate(135deg);
535 | }
536 |
537 | .navbar-mobile-menu:active .icon-menu.cross:before,.navbar-mobile-menu:hover .icon-menu.cross:before {
538 | top: 5px;
539 | -webkit-transform: rotate(45deg);
540 | -ms-transform: rotate(45deg);
541 | transform: rotate(45deg);
542 | -webkit-box-shadow: 0 0 0 white;
543 | box-shadow: 0 0 0 white;
544 | }
545 |
546 | .navbar-mobile-menu li {
547 | position: relative;
548 | display: inline;
549 | margin: 0;
550 | text-decoration: none;
551 | }
552 |
553 | .navbar-mobile-menu ul {
554 | position: absolute;
555 | z-index: 1;
556 | top: 100%;
557 | overflow: hidden;
558 | clip: rect(1px,1px,1px,1px);
559 | margin: 0 0 0 -95px;
560 | padding: 0;
561 | -webkit-transition: -webkit-transform 300ms;
562 | transition: -webkit-transform 300ms;
563 | transition: transform 300ms;
564 | -webkit-transform: translate(120px,0);
565 | -ms-transform: translate(120px,0);
566 | transform: translate(120px,0);
567 | text-indent: 0;
568 | }
569 |
570 | .navbar-mobile-menu:hover>ul,.navbar-mobile-menu:active>ul,.navbar-mobile-menu:focus>ul {
571 | overflow: inherit;
572 | clip: inherit;
573 | -webkit-transition: -webkit-transform 300ms;
574 | transition: -webkit-transform 300ms;
575 | transition: transform 300ms;
576 | -webkit-transform: translateX(0px) translateY(0px) translateZ(0px);
577 | transform: translateX(0px) translateY(0px) translateZ(0px);
578 | }
579 |
580 | .navbar-mobile-menu ul li a {
581 | font-size: 15px;
582 | line-height: 2.2;
583 | display: block;
584 | width: 140px;
585 | margin: 0;
586 | padding: 8px 25px;
587 | background-color: #eee;
588 | }
589 |
590 | .navbar-search {
591 | line-height: 80px;
592 | display: inline-block;
593 | width: 20px;
594 | padding: 0 40px 0 0;
595 | cursor: pointer;
596 | }
597 |
598 | .navbar-search:hover>form,.navbar-search:active>form,.navbar-search:focus>form {
599 | overflow: inherit;
600 | clip: inherit;
601 | -webkit-transition: opacity 500ms ease-in-out;
602 | transition: opacity 500ms ease-in-out;
603 | opacity: 1;
604 | }
605 |
606 | .navbar-search:hover>.icon-search,.navbar-search:active>.icon-search,.navbar-search:focus>.icon-search {
607 | color: #1565c0;
608 | }
609 |
610 | .navbar-search form {
611 | line-height: 30px;
612 | position: absolute;
613 | top: 50%;
614 | right: 0;
615 | display: block;
616 | overflow: hidden;
617 | clip: rect(1px,1px,1px,1px);
618 | width: auto;
619 | max-width: 60%;
620 | height: 30px;
621 | margin-top: -15px;
622 | padding-right: 10px;
623 | opacity: 0;
624 | }
625 |
626 | .navbar-search form .search-box {
627 | line-height: 30px;
628 | position: relative;
629 | top: -1px;
630 | display: inline-block;
631 | width: 400px;
632 | max-width: 100%;
633 | height: 30px;
634 | padding: 0;
635 | border: 0;
636 | border-radius: 3px;
637 | }
638 |
639 | .navbar-search form .search-box input {
640 | font-size: 14px;
641 | line-height: 30px;
642 | position: absolute;
643 | top: 0;
644 | left: 0;
645 | width: 100%;
646 | height: 30px;
647 | padding: 0 40px 0 18px;
648 | color: #313131;
649 | border: 1px solid #1565c0;
650 | border-radius: 20px;
651 | outline: 0;
652 | background-color: #fff;
653 | -webkit-appearance: none;
654 | }
655 |
656 | .main-content {
657 | position: relative;
658 | max-width: 940px;
659 | margin: 0 auto;
660 | -webkit-animation: fade-in .5s;
661 | animation: fade-in;
662 | animation-duration: .5s;
663 | padding: 40px 20px 0;
664 | }
665 |
666 | .post-lists {
667 | position: relative;
668 | display: block;
669 | overflow: hidden;
670 | }
671 |
672 | .post-lists-body {
673 | display: block;
674 | }
675 |
676 | .post-list-item {
677 | float: left;
678 | width: 33.3333%;
679 | height: auto;
680 | padding: 15px;
681 | align-items: center;
682 | }
683 |
684 | .post-list-item-container {
685 | position: relative;
686 | overflow: hidden;
687 | width: 100%;
688 | padding: 0;
689 | border-radius: 3px;
690 | background-color: #fff;
691 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04);
692 | box-shadow: 0 1px 4px rgba(0,0,0,.04);
693 | }
694 |
695 | .post-list-item-container:hover {
696 | -webkit-box-shadow: 2px 2px 4px rgba(0,0,0,.1);
697 | box-shadow: 2px 2px 4px rgba(0,0,0,.1);
698 | }
699 |
700 | .post-list-item-container .item-thumb {
701 | position: relative;
702 | display: inherit;
703 | min-height: 250px;
704 | -webkit-transition: -webkit-transform 500ms ease,filter 500ms ease;
705 | -moz-transition: -moz-transform 500ms ease,filter 500ms ease;
706 | transition: transform 500ms ease,filter 500ms ease;
707 | background-position: 50% 50%;
708 | background-size: cover
709 | }
710 |
711 | .post-list-item-container .item-desc {
712 | position: absolute;
713 | top: 0;
714 | overflow: hidden;
715 | width: 100%;
716 | height: 100%;
717 | padding: 40px 28px
718 | }
719 |
720 | .post-list-item-container .item-desc p {
721 | font-size: 14px;
722 | margin: 0;
723 | padding: 0;
724 | word-break: break-all;
725 | opacity: 0;
726 | color: #fff
727 | }
728 |
729 | .post-list-item-container:hover .item-thumb {
730 | -webkit-transform: scale(1.1);
731 | -moz-transform: scale(1.1);
732 | transform: scale(1.1);
733 | -webkit-filter: blur(3px);
734 | -moz-filter: blur(3px);
735 | filter: blur(3px)
736 | }
737 |
738 | .post-list-item-container:hover .item-desc {
739 | background-color: rgba(0,0,0,.5)
740 | }
741 |
742 | .post-list-item-container:hover .item-desc p {
743 | -webkit-animation: fade-in .5s;
744 | animation: fade-in;
745 | animation-duration: .5s;
746 | opacity: 1
747 | }
748 |
749 | .post-list-item-container .item-slant {
750 | position: absolute;
751 | z-index: 0;
752 | right: 0;
753 | bottom: 50px;
754 | left: 0;
755 | width: 110%;
756 | min-height: 100px;
757 | -webkit-transform: rotate(7deg) translate(-10px,0);
758 | -ms-transform: rotate(7deg) translate(-10px,0);
759 | transform: rotate(7deg) translate(-10px,0);
760 | background-color: #fff
761 | }
762 |
763 | .post-list-item-container .item-slant.reverse-slant {
764 | -webkit-transform: rotate(-10deg) translate(10px,-10px);
765 | -ms-transform: rotate(-10deg) translate(10px,-10px);
766 | transform: rotate(-10deg) translate(10px,-10px);
767 | opacity: .7;
768 | background-color: #f68e5f;
769 | -webkit-box-shadow: none;
770 | box-shadow: none
771 | }
772 |
773 | .post-list-item-container .item-label {
774 | position: relative;
775 | height: 130px;
776 | padding: 25px 20px 40px;
777 | background-color: #fff
778 | }
779 |
780 | .post-list-item-container .item-label .item-title a {
781 | font-size: 17px;
782 | line-height: 17px;
783 | word-break: break-all;
784 | color: #313131;
785 | }
786 |
787 | .post-list-item-container .item-label .item-meta {
788 | position: absolute;
789 | right: 0;
790 | bottom: 0;
791 | width: 100%;
792 | padding: 0 15px 15px;
793 | text-align: right;
794 | }
795 |
796 | .post-list-item-container .item-label .item-meta .item-meta-cat a {
797 | font-size: 13px;
798 | position: relative;
799 | float: right;
800 | margin-right: 10px;
801 | padding: 10px 0;
802 | text-align: right;
803 | text-transform: none;
804 | color: #5f5f5f;
805 | }
806 |
807 | .post-list-item-container .item-label .item-meta .item-meta-date {
808 | font-size: 12px;
809 | position: relative;
810 | float: left;
811 | padding-top: 9px;
812 | padding-left: 9px;
813 | text-align: right;
814 | text-transform: none;
815 | color: #f1f1f1;
816 | }
817 |
818 | .post-list-item-container .item-label .item-meta .item-meta-ico {
819 | display: inline-block;
820 | width: 42px;
821 | height: 42px;
822 | border: 1px solid #eaeaea;
823 | border-radius: 50%;
824 | }
825 |
826 | .post-list-item-container .item-label {
827 | padding: 10px 20px 40px;
828 | }
829 |
830 | .item-meta time,
831 | .post-data time {
832 | border-bottom: 1px dashed #999;
833 | cursor: help;
834 | }
835 |
836 | .item-category {
837 | border-bottom: 1px dashed #999;
838 | }
839 |
840 | .item-category:hover {
841 | border-bottom: 1px dashed #999;
842 | color: #222;
843 | font-weight: bold;
844 | }
845 |
846 | .onelist-page {
847 | max-width: 100%;
848 | margin: 0;
849 | padding: 30px 0 0;
850 | }
851 |
852 | .post-onelist-item {
853 | display: inline-block;
854 | width: 100%;
855 | margin: 0;
856 | }
857 |
858 | .post-onelist-item:nth-child(n) {
859 | background: #f7f7f7;
860 | }
861 |
862 | .post-onelist-item:nth-child(2n) {
863 | background: #fff;
864 | }
865 |
866 | .post-onelist-item-container {
867 | position: relative;
868 | max-width: 900px;
869 | margin: 0 auto;
870 | padding: 70px 20px 65px;
871 | }
872 |
873 | .post-onelist-item-container .onelist-item-thumb {
874 | position: relative;
875 | display: block;
876 | min-height: 260px;
877 | -webkit-transition: -webkit-transform 500ms ease,filter 500ms ease;
878 | -moz-transition: -moz-transform 500ms ease,filter 500ms ease;
879 | transition: transform 500ms ease,filter 500ms ease;
880 | border-radius: 5px;
881 | background-position: 50% 50%;
882 | background-size: cover;
883 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04);
884 | box-shadow: 0 1px 4px rgba(0,0,0,.04);
885 | }
886 |
887 | .post-onelist-item-container .onelist-item-thumb:hover {
888 | -webkit-box-shadow: 2px 3px 4px rgba(0,0,0,.1);
889 | box-shadow: 2px 3px 4px rgba(0,0,0,.1);
890 | }
891 |
892 | .post-onelist-item-container .item-title {
893 | display: block;
894 | margin: 30px 0 10px;
895 | text-align: center;
896 | }
897 |
898 | .post-onelist-item-container .item-title a {
899 | font-size: 21px;
900 | line-height: 1.5;
901 | color: #222;
902 | position: relative;
903 | display: inline-block;
904 | border-bottom: none;
905 | }
906 |
907 | .item-title .post-item-title:hover::before {
908 | visibility: visible;
909 | transform: scaleX(1);
910 | }
911 |
912 | .item-title .post-item-title::before {
913 | content: "";
914 | position: absolute;
915 | width: 100%;
916 | height: 2px;
917 | bottom: 0;
918 | background-color: #000;
919 | visibility: hidden;
920 | transform: scaleX(0);
921 | transition-duration: 0.2s;
922 | transition-timing-function: ease-in-out;
923 | transition-delay: 0s;
924 | }
925 |
926 | .post-onelist-item-container .item-content {
927 | padding: 0 30px 10px;
928 | text-align: center;
929 | word-break: break-all;
930 | }
931 |
932 | .post-onelist-item-container .item-meta,.post-onelist-item-container .item-readmore {
933 | font-size: 12px;
934 | text-align: center;
935 | color: #5f5f5f;
936 | }
937 |
938 | .post-onelist-item-container .item-meta a {
939 | color: #5f5f5f;
940 | }
941 |
942 | .post-onelist-item-container .item-readmore a {
943 | padding: 8px 20px;
944 | color: #1565c0;
945 | border: 1px solid #1565c0;
946 | border-radius: 20px;
947 | }
948 |
949 | .post-onelist-item-container .item-readmore a:hover {
950 | color: #222;
951 | border: 1px solid #222;
952 | -webkit-transition: all .5s ease;
953 | transition: all .5s ease;
954 | }
955 |
956 | .post-onelist-item-container .item-meta-hr {
957 | display: block;
958 | width: 55px;
959 | height: 2px;
960 | margin: 0 auto;
961 | margin-top: 20px;
962 | content: '';
963 | }
964 |
965 | .post-content {
966 | padding-top: 50px;
967 | }
968 |
969 | .post-content p {
970 | font-size: 14px;
971 | word-wrap: break-word;
972 | word-break: break-word;
973 | }
974 |
975 | .post-content h1,.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6 {
976 | position: relative;
977 | margin: 20px 0;
978 | }
979 |
980 | .post-content h1::before,.post-content h2::before,.post-content h3::before,.post-content h4::before,.post-content h5::before,.post-content h6::before {
981 | position: absolute;
982 | top: 0;
983 | left: -15px;
984 | content: '#';
985 | color: #1565c0;
986 | }
987 |
988 | .post-content pre {
989 | overflow-x: auto;
990 | margin: 20px 0;
991 | border-radius: 4px;
992 | background: #f7f7f7;
993 | text-shadow: none;
994 | }
995 |
996 | .post-content pre code {
997 | line-height: 20px;
998 | margin: 0;
999 | padding: 1.3em;
1000 | color: #ccc;
1001 | background-color: #2d2d2d;
1002 | }
1003 |
1004 | .post-content p a {
1005 | color: #313131;
1006 | border-bottom: 1px solid #ccc;
1007 | }
1008 |
1009 | .post-content p a:hover {
1010 | color: #1565c0;
1011 | border-bottom: 1px solid #1565c0;
1012 | }
1013 |
1014 | .post-content img {
1015 | position: relative;
1016 | display: block;
1017 | overflow: hidden;
1018 | max-width: 100%;
1019 | height: auto;
1020 | margin: 0 auto;
1021 | }
1022 |
1023 | .post-content input.text {
1024 | display: inline-block;
1025 | padding: 5px 10px;
1026 | color: #5f5f5f;
1027 | border: 1px solid #5f5f5f;
1028 | border-radius: 3px;
1029 | outline: 0;
1030 | background-color: #fff;
1031 | }
1032 |
1033 | .post-content input.submit {
1034 | display: inline-block;
1035 | padding: 5px 15px;
1036 | color: #fff;
1037 | border: 1px solid #5f5f5f;
1038 | border-radius: 3px;
1039 | outline: 0;
1040 | background-color: #5f5f5f;
1041 | }
1042 |
1043 | .post-content .flinks {
1044 | padding: 0;
1045 | }
1046 |
1047 | .post-content .flinks li {
1048 | display: inline-block;
1049 | overflow: hidden;
1050 | width: 32%;
1051 | white-space: nowrap;
1052 | text-overflow: ellipsis;
1053 | }
1054 |
1055 | .post-title {
1056 | font-size: 21px;
1057 | padding-bottom: 10px;
1058 | }
1059 |
1060 | .post-data,.post-data a {
1061 | font-size: 12px;
1062 | color: #5f5f5f;
1063 | }
1064 |
1065 | .post-meta-divider {
1066 | margin: 0 0.5em;
1067 | }
1068 |
1069 | .post-tags {
1070 | margin: 0;
1071 | padding: 5px 0 15px;
1072 | border-bottom: 1px solid #e0e0e0;
1073 | }
1074 |
1075 | .post-tags a {
1076 | font-size: 13px;
1077 | font-weight: 600;
1078 | display: inline-block;
1079 | margin: 4px 8px 0 0;
1080 | padding: 0 15px;
1081 | -webkit-transition-duration: 400ms;
1082 | transition-duration: 400ms;
1083 | text-decoration: none!important;
1084 | letter-spacing: 0;
1085 | }
1086 |
1087 | .post-tags a:nth-child(1n) {
1088 | color: #fff;
1089 | border: 1px solid #1565c0;
1090 | border-radius: 15px;
1091 | background: #1565c0;
1092 | }
1093 |
1094 | .post-tags a:nth-child(2n) {
1095 | color: #fff;
1096 | border: 1px solid #ff9800;
1097 | border-radius: 15px;
1098 | background: #ff9800;
1099 | }
1100 |
1101 | .post-tags a:nth-child(3n) {
1102 | color: #fff;
1103 | border: 1px solid #46c47c;
1104 | border-radius: 15px;
1105 | background: #46c47c;
1106 | }
1107 |
1108 | .post-tags a:nth-child(4n) {
1109 | color: #fff;
1110 | border: 1px solid #f9bb3c;
1111 | border-radius: 15px;
1112 | background: #f9bb3c;
1113 | }
1114 |
1115 | .post-tags a:nth-child(5n) {
1116 | color: #fff;
1117 | border: 1px solid #bc99c4;
1118 | border-radius: 15px;
1119 | background: #bc99c4;
1120 | }
1121 |
1122 | .post-tags a:nth-child(6n) {
1123 | color: #fff;
1124 | border: 1px solid #e8583d;
1125 | border-radius: 15px;
1126 | background: #e8583d;
1127 | }
1128 |
1129 | .post-tags a::before {
1130 | content: '# ';
1131 | }
1132 |
1133 | .post-content .post-tags a:hover {
1134 | color: #5f5f5f;
1135 | border: 1px solid #f7f7f7;
1136 | outline-style: none;
1137 | background: #f7f7f7;
1138 | }
1139 |
1140 | .archive-page {
1141 | padding: 120px 20px 40px;
1142 | }
1143 |
1144 | .archive-page .categorys-title {
1145 | font-size: 14px;
1146 | position: relative;
1147 | margin: 10px auto;
1148 | padding: 0 30px;
1149 | color: #5f5f5f;
1150 | }
1151 |
1152 | .archive-page .categorys-title a {
1153 | color: #5f5f5f;
1154 | }
1155 |
1156 | .archive-page .categorys-title::before {
1157 | position: absolute;
1158 | top: 0;
1159 | left: -15px;
1160 | padding: 0 30px;
1161 | content: '#';
1162 | color: #1565c0;
1163 | }
1164 |
1165 | .archive-page .post-list-item-container {
1166 | border: 1px solid rgba(184,197,214,.2);
1167 | border-radius: 3px;
1168 | background: #fff;
1169 | -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.04);
1170 | box-shadow: 0 1px 4px rgba(0,0,0,.04);
1171 | }
1172 |
1173 | .archive-page .post-list-item-container .item-label {
1174 | height: 95px;
1175 | background: #fff;
1176 | }
1177 |
1178 | .archive-page .post-list-item-container .item-label .item-title a {
1179 | font-size: 14px;
1180 | display: block;
1181 | overflow: hidden;
1182 | white-space: nowrap;
1183 | text-overflow: ellipsis;
1184 | color: #313131;
1185 | }
1186 |
1187 | .archive-page .post-list-item-container .item-label .item-meta .item-meta-date {
1188 | padding-bottom: 5px;
1189 | padding-left: 5px;
1190 | color: #5f5f5f;
1191 | }
1192 |
1193 | .common-page {
1194 | padding: 120px 20px 0;
1195 | }
1196 |
1197 | .common-page .common-title {
1198 | font-size: 14px;
1199 | position: relative;
1200 | margin: 10px auto;
1201 | padding: 0 30px;
1202 | color: #5f5f5f;
1203 | }
1204 |
1205 | .common-page .common-title::before {
1206 | position: absolute;
1207 | top: 0;
1208 | left: -15px;
1209 | padding: 0 30px;
1210 | content: '#';
1211 | color: #1565c0;
1212 | }
1213 |
1214 | .common-page .post-list-item {
1215 | width: 49.9999%;
1216 | }
1217 |
1218 | .common-page .post-list-item-container .item-label {
1219 | background-color: #fff;
1220 | }
1221 |
1222 | .common-page .post-list-item-container .item-label .item-title a {
1223 | font-size: 14px;
1224 | color: #313131;
1225 | }
1226 |
1227 | .common-page .post-list-item-container .item-label .item-meta .item-meta-date {
1228 | padding-bottom: 5px;
1229 | padding-left: 5px;
1230 | color: #5f5f5f;
1231 | }
1232 |
1233 | .common-page .post-list-item:hover,.archive-page .post-list-item:hover,.related-post-lists .post-list-item:hover {
1234 | -webkit-transition-duration: .3s;
1235 | transition-duration: .3s;
1236 | -webkit-transform: scale(1.03);
1237 | transform: scale(1.03);
1238 | }
1239 |
1240 | .post-list-item-container .item-label.bg-blue .item-title a {
1241 | color: #fff;
1242 | }
1243 |
1244 | .post-list-item-container .item-label.bg-purple .item-title a {
1245 | color: #fff;
1246 | }
1247 |
1248 | .post-list-item-container .item-label.bg-green .item-title a {
1249 | color: #fff;
1250 | }
1251 |
1252 | .post-list-item-container .item-label.bg-yellow .item-title a {
1253 | color: #fff;
1254 | }
1255 |
1256 | .post-list-item-container .item-label.bg-red .item-title a {
1257 | color: #fff;
1258 | }
1259 |
1260 | .post-list-item-container .item-label.bg-orange .item-title a {
1261 | color: #fff;
1262 | }
1263 |
1264 | .post-list-item-container .item-label.bg-blue .item-meta .item-meta-date {
1265 | color: #fff;
1266 | }
1267 |
1268 | .post-list-item-container .item-label.bg-purple .item-meta .item-meta-date {
1269 | color: #fff;
1270 | }
1271 |
1272 | .post-list-item-container .item-label.bg-green .item-meta .item-meta-date {
1273 | color: #fff;
1274 | }
1275 |
1276 | .post-list-item-container .item-label.bg-yellow .item-meta .item-meta-date {
1277 | color: #fff;
1278 | }
1279 |
1280 | .post-list-item-container .item-label.bg-red .item-meta .item-meta-date {
1281 | color: #fff;
1282 | }
1283 |
1284 | .post-list-item-container .item-label.bg-orange .item-meta .item-meta-date {
1285 | color: #fff;
1286 | }
1287 |
1288 | .post-header {
1289 | text-align: center;
1290 | }
1291 |
1292 | .post-data-excerpt {
1293 | color: #999;
1294 | padding-top: 10px;
1295 | }
1296 |
1297 | .post-header-thumb {
1298 | width: 100%;
1299 | height: 300px;
1300 | background-position: center;
1301 | background-size: cover;
1302 | margin-top: 80px;
1303 | position: relative;
1304 | -webkit-box-shadow: 0 1px 5px rgba(0,0,0,.1);
1305 | -moz-box-shadow: 0 1px 5px rgba(0,0,0,.1);
1306 | box-shadow: 0 1px 5px rgba(0,0,0,.1);
1307 | }
1308 |
1309 | /* ps css */
1310 | .post-copyright {
1311 | margin: 0 0 0;
1312 | padding: 0.5em 1em;
1313 | border-left: 3px solid #ff1700;
1314 | background-color: #f9f9f9;
1315 | list-style: none;
1316 | }
1317 |
1318 | .post-copyright ul {
1319 | display: block;
1320 | margin-block-start: 1em;
1321 | margin-block-end: 1em;
1322 | margin-inline-start: 0px;
1323 | margin-inline-end: 0px;
1324 | padding-inline-start: 40px;
1325 | }
1326 |
1327 | .post-copyright a {
1328 | overflow-wrap: break-word;
1329 | word-wrap: break-word;
1330 | background-color: transparent;
1331 | color: #555;
1332 | text-decoration: none;
1333 | outline: none;
1334 | border-bottom: 1px solid #999;
1335 | cursor: pointer;
1336 | }
1337 |
1338 | .post-copyright a:hover {
1339 | color: #222;
1340 | border-bottom-color: #222;
1341 | }
1342 |
1343 | .post-footer {
1344 | display: block;
1345 | }
1346 |
1347 | .post-footer .post-tags {
1348 | margin-top: 40px;
1349 | text-align: center;
1350 | }
1351 |
1352 | .post-footer .post-tags a {
1353 | display: inline-block;
1354 | margin-right: 10px;
1355 | font-size: 13px;
1356 | }
1357 |
1358 | .post-nav {
1359 | display: table;
1360 | width: 100%;
1361 | /*border-top: 1px solid #eee;*/
1362 | }
1363 |
1364 | .post-nav .post-nav-item {
1365 | display: table-cell;
1366 | padding: 10px 0 0 0;
1367 | width: 45%;
1368 | vertical-align: top;
1369 | }
1370 |
1371 | .post-nav-next a {
1372 | padding-left: 5px;
1373 | }
1374 |
1375 | .post-nav-divider {
1376 | display: table-cell;
1377 | width: 10%;
1378 | }
1379 |
1380 | .post-nav-item a {
1381 | position: relative;
1382 | display: block;
1383 | line-height: 25px;
1384 | font-size: 14px;
1385 | color: #555;
1386 | border-bottom: none;
1387 | }
1388 |
1389 | .post-nav-prev {
1390 | text-align: right;
1391 | }
1392 |
1393 | .post-nav-prev .fa {
1394 | margin-left: 5px;
1395 | }
1396 |
1397 | .post-nav-item .fa {
1398 | font-size: 12px;
1399 | margin-right: 5px;
1400 | }
1401 |
1402 | .lists-navigator {
1403 | margin: 25px 0 30px;
1404 | }
1405 |
1406 | .onelist-page .lists-navigator {
1407 | margin: 35px 0 35px;
1408 | }
1409 |
1410 | .lists-navigator ol {
1411 | margin: 0;
1412 | padding: 0 10px;
1413 | list-style: none;
1414 | text-align: center;
1415 | }
1416 |
1417 | .lists-navigator ol li {
1418 | display: inline-block;
1419 | color: #5f5f5f;
1420 | }
1421 |
1422 | .lists-navigator ol li a {
1423 | font-size: 14px;
1424 | padding: 0 20px;
1425 | color: #5f5f5f;
1426 | }
1427 |
1428 | .lists-navigator ol li.current a {
1429 | color: #1565c0;
1430 | }
1431 |
1432 | .footer {
1433 | position: relative;
1434 | z-index: 1;
1435 | margin-top: 0;
1436 | padding-bottom: 50px;
1437 | /*background-color: #fff;*/
1438 | }
1439 |
1440 | .footer-meta {
1441 | padding: 50px 0 0;
1442 | list-style: none;
1443 | }
1444 |
1445 | .footer-meta .footer-container {
1446 | width: 100%;
1447 | max-width: 960px;
1448 | margin: 0 auto;
1449 | padding: 0 80px;
1450 | text-align: center;
1451 | }
1452 |
1453 | @media(max-width:1000px) {
1454 | .directory-content {
1455 | display: none;
1456 | }
1457 |
1458 | .post-header-thumb {
1459 | height: 280px;
1460 | }
1461 | }
1462 |
1463 | @media(max-width:880px) {
1464 | .index-page {
1465 | padding: 90px 0 0;
1466 | }
1467 |
1468 | .archive-page {
1469 | padding: 90px 0 20px;
1470 | }
1471 |
1472 | .common-page {
1473 | padding: 90px 0 0;
1474 | }
1475 |
1476 | .post-onelist-item-container {
1477 | padding: 50px 20px 55px;
1478 | }
1479 |
1480 | .post-list-item {
1481 | width: 50%;
1482 | padding: 10px;
1483 | }
1484 |
1485 | .post-list-item:nth-child(odd) {
1486 | padding-left: 20px;
1487 | }
1488 |
1489 | .post-list-item:nth-child(even) {
1490 | padding-right: 20px;
1491 | }
1492 |
1493 | .lists-navigator {
1494 | margin: 25px 0 30px;
1495 | }
1496 |
1497 | .onelist-page .lists-navigator {
1498 | margin: 35px 0 35px;
1499 | }
1500 |
1501 | .lists-navigator ol {
1502 | margin: 0;
1503 | padding: 0 10px;
1504 | list-style: none;
1505 | text-align: center;
1506 | }
1507 |
1508 | .lists-navigator ol li {
1509 | display: inline-block;
1510 | color: #5f5f5f;
1511 | }
1512 |
1513 | .lists-navigator ol li a {
1514 | font-size: 14px;
1515 | padding: 0 20px;
1516 | color: #5f5f5f;
1517 | }
1518 |
1519 | .lists-navigator ol li.current a {
1520 | color: #1565c0;
1521 | }
1522 |
1523 | .post-header-thumb {
1524 | height: 250px;
1525 | }
1526 |
1527 | .footer-meta .footer-container {
1528 | padding: 0;
1529 | }
1530 |
1531 | .main-content {
1532 | margin: 0 auto;
1533 | }
1534 |
1535 | .footer-meta .meta-item {
1536 | padding: 0 20px;
1537 | }
1538 | }
1539 |
1540 | @media(max-width:700px) {
1541 | .comment-form .input-control {
1542 | max-width: 100%;
1543 | }
1544 |
1545 | .post-header-thumb {
1546 | height: 220px;
1547 | }
1548 |
1549 | .post-page {
1550 | padding: 30px 25px 0;
1551 | }
1552 |
1553 | .page-page {
1554 | padding: 100px 25px 0;
1555 | }
1556 |
1557 | .related-post-lists {
1558 | padding-top: 15px;
1559 | }
1560 |
1561 | .post-onelist-item-container {
1562 | padding: 20px 20px 25px;
1563 | }
1564 |
1565 | .post-onelist-item-container .onelist-item-thumb {
1566 | min-height: 240px;
1567 | }
1568 | }
1569 |
1570 | @media(max-width:650px) {
1571 | .navbar-menu {
1572 | display: none
1573 | }
1574 |
1575 | .navbar-search {
1576 | padding: 0 35px 0 0
1577 | }
1578 |
1579 | .navbar-search form {
1580 | width: 180px;
1581 | margin-right: 55px
1582 | }
1583 |
1584 | .navbar-mobile-menu {
1585 | display: inline-block
1586 | }
1587 |
1588 | .red-gradient {
1589 | display: none
1590 | }
1591 |
1592 | .meta-posts {
1593 | display: none
1594 | }
1595 |
1596 | .meta-comments {
1597 | display: none
1598 | }
1599 |
1600 | .post-page {
1601 | padding: 100px 25px 0
1602 | }
1603 |
1604 | .common-page .post-list-item {
1605 | width: 100%;
1606 | padding: 10px 20px
1607 | }
1608 |
1609 | .footer-social {
1610 | display: none
1611 | }
1612 |
1613 | .footer-meta .footer-container {
1614 | height: 70px;
1615 | padding: 0 15px
1616 | }
1617 |
1618 | .post-header-thumb {
1619 | display: none
1620 | }
1621 | }
1622 |
1623 | @media(max-width:580px) {
1624 | .navbar-search form {
1625 | width: 150px
1626 | }
1627 |
1628 | .index-page {
1629 | padding: 80px 0 0
1630 | }
1631 |
1632 | .archive-page {
1633 | padding: 80px 0 20px
1634 | }
1635 |
1636 | .common-page {
1637 | padding: 80px 0 0
1638 | }
1639 |
1640 | .post-list-item {
1641 | width: 100%;
1642 | padding: 10px 20px
1643 | }
1644 |
1645 | .post-list-item:first-child {
1646 | padding-top: 20px
1647 | }
1648 |
1649 | .archive-page .post-list-item:first-child {
1650 | padding-top: 0
1651 | }
1652 |
1653 | .archive-page .post-list-item:last-child {
1654 | padding-bottom: 0
1655 | }
1656 |
1657 | .common-page .post-list-item:first-child {
1658 | padding-top: 0
1659 | }
1660 |
1661 | .related-post-lists {
1662 | padding-top: 5px
1663 | }
1664 |
1665 | .main-content {
1666 | margin: 0 auto
1667 | }
1668 |
1669 | .post-onelist-item-container {
1670 | padding: 20px 20px 25px
1671 | }
1672 |
1673 | .post-onelist-item-container .item-content {
1674 | display: none
1675 | }
1676 |
1677 | .post-onelist-item-container .item-readmore {
1678 | display: none
1679 | }
1680 |
1681 | .post-onelist-item-container .onelist-item-thumb {
1682 | min-height: 180px
1683 | }
1684 | }
1685 |
1686 | @media(max-width:410px) {
1687 | .meta-copyright-info .info-logo {
1688 | display: none
1689 | }
1690 | }
1691 |
1692 | @-webkit-keyframes slideDown {
1693 | 0% {
1694 | -webkit-transform: translateY(-80px)
1695 | }
1696 |
1697 | 100% {
1698 | -webkit-transform: translateY(0)
1699 | }
1700 | }
1701 |
1702 | @keyframes slideDown {
1703 | 0% {
1704 | -webkit-transform: translateY(-98px);
1705 | transform: translateY(-80px)
1706 | }
1707 |
1708 | 100% {
1709 | -webkit-transform: translateY(0);
1710 | transform: translateY(0)
1711 | }
1712 | }
1713 |
1714 | @-webkit-keyframes slideUp {
1715 | 0% {
1716 | -webkit-transform: translateY(0)
1717 | }
1718 |
1719 | 100% {
1720 | -webkit-transform: translateY(-80px)
1721 | }
1722 | }
1723 |
1724 | @keyframes slideUp {
1725 | 0% {
1726 | -webkit-transform: translateY(0);
1727 | transform: translateY(0)
1728 | }
1729 |
1730 | 100% {
1731 | -webkit-transform: translateY(-80px);
1732 | transform: translateY(-80px)
1733 | }
1734 | }
1735 |
1736 | @keyframes fade-in {
1737 | 0% {
1738 | transform: translateY(20px);
1739 | opacity: 0
1740 | }
1741 |
1742 | 100% {
1743 | transform: translateY(0px);
1744 | opacity: 1
1745 | }
1746 | }
1747 |
1748 | @-webkit-keyframes fade-in {
1749 | 0% {
1750 | -webkit-transform: translateY(20px);
1751 | opacity: 0
1752 | }
1753 |
1754 | 100% {
1755 | -webkit-transform: translateY(0px);
1756 | opacity: 1
1757 | }
1758 | }
1759 |
1760 | .hljs {
1761 | display: block;
1762 | overflow-x: auto;
1763 | padding: 0.5em;
1764 | background: #fff;
1765 | color: black
1766 | }
1767 |
1768 | .hljs-comment,.hljs-quote {
1769 | color: #006a00
1770 | }
1771 |
1772 | .hljs-keyword,.hljs-selector-tag,.hljs-literal {
1773 | color: #aa0d91
1774 | }
1775 |
1776 | .hljs-name {
1777 | color: #008
1778 | }
1779 |
1780 | .hljs-variable,.hljs-template-variable {
1781 | color: #660
1782 | }
1783 |
1784 | .hljs-string {
1785 | color: #c41a16
1786 | }
1787 |
1788 | .hljs-regexp,.hljs-link {
1789 | color: #080
1790 | }
1791 |
1792 | .hljs-title,.hljs-tag,.hljs-symbol,.hljs-bullet,.hljs-number,.hljs-meta {
1793 | color: #6cc
1794 | }
1795 |
1796 | .hljs-section,.hljs-class .hljs-title,.hljs-type,.hljs-attr,.hljs-built_in,.hljs-builtin-name,.hljs-params {
1797 | color: #5c2699
1798 | }
1799 |
1800 | .hljs-attribute,.hljs-subst {
1801 | color: #000
1802 | }
1803 |
1804 | .hljs-formula {
1805 | background-color: #eee;
1806 | font-style: italic
1807 | }
1808 |
1809 | .hljs-addition {
1810 | background-color: #baeeba
1811 | }
1812 |
1813 | .hljs-deletion {
1814 | background-color: #ffc8bd
1815 | }
1816 |
1817 | .hljs-selector-id,.hljs-selector-class {
1818 | color: #9b703f
1819 | }
1820 |
1821 | .hljs-doctag,.hljs-strong {
1822 | font-weight: bold
1823 | }
1824 |
1825 | .hljs-emphasis {
1826 | font-style: italic
1827 | }
--------------------------------------------------------------------------------
/ShangzengBlog/static/fonts/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/fonts/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/10.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/11.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/12.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/13.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/14.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/15.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/16.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/17.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/2.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/3.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/4.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/5.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/6.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/7.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/9.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/GoBackChangchun_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_1.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/GoBackChangchun_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_2.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/GoBackChangchun_3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_3.jpeg
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/GoBackChangchun_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/GoBackChangchun_4.jpg
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/IMG_5018.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/IMG_5018.PNG
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2464.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2464.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2465.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2465.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2466.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2466.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2467.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2467.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2468.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2468.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2648.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2648.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2649.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2649.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/WechatIMG2650.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/WechatIMG2650.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/beijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/beijing.jpg
--------------------------------------------------------------------------------
/ShangzengBlog/static/img/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/img/image.png
--------------------------------------------------------------------------------
/ShangzengBlog/static/js/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/static/js/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/static/js/axios.min.js:
--------------------------------------------------------------------------------
1 | /* axios v0.20.0 | (c) 2020 by Matt Zabriskie */
2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(16),s=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"],(r.isBlob(p)||r.isFile(p))&&p.type&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=unescape(encodeURIComponent(e.auth.password))||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),s(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,i=e.responseType&&"text"!==e.responseType?l.response:l.responseText,s={data:i,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,s),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(e[o],t[o])}t=t||{};var i={},s=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(s,function(e){r.isUndefined(t[e])||(i[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(i[o]=n(void 0,e[o])):i[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?i[r]=n(e[r],t[r]):r in e&&(i[r]=n(void 0,e[r]))});var f=s.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),i}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])});
3 | //# sourceMappingURL=axios.min.map
--------------------------------------------------------------------------------
/ShangzengBlog/test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "log"
6 | "time"
7 | "github.com/gorilla/feeds"
8 | )
9 |
10 | func main() {
11 | now := time.Now()
12 | feed := &feeds.Feed{
13 | Title: "jmoiron.net blog",
14 | Link: &feeds.Link{Href: "http://jmoiron.net/blog"},
15 | Description: "discussion about tech, footie, photos",
16 | Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"},
17 | Created: now,
18 | }
19 |
20 | feed.Items = []*feeds.Item{
21 | &feeds.Item{
22 | Title: "Limiting Concurrency in Go",
23 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/limiting-concurrency-in-go/"},
24 | Description: "A discussion on controlled parallelism in golang",
25 | Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"},
26 | Created: now,
27 | },
28 | &feeds.Item{
29 | Title: "Logic-less Template Redux",
30 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/logicless-template-redux/"},
31 | Description: "More thoughts on logicless templates",
32 | Created: now,
33 | },
34 | &feeds.Item{
35 | Title: "Idiomatic Code Reuse in Go",
36 | Link: &feeds.Link{Href: "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/"},
37 | Description: "How to use interfaces effectively",
38 | Created: now,
39 | },
40 | }
41 |
42 | atom, err := feed.ToAtom()
43 | if err != nil {
44 | log.Fatal(err)
45 | }
46 |
47 | rss, err := feed.ToRss()
48 | if err != nil {
49 | log.Fatal(err)
50 | }
51 |
52 | json, err := feed.ToJSON()
53 | if err != nil {
54 | log.Fatal(err)
55 | }
56 |
57 | fmt.Println(atom, "\n", rss, "\n", json)
58 | }
--------------------------------------------------------------------------------
/ShangzengBlog/view:
--------------------------------------------------------------------------------
1 | 1157
--------------------------------------------------------------------------------
/ShangzengBlog/views/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shangzeng/GolangTools/68e02ea6ad9a407f44efeeb3aee4ed77584ddadf/ShangzengBlog/views/.DS_Store
--------------------------------------------------------------------------------
/ShangzengBlog/views/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 404
6 |
7 |
8 | 没有这个页面呢,
9 | 别实验了憨憨 :)
10 |
11 |
--------------------------------------------------------------------------------
/ShangzengBlog/views/article.html:
--------------------------------------------------------------------------------
1 | {{ template "head.html" . }}
2 |
3 |
4 |
36 |
37 |
38 | {{ str2html .Content }}
39 |
40 |
41 |
42 | -
43 | 本文作者: shangzeng
44 |
45 |
49 | -
50 | 版权声明:
51 | 本博客所有文章除特别声明外,均采用「 知识共享署名4.0 」创作共享协议,转载请注明作者及原网址。
52 |
53 |
54 |
55 |
56 |
83 |
84 |
85 | {{ template "foot.html" . }}
--------------------------------------------------------------------------------
/ShangzengBlog/views/category.html:
--------------------------------------------------------------------------------
1 | {{template "head.html" .}}
2 |
3 |
4 |
5 |
6 |
7 | 分类:
8 | {{.Tag}}
9 |
10 |
11 |
12 |
13 |
14 | {{range $index, $elem := .Data}}
15 |
31 | {{end}}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
56 |
57 |
58 | {{ template "foot.html" . }}
--------------------------------------------------------------------------------
/ShangzengBlog/views/dnslog.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | DNSLog
6 |
7 |
8 |
9 |
10 |
11 |
12 |
16 |
17 |
18 |
19 |
20 |
{{.Domainname}}.ft0fe6.ceye.io
21 |
22 |
23 |
25 |
26 | DNS返回域名 |
27 | IP 地址 |
28 | 创建时间 |
29 |
30 | {{range $index, $elem := .DomainInfo}}
31 |
32 | {{$elem.Name}} |
33 | {{$elem.RemoteAddr}} |
34 | {{$elem.CreatedAt}} |
35 |
36 | {{end}}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
52 |
62 |
--------------------------------------------------------------------------------
/ShangzengBlog/views/foot.html:
--------------------------------------------------------------------------------
1 |
9 |