diff --git "a/docs/2010/03/20/\347\273\223\346\235\237\344\270\216\345\220\257\347\250\213/index.html" "b/docs/2010/03/20/\347\273\223\346\235\237\344\270\216\345\220\257\347\250\213/index.html" index d6c3a1fb3..8166fa353 100644 --- "a/docs/2010/03/20/\347\273\223\346\235\237\344\270\216\345\220\257\347\250\213/index.html" +++ "b/docs/2010/03/20/\347\273\223\346\235\237\344\270\216\345\220\257\347\250\213/index.html" @@ -1,13 +1,18 @@ -结束与启程 | Beendless ~ 快节奏,慢生活,无止境 +结束与启程 | Beendless ~ 快节奏,慢生活,无止境 -

结束与启程

心情的持续反复,折腾着自己也折腾着身边的、远方的最亲爱的人,很多天——都没有发现一分部绽开的桃花如此粉嫩得让人心疼,掩在丛丛的枯枝当中;迎春花儿也开了,枝枝丫丫都镶嵌在秃秃的木桩子上。春天来得似乎很拖拉,再加上天空下沙,本来就还没有泛绿的校园显得更加死寂,这些简单的明媚点缀其间,反而会让心情突然莫名其妙地亮起来。前些天的我,根本没有注意到这一切,就好像闭着眼睛没有心的在走路,甚至,我不用心于每一餐饭,每一份作业,每一个朋友。躯壳,漂浮。

+

结束与启程

心情的持续反复,折腾着自己也折腾着身边的、远方的最亲爱的人,很多天——都没有发现一分部绽开的桃花如此粉嫩得让人心疼,掩在丛丛的枯枝当中;迎春花儿也开了,枝枝丫丫都镶嵌在秃秃的木桩子上。春天来得似乎很拖拉,再加上天空下沙,本来就还没有泛绿的校园显得更加死寂,这些简单的明媚点缀其间,反而会让心情突然莫名其妙地亮起来。前些天的我,根本没有注意到这一切,就好像闭着眼睛没有心的在走路,甚至,我不用心于每一餐饭,每一份作业,每一个朋友。躯壳,漂浮。

今天,此刻——疲惫的一天快要结束了,回忆把自己塞得满满的,我从榆中返回现实。走在榆中校区的每一步,都让我有千言万语在脑海里翻来覆去,现在所剩已经不多,还是留在这里比较好。这算是最后的记忆。

我几乎走遍了我们在榆中校区走过的每一个地方,这次是我自己。自己的时候,反而更能想起曾经的一幕幕,或许根本就从来不曾忘记,就像电影的画面依次展现——

德远楼和明远楼已经在5.12地震之后的校庆建设计划中被夷为平地,甚至已经看上去不曾有过,很难辨别清楚它们曾经存在的方寸,然而这两个地方最是我的大学,除了恋爱以外。明远楼里准备辩题、加班开会、畅谈梦想、针砭时弊;最爱德远楼三层拐角播音间。混过的学生会和爱过的广播电台,还在,长江后浪推前浪,前浪残活在沙滩上。

@@ -21,4 +26,4 @@

乱七八糟说了这么多,好像还是远远没有今天在榆中校区走路时候想的多。是时候停止了。成年人,应该懂得不是想做什么就能做什么,而是该做什么就必须做什么。这两个月来给过我安慰和帮助的人,这几天被我骚扰的人,我该说些什么呢。她们都拒绝“谢谢”——这个我唯一可表达的东西。狠狠哭过一整个冬天,昨天就只能是纪念。眼睛疼了可以护理,心痛了也可以治愈。燕子长大了,还是会对爱有期待,当然不再盲目,不再急躁,不再失去重心。

这两个多月耽误了的论文,耽误了的申请,耽误了的心情,换来的是所有人见面一句诧异的“瘦了”。我会微笑,俨然不是那么欣喜,亦不会太难过。忘记该忘记的,心平气和,这都是他教给我的。那就继续瘦吧,燕子要有新的生活。

真的不要再让自己反复,不要不要。

-
形而下的梦
\ No newline at end of file +
形而下的梦
\ No newline at end of file diff --git "a/docs/2010/04/04/\345\275\242\350\200\214\344\270\213\347\232\204\346\242\246/index.html" "b/docs/2010/04/04/\345\275\242\350\200\214\344\270\213\347\232\204\346\242\246/index.html" index 49387bbff..21409446f 100644 --- "a/docs/2010/04/04/\345\275\242\350\200\214\344\270\213\347\232\204\346\242\246/index.html" +++ "b/docs/2010/04/04/\345\275\242\350\200\214\344\270\213\347\232\204\346\242\246/index.html" @@ -1,16 +1,21 @@ -形而下的梦 | Beendless ~ 快节奏,慢生活,无止境 +形而下的梦 | Beendless ~ 快节奏,慢生活,无止境 -

形而下的梦

这几天总是会偶尔的恍惚。恍惚,三个月的恍惚怎么还能持续到现在呢,我也不懂,并以此佩服自己的执拗。只是觉得有一些不一样了,现在的恍惚是我一个人的恍惚,偶尔的恍惚。

+

形而下的梦

这几天总是会偶尔的恍惚。恍惚,三个月的恍惚怎么还能持续到现在呢,我也不懂,并以此佩服自己的执拗。只是觉得有一些不一样了,现在的恍惚是我一个人的恍惚,偶尔的恍惚。

可能因为太赖床的缘故吧,每次睁开眼睛后总有至少两个小时的辗转反侧,脑子里呀就不停不停地演电影,这样就很容易再次入睡,浅浅的,却闷闷的犯迷糊。再次醒来就会发晕,更累。虽然似乎有一个好处,可以用新的恍惚洗掉前一天晚上做的梦。从心理学上的弗洛伊德《梦的解析》,从古代周公解梦的“迷信”,我都把自己清理过了,想想真是可笑。不停地清理自己,却清理不干净自己的生活,这就是我的无能吧。只是,真的不怕什么了,真的不再那么伤感了。现在来面对自己的恍惚和太短暂的清醒,就像喝过酒一样,至少,的确不那么伤感,我拒绝自己无病呻吟。

也可能是因为看电视剧吧,它比较长时间的缓冲,或者我极偶尔地离开座位,眼前的世界就像突然穿越,一晃,真假难辨了。把眼睛移开屏幕的一刻,低头倒水的一刻,走出房门的一刻,发现阳光或听到篮球场的一刻,就跟猛地被人从梦中惊醒一样,第一个念头是,噢,ta走了,不在了。我可以接受也可以面对,可以继续,没什么大不了的。只不过是这样了。就为祭奠一下这每每的一刹那,一种很奇怪的感觉,恍惚。

要说梦醒或恍惚的这些瞬间,我以前还很少遇到。因为以前心里很少想事儿或者其他,就睡得很沉,经常是脑袋挨着枕头就能睡着了,不怕外面吵闹,甚至不怕微震。曾扬言说只需要一个枕头,东南西北任何地方都能睡着的燕子,现在却每晚在不停的睡梦中翻来覆去。梦可以甜蜜的,也可以有趣的,太多不可能的事情终究能在梦里实现。我开始想,到底是梦更真实呢?还是现实更虚伪?呵呵,玩文字游戏已经不顾逻辑错误了。我的唯心主义已经彻底泛滥了,以前的死活拿不定主意也慢慢变化了,因为我可以用一个答案来回答我自己的哲学命题——世界是什么样子的?我看到的世界是什么样子的?我是怎么去看这个样子的世界的?好吧,答案只有一个。假设全世界的白天都是黑夜,黑夜可能才是真正的白天,每一个人的日常生活就是做梦,而睡眠才是真实。那有梦的人才是有生活的,是存在的。这怎么不可能呢?要怎样的论证才能推翻呢?已经有在“纯粹”中滑来滑去的辩证法把这一切的对立面和论证可能都消除了!

我会理性也会荒诞,不是荒诞主义哲学的荒诞,是真正地2的、傻的荒诞。都不知道自己这些年的书念到哪里去了,这些日子被人骂才被骂醒——我是个抱着中西哲学史和思想史,却迷茫的根本找不到自己、找不到生活、找不到爱的人。算了,原谅自己吧,海登怀特说“实践的逻辑学并不遵循同一律和不矛盾律”,虽然我也不知道这句话原出自哪个哲学派别,我已经太累不想寻根究底了,因为太多东西是无法追根溯源的,就这样为自己开脱算了吧。苛责自己有什么意思呢?打破砂锅有什么作用呢?这就是生活,就是实践的逻辑。star都还张小娴呢,轻盈呢,我还在这里重什么?也轻盈吧,坚强吧,麻木吧,习惯吧,就都能面对了,接受了,继续了。

又晕晕乎乎的了,或许也可能是不睡午觉的结果?已经不敢再睡午觉,醒来后又要赖床和乱想2小时,抵制燕子可以赖皮的一切可能性。把棉签拿出来,支在上下眼皮间~~

-
一路向西——大美青海
\ No newline at end of file +
一路向西——大美青海
\ No newline at end of file diff --git "a/docs/2010/06/22/\344\270\200\350\267\257\345\220\221\350\245\277\342\200\224\342\200\224\345\244\247\347\276\216\351\235\222\346\265\267/index.html" "b/docs/2010/06/22/\344\270\200\350\267\257\345\220\221\350\245\277\342\200\224\342\200\224\345\244\247\347\276\216\351\235\222\346\265\267/index.html" index 359578237..d6154e23a 100644 --- "a/docs/2010/06/22/\344\270\200\350\267\257\345\220\221\350\245\277\342\200\224\342\200\224\345\244\247\347\276\216\351\235\222\346\265\267/index.html" +++ "b/docs/2010/06/22/\344\270\200\350\267\257\345\220\221\350\245\277\342\200\224\342\200\224\345\244\247\347\276\216\351\235\222\346\265\267/index.html" @@ -1,13 +1,18 @@ -一路向西——大美青海 | Beendless ~ 快节奏,慢生活,无止境 +一路向西——大美青海 | Beendless ~ 快节奏,慢生活,无止境 -

一路向西——大美青海

打点行装,第三次踏上我习惯称之为丝路的旅程。隐隐觉得,这或许是此生最后一趟,保守地说至少是近年内的最后一趟了。跟此前两次的新奇、娱乐和紧张、工作陪同的状态不一样,我担任了前期准备和负责的任务。疲惫,却真的可以用冷眼和热心来感受我的丝路。再想想过去的几年里,我的双脚走过了多少地方,是不是什么时候该算一下里程呢?原来,真的很少细细去体味,更多的是一时情绪,而根本没有留下些纪念的文字,即使有一些照片,那似乎略显无力。感谢冥冥之中的安排吧,为了帮师哥和老师打开OFFICE2007的文档,我带了电脑。走在去青海湖的路上,突然涌上一股想写点什么的冲动,才决定,尽量把每天都记录下来,用心,用手指,用颠簸的公路上轰鸣的发动机的声音。(在途中,我抱着电脑,这些被车震得颤抖的记录。)同样也是因为青海湖,我不再称这趟行程为丝路了,向西,只觉得这是一条向西的无界之路。

+

一路向西——大美青海

打点行装,第三次踏上我习惯称之为丝路的旅程。隐隐觉得,这或许是此生最后一趟,保守地说至少是近年内的最后一趟了。跟此前两次的新奇、娱乐和紧张、工作陪同的状态不一样,我担任了前期准备和负责的任务。疲惫,却真的可以用冷眼和热心来感受我的丝路。再想想过去的几年里,我的双脚走过了多少地方,是不是什么时候该算一下里程呢?原来,真的很少细细去体味,更多的是一时情绪,而根本没有留下些纪念的文字,即使有一些照片,那似乎略显无力。感谢冥冥之中的安排吧,为了帮师哥和老师打开OFFICE2007的文档,我带了电脑。走在去青海湖的路上,突然涌上一股想写点什么的冲动,才决定,尽量把每天都记录下来,用心,用手指,用颠簸的公路上轰鸣的发动机的声音。(在途中,我抱着电脑,这些被车震得颤抖的记录。)同样也是因为青海湖,我不再称这趟行程为丝路了,向西,只觉得这是一条向西的无界之路。

今天是自准备工作开始以来,我最最懒散的一天了。本来被安排早晨在从兰州到西宁的路上为大家讲解一下甘肃和青海,可能要站着讲上一个小时。今天早晨不舒服,大师哥体恤民情,让我一路从兰州睡到西宁。熟悉的高速公路,被太阳晒得温热的玻璃,还有,睡着的我。

从西宁到青海湖的路上,看到顶峰的积雪(近年升温已经让雪线升高很多)、车旁的牛羊、可能有美丽的卓玛的白色小帐篷,还有不够金黄的油菜花、不够湛蓝却广袤无垠的高远的天空,我觉察到自己的不舍。为什么会留恋这个从来都不属于我的地方?可能是因为被感动吧。

青海

@@ -15,4 +20,4 @@

[青海

这回没有再上日月山,只是路过罢了。是身体比前两年更好了么,跟以前不同,这次我有明显的高原不适。(身体越好,肺活量越大的人越需要更多氧气,所以会有更严重的高原反应。)当然,不至于多严重了,要不怎么还有那么多缠绵悱恻的思绪,还在想象能否再有谁的眼泪流成一条倒淌河呢?海拔3500,明天是最高的达阪山口,好像去年也翻过3900还是4000多的吧,其实没什么。只是,让一个女人的眼泪流成倒淌河,唐蕃修好,这又是一段怎样的故事,今天的我们真的能懂么?杜甫总写得好悲凉,“君不见青海头,古来白骨无人收”的过去,今天的我们会明白么?

更多的青海其实我还从不曾看到过,今天的离去,让我偷偷许下一个不知能否达成的愿望——一个月的时间,组成四五辆越野车的车队,从青藏线入藏,近后藏到珠峰大本营,再从川藏线出,那该是如何的。

-
当年写给star的信
\ No newline at end of file +
当年写给star的信
\ No newline at end of file diff --git "a/docs/2010/11/29/\345\275\223\345\271\264\345\206\231\347\273\231star\347\232\204\344\277\241/index.html" "b/docs/2010/11/29/\345\275\223\345\271\264\345\206\231\347\273\231star\347\232\204\344\277\241/index.html" index 47ffb95c5..551e2158e 100644 --- "a/docs/2010/11/29/\345\275\223\345\271\264\345\206\231\347\273\231star\347\232\204\344\277\241/index.html" +++ "b/docs/2010/11/29/\345\275\223\345\271\264\345\206\231\347\273\231star\347\232\204\344\277\241/index.html" @@ -1,13 +1,18 @@ -当年写给star的信 | Beendless ~ 快节奏,慢生活,无止境 +当年写给star的信 | Beendless ~ 快节奏,慢生活,无止境 -

当年写给star的信

猪妹她姐:   

+

当年写给star的信

猪妹她姐:   

你什么破地址嘛,发给我三封邮件居然全部都在垃圾邮箱列队里面。前天你生日,好像从你走的那天我就开始算,等着你过生日这天;但是终于等到了,也什么都没有地过去了。我有想过写邮件给你,但我知道每封电子信件都是要计流量的,而且我这种基本没事只是感情泛滥型的不在那个白名单上面。于是我每天都会有一点点时间来想你,或者一念,或者几分钟。想你在做实验还是在聊天,或者在甲板上?偶尔会自言自语说一声,可能海上和陆地上也一样吧,某人习惯了。不多,但每天都尽量会记得带你送我的红石榴石,虽然工作的时候它总是带来不便,因为蹭着键盘或桌子。

刚看到你的“悲催”,每封邮件都简短缺都用一句“人一切都好”,或者“希望你也好”,“照顾好自己”结束,也就罢了嘛,干嘛要用“平安”呢。我满脑子都是泰坦尼克号或者海上钢琴师之类的画面,虽然这是完全不同的两个视角,但我已经看到了实验室里瓶子乱飞的倾斜了35度的**号,快要吓哭了。我告诉自己,船很安全很安全,科考,玩得就是刺激,你会不会也这么想呢?说真的,没见过你在跑步机上跑步,只记得某人跑步时标志性动作是上身直立,下面风火轮嗖嗖,不晓得在跑步机上神马样子?喝啤酒比赛你能赢得过人家么?拔河可能马马虎虎,虽然没肉但是劲不小。(写到这里我突然发现怎么我身边要好的女人都很大劲呢?能不能分一点点给我这个肉最多劲最小的啊?)不晓得你下一封邮件是到什么时候,我已经把这个cn结尾却被gmail拦截的地址存入了直接显示,我要在第一时间看到你的平安。知道么,我这会儿想到了哥伦布和麦哲伦哎,记得做哥伦布就好了,咱跟姓麦的没关系哈。

自你走后的我小日子一如既往。在港的日子非常幸运,有认识很好很好的老师和室友,很好很好,还有办公室的Alice,我很感激这一切,甚至今天早晨就意外收到早到的圣诞礼物。我心里没清楚,如果没有xixi,sibyl,Prof. *和Dr. *,我在港等于零,因为其实论文也并没有多大进展。面对浩如烟海的数据库,英文贫乏的我满眼金星,下月中大有会,我去旁听,也是去见见熟识的和陌生的人。腿腿如常,少跟皮筋它还在工作,已经比我自己坚强多了。话说上个星期以去帮忙和感受一下传统的美国的Thanksgiving为由,在导师的漂亮的简直漂亮的要命的充满民间艺术气息的家里住了一晚上,带着得逞的小人之心。可不料因为此前熬夜,头痛,于是在人家家里面睡得天昏地暗,什么忙都没帮,就吃完了睡,人家还专门跑楼上帮我拿药,然后我睡醒了再吃。自己回到房间是个星期六的晚上,跟室友发誓周日早晨一定要去教堂,孰料不仅没去,而且中午起身吃饭,再倒床上睡着,晚上再起身吃大餐,回房间后上网两小时再睡觉。我的上个星期就结束了。一个完美的大言不惭的Thanksgiving,室友说如果中午起身时候我们算两只懒猫的话,后来睡到晚上再起身就真的是猪了。是不是很符合你称呼我啊?看来你真够了解。

@@ -16,4 +21,4 @@

我会给你妈打电话的,跟她唠两句。我也会照顾自己的,虽然越来越看到我笨的要死,很难独立生活的问题。呃,不用太担心我,照顾好各种试管和瓶子,还有样品,我等你回来。

寒暖不一,千祈珍重。

妹  泣上

-
一转身,就是一辈子
\ No newline at end of file +
一转身,就是一辈子
\ No newline at end of file diff --git "a/docs/2011/01/26/\344\270\200\350\275\254\350\272\253\357\274\214\345\260\261\346\230\257\344\270\200\350\276\210\345\255\220/index.html" "b/docs/2011/01/26/\344\270\200\350\275\254\350\272\253\357\274\214\345\260\261\346\230\257\344\270\200\350\276\210\345\255\220/index.html" index 34abf6893..0bdc92b1d 100644 --- "a/docs/2011/01/26/\344\270\200\350\275\254\350\272\253\357\274\214\345\260\261\346\230\257\344\270\200\350\276\210\345\255\220/index.html" +++ "b/docs/2011/01/26/\344\270\200\350\275\254\350\272\253\357\274\214\345\260\261\346\230\257\344\270\200\350\276\210\345\255\220/index.html" @@ -1,13 +1,18 @@ -一转身,就是一辈子 | Beendless ~ 快节奏,慢生活,无止境 +一转身,就是一辈子 | Beendless ~ 快节奏,慢生活,无止境 -

一转身,就是一辈子

今天是一个普普通通,却又不得不写两句的日子。

+

一转身,就是一辈子

今天是一个普普通通,却又不得不写两句的日子。

这个星期开始跟朋友们say goodbye,满是复杂的情绪——离别,不要悲伤但又不得不悲伤;今天早晨居然意外地去大学say hi to  *。(NND,必须要记住教训!本姑娘太谦虚了!!!)所以我觉得今天很有趣。Say hi的是为了期盼未来;Say goodbye是不得不告别回忆。

今天吃中饭算是在HK最早的一回吧,因为自己好不平静的心必须要见见XIXI,也因为需要跟马上要离开的人告别。在火车上逛逛当当很快就要摇回九龙塘了,我们匆匆忙忙一起吃个便饭。

Mr. D 是个好典型的理工科男生,有那么点闷,那么点程序化,同时又如此大男子气概,如此照顾我们。跟他一起玩很轻松,很简单,很随意。除了听他讲paper 和coding的时候,我们不得不聆听,其他时间里他总是被欺负的那一个。比如可以让他等足足四十多分钟而告诉他只是上楼去放一下包包;比如约好十点半出去玩却要下午两点才从房间懒懒散散地出门;比如他表达不清楚的时候我们就一顿痛批;比如我们赖着他一起吃在HK最最最大陆的美味——烤鱼,每次都要香麻辣,整一条;比如他很大方地说等他在日本安顿下来,就报销路费让我们去玩,而我真的把这句话当真记下了。欺负他之不留情面,就如同想念他之真真切切。Mr. D,等你的好消息。一路平安,要找到可以贤妻良母的女孩子是最适合你的,一定要抱着期待和感恩。

@@ -17,4 +22,4 @@

跟Sibyl也是这样,一直挥手到25M小巴启动并飞出去。她接下来会有怎样的选择?NGO的前线,我都不舍得让她去,爸爸妈妈怎么办?她会在现在的职位做多久?她的终生的努力,会有什么样的结果呢?目前,除了祝福,我什么都帮不了她。天啊,我居然催她要找个合适的人结婚,上帝啊,好一个愚蠢的建议!有男孩子能有那么大的爱心和奉献可以跟她一起做NGO的前线,去实现梦想,好好走一路么?有那么好的男孩子么?

魏姐,上个星期前就告别了,在九龙塘地铁站小巴出口电梯旁,抱抱,她走掉。我们总有说不完的电台的人和事,说一直都没有完成的心愿,做一部广播剧;说她最辛苦的时光,帮我打气;说不知道接下来会怎么办,大家都有迷茫。她是个好善良好温柔的女孩儿,除了说她人很好以外,我找不到一个更合适的词更贴切地来形容。她总是有耐心,对于我这种很孩子气的寄生虫来说,赖着她真是太合适不过了。我们说让她在HK成立一个兰大电台驻港办事处,呵呵,说笑了。希望她去尖沙咀找到了五月天的糖,希望她幸福。

我总是一个后知后觉的人,离别的场面上我是常常最笑得出的那个,也是常常在离开后又跑来敲键盘或者爬格子的那个。停不了的胡思乱想,那些人,那些事。一转身,就是一辈子。

-
给自己一个以寂寞为名的嘴巴子
\ No newline at end of file +
给自己一个以寂寞为名的嘴巴子
\ No newline at end of file diff --git "a/docs/2011/05/21/\347\273\231\350\207\252\345\267\261\344\270\200\344\270\252\344\273\245\345\257\202\345\257\236\344\270\272\345\220\215\347\232\204\345\230\264\345\267\264\345\255\220/index.html" "b/docs/2011/05/21/\347\273\231\350\207\252\345\267\261\344\270\200\344\270\252\344\273\245\345\257\202\345\257\236\344\270\272\345\220\215\347\232\204\345\230\264\345\267\264\345\255\220/index.html" index 0682b49dd..ed7d21b80 100644 --- "a/docs/2011/05/21/\347\273\231\350\207\252\345\267\261\344\270\200\344\270\252\344\273\245\345\257\202\345\257\236\344\270\272\345\220\215\347\232\204\345\230\264\345\267\264\345\255\220/index.html" +++ "b/docs/2011/05/21/\347\273\231\350\207\252\345\267\261\344\270\200\344\270\252\344\273\245\345\257\202\345\257\236\344\270\272\345\220\215\347\232\204\345\230\264\345\267\264\345\255\220/index.html" @@ -1,16 +1,21 @@ -给自己一个以寂寞为名的嘴巴子 | Beendless ~ 快节奏,慢生活,无止境 +给自己一个以寂寞为名的嘴巴子 | Beendless ~ 快节奏,慢生活,无止境 -

给自己一个以寂寞为名的嘴巴子

曾经听过很多对寂寞的比喻——比如寂寞像流水,无声无息,但我觉得是静水流深;比如寂寞像咖啡,甘苦参半,我看帮助自己清醒。陈明有一首老歌,《寂寞让我如此美丽》,近来总是很喜欢。当然,我不是要发嗲说自己寂寞,只是最近觉得,这是一个很好的语辞。

+

给自己一个以寂寞为名的嘴巴子

曾经听过很多对寂寞的比喻——比如寂寞像流水,无声无息,但我觉得是静水流深;比如寂寞像咖啡,甘苦参半,我看帮助自己清醒。陈明有一首老歌,《寂寞让我如此美丽》,近来总是很喜欢。当然,我不是要发嗲说自己寂寞,只是最近觉得,这是一个很好的语辞。

总是莫名奇妙地会很想七仙女,时不时就梦见她们。以前梦醒之后就发短信告诉她们,现在学会了偷偷地梦到,再默默地讲给自己听。其实也不远,为什么又不专门跑去见呢?固步自封。我越来越把自己锁在一个小小的世界,只是偶尔开窗透气而已。我已经几乎不参加任何集体活动了,逃不开地参加一次,就发现自己与外面的世界越来越遥远。已经不再看资讯,甚至也不上人人。开电脑只是查单词或者跟某个人说话,一个大言不惭地扬言关注文化交流的人,拒绝了自己与他人,甚至与八卦的交流。因为觉得这个世界每天上演的都是谎言,都是闹剧。从铁道部到央企,食品监管、药品价格,房地产就更不用提了,似乎每天都很热闹,但是我或者我们的关注有什么意义么?问责政府,批判现实,意义呢?富士康昨晚又爆炸了,要是以前的我,肯定又感性地要为人家被烧得面目全非而难过,现在呢,戏称一句可能Ipad2水货会提价,就跑掉了。

这个世界太吵,我的声音微不足听,不如省省嗓子。曾经觉得知识分子为独立之学术,自由之精神而活,大家都掩耳盗铃地说自己是在“为天地立心,为生民立命,为往盛继绝学,为万事开太平”。张载这句话总结了中国历代知识分子的梦想,曾经,我也被感动了。但现在,我怎么觉得知识分子全部都是阿Q呢?最TMD悲哀了。能够保持独立和个人精神自由的,一毛钱用都没有,这还是凤毛麟角了;绝大多数也不过就是附庸风雅,并且背靠大树乘凉呢。都是些虾米嘛!还不是一盆棋子,被等着摆放在某个方格或交叉点上。中国的知识分子,永远逃不出官僚体制的五指山。

好了,一副清高的装子样儿,别二了,低下头来问自己,那我又在干什么呢?我满脑子是浆糊,关于硕士毕业论文的各种线头缠绕在一起,我自己也不知道我到底要写什么。以为自己有进步,以为自己学会了如何深入,以为以为,现在却发现自己只会细化,只会发散,没有逻辑。人家碎化的是已经成为整体的历史,而我像个小丑一样根本拼不起来一个完整的历史就在高喊碎化啊碎化,真是脑子有病!谁有药啊?

另一个工种也做的不好。以前觉得欧美人号称自己会很多语言,是因为英语、法语,都与其渊源的拉丁语、希腊语相关,学起来当然很快。我是中国人,自然没那么容易了。又错了,看吧,这又是一个傻瓜的自我安慰。母语是英语的人学德语也很困难啊。那*老师怎么可以掌握七八门外语的?我还阿Q呢?看到现在的高中生动不动TOEFL考个一百一十多,SAT考古一千两百多。不知道他们的初高中都在学什么啊?不到十年的差距,我这前浪还没来得及翻腾两分钟呢就被要拍死在沙滩上了。

话说,正是四面楚歌的我说这么多废话是极其奢侈和不要命的。也讽刺地证明了我是个耐不住寂寞却不得不寂寞的白痴。与其装小资装稀薄,不如说是懒筋又抽了吧。人家每个月都有那么几天不舒服,我看我是每个星期都有一两次欠抽。于是,抽自己一嘴巴的寂寞!

-
路——有选择,是过程,并通向结束
\ No newline at end of file +
路——有选择,是过程,并通向结束
\ No newline at end of file diff --git "a/docs/2011/06/18/\350\267\257\342\200\224\342\200\224\346\234\211\351\200\211\346\213\251\357\274\214\346\230\257\350\277\207\347\250\213\357\274\214\345\271\266\351\200\232\345\220\221\347\273\223\346\235\237/index.html" "b/docs/2011/06/18/\350\267\257\342\200\224\342\200\224\346\234\211\351\200\211\346\213\251\357\274\214\346\230\257\350\277\207\347\250\213\357\274\214\345\271\266\351\200\232\345\220\221\347\273\223\346\235\237/index.html" index b4e711f45..b79fedb51 100644 --- "a/docs/2011/06/18/\350\267\257\342\200\224\342\200\224\346\234\211\351\200\211\346\213\251\357\274\214\346\230\257\350\277\207\347\250\213\357\274\214\345\271\266\351\200\232\345\220\221\347\273\223\346\235\237/index.html" +++ "b/docs/2011/06/18/\350\267\257\342\200\224\342\200\224\346\234\211\351\200\211\346\213\251\357\274\214\346\230\257\350\277\207\347\250\213\357\274\214\345\271\266\351\200\232\345\220\221\347\273\223\346\235\237/index.html" @@ -1,17 +1,22 @@ -路——有选择,是过程,并通向结束 | Beendless ~ 快节奏,慢生活,无止境 +路——有选择,是过程,并通向结束 | Beendless ~ 快节奏,慢生活,无止境 -

路——有选择,是过程,并通向结束

不知从何时起,悄悄迷恋上“路”这个比喻,时至今日,自己都觉得有些腻烦。除了“在路上”,“生活就是一段航程”之类的附庸风雅外,我还把它写进论文,用来重构******的历史。可是想想,才疏学浅的我仍然没有其他更好的叙述方式来反思我自己的人生,毕竟,它们都是走过的路,未来,也是我要走的路。

+

路——有选择,是过程,并通向结束

不知从何时起,悄悄迷恋上“路”这个比喻,时至今日,自己都觉得有些腻烦。除了“在路上”,“生活就是一段航程”之类的附庸风雅外,我还把它写进论文,用来重构******的历史。可是想想,才疏学浅的我仍然没有其他更好的叙述方式来反思我自己的人生,毕竟,它们都是走过的路,未来,也是我要走的路。

今天是个周年纪念日,去年此时,我的日记里写下“就这样突然起了变化”,不料这个变化居然使我选择一条与曾经截然不同的路。人们常说时间如白驹过隙,随着年龄越来越大,我也更有同感。眨眼的功夫,已经一年了。这一年当中,玛丽猫咪和跳跳虎真正在一起的时间全部加起来都超不过8个星期,它们真的不容易。然而一年前的此时,只是一个闪念,一种莫名的冲动。今天想来,都只能感恩。

这一年当中的时光充满各种旅途的颠簸,我似乎在不断地收拾行李,打包出发。真是这样,先一路向西,再一路北上,期间辗转到上海一次,又从北向南到了HK。回程也是同样,先回到那个很小很温馨的1513,再回兰大4011。不停歇的脚步终究是因为腿腿的问题有一些休息。然而,路还是要自己走,不论充满多少未知和艰辛。既然都是我自己的选择,是我们共同的选择,那就要坚持走下去,无论结局。

承蒙有人疼爱有人关心,还有人照顾有人帮忙,燕子充满各种无限的感恩。但是——我真希望没有这个但是——最终要成长要面对问题的人,只能是自己。比如那天在浦东机场被吓得眼泪往出来涌,比如脚破腿疼得都没法走路,还必须在传送带上狂奔,向目的地的唯一一条路,就必须自己一个人走。任何爱我的人都不在身边,便爱莫能助。感谢各种磨难,总归是成长。

在这个有点特殊的日子里,却连一点小小的庆祝活动都不能有,因为幸福还需要等待,等待玛丽猫咪和跳跳虎同学的重逢。每到周年,我们伟大的党总是 要回首光辉历程,并宣称要继往开来。渺小的我们也应该向党组织学习,偷偷展望一下我们的未来。如果一切顺利,我已经把毕业旅行都计划好了,并且相当宏伟,哎呀,真TMD无耻,因为这个“如果”太难了!那如果不够顺利呢,猫咪历险记仍将继续。

如题,眼下的路是一年前我自己选择的,是我们共同决定的,一路也是我们在好朋友和恩师的帮助下走过的。这条路通向我所不能知,然而这并不妨碍我们将携手并肩,在感恩和祝福中,走向它本应如那样的未来。

谨以此文献给新生命的开端,当然,这只是开端。

-
今冬第一场雪,我有废话说
\ No newline at end of file +
今冬第一场雪,我有废话说
\ No newline at end of file diff --git "a/docs/2011/11/02/\344\273\212\345\206\254\347\254\254\344\270\200\345\234\272\351\233\252\357\274\214\346\210\221\346\234\211\345\272\237\350\257\235\350\257\264/index.html" "b/docs/2011/11/02/\344\273\212\345\206\254\347\254\254\344\270\200\345\234\272\351\233\252\357\274\214\346\210\221\346\234\211\345\272\237\350\257\235\350\257\264/index.html" index 1875f94dc..d5fb5b61e 100644 --- "a/docs/2011/11/02/\344\273\212\345\206\254\347\254\254\344\270\200\345\234\272\351\233\252\357\274\214\346\210\221\346\234\211\345\272\237\350\257\235\350\257\264/index.html" +++ "b/docs/2011/11/02/\344\273\212\345\206\254\347\254\254\344\270\200\345\234\272\351\233\252\357\274\214\346\210\221\346\234\211\345\272\237\350\257\235\350\257\264/index.html" @@ -1,16 +1,21 @@ -今冬第一场雪,我有废话说 | Beendless ~ 快节奏,慢生活,无止境 +今冬第一场雪,我有废话说 | Beendless ~ 快节奏,慢生活,无止境 -

今冬第一场雪,我有废话说

憋这篇日志至少有半个月了,然而终究到考试结束也没想的起来要写。因为顿时就被零碎的生活和新的工作,以及本能的虚妄所充斥了。此刻,窗外飘着雪,就在我眼前不及半米的地方,如果玻璃再能干净一些,我就可以用手接住簌簌的雪片了。于是,我一个人坐下来,觉得想要说话。

+

今冬第一场雪,我有废话说

憋这篇日志至少有半个月了,然而终究到考试结束也没想的起来要写。因为顿时就被零碎的生活和新的工作,以及本能的虚妄所充斥了。此刻,窗外飘着雪,就在我眼前不及半米的地方,如果玻璃再能干净一些,我就可以用手接住簌簌的雪片了。于是,我一个人坐下来,觉得想要说话。

这两个月,甚至这大半年,我都沉浸在一个人的寂寞里。从一开始逼自己安坐在书桌前,到后来用《寂寞让我如此美丽》这样的自我治愈系方法,现在,我居然真的开始享受这寂寞和孤独。无奈的是,这样的蛰伏并没有给我带来可以量化的收获。我可以分明地感受到英语的听说读写都在进步,当我不用字幕去听谢耳朵废话连篇,当我跟native speaker讲得越来越流畅和清晰,当我读英文原著的速度也越来越快——但却总是不能打败ETS,最终落下马的人,还是我。每每到这样失败的时候,我便坐下来,什么也不说,内心难过却也不忘给自己打气。成功学神马的就没有意义了,毕竟我不是渴望着成功去的。经过一次次地敲打脑袋,我越来越看清自己是谁,想要的东西是什么。规律是,你多么渴望成功,你就会多么废寝忘食。然而我终究从来都做不到。我想要的,是自由,是清净,是捕捉地上的感动,再带给别人。我想更多地认识这个世界,我想亲自去感受一下,倾听那钟,走过那桥。为了这个心愿,这一年,也由于负伤,我每天每天都呆在宿舍里,或家里。尤其近四个月,总是一个人。

我还是耐不住寂寞,便每天都驻扎在豆瓣上,时不时去刷刷人人网,一遍遍地看QQ好友的各种动态。但我从来不说话。因为我知道大家都在忙碌,大家刷屏是因为有话要说,而我,没有。我的豆瓣友邻多是一些与我专业方向相关的学长,我很享受看他们推荐各种话题和书目,我很享受坐在路边鼓掌的感觉。很期待明年此时就可以跟他们一样,读书写作发状态,毕竟此时还不能。人人网上,看久了就发现经常刷屏的就那么几个,会来看我的也就那么几个。google+我也用,但其实无论信息技术如何改变社交网络,我想说,每个人终究是自己,是孤独的,真正的圈子并不大。谢耳朵的facebook和twitter上面好友过百,但他的朋友只能是那三五个。虽然我们的智商不比他高,朋友圈也没比他的大。

前几天搬了房子,虽然只是给我们帝都居不易的生活挪了个坑,甚至并不是个更好的坑。但我有自己的小幸福。房间非常窄,非常小,隔壁阿姨说,这怎么能住人呢。我们辛苦了一晚上,阿姨说,哎呀,收拾得真好,还挺温馨的,看着也舒服,你们来了以后整个房子里都干净了。之类之类——我就一下子开心了。生活就是这样赚来的,是靠双手一点一点创造的。再苦再难,只要用了心,怎么会过不好呢?同时,这两天我也有去朋友在国贸那边的家,我才第一次明白为什么有人说在国贸有房子和在海淀有房子是不一样的,有房和有房的差距还是很大的。这就是生活,你只能hold你自己的,切不要斜眼去看人家的。地铁上人来人往,各种气味,大家,不是都活着么?有句话说穷人不得好活,富人不得好死,我觉得有些极端了吧。同时地上的人,谁能明白别人的幸福和痛苦呢?我更觉得幸福是欲望和所得的绝对值的差,再取倒数。我很早就想要有一间自己的小屋,现在有了;我喜欢落地窗,每天早晨被阳光敲脑门,现在也有了;我喜欢墙上订满挂钩,各种利用空间的不择手段,现在这里就是啊。15层,落地窗,一个人,这应该是一个有点才情的写手最想要的环境,只是当我拥有了这一切后,才敢正视自己的平庸和乏味,才敢承认自己最缺的是墨水。那如果再换个角度说,这里房间又窄又小,多人合租不方便,一大扇窗户代替了一面墙,很冷,是不是看起来就可怜了呢?所以我说,幸福都在自己的眼里和手里,自己掂得住就好,何须问他人。我觉得,挺好。

胡诌是我唯一的本事了,废话是我仅剩的财产。

燕子,2011年12月2日晨,吃的很饱。

-
术后重建
\ No newline at end of file +
术后重建
\ No newline at end of file diff --git "a/docs/2011/12/31/\346\234\257\345\220\216\351\207\215\345\273\272/index.html" "b/docs/2011/12/31/\346\234\257\345\220\216\351\207\215\345\273\272/index.html" index a2fc87836..7c18142c2 100644 --- "a/docs/2011/12/31/\346\234\257\345\220\216\351\207\215\345\273\272/index.html" +++ "b/docs/2011/12/31/\346\234\257\345\220\216\351\207\215\345\273\272/index.html" @@ -1,13 +1,18 @@ -术后重建 | Beendless ~ 快节奏,慢生活,无止境 +术后重建 | Beendless ~ 快节奏,慢生活,无止境 -

术后重建

看着所有人都在倒数、跨年、总结,有些百无聊赖的我终于打开日记本履行我所承诺过的“医院感悟”。也算恰当。这个手术,是陈燕子同学2011年度唯一重要也最重要的事情,可以作为年终总结的主题;术后重建也是她对2012所寄予的最大希望,是对新年的期许。

+

术后重建

看着所有人都在倒数、跨年、总结,有些百无聊赖的我终于打开日记本履行我所承诺过的“医院感悟”。也算恰当。这个手术,是陈燕子同学2011年度唯一重要也最重要的事情,可以作为年终总结的主题;术后重建也是她对2012所寄予的最大希望,是对新年的期许。

或许看起来有些矫情,就做一手术,有什么大不了的,还拿来得瑟。与人无关,这是我必须要跟自己矫情的事情。这是我第一次上手术台,是我第一次躺在医院的病床上,是我婴儿期之后的第一次生活不能自理,是我短暂的生命里最痛、最孤独、最害怕的,但也最坚强的日子。手术后整整十天了,只有此刻想写点儿东西作为留给自己的纪念,为了纪念自己走过的每一步,包括蹒跚的任何一步。

住进医院的第一天,我太没有经验,不懂得自己应该准备些什么,没有带拖鞋,没有拿多余的干净毛巾,没有准备照顾自己生活的任何器具。天啊,我带了洗漱用品,带了喜欢的书,还穿了靴子,现在想来是多么好笑,我居然带的是自己平日出门旅行的随身用品,我是按照这个标准去准备住进医院的。被一群护士围着两个胳膊,像从干涸的黄土高坡打井一样抽出五六管血后,我才发现自己错了。换了病号服,就没有合适的鞋子穿。就这样,二不拉几的,我傻站在自己的病床前,看着三五大汉把一个刚做完手术的老太太从递送床抬到我隔壁的病床上。看着她还不省人事,看着从她身上导出来的各种管子和血,看着所有人忙着给她的腿下垫枕头——绷带,血,液体,导管——我才让自己镇定下来。喔,这是我此行的目的地,没有五颜六色的风景。我还带了XIXI远从韩国带到香港再邮寄给我的喜庆的红色马甲和笔袋,我还带了相机想留个念什么的,所有这些从住院的第一刻到出院,我都没用上过,甚至都没拿出来。因为根本就顾不上了。

手术是需要全部都脱光后扔到手术台上去消毒的,我刚开始还各种矫情,一剂麻醉从脊椎扎进去之后,我告诉自己,衣服啊神马的都弱爆了,还是嘴上这个氧气面罩比较给力。整个三小时,听着锤子、锯子、钻子之类在修车厂见过的东西在叮叮当当却不是圣诞歌曲,我紧张到呼吸短促,一旁的麻醉科帅哥看着我的心脏波动急促就不停地问,“你有什么不舒服吗?”我便乖乖的摇摇头表示没有,其实心想,姐就是有点紧张,姐还能hold住。几天以后,我问起DYB,我在手术室里面的时候他在外面想什么。(FYI,由于各种原因,他没赶上把我推进手术室,只是在远处看到医生把我推进去后就关了门。很泡沫啊!)他说等到进去后快两个小时的时候还不听到我的任何消息,他害怕了,但根本不敢往下想,马上刹住。看起来挺不浪漫的,不过我想这是真的。

@@ -16,4 +21,4 @@

码字并没有谈多少的感受,只是记录一段自己的历史,虽然在医院见闻也很多。比如跟临床的叔叔阿姨一起聊他们亲历过的唐山大地震,比如陌生的病友之间的相互支持和帮助,比如电梯里所有病人家属的苦痛却坚毅的脸。医院是一个最冷冰冰但也最充满爱的地方,我愿意看到后者。再比如我幻想到我们大家都老去的时候会不会生病,比如每天都梦见各种定西人民才发现人在最无助的时候会想家。

然而,任何的感受在病痛面前都黯然失色,任何的苦难在未来和希望面前都只是铺平的道路,我只想说一句:

祝愿我们大家的2012健康,平安。

-
从4战四级470到4战托福105,我的血泪申请之路
\ No newline at end of file +
从4战四级470到4战托福105,我的血泪申请之路
\ No newline at end of file diff --git "a/docs/2012/02/15/\344\273\2164\346\210\230\345\233\233\347\272\247470\345\210\2604\346\210\230\346\211\230\347\246\217105\357\274\214\346\210\221\347\232\204\350\241\200\346\263\252\347\224\263\350\257\267\344\271\213\350\267\257/index.html" "b/docs/2012/02/15/\344\273\2164\346\210\230\345\233\233\347\272\247470\345\210\2604\346\210\230\346\211\230\347\246\217105\357\274\214\346\210\221\347\232\204\350\241\200\346\263\252\347\224\263\350\257\267\344\271\213\350\267\257/index.html" index f109eea96..ac8c3f1de 100644 --- "a/docs/2012/02/15/\344\273\2164\346\210\230\345\233\233\347\272\247470\345\210\2604\346\210\230\346\211\230\347\246\217105\357\274\214\346\210\221\347\232\204\350\241\200\346\263\252\347\224\263\350\257\267\344\271\213\350\267\257/index.html" +++ "b/docs/2012/02/15/\344\273\2164\346\210\230\345\233\233\347\272\247470\345\210\2604\346\210\230\346\211\230\347\246\217105\357\274\214\346\210\221\347\232\204\350\241\200\346\263\252\347\224\263\350\257\267\344\271\213\350\267\257/index.html" @@ -1,13 +1,18 @@ -从4战四级470到4战托福105,我的血泪申请之路 | Beendless ~ 快节奏,慢生活,无止境 +从4战四级470到4战托福105,我的血泪申请之路 | Beendless ~ 快节奏,慢生活,无止境 -

从4战四级470到4战托福105,我的血泪申请之路

1
突然发现当年写的这篇文章被无数论坛转载。。。
+

从4战四级470到4战托福105,我的血泪申请之路

1
突然发现当年写的这篇文章被无数论坛转载。。。

各论坛经验贴颇多,ibt考110+甚至进逼的大牛们俯拾皆是。我很弱,弱到不得不4战托福,前后总计整整一年,同时考了新GRE和雅思,摸爬滚打才走到今天。我很怂,我屡次站在放弃的边缘,我的目标从来就是一个95分,但我最终怂到了最后,没有怂在半路上!2.5的成绩是30+27+23+25=105.按捺不住内心的激动写下自己这段征程,期待与跟我一样并不属牛的战友们、烤鸭们共勉。(注:本文略有吐槽嫌疑,算是为自己励志继续前行;没兴趣的童鞋直接浏览加黑下划线内容,是复习资料和心得部分。)

一、我的英文背景

@@ -15,16 +20,16 @@

二、与ETS的爱恨情仇(含学习心得和资料准备)

  1. 初识

    -

    2011年春节,我在北京水清校区上新东方——神授杜昶旭、马骏(当时小马哥还在)、史禺、于浩洋——第一次比较清楚的认识托福考试是什么,考什么,怎么考。感谢杜哥杜昶旭,让我第一次了解到复合句和简单句的区分和基本组合,他用类似计算机编码解码的思维告诉大家如何应对长难句——拆分成分,以**that****等连接词为基本信号。不再赘述,网络上四处可见他的讲义,我真心觉得比杨鹏长难句更受用,因为他够基础,够简介明了、清晰易懂。需要弥补基础的同学应该先学杜昶旭,再用杨鹏或者小马去做练习(二位都偶有句子分析是错误的,要小心)。

    -

    谈恋爱,最初印象很重要,否则满盘皆输。初识IBT没有任何门道,要且只要**OG**就可。而且OG给出的例题都比真实考试简单,也适合我们跟ETS刚开始的磨合,期待擦出火花。

    +

    2011年春节,我在北京水清校区上新东方——神授杜昶旭、马骏(当时小马哥还在)、史禺、于浩洋——第一次比较清楚的认识托福考试是什么,考什么,怎么考。*感谢杜哥杜昶旭,让我第一次了解到复合句和简单句的区分和基本组合,他用类似计算机编码解码的思维告诉大家如何应对长难句——拆分成分,以that*等连接词为基本信号。不再赘述,网络上四处可见他的讲义,我真心觉得比杨鹏长难句更受用,因为他够基础,够简介明了、清晰易懂。需要弥补基础的同学应该先学杜昶旭,再用杨鹏或者小马去做练习(二位都偶有句子分析是错误的,要小心)。

    +

    谈恋爱,最初印象很重要,否则满盘皆输。初识IBT没有任何门道,要且只要OG就可。而且OG给出的例题都比真实考试简单,也适合我们跟ETS刚开始的磨合,期待擦出火花。

  2. 三战纠结

    我自己身上插过的刀子可以给大家一些前车之鉴,希望后来的童鞋们不要跟我一样犯错。

    • 第一,合理安排自己备考、申请的程序,并一举拿下,不可恋战。**

      我已然研三,从2011年春节到10月申请,时间紧迫。并且此时我因意外摔断膝盖韧带,行动不便,因及时手术。考虑到手术并非迫在眉睫,且术后需要一年半载的复健和休养,上学又不能耽搁。我选择了推迟手术到年末,全力考英语,准备申请材料。这是一个破釜沉舟的决定,用自己的健康做了赌注,背水一战,只为赢自己一次。那晚做下决定后我打电话给家中的爸妈,然后跟男友一起都哭成了泪人儿。当然,腿伤要尽量呵护,要常常小心。可是却因我的心浮气躁,接下来的考试安排几乎是定了败局。

      -

      为了赶在2011年11月之前能申请米国的博士,我穿插考托福和新GRE,甚至一个月备考T接着一个月G。4.23首战考托84分,我坚持过1个月小马听写训练营(当时无老师的整套听写还未横空出世),模考了17套TPO,口语作文全都做。分数不高,但是根据我的基础,我安慰了。现在回想来,当时的练习很多都是接触**IBT**的皮毛,自己没有深刻的理解和把握ETS**的出题思路,后文详述。之后我硕士论文开题、再到香港开会神马的一系列专业方面的事情,也写了PS(虽然写得不好),并在8月份裸考了一次新GRE。没什么感觉,GRE这个神的形象破灭了,我觉得他没有想象中那么要命。论到挑战体力和心理承受能力,**IBT**的铁人四项同时袭来,最伤不起。考托IBT**后再去考GRE**和雅思神马的,都觉得考场上至少没那么累。**紧接着9月IBT,10月再GRE,11月再IBT。期间还见我要申请的国外的导师,准备面试和写RP。为什么这样纠结呢?因为我每次都以为自己可以拿下,但每次成绩出来后不得不再报考一个月后的再战。

      -

      脚踩两只船,最后掉在水里的是我自己,承受各种心里压力和打击。但是苦痛和煎熬终究不会白费。准备**GRE**的时候扫清长难句障碍,啃完红宝书和要命3000**,甚至最疯的时候背韦氏字典,当然,刚到C**我就挺不住了。读字典其实是一个很好的方法,我发现他可以弥补很多我们匆忙备考的知识缺陷,比如词性、用法、多义、各种比喻和引申,并且有效地将我们汉英或英汉字典的翻译思维转变成英英的方式去理解每一个单词和例句。(注:我认为除了韦氏和牛津、朗文等字典上的例句,其他单词书上的就都不要看了吧,只会帮你学成地道的chinglish**)当时备考时间有限,我不得不放弃。建议有时间经历的童鞋可以至少坚持读完一本为老GRE**编写的韦氏字典,我现在就得要常翻翻。总之,我的托福词汇关算是用GRE**给过了,有时候看big bang theory**,从谢耳朵小盆友嘴里闪过一串自己能认识的GRE**单词,那感觉,妙不可言。会当凌绝顶,一览众山小,这是我最大的收获。当你的屁股在板凳上钉住,当你的眼睛与一屏幕地GRE**单词放电,IBT**阅读的词汇需求再也不会吓到你。**

      +

      为了赶在2011年11月之前能申请米国的博士,我穿插考托福和新GRE,甚至一个月备考T接着一个月G。4.23首战考托84分,我坚持过1个月小马听写训练营(当时无老师的整套听写还未横空出世),模考了17套TPO,口语作文全都做。分数不高,但是根据我的基础,我安慰了。现在回想来,当时的练习很多都是接触IBT的皮毛,自己没有深刻的理解和把握ETS****的出题思路,后文详述。之后我硕士论文开题、再到香港开会神马的一系列专业方面的事情,也写了PS(虽然写得不好),并在8月份裸考了一次新GRE。没什么感觉,GRE这个神的形象破灭了,我觉得他没有想象中那么要命。论到挑战体力和心理承受能力,IBT的铁人四项同时袭来,最伤不起。考托IBT后再去考GRE和雅思神马的,都觉得考场上至少没那么累。紧接着9月IBT,10月再GRE,11月再IBT。期间还见我要申请的国外的导师,准备面试和写RP。为什么这样纠结呢?因为我每次都以为自己可以拿下,但每次成绩出来后不得不再报考一个月后的再战。

      +

      脚踩两只船,最后掉在水里的是我自己,承受各种心里压力和打击。但是苦痛和煎熬终究不会白费。准备GRE的时候扫清长难句障碍,啃完红宝书和要命3000,甚至最疯的时候背韦氏字典,当然,刚到C我就挺不住了。读字典其实是一个很好的方法,我发现他可以弥补很多我们匆忙备考的知识缺陷,比如词性、用法、多义、各种比喻和引申,并且有效地将我们汉英或英汉字典的翻译思维转变成英英的方式去理解每一个单词和例句。(注:我认为除了韦氏和牛津、朗文等字典上的例句,其他单词书上的就都不要看了吧,只会帮你学成地道的chinglish)当时备考时间有限,我不得不放弃。建议有时间经历的童鞋可以至少坚持读完一本为老GRE编写的韦氏字典,我现在就得要常翻翻。总之,我的托福词汇关算是用GRE给过了,有时候看big bang theory,从谢耳朵小盆友嘴里闪过一串自己能认识的GRE单词,那感觉,妙不可言。会当凌绝顶,一览众山小,这是我最大的收获。当你的屁股在板凳上钉住,当你的眼睛与一屏幕地GRE单词放电,IBT****阅读的词汇需求再也不会吓到你。

    • 第二,历次艰辛备考,TPO****是王道,然而你的工作不仅仅是做题。

      一战刚才说了,是踏踏实实准备的,实力所限,并且只摸到ETS的皮毛,以84分收兵。

      @@ -43,11 +48,11 @@
    • 四战打破听力笔记的神话

      11月26日是我三战,惨败。其他三项发挥正常,但是听力遇到一篇口音很奇怪,声音也很诡异的老男人,那篇听到结尾的时候才知道原来在讲一个海底测潮汐的什么东西,但是还有直升机怎么帮助测量。并且在考听力的时候,牙龈出血,就一口一口往外吐血啊我。血,是真的血,但还好只是牙龈的血。幸好带了不多纸巾,一直吐到听力最后一篇。(如前所述,备考期间压力太大,总是上火。)我就一边听听力,一边记笔记,一边吐血。忙死我了。听到第四篇lecture的时候我已经坚持不住了。心里底线崩溃了,我抓起身份证,想要就这样走出考场,不再考了。就这样纠结着,听完了听力加试部分,血终于止住了。我颤颤巍巍走出考场,在洗手间的镜子前对自己笑了笑,姑娘,你庆幸吧,幸好不是口语的时候吐血啊,那录出来的非吓死rater不可了。于是我选择回到考场,平静地做完口语和作文,并且感觉不错。不能放弃,在我们所经历的每一个时刻,放弃,就真的输了。

      当然,这次成绩是在我意料之中的全军覆没,28+16+23+25=92。手术在即,真的不能再考了,那一天,我一个人抱着自己,蜷缩在房间的角落里,迎着落地窗撒进来的阳光,眼睛被刺得睁不开,我又一次决堤了。接下来跟男朋友商量放弃的打算。我们一边商量如何放弃考试放弃申请,一边重新规划着毕业后找工作的事情,说着说着两个人又都哭了。将近一年,这就是我们全力以赴赌出来的结果吗?出国的路是我自己选的,放弃也要我来选吗?北漂的我们都是重点大学毕业,他做IT,薪资待遇还不错,我也可以做一个普通的白领,但两个人上万的月薪也无法企及天价的房子。更何况,更何况我还有个小小的学术理想,而他又那么难得地支持一个想要修炼成女博士的学术妖精。我们就这样商定了放弃的事情。翌日清晨,当我抬头再次看到窗外的阳光,却突然做了一个最莽撞的选择。

      -

      我选择马上报名,报考2.5的托福和2.9的雅思,考试时间都安排在2月初,因为这是我做手术后刚刚一个月可以下地走路的时间,也是我需要外语成绩去申请项目的最后机会。(那个博士项目要3月1日递交申请材料)我匆匆忙忙报了名,谢天谢地,在很多人嚷嚷没考位的时候我居然报上了,北京市教育考试指导中心的考位,老师人也nice,考生间的分隔也好。再网上匆匆忙忙了解了一下雅思考试,然后买了剑桥**1-8**,下载了王陆807**单词和28**天,祁连山阅读,十天雅思essay**等的一大包资料。**再一次上路了。

      +

      我选择马上报名,报考2.5的托福和2.9的雅思,考试时间都安排在2月初,因为这是我做手术后刚刚一个月可以下地走路的时间,也是我需要外语成绩去申请项目的最后机会。(那个博士项目要3月1日递交申请材料)我匆匆忙忙报了名,谢天谢地,在很多人嚷嚷没考位的时候我居然报上了,北京市教育考试指导中心的考位,老师人也nice,考生间的分隔也好。再网上匆匆忙忙了解了一下雅思考试,然后买了剑桥1-8,下载了王陆807单词和28天,祁连山阅读,十天雅思essay****等的一大包资料。再一次上路了。

      还没有完全整明白雅思是怎么回事儿,还要修改research proposal,我就进医院了。住院手术,紧接着就是卧床不起的郁闷。腿伤做了手术,除了疼痛和难受外,最讨厌的就是不方便动了。2011年末,圣诞节,手术顺利我充满感恩,但全身上下没有一根神经是可以拿来备考托福和雅思的。直到出院后一个星期,我还是卧床看了desperate housewife一个星期,伴随着术后的康复练习和自己心理治愈,我才慢慢坐到书桌前。

      已经是2012年春节前,大概1月15号左右,看美剧我都快要看吐了的时候才醒悟过来。又一年春节不回家,滞留北京;拖着病腿,吃着药还冲咖啡;男朋友为了照顾我也不能回家。这一切都是为了什么呢?想起一句话,The moment when you think about giving up, think of the reason why you held on so long. 这时我才重拾书本,认真备考,距离IBT已经不足三周,距离雅思也不足四周。

      -

      这一次我首先安静下来细想前三次都致命的听力。我明明感觉到自己在进步,但为什么一做听力就死呢?原来,我根本不适合用听力笔记。一开始了解托福的时候,所有老师都说必须要记笔记,因为段子很长,所以我就跟着开始学。那时候听不懂,也记不了什么,就半死不活地一直记着。但其实我记的笔记从来没有任何作用啊,不仅对答题没作用,对我记忆段子内容也没作用,甚至还让我分心,因为笔头毕竟不如音频快。但如果我就这样扔开笔记,我又不放心,毕竟从来没有一个老师站出来给我点儿理论依据这样做。再一次,我再一次跟自己赌了一把。我发现不做笔记有这样的好处。第一,我懒,不做笔记只是听原文和做题,会让我对听力这部分更有兴趣;第二,专心听而不顾及笔记,就能有更多的心思和精力去听懂原文的发音、单词、句意,甚至还能抽出空闲来把握全文结构;第三,只听不写可以帮助我过滤暴力生词而不必太在意它;第四,短短**6**分钟的lecture**,大脑容量绝对足够瞬间记忆下来重点内容,再去作答,要相信自己!于是在我这样放开胆子试了几天,就像顿悟了一样,真的能听得明明白白真真切切,再也不是雾里看花了。即使有听不懂的地方,那也是有一段听不懂,但是可以继续回到主题来的。这样子试了一个多星期后,看到无老师的微薄贴出一篇文章,表示反思时下流行的听力笔记技巧之风。我甚为安慰,按部就班,每天1套TPO的听力。是不是有同学会问,不写笔记,走神了怎么办?我想说,你写笔记才更容易走神呢?第一,用铅笔写下写下笔记,容易只见树木不见森林,听听力记笔记和用听写去提高听力实力是完全不一样的,其实听写是一个帮助我们专心、集中注意力的途径,而笔记不是,它是另一个需要你分配注意力的项目;第二,忙着低头写,有时候忘了看屏幕或者抬头抬的不自然,不仅容易造成紧张情绪,而且让我们遗漏屏幕提示,虽然那只是偶尔一两个专业名词,但对于把握段子主旨和过滤生词非常重要;第三,想要听力不走神,怎么办呢?方法见下文。**

      -

      关于阅读,我这次还是时间紧张,别忘了,还有雅思要学呢……所以两天我做一次阅读,每次做一个TPO的,然后当晚总结。三战时候我也总结了,什么题目,为什么错,我的思维哪里错了,ETS出题的是怎么思维的呢?这些问题也是各个培训老师会教大家去总结的。然而这次不同,我觉得,但好像总结完也就完了,并不能对下次做题提高什么。我再静下来想一想,问题出在哪里了?因为我每次总结后的经验教训仍然是零散的、不够系统的。这一次,我要把自己纠结的题目和当时怎样纠结的,都记录下来,然后把它们汇总,其实**2-3**套题就可以发现,自己经常出错在哪几个方面。比如我自己,我错在,第一,首次扫读文章的时候明知逻辑词所在句子是重点,但常常视而不见,不够主动去发现这些重点,所以看到选项再去定位时还要花点时间;第二,句子插入题我想的太多了,所以总觉得四个选项都不对,此时需要用ETS**的惯用思维去选最可能的选项。总之,我阅读错的不太多,但每一页总结的纸上都有红红的大字写着“抓‘主’啊,短语的主要成分,句子的主干,段落的主要内容,文章的主旨”。基督徒和穆斯林都把他们的神叫做“主”,认为这是至高无上、自有永有的,是统管一切的存在。其实,IBT**的阅读听力材料又何尝不是呢?找主心骨儿啊孩纸们。再到临考前一个星期,这样的总结可以让我驾轻就熟,对IBT阅读很亲切,这样才可以上考场了。

      +

      这一次我首先安静下来细想前三次都致命的听力。我明明感觉到自己在进步,但为什么一做听力就死呢?原来,我根本不适合用听力笔记。一开始了解托福的时候,所有老师都说必须要记笔记,因为段子很长,所以我就跟着开始学。那时候听不懂,也记不了什么,就半死不活地一直记着。但其实我记的笔记从来没有任何作用啊,不仅对答题没作用,对我记忆段子内容也没作用,甚至还让我分心,因为笔头毕竟不如音频快。但如果我就这样扔开笔记,我又不放心,毕竟从来没有一个老师站出来给我点儿理论依据这样做。再一次,我再一次跟自己赌了一把。我发现不做笔记有这样的好处。第一,我懒,不做笔记只是听原文和做题,会让我对听力这部分更有兴趣;第二,专心听而不顾及笔记,就能有更多的心思和精力去听懂原文的发音、单词、句意,甚至还能抽出空闲来把握全文结构;第三,只听不写可以帮助我过滤暴力生词而不必太在意它;第四,短短6分钟的lecture****,大脑容量绝对足够瞬间记忆下来重点内容,再去作答,要相信自己!于是在我这样放开胆子试了几天,就像顿悟了一样,真的能听得明明白白真真切切,再也不是雾里看花了。即使有听不懂的地方,那也是有一段听不懂,但是可以继续回到主题来的。这样子试了一个多星期后,看到无老师的微薄贴出一篇文章,表示反思时下流行的听力笔记技巧之风。我甚为安慰,按部就班,每天1套TPO的听力。是不是有同学会问,不写笔记,走神了怎么办?我想说,你写笔记才更容易走神呢?第一,用铅笔写下写下笔记,容易只见树木不见森林,听听力记笔记和用听写去提高听力实力是完全不一样的,其实听写是一个帮助我们专心、集中注意力的途径,而笔记不是,它是另一个需要你分配注意力的项目;第二,忙着低头写,有时候忘了看屏幕或者抬头抬的不自然,不仅容易造成紧张情绪,而且让我们遗漏屏幕提示,虽然那只是偶尔一两个专业名词,但对于把握段子主旨和过滤生词非常重要;第三,想要听力不走神,怎么办呢?方法见下文。

      +

      关于阅读,我这次还是时间紧张,别忘了,还有雅思要学呢……所以两天我做一次阅读,每次做一个TPO的,然后当晚总结。三战时候我也总结了,什么题目,为什么错,我的思维哪里错了,ETS出题的是怎么思维的呢?这些问题也是各个培训老师会教大家去总结的。然而这次不同,我觉得,但好像总结完也就完了,并不能对下次做题提高什么。我再静下来想一想,问题出在哪里了?因为我每次总结后的经验教训仍然是零散的、不够系统的。这一次,我要把自己纠结的题目和当时怎样纠结的,都记录下来,然后把它们汇总,其实2-3套题就可以发现,自己经常出错在哪几个方面。比如我自己,我错在,第一,首次扫读文章的时候明知逻辑词所在句子是重点,但常常视而不见,不够主动去发现这些重点,所以看到选项再去定位时还要花点时间;第二,句子插入题我想的太多了,所以总觉得四个选项都不对,此时需要用ETS的惯用思维去选最可能的选项。总之,我阅读错的不太多,但每一页总结的纸上都有红红的大字写着“抓‘主’啊,短语的主要成分,句子的主干,段落的主要内容,文章的主旨”。基督徒和穆斯林都把他们的神叫做“主”,认为这是至高无上、自有永有的,是统管一切的存在。其实,IBT的阅读听力材料又何尝不是呢?找主心骨儿啊孩纸们。再到临考前一个星期,这样的总结可以让我驾轻就熟,对IBT阅读很亲切,这样才可以上考场了。

      口语和作文我算是裸考,而且每次成绩几乎都一样。这个靠实力,靠积累,不是半个月应试可以完全提高到26分以上的。

      2月5日,男朋友送住着双拐不能自如行走的我去考托福;突击3天做完8套剑桥雅思9分雅思阅读,听写了王陆真题语料库后,我们再次拄着拐杖、戴着护具去考雅思。也感恩北京教育考试指导中心的老师们给予我的方便。(除了没有电梯和座式马桶外,其他都好)

    • @@ -65,22 +70,22 @@
    • IBT四项的复习

      我会简单将自己的心得体会写在这里与大家分享,但只是一家之言,不敢误人子弟,毕竟我不是什么培训机构的老师,我只能文责自负。其实最好的办法是,大家备考中每个一段时间,自己来给自己写一个复习心得。就好像有人每个一段时间写一封遗嘱留给自己一样,是个总结,也是个展望。

      阅读——

      -

      先说扫读,如上文所述,“主”。但是主在哪里呢?标题、首段、每段首末句、全文当中逻辑词所在的句子(切记,让步之处是山重水复,转折才是柳暗花明)。用时4-5**分钟,最多不能超过6**分钟。

      -

      再说做题,简而言之,所有选择题都当做填空题去做,看到题目就给自己一个答案,然后再去选择,这样可以有效避免被迷惑,失去主心骨。切记,你越主动,ETS**就越被动。具体说,第一,见到词汇题,秒杀;实在不认识的才需要回原文去赌一把它是什么意思,然后再从选项中选择,沾边就对,不要多想;如果原词和选项很多词都不认识,没什么技巧,只是不要浪费银子了,回去背单词。第二,插入句子题,ETS**出题都比较规范,所插句子必定有前后两部分的名词(也就是主干啊)可以与文中相连接,或者有个短语,如in either case**等可以做提示,好像拼图一样,我们只是补入一块让它更流畅。第三,总结主旨题,这是我最弱项,弱在我常常凭感觉回答,大错特错,应该先剔除描写错误的选项,再剔除描写太细致的选项,如果纠结就回到原文,不是把纠结项拿回原文去对应啊,是自己去把握一下全文结构,因为本题只选三个选项,所以你回答自己,这篇文章在说什么?只许回答三块,这三块基本就是答案了。第四,作者为什么提A**,答案就在A**所在的本句或者前一句。第五,各种EXCEPT**题目和具体问题具体对待的那些题目,先定位到本句,再纵观前后共三句,还找不到答案的就看该句所在的段的主旨,还找不到,如此够变态的话,直接往全文主旨上猜。此时要注意的是时间,不要恋战太久。

      -

      阅读干扰项总结,要么是原文根本没提的东西,但属于统一范畴,它就出来诱惑你等你上钩;要么原文提到它,但具体内容不是,(比如是个主谓,文章说了选项的主语,但谓语不是这么个情况),就像妖精变成了美女勾引猪八戒呢;要么原文跟选项一样,但不是文章所要讨论的主要内容,只是个sub-topic**或者float topic**,或者牛头不对马嘴,答非所问,这种情况更难,我称作“引入歧路”,一定要避开这种诱惑。

      -

      必须要提一下,祁连山讲雅思的T/F/NG**题目时候说题目的句子和原文内容是如何匹配的。我自己总结为,原文可以证实的题目句子为T**,原文可以证伪的为F**,原文不能证实不能证伪的为NG**。这种严谨的思维方式对我做托福阅读,尤其是帮助我克服自己容易胡思乱想、想入非非、不以原文为唯一依据的臭毛病非常有效。IBT**的阅读选项,有且只有原文可以将他证实的,才是正确选项。比如原文句子说,A**是B**的充分不必要条件,则这个选项如果说A**是B**的充要条件,那就是错的。**

      +

      先说扫读,如上文所述,“主”。但是主在哪里呢?标题、首段、每段首末句、全文当中逻辑词所在的句子(切记,让步之处是山重水复,转折才是柳暗花明)。用时4-5分钟,最多不能超过6分钟。

      +

      再说做题,简而言之,所有选择题都当做填空题去做,看到题目就给自己一个答案,然后再去选择,这样可以有效避免被迷惑,失去主心骨。切记,你越主动,ETS就越被动。具体说,第一,见到词汇题,秒杀;实在不认识的才需要回原文去赌一把它是什么意思,然后再从选项中选择,沾边就对,不要多想;如果原词和选项很多词都不认识,没什么技巧,只是不要浪费银子了,回去背单词。第二,插入句子题,ETS出题都比较规范,所插句子必定有前后两部分的名词(也就是主干啊)可以与文中相连接,或者有个短语,如in either case等可以做提示,好像拼图一样,我们只是补入一块让它更流畅。第三,总结主旨题,这是我最弱项,弱在我常常凭感觉回答,大错特错,应该先剔除描写错误的选项,再剔除描写太细致的选项,如果纠结就回到原文,不是把纠结项拿回原文去对应啊,是自己去把握一下全文结构,因为本题只选三个选项,所以你回答自己,这篇文章在说什么?只许回答三块,这三块基本就是答案了。第四,作者为什么提A,答案就在A所在的本句或者前一句。第五,各种EXCEPT题目和具体问题具体对待的那些题目,先定位到本句,再纵观前后共三句,还找不到答案的就看该句所在的段的主旨,还找不到,如此够变态的话,直接往全文主旨上猜。此时要注意的是时间,不要恋战太久。

      +

      阅读干扰项总结,要么是原文根本没提的东西,但属于统一范畴,它就出来诱惑你等你上钩;要么原文提到它,但具体内容不是,(比如是个主谓,文章说了选项的主语,但谓语不是这么个情况),就像妖精变成了美女勾引猪八戒呢;要么原文跟选项一样,但不是文章所要讨论的主要内容,只是个sub-topic或者float topic,或者牛头不对马嘴,答非所问,这种情况更难,我称作“引入歧路”,一定要避开这种诱惑。

      +

      必须要提一下,祁连山讲雅思的T/F/NG题目时候说题目的句子和原文内容是如何匹配的。我自己总结为,原文可以证实的题目句子为T,原文可以证伪的为F,原文不能证实不能证伪的为NG。这种严谨的思维方式对我做托福阅读,尤其是帮助我克服自己容易胡思乱想、想入非非、不以原文为唯一依据的臭毛病非常有效。IBT的阅读选项,有且只有原文可以将他证实的,才是正确选项。比如原文句子说,A是B的充分不必要条件,则这个选项如果说A是B****的充要条件,那就是错的。

      听力——

      我前面已经回顾了很多血泪史,主要都是跟听力剪不断、理还乱。关于听力重点、十大黄金原则之类的,网络盛传,我也不再赘述,但问题是我们每一个考生如何运用这十八班武器呢?

      -

      最重要的是集中注意力。其实我终于放弃听力笔记走上只听不记的道路,图的还就是集中注意力。我并不敢说那种方式更好,但你自己必须去感受,怎样能让你完全集中注意力,甚至去听lecturer**的呼吸,你就怎样做。**

      -

      一个不走神的简单方法。先听题,喔,这是****课,马上让自己的大脑进入这个课堂,现在professor**就站在你面前讲课啦。边听边问自己,他在讲什么东西?这东西怎么了?分几类?相关的还有些什么东西?谁把谁怎么了?然后在大脑空闲的几秒重勾画一个最简单的树形图,这就是这个段子的结构。只有6**分钟,这是一个很简单的课堂讲解。有人说还是会走神,怎么办呢?呃,我也会啊,我也怕啊,尤其当TPO**做了这么多遍以后,很多内容都熟悉了,甚至一些听力生词神马的都是根据TPO**的题目给弄出来的,就相当于提前熟悉过了生词和科目啊话题啊,那怎么办呢?**

      -

      于是我在考前3**天,泛听巴朗。因为从来没听过巴朗,所以这样更像考场情况听到新材料;也因为它比较类似托福,所以比open course**甚至TTC**之类1**个小时长度的lecture**更有效。虽然是泛听,但是不是就集中注意力听一下,这是个什么东西?喔,珊瑚礁,人工的,提供庇护和食物来源,这里是一个小的生态系统。诸如此类,这段子你就听懂了。而且即使考试也有偶尔走神的时候,认真听和偶尔走神与不在意的听和偶尔专心抓重点,这二者是不是有点关系呢?听吧,没错的。**

      -

      从前三次裹足不前90**分到第四次飞跃100**分,主要是听力给力了。总结原因其实只有两个字,自信。相信你能听懂的,然后就去回答上面我提到的那些问题给自己,等到音频结束时候你自己都可以出题目了;如果总是被音频带着跑,总是很被动,就只能挨打。此外强调一点,听段子的顺序非常重要,即使没听懂句意,但你集中注意力听到了名词并且记住了他们的出场顺序,则回答问题时候直接拿去一一对应就好了。还有,啊我好罗嗦啊,还有重听题,真正的答案在这句话的前后两句,所以听原文的时候就要猜到哪句话有可能重听,这是需要练习TPO**的时候自己去总结的,好吧我再罗嗦一下,一般重听的是要么教授发笑的或者很疑惑的那句,要么学生提问后教授没直接回答但说了句什么,就这句,要么教授自己阐述的时候自己迟疑了、停顿了、若有所思了,或者自我解释了。而主旨题是每个段子的第一题,要么是段子开头直接提出的,要么要自己总结,你看四个选项,谁可以当做这篇段子的结构的树干,当然了,一般选项是动宾短语的话,在动词上就已经可以找到答案了,是classify**呢还是define**呢还是discuss**呢还是什么呢,这样的动词明确表达了全文结构走向。

      +

      最重要的是集中注意力。其实我终于放弃听力笔记走上只听不记的道路,图的还就是集中注意力。我并不敢说那种方式更好,但你自己必须去感受,怎样能让你完全集中注意力,甚至去听lecturer****的呼吸,你就怎样做。

      +

      一个不走神的简单方法。先听题,喔,这是课,马上让自己的大脑进入这个课堂,现在professor就站在你面前讲课啦。边听边问自己,他在讲什么东西?这东西怎么了?分几类?相关的还有些什么东西?谁把谁怎么了?然后在大脑空闲的几秒重勾画一个最简单的树形图,这就是这个段子的结构。只有6分钟,这是一个很简单的课堂讲解。有人说还是会走神,怎么办呢?呃,我也会啊,我也怕啊,尤其当TPO做了这么多遍以后,很多内容都熟悉了,甚至一些听力生词神马的都是根据TPO**的题目给弄出来的,就相当于提前熟悉过了生词和科目啊话题啊,那怎么办呢?

      +

      于是我在考前3天,泛听巴朗。因为从来没听过巴朗,所以这样更像考场情况听到新材料;也因为它比较类似托福,所以比open course甚至TTC之类1个小时长度的lecture****更有效。虽然是泛听,但是不是就集中注意力听一下,这是个什么东西?喔,珊瑚礁,人工的,提供庇护和食物来源,这里是一个小的生态系统。诸如此类,这段子你就听懂了。而且即使考试也有偶尔走神的时候,认真听和偶尔走神与不在意的听和偶尔专心抓重点,这二者是不是有点关系呢?听吧,没错的。

      +

      从前三次裹足不前90分到第四次飞跃100分,主要是听力给力了。总结原因其实只有两个字,自信。相信你能听懂的,然后就去回答上面我提到的那些问题给自己,等到音频结束时候你自己都可以出题目了;如果总是被音频带着跑,总是很被动,就只能挨打。此外强调一点,听段子的顺序非常重要,即使没听懂句意,但你集中注意力听到了名词并且记住了他们的出场顺序,则回答问题时候直接拿去一一对应就好了。还有,啊我好罗嗦啊,还有重听题,真正的答案在这句话的前后两句,所以听原文的时候就要猜到哪句话有可能重听,这是需要练习TPO的时候自己去总结的,好吧我再罗嗦一下,一般重听的是要么教授发笑的或者很疑惑的那句,要么学生提问后教授没直接回答但说了句什么,就这句,要么教授自己阐述的时候自己迟疑了、停顿了、若有所思了,或者自我解释了。而主旨题是每个段子的第一题,要么是段子开头直接提出的,要么要自己总结,你看四个选项,谁可以当做这篇段子的结构的树干,当然了,一般选项是动宾短语的话,在动词上就已经可以找到答案了,是classify呢还是define呢还是discuss呢还是什么呢,这样的动词明确表达了全文结构走向。

      还是老话,跟阅读一样,选择题当做填空题去做,自己先给一个答案,再去找选项,避陷阱。

      口语——

      -

      这是我认为最不需刻意备考但又最耗费精力去备考的东西。首先,语音要正确,我们哪怕可以说各地方言版的英语,但也不能不咬舌头尖。当然了,最好不要有自己家乡口音,这部分主要考模仿。模仿一个个因素,这个模范更好了,单词句子的音就可以脱口而出了。接着去跟读apprentice**每一集的会议室讨论内容吧,大家掐架,咱就跟着掐,很有趣。**

      +

      这是我认为最不需刻意备考但又最耗费精力去备考的东西。首先,语音要正确,我们哪怕可以说各地方言版的英语,但也不能不咬舌头尖。当然了,最好不要有自己家乡口音,这部分主要考模仿。模仿一个个因素,这个模范更好了,单词句子的音就可以脱口而出了。接着去跟读apprentice****每一集的会议室讨论内容吧,大家掐架,咱就跟着掐,很有趣。

      光有音是完全不行的,这不是新闻联播照稿子念的,重点在于自己的表达。最靠谱的方法就是生活中每当要跟家人、朋友、同学、图书馆管理员、楼管大妈开口说话的时候,自己在脑子里想想,这句怎么说呢,用英语。其实就是给自己创设情境,让自己说出来。宅在房间里不敢跟陌生人说话的孩纸呢,至少会看电视剧吧?当然美剧、英剧优先,哪怕就是看宫啊武则天啊神马的都可以,演员说汉语,你在这里口译成英语,是不是很帅?当然,我们说得不好,但是有关系吗?反正又没人来打分,没人来评价,怕什么?自己创设情景,说出来。

      -

      基于以上两点,如果有个可以帮助我们纠正自己的发音、口语语法、用词的native speaker**或者老师、同学,就太好了,一边犯错一边进步,如果没有,靠自己吧,一定要发现问题,总结并改正。**

      -

      实力稳定在一个水平上之后,备考主要是熟悉内容,练习真题,口语黄金80**神马之类的都可以。自己看题目然后自己说给自己听,录音,录完才知道自己说得有多恶心。学术话题类的口语,每天做完TPO**听力后,自己给自己讲讲这个段子讲了个什么,这样不是很自虐嘛?欲练功,必自宫,连岳不群都知道自虐是成功的第一步,我们要看齐啊!这样平素积累下来,考前只要模考2-3**套就可以了。**

      +

      基于以上两点,如果有个可以帮助我们纠正自己的发音、口语语法、用词的native speaker****或者老师、同学,就太好了,一边犯错一边进步,如果没有,靠自己吧,一定要发现问题,总结并改正。

      +

      实力稳定在一个水平上之后,备考主要是熟悉内容,练习真题,口语黄金80神马之类的都可以。自己看题目然后自己说给自己听,录音,录完才知道自己说得有多恶心。学术话题类的口语,每天做完TPO听力后,自己给自己讲讲这个段子讲了个什么,这样不是很自虐嘛?欲练功,必自宫,连岳不群都知道自虐是成功的第一步,我们要看齐啊!这样平素积累下来,考前只要模考2-3****套就可以了。

作文——

@@ -100,7 +105,8 @@ **雅思——** -**我完全是个新手,而且自学,不敢造次。要说准备材料就是前面我说买的那几本书,复习时间真正的就只有考完托福后到考雅思前总计3****天,口语复习就是考完笔试的当天下午,因为口语考试是第二天清晨。我只想说,当你磨破手掌脚趾爬到珠穆朗玛,即使只爬到一半,你会觉得其他崇山峻岭都不在话下。还是古语好,会当凌绝顶,一览众山小。这样被ETS****虐过后,我一方面要熟悉雅思考试,它跟托福风格不同,更细致也容易丢分,但语言实力的考察总还是相关的。3****篇阅读,计时45****分钟内全部做完,没有问题,听力30****分钟一套。作文50****分钟2****个,这样子到考场上,就很轻松了。当然,我成绩还没下来……** +**我完全是个新手,而且自学,不敢造次。要说准备材料就是前面我说买的那几本书,复习时间真正的就只有考完托福后到考雅思前总计3****天,口语复习就是考完笔试的当天下午,因为口语考试是第二天清晨。我只想说,当你磨破手掌脚趾爬到珠穆朗玛,即使只爬到一半,你会觉得其他崇山峻岭都不在话下。还是古语好,会当凌绝顶,一览众山小。这样被ETS****虐过后,我一方面要熟悉雅思考试,它跟托福风格不同,更细致也容易丢分,但语言实力的考察总还是相关的。3****篇阅读,计时45****分钟内全部做完,没有问题,听力30****分钟一套。作文50****分钟2****个,这样子到考场上,就很轻松了。当然,我成绩还没下来……** +
  1. 学习效率规划

    作息时间和复习安排,都是DIY的事情,我只说一句:

    @@ -116,5 +122,6 @@ 阿甘妈妈那盒巧克力,我也一直捧着,充满期待,无论拿出来的下一颗是什么,很快就会有结果了。我也还在养伤和术后复健中,期待一切都好。God bless us. -It’s not the end until you give up.这是我自己说的,送给耐心看到这里的孩纸们。心怀感恩,也盼望能对不相识的你和他或她有些许帮助。我的名字,叫,耐心。 -
当这个世界只剩下喧嚣
\ No newline at end of file +It’s not the end until you give up.这是我自己说的,送给耐心看到这里的孩纸们。心怀感恩,也盼望能对不相识的你和他或她有些许帮助。我的名字,叫,耐心。 + +
当这个世界只剩下喧嚣
\ No newline at end of file diff --git "a/docs/2012/07/29/\345\275\223\350\277\231\344\270\252\344\270\226\347\225\214\345\217\252\345\211\251\344\270\213\345\226\247\345\232\243/index.html" "b/docs/2012/07/29/\345\275\223\350\277\231\344\270\252\344\270\226\347\225\214\345\217\252\345\211\251\344\270\213\345\226\247\345\232\243/index.html" index df93835be..6a8a5fa2b 100644 --- "a/docs/2012/07/29/\345\275\223\350\277\231\344\270\252\344\270\226\347\225\214\345\217\252\345\211\251\344\270\213\345\226\247\345\232\243/index.html" +++ "b/docs/2012/07/29/\345\275\223\350\277\231\344\270\252\344\270\226\347\225\214\345\217\252\345\211\251\344\270\213\345\226\247\345\232\243/index.html" @@ -1,15 +1,20 @@ -当这个世界只剩下喧嚣 | Beendless ~ 快节奏,慢生活,无止境 +当这个世界只剩下喧嚣 | Beendless ~ 快节奏,慢生活,无止境 -

当这个世界只剩下喧嚣

自己也是个爱热闹的人。我喜欢跟朋友们一起吃火锅,各种犯二,不加收敛。在记忆中,那是用放肆来表达的友爱。我们就在那样的吆喝、聒噪中成长。简单而快乐。

+

当这个世界只剩下喧嚣

自己也是个爱热闹的人。我喜欢跟朋友们一起吃火锅,各种犯二,不加收敛。在记忆中,那是用放肆来表达的友爱。我们就在那样的吆喝、聒噪中成长。简单而快乐。

当这样的热烈已然不在,我们都各自寻找一个饭碗,真的,就为一个饭碗儿吧。留下的,或许还在这样热闹;而离开的,也真是不得不离开。于是,我开始在这个陌生的地方厌倦生活中的各种嘈杂,却常常按捺不住自己内心的喧嚣。我坐立不安,用坐立不安的方式发呆。不经意,大半天就过去了。或者疾步行走,用没有笃定、没有方向感的方式行走,很多风景也就过去了。自己也不记得当时在想什么,甚至不晓得此刻在想什么。

地铁上、马路上、公车上,我会看着身边的人群发呆。他们和她们今天过得怎么样?一副没有表情的面具下,是否都只是经历着普通人的喜怒哀乐?这个人会不会也发现我在看他?人家不会觉得我有恶意吧?美女!美女的香水、彩妆跟车厢里的汗味儿、路人粘粘的皮肤都会蹭到甚至一路紧挨着,她会不会因此不高兴呢?——好一个无聊的我,好一段没心没肺又没有意义的旅程。

但好像不论在哪里、任何时候,怎么都觉得那么琐碎、那么吵闹呢?是自己的心不够安静吧,那哪里有安静的心呢?可以指点迷津一下下,让我找找么?微博、电视、网页、短信、电话,琳琅满目地塞着各种字体、各种图画;咖啡馆、水吧、餐厅、超市、商场、公园、停车场、路边摊,处处都是喧哗。

这个世界好忙碌,转得好累啊。但它是从什么时候开始转?想要转向何处呢?我自己呢?从哪里出发,又想去哪里呢?

-
那些常被勾起的情愫
\ No newline at end of file +
那些常被勾起的情愫
\ No newline at end of file diff --git "a/docs/2012/08/12/\351\202\243\344\272\233\345\270\270\350\242\253\345\213\276\350\265\267\347\232\204\346\203\205\346\204\253/index.html" "b/docs/2012/08/12/\351\202\243\344\272\233\345\270\270\350\242\253\345\213\276\350\265\267\347\232\204\346\203\205\346\204\253/index.html" index 7f1931611..1eac4c434 100644 --- "a/docs/2012/08/12/\351\202\243\344\272\233\345\270\270\350\242\253\345\213\276\350\265\267\347\232\204\346\203\205\346\204\253/index.html" +++ "b/docs/2012/08/12/\351\202\243\344\272\233\345\270\270\350\242\253\345\213\276\350\265\267\347\232\204\346\203\205\346\204\253/index.html" @@ -1,13 +1,18 @@ -那些常被勾起的情愫 | Beendless ~ 快节奏,慢生活,无止境 +那些常被勾起的情愫 | Beendless ~ 快节奏,慢生活,无止境 -

那些常被勾起的情愫

一篇《春风沉醉的晚上》再次勾起我久违的情愫——懒懒地窝在沙发里捧着心爱的故事。于是,一发不可收拾。清新也好,纠结也罢,却又终止在《红与黑》的挣扎和苦痛当中。这样的周末,最让人怀念。

+

那些常被勾起的情愫

一篇《春风沉醉的晚上》再次勾起我久违的情愫——懒懒地窝在沙发里捧着心爱的故事。于是,一发不可收拾。清新也好,纠结也罢,却又终止在《红与黑》的挣扎和苦痛当中。这样的周末,最让人怀念。

读书写字是一个不错的习惯,只是需要付上更多的用心和感情。当眼前空白得只剩下用逻辑演绎的世界,只剩下笔直的通向目的地的天梯,我便再懒得有心、懒得有感情了。想想这几年,一次次启程,都只为了心中那唯一的远方。现在触手可及,反倒更多了几分犹豫。于是,此刻的自己愿意停下来,为那些想念的人,想念的事。

……(此处省去五千字)

-
临行前的慵懒
\ No newline at end of file +
临行前的慵懒
\ No newline at end of file diff --git "a/docs/2012/09/07/\344\270\264\350\241\214\345\211\215\347\232\204\346\205\265\346\207\222/index.html" "b/docs/2012/09/07/\344\270\264\350\241\214\345\211\215\347\232\204\346\205\265\346\207\222/index.html" index 3fba34be8..eb6860adb 100644 --- "a/docs/2012/09/07/\344\270\264\350\241\214\345\211\215\347\232\204\346\205\265\346\207\222/index.html" +++ "b/docs/2012/09/07/\344\270\264\350\241\214\345\211\215\347\232\204\346\205\265\346\207\222/index.html" @@ -1,13 +1,18 @@ -临行前的慵懒 | Beendless ~ 快节奏,慢生活,无止境 +临行前的慵懒 | Beendless ~ 快节奏,慢生活,无止境 -

临行前的慵懒

很久不来码字,是觉着码得不好,废话太多,或者意欲遮掩的情感太多,反而读起来枯燥乏味。是啊,一个情不自禁就要伤春悲秋的姑娘,却要不断抑制那些啼笑,这种纠结是旁人不能懂也完全无需去懂的。有时读到别人的文字,看那些细腻的描写在平淡中绽放流光溢彩,不经意地就挑动读者各种神经,甚至产生生理反应,我更觉得自己无趣,无甚可写。然而,在这个即将离开,不,应该是即将辗转的日子里,似乎不写点什么就是对过去的遗弃,对未来的漠然。

+

临行前的慵懒

很久不来码字,是觉着码得不好,废话太多,或者意欲遮掩的情感太多,反而读起来枯燥乏味。是啊,一个情不自禁就要伤春悲秋的姑娘,却要不断抑制那些啼笑,这种纠结是旁人不能懂也完全无需去懂的。有时读到别人的文字,看那些细腻的描写在平淡中绽放流光溢彩,不经意地就挑动读者各种神经,甚至产生生理反应,我更觉得自己无趣,无甚可写。然而,在这个即将离开,不,应该是即将辗转的日子里,似乎不写点什么就是对过去的遗弃,对未来的漠然。

此刻的我置身在凌乱的房间中,一个凌乱的自己。阳光照到阳台上晾晒的衣服,也会懒得再进屋子看我。而我就愿意这样静静地邋遢着,等到不得不打包行李的那一刻。要说我没有收拾行李,其实还在兰州的时候,六月份毕业离校,我便计划了一部分要带走的东西;七月上课之前,我在北京又备办了一部分;八月在北京搬家的时候,我便用真空带整理了一部分;九月,在HK的老师和他夫人、亲爱的XIXI还帮我准备了一部分。这些要同我一起辗转的箱子,直到现在,还没有真正地拾掇停当。责任在我,在我这颗故意拖拉的心。几个月来,一边办理各种手续,一边跟家人朋友道别,一边提醒自己做好要到比国生活的功课,自己却越来越不那么迫切、不那么情愿真正迈出这一步。各种心情反复之后剩下的平静,好像可以冷冻掉整个世界。很多东西似乎是看见了、想念了,又等于什么也没看见、什么也没想到。

好了,看看这些要收拾的行装,哪件不是家人和朋友为我准备的,哪件没有他们的心思,哪件不是满满的牵挂。大的小的、好的坏的,都带上吧,都跟这个胖身体一起运过去吧,重重的,也暖暖的。好,那就走吧,就一个人走吧,就带着一口蹩脚的英语、初级的法语走了,去一个写满荷兰语的地方做个目不识丁的人。好吧,感恩总是大过焦虑和抱怨的,有老师亲自到机场来接,有老师留宿,有同学照顾和帮忙,有很多美好在那里,等待我,一个人,走过去。

-
初到鲁汶
\ No newline at end of file +
初到鲁汶
\ No newline at end of file diff --git "a/docs/2012/09/15/\345\210\235\345\210\260\351\262\201\346\261\266/index.html" "b/docs/2012/09/15/\345\210\235\345\210\260\351\262\201\346\261\266/index.html" index 36e1b5607..e8f9d38e8 100644 --- "a/docs/2012/09/15/\345\210\235\345\210\260\351\262\201\346\261\266/index.html" +++ "b/docs/2012/09/15/\345\210\235\345\210\260\351\262\201\346\261\266/index.html" @@ -1,13 +1,18 @@ -初到鲁汶 | Beendless ~ 快节奏,慢生活,无止境 +初到鲁汶 | Beendless ~ 快节奏,慢生活,无止境 -

初到鲁汶

除却奔走和疲惫,本是可以早点写日志的。但在不同语言之间切换的贫乏词库和对陌生环境的迟钝反应,都成为难以下笔的原因。于是,拖到不能再拖的时候,已是来到鲁汶的第四天了。

+

初到鲁汶

除却奔走和疲惫,本是可以早点写日志的。但在不同语言之间切换的贫乏词库和对陌生环境的迟钝反应,都成为难以下笔的原因。于是,拖到不能再拖的时候,已是来到鲁汶的第四天了。

暂且搁下第一次长途飞行的辛苦吧,那只是自己坐硬座火车的经历太少的缘故。布鲁塞尔国际机场相比北京首都机场的小,就能快速证明我即将生活的地方与北京的不同。只有一个出口,甚至不用乘电梯,直接下飞机,取行李,就可以排队过关了。查验护照和签证,居然像我的第一次考试一样。看到海关在问别人问题,我紧张得好似自己是偷渡或贩运不法物品,不知待会儿得如何回答海关的问题,这样的紧张只是源于怕自己不会说英文、听英文。好吧,过度焦虑了。海关看到是鲁汶的学生,不仅问我很少问题,还差点儿聊起家常来。出去见到接我的老师,一时高兴得差点儿抱住他俩。三言两语之后,居然被问是否在美国生活过,诧异之余更多窃喜了,因为他们都夸我英文好。好吧,那更要少说点儿了,否则露馅更快。

简单得说,安顿在老师家里以后,我们就去了学系办公室,见到可以帮我注册的学系助理,一个与我同龄的比利时女孩。一天的奔跑,办理注册报到的事情,并开始着手找房子。于是,就一连找了三天,也同时为此熟悉了学系附近和鲁汶市中心的情况。有同门师兄带着我,他是个蛮聪明的比利时男孩儿,他有一个中国丈夫。能认识他们实在是我的幸运,一下子就结识到好些朋友,他俩还怂恿我赶快把男朋友叫过来在这边做IT。住在老师家里,也跟老师的女儿们熟悉起来,聊得不错,如果我可以讲更多更多英文或荷兰语的话,便能够更亲近了。

前天,老师的女儿就问我,我到鲁汶后,最大的震撼是什么。我一下子不知道怎么回答,因为顾虑太多、想法也太多。或者就从眼前说起,从眼前的庭院和葡萄架、还有脚下的黑色猫咪说起。

@@ -17,4 +22,4 @@

第一个星期过得很有效率,住在一个善良的家庭里,解决了最初的注册手续,找到了一个不错的房间(最有趣的是室友——两个曾在美国生活的亚洲人,一个台湾女孩,她不认为自己是中国人;一个日本人,他不赞同日本的很多现代化理念;一个出生在卢旺达却长在比利时的混血黑色高个男人;一个土生土长的比利时帅小伙;外加一个我。),认识了一堆可以友好相处的朋友,每天猫咪都会来舔一会儿我的脚趾头。忙碌中不乏丝丝惬意,特别是当独自疾走在街上还满脑子天马行空的时候。同时,注册了二级法语课程,也初选了要学的拉丁语、欧洲历史、中世纪圣经神学等课程,惦念着满满三层的东亚图书馆藏资料。那才是我真正的生活和我求学的目的,那是我真正能够与老板做的交流。

所有付上的用心,请不要等待收获失望。

—-Defoort’s house, Leuven

-
只生活,不留学
\ No newline at end of file +
只生活,不留学
\ No newline at end of file diff --git "a/docs/2012/09/23/\345\217\252\347\224\237\346\264\273\357\274\214\344\270\215\347\225\231\345\255\246/index.html" "b/docs/2012/09/23/\345\217\252\347\224\237\346\264\273\357\274\214\344\270\215\347\225\231\345\255\246/index.html" index 14e92d5a0..30fb5d7e9 100644 --- "a/docs/2012/09/23/\345\217\252\347\224\237\346\264\273\357\274\214\344\270\215\347\225\231\345\255\246/index.html" +++ "b/docs/2012/09/23/\345\217\252\347\224\237\346\264\273\357\274\214\344\270\215\347\225\231\345\255\246/index.html" @@ -1,13 +1,18 @@ -只生活,不留学 | Beendless ~ 快节奏,慢生活,无止境 +只生活,不留学 | Beendless ~ 快节奏,慢生活,无止境 -

只生活,不留学

“时间过得真快”——一句烂透了的真理!又是一个周末,甚至已经是周日的晚上了,这篇日志被拖延29个小时了。远不同于上个星期那种满肚子的话不知道从何说起的焦急,这个星期过得有些无话可说。

+

只生活,不留学

“时间过得真快”——一句烂透了的真理!又是一个周末,甚至已经是周日的晚上了,这篇日志被拖延29个小时了。远不同于上个星期那种满肚子的话不知道从何说起的焦急,这个星期过得有些无话可说。

这七天,说它乏味,只是因为自己懒惰,没有学会多少新东西,在学习上并没有很多进步和收获。但它又真的对我很重要,它是我二十多年来第一次完全独立生活的开始。

我搬进一个人的房间,整理好自己的东西,才发现从国内带来的40公斤行李,可能只是贪图在那两个高质量的行李箱上了,真正需要的东西并没有带全。于是,各种以生活所需为借口的逛街行动展开了。买衣服、买家具,甚至死皮赖脸拉着一个算是网友的人开车带我去比较远的宜家。大把的银子往外流,我居然没顾上心疼。可能购物和花钱对于我这样的女人来讲,真是个快乐吧。 终于以为自己的家已经足够基本生活的时候,却发现没鞋子穿了。于是,各种后悔把皮鞋留在北京的愚蠢行为。

这样的逛街并不是一无是处的,让我感受到鲁汶的生活水准和物价,让我亲身比较得到在这里的惬意和在北京生活的压力。更重要的是,逛街让我熟悉了一些店铺的位置和市中心与自己的家之间的地形。

@@ -15,4 +20,4 @@

貌似显得滋润吧?不!在多文化和多语言混杂的鲁汶大学,我首先碰到的不是中西文化的美妙融合,而是尴尬和一顿饿肚子的难堪。超市里有一种看起来很像馄饨的东西,看了看上面的荷兰文和图片,大概是蔬菜馅的饺子,面里是和了鸡蛋的。那很好啊,在一个超级无敌饿的晚上,我便煮了它当晚饭。煮到一半时我便觉不对,皮不象我在国内吃的饺子或者馄饨,那算了,多一些时间吧,可能有鸡蛋在面皮中不太容易煮。可是当我可怜巴巴抱着一碗“馄饨”正欲狼吞虎咽时,一口被噎的差点吐出来——那里面的绿色蔬菜馅是用某种类似羊乳酪的东西做成的,又腻又难以下咽,我以为加了醋和辣酱会比较容易让自己下口,谁知时弄巧成拙。直到今天,问了同住的台湾女孩才明白,那个是意大利饺,应该配上意式的白酱或红酱,和蔬菜或者肉一起煮才好吃。果然,尝了一下她煮的,虽然不是我爱,但至少吃的下去。瞧吧,中西合璧的前提是,二者要有相容元素。于是,我决定两周后再去超市时,买一些西式佐料,试着学作配意大利面的酱料。另外,冰箱里还存着一些很像卤豆腐干一样的羊乳酪干……我真是无敌了。这些东西都要慢慢消化吧。

一个没有学习,却忙着生活的星期;一个专心操持日常琐碎,却有些手忙脚乱的星期。真正的留学生活就这样开始了。“留学”,听着多洋气的样子,其实是一群二不拉几的青年在一个彻底陌生的环境中,让自己从零开始的戏谑而已。用文邹邹的词汇试图掩盖离乡背井的苦楚,用所有异国风情的画面彰显自己的生活情调,以此来支撑几近崩溃的自尊心。只是刚开始,我觉得自己过得还好,还算幸运,但眼前所有的中国留学生,真的没有曾经在国内看到的他们那么光鲜亮丽。

再回头看自己,先做普通的菜,可以在巷子口阿拉伯人的店里买他们的烤鸡,混熟了多要点橄榄和汤汁吧。下个星期应该要上课了,希望自己还能应付的来,哪怕忙乱些、狼狈些,也没关系。

-
阳光下
\ No newline at end of file +
阳光下
\ No newline at end of file diff --git "a/docs/2013/01/28/\351\230\263\345\205\211\344\270\213/index.html" "b/docs/2013/01/28/\351\230\263\345\205\211\344\270\213/index.html" index 4c3c4ef38..d74fac490 100644 --- "a/docs/2013/01/28/\351\230\263\345\205\211\344\270\213/index.html" +++ "b/docs/2013/01/28/\351\230\263\345\205\211\344\270\213/index.html" @@ -1,14 +1,19 @@ -阳光下 | Beendless ~ 快节奏,慢生活,无止境 +阳光下 | Beendless ~ 快节奏,慢生活,无止境 -

阳光下

28日在神学系图书馆一层赶期末论文报告的时候,那也是一个月的积雪突然在一个早晨被一场小雨化尽的时候。而我,坐在阳光里,就那样盯着歪歪曲曲的树杈,看它好像要使劲伸展,却干瘪得只有筋骨的样子,看它与我一起沐浴在午后的阳光中,等待下一个彩色的春天。

+

阳光下

28日在神学系图书馆一层赶期末论文报告的时候,那也是一个月的积雪突然在一个早晨被一场小雨化尽的时候。而我,坐在阳光里,就那样盯着歪歪曲曲的树杈,看它好像要使劲伸展,却干瘪得只有筋骨的样子,看它与我一起沐浴在午后的阳光中,等待下一个彩色的春天。

公园里那一大滩子的水,是刚刚融合的冰渣与细雨,没有波光粼粼,没有白雪簌簌,不透亮、不清新,甚至远看有点被草地和阳光反衬得脏兮兮的墨绿色。但我却爱上它的宁静,甚至坏坏地想象会不会有小孩跑过去以为那是冰面,然后一个踉跄跌倒在上面,湿漉漉地毁掉这独自存在的一滩水。哦,不小心,发掘了我骨子里的侵略快感,坏坏的。没有带相机,但是我要如何才能狠狠地记住眼前的小丘和这一滩水,还有那些也正在盯着我的树枝呢?

不知觉地写了几个小时报告后,突然侧脸看去,那滩水真的已经被施暴了。然而看上去,那不是脚印、不是自行车轮痕迹,倒是更宽、更大、更深的什么呢?我偷偷笑了,在阳光里,再扭头回去写报告。

————鲁汶大学神学系图书馆,中央公园旁,现在已经17.43,天黑亮灯,回家,蹑手蹑脚地过去沾上一鞋的水。

-
过月子·卖成年人的萌
\ No newline at end of file +
过月子·卖成年人的萌
\ No newline at end of file diff --git "a/docs/2013/02/01/\350\277\207\346\234\210\345\255\220\302\267\345\215\226\346\210\220\345\271\264\344\272\272\347\232\204\350\220\214/index.html" "b/docs/2013/02/01/\350\277\207\346\234\210\345\255\220\302\267\345\215\226\346\210\220\345\271\264\344\272\272\347\232\204\350\220\214/index.html" index 5ee9d63e8..583122466 100644 --- "a/docs/2013/02/01/\350\277\207\346\234\210\345\255\220\302\267\345\215\226\346\210\220\345\271\264\344\272\272\347\232\204\350\220\214/index.html" +++ "b/docs/2013/02/01/\350\277\207\346\234\210\345\255\220\302\267\345\215\226\346\210\220\345\271\264\344\272\272\347\232\204\350\220\214/index.html" @@ -1,13 +1,18 @@ -过月子·卖成年人的萌 | Beendless ~ 快节奏,慢生活,无止境 +过月子·卖成年人的萌 | Beendless ~ 快节奏,慢生活,无止境 -

过月子·卖成年人的萌

“月子”?眼前冷不丁蹦出这么个时间段。因为最近,我过的是月子。而这篇白话,是真的憋了整整一个月,连痛经都不得不包括在里面了。

+

过月子·卖成年人的萌

“月子”?眼前冷不丁蹦出这么个时间段。因为最近,我过的是月子。而这篇白话,是真的憋了整整一个月,连痛经都不得不包括在里面了。

逍遥自在的巴黎圣诞和布鲁塞尔新年似乎早就为接下来的一个月埋下伏笔,1月4日跟教授吃完饭后,谜团解开。那几天的鲁汶还享受着“印度夏”的温度和满是阴霾的沉寂,指着灯光闪烁的图书馆,教授问我,“好看么?”我还没噎上一句回话的时候,他自己说,“好看,但可能一月底就没有了。”多么惬意轻松的话题,我完全没意识到其中的不详预兆,乐呵呵地抛出对考试月的疑问,“教授,我需要参加考试么?我是旁听了一个学期,但我不需要学分,所以……”如此拙劣的暗示已经将自己出卖得淋漓尽致,可眼前这个绝顶聪明又小有狡猾的大男生用他最擅长的线性思维给我迎头一击,“既然都上课了,那就去考试啊。”我慌张得无所适从,已经结巴地不知道怎么辩解,“我……可是……我以为不需要考试啊,所以上课的时候就认为自己不需要考试啊,所以……”“但是你上课了,对么?”“那当然,我没有逃课!”“所以,很简单啊,直接去考试。晚安!”不由分说,我接下来的一个月便这样诞生了。

考试,对一个当了二十多年的专业学生来讲,有什么好说的呢?请不要介意这里的放大镜吧,无论如何,这次的考试有些不一样。法语二级——我在完全不了解状况的时候被放在电脑前做测试,侥幸进入二级班; 后来与一群已经学过法语好几年的欧洲人一同上课,我学了一学期哑口无言的法语并明确表示,我是那个班上最差的。拉丁语——要认出每个已经变形过的单字,并写出它的结构,以及语法功能,再翻译圣经。我上课就没怎么听懂,只是跟着教授听了一学期叽里呱啦的段子,他喜欢讲各种主教的笑话。欧洲文学艺术史——从希腊罗马甚至史前时代的法国洞穴一直讲到二十世纪的现代艺术,主讲美术和画家的同时,教授连卢梭和马克斯·韦伯都不放过。我生生是看了一学期的图片,只感受到一点,他们TMD怎么画了那么多!

过去了,这一个月,都过去了。法语考得不差,老师很开心看到我的笔试卷子,还大大地写了个“好”在上面。也经历了一次性4个小时的拉丁文圣经翻译,这样的考试只让人忆起赶考的秀才们,然后自叹不如那坐板凳的屁股功夫。两天时间分析125幅欧洲各种画,学写一个个死也记不住的人名,到最后,完全混淆巴洛克和洛可可,以及同时期的浪漫主义、写实主义、自然主义是怎么从17到18世纪,又怎么分为两段再最后经过印象派的转折,走向抽象派、立体主义和后来的超现实与后现代派。紧接着的两天半写了论文和读书报告,终算了结上一个学期的债。如果要用积极乐观不抱怨的二逼口吻转述以上几段内容,则是:我用一个月看了几千页的英文书、法语课本和拉丁语字典,并且在自虐的苦痛中第一次感受到,与牛逼的思想之间能产生对话是一种多么傻逼的快乐!

@@ -15,4 +20,4 @@

还在考试期间的月子里,我是如何得想要写东西来发泄,是如何地一次次打着腹稿。多少次,所有闪过眼前的或机灵或奇怪的字眼,本来都是为了筹划一篇文章纪念这个月子。然而,当一座久久不得喷发的火山已流尽岩浆,那便只能死人般休眠。此刻安安静静地坐下来,拿出全副正能量来自娱自乐,这样一篇没有了愤怒、痛苦、孤单和悲伤的白开水文章,除了可以作为不被忘却的纪念,又真的还有什么其他意义呢?我的情绪化、我的晴天雨天、我的孩子气,我是那么迫切地想要甩掉它们!我想变得跟别人一样的成熟,无法成为御姐也至少得做个刀枪不入的女博士;我想以理性标榜生活和世界的最终解释,恨不得将自己分析得片甲不留,然后亲自挖个坑、刨点土,埋葬心头那个挑着花、吟着自怨自艾的林小姐。但是,我终不能成为!这个过程,我只得到了发疯、抓狂,认不清自己、找不到别人。

那么,为什么不接受和喜欢这样的自己呢?情绪就像不请自来的客人,虽然你还没做好准备,但你可以请他进门,一起喝杯茶、聊聊天。你会发现他是个尖屁股,你留也留不住呢。有情绪、不够理性、不够优雅或沉稳,就叫做幼稚吗?成年的我们不应该把自己当做小孩子,要管理自己、要承担责任,要成为自己的社会角色,是这样吗?哦,那让我们看看这些成年人的事吧!“到年龄了,该结婚了”——这不正是一个很乖巧的小孩正在听的教诲吗?“公务员和事业单位还是有保障”——这不就是从小我们被告知的吗?有没有觉得自己在经历了青春期的叛逆之后,我们回到了儿时,仍旧听从我们的父辈,并且真的成为了他们、真的感受到他们的感受、理解到他们的理解?只有一点不同,当我们在做这些的时候,冠名之“成熟”。我们以为这是我们想要的生活,我们让自己以为这些以为是正确的。也有些不那么乖的,天天叫嚣“梦想”,要坚持自己,要选择跟父辈、跟同龄大多数人不一样的风格。亲,那不就是又一轮在奔三道路上的离经叛道么?或者有些人,那不只是暂时逃避社会角色的压力吗?你还记得那个青春期的自己么?还记得曾经最不屑的、觉得最老土的一些观念、方式和生活吗?那现在的你是在做乖孩子还是做叛逆者?无论是那种,我们不是长大了,而是长回去了!在抽过香烟喝过酒、看过A片、进入过异性(或同性)的身体之后,在尝试过那些似乎只有成年人可以做的事情之后,又长回去了!不是成年了的我们必须被剥夺做一个孩子的心,只是像《小王子》这样的成人童话太少了而已,我们自己遗忘了而已。那晚,我离开办公室稍微有些迟,一个人锁上重重的大木门,走在陌生的欧洲街道,我突然找不到了一直以来的恐惧感。黑夜、无人、空旷,偶见蓝绿色眼睛的异族,不害臊地说,我一直都挺胆小的,会对这种种有些害怕。然而那晚,冷风中却只剩下喜悦,觉得自己像一个孩子。对这个世界完全未知的小孩,是最没有恐惧的,不是吗?我们在自己与陌生事物之间人为创造的距离,其实是成年的我们与孩童的自己之间的距离。我们对陌生人、陌生环境、异文化的排斥,只是在将一个充满好奇的孩子关在外面。而这个被拒绝的小孩,正是我们自己。

卖萌结束,月子过完。中国的农历新年,祝看这篇废话的朋友们新年快乐!远远的,我拜个早年给大家!

-
Ym和Yf的聊天:历史是个什么玩意儿
\ No newline at end of file +
Ym和Yf的聊天:历史是个什么玩意儿
\ No newline at end of file diff --git "a/docs/2013/02/03/Ym\345\222\214Yf\347\232\204\350\201\212\345\244\251\357\274\232\345\216\206\345\217\262\346\230\257\344\270\252\344\273\200\344\271\210\347\216\251\346\204\217\345\204\277/index.html" "b/docs/2013/02/03/Ym\345\222\214Yf\347\232\204\350\201\212\345\244\251\357\274\232\345\216\206\345\217\262\346\230\257\344\270\252\344\273\200\344\271\210\347\216\251\346\204\217\345\204\277/index.html" index 399bf7423..b42b2bf06 100644 --- "a/docs/2013/02/03/Ym\345\222\214Yf\347\232\204\350\201\212\345\244\251\357\274\232\345\216\206\345\217\262\346\230\257\344\270\252\344\273\200\344\271\210\347\216\251\346\204\217\345\204\277/index.html" +++ "b/docs/2013/02/03/Ym\345\222\214Yf\347\232\204\350\201\212\345\244\251\357\274\232\345\216\206\345\217\262\346\230\257\344\270\252\344\273\200\344\271\210\347\216\251\346\204\217\345\204\277/index.html" @@ -1,13 +1,18 @@ -Ym和Yf的聊天:历史是个什么玩意儿 | Beendless ~ 快节奏,慢生活,无止境 +Ym和Yf的聊天:历史是个什么玩意儿 | Beendless ~ 快节奏,慢生活,无止境 -

Ym和Yf的聊天:历史是个什么玩意儿

一直以来,其实对于Yf做什么都不是特别特别地清晰。每次别人问是做什么的,我只能结结巴巴地介绍,是学历史的,是做汉学的,是搞宗教方面的,是研究中外文化交流的。。。每一次介绍,都把身边这帮学理工科的土鳖们给吓得一愣一愣地。晚上看到了她近期给老板准备的文章后,慢慢地好像有点明白了。从尘封的各种纷杂的资料,记录,正史,野史中,抽丝拨茧,考证、还原真正的历史,他(她)们就是站在四维空间来旁观人类历史,来审视人类历史,来重现人类历史的一群人。有点小感悟,以前有句话“历史是由史学家来撰写“的,但我们从小到大看到的,都好像不是真正的历史,这会对Yf从事的事业有些感慨了,最近一堆老男人捧红了柴大女神及她的那本《看见》,但她“看见”的东西真正地剥离了政治环境等等的束缚?司马迁写史记的时候都不自主地有些小心眼,现在的环境这么复杂,这本书在被读者拿到手里的时候,一定也是经过各种各样的处理了的。。。。而现在,Yf,就是在做着还原真相,重现历史的事情呀。

+

Ym和Yf的聊天:历史是个什么玩意儿

一直以来,其实对于Yf做什么都不是特别特别地清晰。每次别人问是做什么的,我只能结结巴巴地介绍,是学历史的,是做汉学的,是搞宗教方面的,是研究中外文化交流的。。。每一次介绍,都把身边这帮学理工科的土鳖们给吓得一愣一愣地。晚上看到了她近期给老板准备的文章后,慢慢地好像有点明白了。从尘封的各种纷杂的资料,记录,正史,野史中,抽丝拨茧,考证、还原真正的历史,他(她)们就是站在四维空间来旁观人类历史,来审视人类历史,来重现人类历史的一群人。有点小感悟,以前有句话“历史是由史学家来撰写“的,但我们从小到大看到的,都好像不是真正的历史,这会对Yf从事的事业有些感慨了,最近一堆老男人捧红了柴大女神及她的那本《看见》,但她“看见”的东西真正地剥离了政治环境等等的束缚?司马迁写史记的时候都不自主地有些小心眼,现在的环境这么复杂,这本书在被读者拿到手里的时候,一定也是经过各种各样的处理了的。。。。而现在,Yf,就是在做着还原真相,重现历史的事情呀。

Yf:

1
比如,你知道“宗教”这个词语么?虽然我们每天说N遍,但是中西方的很多学者其实都不知道,自己在研究宗教,但这个词语是从哪里来的。宗教这个词语,是17世纪的耶稣会在中国传教的过程中,因为要讨论中国的儒家礼仪,比如拜祖先、拜孔子、牌位、烧纸等等这些东西,要如何把风俗和宗教这两个东西区分开,才开始讨论的。然后这些讨论影响到欧洲,启蒙运动时候的哲学家。其实,我们小时候学的历史课本上的伏尔泰神马的人,跟耶稣会的人都很熟,受影响很大伏尔泰很喜欢中国,但他从来没来过,是看耶稣会的书才了解中国的很多耶稣会士跟伽利略神马的是好朋友。跟他们一起,翻译了很多书,才有中国古代的几何学啊!跑题了。。。
@@ -15,4 +20,4 @@
1
只是一直有一个疑惑,Yf是不是会变成一个盗墓贼,因为在每一个朝代,为了巩固极权统治,一定会把对当前政治统治有影响的资料什么的进行处理。那么,她们怎么得到真正的资料呢?我会不会有一天跟着她去见证”鬼吹灯“?哈哈。

Yf:

-
1
接着说宗教。17世纪的欧洲正在启蒙时期,现代的学科分类才正在那个时候形成。于是,宗教一词就是这样产生,并且后来成为学科。你说这个问题的意义在哪里呢?除了告诉广大人民群众以外,一群傻逼学者天天骂来骂去,说,儒家是不是宗教,中国文化有没有宗教。但是连基本概念都没搞清楚,宗教是什么意思,你说,那群人天天骂来骂去吵啥呢?
火一团
\ No newline at end of file +
1
接着说宗教。17世纪的欧洲正在启蒙时期,现代的学科分类才正在那个时候形成。于是,宗教一词就是这样产生,并且后来成为学科。你说这个问题的意义在哪里呢?除了告诉广大人民群众以外,一群傻逼学者天天骂来骂去,说,儒家是不是宗教,中国文化有没有宗教。但是连基本概念都没搞清楚,宗教是什么意思,你说,那群人天天骂来骂去吵啥呢?
火一团
\ No newline at end of file diff --git "a/docs/2013/02/26/\347\201\253\344\270\200\345\233\242/index.html" "b/docs/2013/02/26/\347\201\253\344\270\200\345\233\242/index.html" index 029a6b51b..9fa317f1a 100644 --- "a/docs/2013/02/26/\347\201\253\344\270\200\345\233\242/index.html" +++ "b/docs/2013/02/26/\347\201\253\344\270\200\345\233\242/index.html" @@ -1,16 +1,21 @@ -火一团 | Beendless ~ 快节奏,慢生活,无止境 +火一团 | Beendless ~ 快节奏,慢生活,无止境 -

火一团

一个深居简出的笨女人,却从簌簌的雪天到阴霾的雨夜,浇不灭心里一团火。这样的火焰甚至足以燃烧满屋子的纸片,让其中挑动每一根神经的沉默和疼痛感都燃烧起来。

+

火一团

一个深居简出的笨女人,却从簌簌的雪天到阴霾的雨夜,浇不灭心里一团火。这样的火焰甚至足以燃烧满屋子的纸片,让其中挑动每一根神经的沉默和疼痛感都燃烧起来。

前些日子读到罗素的自传序言《我为何而生》,孤陋寡闻的我算是第一次听罗大师讲他的爱情,看他的火焰。记得当时还有些害羞,觉得这老男人怎么如此直白,有什么可让他狂喜、战栗,同时又绝望、亦天堂?那时的我,虽说不是看一个疯子胡言乱语的心境,倒也差不了几步。此刻,却愣是要重新找到这篇小文,因为我的火焰,爱情、知识和怜悯,已然无法浇灭了。

老大不小的人了,好久不再谈论爱情的话题,甚至有意无意地回避这样的字眼。甚至某天某语境中,男朋友非要在视频里默默地看我,我笑他真是没意思,不要打扰我工作。他冷不丁地回一句,“我就是一个镜子”,那会觉得这是世界上最美的情话,并把它记在笔记本上。再过到某天,我翻开来看,“‘我就是一个镜子’,世界上最美的情话”,顿时不解,这有什么好美的?也是某个周末,一口气读完英译本的《生命不能承受之轻》,累累地合上本子,止不住地回味每一个细节。原想写好读书笔记,却终究是耽搁了。想来,几个主人公彼此之间爱来爱去,让我看到的却又不止是小年轻挂在嘴上的爱情,而是一团意欲挣脱束缚的火焰,自重难脱,平白无故地羡慕这火焰可以托起的羽毛。是啊,热空气膨胀变轻的确是可以托起物体,只怕这物体自身却又要拖着自己飞不高了。这便是扯不清的自由,挣扎在自我和世界之间,或许在战争和共产主义与否的荒诞中更容易让人们撕开这个神秘主题的面纱,探一探究竟。无论如何,这个周末先是撩拨了我对爱情的好奇,也又一次陷入自我的困境,始终解决不了的问题——人之存在是以何为据,人之理解是以何为参照。

就这样不小心从爱情的名号滑落到知识的地盘。比如,我再次遗憾地说,英译本实在不差于中译本,至少对这本书,于是我开始好奇德文是什么样子。如此想来今天早晨的前现代课程是关于路德翻译的德语圣经,教授拿出一些例子说路德提倡的自然淳朴的德语是什么,路德想要的圣经是如何贴近生活、来自田间地头,同时又来自伊拉斯谟译本的参考文献是如何如何。我真心是傻逼兮兮地就坐在那里,很豪爽地在笔记本上写下:示例examples…. 只差说“此处省略好多字”。这样的内容只能告诉我,原来没有标准的德语就好像没有标准的荷兰语一样,我是半点体会不到路德的乡土气息。还有个故事,一位神父搞大了某女人的肚子——看客莫惊,这故事发生在十五世纪——然后他劝其做人流,但这在当时的法律中没有十分明确的规定他的作为是否犯法。于是,他就纠结在,是由于他劝了很多次,而这个女人最终做出决定是基于他的劝说呢?还是他虽然劝了,但并未最终成为导致事件结果的原因?这两种可能完全决定对他不同的量刑。他纠结了,我也纠结了,因为我一开始就没看懂这个拉丁语的故事。老师好善良啊,一个超级大帅哥、超级善良又超级有语言天分的某国人!(备注:他的英文德文荷兰文甚至拉丁文都流畅到根本分不出来他母语是什么。)他极其温柔的问我,“你跟得住么?”我想,瞬间我是脸红了吧,不是因为他又帅又温柔,是因为我憋着一句特别地道的中文却说不出口,“你丫得看我表情,你说我有没有跟得上!”

而怜悯,这还是个正在挣扎的问题,借用罗大师的话结束吧。他说,怜悯,把他从前二者创造的天堂里拉回现实。我说,这现实也或许可以浇灭心中的火焰,我便可以跟窗外明月说晚安。

PS:今晚做饭的时候,我烧着了一个锅,傻了吧唧还加了油,火苗噗得窜起一米多,若不是这里屋顶都高,今晚,我可能要在警察局备案了,也能顺便听听消防车的警报声是什么样子。早晨听到的救护车声音实在太诡异,令人发笑的诡异。

-
为了穿越的旅行
\ No newline at end of file +
为了穿越的旅行
\ No newline at end of file diff --git "a/docs/2013/03/09/\344\270\272\344\272\206\347\251\277\350\266\212\347\232\204\346\227\205\350\241\214/index.html" "b/docs/2013/03/09/\344\270\272\344\272\206\347\251\277\350\266\212\347\232\204\346\227\205\350\241\214/index.html" index 5b8f6e077..a74a1fe66 100644 --- "a/docs/2013/03/09/\344\270\272\344\272\206\347\251\277\350\266\212\347\232\204\346\227\205\350\241\214/index.html" +++ "b/docs/2013/03/09/\344\270\272\344\272\206\347\251\277\350\266\212\347\232\204\346\227\205\350\241\214/index.html" @@ -1,14 +1,19 @@ -为了穿越的旅行 | Beendless ~ 快节奏,慢生活,无止境 +为了穿越的旅行 | Beendless ~ 快节奏,慢生活,无止境 -

为了穿越的旅行

今天的主题是无话可说。

+

为了穿越的旅行

今天的主题是无话可说。

一个放逐自己的理由,拿在手中,就这样走了。奔着降温前的最后一个暖冬日,我在一个晚起的早晨,摸上了去安特的火车。这个距离我只有一小时的比国省份,这个曾在17世纪繁荣整个欧洲和东亚贸易的海港城市,这个让我默默想象了半年的地方,睁开眼,就去了。

感谢google感谢iphone感谢好天气,胆小的姑娘顺利地开始了独自一人的欧洲旅行。如果除去巴黎的一天外,这是首趟单人往返的出走。为着出走的自由,更为着穿越的乐趣。今天的主要目的地是Plantin Moretus博物馆和Our Lady的大教堂,算是带着“半学术”的任务去的。眼见着我的日子越来越陷入17世纪而不能自拔了,亲自造访一下Plantin家里这个当年最大的印刷出版所,实在是荣幸得不得了。然而,我的感受却是无话可说。从进入博物馆到饿着肚子爬出来觅食,我不知道被美得倒吸了多少口暖气!我拙劣的语言要如何可以讲得了那不计其数的铜活字模、木活字版和后来的铅字模版;我的粗心要如何可以懂得主人的私人藏书馆究竟摆在那里多少热情和智慧;我的无知更是无法读得出各种语言的印刷书籍和手稿。所以,我闭嘴。但是,我要努力记住,恨不得让眼珠跳出来仔仔细细爬过每一页纸。这里的印刷出版从15世纪就开始了,它以己之力支持了伊拉斯谟,帮助了在中国的传教士,也直接促使人文主义从低地国家的广播和欧陆的对话,也曾成为向英伦国家输入不同版本圣经的主要资源。怎样寻找自己与历史的距离呢?我想,这是一个方法。在这里,我甚至不想回到以程序语言和破碎、愤怒、争吵为象征的眼下的时代。于是,情愿又不情愿地活在奔跑在几个世纪之间。而我的无知,让这样的旅程显得激动人心又太过疲惫。

回到家中,但旅行才刚刚开始。真的真的不想每一次都看着躺在那里的哥特体和巴洛克体各种语言来调戏我,而我连欲拒还迎的能力都没有!于是,跟他们一起旅行吧,从17世纪出发,从拉丁文出发。

-
一眨眼就平静了
\ No newline at end of file +
一眨眼就平静了
\ No newline at end of file diff --git "a/docs/2013/03/25/\344\270\200\347\234\250\347\234\274\345\260\261\345\271\263\351\235\231\344\272\206/index.html" "b/docs/2013/03/25/\344\270\200\347\234\250\347\234\274\345\260\261\345\271\263\351\235\231\344\272\206/index.html" index 7f125964e..62973786a 100644 --- "a/docs/2013/03/25/\344\270\200\347\234\250\347\234\274\345\260\261\345\271\263\351\235\231\344\272\206/index.html" +++ "b/docs/2013/03/25/\344\270\200\347\234\250\347\234\274\345\260\261\345\271\263\351\235\231\344\272\206/index.html" @@ -1,15 +1,20 @@ -一眨眼就平静了 | Beendless ~ 快节奏,慢生活,无止境 +一眨眼就平静了 | Beendless ~ 快节奏,慢生活,无止境 -

一眨眼就平静了

自己也不曾料想,真的就变成了此刻这样平静的自己。近来的生活一如既往地没有波澜——读书、上课、学语言、过生活。如果一定要说有点什么变化?那是进入了论文选题阶段,有些游移不定和信心不足;那是勇敢地做自己多年来一直被动也主动地丢弃了的事情,重新弹琴。

+

一眨眼就平静了

自己也不曾料想,真的就变成了此刻这样平静的自己。近来的生活一如既往地没有波澜——读书、上课、学语言、过生活。如果一定要说有点什么变化?那是进入了论文选题阶段,有些游移不定和信心不足;那是勇敢地做自己多年来一直被动也主动地丢弃了的事情,重新弹琴。

如常,每一天的生活就是这样,安静。也不在为某种享受孤独、学会寂寞、与自己相处之类的文青式主题来安排这样的日子了。我看得到,大部分在国外上学的中国孩子,都像从密密麻麻的中国地铁里钻出来却突然来到大草原上或者森林里一样,像小鹿,都突然要适应这份自由、新鲜和更多的孤单、远离热闹。有人拒绝这种改变,便带着出国的名头继续过着北京时间的生活;有人喜欢这种改变,但也终究需要找到一种方式让热气腾腾的中国血液找到流淌的渠道。否则,那不就得中风了么。无论如何,当暂时搁下“自我”,我看得到,这个自己,只是茫茫留学群体中的一员。我的感受并没有什么特别,我的情愫并不怎么重要,更何况,我的文字淡如水,还不够那么煽情。这样的平常的自己和平常的生活,还有这半年多平常的转变,就让她们都呆在那里吧。没什么可提了。

然而,我依然很忙碌,依然有车水马龙。从明清的历史真相到三十年前的史学潮流,从思想史到社会史的距离,被淹没在各种论题中,我已经迷失了方向。这样的挣扎,现在也不是第一次,但却是最严重的一次。曾经还几乎没有读懂的时候,就过去了;将来也许会真的读懂的时候,也就过去了,甚至下笔千言(不要离题万里就好);然而现在,我介于之间了。缺乏哲学思辨的训练,却一个劲儿地胡思乱想,以至于一些基本的史实数据又根本满足不了我的问题。老话说,思而不学则殆;杨绛说,因为你想得多而读的书少。横横竖竖这不都一样么?直戳我的脊梁骨。于是,再回头去读,哪怕是重读曾经蜻蜓点水走过的文本,而我得到的却是窸窸窣窣的各种不能统一、不能协调的回声,甚至都不能将自己的问题结构化。老師說他看到我就像一條滿載著各種想法的河流,現在需要一條渠道去疏導,需要一個點去集中。我多麼情願看到這句很中肯的評價當中的積極和肯定的因素,卻那麼清楚地知道,雜亂無章是老師最痛恨的。換言之,就是我現在的狀態,應該是他最不滿意的。

这样子,一边是清新淡雅、不痛不痒的花笺,另一边是缜密思辨或是心怀天下的笔墨。曾以为我纠结的是走什么路,却发现任何一条都还没有上道。没有三毛的辗转和释放,也没有龙应台的大江大海之澎湃。我跟自己說,還年輕,學術和人生都是都是靠时间积累起来的。然后就看到一则消失关于英年早逝的36岁某文学研究所的文学博士——他被视为后起之秀。他的硕博论文就已成为那个领域近年来的优秀作品,这是悻然还是幸然?

写这些个,在旁人看来是很个人、也很无聊的。全当做平静的情绪下一颗没能平静的心吧,这个,相信更多的人都有。

-
25岁,你有什么可失去的?
\ No newline at end of file +
25岁,你有什么可失去的?
\ No newline at end of file diff --git "a/docs/2013/04/03/25\345\262\201\357\274\214\344\275\240\346\234\211\344\273\200\344\271\210\345\217\257\345\244\261\345\216\273\347\232\204\357\274\237/index.html" "b/docs/2013/04/03/25\345\262\201\357\274\214\344\275\240\346\234\211\344\273\200\344\271\210\345\217\257\345\244\261\345\216\273\347\232\204\357\274\237/index.html" index 4b0f87a74..9b99b5799 100644 --- "a/docs/2013/04/03/25\345\262\201\357\274\214\344\275\240\346\234\211\344\273\200\344\271\210\345\217\257\345\244\261\345\216\273\347\232\204\357\274\237/index.html" +++ "b/docs/2013/04/03/25\345\262\201\357\274\214\344\275\240\346\234\211\344\273\200\344\271\210\345\217\257\345\244\261\345\216\273\347\232\204\357\274\237/index.html" @@ -1,11 +1,16 @@ -25岁,你有什么可失去的? | Beendless ~ 快节奏,慢生活,无止境 +25岁,你有什么可失去的? | Beendless ~ 快节奏,慢生活,无止境 -

25岁,你有什么可失去的?

无论示爱还是投稿、递交申请或者简历,摇头的速度似乎总是比点头来得快。曾经在哪里见过科学研究是说点头更容易呢?在还胆敢称自己是25岁的时候,我们会有多么害怕遭到拒绝?有多么害怕陷入迷茫?有多么害怕未来不会是自己曾梦想过的画面?然而这样的害怕,可以有一个多久的时限? 最近我常常在想,我们的记忆有多长、我们的生命有多长。某种记不得名字的鱼类,听说它的记忆是三秒,在某些惶恐和灰色的时光里,我有多么羡慕它。然而,当真实地回到生活中——远离痛苦或快乐的幻觉——却又生生地感慨生命的短暂。在这短短的几十年中,好吧,假设一个100年的距离是我们的一生(如果带着呼吸机的日子也算作内),25岁在这个四分之一点上,它又能丈量多远?身处故纸堆的另一个快乐是任意地让自己回到历史上任何一个时间、任何一个地点、任何一群人当中去。那一个25岁的自己,它又能算作什么? 有些情绪是来自于生理期、有些是因为24小时内收到一封拒信(如果是接收函一般要好等个把月甚至一年)、还有些情绪是由于重看了一遍《欲望都市》(the sex and the city) 2008年电影版。这群女人从二十多岁穿着多于普拉达的一身走过四五十岁,从曼哈顿再回到曼哈顿,也陪我度过曾经的大学。如今看来,曾让我感到炫目的或者说偶尔会羡慕的标签似乎减少了。无论是她们的独立、勇敢,还是电视电影里除了爱情和性就一副不食人间烟火的“城里”生活,对于现在的我,都不重要。五年后,我重看她们,却在分分秒秒地拷问自己,“你有什么可失去的?”就像女主人公说,女孩们都是二十多岁来到纽约,然后为名牌和爱情,一路打拼,跨过四十岁就来到该付酒钱的阶段。借着之前的拒信,我便不合逻辑地扯到——25岁的我有什么可失去的?要如何才能积攒一些可以让将来那个40岁的自己可失去的东西? 眼下我回答不了这个问题,正如我们其实经常不断地抛出、然后再撇下一些问题在生活中、在学习中、在关系中一样。这是我一个人住的第一年,并不希望像正在女孩子们当中流行很广的“第五年”那样似乎要标榜点女孩的成长或者之类的东西。只是觉得,25岁,一个人住第一年,真的没什么可失去的。此刻我有个决定,虽然是拒信,一个回复也是要给的。感谢对方写我一封拒信的时间,感谢它给我一个再次启程的地方,趁着25岁还来得及的时候。

-
写给颓废的美丽
\ No newline at end of file +

25岁,你有什么可失去的?

无论示爱还是投稿、递交申请或者简历,摇头的速度似乎总是比点头来得快。曾经在哪里见过科学研究是说点头更容易呢?在还胆敢称自己是25岁的时候,我们会有多么害怕遭到拒绝?有多么害怕陷入迷茫?有多么害怕未来不会是自己曾梦想过的画面?然而这样的害怕,可以有一个多久的时限? 最近我常常在想,我们的记忆有多长、我们的生命有多长。某种记不得名字的鱼类,听说它的记忆是三秒,在某些惶恐和灰色的时光里,我有多么羡慕它。然而,当真实地回到生活中——远离痛苦或快乐的幻觉——却又生生地感慨生命的短暂。在这短短的几十年中,好吧,假设一个100年的距离是我们的一生(如果带着呼吸机的日子也算作内),25岁在这个四分之一点上,它又能丈量多远?身处故纸堆的另一个快乐是任意地让自己回到历史上任何一个时间、任何一个地点、任何一群人当中去。那一个25岁的自己,它又能算作什么? 有些情绪是来自于生理期、有些是因为24小时内收到一封拒信(如果是接收函一般要好等个把月甚至一年)、还有些情绪是由于重看了一遍《欲望都市》(the sex and the city) 2008年电影版。这群女人从二十多岁穿着多于普拉达的一身走过四五十岁,从曼哈顿再回到曼哈顿,也陪我度过曾经的大学。如今看来,曾让我感到炫目的或者说偶尔会羡慕的标签似乎减少了。无论是她们的独立、勇敢,还是电视电影里除了爱情和性就一副不食人间烟火的“城里”生活,对于现在的我,都不重要。五年后,我重看她们,却在分分秒秒地拷问自己,“你有什么可失去的?”就像女主人公说,女孩们都是二十多岁来到纽约,然后为名牌和爱情,一路打拼,跨过四十岁就来到该付酒钱的阶段。借着之前的拒信,我便不合逻辑地扯到——25岁的我有什么可失去的?要如何才能积攒一些可以让将来那个40岁的自己可失去的东西? 眼下我回答不了这个问题,正如我们其实经常不断地抛出、然后再撇下一些问题在生活中、在学习中、在关系中一样。这是我一个人住的第一年,并不希望像正在女孩子们当中流行很广的“第五年”那样似乎要标榜点女孩的成长或者之类的东西。只是觉得,25岁,一个人住第一年,真的没什么可失去的。此刻我有个决定,虽然是拒信,一个回复也是要给的。感谢对方写我一封拒信的时间,感谢它给我一个再次启程的地方,趁着25岁还来得及的时候。

+
写给颓废的美丽
\ No newline at end of file diff --git "a/docs/2013/04/13/\345\206\231\347\273\231\351\242\223\345\272\237\347\232\204\347\276\216\344\270\275/index.html" "b/docs/2013/04/13/\345\206\231\347\273\231\351\242\223\345\272\237\347\232\204\347\276\216\344\270\275/index.html" index 79b20453c..05f791299 100644 --- "a/docs/2013/04/13/\345\206\231\347\273\231\351\242\223\345\272\237\347\232\204\347\276\216\344\270\275/index.html" +++ "b/docs/2013/04/13/\345\206\231\347\273\231\351\242\223\345\272\237\347\232\204\347\276\216\344\270\275/index.html" @@ -1,16 +1,21 @@ -写给颓废的美丽 | Beendless ~ 快节奏,慢生活,无止境 +写给颓废的美丽 | Beendless ~ 快节奏,慢生活,无止境 -

写给颓废的美丽

曾经,觉得自己生活得苦。曾经要早起出操,曾经害怕迟到,害怕站在教室门口面对老师的铁面孔和同学来来往往的、并无恶意的玩笑和眼神。后来,就害怕考不上大学,再到害怕挂科,甚至害怕找不到工作或者到不了心目中的地方。当然,也曾害怕不被人喜欢、害怕失恋,害怕丢掉哪怕是一段鸡肋的关系。再后来,害怕生病,害怕毕业,害怕面对一个长大的自己和长大的世界。

+

写给颓废的美丽

曾经,觉得自己生活得苦。曾经要早起出操,曾经害怕迟到,害怕站在教室门口面对老师的铁面孔和同学来来往往的、并无恶意的玩笑和眼神。后来,就害怕考不上大学,再到害怕挂科,甚至害怕找不到工作或者到不了心目中的地方。当然,也曾害怕不被人喜欢、害怕失恋,害怕丢掉哪怕是一段鸡肋的关系。再后来,害怕生病,害怕毕业,害怕面对一个长大的自己和长大的世界。

一路害怕着,也走到了现在,并未缺胳膊少腿、并未流落街头。反而,恰恰相反。

经过了一个又一个不得已的突击,竟也顺利一路升学,直到成了博士、直到跟了自己想要的导师、学着想学的东西、呆在想要的地方。生过病住过院,除却多了一份经历、尝了那么一丁点儿皮肉之苦,也真的什么都没有失去。于是就到了眼前,需要什么就有什么、想要什么就有什么。一种曾经梦想过多少次的生活,一种在他人的相簿或者日志里看起来多么美丽的生活,一种有自由、有文艺,仍然也有希望、有未知、有方向的生活,一种风平浪静但不失甜美的生活。都有了。然而,不是又害怕了么?

害怕当自己已经获得了这些想要的东西,然后再去追寻些什么呢?对于一个并不那么追求名牌或者物质的我,已然是拥有了足够满足自己的丰富。甚至都想不起来还需要买些什么呢?那么要追寻一下千百年前的古人的世界?还是东西方智慧的源泉?这些东西,追到感觉自己太过渺小的时候,也便容易丢失力气、容易停下脚步、容易东张西望。于是,在惯以为的物质和精神两个世界,眼下是达到了某一个临界点,不高、也不那么低。我幸福了,便颓废了。

我们常常挣扎在过多的欲望和过少的获得之间,我们称之为痛苦。为了避免这种情绪的产生,我们尝试着学习“知足常乐”的精神。每个人都有自己内心的一个标准,于是,我相信,很多人都会有那么一段或几段时光在人生当中停留在我此刻的阶段。我们协调自己的贪心和努力、我们化解理想与现实之间的距离,我们为此纠结、挣扎,终于,有一天它居然达到了!真的是可以达到的。然后呢,我们就幸福了么?或许在那一刻,是的。然后呢,然后我们不知前方又该怎么走?继续维持这种平衡么?又该如何维持呢?不就是得先打破平衡本身,然后再走向下一次的平衡么?既然没死,我们的平衡点就不可能静止在那里,所以对它的维持和它要达到的维持平衡的状态这个本身就是过程,就是要破坏平衡。陷入这种幸福感的自己,需要多大的勇气才能打破它?

曾经以为,自己想要的太多,困难的是为获得而必需的付出。现在才明白,付出不可怕,只是要多一点点坚持、一点点执着。我做得到。而更困难的是,如何去想要更多的东西。即使这个东西不需要太多的想象力,因为我不需要去设想一个与外星人见面的未来空间;但我需要那种贪心、那种欲望、那种想要占有更多东西的欲望,强烈的欲望!它可以物质、可以智识,哪怕什么都可以!这种颓废的美丽和幸福,请滚开吧,我不介意一个长达四五年的销声匿迹。请这样的美丽,滚开。

-
轻轻行走在失败的边缘线上
\ No newline at end of file +
轻轻行走在失败的边缘线上
\ No newline at end of file diff --git "a/docs/2013/11/15/\345\221\250\346\234\253\345\244\215\345\221\250\346\234\253/index.html" "b/docs/2013/11/15/\345\221\250\346\234\253\345\244\215\345\221\250\346\234\253/index.html" index ca55205d8..1563e630b 100644 --- "a/docs/2013/11/15/\345\221\250\346\234\253\345\244\215\345\221\250\346\234\253/index.html" +++ "b/docs/2013/11/15/\345\221\250\346\234\253\345\244\215\345\221\250\346\234\253/index.html" @@ -1,16 +1,21 @@ -周末复周末 | Beendless ~ 快节奏,慢生活,无止境 +周末复周末 | Beendless ~ 快节奏,慢生活,无止境 -

周末复周末

我的生活本没有周末的概念。平日里也可以自己跑出去购物、健身或旅行,周末也常常宅在家里看书或工作。拥有自由也同时在挥霍自由。就这样也惯了。只因为这学期的课程刚好以周一早晨开始,以周五下午结束,我便也有了个有模有样的周末。

+

周末复周末

我的生活本没有周末的概念。平日里也可以自己跑出去购物、健身或旅行,周末也常常宅在家里看书或工作。拥有自由也同时在挥霍自由。就这样也惯了。只因为这学期的课程刚好以周一早晨开始,以周五下午结束,我便也有了个有模有样的周末。

周末,窝在沙发里听音乐,读些闲来不羁的东西,或者发呆——一阵遐想也能让时间张牙舞爪地从眼前飞过。而我,就眼看着时间飞过时它那龇牙咧嘴的邪恶表情,向我炫耀它如何地不肯为我停下,如何地不为我的喜怒哀乐所动,如何地继续它比我更自由的旅行、向我证明它才是主宰——而我只是过客。那么多的讨论那么多的技术,都会以它为中心,却从来占据不了它。即使用摄像机记录下每时每刻每分每秒,即使所有的记录都可以无限切割,我们仍然必须要漏掉正在记录它或者正在切割它的时间里所溜走的时间。看过很多讲时间管理和效率管理的理论,也尝试过,然而无论以什么样的主题和视角,却总还是被它所控制。最终,唯一能安慰和调节的只能是自己,让自己面对,并且积极地面对每一秒钟。

周末,也比较多的做一些生活杂事,比如做饭洗衣做清洁。这些个平日看起来似乎是占用了工作时间的事情,反而做起来津津有味。切一颗洋葱,哪怕被熏得掉眼泪,也并不觉得有什么不好。擦地板也要弄一些看起来脏兮兮的灰尘,其实也都是一水即可洗净的东西。都很简单,简单到做的时候不需要任何的思考,做完之后也不需要任何的思考。以前会以为做这些事情的时候可以想想别的、“更重要”的东西,听听新闻也关注一下自己生活的地方。现在却发现,做这些事情的时候,自己是最专注的。而且家务活变成了我放松的方式。似乎这是专属于周末的、专属于家里的、专属于自己的。可能将来做个家庭主妇真是我的终极梦想和完美职业吧。

周末,偶尔也见些朋友,如果有朋友约的话。在友情爱情亲情当中,我永远都是最懒的那个。我会默默地想,想到泪流满面或者焦躁不安,但也不会满怀情感地踏出第一步,比如约别人出来见个面,计划一次相聚,或者直接奔去做些什么。这应该是个毛病。但即使如此,现在的周末也会渐渐增多这样的内容。不要社交的场面,只要一杯热茶或咖啡,聊聊生活和心境,或者贪嘴吃些零食。有朋友来,总是好的。

眼下的生活,可以简单到奢侈。然而扪心自问,“不乱于心,不困于情”?我做不到;“不畏将来,不念过往”? 我同样做不到。总有些让自己不知所措的时刻。不知道答案的时候,不能安好;知道答案之后,又怎能安好。或许,也都是人生必做的功课罢了。平湖秋月再是宁谧浩淼,恐怕也缺不了微微有涟漪的景致。也或许,这才是最美,也最自然、最正常的吧。

深呼吸,就是下一个周末。:)

-
那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学
\ No newline at end of file +
那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学
\ No newline at end of file diff --git "a/docs/2013/11/15/\345\255\230\346\264\273\346\234\237\344\270\216\347\224\237\351\225\277\346\234\237/index.html" "b/docs/2013/11/15/\345\255\230\346\264\273\346\234\237\344\270\216\347\224\237\351\225\277\346\234\237/index.html" index c943c49f3..ae3c80807 100644 --- "a/docs/2013/11/15/\345\255\230\346\264\273\346\234\237\344\270\216\347\224\237\351\225\277\346\234\237/index.html" +++ "b/docs/2013/11/15/\345\255\230\346\264\273\346\234\237\344\270\216\347\224\237\351\225\277\346\234\237/index.html" @@ -1,15 +1,20 @@ -存活期与生长期 | Beendless ~ 快节奏,慢生活,无止境 +存活期与生长期 | Beendless ~ 快节奏,慢生活,无止境 -

存活期与生长期

看书到一半,带着近乎“失语”的低落感,希望写个阶段性成果,给自己,更给近来没太联系的朋友们。存活期,是我来比读书至今的9个月时间;生长期,是盼望中的接下来3个月。1年光景,不短不长。

+

存活期与生长期

看书到一半,带着近乎“失语”的低落感,希望写个阶段性成果,给自己,更给近来没太联系的朋友们。存活期,是我来比读书至今的9个月时间;生长期,是盼望中的接下来3个月。1年光景,不短不长。

9个月来,有哭有笑,前者更多。想放弃,想找退路回到过去,却发现当你自己无力的时候,都不再能自己做主。那个在泥泞里行走的车轮将不是自己,而是自己心中未灭的火焰、未解的疑问,自己这个人只是泥土中的车辙和狼狈。具体说,9个月,我还好好地活着。几番考试和学习下来,我勉勉强强求得存活。都说第一年是最有挑战的,因为研究方向本身的特点,“文化差异”这个概念对于我,它不是蜻蜓点水般的口头禅,而是切实的冲撞和窒息感。多种语言的挑战和我经常独自一人的生活无法融合。于是,终于,挂了一科。老师说在语法和词汇都很棒的情况下,因为我不愿意跟其他欧洲人讲法语,所以那些知识不能在我的交流中起作用。坦白讲,一直做学生的我是不经常挂科的,要面对已是不易;这样拿出来说给别人听,真的是不易。而且最讽刺的是,一个研究文化“交流”问题的我,居然在自己的生活中不能与人“交流”。很犯贱地说,我自己的这个过度阐释本来是为了自嘲,后来也实实在在伤到了自己,真的不想跟人说话,任何话,情愿“失语”。9个月,就这样结束了。不管学到多少、体会到多少、调整了多少,我在这里给自己的结论是:勉强存活。本来有多次回国探亲、休息的念头,但夏天会有好友来欧洲。无论如何,见到他们,就是情感的安慰。回国的盘算,暂且明年。

接下来3个月,与其说是新的盼望,不如说是逼到死线的不得已。第一年结束之前必须有确定的论题报告。一份报告不仅会包括我这一年来对这个陌生领域的所有的认知程度,也包括几乎所有的参考及资料。前面9个月没完成的、落下的、粗疏的,都只能在这3个月内完成。这是一个生长期。什么“孤独”、“失败”、“自怨自艾”之类的矫情和唧唧歪歪,我已经折在其中9个月了,真TMD没意思。要少做那些个欠抽的事情。

说这些在这里,拿给关心我和不关心我,真心保护我和真心嘲笑我的人看——有人是朋友,有人是看客。生活本如此,有一些朋友就够了,我不奢求再得到更多。只是练习一种讲故事的方法,像讲述一个毫不相关的人一样去讲一些本来会很矫情的东西。话说回来,有人在人才市场拼了命的找饭碗,有人在担心毒大米,有人在人肉那个不会写象形字的男孩,也有人请求校长开房去找大咪咪而不是小学生,还有人帮着奥总统对非洲青年解释美国的反恐政策是如何避开无辜平民的——好多好多的人,在做好多好多的事。我这么微不足道的个人和生活本身就是一种矫情和自私。

收手了。滚回去念书。

-
周末复周末
\ No newline at end of file +
周末复周末
\ No newline at end of file diff --git "a/docs/2013/11/15/\345\257\253\344\275\234\346\230\257\344\270\200\344\273\266\351\234\200\350\246\201\345\240\205\346\214\201\347\232\204\344\272\213\346\203\205/index.html" "b/docs/2013/11/15/\345\257\253\344\275\234\346\230\257\344\270\200\344\273\266\351\234\200\350\246\201\345\240\205\346\214\201\347\232\204\344\272\213\346\203\205/index.html" index d99d1df5c..3d06b3017 100644 --- "a/docs/2013/11/15/\345\257\253\344\275\234\346\230\257\344\270\200\344\273\266\351\234\200\350\246\201\345\240\205\346\214\201\347\232\204\344\272\213\346\203\205/index.html" +++ "b/docs/2013/11/15/\345\257\253\344\275\234\346\230\257\344\270\200\344\273\266\351\234\200\350\246\201\345\240\205\346\214\201\347\232\204\344\272\213\346\203\205/index.html" @@ -1,15 +1,20 @@ -寫作是一件需要堅持的事情 | Beendless ~ 快节奏,慢生活,无止境 +寫作是一件需要堅持的事情 | Beendless ~ 快节奏,慢生活,无止境 -

寫作是一件需要堅持的事情

有一些不得不說的話,也是一些不能隨便貼到網絡上讓人家去指指點點的話──比如,我想讓自己練習和堅持寫作,包括中文和英文。

+

寫作是一件需要堅持的事情

有一些不得不說的話,也是一些不能隨便貼到網絡上讓人家去指指點點的話──比如,我想讓自己練習和堅持寫作,包括中文和英文。

本來在SJZJ這篇論文的完整草稿沒寫完之前,因為魂斷藍橋的電影,因為今晚騎車被警察攔下修車燈的巧合,因為疲累和完成草稿的小小興奮,我好想寫點東西。甚至,腹稿都打了好幾遍。然而,最終提不起來的是精神、是勇氣。

我覺得自己寫的不好,所以急於示人卻又不敢示人。我覺得自己的想法很好,所以想要示人卻更不敢示人。於是不知道怎麼的,話題逐漸轉到曾經早被放棄的一件事情上來,也就是寫作。

開了博客,就是為了督促自己去寫作的。誰知,每年付著服務器的錢,也付著語法修改的錢,但其實什麼都沒做。好多個月了,再一次想起,曾經有這樣一個算是夢想的東西,更應該是習以為常的學習和訓練的東西。

不知道這次能堅持多久,至少在為下篇文章的初稿之前,請堅持這件事情: 閱讀>>>寫作 (中文+English)

-
深呼吸
\ No newline at end of file +
深呼吸
\ No newline at end of file diff --git "a/docs/2013/11/15/\346\265\201\346\260\264\350\264\246\344\270\200\345\271\264\350\256\260 \357\274\210\344\272\214\344\272\214\346\233\264\345\201\245\345\272\267\357\274\211/index.html" "b/docs/2013/11/15/\346\265\201\346\260\264\350\264\246\344\270\200\345\271\264\350\256\260 \357\274\210\344\272\214\344\272\214\346\233\264\345\201\245\345\272\267\357\274\211/index.html" index d6d3a5c50..ad18d8edb 100644 --- "a/docs/2013/11/15/\346\265\201\346\260\264\350\264\246\344\270\200\345\271\264\350\256\260 \357\274\210\344\272\214\344\272\214\346\233\264\345\201\245\345\272\267\357\274\211/index.html" +++ "b/docs/2013/11/15/\346\265\201\346\260\264\350\264\246\344\270\200\345\271\264\350\256\260 \357\274\210\344\272\214\344\272\214\346\233\264\345\201\245\345\272\267\357\274\211/index.html" @@ -1,16 +1,21 @@ -流水账一年记 (二二更健康) | Beendless ~ 快节奏,慢生活,无止境 +流水账一年记 (二二更健康) | Beendless ~ 快节奏,慢生活,无止境 -

流水账一年记 (二二更健康)

之前也絮絮叨叨且各种矫情地说了很多自己的生活。近日过得太是开心得不知天高地厚,突然发现,已近一年。

+

流水账一年记 (二二更健康)

之前也絮絮叨叨且各种矫情地说了很多自己的生活。近日过得太是开心得不知天高地厚,突然发现,已近一年。

从初来乍到的兴奋到后来的孤独和不安,从学习工作压力的各种形式主义抓狂到鼻涕一把泪一把地习惯下来——这一年的我过得平平淡淡。或者换句话说,没有那么开心。直到最近的半个月。

宅在家中直面监狱的我,这个月一开始就跑去了海德堡。有人说这是海德堡的“情缘”。虽然我骂人家好酸啊,但依然无比珍视跟这群人的相识、一起看日落、一起走哲学家小道、一起在沿河的路边嬉笑打骂。似乎,好久,都没有过。还未离开海德堡,亲爱的xixi就从罗马飞来,带着一箱子从香港和台湾一起运来的思念。如此的相见已经计划了大半年、期待了大半年;然而一起却只能有短短两天半。分分秒秒,如何不是我最开心的时光。有朋自远方来,定是欢乐不少,后来也有朋友从法国来旅行。

短短十多天,我是听了多少“不要把自己关在监狱里”这类的谆谆教诲!即使离开了,还一个个叮嘱,让我多出去放风啊……好吧,我答应你们也答应自己,你们走了,但不带走这些天的快乐。

我会多出去放风的!!!

昨晚定了布鲁塞尔的酒店,解决了赶飞机难题,9月初去威尼斯。期待水城给自己一个完美的周年结尾。明年,更好~

-
黑暗中迎接夕阳
\ No newline at end of file +
黑暗中迎接夕阳
\ No newline at end of file diff --git "a/docs/2013/11/15/\350\247\246\345\272\225\345\217\215\345\274\271/index.html" "b/docs/2013/11/15/\350\247\246\345\272\225\345\217\215\345\274\271/index.html" index 91172293c..e62016260 100644 --- "a/docs/2013/11/15/\350\247\246\345\272\225\345\217\215\345\274\271/index.html" +++ "b/docs/2013/11/15/\350\247\246\345\272\225\345\217\215\345\274\271/index.html" @@ -1,13 +1,18 @@ -触底反弹 | Beendless ~ 快节奏,慢生活,无止境 +触底反弹 | Beendless ~ 快节奏,慢生活,无止境 -

触底反弹

或许与荷尔蒙没什么关系,因为它们已经被扔在健身房了。但总还是反反复复地,再次完成近两个星期的忧郁时间。总在有意无意地克制自己,放不开嚣张也放不开坚强。这样看似矫情地在情绪低谷写日志,自己也是嗤之以鼻;但想想却有合情合理的地方。把酒言欢的时候,全身心地投入的时候,或者累得睁不开眼的时候,又不是要卖字为生,能有哪门子的心思或者动力来写点无聊的字?只有在这样——仲夏黑夜,沉默累积,独自一人又无处宣泄的时候。如此的矫情都有了得以存在的理由。如此,我便真是无聊到一定程度了。

+

触底反弹

或许与荷尔蒙没什么关系,因为它们已经被扔在健身房了。但总还是反反复复地,再次完成近两个星期的忧郁时间。总在有意无意地克制自己,放不开嚣张也放不开坚强。这样看似矫情地在情绪低谷写日志,自己也是嗤之以鼻;但想想却有合情合理的地方。把酒言欢的时候,全身心地投入的时候,或者累得睁不开眼的时候,又不是要卖字为生,能有哪门子的心思或者动力来写点无聊的字?只有在这样——仲夏黑夜,沉默累积,独自一人又无处宣泄的时候。如此的矫情都有了得以存在的理由。如此,我便真是无聊到一定程度了。

实在点儿说,工作,就是灵魂的另一半,无论我们是否愿意承认。每天的所有时间里,除了吃睡等维持基本生理机能的活动外,我们把一半以上都交给了工作。于是,工作于我们自身或许比恋人来得更实在一些,因为它真的是不离不弃。除非某天我们被解雇了且长期待业。那样的感觉,或许比长期单身更让人抓狂吧。即使号称家庭主妇这个行业,每天也有花花草草洗衣做饭或者打牌购物这种工作来做,不是么?很早很早,我就有想过自己喜欢做什么样的工作,也尝试了。播音?记者?旅游?教师?然而,每当我把爱好变成一份兼职工作的时候,某种毫不愿意负责的挣扎感便浮出水面。否则,我或许几年前会尝试其他的路去走。从未想过或爱过读那么多书、做那么难的研究,然而却不知不觉上了贼船;甚至在最痛苦难过的时候,依然会觉得它很实在,它给我自由,它具备挑战,它还可以“魔幻现实主义”(自从莫言之后这个词好火……)。走着走着,便到了选题目,也就是找对象的时候。一路迷茫,竟然也磨磨唧唧地找到了一个。它绝不是高富帅,然而却可能具有奥特曼的潜质。在高难度挑战面前,默默了好久。踟蹰,畏惧,止步不前。再加上一些无病呻吟的“孤独感”、不社交的习惯,和闷热的室内高温,还有隐隐地藏在最深处的思乡病,我再一次触底。

下周末要去海德堡呆一个星期,同事说我怎么一点都不期待不开心呢?对啊,那么美的古老学校,那么有趣的讨论题目,那么多新面孔,我怎么一点都不期待不开心呢?反而多有焦虑和自卑,怕丢脸丢在外面。那,那,那,是不是该反弹一下?

-
流水账一年记 (二二更健康)
\ No newline at end of file +
流水账一年记 (二二更健康)
\ No newline at end of file diff --git "a/docs/2013/11/15/\350\275\273\350\275\273\350\241\214\350\265\260\345\234\250\345\244\261\350\264\245\347\232\204\350\276\271\347\274\230\347\272\277\344\270\212/index.html" "b/docs/2013/11/15/\350\275\273\350\275\273\350\241\214\350\265\260\345\234\250\345\244\261\350\264\245\347\232\204\350\276\271\347\274\230\347\272\277\344\270\212/index.html" index 164a73be4..a72b2d8ab 100644 --- "a/docs/2013/11/15/\350\275\273\350\275\273\350\241\214\350\265\260\345\234\250\345\244\261\350\264\245\347\232\204\350\276\271\347\274\230\347\272\277\344\270\212/index.html" +++ "b/docs/2013/11/15/\350\275\273\350\275\273\350\241\214\350\265\260\345\234\250\345\244\261\350\264\245\347\232\204\350\276\271\347\274\230\347\272\277\344\270\212/index.html" @@ -1,16 +1,21 @@ -轻轻行走在失败的边缘线上 | Beendless ~ 快节奏,慢生活,无止境 +轻轻行走在失败的边缘线上 | Beendless ~ 快节奏,慢生活,无止境 -

轻轻行走在失败的边缘线上

先说说为什么突然跑来QQ写字,因为孤单寂寞抽风了,因为想要吸引眼球和嘘寒问暖了,因为想要预设一个观众群来上演毫无意义的独角戏。很简单,因为闷骚需要发泄了。我是个很懒的人,不论别人的故事也好、自己的世界也罢,经常写着写着就躲在沙发里做春秋大梦去了。写字,总也是辛苦的事情。即使再闷骚的人,比如类似我这种,也可能有很害羞的一面,或者说就是懦弱和胆怯,就是不敢面对。无论是故事的内容、自己的成长和变化、他人的经历,哪怕是笨拙到让人不齿的写作能力,这一切,我都不敢面对。于是就做了自己的网站,去那里写。没打算走广而告之的路线,所以没使用任何热门字眼,那个网站也很安静。听说从我天朝是上不去那个网站的,大约是因为它的服务器在米国的缘故。于是这样的安静更有了技术上的、实际的解释,网站所有内容都是用中文写的,而中国人最多的地方它却被墙在门外。该自嘲呢还是自嘲呢?直到某天看到一些评论和留言,我甚至怀疑他们只是水军,或者四处乱踩,是希望别人踩回他们的页面。不管是不是真的这样,看到评论的一刹那,某根弦被触动了——原来,我需要的不是面对孤独、塑造孤独的勇气,而是敢于示人的勇气。总之,在这个方面,算是还挺失败的。依然懦弱着。

+

轻轻行走在失败的边缘线上

先说说为什么突然跑来QQ写字,因为孤单寂寞抽风了,因为想要吸引眼球和嘘寒问暖了,因为想要预设一个观众群来上演毫无意义的独角戏。很简单,因为闷骚需要发泄了。我是个很懒的人,不论别人的故事也好、自己的世界也罢,经常写着写着就躲在沙发里做春秋大梦去了。写字,总也是辛苦的事情。即使再闷骚的人,比如类似我这种,也可能有很害羞的一面,或者说就是懦弱和胆怯,就是不敢面对。无论是故事的内容、自己的成长和变化、他人的经历,哪怕是笨拙到让人不齿的写作能力,这一切,我都不敢面对。于是就做了自己的网站,去那里写。没打算走广而告之的路线,所以没使用任何热门字眼,那个网站也很安静。听说从我天朝是上不去那个网站的,大约是因为它的服务器在米国的缘故。于是这样的安静更有了技术上的、实际的解释,网站所有内容都是用中文写的,而中国人最多的地方它却被墙在门外。该自嘲呢还是自嘲呢?直到某天看到一些评论和留言,我甚至怀疑他们只是水军,或者四处乱踩,是希望别人踩回他们的页面。不管是不是真的这样,看到评论的一刹那,某根弦被触动了——原来,我需要的不是面对孤独、塑造孤独的勇气,而是敢于示人的勇气。总之,在这个方面,算是还挺失败的。依然懦弱着。

再说说所谓的留学生活。“留学”这两个字总让我觉得很扎眼、不舒服,或许是因为这些年这个群体被赋予了太多奇奇怪怪色彩的缘故。有褒有贬,但我觉得大家的有色眼镜重了些,这不过是一群远离家乡的学生。大家带着不同的、但同样被嚼烂了的梦想打起背包;在飞机落地后各自忙着跑去安顿各自的孤独。怎能不孤独?离开所生所养的母体文化。只是,大家都有自己的应对办法。是的,有些人在应对,有些人在遮掩。坦白地讲,我应对了,也遮掩了,却最终都失败了。在看似平静、独立、光鲜亮丽——这都是些多么常用的词儿——的氤氲的印象之后,终于某天这个歇斯底里的灵魂爆发了。真想活脱脱变成祥林嫂,见人就抓住,说自己的阿毛,那又何妨?有那么一闪念,觉得芙蓉姐姐、凤姐、祥林嫂什么的都好可爱,她们有豁得出去的劲儿。就算是个并非大家闺秀的女孩子、那么普通甚至常常有些自卑的女孩子吧,我是如何也豁不出去一把。于是,就这样呆着。起初,对于一些名为“学会跟自己相处”之类的文青体还能让我硬是产生一些一夜长大的幻觉;后来,我静静地聆听,我用眼睛看,所以出门在外的留学生几乎都有这样的成长——过日子、念书考试、陌生环境、独自一人或加团血拼——我简直不知道自己在这里说了些什么,但我知道,这群人,都这样地成长着。而在于我,我没什么特殊、我的感受也没什么与众不同。我没那份灵性,能从同样落地的苹果想到地心引力。我也一样,捡起来可能也懒得洗,就吃了而已,还告诉自己也告诉身边的人,不干不净吃了没病。我只是这群人中的一个,一样地报喜不报忧,一样地贴几张阳光灿烂的照片,甚至,我比实验室里奋战牛期刊的童鞋们还失败了不少。依然淡淡地无能着。

说说唯一正经的、工作的事儿。我说的工作也就是我的上学,因为它就是我的工作。一个老大不小的老姑娘,若是四处嚷嚷“我是学生我还小”这样的口号会很叫人恶心,这个自知我还有。再者,什么博士不博士的,读与不读,我也不觉得能重要到那里去,于娟癌症、张辉暴斃,我也真是想不通有些个博士们为何要将自己看得不一样,大致也觉得人生短暂,活一世就猖狂一回吧。有何不可?对我来讲,最难回答的问题不是上学还是工作,读什么学位,而是,我在干什么?我做的东西是什么?我是个做什么的人?这年头,女选行也不见得比嫁郎容易多少。无知者无畏,我便稀里糊涂选择了现在的领域;明知山有虎,偏向虎山行,傻帽似的执拗依然在这里坚持着。然而,我不得不打自己一个嘴巴子,真的很难。同样是大姑娘,而我选择与一群几个世纪之前的男女老少和各种语言打交道,要说没兴趣那便是诳自己了。然而这样的兴趣和热情在高强度和高难度的挑战中,时不时就怕得躲起来。才入门,我不敢说自己学艺不精,那是对不起师父了;但曾经荒废的年华里那些错过的外语、那些学得不够好的古代史和世界史、那些早都抛到九霄云外的古汉语和金石校勘知识,都让现在的我在学习中捉襟见肘。一面硬着头皮对付新的语言,一面捡拾一些在应然层面早该掌握的东西,我好是晕头转向。第一学期的迷茫还有前辈们年轻时候的迷茫做陪伴(比如季羡林说自己刚到德国前三个月完全不知道自己该选什么道路、该学什么语言),这种聊以自慰的办法到现在已经不再受用了。人嘛,有时候把大师们从棺材板下面抬出来,是为了帮助证明自己,也是为了给自己一个模糊的榜样才不致失去方向,这时真需要一些轻狂。譬如杨修恃才放旷,死了还被人奚落,但谁又问过,或许他的寥落和自卑只是需要这样的方式来疗伤。然而,这不是说我,我自己是个反面。学不会这样的自我点燃的方法,反而更糟糕,变成一边拷问自己所做有何意义,一边滚着西西弗斯的石头真心有力所不及的悲凉。很简单,若无一些众人皆醉我独醒的狂妄,如我们这般不创造生产力的所谓“思想者”,该如何回答“我为什么思考这个问题”这样的问题?依然很失败,我的哑口无言只会越来越消磨那份激情。

说说不痛不痒、最不与人要紧的“孤单”。忘记了曾几何时,校园里有一个整日插个耳机、很清瘦的、终日留短发的小眼睛女生。她总背着双肩包。后来我知道她与我同级、北京人。仅此而已,我甚至都忘了如何得到这些消息,也没有刻意多问什么。这个女孩不爱笑,或者我没见过她笑,因为她似乎总是一个人。这个有些萧萧瑟瑟却似乎雷厉风行、自由地像风一样的女孩子在我眼里是极其酷的。大概是我刚好跟她相反的缘故吧。总是不愿独自出门,我从来都是扯着朋友或者藏在一群人中,说话声音我若不算最大的话,笑得没心没肺我也算是了。我不幽默,或者在有些人看来是个很无聊的人,但我总愿意跟一群人这样凑着、闹着、笑着。于是,我深深地喜欢那个女孩子的影子,那样的潇洒并不刻意。是不是一直就这么想着,于是我一个人溜出了人群,来到这里?瞅瞅今天的我,是否与心中这个影子已经暗合?或是阳光或是绿影,即使阴霾雨天,突然发现自己只需要看天气穿衣服,保得住冷暖,衬得了心情,便已是所有要操心的内容了。除此而无他。一份不能承受的轻,是自由自在,还是茕茕孑立?依然很失败,还没有想清楚。

骂街完毕,回头看来,依然是只是个废话连篇的败笔。在午后的很明媚的太阳中抱着一腔想要唤起正能量的心来写的,怎么还是写成了凉飕飕的。奥特曼在哪里?奥特曼在中国。此人,此文,见于QQ空间。

PS:持续增肥中,因为每天在工作以外只需要考虑吃什么这一个问题。期待更胖。

-
存活期与生长期
\ No newline at end of file +
存活期与生长期
\ No newline at end of file diff --git "a/docs/2013/11/15/\351\202\243\345\271\264\346\210\221\344\273\254\350\277\230\346\234\252\345\210\260\347\232\204\350\212\261\345\255\243\351\233\250\345\255\243\342\200\224\342\200\224\344\270\272\344\272\206\345\277\230\345\215\264\346\210\221\347\232\204\347\224\230\350\202\203\347\234\201\345\256\232\350\245\277\345\216\277\344\270\234\346\226\271\347\272\242\344\270\255\345\255\246/index.html" "b/docs/2013/11/15/\351\202\243\345\271\264\346\210\221\344\273\254\350\277\230\346\234\252\345\210\260\347\232\204\350\212\261\345\255\243\351\233\250\345\255\243\342\200\224\342\200\224\344\270\272\344\272\206\345\277\230\345\215\264\346\210\221\347\232\204\347\224\230\350\202\203\347\234\201\345\256\232\350\245\277\345\216\277\344\270\234\346\226\271\347\272\242\344\270\255\345\255\246/index.html" index 890ff577e..fb846aa67 100644 --- "a/docs/2013/11/15/\351\202\243\345\271\264\346\210\221\344\273\254\350\277\230\346\234\252\345\210\260\347\232\204\350\212\261\345\255\243\351\233\250\345\255\243\342\200\224\342\200\224\344\270\272\344\272\206\345\277\230\345\215\264\346\210\221\347\232\204\347\224\230\350\202\203\347\234\201\345\256\232\350\245\277\345\216\277\344\270\234\346\226\271\347\272\242\344\270\255\345\255\246/index.html" +++ "b/docs/2013/11/15/\351\202\243\345\271\264\346\210\221\344\273\254\350\277\230\346\234\252\345\210\260\347\232\204\350\212\261\345\255\243\351\233\250\345\255\243\342\200\224\342\200\224\344\270\272\344\272\206\345\277\230\345\215\264\346\210\221\347\232\204\347\224\230\350\202\203\347\234\201\345\256\232\350\245\277\345\216\277\344\270\234\346\226\271\347\272\242\344\270\255\345\255\246/index.html" @@ -1,13 +1,18 @@ -那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学 | Beendless ~ 快节奏,慢生活,无止境 +那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学 | Beendless ~ 快节奏,慢生活,无止境 -

那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学

此处的胡言乱语来自两个尴尬:

+

那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学

此处的胡言乱语来自两个尴尬:

第一个,超级兴奋且意外地收到某大杂志的评审意见(因为最初寄出去稿子的时候压根没想到还会有二审和修改的机会),却尴尬地看到其中最尖锐的问题是我最难以修改的方面——在冷峻的史学分析与感性的区域性描写之间,我重了后者而轻了前者。轻前者是功力不足导致,重后者却是我割舍不下。其实,这篇“学术”论文写的是民国时期的甘肃某某、河西走廊某某、黄土地和戈壁滩某某。甘肃,我那个满面烟火色的家乡。

第二个尴尬就来自于QQ空间。初中一同学在空间里贴出一些娱乐性电视节目的链接和广告,说欢迎大家看看。对当下流行的各种卫视和节目,我真是全然无知(除了《非诚勿扰》,因为出国前常把它当净化未婚女青年心灵的利器来看);而且习惯性地各种心理投射,使我在他的推荐下面问了这样一个问题:“话说,你现在哪里呢?这是在哪个电视台么?你是做哪块啊?”做电视和做节目的惯性思维就我自己尴尬地撂在留言板上,直到后来看见跟帖的人都在说,“你很棒”“支持你”或“很有个性”之类的话。我才幡然悔悟——他不是在做电视,是参与节目!留着庐山瀑布汗,我认真去看了这段预告片花,原来是天津卫视的《天下无双》,而我这位初中同学作为模仿林志颖的选手之一与小志同台演唱。拼命搜遍google也只能找到这期节目的开场十多分钟,因为它刚在几个小时前的北京时间周五晚上9点多播出,网络还未同步;于是我接着恶补知识,关于这个节目,关于杨钰莹主持,也关于这期林志颖专场。我才终于明白这几天微博盛传这二人不老神话是源自这档节目。不重要,这些都不重要,重要的是我这个初中同学。如果他不会看到这个文章且不会介意我的个人观点的话,我认为,初中的时候我们是很好的朋友。没有暧昧、没有绯闻、甚至都没有对彼此更多的关注;但他总坐在我的后面,我们能经常聊天。而且,我还无限期地享受着一个权利——免费听各种林志颖的歌,并且从此开始喜欢林志颖。初中的班主任老师每个星期都给全班同学轮换座位,就是依次向右、向后调整一个单位(题外话:在一个拥有八十多人的班级里实现民主公平的座位制度是多么有创意的事情!)。但因为我和他是前后桌,所以只有一个星期我听不到他唱林志颖,这很可能就是当时最难熬的一个星期。这段节目中,他并不显眼,而我却看得一把鼻涕一把泪,朦胧中全是土坯房、砖瓦房的甘肃省定西县东方红中学,全是那群一起疯过十三四岁的孩子。那年的我们,还未到花季雨季,那年的我们还未将男女之别分得那么清晰和诡异。那年的我们,都在一起。

于是,这样两个尴尬着实将我拴在那年、那地、那些人的时空中。若不吐完这个槽,今晚便是无法工作了。

@@ -18,4 +23,4 @@

现在的他们/她们,有人留在或者回去了定西和兰州,有人远在边疆,有人举家生活在大上海,有人漂在东海甚至某些大洋考察的船上。好吧,那个身在新疆的人也不够远,这里还有个跨了七个时区的。有人生儿育女,有人结婚恋爱,有人闺中待嫁,有人筹谋娶妻,还有人茫然不知方向。也好吧,都是自己的生活,都各有各的喜怒哀乐。

近来,《中国合伙人》的大潮同时也卷出很多青春和梦想的话题,《致青春》(电影全名是《致青春》么?)更是个名副其实的例子。合伙人我看了,但青春的片子没机会,只是四年前看过原作小说。其实,那里的故事,都不是我们自己的。或许其中夹杂和隐含的情感让我们容易把自己往主人公的时代和心理上去套,然而,他们和她们其实很难在每一个瞬间都感动我们自己。且不说个人的成长路程、个性特点都各不相同,单就那个年月,也不是我们的。中国合伙人的青春岁月赶上八十年代,那是中国青年和整个社会都在寻找道路、摸石头过河的时代,他们的梦想是出于无知的勇敢和对未来的好奇;他们的不顾一切首先来自于一个断裂的过去(六七十年代的文化断层和农村城市断层)。而我们在今天倡导的“中国梦”却只是稍经本地化的、抄袭过来的“美国梦”的空壳子,我们的前路已不再是开创契机,而是寻找突破——而我们还不知道那个方向在哪里。《致我们终将逝去的青春》(小说是这名字),似乎记录了从大学的青葱和懵懂成长为城市白领、历经感情与事业的独立的成长点滴。而我们自己的岁月不一定有那么矫情,我们的真实生活其实在谈情说爱之外,还有很多为父辈们换一个更“现代化”的晚年的心愿、还有为自己奋斗一个老婆孩子热炕头和几十平米小居(一亩三分地已经不能企及了)的“梦想”。甚至我们今天常说旅行、说背包就走,说得那么潇洒,可是真能走得轻松且充实吗?真值得这一来一回的意义吗?

最近的“青春”话题太多了,林志颖和杨钰莹的不老容颜再次强化了这个社会效应,而我却不小心被勾起了对“前青春”的怀念。不是想家,也不是要伤春悲秋,只为小小的纪念,为了忘却那些未到花季雨季的年月。把心掏空扔在纸上,才能继续去做关于六七百年之前的工作。这是此作文的自私的目的。另有一个不那么自私的,是希望能够与有心看到这里的人一起,一起去回忆你的、你们的、你们自己的那些年。每个人的故事,都会精彩得各不相同。最后谢谢我那位初中同学,那个腼腆的大男生(虽然他真的不一定会看到)。

-
触底反弹
\ No newline at end of file +
触底反弹
\ No newline at end of file diff --git "a/docs/2013/11/15/\351\273\221\346\232\227\344\270\255\350\277\216\346\216\245\345\244\225\351\230\263/index.html" "b/docs/2013/11/15/\351\273\221\346\232\227\344\270\255\350\277\216\346\216\245\345\244\225\351\230\263/index.html" index e07967475..6edb0d76f 100644 --- "a/docs/2013/11/15/\351\273\221\346\232\227\344\270\255\350\277\216\346\216\245\345\244\225\351\230\263/index.html" +++ "b/docs/2013/11/15/\351\273\221\346\232\227\344\270\255\350\277\216\346\216\245\345\244\225\351\230\263/index.html" @@ -1,16 +1,21 @@ -黑暗中迎接夕阳 | Beendless ~ 快节奏,慢生活,无止境 +黑暗中迎接夕阳 | Beendless ~ 快节奏,慢生活,无止境 -

黑暗中迎接夕阳

黑暗中迎接夕阳,这样的经历于我还是第一次。今天周末,国内长假中,比国和鲁村继续安静中。而我,拉着窗帘关了自己在屋里一整天,什么也没有做,直到下午四点。所以才有了如此难得的机会——打开窗帘后,洒进来的,是夕阳。莫名地感受到夕阳的温柔和美丽,不张扬、不喧嚣。它不明媚,所以并不是活泼或愉悦的;它也不沉默,所以并不是阴郁或痛苦的。淡淡的忧伤和浅浅的微笑,这才是我此刻看到的夕阳。

+

黑暗中迎接夕阳

黑暗中迎接夕阳,这样的经历于我还是第一次。今天周末,国内长假中,比国和鲁村继续安静中。而我,拉着窗帘关了自己在屋里一整天,什么也没有做,直到下午四点。所以才有了如此难得的机会——打开窗帘后,洒进来的,是夕阳。莫名地感受到夕阳的温柔和美丽,不张扬、不喧嚣。它不明媚,所以并不是活泼或愉悦的;它也不沉默,所以并不是阴郁或痛苦的。淡淡的忧伤和浅浅的微笑,这才是我此刻看到的夕阳。

想来,认认真真去看夕阳大概记得的只有两次。一次是好几年前在香港,去大埔骑车。但因海边天气多变,夕阳没看多少,倒是捡了海星,也淋了一场极欢快的大雨。再一次就是今年八月份,在海德堡那个有座城堡的山上。跟着朋友去散步的,却无意中碰到夕阳西下。记得当时我只趴在那不知多少年的砖石上面,看夕阳与周边的云霞在红色、赭色、黄色、紫色之间渐变。我告诉他们,似乎自己从未想过看夕阳,更未想过它会那么美。不知是这情境的渲染还是真的投了缘分,从那天起,我多了两个好朋友。

今天傍晚的一瞥,也是偶然。我的房间是下午背阳的,平日在这里只觉得有些冷意,从未想过会有阳光像此刻一般洒进来。很突然,就泼进来一下子。一下子,就过去了。每天我都可以看到对面的监狱,他们甚至可以享受到比我更多的阳光。(因为我的办公室也是背阳的。)倒也奇怪,今天他们也很安静,不像平时还出来打球活动。我有去参观过里面的陈设和他们的生活,也经常听得到他们唱歌、骂人、打球,甚至狂欢。我看得到他们夜晚的灯光,或许如同他们看得到我透着光的窗帘一样。然而,周末呢?或许有家属亲眷会去探望,所以也没了这些吵闹吧。于是,我今天的黑暗来得更轻松,都没有任何打扰。关了手机,拉上窗帘,世界就可以这样小。

这些日子的生活,简单也开心。新来的室友们可爱贴心,其中有一个很漂亮的德国小妹。刚开始她显得羞羞的,不太说话,才一个星期,她已经可以在晚上十二点直接冲上我的房间,敲门问我:“我刚回家,只是来看看你,是不是还活着!”她真的像一种港式的糖水,很甜美的样子。因为她知道我最近的挣扎,也知道我这个星期的工作,所以特来问候的。除了新室友,跟同事们也都很好。我们更多地了解彼此、帮助彼此,还成立了非官方的自助组织。就像戒酒小组那样,我们每个星期扑在一起说自己要死在研究中的心情,然后找到各种理由去餐馆胡吃海喝。最有趣的还不是我们居然堂而皇之地开始了这样的活动,而是,我老板允许且支持我们这样的活动!另外,这学期开始在哲学系上课,非常喜欢。“鲁大”文科类在传统上是以神学和哲学闻名的,得以去年混神学系和法典(canon law),今年混哲学系,是我捡了大便宜。或许是新鲜感,也或许是再一次的缘分,真是好喜欢哲学系的课。继续往前走才知道的吧。

我自己呢?有黑暗,也有夕阳。曾说过“没有再见”这句话,想来,多么心痛的一句话。每天每天,每次每次,原来“想念”和“再见”实在没什么必然的逻辑关系。惟愿黑暗中,仍有夕阳。它不张扬、不喧嚣,有淡淡的忧伤和浅浅的微笑。 桌上扔着一封保险公司寄给我的信,刚打开一看,是补交25块钱,理由是:亲爱的CYR小姐,从这个月开始您就26岁了,所以每年需要交……。好意外却又逃不掉的通知……

有朋友叫去吃饭,再不走,就得挨数落了。快闪~

-
寫作是一件需要堅持的事情
\ No newline at end of file +
寫作是一件需要堅持的事情
\ No newline at end of file diff --git a/docs/2013/12/20/Merry Christmas and Happy New Year/index.html b/docs/2013/12/20/Merry Christmas and Happy New Year/index.html index bf555698b..30af16334 100644 --- a/docs/2013/12/20/Merry Christmas and Happy New Year/index.html +++ b/docs/2013/12/20/Merry Christmas and Happy New Year/index.html @@ -1,13 +1,18 @@ -Merry Christmas and Happy New Year | Beendless ~ 快节奏,慢生活,无止境 +Merry Christmas and Happy New Year | Beendless ~ 快节奏,慢生活,无止境 -

Merry Christmas and Happy New Year

很快,又到了年末。聖誕加新年,學校學生放假,系裡秘書離職,老闆外出講學,同事去中國探親旅行,室友回家或遊玩。我,什麼都沒有計劃,似乎也好像是都被計劃好了一樣。就這樣留在家裡、留在學校、留在辦公室,留在我本來的生活當中。

+

Merry Christmas and Happy New Year

很快,又到了年末。聖誕加新年,學校學生放假,系裡秘書離職,老闆外出講學,同事去中國探親旅行,室友回家或遊玩。我,什麼都沒有計劃,似乎也好像是都被計劃好了一樣。就這樣留在家裡、留在學校、留在辦公室,留在我本來的生活當中。

並沒有什麼悲傷或者孤單;如果說有,也完全不是因為沒有回國、沒有旅行。真的,只是沒有那個應該在自己身邊的人在身邊而已。

於是,我想要收拾心情,收拾節日的氛圍,專注在自己本來的生活當中比較好。然而,我本來的生活,也無非就這樣了。

-
跨年2013–2014
\ No newline at end of file +
跨年2013–2014
\ No newline at end of file diff --git "a/docs/2013/12/20/\346\267\261\345\221\274\345\220\270/index.html" "b/docs/2013/12/20/\346\267\261\345\221\274\345\220\270/index.html" index 8b86c1b87..67016dd43 100644 --- "a/docs/2013/12/20/\346\267\261\345\221\274\345\220\270/index.html" +++ "b/docs/2013/12/20/\346\267\261\345\221\274\345\220\270/index.html" @@ -1,13 +1,18 @@ -深呼吸 | Beendless ~ 快节奏,慢生活,无止境 +深呼吸 | Beendless ~ 快节奏,慢生活,无止境 -

深呼吸

寒冷冬日,北风吹。——真正符合字面意义的北风,它来自北极,且强劲到使得斯堪的纳维亚的人们交通瘫痪,飞机无法迫降。还好,我也只是骑车的时候感受到大风吹得自己要侧倒。其他都还好。

+

深呼吸

寒冷冬日,北风吹。——真正符合字面意义的北风,它来自北极,且强劲到使得斯堪的纳维亚的人们交通瘫痪,飞机无法迫降。还好,我也只是骑车的时候感受到大风吹得自己要侧倒。其他都还好。

星期五的下午,灰暗和周末。——也是一个真的结束,神学系的国际会议结束了,我的第一篇习作的草稿也结束了。还好,发给那个约稿的教授,也算是意味着发给了编委会。所以,也都还好。

工作进入到一个再次收拾零碎材料和整装待发的阶段。似乎,每每都会要经历这样的阶段,俗话说的承上启下吧。然而,这也是本来就修炼得不够火候的我最掌握不好的阶段。会涣散,会凌乱,会无法集中,会不知所措。会低效甚至无效,会一副无所事事的死样子。于是,下午听完了别人的会议,也跑去邮局做点儿本来是邮差该做但没做好的事情。也顺道在店里买了些新年礼物准备着。逛街和购物于我而言已经成为一种负担,于是能在偶然的外出路上做完,算是好运了。

还不到下午五点,天已擦黑,广场上的圣诞集市也在叮叮当当搭起来了。我看见的只是广场边就抬头可见的残月,那月牙儿细得真让人看着,细! 但我没有回家,还是黑洞洞地在冷风里回到办公室,打上一杯冰凉的水,坐下来。放下准备给亲人朋友的礼物,也打开从邮局取来的给自己的礼物。或许是不久前才发现的,购物已经不能给我任何快乐,最多是花费时间和力气罢了。于是,我还是不知道要做什么。静静的,插上耳机。原来这是周五的晚上,一个似乎从名义上应该是去跟朋友家人去餐厅吃饭、酒吧笑开怀的时刻。无论多冷的风或多黑的夜,都可以在热烈的温度中度过。想到这些的时候我才明白,原来,自己这是孤单了。

@@ -15,4 +20,4 @@

深呼吸,也就是这一刻。

眼瞅着朋友发短信给我,说周日晚上去他家吃饭。也瞅着facebook上面有人嚷嚷找我,说来根特开会却没订到酒店,要给我打电话。同事大哥还说,周六晚上去布鲁塞尔或周日去布鲁日,欢迎我加入。听起来是不是又很忙碌?

就这一刻,只是一件深呼吸的事罢了。   2.13.12.6

-
Merry Christmas and Happy New Year
\ No newline at end of file +
Merry Christmas and Happy New Year
\ No newline at end of file diff --git "a/docs/2013/12/30/\350\267\250\345\271\2642013\342\200\2232014/index.html" "b/docs/2013/12/30/\350\267\250\345\271\2642013\342\200\2232014/index.html" index dcff47d13..7e1e3444c 100644 --- "a/docs/2013/12/30/\350\267\250\345\271\2642013\342\200\2232014/index.html" +++ "b/docs/2013/12/30/\350\267\250\345\271\2642013\342\200\2232014/index.html" @@ -1,13 +1,18 @@ -跨年2013–2014 | Beendless ~ 快节奏,慢生活,无止境 +跨年2013–2014 | Beendless ~ 快节奏,慢生活,无止境 -

跨年2013–2014

写“年终总结”似乎已经成了这个时代辞旧迎新的仪式,或者也可以称作习俗。对我而言,这也曾是个人习惯。不知道从什么时候我开始意识到这个习惯,也意识到很多人有这样的习惯。生日、大的纪念日、新年伊始。然而,就从上个星期到此刻,我心里有个犟到死的小人儿一直在咆哮:“今年不许写总结,不许发任何新年祝福给任何人,不许做任何与旧年新年相关的事情,甚至不要去想这样的话题!逃开逃开逃开,像逃开污染源或传染病一样!”如此病态心理其实是一种对自己的挑衅和批驳,对自己生活的不满和不愿承认,对明天的不敢面对。首先不知不觉得形成某种习惯、进入某种潮流,其实是形成了自己,形成了某个群体的一部分。然后再以挣扎和撕扯的方式,表达另一个自我的存在。任何的快乐、痛苦,或者说任何的情绪和感受,都是要消耗体力的。我再是情绪化,也有无力情绪化的时候。于是,让一场出师无名的、与自我的战争,以中场的方式暂停。

+

跨年2013–2014

写“年终总结”似乎已经成了这个时代辞旧迎新的仪式,或者也可以称作习俗。对我而言,这也曾是个人习惯。不知道从什么时候我开始意识到这个习惯,也意识到很多人有这样的习惯。生日、大的纪念日、新年伊始。然而,就从上个星期到此刻,我心里有个犟到死的小人儿一直在咆哮:“今年不许写总结,不许发任何新年祝福给任何人,不许做任何与旧年新年相关的事情,甚至不要去想这样的话题!逃开逃开逃开,像逃开污染源或传染病一样!”如此病态心理其实是一种对自己的挑衅和批驳,对自己生活的不满和不愿承认,对明天的不敢面对。首先不知不觉得形成某种习惯、进入某种潮流,其实是形成了自己,形成了某个群体的一部分。然后再以挣扎和撕扯的方式,表达另一个自我的存在。任何的快乐、痛苦,或者说任何的情绪和感受,都是要消耗体力的。我再是情绪化,也有无力情绪化的时候。于是,让一场出师无名的、与自我的战争,以中场的方式暂停。

之所以从上个星期就开始有挣扎,是因为从那时我已进入“假期免打扰模式”。大学有圣诞和新年连在一起的假期,算是一点儿都不寒冷的寒假吧——长达两个星期,却一点儿都没有冰冻的干脆。全校的学生放假;但教学、研究、行政都只有正常的三五个并不特别连续的公共假期,当然也可以请年假让它们连在一起;不同的图书馆还都有各自的放假安排和时间表。这样参参差差,却让我的办公室整个楼里都没什么人气儿了。而我自己呢,拖着个答应在2013年底发出的稿子还没修改,也耽着一两个考试在一月,心里还揣着好几个手忙脚乱的题目和那些能数完但没读完的书。以此来充斥这个半有半无的假期,当然是不够的;最重要的还是靠懒散和无敌宅,假期才能叫做假期。

在家里闷了三四天的时候,有些狂躁,满心悔恨为什么当时不够任性。(本计划一路北上看望个北极圈边儿的朋友,但那哥们有泡妞大业壮志未酬,我便决定以不骚扰的方式默默支持。XD)可是过了那个劲儿,日子却过得出乎意料的安然。自己做点家务也看书写字,下个厨房也改改论文。倒是很开心,很愿意享受这样的时光。于是,原本跟自己死磕的无厘头也被抚平,没有狂躁,”年终总结”也卷土重来了。当你最不花力气的时候,便是最舒适,但最无掌控的时候——一些所谓的自然的、习惯了的东西便占据你、指使你。或者说,你就这样被年终总结给写了。

废话连篇,难道才要进入2013年终总结的内容么?也并不完全是。惯常的、与自己的战斗和间歇性的安然平静,就是我全部的2013年。没什么变化,也都在变化着。一个人在象牙塔里,而且在一个坐落于村里的象牙塔的生活,就是这样的。也有孤单寂寞,但并不多时,也并不难耐;有那么一些个为研究方向和想法而血压升高的时候,非常零星;还有灰心丧气,深感浪费青春、智商线下,还觉得自己完全不是这块料的时候,反反复复那么几次;看着自己读过的书和写过的字,一边觉得真该拍手叫好,也一边觉得它们与垃圾无异。网上曾疯传的一篇米国某大学人文学科博士生的yardlife,励志型的,也在某个时刻让我欣喜激动过;而那终究是学霸们的生活,或者甚至是学霸们自己幻想出来的生活,与我太不真实。幸也悲也,我没法变成学霸。我也不是那样可以长期保持规律且急速的人。我更愿意在自己的战场上,有厮杀的痛快淋漓,也有与之相伴的安静祥和。有人说过我太极端。然而调和无用,我便也接受了。极端了才看得更清楚,也没什么不好。

@@ -15,4 +20,4 @@

看着旧的,其实也等于看到了新的,那2014年:每学期认真上1-2门课+考试,不混课,继续囫囵外语*门,读书?本、文章?篇,论文?篇,回国探亲1次(4月),旅行2次,短途放风?次,未完成的心愿和计划必然还有N个……

似乎还是话很多的样子。想到小时候最爱看电视剧,包大人那主题曲叫什么《新鸳鸯蝴蝶梦》的——抽刀断水水更流,借酒消愁愁更愁……由来只闻新人笑,有谁听到旧人哭。真不懂这歌要唱个什么,跟黑炭包大人有什么关系。倒是适合做年终总结。譬如流水就是时间,捏不住更留不住,也不会因为你的一厢情愿做任何的回头或停歇;反而,你越是迷恋,就约是淹死在时间的漩涡里。过去的往事和时光,就都让他过去,怀不怀念,他都在哪里,死了或者没死;而对未来的自己和生活,让我们都抱着最美好的希望,让我们一起去迎接2014的笑声吧。

大家跨年的时候就都撒开了的吼,吼到再也听不见泪水,只看的到笑声。祝大家新年快乐!

-
是谁曾撩拨过你的心弦
\ No newline at end of file +
是谁曾撩拨过你的心弦
\ No newline at end of file diff --git "a/docs/2014/01/11/\346\230\257\350\260\201\346\233\276\346\222\251\346\213\250\350\277\207\344\275\240\347\232\204\345\277\203\345\274\246/index.html" "b/docs/2014/01/11/\346\230\257\350\260\201\346\233\276\346\222\251\346\213\250\350\277\207\344\275\240\347\232\204\345\277\203\345\274\246/index.html" index 85f739eff..aecd74428 100644 --- "a/docs/2014/01/11/\346\230\257\350\260\201\346\233\276\346\222\251\346\213\250\350\277\207\344\275\240\347\232\204\345\277\203\345\274\246/index.html" +++ "b/docs/2014/01/11/\346\230\257\350\260\201\346\233\276\346\222\251\346\213\250\350\277\207\344\275\240\347\232\204\345\277\203\345\274\246/index.html" @@ -1,16 +1,21 @@ -是谁曾撩拨过你的心弦 | Beendless ~ 快节奏,慢生活,无止境 +是谁曾撩拨过你的心弦 | Beendless ~ 快节奏,慢生活,无止境 -

是谁曾撩拨过你的心弦

有没有那么一个瞬间,就不知所以地心动了,或是脸红了。有没有那么一条短信或消息,就让你无法自己地分心了。有没有那么些人,来到你的生命里,没有预约。然而终究,都还是转身走开了。在故事的最后,你也不知道那个人的离开有没有回头的画面;因为,你既没有后视镜,也没有勇气让自己回一回头。似乎所有的爱情、关系,如果没能成就锅碗瓢盆和细水长流,就都有那么一丝的凄婉,不管谁对谁错。开头的时候,辩解和争论更少些,情境也更有趣些。

+

是谁曾撩拨过你的心弦

有没有那么一个瞬间,就不知所以地心动了,或是脸红了。有没有那么一条短信或消息,就让你无法自己地分心了。有没有那么些人,来到你的生命里,没有预约。然而终究,都还是转身走开了。在故事的最后,你也不知道那个人的离开有没有回头的画面;因为,你既没有后视镜,也没有勇气让自己回一回头。似乎所有的爱情、关系,如果没能成就锅碗瓢盆和细水长流,就都有那么一丝的凄婉,不管谁对谁错。开头的时候,辩解和争论更少些,情境也更有趣些。

故事的开端总是可以五花八门,譬如同学同事同班同行或同一个聚会、同一个吧台,譬如朋友介绍,再譬如一次凶猛无计划的冲撞。这些,都叫做“遇见”,其实也便是心动那一刻。没有时空的交叠,没有当时那个场景,所有的故事就都无法展开。即使努力想要冲破传统模式的爱情故事,“向左走向右走”也无非是尝试了一个“只遇却不见”的脚本。可这种叙述方式的唯一成功之处,也正是因为它处处暗指遇见的可能性,又处处压抑着。使得那样的遇见不可获得。说到底,还不是为了要跟那个人遇见,要跟他/她心动。

你和那个你的他/她,也遇见过吧?后来,你们也尝试过、开心过,或者也吵闹过、分开过,甚至形同陌路过吧。如果回头来看,当时的遇见,好吗?约会可以安排、相亲可以筹谋,可是心动的一刻确实无论如何也计划不来,甚至都来不及准备。

那一刻,他/她杀得你措手不及,又无处可躲。好像要全身心地去应对来自四面八方的各种独门武器,明着也暗着;却招招败下阵来,遍体鳞伤。这伤倒不是那么痛,至少痛得可以忍,忍起来还有些麻酥酥、酸溜溜的,或者甜蜜蜜的感觉。好几个回合下来你已彻底招架不住,眼神涣散也糊里糊涂地犯晕。直到某天毒法,痛感钻心。你才能第一次意识到,喔,那不过是一种容易上瘾的毒药,也是定时炸弹罢了。

那一刻,他/她只要轻轻地动个手指头——食指吧,或者是最使不上劲儿的无名指,你那本来就不怎么多的几根心弦,便全体狂躁不安了。一会儿G大调,一会儿E小调的,有时候延长音,有时候都慌乱地弹不出一个最基本的三指和弦。从未练习过,你却能从谱曲到奏出都在那一刹那完成。无论在他人看来是多么聒噪和难以入耳,而你却欢欣雀跃得好像全世界都可以跟着你的节奏起舞。直到某天,弦断了。或是因为对方下手太狠,或者只是自己绷得太紧,就那么生生的,断了。你才会懂得,喔,心弦如琴弦,总还是要护理、要维修的。

经年过后,偶尔忆起,你还能记得是谁曾撩拨过你的心弦吗?那个时刻、那个场景,都还好吗?或许,是他还是她,也都不那么重要了。

-
一个人跑步
\ No newline at end of file +
一个人跑步
\ No newline at end of file diff --git "a/docs/2014/01/16/\344\270\200\344\270\252\344\272\272\350\267\221\346\255\245/index.html" "b/docs/2014/01/16/\344\270\200\344\270\252\344\272\272\350\267\221\346\255\245/index.html" index bce5edb02..0a64ecb5f 100644 --- "a/docs/2014/01/16/\344\270\200\344\270\252\344\272\272\350\267\221\346\255\245/index.html" +++ "b/docs/2014/01/16/\344\270\200\344\270\252\344\272\272\350\267\221\346\255\245/index.html" @@ -1,17 +1,22 @@ -一个人跑步 | Beendless ~ 快节奏,慢生活,无止境 +一个人跑步 | Beendless ~ 快节奏,慢生活,无止境 -

一个人跑步

冬日里的鲁汶在傍晚时分就已经黑黢黢的,砖红的小城一股脑儿得都罩在昏黄的路灯中。淅淅沥沥,还下点儿下雨。今年是个暖冬,可比台北舒服些。听说台北那股子冰冷,冬季还是到鲁汶来看雨吧。我总是小心翼翼地爱着鲁汶的雨。这里的雨很随性,随来随往。(似乎只有两小时内的天气预报才能说得稍微准一点。)它通常是安静的,一点儿都不闹腾。有时候大雨,它就可劲儿了下,像个自娱自乐的、还不会用学步车的孩子。没三五分钟,或许就过去了。天很低,满是像赶着聚会一样的云层,跑那么快。几乎是不会放晴了。过阵子它又开始下,或许就下了一整夜。

+

一个人跑步

冬日里的鲁汶在傍晚时分就已经黑黢黢的,砖红的小城一股脑儿得都罩在昏黄的路灯中。淅淅沥沥,还下点儿下雨。今年是个暖冬,可比台北舒服些。听说台北那股子冰冷,冬季还是到鲁汶来看雨吧。我总是小心翼翼地爱着鲁汶的雨。这里的雨很随性,随来随往。(似乎只有两小时内的天气预报才能说得稍微准一点。)它通常是安静的,一点儿都不闹腾。有时候大雨,它就可劲儿了下,像个自娱自乐的、还不会用学步车的孩子。没三五分钟,或许就过去了。天很低,满是像赶着聚会一样的云层,跑那么快。几乎是不会放晴了。过阵子它又开始下,或许就下了一整夜。

近来生活过得平常。很一个人,吃饭工作学习,走路借书撑伞,睡觉弹琴跑步,生活。每件事都做得专注,专注得做完了一件就不知道如何过渡到下一件。下午四点以后,楼道里的脚步声多是为了离开而响起的。几乎没有人上班到晚上七点或者八点以后,因为那个时间是用来与家人朋友或情人爱人吃晚饭的。与往常一样,我也该下班了。可越是用心工作,停下来的那一刻,就越能感到空气有多稀薄。就好像高速行驶的列车轰隆隆滑过轨道,哪怕按照既定的时间和程序让它慢下来,它也只会笨笨地愣在那轨道上,没有方向感,没有安全感。因为,不奔跑的它从来不知道自己该向何方。

这便是被称作“孤独”的东西吗?是一个人对着电脑、对着蜡烛、对着一个人的房间和墙壁吗?是影子还是黑暗在做伴?这样子,还好吗?

仔细想来,正是这样的孤独给了自己某种近乎不要脸的幸福感。人,就总是要与人在一起的。我并不是赞同所谓“群居动物”的观点;而是从人的灵性生活来说(不是——性生活),每个人都需要与外在于自我的任何东西产生联系。对,任何东西,其实也不一定非要是人。真的是任何东西,宠物或者一本书、一盏茶,哪怕是所暗恋的对象,或是最近在赶的文案、报表,或根本渴望不可及的“梦想”,再或者是一摊砸在手里的生意,甚至你的敌人。任何的一种联系都可以成为证明自我存在的论据,联系越多,自我存在感就越强。然而,当联系过多的时候,物理神经就累了,更别说那颗操碎了一地的心了(不是——节操碎了一地)。逃避、切断联系,便是最好的自我解放。刘瑜写过像一个星球一般的孤独,尼采也写过与影子的对谈,还有首老歌大概叫做“寂寞让我如此美丽”。他们都是借着孤独感才能营造自己的空间罢了;而“孤独”本身,并不是主题。所以,一个人的世界里,满是幸福。因为你可以进退自如。

为什么这样的幸福感又很不要脸呢?因为你可以进退自如。衣食足、仓廪实,什么样的情绪不是无病呻吟呢?还能思考是否孤独的问题,这表示脑细胞未死完、体力没透支、身体无疼痛。至少在拎起孤独这个东西的时间里,没有要去忧虑的生计,也没有值得悲伤或痛哭的变故,甚至都没旁的悲惨世界来分这颗孤独的心。这样孤独着,是没有去挤一号线,也还不是吃不起庆丰包子(虽然眼下吃不到),呼吸还算顺畅,并没有堵在半路并夹在满满一公交车的羽绒服中间。有孤独的资本,就已经很不要脸了,不是吗?无论身在何方,大家都只是要活着,要活着。若是还能腆着一脸的孤独,待到明年春花开,便已是莫大的福气了。

于是,我去跑步。 黑夜、细雨、森林,一个人跑步。

生活就复杂不起来了。

-
情人节的故事
\ No newline at end of file +
情人节的故事
\ No newline at end of file diff --git "a/docs/2014/02/05/\346\203\205\344\272\272\350\212\202\347\232\204\346\225\205\344\272\213/index.html" "b/docs/2014/02/05/\346\203\205\344\272\272\350\212\202\347\232\204\346\225\205\344\272\213/index.html" index 10f4b1b50..d231d5ed9 100644 --- "a/docs/2014/02/05/\346\203\205\344\272\272\350\212\202\347\232\204\346\225\205\344\272\213/index.html" +++ "b/docs/2014/02/05/\346\203\205\344\272\272\350\212\202\347\232\204\346\225\205\344\272\213/index.html" @@ -1,13 +1,18 @@ -情人节的故事 | Beendless ~ 快节奏,慢生活,无止境 +情人节的故事 | Beendless ~ 快节奏,慢生活,无止境 -

情人节的故事

早晨天空湛蓝,极目处才望得见丝柔般的白云,遥远,也清清淡淡。晚上睡前就准备好了雨伞,本是要照着天气预报迎接整整一星期的雨天;谁知醒来后却见到这样的明亮。于是,专门绕个稍远的路去甜甜的面包店,去准备一块蝴蝶酥和一杯卡布奇诺的早餐,走在清晨的阳光中。

+

情人节的故事

早晨天空湛蓝,极目处才望得见丝柔般的白云,遥远,也清清淡淡。晚上睡前就准备好了雨伞,本是要照着天气预报迎接整整一星期的雨天;谁知醒来后却见到这样的明亮。于是,专门绕个稍远的路去甜甜的面包店,去准备一块蝴蝶酥和一杯卡布奇诺的早餐,走在清晨的阳光中。

还未到面包店就看到学校一家书店的橱窗换上了大大的心形和玫瑰的广告。红彤彤的,只让我想起远在中国的农历新年。这是为情人节做准备吧?同样是美好的。从面包店拎着给自己的食粮,心满意足,继续轻快地走去办公室。阳光暖,照着前行的路,刚好让迎面吹来的冷风不会显得那么冰凉。再哼两句小曲儿,还一边心想着怎么用各种七七八八的欧洲语言和中国方言说“早上好”,越发觉得有趣和惬意。眼瞅着路口的交通灯变成红色,也不会不耐烦,等得很安静。 就在我身旁,在十字路口的转角,在一家还没来得及开业的soup bar(就卖汤和三明治)门口,三个年轻人的对话随风飘进我的耳朵。  

女孩:我不知道……我,我……
男孩A:为什么?告诉我,这是怎么一回事?!
男孩B:(⊙o⊙)…(默默)
男孩A:我不懂,为什么?是怎么发生的?
女孩:(⊙o⊙)… (也默默)  

绿灯——我继续前行。清晨的阳光被走到身后,面前便是一条长长的影子。长到好像宫崎骏的《千与千寻》里面那一群鬼魅。此时又有一个影子出现在我身后,再到我身旁,再到我面前。在他掠过我的那一刻,我听得到一些窸窸窣窣的声音。他红着眼睛,不时地也顺手抹一把,一步步继续往前走,走得很快。他是哭了还是昨晚没睡好呢?按着我们的影子向前顺延的方向,你看得到他的背影。一双不起眼的球鞋,却好像容器,可以装着还不到一米八的他走到天涯海角。牛仔裤约摸是深蓝色的,也并不时尚,有些皱皱巴巴,松松垮垮地套在一起一伏的屁股上。看得到,他的线条和轮廓都不是那么的吸引眼球。一身卫衣也是蓝色系。此时那卫衣并不显得绵软舒适,因为顺着袖口你就看得到他又抹了眼睛。但男孩的头发很黑,短短的带着微微的自来卷儿,非常精神。也是在他掠过我的那一刻,我看得到一些侧脸,并不十分清楚。只记得他应该是个满脸胡,刮过胡须有两天的样子;他鼻梁挺拔却不是北欧人那么高;眼眉也似乎浓浓的。男孩或许是个意大利人,或者至少来自欧洲南部。

@@ -16,4 +21,4 @@

情人节的故事可以有各种版本,或许也可以像人类学家Arnold van Geneep研究仪式过程那样,把它们分为三个阶段:爱前、爱中和爱后。我们对爱有期待,有选择和纠结,也肯定会有疼痛。无论是跟谁、哪一种爱、在哪个阶段,爱得猛烈就必然有伤害,爱得温柔也逃不过那伤害。出现在自己生命里的人,总是有来有往;就如同自己也以不同方式出现在别人不同阶段的生命里一样。就让故事的最高潮亢奋和最撕心裂肺都融化在清晨的阳光里吧。暖暖的,哪怕就那么一会儿,也足够美好。

跟看到这里的人们说:不管此时的身边有没有那个他/她/它,祝你,情人节快乐!

跟我自己说:前几天弄伤的骨头还在疼,一堆书和论文还搁着,就不要操心这些个爱与不爱的事情了!

-
去屎 vs. 去死
\ No newline at end of file +
去屎 vs. 去死
\ No newline at end of file diff --git "a/docs/2014/03/23/\345\216\273\345\261\216 vs. \345\216\273\346\255\273/index.html" "b/docs/2014/03/23/\345\216\273\345\261\216 vs. \345\216\273\346\255\273/index.html" index afe7cffaa..efa0d0a83 100644 --- "a/docs/2014/03/23/\345\216\273\345\261\216 vs. \345\216\273\346\255\273/index.html" +++ "b/docs/2014/03/23/\345\216\273\345\261\216 vs. \345\216\273\346\255\273/index.html" @@ -1,15 +1,20 @@ -去屎 vs. 去死 | Beendless ~ 快节奏,慢生活,无止境 +去屎 vs. 去死 | Beendless ~ 快节奏,慢生活,无止境 -

去屎 vs. 去死

昨晚临睡前看完一本很短的小说,比利时作家 Dimitri Verhulst 十多年前的作品,已被译为英文和中文的畅销书(De helaasheid der dingen; The misfortunates; 《废柴家族》)。这是一本被称作“半自传式”的小说,以一个十多岁少年的视角冷眼旁观自己的家庭——主要是爸爸和叔叔们,一群只能跟老母亲挤在老房子里蹭救济金的醉汉们。他们生活在连小小的比利时地图都可将其遗忘的小镇上(译者称作宝旮旯),每日烂醉、满口粗暴。略有腐臭的黄油和拉屎的味道不相上下,男孩比谁的膀胱能尿得更高更远,而女孩同样能依靠这种方式涓涓地引来一群小鱼。小说里浸透了琥珀色的啤酒,随处可见阴毛,呕吐物更是堆在满纸。可是这个家庭的温暖在兄弟们、叔侄们、父子间默默地储存着。这样的温暖是可以给敌人一记左勾拳的能量。说“敌人”这个词或许太过了,只是一种愤怒,一种可被称为无产阶级的一家人在面对小资产阶级的谩骂和指责时,爆发出来的本能吧。同样,高唱着生理反应的酒歌,这个家庭的热血也浇灭了民俗学家的学术和研究,眼见着后者显得如何虚伪和苍白。兄弟们、小清新的公主表妹、临终前的痴呆奶奶都能唱《采木耳之歌》——“奇迹时代不停息,眼见天干又物燥,我的木耳湿又润。鸡叫过一遍,鸡叫过两遍,我感觉爽翻天。”(引自译文)而偏偏翘首企盼这段歌词的民俗学家们就愣是没机会听得到。

+

去屎 vs. 去死

昨晚临睡前看完一本很短的小说,比利时作家 Dimitri Verhulst 十多年前的作品,已被译为英文和中文的畅销书(De helaasheid der dingen; The misfortunates; 《废柴家族》)。这是一本被称作“半自传式”的小说,以一个十多岁少年的视角冷眼旁观自己的家庭——主要是爸爸和叔叔们,一群只能跟老母亲挤在老房子里蹭救济金的醉汉们。他们生活在连小小的比利时地图都可将其遗忘的小镇上(译者称作宝旮旯),每日烂醉、满口粗暴。略有腐臭的黄油和拉屎的味道不相上下,男孩比谁的膀胱能尿得更高更远,而女孩同样能依靠这种方式涓涓地引来一群小鱼。小说里浸透了琥珀色的啤酒,随处可见阴毛,呕吐物更是堆在满纸。可是这个家庭的温暖在兄弟们、叔侄们、父子间默默地储存着。这样的温暖是可以给敌人一记左勾拳的能量。说“敌人”这个词或许太过了,只是一种愤怒,一种可被称为无产阶级的一家人在面对小资产阶级的谩骂和指责时,爆发出来的本能吧。同样,高唱着生理反应的酒歌,这个家庭的热血也浇灭了民俗学家的学术和研究,眼见着后者显得如何虚伪和苍白。兄弟们、小清新的公主表妹、临终前的痴呆奶奶都能唱《采木耳之歌》——“奇迹时代不停息,眼见天干又物燥,我的木耳湿又润。鸡叫过一遍,鸡叫过两遍,我感觉爽翻天。”(引自译文)而偏偏翘首企盼这段歌词的民俗学家们就愣是没机会听得到。

如果我的阅读还是靠近作者的话,小说所到之处描写得最干净和精致的东西是,奶奶,还有墓碑。一手提着水桶、一手拿着抹布的奶奶,还有另一个老妇人会每天擦得锃亮的、已故亡夫的墓碑。小说的最后,作者本人的、来自于一夜情的儿子也在长大,在一个不是这样的家庭中长大;而小说写完的时候,奶奶也去世了。死亡,是最干净、最平等、最安然的东西,无论在世界的任何一个角落。同时,死亡的冰冷,并不打扰活着的兴趣,不管是活得烂醉如泥、还是活得西装革履。

翻看“满纸荒唐言”的时候,我在使劲回味自己喝过的啤酒或其他烈酒的醇味、老木头和吧台上弥漫的朽味,还有宿醉和翻江倒海之后的呕吐和恶心味。那是荒诞还是真实?文学作品中的中式“荒诞派”在莫言获诺贝尔文学奖的时候已经是众所周知了,门罗笔下的奇幻色彩也被称道。但这被称作荒诞奇幻的,并非来自科幻小说般的想象,而是来自最真实的生活的每一个毛孔。当你细心聆听一扎啤酒灌下喉咙、一路倾泻直达食道、胃粘膜、肠道、膀胱和尿管,再径直喷涌到茅坑里的声音;当你仔细看着只有一个晃动的糙木板的洗手间,那木板只是挖了一个洞就搭在粪池上一米距离的地方,而蛆在跟你不到二十厘米处就那么一毫米一毫米地蠕动,再一个跟头滚进粪池;……(着急出门见朋友,这里先不写了)。超现实的荒诞与纯写实的记事之间,或许只隔着一个内裤的厚度。

话说回来,我更感兴趣的是作者如何在家庭的成长道路上,身在其中,又能全身而退。他目光冷峻,如旁观者在讲述别人的故事,极尽尖刻、毫无保留;但若不是用心深爱着故事里的人物、爱着这个家庭,甚至爱着这种生活和回忆、态度,他也不会讲出肮脏中的温暖和智慧。“半自传式”的小说完全等于割裂自己。一刀刀凌迟在自己身上,刮下肉、渗出血,作家本人没有手下留情,才能让观者观得触目惊心。突然想到捷克斯洛伐克的一位行为艺术家(忘了名字了,改日补上)。  

PS: 我可真是个特别没意思又特别较真的人,简称为无聊的人。一个人蹲坐在屋子里焦躁不安的时候,满心只想着聊天。然而享有一切的通讯设施和网络资源,却不知要如何与他人聊天、聊什么天、甚至为什么聊天。于是只好继续面向自己,问问自己怎么是一个如此无聊的人。可怎么问着问着,就写了上面这些东西。算了,精神病人欢乐多。同乐同乐。

-
为了流浪的远方
\ No newline at end of file +
为了流浪的远方
\ No newline at end of file diff --git "a/docs/2014/05/20/\344\270\272\344\272\206\346\265\201\346\265\252\347\232\204\350\277\234\346\226\271/index.html" "b/docs/2014/05/20/\344\270\272\344\272\206\346\265\201\346\265\252\347\232\204\350\277\234\346\226\271/index.html" index c01a4daca..4cabc32a6 100644 --- "a/docs/2014/05/20/\344\270\272\344\272\206\346\265\201\346\265\252\347\232\204\350\277\234\346\226\271/index.html" +++ "b/docs/2014/05/20/\344\270\272\344\272\206\346\265\201\346\265\252\347\232\204\350\277\234\346\226\271/index.html" @@ -1,13 +1,18 @@ -为了流浪的远方 | Beendless ~ 快节奏,慢生活,无止境 +为了流浪的远方 | Beendless ~ 快节奏,慢生活,无止境 -

为了流浪的远方

那颗不肯被安放的灵魂,你就跳跃吧,你去飞翔吧。

+ \ No newline at end of file +
写遗嘱之前
\ No newline at end of file diff --git "a/docs/2014/06/07/\345\206\231\351\201\227\345\230\261\344\271\213\345\211\215/index.html" "b/docs/2014/06/07/\345\206\231\351\201\227\345\230\261\344\271\213\345\211\215/index.html" index c1208c248..c9a0c64b9 100644 --- "a/docs/2014/06/07/\345\206\231\351\201\227\345\230\261\344\271\213\345\211\215/index.html" +++ "b/docs/2014/06/07/\345\206\231\351\201\227\345\230\261\344\271\213\345\211\215/index.html" @@ -1,13 +1,18 @@ -写遗嘱之前 | Beendless ~ 快节奏,慢生活,无止境 +写遗嘱之前 | Beendless ~ 快节奏,慢生活,无止境 -

写遗嘱之前

我满脑子只有一个念头:

+

写遗嘱之前

我满脑子只有一个念头:

薄薄的刀片,在我的房间里随处可见;

用它划开左手的手腕,正面、平放,最清晰的动脉;

轻轻地划开一厘米就够了。

@@ -19,4 +24,4 @@

我知道答案,我必然会有一天不再如此懦弱,至少必然会有一次不是如此懦弱。

现在唯一的未知是,某天当我勇敢起来的时候,是勇敢地面对死,还是勇敢地面对生。

写份遗嘱,或许是必要的。

-
写作,再一个重头开始
\ No newline at end of file +
写作,再一个重头开始
\ No newline at end of file diff --git "a/docs/2014/09/22/\345\206\231\344\275\234\357\274\214\345\206\215\344\270\200\344\270\252\351\207\215\345\244\264\345\274\200\345\247\213/index.html" "b/docs/2014/09/22/\345\206\231\344\275\234\357\274\214\345\206\215\344\270\200\344\270\252\351\207\215\345\244\264\345\274\200\345\247\213/index.html" index 307dfa5ab..fcd63b2b1 100644 --- "a/docs/2014/09/22/\345\206\231\344\275\234\357\274\214\345\206\215\344\270\200\344\270\252\351\207\215\345\244\264\345\274\200\345\247\213/index.html" +++ "b/docs/2014/09/22/\345\206\231\344\275\234\357\274\214\345\206\215\344\270\200\344\270\252\351\207\215\345\244\264\345\274\200\345\247\213/index.html" @@ -1,13 +1,18 @@ -写作,再一个重头开始 | Beendless ~ 快节奏,慢生活,无止境 +写作,再一个重头开始 | Beendless ~ 快节奏,慢生活,无止境 -

写作,再一个重头开始

或许是欺骗了自己很多年,或许是辜负了自己很多年――我一直以为自己深爱写作,却从未成为一个成功的作者,甚至已经好几年不去尝试。

+

写作,再一个重头开始

或许是欺骗了自己很多年,或许是辜负了自己很多年――我一直以为自己深爱写作,却从未成为一个成功的作者,甚至已经好几年不去尝试。

开始喜欢写作大概是从初中一年级,那才是可以基本摆脱字典来读汉字的年纪。也是青春期叛逆的年纪吧,我总是扎在人群里,陷在一个每天都吵成一锅粥的家里,就用写作的方式为自己搭起了真空窝,跟自己谈心。那也是新概念作文奖和一群新秀在作协崭露头脚的黄金年代。读着那些与自己的世界相差不算太大的文字,便自以为是地与写作亲近了很多,开始梦想着也成为一个作者。

一个不为人知的梦想被我怀揣了大概六七年,高考后从西北的小城到了西北的大城,黄河水的荤腥气又把我们赶到另一个山窝窝里。慢慢的也就不写了。对大千世界的想像力都变成一眼可以望得到头的大学生活。在你不到二十岁的年纪里却困在一个村里过起了六十岁的退休生活,在你还不懂得互联网和华尔街的花里胡哨之前就落进了历史系那个讲求寂寞踏实和岁月沧桑的深井。这样的际遇也不是每个人都有。此时并不是抱怨这有什么不好。事实上,不同的际遇和经历便造就了不同的青春,后来就是不同的人生路。我几乎算是以草包形象进入历史系的,历史这一科本来就是我所有文科专业最差的一项,更别提教科书以外的任何知识背景了。或许正是因为这样,它突然为我打开了另一个全新的世界,一个远离今天、远离人群的世界。于是,就在这条通往永恒无知的时间隧道里,我开始往回走,往过去而不是未来的方向走,走到现在只是第十个年头。好像一路在摸黑了,越读书越看到自己的浅薄,越觉得自己连个好读者都算不上,于是也越来越不记得曾经还有个想当作者的梦想。

第十个年头,这在中国古代的私塾可能还没读完四书五经。但在时间概念和世界观已经全体相对化的今天,这已经是一个“学生”要变为“学者”的年头。学者,顾名思义就是学习的人、甚至终身学习、以学习为业的人,但已经不能强调那个“生”字了。于是,也担负起一些责任,不能光自己学了,还要帮助别人学。这才是“学”成为一种职业的意义。好吧,眼下看来,它是我的职业。自己当海绵的时候还是挺简单的,吸得饱就是自己的幸福;可现在是要挤的时候,那怎么样才能挤得出,又让别人吸得进呢?写作,这个问题在十年后重新回到我的写字台。这些年,写字台都当成阅读台来用了。

@@ -16,4 +21,4 @@

写到此处,临时接到翻译的活,一口气干了两天。这里也接不上茬了。也罢也罢。

翻旧账于事无补。今天的改变也没太大的雄心壮志,也可能谈不上有什么意义。但是,就这样开始写起来了呢。

-
飞鸟
\ No newline at end of file +
飞鸟
\ No newline at end of file diff --git "a/docs/2014/10/15/\351\243\236\351\270\237/index.html" "b/docs/2014/10/15/\351\243\236\351\270\237/index.html" index d0e195aba..6ab201b4c 100644 --- "a/docs/2014/10/15/\351\243\236\351\270\237/index.html" +++ "b/docs/2014/10/15/\351\243\236\351\270\237/index.html" @@ -1,15 +1,20 @@ -飞鸟 | Beendless ~ 快节奏,慢生活,无止境 +飞鸟 | Beendless ~ 快节奏,慢生活,无止境 -

飞鸟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
海水呀,你说的是什么? 
What language is thine, o sea?

是永恒的疑问。
The language of eternal question.

天空呀,你回答的话是什么?
What language is thy answer, o sky?

是永恒的沉默。
The language of eternal silence.  

我今晨坐在窗前,世界如一個路人似的,停留了一會,向我點點頭又走過去了。
I sit at my window this morning where the world like a passer-by stops for a moment, nods to me and goes.  

你看不見你自己,你所看見的只是你的影子。
What you are you do not see, what you see is your shadow.  

我不能選擇那最好的。 是那最好的選擇我。
I cannot choose the best, The best chooses me.  

神呀,我的那些願望真是愚傻呀,它們雜在你的歌聲中叫囂著呢。 讓我只是靜聽著吧。
My wishes are fools, they shout across thy song, my master. Let me but listen.  

人是一個初生的孩子,他的力量,就是生長的力量。

Man is a born child, his power is the power of growth.  

神希望我們酬答他,在於他送給我們的花朵,而不在於太陽和土地。

God expects answers for the flowers he sends us, not for the sun and the earth.
+

飞鸟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
海水呀,你说的是什么? 
What language is thine, o sea?

是永恒的疑问。
The language of eternal question.

天空呀,你回答的话是什么?
What language is thy answer, o sky?

是永恒的沉默。
The language of eternal silence.  

我今晨坐在窗前,世界如一個路人似的,停留了一會,向我點點頭又走過去了。
I sit at my window this morning where the world like a passer-by stops for a moment, nods to me and goes.  

你看不見你自己,你所看見的只是你的影子。
What you are you do not see, what you see is your shadow.  

我不能選擇那最好的。 是那最好的選擇我。
I cannot choose the best, The best chooses me.  

神呀,我的那些願望真是愚傻呀,它們雜在你的歌聲中叫囂著呢。 讓我只是靜聽著吧。
My wishes are fools, they shout across thy song, my master. Let me but listen.  

人是一個初生的孩子,他的力量,就是生長的力量。

Man is a born child, his power is the power of growth.  

神希望我們酬答他,在於他送給我們的花朵,而不在於太陽和土地。

God expects answers for the flowers he sends us, not for the sun and the earth.

──节选自泰戈爾的《飞鸟集》

这并不是一个多么愉快的清晨。不,已经日上三竿了,但还是不那么愉快的。幸运的是,这样的不愉快让我想到叔本华和飞鸟。并不相关的东西么?不, 哲学家和诗人是看似相距甚远的两个星球,但却是两个一模一样的星球。

依然是不愉快,就好像牙疼还不见起色一样。但这并不影响窗外的阳光,不影响婆娑的落叶,不影响树林子红红黄黄的,秋天的轻轻的脚步。哲学家可能还在吧台边或者已经在课堂上,诗人也该起床了。

-
2014年10月19日
\ No newline at end of file +
2014年10月19日
\ No newline at end of file diff --git "a/docs/2014/10/19/2014\345\271\26410\346\234\21019\346\227\245/index.html" "b/docs/2014/10/19/2014\345\271\26410\346\234\21019\346\227\245/index.html" index 5f10b8168..03613f4a7 100644 --- "a/docs/2014/10/19/2014\345\271\26410\346\234\21019\346\227\245/index.html" +++ "b/docs/2014/10/19/2014\345\271\26410\346\234\21019\346\227\245/index.html" @@ -1,11 +1,16 @@ -2014年10月19日 | Beendless ~ 快节奏,慢生活,无止境 +2014年10月19日 | Beendless ~ 快节奏,慢生活,无止境 -

2014年10月19日

安穩無憂的日子裡,沒有疼痛,就不會去想愛恨情仇。 痛,才是真實和最寶貴的。 這樣的安穩無憂,是生活的終點,是不快樂的根源。然而,快樂,到底是什麼?幸福,到底是什麼呢? 苦難,是恩賜,是機遇,是命運的另一種可能。

-
走进人生的第一个十年
\ No newline at end of file +

2014年10月19日

安穩無憂的日子裡,沒有疼痛,就不會去想愛恨情仇。 痛,才是真實和最寶貴的。 這樣的安穩無憂,是生活的終點,是不快樂的根源。然而,快樂,到底是什麼?幸福,到底是什麼呢? 苦難,是恩賜,是機遇,是命運的另一種可能。

+
走进人生的第一个十年
\ No newline at end of file diff --git "a/docs/2015/01/05/\350\265\260\350\277\233\344\272\272\347\224\237\347\232\204\347\254\254\344\270\200\344\270\252\345\215\201\345\271\264/index.html" "b/docs/2015/01/05/\350\265\260\350\277\233\344\272\272\347\224\237\347\232\204\347\254\254\344\270\200\344\270\252\345\215\201\345\271\264/index.html" index 21fcce720..04a5559ca 100644 --- "a/docs/2015/01/05/\350\265\260\350\277\233\344\272\272\347\224\237\347\232\204\347\254\254\344\270\200\344\270\252\345\215\201\345\271\264/index.html" +++ "b/docs/2015/01/05/\350\265\260\350\277\233\344\272\272\347\224\237\347\232\204\347\254\254\344\270\200\344\270\252\345\215\201\345\271\264/index.html" @@ -1,13 +1,18 @@ -走进人生的第一个十年 | Beendless ~ 快节奏,慢生活,无止境 +走进人生的第一个十年 | Beendless ~ 快节奏,慢生活,无止境 -

走进人生的第一个十年

2015,我可以把它称作自己的第一个十年。当然,我不是十岁,这不是我的自然生命的第一个十年,而是我打算标记、也可以标记一下的第一个十年。同样,我也不是二十岁或三十岁,这样用十进制来做标记。甚至,这也不是我人生中有多么重要的一个标记——比如像娱乐圈人士走上星光大道的第几个十年,像穿过婚姻殿堂后的第几个十年,甚至开始工作后的第几个十年。真的都不是。如果一定要安置一个名头,那它是我离开家独自生活的第一个十年,也是我进入大学以后的第一个十年——并且我至今还未被放出来。

+

走进人生的第一个十年

2015,我可以把它称作自己的第一个十年。当然,我不是十岁,这不是我的自然生命的第一个十年,而是我打算标记、也可以标记一下的第一个十年。同样,我也不是二十岁或三十岁,这样用十进制来做标记。甚至,这也不是我人生中有多么重要的一个标记——比如像娱乐圈人士走上星光大道的第几个十年,像穿过婚姻殿堂后的第几个十年,甚至开始工作后的第几个十年。真的都不是。如果一定要安置一个名头,那它是我离开家独自生活的第一个十年,也是我进入大学以后的第一个十年——并且我至今还未被放出来。

大概一个多月前,跟导师 * 还有他的师弟、也是我的学界前辈兼办公室“室友” * 一起谈什么。他们问起为什么我的邮箱账号里面有一个“05”。其实,尤其是十多年前,因为我们用罗马字母拼写自己的名字,经常会撞车,所以常加数字加以区分。我便告诉他们,这个邮箱用户名是我上大学一年级的时候开始用的,也就是2005年9月,从此就没有改过。* 马上取笑我说,“那明年(即2015)就是你进大学后的第十年!你要庆祝一下吗?”被学界大咖的教授们这样逗逗也没什么,只是提醒我,人生中的第一个十年。这十年也是互联网飞速普及的黄金时段,数字化太快,想到十年前,或许都觉得已经很久远。读中学的时候我也很早就申请过搜狐、雅虎还有乱七八糟的好几个邮箱账号。但从没用处,都各自忘记用户名和密码了。或许里面藏了好多青春期的爱好,谁知道呢。直到上大学后,电子邮箱才有所谓认真的用途,也是最无聊的用途。收发作业、资料等,成为学校内外、人群之间的最快捷的交通工具。这十年,掌上移动互联网已经完全控制了数据传输,电子邮件成为最常用也十分不起眼的基本生活工具,甚至多少面临着被部分替代的命运。

当然,我不想、也没能力回顾十年来的互联网发展历程,而且2005到2015也并不对互联网,或者其他的任何人、任何事有任何标志性的意义。这样提起,只是为自己创设一个回顾过去的时空隧道,虚构一个十年弹指一挥间的幻象。在这似清晰似朦胧的画面里,我第一次可以有机会标榜一个人生的十年。二十岁出头的时候,根本不会这样来考虑自己的生命。哪怕是为赋新词强说愁,也断然呼不出“十年”的名号。像我等平凡人,到三四十岁的时候或许可以看到自己走过的某个十年,会有点故事,也有所体悟。现在的我,二十七岁,普普通通仍在大学读书,实在没什么可指摘品评的,根本拿不出什么十年与人述说。然而,唯有文字能够承载心灵的记忆。那些一闪而过的念头,若非执念,就只能如同火花转瞬即逝。别说将来的某一天,甚至下一分钟下一秒,你都不会记得自己刚才在想些什么。对于我这样一个几乎24小时都活在自己的脑袋里的人,如此的失忆,与白活真是没什么两样。所以,我想就这样用流水的汉字做一个标记,记住:

1
2015年的1月4日,在鲁汶家中,我突然想到这是自己人生的可以回首的十年,是我离开家独自生活的十年,是我窝藏在大学校园里的十年。十年之前我还没学会用倒车镜观望自己一路走过的脚印,那样做也的确没什么意义。下一个十年,我或许已不是独自生活,也或许已不在教学楼里。人生中可标记的十年,一双手的数得过来,更何况是这样一段不可复制的青春、这样一种几乎能够决定此生的成长。 
@@ -16,4 +21,4 @@

可无论内心多少的挣扎和没出息,事实上能看到的,便是我一直不断地往前走,甚至似乎一路顺利。本科和研究生相继毕业、博士在读,寥寥几个字就可以说完我这个十年。若说它像一眼望得见的平川,它的确清晰明了又水波不兴,甚至单调乏味;但若说它真如白开水,这其中五味杂陈和步履蹒跚,都满满地印在心头。我仍一介学生,虽已成为高龄学生或被称作第三类人,这都并不稀罕。我也几乎与曾经一样接人待物。在处人处事的策略方面,我不会刻意假托十年前的自己如何清纯小白和不谙世事;十年后的今天,我也没能脱胎成一个多么精明能干或对人群驾轻就熟的御姐。我们普通人没有生活在皇宫内院、权力漩涡中,我们的成长不会像甄嬛或武则天那样黑白分明(不过话说电视剧里的反差的确有些太过刻意而显得虚伪了),更何况我一个常年幽居在大学校园里,整日又蜗又宅的女学生。但图书馆和象牙塔让我在另一个世界里环游。我阅得多、历得少。虽无亲身经历职场暗涌和社会险恶,但有机会一窥那阅不尽的沧桑。这安安静静的书屋里装得下上古的史诗和开天地辟洪荒的传说,远至希腊罗马的金戈铁马和春秋战国的唇枪舌剑,幽深的中世纪修道院和墓地魂灵,绽放在巴洛克和文艺复兴时期的辉煌绚烂,汉唐的盛世欢呼与中原逐鹿的厮杀,宋明学人的思想和满清时期的中国与欧洲,法国大革命后的世界,……。如我之笨拙和懒惰,依然在小小的书屋里迷路,精疲力尽。纵使勤力且聪颖的,可能也要好几个十年来摸索这里的道路。于是,我在这里先是找路,再是找可以照路的烛火,然后继续找路。所以,从被调剂到历史基地班到现在的这十年,也是我开始学习历史学并摸过其他哲学文学与文艺批评的书籍的第十年。这十年我听到、看到好多个可能的世界,可以在书中向好多智慧的头脑学习。这十年,也是对我内心的洗礼。真的不得不扯到世界观、价值观、人生观这样最俗最基本最不愿被挂在嘴边的问题了,这十年,的确重新反思了17岁之前的心灵,用批判的态度重新洗脑。这一路也是波澜壮阔的。(具体实在的证据只存在于我自己对一些问题的见识和思考,存在于我所写下来的文字。毕竟初学,写字太少,思而不学则殆了。)思想上的痛苦于我而言定不如它们对一些思想家和天才们的冲击力,但也足以给我一双重新看待黑暗的眼睛。于是,就这样越走越远,与其他岔路口的交集越来越少。到眼下,我的脚步既不是越轻松也不是越沉重,没有陷入泥淖却也无法疾步。只是,只是我劝自己少张望,多走路。

忆往昔仍是要看今朝。这篇日志更应该写成2015的新年计划吧。这是我走完人生这第一个十年的最后的机会。能否“华丽转身”,实则取决于2015了。壮志雄心不可缺,却也并不是什么决胜因素。写下新年计划并不能保证真的完成。并非理想丰满现实骨感,而是愿望如画饼充饥,许愿的功夫与空手“画一个圈”没什么两样,实现的道路才要自己有披荆斩棘的勇气和毅力。具体的计划就不写在这里了,另见。

么心愿,那惟愿将来的自己能够写下“悉数人生的第*个十年”这样的段落,也有故事可以述说与人听。

-
我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后
\ No newline at end of file +
我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后
\ No newline at end of file diff --git "a/docs/2015/08/13/\346\210\221\347\232\204\344\270\200\344\270\252\345\244\217\346\227\245\346\270\205\346\231\250\357\274\214\345\206\231\345\234\250\345\244\251\346\264\245\345\241\230\346\262\275\347\240\201\345\244\264\351\233\206\350\243\205\347\256\261\347\210\206\347\202\270\345\220\216/index.html" "b/docs/2015/08/13/\346\210\221\347\232\204\344\270\200\344\270\252\345\244\217\346\227\245\346\270\205\346\231\250\357\274\214\345\206\231\345\234\250\345\244\251\346\264\245\345\241\230\346\262\275\347\240\201\345\244\264\351\233\206\350\243\205\347\256\261\347\210\206\347\202\270\345\220\216/index.html" index 02688eba6..ab6385964 100644 --- "a/docs/2015/08/13/\346\210\221\347\232\204\344\270\200\344\270\252\345\244\217\346\227\245\346\270\205\346\231\250\357\274\214\345\206\231\345\234\250\345\244\251\346\264\245\345\241\230\346\262\275\347\240\201\345\244\264\351\233\206\350\243\205\347\256\261\347\210\206\347\202\270\345\220\216/index.html" +++ "b/docs/2015/08/13/\346\210\221\347\232\204\344\270\200\344\270\252\345\244\217\346\227\245\346\270\205\346\231\250\357\274\214\345\206\231\345\234\250\345\244\251\346\264\245\345\241\230\346\262\275\347\240\201\345\244\264\351\233\206\350\243\205\347\256\261\347\210\206\347\202\270\345\220\216/index.html" @@ -1,13 +1,18 @@ -我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后 | Beendless ~ 快节奏,慢生活,无止境 +我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后 | Beendless ~ 快节奏,慢生活,无止境 -

我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后

8月13日,东一区时间早晨六点多。

+

我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后

8月13日,东一区时间早晨六点多。

我朦胧着醒来,习惯性得拿起手机想看看刚回国的男朋友是在做什么。可还没来得及看他的留言,就被公共号订阅里面的一批文章炸醒了。这些天已经关闭了朋友全功能,是为了免去朋友圈刷屏和被刷屏的干扰,安心写作的。但这些一眼望去的小标题们——天津?爆炸?阴谋论?一线?核弹?——足够把我拉出本来就不够有定力的小世界。原来,天津塘沽码头集装箱发生了爆炸,周边数公里内的居民区都受到严重震摄,并且因为爆炸剧烈且有毒气体、液体蔓延,消防和救护都直接升级到牺牲的警戒线。还躺在床上,一个人,刷一些新闻、图片和视频。没说什么话也没人说话,也根本没想要说什么话。起床冲凉前,却发现,眼角已经不知觉得弄湿了枕巾一片。

8月12日,东八区时间晚上十一点多。

天津塘沽码头集装箱爆炸。我刚去跟导师谈完博论的写作困难和冬天想要去香港开会的事。一个人从学校后院的林子里穿过,再回到办公室楼里。可能隔壁还有一两个年轻博士们在工作,其他人都下班回家好一阵子了。夏日傍晚,最凉爽舒适的应该是小院儿凉亭,自己的沙拉、草地上光脚的孩子,可能再给孩子们拉开小帐篷或装满充气游泳池的水,给他们一个可以数星星的夜晚。我又工作了一两个小时,算是两个多月的疏离和度假终于结束了,那一刻又重新踏上写作的旅程。有一点点疲惫,毕竟是懒惯了。但满心舒畅。回家后打一杯香蕉牛奶,洗个温凉的澡,在裸睡的自由中,伴着清冷的月色,呼吸翌日早晨的阳光。不用想,脚指头都知道,明天大早起来吃面包火腿,用摩卡小壶煮杯咖啡,一条条做完三五个文本,下午要跑去南边一家修道院静修一晚和看望朋友。  

@@ -21,4 +26,4 @@

我的情绪化和冲动可能不比今天凌晨爆炸时候的 TNT效果一样强劲,但也的确足够不专业。我激动了,激动得想要把这些骂人的话骂出来,想要贴出去,去骂人。重要的不是自己是否骂得爽——因为不给人看,自己骂也偷偷骂过了,我们生活中不都这样吗?聪明人就该这样啊,多简单的道理。相反,骂出去,才把自己置于不利地位,置于一个容易被攻击、被误解、被骂的地位。然而,我今天的激动,第一次让我有勇气站在这样的地位。当然,我激动了,这也是年轻气盛的表现。在还未写出更深刻的文字之前,还不能在短短一小时之内把汉娜阿伦特的“平庸的恶”用最可能的方式交流给读者之前,我自己先激动了。这也好不遮掩得透露了我的浅薄和缺乏定立,这是我活该被骂的地方。只是从来深知自己写得不好,不敢示人。而今拉下脸面,因为本来不是个有脸面的人物,这也还拉得下去。露出本来就不怎么样的写作水平,就像露一个像飞机场一样的胸似的。本来就没有胸线,也勾不起什么注意力。露一下图个自己爽快,也练习一下也许将来会有更多露点的镜头。习惯一下,别把自己看得太认真,也没什么。  

第二个冲动,于他人无关了吧。是自己的,是强烈的、有极大动力的,计划去一个人徒步旅行。 一个人徒步旅行(无太多计划的搭乘公共交通、随走随住),是我一直以来心中的愿望。虽然也有一个人的“旅行”,也曾一个人在几天里从罗马尼亚到匈牙利再到德国,但觉得远远不够,因为不够有途中的孤独和恐惧。或者你会上瘾,越来越可望更多的孤独和恐惧。曾为此愿景过川西、川藏到拉萨,曾愿景过丝绸之路穿欧亚大陆线,还愿景过南法到西班牙和葡萄牙。然而,我一直是那个躺在床上拿着地图去旅行的人,装在套子里的人。这样的人一般是作家笔下嘲讽和批评的对象,但大多数写出这样作品的作家本人,也是这样的人。也可能正是因为内心充满了对自己的嘲讽,在凌迟笔下的人物时,才能毫不手软。不用千刀万剐,只需每一刀,都是剐在自己身上就好。我常常会产生这样的冲动,今天清晨,或许是被塘沽爆炸的冲击波给震到了吧。

所以,最可怕的,不是这一次事故或震颤,而是不清醒和遗忘。人们都是短视的,也是记忆力不好的。世世代代和全地球的人都是这样,这个动物就是这样,我也是,你也是。但第一步也是最重要一步,我们至少要成人和面对这一点。在今天刷屏祈福称赞,明天做微店生意数钱,后天发游戏晒旅行照的时代里。风向,更容易吹走回忆。期盼有天把这些教训都收集起来,堆积成改变,而不是遗忘。 所以,最重要的,不是这一次激动,筹划着某天的一个人远地旅行,而是要长长久久记得这样激动的感觉,要跨出“原地旅行”的步子。总是这样,激动一次过后,就像雁过留痕而已,却不见了大雁。至少,要记得一次次的激动,期盼有天把这些激动累积起来,变成踏出去的第一步。

-
Set up SSL for website with Nginx and StartSSL
\ No newline at end of file +
Set up SSL for website with Nginx and StartSSL
\ No newline at end of file diff --git a/docs/2015/09/26/Set up SSL for website with Nginx and StartSSL/index.html b/docs/2015/09/26/Set up SSL for website with Nginx and StartSSL/index.html index 6f4e9d2f3..5c74dc6a7 100644 --- a/docs/2015/09/26/Set up SSL for website with Nginx and StartSSL/index.html +++ b/docs/2015/09/26/Set up SSL for website with Nginx and StartSSL/index.html @@ -1,13 +1,18 @@ -Set up SSL for website with Nginx and StartSSL | Beendless ~ 快节奏,慢生活,无止境 +Set up SSL for website with Nginx and StartSSL | Beendless ~ 快节奏,慢生活,无止境 -

Set up SSL for website with Nginx and StartSSL

If you enable HTTPS and set up the certifications correctly, which means data will not be decrypted or modified during the transportation. Today I try to enable SSL to my website. Here is what I did to make it happen:

+

Set up SSL for website with Nginx and StartSSL

If you enable HTTPS and set up the certifications correctly, which means data will not be decrypted or modified during the transportation. Today I try to enable SSL to my website. Here is what I did to make it happen:

First, you should make sure your website hosted with a dedicated IP address. Like me buy a VPS from linode. Also you should make sure your HTTP web server support SSL when you set up it. If you are using nginx, just add –with-http_ssl_module when you built it yourself (http://nginx.org/en/docs/http/ngx\_http\_ssl_module.html).

Secondly, you need to buy a certification. As we know all modern browsers will check CA, in order to recognized by the root authorities, you need to purchase one certificated through them.  Even you can self-signed one to testing which will show warning to users by browser.  Fortunately, there’re some authorities who supply free CA to users like startssl. It’s easy to get a free CA from them. Just sign up and follow the guidance from startssl, then you can get

JavaScript 机器学习之分类与聚合算法
\ No newline at end of file +
JavaScript 机器学习之分类与聚合算法
\ No newline at end of file diff --git "a/docs/2018/12/18/JavaScript-\346\234\272\345\231\250\345\255\246\344\271\240\344\271\213\345\210\206\347\261\273\344\270\216\350\201\232\345\220\210\347\256\227\346\263\225/index.html" "b/docs/2018/12/18/JavaScript-\346\234\272\345\231\250\345\255\246\344\271\240\344\271\213\345\210\206\347\261\273\344\270\216\350\201\232\345\220\210\347\256\227\346\263\225/index.html" index 078c479bc..9dea31d45 100644 --- "a/docs/2018/12/18/JavaScript-\346\234\272\345\231\250\345\255\246\344\271\240\344\271\213\345\210\206\347\261\273\344\270\216\350\201\232\345\220\210\347\256\227\346\263\225/index.html" +++ "b/docs/2018/12/18/JavaScript-\346\234\272\345\231\250\345\255\246\344\271\240\344\271\213\345\210\206\347\261\273\344\270\216\350\201\232\345\220\210\347\256\227\346\263\225/index.html" @@ -1,23 +1,28 @@ -JavaScript 机器学习之分类与聚合算法 | Beendless ~ 快节奏,慢生活,无止境 +JavaScript 机器学习之分类与聚合算法 | Beendless ~ 快节奏,慢生活,无止境 -

JavaScript 机器学习之分类与聚合算法

聚类是接触无监督式学习时常见的一个问题。通常在你想将一个大的数据集重新编排组织成小的群组,或者是将其按逻辑相似性分解成小的群组时我们会考虑聚类。例如,你可以尝试将人口普查数据中的家庭收入分成三个群组:低收入,中等收入及高收入。如果你将家庭收的数据集做为指定的一种聚类算法的输入,你将期望得到三个数据聚点 及其对应的前述三个收入分组的平均值做为结果。即使是这种家庭收入数据的一维聚类问题,你也可能很难通过手动解决——难点在于无法快速地确定两个分组之间的边界值。你可能可以参考政府部门所定义的收入分组的标准,但无法确定这类定义的标准是几何均衡的; 这类的标准可能是被政策制定者所发明出来的,因此它可能无法精确地表达数据之间的正真关系。

+

JavaScript 机器学习之分类与聚合算法

聚类是接触无监督式学习时常见的一个问题。通常在你想将一个大的数据集重新编排组织成小的群组,或者是将其按逻辑相似性分解成小的群组时我们会考虑聚类。例如,你可以尝试将人口普查数据中的家庭收入分成三个群组:低收入,中等收入及高收入。如果你将家庭收的数据集做为指定的一种聚类算法的输入,你将期望得到三个数据聚点 及其对应的前述三个收入分组的平均值做为结果。即使是这种家庭收入数据的一维聚类问题,你也可能很难通过手动解决——难点在于无法快速地确定两个分组之间的边界值。你可能可以参考政府部门所定义的收入分组的标准,但无法确定这类定义的标准是几何均衡的; 这类的标准可能是被政策制定者所发明出来的,因此它可能无法精确地表达数据之间的正真关系。

一个聚类是一组逻辑上存在某种相似性的数据点的集合。 他们可能是具有相同的行为的用户组,具有相似收入水平的居民,具有相似颜色的像素点的组合等等. K-平均聚类算法是一种数值和几何量化算法,因此它所生成的聚类所包含的点在数值上是相近的,在几何上也是彼此相近的。庆幸的是,大多数的数据集都是可以数值化的,因为K-平均聚类算法可适用于多种领域的问题。

K-均值算法是一个对于量化数据集而言快速,强大并广受欢迎的算法。它的名称来源于两部分:K表达了我们想要算法查找的聚类的个数,均值意味着确定这些聚类中心点的方式(你可以使用诸如K-中位数或K-众数等)。例如,我们设计了一个查找到三个代表整个数据集所有数据点的位置均值的聚类中心的算法,在此算法中,K=3 同时我们使用了K-均值分析的方式来确定聚类中心点的位置。

K-均值算法是一个迭代算法,这意味着它将在循环中来持续性地更新算法模型,直到模型处于某种稳定状态后才会退出循环并返回模型做为结果。如果更加形象具体地描述,K-均值算法的具体内容是:将你所要分析的所有的数据点绘制在其所对应的空间中,并选取一个K值。你必须在此能够明确地知道K的值,或者至少能够知道K的一个合理的取值范围(在这一节之后我们会给出如何处理这种情况)。之后随机生成K个数据点(如果K=5,生成五个数据点)并将其绘制在对应的空间内;这些点也被称为”重心聚点”,因为它们实质上代表的是聚类数据集的几何中心 。针对数据集空间的所有点,找到离这些点各自几何距离最新的数据重心聚点并将其连接或分配给这些数据点。一时所有的数据点都链接或分配到了数据重心聚点,此时再依次遍历所有的重心聚点并将其位置更新为与其连接或分配到其的所有数据点的平均位置。重复上述分配-更新的过程理直到所有的重心聚点的位置不在变化;这些重心聚点的最终位置即是聚类算法的输出,同时它们也是整个数据集在聚类操作后的分组聚点。上述的过程比较抽象,如果你感觉到很难理解,不要担心,接下来在我们设计并实现整个算法的过程中,我们会更加深入地对其加以示例进行介绍。

在这一章中,我们将首先讨论均值及距离的概念及及如何将它们应用到K-均值算法之中。之后我们将剖析算法的细节,并完全使用JavaScript来实现K-均值算法。接下来我们将使用多个不同的简单数据集来测试我们所实现的K-均值算法,同时讨论如何处理K未知的问题。我们将创建一个小的工具来自动化地确定K的值。基于以上知识,我们会分析K-均值算法中损失函数的概念,通过设计并实现一个损失函数来帮我们实现优化算法的目标。 以下是几个主要话题:

    -
  • 均值与距离
  • -
  • 实现K-均值算法
  • -
  • 示例一: 如何使用K-均值算法来处理二维数据
  • -
  • 示例二: 如何使用K-均值算法来处理三维数据
  • -
  • K-均值算法当K未知时如何处理
  • +
  • 均值与距离
  • +
  • 实现K-均值算法
  • +
  • 示例一: 如何使用K-均值算法来处理二维数据
  • +
  • 示例二: 如何使用K-均值算法来处理三维数据
  • +
  • K-均值算法当K未知时如何处理

均值和距离

K-均值算法的运行依赖于两个概念:均值和距离。为了计算出某个聚点中心的位置,算法需要计算所有连接到该数聚点中心所有数据点的平均值。这种情况下,我们会使用算术均值,即所有数据点的数值的和除以数据点的个数来得到这个均值。在ES5/标准JavaScript中, 我们可以创建如下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**  
* @param {Array.<number>} 数值
* @return {float}
*/
function mean(numbers) {
var sum = 0, length = numbers.length;
if (length === 0) {
/** 在数学定义中,一个空的数据集的均值是undefined,所以我们应该尽早地检测
* 到这种情况并中断执行。同时我们也应该允许函数试图计算0/0, 在JavaScript
* 中会返回NaN,但在一些其它语言中会抛出异常。为了不让函数在此能够处理多种
* 情况,我们在此直接抛出异常,而不是返回一个混合类型的值
* /
throw new Error('Cannot calculate mean of empty set');
}
for (var i = 0; i < length; i++) {
sum += numbers[i];
}
return sum / length;
}
@@ -48,10 +53,10 @@

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**  
* Initializes random centroids, using the ranges of the data * to set minimum and maximum bounds for the centroids. * You may inspect the output of this method if you need to debug * random initialization, otherwise this is an internal method. * @see getAllDimensionRanges
* @see getRangeForDimension
* @returns {Array}
*/initRandomCentroids() {

const dimensionality = this.getDimensionality();
const dimensionRanges = this.getAllDimensionRanges();
const centroids = [];

// We must create 'k' centroids.
for (let i = 0; i < this.k; i++) {

// Since each dimension has its own range, create a placeholder at first
let point = [];

/**
* For each dimension in the data find the min/max range of that dimension, * and choose a random value that lies within that range. */
for (let dimension = 0; dimension < dimensionality; dimension++) {
const {min, max} = dimensionRanges[dimension];
point[dimension] = min + (Math.random()*(max-min));
}

centroids.push(point);

}

return centroids;

}

上述算法包含了两层循环。外层循环生成了K个重心聚点。由于数据集的数据维度是任意的,每一个维度自身的数据值范围也是任意的,我们必须遍历所有的纬度来生成随机的位置信息。如果你的数据集是三维的,那内层循环将会分别处理维度0,1,2,取得每个维度的最大最小值,之后选取一个随机值,但当得到的这个值指定给当前重心聚点的当前维度做为初始值。

-

Scaling NodeJS Apps -- The Need to Scale
\ No newline at end of file +
Scaling NodeJS Apps -- The Need to Scale
\ No newline at end of file diff --git a/docs/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/index.html b/docs/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/index.html index 3934b1d53..82415a27a 100644 --- a/docs/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/index.html +++ b/docs/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/index.html @@ -1,13 +1,18 @@ -Scaling NodeJS Apps -- Archtectural Patterns | Beendless ~ 快节奏,慢生活,无止境 +Scaling NodeJS Apps -- Archtectural Patterns | Beendless ~ 快节奏,慢生活,无止境 -

Scaling NodeJS Apps -- Archtectural Patterns

This is the notes when I read the book Scaling Your Nodej.js Apps.

+

Scaling NodeJS Apps -- Archtectural Patterns

This is the notes when I read the book Scaling Your Nodej.js Apps.

Layered Architecture

It is based on the logistic seperation of concerns of your application (or platform) into layers. And the layers must comply with the following points:

  • Each layer must have a well-defined purpose (presentation layer, business layer, and so on)
  • @@ -61,4 +66,4 @@

    Lambda Architectures

    Lambda architecutres are a special pattern designed to provide a high-throughput platform that is able to process very large quantities of data both in real time and in batches.

    This is a solution that has a very high maintenance cost associated with it since you basically are maintaining two parallel architecture at once, which in ture need to keep a centralized repository of data in a synchronized matter.

    -

Started to go through convnetjs
\ No newline at end of file +
Started to go through convnetjs
\ No newline at end of file diff --git a/docs/2018/12/20/Scaling-NodeJS-Apps/index.html b/docs/2018/12/20/Scaling-NodeJS-Apps/index.html index 82b29b44d..3fccc552f 100644 --- a/docs/2018/12/20/Scaling-NodeJS-Apps/index.html +++ b/docs/2018/12/20/Scaling-NodeJS-Apps/index.html @@ -1,13 +1,18 @@ -Scaling NodeJS Apps -- The Need to Scale | Beendless ~ 快节奏,慢生活,无止境 +Scaling NodeJS Apps -- The Need to Scale | Beendless ~ 快节奏,慢生活,无止境 -

Scaling NodeJS Apps -- The Need to Scale

This is the notes when I read the book Scaling Your Nodej.js Apps.

+

Scaling NodeJS Apps -- The Need to Scale

This is the notes when I read the book Scaling Your Nodej.js Apps.

An increasing in incoming traffic could affect your system in different ways; we can describe these as direct or indirect.

  • Direct Effects

    @@ -36,10 +41,8 @@
  • Redundancy

    We have one or more components performing the same task and some form of checking logic to determine when one of them is has failed and its output needs to be ignored. It’s a very common practice for mission-critical components.

      -
    • Triple Modular Redundancy
      TMR is a form of redundancy in which three systems perform the same process and their results are checked by a majority voting system that in turn produces a single output.

      -
    • -
    • Forward Error Correction
      FEC adds redundancy into the message itself. The receiver can verify the actual data and correct a limited number of detected errors caused by noisy or unstable channels.

      -
    • +
    • Triple Modular Redundancy
      TMR is a form of redundancy in which three systems perform the same process and their results are checked by a majority voting system that in turn produces a single output.
    • +
    • Forward Error Correction
      FEC adds redundancy into the message itself. The receiver can verify the actual data and correct a limited number of detected errors caused by noisy or unstable channels.
  • Checkingpoint

    @@ -49,4 +52,4 @@
-
Scaling NodeJS Apps -- Archtectural Patterns
\ No newline at end of file +
Scaling NodeJS Apps -- Archtectural Patterns
\ No newline at end of file diff --git a/docs/2018/12/23/Started-to-go-through-convnetjs/index.html b/docs/2018/12/23/Started-to-go-through-convnetjs/index.html index cf65b96a6..d83f930d0 100644 --- a/docs/2018/12/23/Started-to-go-through-convnetjs/index.html +++ b/docs/2018/12/23/Started-to-go-through-convnetjs/index.html @@ -1,12 +1,17 @@ -Started to go through convnetjs | Beendless ~ 快节奏,慢生活,无止境 +Started to go through convnetjs | Beendless ~ 快节奏,慢生活,无止境 -

Started to go through convnetjs

After reading several books about deep learning, now I can use keras / tensorflow to train some models, but the mathmatical implementations behind the libraries are still have to follow.

+

Started to go through convnetjs

After reading several books about deep learning, now I can use keras / tensorflow to train some models, but the mathmatical implementations behind the libraries are still have to follow.

Two years ago, when I played with Karpathy‘s [ConvnetJS], I was shocked by the agrighms behind that. I think now it’s time to go through his code, I started a small project to annotate ConvnetJS source code and re-write it with TypeScript. You can check my progress from ConvnetJS Source Annotation, you can also check the documentation directly.

-
Tips for Hyperparameter Optimization
\ No newline at end of file +
Tips for Hyperparameter Optimization
\ No newline at end of file diff --git a/docs/2019/01/01/Several-Important-Concetps-of-CNN/index.html b/docs/2019/01/01/Several-Important-Concetps-of-CNN/index.html index 1698ee573..d090c60a5 100644 --- a/docs/2019/01/01/Several-Important-Concetps-of-CNN/index.html +++ b/docs/2019/01/01/Several-Important-Concetps-of-CNN/index.html @@ -1,13 +1,18 @@ -Several Important Concepts of CNN | Beendless ~ 快节奏,慢生活,无止境 +Several Important Concepts of CNN | Beendless ~ 快节奏,慢生活,无止境 -

Several Important Concepts of CNN

A trained convolutional layer is made up of many feature detectors, called filters, which slide over an input image tensor as a moving window. This is a very powerful technique and it possesses several advantages over the flatten and classify method or deep learning.

+

Several Important Concepts of CNN

A trained convolutional layer is made up of many feature detectors, called filters, which slide over an input image tensor as a moving window. This is a very powerful technique and it possesses several advantages over the flatten and classify method or deep learning.

Below are some notes coming from Deep Learning Quick Reference.

Convolutional Layer

During the computation between the input and each filter, we take the elementwise product across all axes. So in the end, we will still leave with a two-dimensional output.

In a convolution layer, each unit is a filter, combined with a nonlinearity.

@@ -31,4 +36,4 @@

When doing transformation (flip/shift/rotate), make sure you don’t introduce bias to the feature => label mappings. For example, you can verticle flip the MNIST dataset.

-

Building Asynchronized HTTP Services With Sanic
\ No newline at end of file +
Building Asynchronized HTTP Services With Sanic
\ No newline at end of file diff --git a/docs/2019/01/01/Tips-for-Hyperparameter-Optimization/index.html b/docs/2019/01/01/Tips-for-Hyperparameter-Optimization/index.html index f6bb1c62c..0c3c124a3 100644 --- a/docs/2019/01/01/Tips-for-Hyperparameter-Optimization/index.html +++ b/docs/2019/01/01/Tips-for-Hyperparameter-Optimization/index.html @@ -1,20 +1,23 @@ -Tips for Hyperparameter Optimization | Beendless ~ 快节奏,慢生活,无止境 +Tips for Hyperparameter Optimization | Beendless ~ 快节奏,慢生活,无止境 -

Tips for Hyperparameter Optimization

One of the biggest headaches of using deep neural networks is that they have tons of hyperparameters that should be optimized so that the network performs optimally. Below are some notes coming from Deep Learning Quick Reference.

+

Tips for Hyperparameter Optimization

One of the biggest headaches of using deep neural networks is that they have tons of hyperparameters that should be optimized so that the network performs optimally. Below are some notes coming from Deep Learning Quick Reference.

  • Try to Find some similar solved problem.

  • Keep adding layers/nodes until the network gets overfitting.

    -
    1
    The bad thing becomes a good thing to help us confirm that the network can fit the training sets perfectly at least.
    - -
  • +
    1
    The bad thing becomes a good thing to help us confirm that the network can fit the training sets perfectly at least.

Hyperparameters

Several Important Concepts of CNN
\ No newline at end of file +
1
Ultimately, hyperparameter search is an economics problem, and the first part of any hyperparameter search should be a consideration for your budget of computation time, and personal time, in attempting to isolate the best hyperparameter configuration.
Several Important Concepts of CNN
\ No newline at end of file diff --git a/docs/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/index.html b/docs/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/index.html index c335160e0..f236358ca 100644 --- a/docs/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/index.html +++ b/docs/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/index.html @@ -1,13 +1,18 @@ -Building Asynchronized HTTP Services With Sanic | Beendless ~ 快节奏,慢生活,无止境 +Building Asynchronized HTTP Services With Sanic | Beendless ~ 快节奏,慢生活,无止境 -

Building Asynchronized HTTP Services With Sanic

Python introduced async/await syntax from Python3.5. it makes your code non-blocking and speedy. Developers can use it to build a high-performance / NIO web services like NodeJS. Most of the Python web developers are familiar with Flask. But unfortunately flask has no plan to support the async request headers. Sanic is a Flask-like webserver that’s written to go fast. It was inspired by uvloop.

+

Building Asynchronized HTTP Services With Sanic

Python introduced async/await syntax from Python3.5. it makes your code non-blocking and speedy. Developers can use it to build a high-performance / NIO web services like NodeJS. Most of the Python web developers are familiar with Flask. But unfortunately flask has no plan to support the async request headers. Sanic is a Flask-like webserver that’s written to go fast. It was inspired by uvloop.

I set up a sanic boilerplate to show how to set up a sanic application. Inside of this project:

  • Dockerfile and docker-compose.yml are used to set up the python environments
  • @@ -15,4 +20,4 @@
  • Blueprint is used to build different parts of the applications (health-check / docs / business logic samples)
  • Eventloop is based on asyncio and uvloop
-
Loading Image to Google Colab Notebooks
\ No newline at end of file +
Loading Image to Google Colab Notebooks
\ No newline at end of file diff --git a/docs/2020/08/31/Loading Image to Google Colab Notebooks/index.html b/docs/2020/08/31/Loading Image to Google Colab Notebooks/index.html index d14296de3..82e26ae93 100644 --- a/docs/2020/08/31/Loading Image to Google Colab Notebooks/index.html +++ b/docs/2020/08/31/Loading Image to Google Colab Notebooks/index.html @@ -1,15 +1,20 @@ -Loading Image to Google Colab Notebooks | Beendless ~ 快节奏,慢生活,无止境 +Loading Image to Google Colab Notebooks | Beendless ~ 快节奏,慢生活,无止境 -

Loading Image to Google Colab Notebooks

Google Colab is one of the best place to start your Machine Learning. Sometime you may want to upload images to the notebooks from your local. Fortunately you can easily make it done throught the built-in API.

+

Loading Image to Google Colab Notebooks

Google Colab is one of the best place to start your Machine Learning. Sometime you may want to upload images to the notebooks from your local. Fortunately you can easily make it done throught the built-in API.

1
2
3
4
5
6
7
from google.colab import files
from io import BytesIO
import matplotlib.pyplot as plt

uploaded_files = files.upload()

images = {fname: plt.imread(BytesIO(fbinary)) for fname, fbinary in uploaded_files.items()}

If you are using Keras, you can also read the uploaded file and convert it to a Numpy array with built-in helper functions.

1
2
3
from tensorflow.keras.preprocessing.image import load_img, img_to_array
TARGET_SIZE = 256
images = {fname: img_to_array(load_img(fname, target_size=(TARGET_SIZE, TARGET_SIZE)))for fname in uploaded_files.keys()}
-
Computer Vision Tasks Summary
\ No newline at end of file +
Computer Vision Tasks Summary
\ No newline at end of file diff --git a/docs/2020/09/03/Computer-Vision-Tasks-Summary/index.html b/docs/2020/09/03/Computer-Vision-Tasks-Summary/index.html index 7b1de6e2a..e7c2d5b2f 100644 --- a/docs/2020/09/03/Computer-Vision-Tasks-Summary/index.html +++ b/docs/2020/09/03/Computer-Vision-Tasks-Summary/index.html @@ -1,13 +1,18 @@ -Computer Vision Tasks Summary | Beendless ~ 快节奏,慢生活,无止境 +Computer Vision Tasks Summary | Beendless ~ 快节奏,慢生活,无止境 -

Computer Vision Tasks Summary

I’m start reading this book <Deep Learning with TensorFlow 2 and Keras> those days, and will keep posting what I learnt from the book here.

+

Computer Vision Tasks Summary

I’m start reading this book <Deep Learning with TensorFlow 2 and Keras> those days, and will keep posting what I learnt from the book here.

There are several regular computer vision tasks when everyone start learning CNN. Such as MINST, ImageNet etc. But when you start applying what you learned to real projects, you may find more complex categories of computer vision use cases.

  • Classification and localization

    @@ -47,13 +52,13 @@
  • Concatenative TTS is where single speech voice fragments are first memorized and then recombined when the voice has to be reproduced. However, this approach does not scale because it is possible to reproduce only the memorized voice fragments, and it is not possible to reproduce new speakers or different types of audio without memorizing the fragments from the beginning.

  • Parametric TTS is where a model is created for storing all the characteristic features of the audio to be synthesized. Before WaveNet, the audio generated with parametric TTS was less natural than concatenative TTS. WaveNet enabled significant improvement by modeling directly the production of audio sounds, instead of using intermediate signal processing algorithms as in the past.

    -

    There are two famous implementations of the WaveNet. https://github.com/ibab/tensorflow-wavenet and https://magenta.tensorflow.org/nsynth (https://colab.research.google.com/notebooks/magenta/nsynth/nsynth.ipynb)

    -

    MuseNet released by OpenAI is another audio generation tool.

+

There are two famous implementations of the WaveNet. https://github.com/ibab/tensorflow-wavenet and https://magenta.tensorflow.org/nsynth (https://colab.research.google.com/notebooks/magenta/nsynth/nsynth.ipynb)

+

MuseNet released by OpenAI is another audio generation tool.

  • Capsule networks

    The pooling layer in CNN introduces a significant problem because if forces to loss all the positional data (spatial relationships between pixels).

  • -
    Add WaterMark with JavaScript to Your Website
    \ No newline at end of file +
    Add WaterMark with JavaScript to Your Website
    \ No newline at end of file diff --git a/docs/2020/10/02/UsePureJSToAddWaterMarkForYourSite/index.html b/docs/2020/10/02/UsePureJSToAddWaterMarkForYourSite/index.html index 62dd85d8e..80549d1b5 100644 --- a/docs/2020/10/02/UsePureJSToAddWaterMarkForYourSite/index.html +++ b/docs/2020/10/02/UsePureJSToAddWaterMarkForYourSite/index.html @@ -1,12 +1,17 @@ -Add WaterMark with JavaScript to Your Website | Beendless ~ 快节奏,慢生活,无止境 +Add WaterMark with JavaScript to Your Website | Beendless ~ 快节奏,慢生活,无止境 -

    Add WaterMark with JavaScript to Your Website

    If you are an enterprise application developer, you may want to add watermark to your application. You can use below JS to applications like Confluence, Jira and so on. Just need to paste below JS code.

    +

    Add WaterMark with JavaScript to Your Website

    If you are an enterprise application developer, you may want to add watermark to your application. You can use below JS to applications like Confluence, Jira and so on. Just need to paste below JS code.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    (function(txt1, txt2){
    var canvas = document.createElement('canvas');
    var waterMark = document.createElement('div');
    var body = document.body;
    canvas.width = 250;
    canvas.height = 280;
    canvas.style.display = 'none';
    body.appendChild(canvas);

    var context = canvas.getContext('2d');
    context.rotate(-20 * Math.PI/180);
    context.font = '16px';
    context.fillStyle = 'rgba(17, 17, 17, 0.20)';
    context.textAlign = 'left';
    context.textBaseline = 'Middle';
    context.fillText(txt1, canvas.width / 3 - 40, canvas.height / 2, 200);
    context.fillText(txt2, canvas.width / 3 - 40, canvas.height / 2 + 30, 200);
    waterMark.style.backgroundImage = 'url(' + canvas.toDataURL('image/png') + ')';
    waterMark.style.zIndex = 9999;
    waterMark.style.height = '100vh';
    waterMark.style.width = '100vw';
    waterMark.style.pointerEvents = 'none';
    waterMark.style.position = 'fixed';
    body.prepend(waterMark);
    })('© Copyright 2020', 'All Rights Reserved');
    -
    Serving Files on S3 through NodeJS
    \ No newline at end of file +
    Serving Files on S3 through NodeJS
    \ No newline at end of file diff --git a/docs/2020/10/09/Serving Files on S3 through NodeJS/index.html b/docs/2020/10/09/Serving Files on S3 through NodeJS/index.html index 5acb4f9bc..d2a969863 100644 --- a/docs/2020/10/09/Serving Files on S3 through NodeJS/index.html +++ b/docs/2020/10/09/Serving Files on S3 through NodeJS/index.html @@ -1,12 +1,17 @@ -Serving Files on S3 through NodeJS | Beendless ~ 快节奏,慢生活,无止境 +Serving Files on S3 through NodeJS | Beendless ~ 快节奏,慢生活,无止境 -

    Serving Files on S3 through NodeJS

    NodeJS stream is one of the most powerful modules built-in. If you need to serve files on S3 through NodeJS service, a good idea is to leverage the compatibility of stream, especially if you want to serve big files.

    +

    Serving Files on S3 through NodeJS

    NodeJS stream is one of the most powerful modules built-in. If you need to serve files on S3 through NodeJS service, a good idea is to leverage the compatibility of stream, especially if you want to serve big files.

    One small trick here is you need to set up correct Content-Type before sending response back to the browser. Based on AWS’s documentation, https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html, we can listen the event httpHeaders and set up the correct response header information.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    const mime = require('mime');
    const express = require('express');
    const AWS = require('aws-sdk');
    const AWSConfig = require('aws-config');
    const S3 = new AWS.S3(AWSConfig({ region: AWS_REGION, accessKeyId: AWS_ACCESS_KEY_ID, secretAccessKey: AWS_SECRET_ACCESS_KEY }));

    router.get('/*', (req, res, next) => {
    const { path } = req;
    const contentType = mime.getType(path);
    return S3.getObject({
    Bucket: AWS_BUCKET,
    Key: path,
    }).on('httpHeaders', (code, headers) => {
    if (code < 300) {
    res.set({
    'Content-Type': contentType,
    'Content-Length': headers['content-length'],
    'Last-Modified': headers['last-modified'],
    });
    }
    })
    .createReadStream()
    .on('error', () => next())
    .pipe(res);
    });
    Understand X-Forwarded-Proto
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    const mime = require('mime');
    const express = require('express');
    const AWS = require('aws-sdk');
    const AWSConfig = require('aws-config');
    const S3 = new AWS.S3(AWSConfig({ region: AWS_REGION, accessKeyId: AWS_ACCESS_KEY_ID, secretAccessKey: AWS_SECRET_ACCESS_KEY }));

    router.get('/*', (req, res, next) => {
    const { path } = req;
    const contentType = mime.getType(path);
    return S3.getObject({
    Bucket: AWS_BUCKET,
    Key: path,
    }).on('httpHeaders', (code, headers) => {
    if (code < 300) {
    res.set({
    'Content-Type': contentType,
    'Content-Length': headers['content-length'],
    'Last-Modified': headers['last-modified'],
    });
    }
    })
    .createReadStream()
    .on('error', () => next())
    .pipe(res);
    });
    Understand X-Forwarded-Proto
    \ No newline at end of file diff --git a/docs/2020/10/26/JavaScript-Async-Ready-Looping/index.html b/docs/2020/10/26/JavaScript-Async-Ready-Looping/index.html index e5dab5d55..2b01b769a 100644 --- a/docs/2020/10/26/JavaScript-Async-Ready-Looping/index.html +++ b/docs/2020/10/26/JavaScript-Async-Ready-Looping/index.html @@ -1,13 +1,18 @@ -JavaScript Async Ready Looping | Beendless ~ 快节奏,慢生活,无止境 +JavaScript Async Ready Looping | Beendless ~ 快节奏,慢生活,无止境 -

    JavaScript Async Ready Looping

    When you are following functional programming style guide to write JavaScript, you may find that it’s hard to deal with asynchronous since async function always return promises. So code like below will resolve the promises at same time instead of waiting for them.

    +

    JavaScript Async Ready Looping

    When you are following functional programming style guide to write JavaScript, you may find that it’s hard to deal with asynchronous since async function always return promises. So code like below will resolve the promises at same time instead of waiting for them.

    1
    2
    3
    4
    5
    6
    (() => {
    [1, 2, 3, 4].forEach(async (x) => {
    await AsyncFunction(x);
    });
    console.log('Done'); // Run before the promises are resolved.
    })();

    There are several different approaches to solve this problem.

    @@ -17,4 +22,4 @@

    Use Reduce to loop over async calls [promise chain]

    Since async calls return promises, we can emulate forEach with reduce by starting with a resolved promise and chaining ot it the promise for each value in the array.

    1
    2
    3
    4
    (async () => {
    await [1, 2, 3, 4].reduce((acc, item) => acc.then(() => AsyncFunction(item)), Promise.resolve());
    console.log('Done'); // Run after all promises are resolved.
    })();
    -
    Understand Golang's Function Type
    \ No newline at end of file +
    Understand Golang's Function Type
    \ No newline at end of file diff --git a/docs/2020/10/26/Understand-X-Forwarded-Proto/index.html b/docs/2020/10/26/Understand-X-Forwarded-Proto/index.html index abe3188a9..ede923ba8 100644 --- a/docs/2020/10/26/Understand-X-Forwarded-Proto/index.html +++ b/docs/2020/10/26/Understand-X-Forwarded-Proto/index.html @@ -1,13 +1,18 @@ -Understand X-Forwarded-Proto | Beendless ~ 快节奏,慢生活,无止境 +Understand X-Forwarded-Proto | Beendless ~ 快节奏,慢生活,无止境 -

    Understand X-Forwarded-Proto

    HTTP requests and HTTP responses use header fields to send information about the HTTP messages. Header fields are colon-separated name-value pairs that are separated by a carriage return (CR) and a line feed (LF). A standard set of HTTP header fields is defined in RFC 2616. There are also non-standard HTTP headers available that are widely used by the applications. Some of the non-standard HTTP headers have an X-Forwarded prefix.

    +

    Understand X-Forwarded-Proto

    HTTP requests and HTTP responses use header fields to send information about the HTTP messages. Header fields are colon-separated name-value pairs that are separated by a carriage return (CR) and a line feed (LF). A standard set of HTTP header fields is defined in RFC 2616. There are also non-standard HTTP headers available that are widely used by the applications. Some of the non-standard HTTP headers have an X-Forwarded prefix.

    The X-Forwarded-Proto request header helps you identify the protocol (HTTP or HTTPS) that a client used to connect to your servers. For example, if you host your website application behind a proxy server, let’s say AWS Loadbalancer. If there’s only one layer in front of the AWS load balancer, then the X-Forwarded-Proto value could be either http or https (it depends on how client connect to the load balancer).

    Usually it won’t be an issue. But if you have multiple proxy servers in front of your application, for instance, user will have to go through CDN, WAF, Load balancer to hit your application, then the value of X-Forwarded-Proto depends on how the last two layers connect to each other instead of the protocal from client. Which means if user open the website with HTTPS mode, then you will have issue to set up the secured cookie in your HTTP response.

    Here is an example, you set up an applicatio with ExpressJS under HTTPS model. In front your application, you have Fastly, Imperva and AWS ALB. Now if you are using express-session to set up your user session with below configuration:

    @@ -16,4 +21,4 @@
    1
    2
    3
    4
    5
    /* eslint-disable no-param-reassign */
    app.use((req, res, next) => {
    req.headers['x-forwarded-proto'] = 'https';
    return next();
    });
    -
    JavaScript Async Ready Looping
    \ No newline at end of file +
    JavaScript Async Ready Looping
    \ No newline at end of file diff --git a/docs/2021/07/06/Understand Golang's Function Type/index.html b/docs/2021/07/06/Understand Golang's Function Type/index.html index a9b8ab83c..c2d5327b6 100644 --- a/docs/2021/07/06/Understand Golang's Function Type/index.html +++ b/docs/2021/07/06/Understand Golang's Function Type/index.html @@ -1,13 +1,18 @@ -Understand Golang's Function Type | Beendless ~ 快节奏,慢生活,无止境 +Understand Golang's Function Type | Beendless ~ 快节奏,慢生活,无止境 -

    Understand Golang's Function Type

    Based on Golang’s function type spec:

    +

    Understand Golang's Function Type

    Based on Golang’s function type spec:

    1
    A function type denotes the set of all functions with the same parameter and result types

    And type identity:

    1
    Two function types are identical if they have the same number of parameters and result types, corresponding parameters and result types are identical, and either both functions have variadic or neither is. Parameter and result names are not required to match
    @@ -21,4 +26,4 @@

    Which means we can define a handler below

    1
    2
    3
    4
    5
    func handleGreeting(format string) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, format, "World")
    }
    }

    This is valid return type since the anonymous function’s signature and return type is the same as http.HandlerFunc, so we don’t need to explictly convert it. It’s the same as

    -
    1
    2
    3
    4
    5
    func handleGreeting(format string) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, format, "World")
    })
    }
    Binary Search Code Template Deep Dive
    \ No newline at end of file +
    1
    2
    3
    4
    5
    func handleGreeting(format string) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, format, "World")
    })
    }
    Binary Search Code Template Deep Dive
    \ No newline at end of file diff --git a/docs/2021/08/12/Binary-Search-Deep-Dive/index.html b/docs/2021/08/12/Binary-Search-Deep-Dive/index.html index 8cf7b1d3e..c170e5df0 100644 --- a/docs/2021/08/12/Binary-Search-Deep-Dive/index.html +++ b/docs/2021/08/12/Binary-Search-Deep-Dive/index.html @@ -1,13 +1,18 @@ -Binary Search Code Template Deep Dive | Beendless ~ 快节奏,慢生活,无止境 +Binary Search Code Template Deep Dive | Beendless ~ 快节奏,慢生活,无止境 -

    Binary Search Code Template Deep Dive

    Let’s take a look at a easy problem on Leetcode 704. Binary Search. Besides the brute-force O(n) solution, it’s not hard to get the O(log(n)) solution from the constrains unique and sorted in ascending order. Binary search is one of the most basic algorithms we are using, but most people couldn’t get the right code.

    +

    Binary Search Code Template Deep Dive

    Let’s take a look at a easy problem on Leetcode 704. Binary Search. Besides the brute-force O(n) solution, it’s not hard to get the O(log(n)) solution from the constrains unique and sorted in ascending order. Binary search is one of the most basic algorithms we are using, but most people couldn’t get the right code.

    Based on the open/close intervals, there are two different templates for Binary Search code:

    Left-closed, Right-closed [left, right]

    Two tips if you chose this one:

      @@ -26,4 +31,4 @@

      https://play.golang.org/p/tkUkoNElKSV

      Another important thing to keep in mind is that the range overflow. You may notice that when we calculate the new sub ranges above, we are using middle := left + (right-left)/2 instead of middle := (left + right)/2. So what’s the difference between those two? Mathmatically there’s no difference, but in computer world, the later one postentially can cause an overflow issue when the range of the array is too large. left + right could be larger than the biggest int.

      -

    Time Complexity Calculation Template
    \ No newline at end of file +
    Time Complexity Calculation Template
    \ No newline at end of file diff --git a/docs/2021/08/16/Time-Complexity-Calculation-Template/index.html b/docs/2021/08/16/Time-Complexity-Calculation-Template/index.html index db733418e..f9339eb21 100644 --- a/docs/2021/08/16/Time-Complexity-Calculation-Template/index.html +++ b/docs/2021/08/16/Time-Complexity-Calculation-Template/index.html @@ -1,13 +1,18 @@ -Time Complexity Calculation Template | Beendless ~ 快节奏,慢生活,无止境 +Time Complexity Calculation Template | Beendless ~ 快节奏,慢生活,无止境 -

    Time Complexity Calculation Template

      +

      Time Complexity Calculation Template

      1. O(n)
      1
      2
      3
      4
      for i := 0; i < n; i++ {
      //statements
      }

      @@ -54,7 +59,7 @@

      So the complexity is : 1 + 2 + 3 + ... + n = n * (n + 1) / 2 = O(n2)

        -
      1. O()
      2. +
      3. O()
      1
      2
      3
      4
      5
      for i, j := 0, 0; j < n; i++ {
      j += i
      //statements
      }

      @@ -91,7 +96,7 @@ 0 + 1 + 2 + 3 + … + k -

      We need to find the solution for 1 + 2 + 3 + ... + k > n => k >

      +

      We need to find the solution for 1 + 2 + 3 + ... + k > n => k >

      1. O()
      @@ -166,4 +171,4 @@ -
      Traverse Spiral Matrix
      \ No newline at end of file +
    Traverse Spiral Matrix
    \ No newline at end of file diff --git a/docs/2021/08/18/Spiral-Matrix/index.html b/docs/2021/08/18/Spiral-Matrix/index.html index 49b56021e..cdc82c8f0 100644 --- a/docs/2021/08/18/Spiral-Matrix/index.html +++ b/docs/2021/08/18/Spiral-Matrix/index.html @@ -1,13 +1,18 @@ -Traverse Spiral Matrix | Beendless ~ 快节奏,慢生活,无止境 +Traverse Spiral Matrix | Beendless ~ 快节奏,慢生活,无止境 -

    Traverse Spiral Matrix

      +

      Traverse Spiral Matrix

      1. Traverse Spiral Matrix

      The trick of traverse a matrix in spiral order is that we need to have flags to keep the boundary. Let’s check LeetCode problerm 54. Spiral Matrix

      @@ -30,4 +35,4 @@
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int {
      ret := [][]int{{rStart, cStart}}
      directions := [4][2]int{
      {0, 1},
      {1, 0},
      {0, -1},
      {-1, 0},
      }
      for i, d := 0, 0; len(ret) < rows*cols; i++ {
      for j := 0; j < i/2+1; j++ {
      rStart += directions[d%4][0]
      cStart += directions[d%4][1]
      if rStart < 0 || cStart < 0 || rStart >= rows || cStart >= cols {
      continue
      }
      ret = append(ret, []int{rStart, cStart})
      }
      d++
      }
      return ret
      }

      Golang Playbook: https://play.golang.org/p/bPk8zAyAqe2

      -
      Remove Linked List Elements
      \ No newline at end of file +
    Remove Linked List Elements
    \ No newline at end of file diff --git a/docs/2021/08/24/Remove-Linked-List-Elements/index.html b/docs/2021/08/24/Remove-Linked-List-Elements/index.html index a74c792c3..6a24681d3 100644 --- a/docs/2021/08/24/Remove-Linked-List-Elements/index.html +++ b/docs/2021/08/24/Remove-Linked-List-Elements/index.html @@ -1,13 +1,18 @@ -Remove Linked List Elements | Beendless ~ 快节奏,慢生活,无止境 +Remove Linked List Elements | Beendless ~ 快节奏,慢生活,无止境 -

    Remove Linked List Elements

    Let’s take a look at a easy problem on Leetcode 203. Remove Linked List Elements. We will demonstrate how to remove elements from a linked list.

    +

    Remove Linked List Elements

    Let’s take a look at a easy problem on Leetcode 203. Remove Linked List Elements. We will demonstrate how to remove elements from a linked list.

    Basically there are two ways to make it done.

    a. Since all nodes in the linked list have a previous node except the head node, we can use those node’s previous node to delete those node. But if we have to remove the head node, we need to use a special logic.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func removeElements(head *ListNode, val int) *ListNode {
    for ; head != nil && head.Val == val; {
    head = head.Next
    }
    for p := head; p != nil && p.Next != nil; {
    if p.Val == val {
    p.Next = p.Next.Next
    } else {
    p = p.Next
    }
    }
    return head
    }
    @@ -17,4 +22,4 @@
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func removeElements(head *ListNode, val int) *ListNode {
    virtualNode := &ListNode{0, head}
    for p := virtualNode; p != nil && p.Next != nil; {
    if p.Next.Val == val {
    p.Next = p.Next.Next
    } else {
    p = p.Next
    }
    }
    return virtualNode.Next
    }

    Golang Playbook: https://play.golang.org/p/1tvSzIGDAm7

    -
    Design A Linked List Class
    \ No newline at end of file +
    Design A Linked List Class
    \ No newline at end of file diff --git a/docs/2021/08/30/Design-A-Linked-List-Class/index.html b/docs/2021/08/30/Design-A-Linked-List-Class/index.html index 0e8d3c7b2..a5ca83f51 100644 --- a/docs/2021/08/30/Design-A-Linked-List-Class/index.html +++ b/docs/2021/08/30/Design-A-Linked-List-Class/index.html @@ -1,11 +1,16 @@ -Design A Linked List Class | Beendless ~ 快节奏,慢生活,无止境 +Design A Linked List Class | Beendless ~ 快节奏,慢生活,无止境 -

    Design A Linked List Class

    For a given linked list, it has 3 common methods: GetByIndex, AddTo(Head/Tail/ToIndex), Delele. Similar to SQL’s CURD. Let’s see how to design a linked list class. 707. Design Linked List

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    type Node struct {
    Val int
    Next *Node
    }

    type MyLinkedList struct {
    virtualNode *Node
    size int
    }

    func Constructor() MyLinkedList {
    return MyLinkedList{&Node{}, 0}
    }

    func (this *MyLinkedList) Get(index int) int {
    if index < 0 || index >= this.size {
    return -1
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    return p.Next.Val
    }

    func (this *MyLinkedList) AddAtHead(val int) {
    this.virtualNode.Next = &Node{val, this.virtualNode.Next}
    this.size++
    }

    func (this *MyLinkedList) AddAtTail(val int) {
    p := this.virtualNode
    for ; p.Next != nil; p = p.Next {}
    p.Next = &Node{val, nil}
    this.size++
    }

    func (this *MyLinkedList) AddAtIndex(index int, val int) {
    if index > this.size {
    return
    }
    if index < 0 {
    index = 0
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    node := &Node{val, p.Next}
    p.Next = node
    this.size++
    }

    func (this *MyLinkedList) DeleteAtIndex(index int) {
    if index < 0 || index >= this.size {
    return
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    p.Next = p.Next.Next
    this.size--
    }

    Common Items Quick Search with Array and HashMap
    \ No newline at end of file +

    Design A Linked List Class

    For a given linked list, it has 3 common methods: GetByIndex, AddTo(Head/Tail/ToIndex), Delele. Similar to SQL’s CURD. Let’s see how to design a linked list class. 707. Design Linked List

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    type Node struct {
    Val int
    Next *Node
    }

    type MyLinkedList struct {
    virtualNode *Node
    size int
    }

    func Constructor() MyLinkedList {
    return MyLinkedList{&Node{}, 0}
    }

    func (this *MyLinkedList) Get(index int) int {
    if index < 0 || index >= this.size {
    return -1
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    return p.Next.Val
    }

    func (this *MyLinkedList) AddAtHead(val int) {
    this.virtualNode.Next = &Node{val, this.virtualNode.Next}
    this.size++
    }

    func (this *MyLinkedList) AddAtTail(val int) {
    p := this.virtualNode
    for ; p.Next != nil; p = p.Next {}
    p.Next = &Node{val, nil}
    this.size++
    }

    func (this *MyLinkedList) AddAtIndex(index int, val int) {
    if index > this.size {
    return
    }
    if index < 0 {
    index = 0
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    node := &Node{val, p.Next}
    p.Next = node
    this.size++
    }

    func (this *MyLinkedList) DeleteAtIndex(index int) {
    if index < 0 || index >= this.size {
    return
    }
    p := this.virtualNode
    for ; index > 0; index-- {
    p = p.Next
    }
    p.Next = p.Next.Next
    this.size--
    }

    Common Items Quick Search with Array and HashMap
    \ No newline at end of file diff --git a/docs/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/index.html b/docs/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/index.html index 656f414d8..41257ee55 100644 --- a/docs/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/index.html +++ b/docs/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/index.html @@ -1,13 +1,18 @@ -Common Items Quick Search with Array and HashMap | Beendless ~ 快节奏,慢生活,无止境 +Common Items Quick Search with Array and HashMap | Beendless ~ 快节奏,慢生活,无止境 -

    Common Items Quick Search with Array and HashMap

    Usually when you get a problem about searching the common items between multiple strings, the brute-force solution’s time complexity is usually too high. We can use hashmap to lower the time complexity.

    +

    Common Items Quick Search with Array and HashMap

    Usually when you get a problem about searching the common items between multiple strings, the brute-force solution’s time complexity is usually too high. We can use hashmap to lower the time complexity.

    242. Valid Anagram

    If we go with brute-force solution, the time complexity will be m * n. Let’s try with hashmap.

    a. Regular hashmap

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func isAnagram(s string, t string) bool {
    if len(s) != len(t) { // edge case quick solution
    return false
    }
    cache := make(map[byte]int)
    for i := range s { // Note: in Golang, when using range to iterate a string, you will get rune instead of byte
    if _, ok := cache[s[i]]; ok {
    cache[s[i]]++
    } else {
    cache[s[i]] = 1
    }
    }
    for i := range t {
    if _, ok := cache[t[i]]; ok {
    cache[t[i]]--
    if cache[t[i]] < 0 {
    return false
    }
    } else {
    return false
    }
    }
    return true
    }
    @@ -41,4 +46,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
    result := 0
    cache := make(map[int]int) // Since we can calculate the duplicated result, map value needs to be an integer
    for _, i := range nums1 {
    for _, j := range nums2 {
    cache[i + j]++
    }
    }
    for _, i := range nums3 {
    for _, j := range nums4 {
    result += cache[-i-j]
    }
    }
    return result
    }

    202. Happy Number

    Since we need to detect if it loops endlessly in a circle, it’s better to use a hashmap (set).

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func isHappy(n int) bool {
    cache := make(map[int]bool)
    isHappyNumber := func(n int) int {
    s := 0
    for n > 0 {
    t := n % 10
    s += t * 5
    n = n / 10
    }
    return s
    }

    // Simulate a set by flaging the calculated number before to detect the circle
    for n != 1 && !cache[n] {
    n, cache[n] = isHappyNumber(n), true
    }

    return n == 1
    }

    Two Pointers
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func isHappy(n int) bool {
    cache := make(map[int]bool)
    isHappyNumber := func(n int) int {
    s := 0
    for n > 0 {
    t := n % 10
    s += t * 5
    n = n / 10
    }
    return s
    }

    // Simulate a set by flaging the calculated number before to detect the circle
    for n != 1 && !cache[n] {
    n, cache[n] = isHappyNumber(n), true
    }

    return n == 1
    }
    Two Pointers
    \ No newline at end of file diff --git a/docs/2021/09/07/Two-Pointers/index.html b/docs/2021/09/07/Two-Pointers/index.html index 744fb4eec..47b9d8a85 100644 --- a/docs/2021/09/07/Two-Pointers/index.html +++ b/docs/2021/09/07/Two-Pointers/index.html @@ -1,13 +1,18 @@ -Two Pointers | Beendless ~ 快节奏,慢生活,无止境 +Two Pointers | Beendless ~ 快节奏,慢生活,无止境 -

    Two Pointers

      +

      Two Pointers

      1. Array Elements In-Placed Removal

      Let’s take a look at a easy problem on Leetcode 27. Remove Element. We will demonstrate how to remove an element from an array without allocating extra space for another array.

      @@ -17,7 +22,7 @@
      1. Squares of a Sorted Array
      -

      Here is another problem on Leetcode 977. Squares of a Sorted Array. The straight forward solution will be calculate the squares of the given array with an O(n) loop and then use fast sort to get a result O(). So the complexity will be O(n + ). Let’s review the sorted array again. For the squares of the given array, the maximum squred number can only exist on either left end or right end. It means if we have two pointers start at both ends, we can continus comparing the squred number and move the pointer inward, the pointers will meet at the minumum squred number. So the time complexity will be O(n)

      +

      Here is another problem on Leetcode 977. Squares of a Sorted Array. The straight forward solution will be calculate the squares of the given array with an O(n) loop and then use fast sort to get a result O(). So the complexity will be O(n + ). Let’s review the sorted array again. For the squares of the given array, the maximum squred number can only exist on either left end or right end. It means if we have two pointers start at both ends, we can continus comparing the squred number and move the pointer inward, the pointers will meet at the minumum squred number. So the time complexity will be O(n)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      func sortedSquares(nums []int) []int {
      length := len(nums)
      ret := make([]int, length, length)
      for i, j, k := 0, length - 1, length -1; k >= 0; k-- {
      squred_i := nums[i] * nums[i]
      squred_j := nums[j] * nums[j]
      if squred_j > squred_i {
      ret[k] = squred_j
      j--
      } else {
      ret[k] = squred_i
      i++
      }
      }
      return ret
      }

      Golang Playbook: https://play.golang.org/p/h_rFxkg42a4

      @@ -121,4 +126,4 @@
      1. 1047. Remove All Adjacent Duplicates In String
      -
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      func removeDuplicates(s string) string {
      bs := []byte(s)
      i := 0
      length := len(s)
      for j := 0; i < length; j++ {
      bs[i] = bs[j]
      if i > 0 && bs[i] == bs[i - 1] {
      i--
      } else {
      i++
      }
      }
      return string(bs[:i])
      }
      String Match with KMP Algorithm
      \ No newline at end of file +
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      func removeDuplicates(s string) string {
      bs := []byte(s)
      i := 0
      length := len(s)
      for j := 0; i < length; j++ {
      bs[i] = bs[j]
      if i > 0 && bs[i] == bs[i - 1] {
      i--
      } else {
      i++
      }
      }
      return string(bs[:i])
      }
    String Match with KMP Algorithm
    \ No newline at end of file diff --git a/docs/2021/09/09/String-Match-with-KMP-Algorithm/index.html b/docs/2021/09/09/String-Match-with-KMP-Algorithm/index.html index 119b68777..59ad05f79 100644 --- a/docs/2021/09/09/String-Match-with-KMP-Algorithm/index.html +++ b/docs/2021/09/09/String-Match-with-KMP-Algorithm/index.html @@ -1,13 +1,18 @@ -String Match with KMP Algorithm | Beendless ~ 快节奏,慢生活,无止境 +String Match with KMP Algorithm | Beendless ~ 快节奏,慢生活,无止境 -

    String Match with KMP Algorithm

    Search if a given string pattern (needle) is part of a target string (haystack) is a common problem. The naive approach is to use two nested loops with O(n * m) time complexity. KMP is a better way which has a better performance.

    +

    String Match with KMP Algorithm

    Search if a given string pattern (needle) is part of a target string (haystack) is a common problem. The naive approach is to use two nested loops with O(n * m) time complexity. KMP is a better way which has a better performance.

    Two keypoints to implement KMP algorithm:

    a. Generate LPS (Longest common proper Prefix and Suffix ) dictionary
    b. Use LPS dictionary to identify a better pointer position for next matching instead of steping back.

    28. Implement strStr()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    func strStr(haystack string, needle string) int {
    n, m := len(haystack), len(needle)
    if m == 0 {
    return 0
    }
    j := -1
    lps := getLPS(needle)
    for i := 0; i < n; i++ {
    for j >= 0 && haystack[i] != needle[j + 1] {
    j = lps[j]
    }
    if haystack[i] == needle[j + 1] {
    j++
    }
    if j == m - 1 {
    return i - m + 1
    }
    }
    return -1
    }

    func getLPS(s string) []int {
    length := len(s)
    j := -1
    lps := make([]int, length)
    lps[0] = -1
    for i := 1; i < length; i++ {
    for j >= 0 && s[i] != s[j + 1] {
    j = lps[j]
    }
    if s[i] == s[j + 1] {
    j++
    }
    lps[i] = j
    }
    return lps
    }
    @@ -32,4 +37,4 @@

    https://leetcode.com/problems/shortest-palindrome/discuss/60113/clean-kmp-solution-with-super-detailed-explanation
  • https://leetcode.com/problems/shortest-palindrome/solution/
  • -

    Design a Queue with Stack
    \ No newline at end of file +
    Design a Queue with Stack
    \ No newline at end of file diff --git a/docs/2021/09/11/Design-a-Queue-with-Stack/index.html b/docs/2021/09/11/Design-a-Queue-with-Stack/index.html index 7f7006770..82ed2dd0a 100644 --- a/docs/2021/09/11/Design-a-Queue-with-Stack/index.html +++ b/docs/2021/09/11/Design-a-Queue-with-Stack/index.html @@ -1,16 +1,21 @@ -Design a Queue with Stack | Beendless ~ 快节奏,慢生活,无止境 +Design a Queue with Stack | Beendless ~ 快节奏,慢生活,无止境 -

    Design a Queue with Stack

    232. Implement Queue using Stacks

    Since Queue is FIFO but Stack is FILO. If we need to use Stack to implement a Queue, we need to use at least two Stacks. So we use one stack which only handle Push operations, and another Stack which only handle Pop/Peek operations. And we move elements from the Pop only Stack to the other one when Pop/Peek get called. It will reverse the FILO stack elements sequence after that. So we get a FIFO sequence.

    +

    Design a Queue with Stack

    232. Implement Queue using Stacks

    Since Queue is FIFO but Stack is FILO. If we need to use Stack to implement a Queue, we need to use at least two Stacks. So we use one stack which only handle Push operations, and another Stack which only handle Pop/Peek operations. And we move elements from the Pop only Stack to the other one when Pop/Peek get called. It will reverse the FILO stack elements sequence after that. So we get a FIFO sequence.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    type Stack []int

    func (s *Stack)Empty() bool {
    return len(*s) == 0
    }

    func (s *Stack)Push(x int) {
    *s = append(*s, x)
    }

    func (s *Stack)Pop() int {
    var ret int
    if !s.Empty() {
    lastIndex := len(*s) - 1
    ret = (*s)[lastIndex]
    *s = (*s)[:lastIndex]
    }
    return ret
    }

    func (s *Stack)Peek() int {
    var ret int
    if !s.Empty() {
    ret = (*s)[len(*s) - 1]
    }
    return ret
    }

    type MyQueue struct {
    m, n *Stack
    }

    func Constructor() MyQueue {
    return MyQueue{
    &Stack{},
    &Stack{},
    }
    }

    func (q *MyQueue)Push(x int) {
    q.m.Push(x)
    }

    func (q *MyQueue)Pop() int {
    q.Peek()
    return q.n.Pop()
    }

    func (q *MyQueue)Peek() int {
    if q.n.Empty() {
    for !q.m.Empty() {
    q.n.Push(q.m.Pop())
    }
    }
    return q.n.Peek()
    }


    func (q *MyQueue)Empty() bool {
    return q.m.Empty() && q.n.Empty()
    }

    -
    Design a Stack with Queue
    \ No newline at end of file +
    Design a Stack with Queue
    \ No newline at end of file diff --git a/docs/2021/09/12/Design-a-Stack-with-Queue/index.html b/docs/2021/09/12/Design-a-Stack-with-Queue/index.html index be57ee37c..621f18ca6 100644 --- a/docs/2021/09/12/Design-a-Stack-with-Queue/index.html +++ b/docs/2021/09/12/Design-a-Stack-with-Queue/index.html @@ -1,12 +1,17 @@ -Design a Stack with Queue | Beendless ~ 快节奏,慢生活,无止境 +Design a Stack with Queue | Beendless ~ 快节奏,慢生活,无止境 -

    Design a Stack with Queue

    225. Implement Stack using Queues

    We can’t use the similar solution we did for Design a Queue with Stack. It is because unlike Stack, moving elements from one Queue to another one won’t change the sequence of elements. We have to pop out all previous elements added into the queue when adding a new element, in this way we can simulate a Stack.

    +

    Design a Stack with Queue

    225. Implement Stack using Queues

    We can’t use the similar solution we did for Design a Queue with Stack. It is because unlike Stack, moving elements from one Queue to another one won’t change the sequence of elements. We have to pop out all previous elements added into the queue when adding a new element, in this way we can simulate a Stack.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    type Queue []int

    func (q *Queue)Empty() bool {
    return len(*q) == 0
    }

    func (q *Queue)Push(x int) {
    *q = append(*q, x)
    }

    func (q *Queue)Pop() int {
    var ret int
    if !q.Empty() {
    ret = (*q)[0]
    *q = (*q)[1:]
    }
    return ret
    }

    func (q *Queue)Top() int {
    var ret int
    if !q.Empty() {
    ret = (*q)[0]
    }
    return ret
    }

    type MyStack struct {
    m *Queue
    }

    func Constructor() MyStack {
    return MyStack{
    &Queue{},
    }
    }

    func (s *MyStack) Empty() bool {
    return s.m.Empty()
    }

    func (s *MyStack) Top() int {
    return s.m.Top()
    }

    func (s *MyStack) Pop() int {
    return s.m.Pop()
    }

    func (s *MyStack) Push(x int) {
    n := len(*((*s).m))
    s.m.Push(x)
    for n > 0 {
    s.m.Push(s.m.Pop())
    n--
    }
    }

    -
    Query with Stack
    \ No newline at end of file +
    Query with Stack
    \ No newline at end of file diff --git a/docs/2021/09/12/Query-with-Stack/index.html b/docs/2021/09/12/Query-with-Stack/index.html index 094af6e01..5befc7467 100644 --- a/docs/2021/09/12/Query-with-Stack/index.html +++ b/docs/2021/09/12/Query-with-Stack/index.html @@ -1,13 +1,18 @@ -Query with Stack | Beendless ~ 快节奏,慢生活,无止境 +Query with Stack | Beendless ~ 快节奏,慢生活,无止境 -

    Query with Stack

    20. Valid Parentheses

    We can simply iterate over all items from the given string and compare the adjacent values each time with the help of stack before pushing the element in.

    +

    Query with Stack

    20. Valid Parentheses

    We can simply iterate over all items from the given string and compare the adjacent values each time with the help of stack before pushing the element in.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func isValid(s string) bool {
    bs := make([]byte, 0)
    bs = append(bs, s[0])
    dict := map[byte]byte{
    ']': '[',
    ')': '(',
    '}': '{',
    }
    for i := 1; i < len(s); i++ {
    if v, ok := dict[s[i]]; ok && len(bs) > 0 && v == bs[len(bs) - 1] {
    bs = bs[:len(bs) - 1]
    } else {
    bs = append(bs, s[i])
    }
    }
    return len(bs) == 0
    }

    1047. Remove All Adjacent Duplicates In String

    a. Use stack to iterate the string, similar to the parentheses validation one above.

    @@ -33,4 +38,4 @@

    Usually if the requirement is to get a min/max value, we can try dynamic programming.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func longestValidParentheses(s string) int {
    max := 0
    dp := make(int[], len(s)) // dp[i] denotes the valid parentheses string end with index i, it means if s[i] is left parentheses, dp[i] is 0
    for i := 1; i < len(s); i++ {
    if s[i] == ')' {
    if s[i - 1] == '(' { // for cases end with a valid parentheses .....()
    if i >= 2 {
    dp[i] = dp[i - 2] + 2
    } else {
    dp[i] = 2
    }
    } else if i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == ')' { // for cases end with two right parentheses .......))
    dp[i] = dp[i - 1] + 2
    if i - dp[i - 1] >= 2 {
    dp[i] += dp[i - dp[i - 1] - 2]
    }
    }
    if max < dp[i] {
    max = dp[i]
    }
    }
    }
    return max
    }
    -

    Heap and Heap Sort
    \ No newline at end of file +
    Heap and Heap Sort
    \ No newline at end of file diff --git a/docs/2021/09/13/Heap-and-Heap-Sort/index.html b/docs/2021/09/13/Heap-and-Heap-Sort/index.html index 89eabc2d5..0db9f9b43 100644 --- a/docs/2021/09/13/Heap-and-Heap-Sort/index.html +++ b/docs/2021/09/13/Heap-and-Heap-Sort/index.html @@ -1,13 +1,18 @@ -Heap and Heap Sort | Beendless ~ 快节奏,慢生活,无止境 +Heap and Heap Sort | Beendless ~ 快节奏,慢生活,无止境 -

    Heap and Heap Sort

    A Heap is a special Tree-based data structure in which the tree is a complete binary tree. Generally, there are two types of Heap: Max-Heap (root node is greater than its child nodes) and Min-Heap (root node is smaller than its child nodes).

    +

    Heap and Heap Sort

    A Heap is a special Tree-based data structure in which the tree is a complete binary tree. Generally, there are two types of Heap: Max-Heap (root node is greater than its child nodes) and Min-Heap (root node is smaller than its child nodes).

    Golang’s standard library shipped with a heap container. We can also use a slice to simulate a Heap. Let’s take Max-Heap as an example.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    type Heap []int

    func (h *Heap) Push(x int) {
    *h = append(*h, x)
    index := len(*h) - 1
    parent := (index - 1) / 2 // (index + 1) / 2 - 1, 1 based index node n, it's child is 2n and 2n + 1,
    for parent >= 0 && (*h)[index] > (*h)[parent] {
    (*)h[index], (*)h[parent] = (*)h[parent], (*)h[index]
    index = parent
    parent = (index - 1) / 2
    }
    }

    func (h *Heap) Pop() (int, bool) {
    var ret int
    if len(*h) > 0 {
    ret := (*h)[0]
    length := len(*h)
    (*h)[0] = (*h)(length - 1)
    parent := 0
    left := 2 * parent + 1
    for left < length - 1 {
    child := left
    if left + 1 < length - 1 && (*h)[left] < (*h)[left + 1]{
    child++
    }
    if (*h)[parent] < (*h)[child] {
    (*)h[parent], (*)h[child] = (*)h[child], (*)h[parent]
    parent = child
    left = 2 * parent + 1
    } else {
    break
    }
    }
    *h = (*h)[:length - 1]
    return ret, true
    }
    return ret, false
    }
    @@ -31,4 +36,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    func lastStoneWeight(stones []int) int {
    n := len(stones)
    heap := []int{}
    pushToHeap := func(value int) {
    heap = append(heap, value)
    index := len(heap) - 1
    for index > 0 {
    parent := (index - 1) / 2
    if heap[parent] < heap[index] {
    heap[parent], heap[index] = heap[index], heap[parent]
    index = parent
    } else {
    break
    }
    }
    }
    popFromHeap := func() int {
    value := heap[0]
    heap[0] = heap[len(heap) - 1]
    heap = heap[:len(heap) - 1]
    index := 0
    for index < len(heap) {
    left := index * 2 + 1
    right := index * 2 + 2
    if left < len(heap) && right >= len(heap) && heap[index] < heap[left] {
    heap[left], heap[index] = heap[index], heap[left]
    index = left
    } else if right < len(heap) && (heap[index] < heap[left] || heap[index] < heap[right]) {
    if heap[left] > heap[right] {
    heap[left], heap[index] = heap[index], heap[left]
    index = left
    } else {
    heap[right], heap[index] = heap[index], heap[right]
    index = right
    }
    } else {
    break
    }
    }
    return value
    }
    for i := 0; i < n; i++ {
    pushToHeap(stones[i])
    }
    for len(heap) > 1 {
    y := popFromHeap()
    x := popFromHeap()
    if x != y {
    pushToHeap(y - x)
    }
    }
    if len(heap) == 1 {
    return heap[0]
    }
    return 0
    }

    Tree Traversals DFS
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    func lastStoneWeight(stones []int) int {
    n := len(stones)
    heap := []int{}
    pushToHeap := func(value int) {
    heap = append(heap, value)
    index := len(heap) - 1
    for index > 0 {
    parent := (index - 1) / 2
    if heap[parent] < heap[index] {
    heap[parent], heap[index] = heap[index], heap[parent]
    index = parent
    } else {
    break
    }
    }
    }
    popFromHeap := func() int {
    value := heap[0]
    heap[0] = heap[len(heap) - 1]
    heap = heap[:len(heap) - 1]
    index := 0
    for index < len(heap) {
    left := index * 2 + 1
    right := index * 2 + 2
    if left < len(heap) && right >= len(heap) && heap[index] < heap[left] {
    heap[left], heap[index] = heap[index], heap[left]
    index = left
    } else if right < len(heap) && (heap[index] < heap[left] || heap[index] < heap[right]) {
    if heap[left] > heap[right] {
    heap[left], heap[index] = heap[index], heap[left]
    index = left
    } else {
    heap[right], heap[index] = heap[index], heap[right]
    index = right
    }
    } else {
    break
    }
    }
    return value
    }
    for i := 0; i < n; i++ {
    pushToHeap(stones[i])
    }
    for len(heap) > 1 {
    y := popFromHeap()
    x := popFromHeap()
    if x != y {
    pushToHeap(y - x)
    }
    }
    if len(heap) == 1 {
    return heap[0]
    }
    return 0
    }
    Tree Traversals DFS
    \ No newline at end of file diff --git a/docs/2021/09/13/Tree-Traversals-DFS/index.html b/docs/2021/09/13/Tree-Traversals-DFS/index.html index 908095194..305982779 100644 --- a/docs/2021/09/13/Tree-Traversals-DFS/index.html +++ b/docs/2021/09/13/Tree-Traversals-DFS/index.html @@ -1,13 +1,18 @@ -Tree Traversals DFS | Beendless ~ 快节奏,慢生活,无止境 +Tree Traversals DFS | Beendless ~ 快节奏,慢生活,无止境 -

    Tree Traversals DFS

    94. Binary Tree Inorder Traversal

    a. Recursive solution

    +

    Tree Traversals DFS

    94. Binary Tree Inorder Traversal

    a. Recursive solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func inorderTraversal(root *TreeNode) []int {
    result := []int{}
    if root != nil {
    if root.Left != nil {
    result = append(result, inorderTraversal(root.Left)...)
    }
    result = append(result, root.Val)
    if root.Right != nil {
    result = append(result, inorderTraversal(root.Right)...)
    }
    }
    return result
    }

    b. Iterative solution

    @@ -61,4 +66,4 @@

    332. Reconstruct Itinerary

    We are given a direct graph, and we need to get the node traversal result.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import "sort"
    func findItinerary(tickets [][]string) []string {
    ticketsMap := make(map[string][]string)
    for _, ticket := range tickets {
    ticketsMap[ticket[0]] = append(ticketsMap[ticket[0]], ticket[1])
    }
    for key := range ticketsMap {
    sort.Strings(ticketsMap[key])
    }
    path := []string{}
    var visit func(string)
    visit = func(from string) {
    for len(ticketsMap[from]) > 0 {
    to := ticketsMap[from][0]
    ticketsMap[from] = ticketsMap[from][1:]
    visit(to)
    }
    path = append(path, from)
    }
    visit("JFK")
    for i, j := 0, len(path) - 1; i < j; i, j = i + 1, j - 1 {
    path[i], path[j] = path[j], path[i]
    }
    return path
    }
    -
    Tree Traversals BFS
    \ No newline at end of file +
    Tree Traversals BFS
    \ No newline at end of file diff --git a/docs/2021/09/14/Tree-Traversals-BFS/index.html b/docs/2021/09/14/Tree-Traversals-BFS/index.html index 22d60e01e..8d600ae3a 100644 --- a/docs/2021/09/14/Tree-Traversals-BFS/index.html +++ b/docs/2021/09/14/Tree-Traversals-BFS/index.html @@ -1,13 +1,18 @@ -Tree Traversals BFS | Beendless ~ 快节奏,慢生活,无止境 +Tree Traversals BFS | Beendless ~ 快节奏,慢生活,无止境 -

    Tree Traversals BFS

    102. Binary Tree Level Order Traversal

    a. BFS solution

    +
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func maxDepth(root *TreeNode) int {
    return getDepth(root)
    }

    func getDepth(node *TreeNode) int {
    if node != nil {
    left := getDepth(node.Left)
    right := getDepth(node.Right)
    if left > right {
    return left + 1
    }
    return right + 1
    }
    return 0
    }
    Tree Properties
    \ No newline at end of file diff --git a/docs/2021/09/19/Tree-Properties/index.html b/docs/2021/09/19/Tree-Properties/index.html index ebb23b40d..df80bebe1 100644 --- a/docs/2021/09/19/Tree-Properties/index.html +++ b/docs/2021/09/19/Tree-Properties/index.html @@ -1,13 +1,18 @@ -Tree Properties | Beendless ~ 快节奏,慢生活,无止境 +Tree Properties | Beendless ~ 快节奏,慢生活,无止境 -

    Tree Properties

    101. Symmetric Tree

    a. DFS solution

    +

    Tree Properties

    101. Symmetric Tree

    a. DFS solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func isSymmetric(root *TreeNode) bool {
    return testSymmetric(root, root)
    }

    func testSymmetric(a, b *TreeNode) bool {
    if a == nil && b == nil {
    return true
    } else if a != nil && b != nil && a.Val == b.Val{
    return testSymmetric(a.Left, b.Right) && testSymmetric(a.Right, b.Left)
    }
    return false
    }

    b. BFS solution

    @@ -74,4 +79,4 @@

    https://github.com/go101/go101/wiki/How-to-perfectly-clone-a-slice%3F

    437. Path Sum III

    Based on the problem description, we need to find out all paths from all subtrees of the given tree which sum equals to the targetSum. There’s a pitfall as the edge case, once we got one path (which means the targetSum reaches to 0), we still need to continue the searching since the rest path below may get a total sum 0.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func pathSum(root *TreeNode, targetSum int) int {
    return targetPath(root, targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum)
    }

    func targetPath(root *TreeNode, targetSum int) int {
    if root != nil {
    restPath := targetPath(root.Left, targetSum - root.Val) + targetPath(root.right, targetSum - root.Val)
    if root.Val == targetSum {
    return 1 + restPath
    }
    return restPath
    }
    return 0
    }
    Construct and Update a Tree
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func pathSum(root *TreeNode, targetSum int) int {
    return targetPath(root, targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum)
    }

    func targetPath(root *TreeNode, targetSum int) int {
    if root != nil {
    restPath := targetPath(root.Left, targetSum - root.Val) + targetPath(root.right, targetSum - root.Val)
    if root.Val == targetSum {
    return 1 + restPath
    }
    return restPath
    }
    return 0
    }
    Construct and Update a Tree
    \ No newline at end of file diff --git a/docs/2021/09/23/Construct-and-Update-a-Tree/index.html b/docs/2021/09/23/Construct-and-Update-a-Tree/index.html index 03b59442f..4133b8893 100644 --- a/docs/2021/09/23/Construct-and-Update-a-Tree/index.html +++ b/docs/2021/09/23/Construct-and-Update-a-Tree/index.html @@ -1,13 +1,18 @@ -Construct and Update a Tree | Beendless ~ 快节奏,慢生活,无止境 +Construct and Update a Tree | Beendless ~ 快节奏,慢生活,无止境 -

    Construct and Update a Tree

    1008. Construct Binary Search Tree from Preorder Traversal

    Based on the preorder traversal definition for a BST, the first element in the slice is always coming from the root node, we can split the rest elements into two parts from the element which is no less than the root node for child nodes.

    +

    Construct and Update a Tree

    1008. Construct Binary Search Tree from Preorder Traversal

    Based on the preorder traversal definition for a BST, the first element in the slice is always coming from the root node, we can split the rest elements into two parts from the element which is no less than the root node for child nodes.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func bstFromPreorder(preorder []int) *TreeNode {
    var root *TreeNode
    length := len(preorder)
    if length > 0 {
    root = &TreeNode{}
    root.Val = preorder[0]
    i := 1
    for i < length {
    if preorder[i] >= root.Val {
    break
    }
    i++
    }
    root.Left = bstFromPreorder(preorder[1:i])
    root.Right = bstFromPreorder(preorder[i:])
    }
    return root
    }

    106. Construct Binary Tree from Inorder and Postorder Traversal

    The last element in postorder slice is the root node, with this information, we can split inorder to a left subtree and a right subtree. Since now we know the amount of nodes in the left subtree, we can go back to split the postorder list into two.

    @@ -25,4 +30,4 @@

    998. Maximum Binary Tree II

    With the idea from the above one, since Suppose b is a copy of a with the value val appended to it. , it means b can only be the root node or part of right subtree based on the tree construction rule.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func insertIntoMaxTree(root *TreeNode, val int) *TreeNode {
    if root != nil && root.Val > val {
    root.Right = insertIntoMaxTree(root.Right, val)
    return root
    }
    return &TreeNode{
    Val: val,
    Left: root,
    Right: nil,
    }
    }
    -

    617. Merge Two Binary Trees

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
    var root *TreeNode
    if root1 != nil || root2 != nil {
    if root1 == nil {
    root = root2
    } else if root2 == nil {
    root = root1
    } else {
    root = &TreeNode{
    Val: root1.Val + root2.Val,
    Left: mergeTrees(root1.Left, root2.Left),
    Right: mergeTrees(root1.Right, root2.Right),
    }
    }
    }
    return root
    }
    Search in Trees
    \ No newline at end of file +

    617. Merge Two Binary Trees

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
    var root *TreeNode
    if root1 != nil || root2 != nil {
    if root1 == nil {
    root = root2
    } else if root2 == nil {
    root = root1
    } else {
    root = &TreeNode{
    Val: root1.Val + root2.Val,
    Left: mergeTrees(root1.Left, root2.Left),
    Right: mergeTrees(root1.Right, root2.Right),
    }
    }
    }
    return root
    }
    Search in Trees
    \ No newline at end of file diff --git a/docs/2021/09/27/Modify Trees/index.html b/docs/2021/09/27/Modify Trees/index.html index 19d7d68ca..50f8d78fa 100644 --- a/docs/2021/09/27/Modify Trees/index.html +++ b/docs/2021/09/27/Modify Trees/index.html @@ -1,13 +1,18 @@ -Modify Trees | Beendless ~ 快节奏,慢生活,无止境 +Modify Trees | Beendless ~ 快节奏,慢生活,无止境 -

    Modify Trees

    108. Convert Sorted Array to Binary Search Tree

    Highed balanced means left nodes and right nodes have the minimized same size difference.

    +

    Modify Trees

    108. Convert Sorted Array to Binary Search Tree

    Highed balanced means left nodes and right nodes have the minimized same size difference.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    func sortedArrayToBST(nums []int) *TreeNode {
    if len(nums) == 0 {
    return nil
    }
    mid := len(nums) / 2
    node := &TreeNode{nums[mid], nil, nil}
    node.Left = sortedArrayToBST(nums[:mid])
    node.Right = sortedArrayToBST(nums[mid + 1:])
    return node
    }

    701. Insert into a Binary Search Tree

    Naive BST recursively traversal

    @@ -20,4 +25,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func trimBST(root *TreeNode, low int, high int) *TreeNode {
    if root != nil {
    if root.Val < low {
    return trimBST(root.Right, low, high)
    }
    if root.Val > high {
    return trimBST(root.Left, low, high)
    }
    root.Left = trimBST(root.Left, low, high)
    root.Right = trimBST(root.Right, low, high)
    }
    return root
    }

    538. Convert BST to Greater Tree

    Since Inorder BST is a sorted slice, for greater tree, we need to get a reversed slice, which means we can still follow the Inorder traversal of the tree but right child node first.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func convertBST(root *TreeNode) *TreeNode {
    sum := 0
    stack := []*TreeNode{}
    current := root
    for {
    if current != nil {
    stack = append(stack, current)
    current = current.Right
    } else if len(stack) > 0 {
    current = stack[len(stack) - 1]
    stack = stack[:len(stack) - 1]
    sum += current.Val
    current.Val = sum
    current = current.Left
    } else {
    break
    }
    }
    return root
    }

    Backtracking - Combinations
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func convertBST(root *TreeNode) *TreeNode {
    sum := 0
    stack := []*TreeNode{}
    current := root
    for {
    if current != nil {
    stack = append(stack, current)
    current = current.Right
    } else if len(stack) > 0 {
    current = stack[len(stack) - 1]
    stack = stack[:len(stack) - 1]
    sum += current.Val
    current.Val = sum
    current = current.Left
    } else {
    break
    }
    }
    return root
    }
    Backtracking - Combinations
    \ No newline at end of file diff --git a/docs/2021/09/27/Search in Trees/index.html b/docs/2021/09/27/Search in Trees/index.html index 6ccdf89d0..f1ac73531 100644 --- a/docs/2021/09/27/Search in Trees/index.html +++ b/docs/2021/09/27/Search in Trees/index.html @@ -1,13 +1,18 @@ -Search in Trees | Beendless ~ 快节奏,慢生活,无止境 +Search in Trees | Beendless ~ 快节奏,慢生活,无止境 -

    Search in Trees

    700. Search in a Binary Search Tree

    Naive BST query.

    +

    Search in Trees

    700. Search in a Binary Search Tree

    Naive BST query.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func searchBST(root *TreeNode, val int) *TreeNode {
    var ret *TreeNode
    current := root
    for current != nil {
    if current.Val == val {
    ret = current
    break
    } else if current.Val > val {
    current = current.Left
    } else {
    current = current.Right
    }
    }
    return ret
    }

    98. Validate Binary Search Tree

    Since Inorder Traversal a BST we will get a sorted list, we just need to compare the previous value with current value during the traversal.

    @@ -30,4 +35,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
    if root == nil || root == p || root == q { // edge case
    return root
    }
    left := lowestCommonAncestor(root.Left, p, q)
    right := lowestCommonAncestor(root.Right, p, q)
    if left != nil && right != nil { // Postorder Traversal
    return root
    } else if left == nil {
    return right
    }
    return left

    }

    235. Lowest Common Ancestor of a Binary Search Tree

    Since it’s a BST, we can compare the value to remove some unnecessary calculation.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
    if root != nil {
    if root.Val > p.Val && root.Val > q.Val {
    return lowestCommonAncestor(root.Left, p, q)
    }
    if root.Val < p.Val && root.Val < q.Val {
    return lowestCommonAncestor(root.Right, p, q)
    }
    }
    return root
    }

    Modify Trees
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
    if root != nil {
    if root.Val > p.Val && root.Val > q.Val {
    return lowestCommonAncestor(root.Left, p, q)
    }
    if root.Val < p.Val && root.Val < q.Val {
    return lowestCommonAncestor(root.Right, p, q)
    }
    }
    return root
    }
    Modify Trees
    \ No newline at end of file diff --git a/docs/2021/10/01/Backtracking - Chessboard/index.html b/docs/2021/10/01/Backtracking - Chessboard/index.html index cccd89a63..2557ab764 100644 --- a/docs/2021/10/01/Backtracking - Chessboard/index.html +++ b/docs/2021/10/01/Backtracking - Chessboard/index.html @@ -1,13 +1,18 @@ -Backtracking - Chessboard | Beendless ~ 快节奏,慢生活,无止境 +Backtracking - Chessboard | Beendless ~ 快节奏,慢生活,无止境 -

    Backtracking - Chessboard

    Backtracking can also be used to solve chessboard problems.

    +

    Backtracking - Chessboard

    Backtracking can also be used to solve chessboard problems.

    51. N-Queens

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    func solveNQueens(n int) [][]string {
    result := [][]string{}
    board := make([][]string, n)
    for i := 0; i < n; i++ {
    board[i] = make([]string, n)
    for j := 0; j < n; j++ {
    board[i][j] = "."
    }
    }
    isValid := func(row, col int) bool {
    for i := 0; i < row; i++ {
    if board[i][col] == "Q" {
    return false
    }
    }
    for i := 0; i < col; i++ {
    if board[row][i] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j >= 0; i, j = i - 1, j - 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j < n; i, j = i - 1, j + 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(row int) {
    if row == n {
    temp := make([]string, n)
    for i, boardRow := range board {
    temp[i] = strings.Join(boardRow, "")
    }
    result = append(result, temp)
    return
    }
    for col := 0; col < n; col++ {
    if isValid(row, col) {
    board[row][col] = "Q"
    backtracking(row + 1)
    board[row][col] = "."
    }
    }
    }
    backtracking(0)
    return result
    }

    52. N-Queens II

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    func totalNQueens(n int) int {
    result := 0
    board := make([][]string, n)
    for i := 0; i < n; i++ {
    board[i] = make([]string, n)
    for j := 0; j < n; j++ {
    board[i][j] = "."
    }
    }
    isValid := func(row, col int) bool {
    for i := 0; i < row; i++ {
    if board[i][col] == "Q" {
    return false
    }
    }
    for i := 0; i < col; i++ {
    if board[row][i] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j >= 0; i, j = i - 1, j - 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j < n; i, j = i - 1, j + 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(row int) {
    if row == n {
    result++
    return
    }
    for col := 0; col < n; col ++ {
    if isValid(row, col) {
    board[row][col] = "Q"
    backtracking(row + 1)
    board[row][col] = "."
    }
    }
    }
    backtracking(0)
    return result
    }
    @@ -24,4 +29,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    func canPartitionKSubsets(nums []int, k int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % k != 0 {
    return false
    }
    sort.Slice(nums, func(a, b int) bool {
    return a > b
    })
    target := sum / k
    n := len(nums)
    if nums[n - 1] > target {
    return false
    }
    for n > 0 && nums[n - 1] == target {
    n--
    k--
    }
    subsets := make([]int, k)
    var backtracking func(int) bool
    backtracking = func(index int) bool {
    if index == n {
    for _, subset := range subsets {
    if subset != target {
    return false
    }
    }
    return true
    }
    for i := 0; i < k; i++ {
    if subsets[i] + nums[index] <= target {
    subsets[i] += nums[index]
    if backtracking(index + 1) {
    return true
    }
    subsets[i] -= nums[index]
    }
    }
    return false
    }
    return backtracking(0)
    }

    Another faster backtracking solution is to accumulate the successful partition.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    func canPartitionKSubsets(nums []int, k int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % k != 0 {
    return false
    }
    target := sum / k
    n := len(nums)
    sort.Slice(nums, func(a, b int) bool { // Sort the slice by desc with a greedy way, so we can quickly get the target number
    return a > b
    })
    if nums[n - 1] > target {
    return false
    }
    for n > 0 && nums[n - 1] == target {
    n--
    k--
    }
    visited := make([]bool, n)
    var backtracking func(int, int, int) bool
    backtracking = func(index, partition, acc int) bool {
    if partition == k {
    return true
    }
    if acc == target {
    return backtracking(0, partition + 1, 0)
    }
    for i := index; i < n; i++ {
    if !visited[i] {
    visited[i] = true
    if backtracking(i + 1, partition, acc + nums[i]) {
    return true
    }
    visited[i] = false
    }
    }
    return false
    }
    return backtracking(0, 0, 0)
    }

    Greedy Problems - I
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    func canPartitionKSubsets(nums []int, k int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % k != 0 {
    return false
    }
    target := sum / k
    n := len(nums)
    sort.Slice(nums, func(a, b int) bool { // Sort the slice by desc with a greedy way, so we can quickly get the target number
    return a > b
    })
    if nums[n - 1] > target {
    return false
    }
    for n > 0 && nums[n - 1] == target {
    n--
    k--
    }
    visited := make([]bool, n)
    var backtracking func(int, int, int) bool
    backtracking = func(index, partition, acc int) bool {
    if partition == k {
    return true
    }
    if acc == target {
    return backtracking(0, partition + 1, 0)
    }
    for i := index; i < n; i++ {
    if !visited[i] {
    visited[i] = true
    if backtracking(i + 1, partition, acc + nums[i]) {
    return true
    }
    visited[i] = false
    }
    }
    return false
    }
    return backtracking(0, 0, 0)
    }
    Greedy Problems - I
    \ No newline at end of file diff --git a/docs/2021/10/01/Backtracking - Combinations/index.html b/docs/2021/10/01/Backtracking - Combinations/index.html index 57be7a3f7..90da2a027 100644 --- a/docs/2021/10/01/Backtracking - Combinations/index.html +++ b/docs/2021/10/01/Backtracking - Combinations/index.html @@ -1,13 +1,18 @@ -Backtracking - Combinations | Beendless ~ 快节奏,慢生活,无止境 +Backtracking - Combinations | Beendless ~ 快节奏,慢生活,无止境 -

    Backtracking - Combinations

    Backtracking is an algorithmic-technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing those solutions that fail to satisfy the constraints of the problem at any point of time (by time, here, is referred to the time elapsed till reaching any level of the search tree). Usually we can consider backtracking as DFS recursively traversal.

    +

    Backtracking - Combinations

    Backtracking is an algorithmic-technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing those solutions that fail to satisfy the constraints of the problem at any point of time (by time, here, is referred to the time elapsed till reaching any level of the search tree). Usually we can consider backtracking as DFS recursively traversal.

    Backtracking template

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func backtracking(...args) {
    if stop_condition {
    // Update the result set
    return
    }
    for i := range nodes_in_current_layer(...args) {
    // Down to next layer
    backtracking(...args, i + 1)
    // Go back to the upper layer
    }
    }

    77. Combinations

    We can’t use a naive bruth force algorithm to solve this one, since it’s almost impossible to write a N-layers nested for loop.

    @@ -32,4 +37,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import "strconv"

    func letterCombinations(digits string) []string {
    result := []string{}
    if len(digits) > 0 {
    digitsMap := [10]string {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
    }
    path := []byte{}
    var backtracking func(int)
    backtracking = func(index int) {
    if index == len(digits) {
    result = append(result, string(path))
    return
    }
    digit, _ := strconv.Atoi(string(digits[index]))
    for i := 0; i < len(digitsMap[digit]); i++ {
    path = append(path, digitsMap[digit][i])
    backtracking(index + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    }
    return result
    }

    40. Combination Sum II

    Since we can convert a combination backtracking problem to a DFS traversal problem, if we don’t want to have the duplicated combination result item, it means we can’t pick duplicated nodes from the same layer of a tree. According to the backtracking template, in side of the backtracking for-loop we are handling the same layer logic (push/pop). At this point, if the given candidates is a sorted slice, we just need to compare if the previous element equals to the current element in the same layer.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import "sort"
    func combinationSum2(candidates []int, target int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(candidates)
    sort.Ints(candidates)
    var backtracking func(int, int)
    backtracking = func(target, index int) {
    if target < 0 {
    return
    } else if target == 0 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if i > index && candidates[i] == candidates[i - 1] {
    continue
    }
    path = append(path, candidates[i])
    backtracking(target - candidates[i], i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(target, 0)
    return result
    }

    Backtracking - Partioning
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import "sort"
    func combinationSum2(candidates []int, target int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(candidates)
    sort.Ints(candidates)
    var backtracking func(int, int)
    backtracking = func(target, index int) {
    if target < 0 {
    return
    } else if target == 0 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if i > index && candidates[i] == candidates[i - 1] {
    continue
    }
    path = append(path, candidates[i])
    backtracking(target - candidates[i], i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(target, 0)
    return result
    }
    Backtracking - Partioning
    \ No newline at end of file diff --git a/docs/2021/10/01/Backtracking - Partitioning/index.html b/docs/2021/10/01/Backtracking - Partitioning/index.html index c1e107ac4..d7a27c158 100644 --- a/docs/2021/10/01/Backtracking - Partitioning/index.html +++ b/docs/2021/10/01/Backtracking - Partitioning/index.html @@ -1,14 +1,19 @@ -Backtracking - Partioning | Beendless ~ 快节奏,慢生活,无止境 +Backtracking - Partioning | Beendless ~ 快节奏,慢生活,无止境 -

    Backtracking - Partioning

    Partitioning is another classical problem which can be solved with backtracking algorithm.

    +

    Backtracking - Partioning

    Partitioning is another classical problem which can be solved with backtracking algorithm.

    131. Palindrome Partitioning

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func partition(s string) [][]string {
    result := [][]string{}
    path := []string{}
    length := len(s)
    isParlindrom := func(s string) bool {
    for i, j := 0, len(s) - 1; i < j; i, j := i + 1, j - 1 {
    if s[i] != s[j] {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if isParlindrom(s[index:i + 1]) {
    path = append(path, s[index: i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    backtracking(0)
    return result
    }

    93. Restore IP Addresses

    We need to consider the edge case that some numbers start with 0 since golang’s strconv.Atoi will convert those string to integer successfully.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import (
    "strings"
    "strconv"
    )

    func restoreIpAddresses(s string) []string {
    result := []string{}
    path := []string{}
    length := len(s)
    var backtracking func(int)
    backtracking = func(index int) {
    if index > length {
    return
    } else if len(path) == 4 {
    if index == length {
    result = append(result, strings.Join(path, "."))
    }
    return
    }
    for i := index; i < length; i++ {
    if i - index <= 2 {
    num, _ := strconv.Atoi(s[index:i + 1])
    if (i - index == 2 && num < 100) || (i - index == 1 && num < 10) {
    continue
    }
    if num < 256 {
    path = append(path, s[index:i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    }
    backtracking(0)
    return result
    }
    Backtracking - Subsets
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import (
    "strings"
    "strconv"
    )

    func restoreIpAddresses(s string) []string {
    result := []string{}
    path := []string{}
    length := len(s)
    var backtracking func(int)
    backtracking = func(index int) {
    if index > length {
    return
    } else if len(path) == 4 {
    if index == length {
    result = append(result, strings.Join(path, "."))
    }
    return
    }
    for i := index; i < length; i++ {
    if i - index <= 2 {
    num, _ := strconv.Atoi(s[index:i + 1])
    if (i - index == 2 && num < 100) || (i - index == 1 && num < 10) {
    continue
    }
    if num < 256 {
    path = append(path, s[index:i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    }
    backtracking(0)
    return result
    }
    Backtracking - Subsets
    \ No newline at end of file diff --git a/docs/2021/10/01/Backtracking - Subsets/index.html b/docs/2021/10/01/Backtracking - Subsets/index.html index e68a75b6d..75338a272 100644 --- a/docs/2021/10/01/Backtracking - Subsets/index.html +++ b/docs/2021/10/01/Backtracking - Subsets/index.html @@ -1,17 +1,22 @@ -Backtracking - Subsets | Beendless ~ 快节奏,慢生活,无止境 +Backtracking - Subsets | Beendless ~ 快节奏,慢生活,无止境 -

    Backtracking - Subsets

    Backtracking can also help us to get all subsets of a given slice. If Combination and Partitioning problems can be converted to get root-to-leaf paths during a tree DFS traversal, Subsets can be treated as getting all root-to-node paths during a tree DFS traversal.

    +

    Backtracking - Subsets

    Backtracking can also help us to get all subsets of a given slice. If Combination and Partitioning problems can be converted to get root-to-leaf paths during a tree DFS traversal, Subsets can be treated as getting all root-to-node paths during a tree DFS traversal.

    78. Subsets

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func subsets(nums []int) [][]int {
    result := [][]int{[]int{}}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    return
    }
    for i := 0; i < length; i++ {
    path = append(path, nums[i])
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }

    90. Subsets II

    It’s similar to #78, the only difference is we can’t have duplicated subsets, which means we can’t pick the same value at the same tree level during traversal.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import "sort"
    func subsetsWithDup(nums []int) [][]int {
    sort.Ints(nums)
    result := [][]int{[]int{}}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    return
    }
    for i := index; i < length; i++ {
    if i > index && nums[i] == nums[i - 1] {
    continue
    }
    path := append(path, nums[i])
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }

    491. Increasing Subsequences

    Since we can’t sort the given slice, so we have to use a hashmap / array to save the used nodes in the same layer.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    func findSubsequences(nums []int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if len(apth) == length {
    return
    }
    used := make(map[int]bool)
    for i := index; i < length; i++ {
    if (len(path) > 0 && path[len(path) - 1] > nums[i]) || used[nums[i]] {
    continue
    }
    used[nums[i]] = true
    path = append(path, nums[i])
    if len(path) >= 2 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    }
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }
    Backtracking - Chessboard
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    func findSubsequences(nums []int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if len(apth) == length {
    return
    }
    used := make(map[int]bool)
    for i := index; i < length; i++ {
    if (len(path) > 0 && path[len(path) - 1] > nums[i]) || used[nums[i]] {
    continue
    }
    used[nums[i]] = true
    path = append(path, nums[i])
    if len(path) >= 2 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    }
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }
    Backtracking - Chessboard
    \ No newline at end of file diff --git a/docs/2021/10/03/Greedy Problems I/index.html b/docs/2021/10/03/Greedy Problems I/index.html index 5c4d6b3e9..5d16b013c 100644 --- a/docs/2021/10/03/Greedy Problems I/index.html +++ b/docs/2021/10/03/Greedy Problems I/index.html @@ -1,13 +1,18 @@ -Greedy Problems - I | Beendless ~ 快节奏,慢生活,无止境 +Greedy Problems - I | Beendless ~ 快节奏,慢生活,无止境 -

    Greedy Problems - I

    Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are best fit for Greedy.

    +

    Greedy Problems - I

    Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are best fit for Greedy.

    455. Assign Cookies

    If every child is content, then all children are content. So local optimal leads to a global optimal solution. We can use greedy. Now we want to make more child happy, we can use greedy algorithm to give the children whose gratitude is lower first.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import "sort"
    func findContentChildren(g []int, s []int) int {
    sort.Ints(g)
    sort.Ints(s)
    result := 0
    for i, j := 0, 0; i < len(g) && j < len(s); j++{
    if g[i] <= s[i] {
    i++
    result++
    }
    }
    return result
    }
    @@ -38,4 +43,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func maxProfit(prices []int) int {
    result := 0
    peak := prices[0]
    valley := prices[0]
    length := len(prices)
    for i := 0; i < length - 1; {
    for i < length - 1 && prices[i] >= prices[i + 1] {
    i++
    }
    valley = prices[i]
    for i < length - 1 && prices[i] <= prices[i + 1] {
    i++
    }
    peak = prices[i]
    result += peak - valley
    }
    return result
    }

    c. Dynamic programming

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func maxProfit(prices []int) int {
    length := len(prices)
    dp := make([][2]int, length)
    // dp[i][0] on day i we are holding stock
    // dp[i][1] on day i we don't have stock
    dp[0] = [2]int{-prices[0], 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < length; i++ {
    // stock we got from day i - 1, or stock we are going to buy on day i
    dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
    // we don't have stock from day i - 1, or we are going to sell stock we got from day i - 1
    dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
    }
    return max(dp[length - 1][0], dp[length - 1][1])
    }

    JumpGame Problems
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func maxProfit(prices []int) int {
    length := len(prices)
    dp := make([][2]int, length)
    // dp[i][0] on day i we are holding stock
    // dp[i][1] on day i we don't have stock
    dp[0] = [2]int{-prices[0], 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < length; i++ {
    // stock we got from day i - 1, or stock we are going to buy on day i
    dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
    // we don't have stock from day i - 1, or we are going to sell stock we got from day i - 1
    dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
    }
    return max(dp[length - 1][0], dp[length - 1][1])
    }
    JumpGame Problems
    \ No newline at end of file diff --git a/docs/2021/10/03/JumpGame Problems/index.html b/docs/2021/10/03/JumpGame Problems/index.html index 08d8df1f0..f59ba7730 100644 --- a/docs/2021/10/03/JumpGame Problems/index.html +++ b/docs/2021/10/03/JumpGame Problems/index.html @@ -1,13 +1,18 @@ -JumpGame Problems | Beendless ~ 快节奏,慢生活,无止境 +JumpGame Problems | Beendless ~ 快节奏,慢生活,无止境 -

    JumpGame Problems

    55. Jump Game

    a. Greedy solutions

    +

    JumpGame Problems

    55. Jump Game

    a. Greedy solutions

    At each step, a greedy jump can give us the local optimal furthest solution. Our global solution can be found in if we always take the greedy jump.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func canJump(nums []int) bool {
    distance := 0
    length := len(nums)
    for i := 0; i <= distance; i++ { // Note: here we use distance to control which items we can check
    if distance < i + nums[i] {
    distance = i + nums[i]
    }
    if distance >= length - 1 {
    return true
    }
    }
    return false
    }
    @@ -53,4 +58,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    func canReach(s string, minJump int, maxJump int) bool {
    queue := []int{0}
    length := len(s)
    visited := make(map[int]bool)
    visited[0] = true
    edge := 0
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for len(queue) > 0 {
    index := queue[0]
    if index == length - 1 {
    return true
    }
    queue = queue[1:]
    left := index + minJump
    right := min(length - 1, index + maxJump)
    for i := max(edge + 1, left); i <= right; i++ {
    if s[i] == '0' && !visited[i]{
    visited[i] = true
    queue = append(queue, i)
    }
    }
    edge = right
    }
    return false
    }

    b. Two pointers

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    func canReach(s string, minJump int, maxJump int) bool {
    length := len(s)
    if s[length - 1] == '0' {
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    canVisit := make(map[int]bool)
    canVisit[0] = true
    edge := 0
    for i := 0; i <= edge && i < length; i++ {
    if canVisit[i] {
    left := i + minJump
    right := min(length - 1, i + maxJump)
    for j := max(left, edge + 1); j <= right; j++ {
    if s[j] == '0' {
    canVisit[j] = true
    if j == length - 1 {
    return true
    }
    }
    }
    edge = right
    }
    }
    }
    return false
    }

    Greedy Problems - II
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    func canReach(s string, minJump int, maxJump int) bool {
    length := len(s)
    if s[length - 1] == '0' {
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    canVisit := make(map[int]bool)
    canVisit[0] = true
    edge := 0
    for i := 0; i <= edge && i < length; i++ {
    if canVisit[i] {
    left := i + minJump
    right := min(length - 1, i + maxJump)
    for j := max(left, edge + 1); j <= right; j++ {
    if s[j] == '0' {
    canVisit[j] = true
    if j == length - 1 {
    return true
    }
    }
    }
    edge = right
    }
    }
    }
    return false
    }
    Greedy Problems - II
    \ No newline at end of file diff --git a/docs/2021/10/05/Greedy Problems II/index.html b/docs/2021/10/05/Greedy Problems II/index.html index 4195fa103..62fd2c27c 100644 --- a/docs/2021/10/05/Greedy Problems II/index.html +++ b/docs/2021/10/05/Greedy Problems II/index.html @@ -1,13 +1,18 @@ -Greedy Problems - II | Beendless ~ 快节奏,慢生活,无止境 +Greedy Problems - II | Beendless ~ 快节奏,慢生活,无止境 -

    Greedy Problems - II

    1005. Maximize Sum Of Array After K Negations

    To get a maximum sum, we need to convert as many negative numbers to positive ones. If there is still an odd times of converting number left, we just need to convert the smallest positive number to a negative one

    +

    Greedy Problems - II

    1005. Maximize Sum Of Array After K Negations

    To get a maximum sum, we need to convert as many negative numbers to positive ones. If there is still an odd times of converting number left, we just need to convert the smallest positive number to a negative one

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func largestSumAfterKNegations(nums []int, k int) int {
    sort.Ints(nums)
    i := 0
    for i < k && i < len(nums) {
    if nums[i] < 0 {
    nums[i] = -nums[i]
    i++
    } else {
    break
    }
    }
    if i < k && (k - i) % 2 == 1 {
    sort.Ints(nums)
    nums[0] = -nums[0]
    }
    result := 0
    for _, num := range nums {
    result += num
    }
    return result
    }

    134. Gas Station

    Several cases:
    1) If the total amount of gas is less than the total amount of the cost, we can’t make a round trip
    2) Given an arbitrary start point i, and at i we have gas[i] in the tank. Let’s start at this point and accumulate the gas we left in the tank. If at point i + k the acculation is negative, it means we can’t reach from any point in beteeen [i, i + k - 1) to point k. So we can quickly start from i + k + 1 instead of i + 1.

    @@ -29,4 +34,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func findMinArrowShots(points [][]int) int {
    sort.Slice(points, func(a, b int) bool {
    return points[a][0] < points[b][0]
    })
    result := 1
    for i := 1; i < len(points); i++ {
    if points[i][0] > points[i - 1][1] {
    result++
    } else if points[i][1] > points[i - 1][1] {
    points[i][1] = points[i - 1][1]
    }
    }
    return result

    }

    435. Non-overlapping Intervals

    This one is a similar problem as #452. An intuition to solve this kind of problem is sort if first. Since all line segments have two points, we have two choices to sort it. The local optimal to find the interval is the end of current segment should have a distance between the next one’s start point. With this in mind, we can quickly get the total of intervals. So if we sort by the end point, we can iterate from left to right. Otherwise, we need to reverse the iteration order.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func eraseOverlapIntervals(intervals [][]int) int {
    sort.Slice(intervals, func(a, b int) bool {
    return intervals[a][1] < intervals[b][1]
    })
    end := intervals[0][1]
    count := 1
    for i := 1; i < len(intervals); i++ {
    if end <= intervals[i][0] {
    count++
    end = intervals[i][1]
    }
    }
    return len(intervals) - count
    }

    Greedy Problems - III
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func eraseOverlapIntervals(intervals [][]int) int {
    sort.Slice(intervals, func(a, b int) bool {
    return intervals[a][1] < intervals[b][1]
    })
    end := intervals[0][1]
    count := 1
    for i := 1; i < len(intervals); i++ {
    if end <= intervals[i][0] {
    count++
    end = intervals[i][1]
    }
    }
    return len(intervals) - count
    }
    Greedy Problems - III
    \ No newline at end of file diff --git a/docs/2021/10/06/Dynamic Programming I/index.html b/docs/2021/10/06/Dynamic Programming I/index.html index 8dbb6e884..bf0e45e71 100644 --- a/docs/2021/10/06/Dynamic Programming I/index.html +++ b/docs/2021/10/06/Dynamic Programming I/index.html @@ -1,13 +1,18 @@ -Dynamic Programming I | Beendless ~ 快节奏,慢生活,无止境 +Dynamic Programming I | Beendless ~ 快节奏,慢生活,无止境 -

    Dynamic Programming I

    Dynamic Programming (commonly referred to as DP) is an algorithmic technique for solving a problem by recursively breaking it down into simpler subproblems and using the fact that the optimal solution to the overall problem depends upon the optimal solution to it’s individual subproblems. Here is an interesting Quora question How should I explain dynamic programming to a 4-year-old?.

    +

    Dynamic Programming I

    Dynamic Programming (commonly referred to as DP) is an algorithmic technique for solving a problem by recursively breaking it down into simpler subproblems and using the fact that the optimal solution to the overall problem depends upon the optimal solution to it’s individual subproblems. Here is an interesting Quora question How should I explain dynamic programming to a 4-year-old?.

    509. Fibonacci Number

    a. Recursive solution

    1
    2
    3
    4
    5
    6
    7
    8
    func fib(n int) int {
    if n < 2 {
    return n
    }
    fib0 := fib(n - 2)
    fib1 := fib(n - 1)
    return fib0 + fib1
    }
    @@ -45,4 +50,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func integerBreak(n int) int {
    dp := make([]int, n + 1)
    dp[1] = 1
    dp[2] = 1
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 3; i <= n; i++ {
    for j := 1; j < i; j++ {
    two := j * (i - j)
    twoMore := j * dp[i - j]
    dp[i] = max(dp[i], max(two, twoMore))
    }
    }
    return dp[n]
    }

    96. Unique Binary Search Trees

    Based on the BST specs, we can get the state transition function dp[i] = dp[j] * dp[i - j - 1], here dp[i] denotes when i is set to the root node, we have j nodes on left child and i - j - 1 on right child. Note here the base case is 1. If there’s 0 nodes on left tree, it means we can construct the left tree in one uniq way.

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func numTrees(n int) int {
    if n < 3 {
    return n
    }
    dp := make([]int, n + 1)
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
    for j := 0; j < i; j++ {
    dp[i] += dp[j] & dp[i - j - 1]
    }
    }
    return dp[n]
    }

    Knapsack Problems I
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func numTrees(n int) int {
    if n < 3 {
    return n
    }
    dp := make([]int, n + 1)
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
    for j := 0; j < i; j++ {
    dp[i] += dp[j] & dp[i - j - 1]
    }
    }
    return dp[n]
    }
    Knapsack Problems I
    \ No newline at end of file diff --git a/docs/2021/10/06/Greedy Problems III/index.html b/docs/2021/10/06/Greedy Problems III/index.html index 6c413f671..d7676fbed 100644 --- a/docs/2021/10/06/Greedy Problems III/index.html +++ b/docs/2021/10/06/Greedy Problems III/index.html @@ -1,13 +1,18 @@ -Greedy Problems - III | Beendless ~ 快节奏,慢生活,无止境 +Greedy Problems - III | Beendless ~ 快节奏,慢生活,无止境 -

    Greedy Problems - III

    56. Merge Intervals

    Similar to other sgement related problems. The first thing we need to do is to sort the slice. Once we have a sorted segment slice, we can iterate over all items and merge them. Note there is one edge case we need to cover after the iteration, either we merged all segments into one or the last one can’t be merged into the previous segment.

    +

    Greedy Problems - III

    56. Merge Intervals

    Similar to other sgement related problems. The first thing we need to do is to sort the slice. Once we have a sorted segment slice, we can iterate over all items and merge them. Note there is one edge case we need to cover after the iteration, either we merged all segments into one or the last one can’t be merged into the previous segment.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func merge(intervals [][]int) [][]int {
    sort.Slice(intervals, func(a, b int) bool {
    return intervals[a][0] < intervals[b][0]
    })
    result := []int{}
    start := intervals[0][0]
    end := intervals[0][1]
    for i := 0; i < len(intervals); i++ {
    if end < intervals[i][0] {
    result = append(result, []int{start, end})
    start = intervals[i][0]
    end = intervals[i][1]
    } else if end < intervals[i][1] {
    end = intervals[i][1]
    }
    }
    result = append(result, []int{start, end})
    return result
    }
    -

    763. Partition Labels

    738. Monotone Increasing Digits

    968. Binary Tree Cameras

    Dynamic Programming I
    \ No newline at end of file +

    763. Partition Labels

    738. Monotone Increasing Digits

    968. Binary Tree Cameras

    Dynamic Programming I
    \ No newline at end of file diff --git a/docs/2021/10/07/Knapsack Problem I/index.html b/docs/2021/10/07/Knapsack Problem I/index.html index db3b7feca..d4e0514bc 100644 --- a/docs/2021/10/07/Knapsack Problem I/index.html +++ b/docs/2021/10/07/Knapsack Problem I/index.html @@ -1,13 +1,18 @@ -Knapsack Problems I | Beendless ~ 快节奏,慢生活,无止境 +Knapsack Problems I | Beendless ~ 快节奏,慢生活,无止境 -

    Knapsack Problems I

    The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.

    +

    Knapsack Problems I

    The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.

    416. Partition Equal Subset Sum

    We can quickly get the result if the sum is an odd number. If the sum is an even number s, it means we need to find some items in the slice which can get a sum to s / 2. Now the problem becomes a classical 0-1 knapsack problem.

    a. Classical 0-1 knapsack solution

    Denote dp[i][j] as if we can construct a sum j from the first i items. So the state transition function is dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]. The value is determined by:

    @@ -54,4 +59,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    // dp[i] = // Initial value based on the problem, could be 0 for total solutions counting or min/max value to get the maximum/minimum expectation
    for i := 0; i < len(nums); i++ {
    for j := nums[i]; j <= amount; j++ {
    // state transition function
    // dp[j] += dp[j - nums[i]]
    // dp[j] = min(dp[j], dp[j - nums[i]] + nums[i])
    }
    }

    full knapsack template to get the permutation of items

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    // dp[i] = // Initial value based on the problem, could be 0 for total solutions counting or min/max value to get the maximum/minimum expectation
    for j := 0; j <= amount; j++ {
    for i := 0; i < len(nums); i++ {
    // state transition function
    // dp[j] += dp[j - nums[i]]
    // dp[j] = min(dp[j], dp[j - nums[i]] + nums[i])
    }
    }

    Dynamic Programming II
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    // dp[i] = // Initial value based on the problem, could be 0 for total solutions counting or min/max value to get the maximum/minimum expectation
    for j := 0; j <= amount; j++ {
    for i := 0; i < len(nums); i++ {
    // state transition function
    // dp[j] += dp[j - nums[i]]
    // dp[j] = min(dp[j], dp[j - nums[i]] + nums[i])
    }
    }
    Dynamic Programming II
    \ No newline at end of file diff --git a/docs/2021/10/08/Dynamic Programming II/index.html b/docs/2021/10/08/Dynamic Programming II/index.html index 1c96eedbf..1c1ee6bf2 100644 --- a/docs/2021/10/08/Dynamic Programming II/index.html +++ b/docs/2021/10/08/Dynamic Programming II/index.html @@ -1,13 +1,18 @@ -Dynamic Programming II | Beendless ~ 快节奏,慢生活,无止境 +Dynamic Programming II | Beendless ~ 快节奏,慢生活,无止境 -

    Dynamic Programming II

    494. Target Sum

    a. Brute-force DFS recursive solution

    +
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func rob(root *TreeNode) int {
    cache := make(map[*TreeNode][2]int)
    var dfs func(*TreeNode) [2]int
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    dfs = func(root *TreeNode) [2]int {
    if root == nil {
    return [2]int{0, 0}
    }
    if value, ok := cache[root]; ok {
    return value
    }
    rootValue := root.Val
    leftValue := dfs(root.Left)
    rightValue := dfs(root.Right)
    childValue := max(leftValue[0], leftValue[1]) + max(rightValue[0], rightValue[1])
    cache[root] = [2]int{rootValue + leftValue[1] + rightValue[1], childValue}
    return cache[root]
    }
    value := dfs(root)
    return max(value[0], value[1])
    }
    Knapsack Problems II
    \ No newline at end of file diff --git a/docs/2021/10/09/Knapsack Problem II/index.html b/docs/2021/10/09/Knapsack Problem II/index.html index 29dfa915b..6494d51d6 100644 --- a/docs/2021/10/09/Knapsack Problem II/index.html +++ b/docs/2021/10/09/Knapsack Problem II/index.html @@ -1,13 +1,18 @@ -Knapsack Problems II | Beendless ~ 快节奏,慢生活,无止境 +Knapsack Problems II | Beendless ~ 快节奏,慢生活,无止境 -

    Knapsack Problems II

    377. Combination Sum IV

    This is also a full knapsack problem. It looks similar to the coins change ii, but the difference here is that we need to get the permutation of the solutions instead of combination. So in this case we need to iterate the knapsack space first, then iterate the items.

    +

    Knapsack Problems II

    377. Combination Sum IV

    This is also a full knapsack problem. It looks similar to the coins change ii, but the difference here is that we need to get the permutation of the solutions instead of combination. So in this case we need to iterate the knapsack space first, then iterate the items.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func combinationSum4(nums []int, target int) int {
    dp := make([]int, target + 1)
    dp[0] = 1
    for i := 1; i <= target; i++ {
    for j := 0; j < len(nums); j++ {
    if i >= nums[j] {
    dp[i] += dp[i - nums[j]]
    }
    }
    }
    return dp[target]
    }

    279. Perfect Squares

    This is also a full knapsack problem. We can consider all squares not greater than the given n as items, n as the knapsack total capacity, and we can reuse all items to fill the knapsack. To get the minimal items, the state transition function is dp[i] = min(dp[i], dp[i - j] + 1

    @@ -20,4 +25,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool, len(s) + 1)
    dp[0] = true
    for i := 1; i <= len(s); i++ {
    for j := 0; j < len(wordDict); j++ {
    if i >= wordDict[j] {
    dp[i] = dp[i] || (dp[i - len(wordDict[j])] && wordDict[j] == s[i - len(wordDict[j]):i])
    }
    }
    }
    return dp[len(s)]
    }

    We can also optimize it with a hashmap to store all words

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool, len(s) + 1)
    hash := make(map[string]bool)
    for _, word := range wordDict {
    hash[word] = true
    }
    dp[0] = true
    for i := 1; i <= len(s); i++ {
    for j := 0; j < i; j++ {
    dp[i] = dp[i] || (dp[j] && hash[s[j:i]])
    }
    }
    return dp[len(s)]
    }

    Stock Exchange Problems
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool, len(s) + 1)
    hash := make(map[string]bool)
    for _, word := range wordDict {
    hash[word] = true
    }
    dp[0] = true
    for i := 1; i <= len(s); i++ {
    for j := 0; j < i; j++ {
    dp[i] = dp[i] || (dp[j] && hash[s[j:i]])
    }
    }
    return dp[len(s)]
    }
    Stock Exchange Problems
    \ No newline at end of file diff --git a/docs/2021/10/12/Stock Exchange Problems/index.html b/docs/2021/10/12/Stock Exchange Problems/index.html index a43d7b20a..ff4814979 100644 --- a/docs/2021/10/12/Stock Exchange Problems/index.html +++ b/docs/2021/10/12/Stock Exchange Problems/index.html @@ -1,13 +1,18 @@ -Stock Exchange Problems | Beendless ~ 快节奏,慢生活,无止境 +Stock Exchange Problems | Beendless ~ 快节奏,慢生活,无止境 -

    Stock Exchange Problems

    121. Best Time to Buy and Sell Stock

    a. Two pointers greedy solution.

    +

    Stock Exchange Problems

    121. Best Time to Buy and Sell Stock

    a. Two pointers greedy solution.

    Since the profit is defined by the current price and the minimum price before today. So we can have one pointer holds the minimum price so far, and another pointer holds the max price so far, with the lowerest peak from the left and highest peak from the right, we can get the maximum profit.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func maxProfit(prices []int) int {
    profit := 0
    for min, i := 100001, 0; i < len(prices); i++ {
    if min > prices[i] {
    min = prices[i]
    }
    if prices[i] - min > profit {
    profit = prices[i] - min
    }
    }
    return profit
    }
    @@ -67,4 +72,4 @@

    714. Best Time to Buy and Sell Stock with Transaction Fee

    Same like #122, we just need to process the transaction fee when buying a new stock

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func maxProfit(prices []int, fee int) int {
    n := len(prices)
    dp := make([][2]int, n)
    dp[0] = [2]int{-prices[0]-fee, 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i] - fee)
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
    }
    return dp[n-1][1]
    }
    Dynamic Programming III
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func maxProfit(prices []int, fee int) int {
    n := len(prices)
    dp := make([][2]int, n)
    dp[0] = [2]int{-prices[0]-fee, 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i] - fee)
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
    }
    return dp[n-1][1]
    }
    Dynamic Programming III
    \ No newline at end of file diff --git a/docs/2021/10/13/Dynamic Programming III/index.html b/docs/2021/10/13/Dynamic Programming III/index.html index 61b8a427d..169690647 100644 --- a/docs/2021/10/13/Dynamic Programming III/index.html +++ b/docs/2021/10/13/Dynamic Programming III/index.html @@ -1,13 +1,18 @@ -Dynamic Programming III | Beendless ~ 快节奏,慢生活,无止境 +Dynamic Programming III | Beendless ~ 快节奏,慢生活,无止境 -

    Dynamic Programming III

    300. Longest Increasing Subsequence

    If we define dp[i] as the longest increasing subsequence of [0, i]. Then dp[i] >= 1. And the state transition function is dp[i] = max(dp[i], dp[j] + 1) here j ∈ [0, i).

    +

    Dynamic Programming III

    300. Longest Increasing Subsequence

    If we define dp[i] as the longest increasing subsequence of [0, i]. Then dp[i] >= 1. And the state transition function is dp[i] = max(dp[i], dp[j] + 1) here j ∈ [0, i).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func lengthOfLIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    dp[0] = 1
    result = 1
    for i := 1; i < n; i++ {
    dp[i] = 1
    for j := 0; j < i; j++ {
    if nums[i] > nums[j] {
    dp[i] = max(dp[i], dp[j] + 1)
    }
    }
    result = max(result, dp[i])
    }
    return result
    }

    674. Longest Continuous Increasing Subsequence

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func findLengthOfLCIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    dp[0] = 1
    result := 1
    for i := 1; i < n; i++ {
    if nums[i] > nums[i - 1] {
    dp[i] = dp[i - 1] + 1
    } else {
    dp[i] = 1
    }
    if result < dp[i] {
    result = dp[i]
    }
    }
    return result
    }
    @@ -29,4 +34,4 @@

    b. Dynamic Programming

    Let’s use dp[i][j] to denote the subsequence length ends with i and j. So the state transition function is dp[i][j] = s[i] == s[j] ? dp[i - 1][j - 1] + 1 : dp[i-1][j - 1]

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func isSubsequence(s string, t string) bool {
    m := len(s)
    n := len(t)
    if m > n {
    return false
    }
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    dp[i][j] = dp[i - 1][j - 1]
    if s[i - 1] == t[j - 1] {
    dp[i][j]++
    }
    }
    }
    return dp[m][n] == m
    }

    Dynamic Programming IV
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func isSubsequence(s string, t string) bool {
    m := len(s)
    n := len(t)
    if m > n {
    return false
    }
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    dp[i][j] = dp[i - 1][j - 1]
    if s[i - 1] == t[j - 1] {
    dp[i][j]++
    }
    }
    }
    return dp[m][n] == m
    }
    Dynamic Programming IV
    \ No newline at end of file diff --git a/docs/2021/10/14/Dynamic Programming IV/index.html b/docs/2021/10/14/Dynamic Programming IV/index.html index 2067374d2..22b33b5b6 100644 --- a/docs/2021/10/14/Dynamic Programming IV/index.html +++ b/docs/2021/10/14/Dynamic Programming IV/index.html @@ -1,13 +1,18 @@ -Dynamic Programming IV | Beendless ~ 快节奏,慢生活,无止境 +Dynamic Programming IV | Beendless ~ 快节奏,慢生活,无止境 -

    Dynamic Programming IV

    115. Distinct Subsequences

    Let’s denote dp[i][j] as the amount of distinct subsequences in s[:i] which can construct t[:j]. So we can get the state transition function dp[i][j] = s[i - 1] == t[i - 1] ? (dp[i - 1][j - 1] + dp[i - 1][j] : dp[i-1][j]. Also for the initial value, dp[i][0] needs to be 0 (it means there’s one way we can construct empty string from s[:i]).

    +

    Dynamic Programming IV

    115. Distinct Subsequences

    Let’s denote dp[i][j] as the amount of distinct subsequences in s[:i] which can construct t[:j]. So we can get the state transition function dp[i][j] = s[i - 1] == t[i - 1] ? (dp[i - 1][j - 1] + dp[i - 1][j] : dp[i-1][j]. Also for the initial value, dp[i][0] needs to be 0 (it means there’s one way we can construct empty string from s[:i]).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func numDistinct(s string, t string) int {
    m := len(s)
    n := len(t)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    dp[i][0] = 1
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    if s[i - 1] == t[j - 1] {
    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]
    } else {
    dp[i][j] = dp[i - 1][j]
    }
    }
    }
    return dp[m][n]
    }
    @@ -55,4 +60,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func longestPalindrome(s string) string {
    n := len(s)
    expanding := func(l, r int) int { // return the longest length of the parlindrom in the given substring
    for l >= 0 && r < n && s[l] == s[r] {
    l--
    r++
    }
    return r - l - 1
    }
    max := 0
    start := 0
    for i := 0; i < n; i++ {
    p1 := expanding(i, i)
    p2 := expanding(i, i + 1)
    if p1 > p2 && max < p1 {
    start = i - (p1 - 1) / 2
    max = p1
    } else if max < p2 && p1 < p2 {
    start = i - (p2 - 2) / 2
    max = p2
    }
    }
    return s[start:start + max]
    }
    -

    Monotonic Stack
    \ No newline at end of file +
    Monotonic Stack
    \ No newline at end of file diff --git a/docs/2021/10/16/Monotonic Stack/index.html b/docs/2021/10/16/Monotonic Stack/index.html index 909747ead..2a0582d6a 100644 --- a/docs/2021/10/16/Monotonic Stack/index.html +++ b/docs/2021/10/16/Monotonic Stack/index.html @@ -1,13 +1,18 @@ -Monotonic Stack | Beendless ~ 快节奏,慢生活,无止境 +Monotonic Stack | Beendless ~ 快节奏,慢生活,无止境 -

    Monotonic Stack

    Monotonic Stack is the best time complexity solution for many “range queries in an array” problems. Because every element in the array could only enter the monotonic stack once, the time complexity is O(N). (N represents the length of the array).

    +

    Monotonic Stack

    Monotonic Stack is the best time complexity solution for many “range queries in an array” problems. Because every element in the array could only enter the monotonic stack once, the time complexity is O(N). (N represents the length of the array).

    739. Daily Temperatures

    Since we want to get the first larger element after the current element, we can consider using the monotonic stack.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func dailyTemperatures(temperatures []int) []int {
    n := len(temperatures)
    result := make([]int, n)
    stack := []int{}
    for i := 0; i < n; i++ {
    for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack) - 1]]{
    last := stack[len(stack) - 1]
    result[last] = i - last
    stack = stack[:len(stack) - 1]
    }
    stack = append(stack, i)
    }
    return result
    }
    @@ -35,4 +40,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func largestRectangleArea(heights []int) int {
    // The reason we have a 0 at the end is if the given heights is a sorted ascending array, we will push everything to the stack without doing anything.
    heights := append(heights, 0)
    n := len(heights)
    result := 0
    stack := []int{}
    for i := 0; i < n; i++ {
    for len(stack) > 0 && height[i] < height[stack[len(stack) - 1]] {
    h := heights[stack[len(stack) - 1]]
    stack = stack[:len(stack) - 1]
    w := i
    if len(stack) > 0 {
    w = i - stack[len(stack) - 1] - 1
    }
    area := h * w
    if result < area {
    result = area
    }
    }
    stack = append(stack, i)
    }
    }

    Mastering Go Notes
    \ No newline at end of file +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func largestRectangleArea(heights []int) int {
    // The reason we have a 0 at the end is if the given heights is a sorted ascending array, we will push everything to the stack without doing anything.
    heights := append(heights, 0)
    n := len(heights)
    result := 0
    stack := []int{}
    for i := 0; i < n; i++ {
    for len(stack) > 0 && height[i] < height[stack[len(stack) - 1]] {
    h := heights[stack[len(stack) - 1]]
    stack = stack[:len(stack) - 1]
    w := i
    if len(stack) > 0 {
    w = i - stack[len(stack) - 1] - 1
    }
    area := h * w
    if result < area {
    result = area
    }
    }
    stack = append(stack, i)
    }
    }
    Mastering Go Notes
    \ No newline at end of file diff --git a/docs/2021/10/18/Mastering Go Notes/index.html b/docs/2021/10/18/Mastering Go Notes/index.html index eb363723b..30db204b4 100644 --- a/docs/2021/10/18/Mastering Go Notes/index.html +++ b/docs/2021/10/18/Mastering Go Notes/index.html @@ -1,13 +1,18 @@ -Mastering Go Notes | Beendless ~ 快节奏,慢生活,无止境 +Mastering Go Notes | Beendless ~ 快节奏,慢生活,无止境 -

    Mastering Go Notes

      +

      Mastering Go Notes

      1. If you have to check godoc offline, you could install gdoc go get golang.org/x/tools/cmd/godoc and then run godoc -http :8001 in termilal.

      2. Go consider the main() function the entry point to the application and begins the execution of the applicaiton with the code found in the main() function of the main package.

        @@ -21,4 +26,4 @@
      3. The os.Args string slice is properly initialized by Go and is available to the program when referenced.

      -
      Multi-Stage Golang Docker Image Build and Kubernetes Deployment
      \ No newline at end of file +
    Multi-Stage Golang Docker Image Build and Kubernetes Deployment
    \ No newline at end of file diff --git a/docs/2021/10/19/Multi-Stage Golang Docker Image/index.html b/docs/2021/10/19/Multi-Stage Golang Docker Image/index.html index ee9f48225..7fc2f4d43 100644 --- a/docs/2021/10/19/Multi-Stage Golang Docker Image/index.html +++ b/docs/2021/10/19/Multi-Stage Golang Docker Image/index.html @@ -1,13 +1,18 @@ -Multi-Stage Golang Docker Image Build and Kubernetes Deployment | Beendless ~ 快节奏,慢生活,无止境 +Multi-Stage Golang Docker Image Build and Kubernetes Deployment | Beendless ~ 快节奏,慢生活,无止境 -

    Multi-Stage Golang Docker Image Build and Kubernetes Deployment

    If we have a tiny web service which return the host name as below. We can use golang image and build the executable package, then move it into a basic linux container like alpine.

    +

    Multi-Stage Golang Docker Image Build and Kubernetes Deployment

    If we have a tiny web service which return the host name as below. We can use golang image and build the executable package, then move it into a basic linux container like alpine.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package main

    import (
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "github.com/gorilla/mux"
    )

    func handler(w http.ResponseWriter, r *http.Request) {
    name, err := os.Hostname()
    if err != nil {
    fmt.Fprintf(w, "Can't get hostname")
    } else {
    fmt.Fprintf(w, "Go Hostname: %s\n", name)
    }
    }

    func main() {
    r := mux.NewRouter()
    r.PathPrefix("/").HandlerFunc(handler)
    srv := &http.Server{
    Handler: r,
    Addr: ":8000",
    // Good practice: enforce timeouts for servers you create!
    WriteTimeout: 15 * time.Second,
    ReadTimeout: 15 * time.Second,
    }

    log.Fatal(srv.ListenAndServe())
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FROM golang:1.17 AS builder
    # https://stackoverflow.com/questions/61515186/when-using-cgo-enabled-is-must-and-what-happens
    # https://gist.github.com/blessdyb/ebe59987e4a4632b28c10ec74a1eda0c
    ENV CGO_ENABLED=0
    WORKDIR /build
    COPY . .
    RUN go mod download
    RUN go build -o app

    FROM alpine:latest
    WORKDIR /app
    COPY --from=builder /build/app .
    EXPOSE 8000
    CMD ["./app"]
    @@ -18,4 +23,4 @@

    Run kubectl port-forward deploy/whoami 8001:8000 , then we can check localhost:8001 in our browser.

    You can compare the result of the real container name by running below commands:

    kubectl get pods -o custom-columns=NAME:metadata.name
    kubectl exec deploy/whoami -- sh -c 'hostname'

    -
    MMM, Ma-Po Tofu !
    \ No newline at end of file +
    MMM, Ma-Po Tofu !
    \ No newline at end of file diff --git a/docs/2021/10/26/Ma-Po Tofu/index.html b/docs/2021/10/26/Ma-Po Tofu/index.html index 0cf4c70f7..9d0441456 100644 --- a/docs/2021/10/26/Ma-Po Tofu/index.html +++ b/docs/2021/10/26/Ma-Po Tofu/index.html @@ -1,14 +1,19 @@ -MMM, Ma-Po Tofu ! | Beendless ~ 快节奏,慢生活,无止境 +MMM, Ma-Po Tofu ! | Beendless ~ 快节奏,慢生活,无止境 -

    MMM, Ma-Po Tofu !

    It might be a dish foreign for you; in fact, it was foreign to me too. Ma-Po tofu originates from a region in China but far away from my hometown. The first time that I had it was in my first year of college. It and me, both had left home, just met in a small restaurant next to our campus. Gladly, I was not alone, neither was the dish. There were new friends of mine sitting around a table, and Ma-Po Tofu took the center, having always had the charm to attract people from all over the country. It may be welcomed by people from all over the world one day.

    +

    MMM, Ma-Po Tofu !

    It might be a dish foreign for you; in fact, it was foreign to me too. Ma-Po tofu originates from a region in China but far away from my hometown. The first time that I had it was in my first year of college. It and me, both had left home, just met in a small restaurant next to our campus. Gladly, I was not alone, neither was the dish. There were new friends of mine sitting around a table, and Ma-Po Tofu took the center, having always had the charm to attract people from all over the country. It may be welcomed by people from all over the world one day.

    On a simple plate with certain depth was Ma-Po tofu resting. The white plate made a perfect extension of the dish as the tofu was white itself yet the sauce all over it was flame red. The depth of the plate had to be perfect too as the sauce could be a little glutinous and soupy at the same time. A flat plate too shallow would not match the thickness of Ma-Po tofu. The tofu was cut into small cubes like dice and partly immersed in spicy vegetable oil. Red chili powder and green onion bits decorated the tofu cubes, like sprinkles, adding not only rich flavors but also festivity to the dish. Chopped garlic and ginger pieces may be easily ignored at the first glance, but they were still easier to detect than tiny, ground meat. The meat had been crisped in hot oil, being prepared to support the main role of tofu. Yes, the meat had to surrender and obey the spicy and fragrant of the rest of ingredients. The only purpose for all the ingredients was to give a wondrous taste for tofu that is usually considered the least tasty bean-based curd. While the original flavor of tofu retained, a variety of spices that marked the Sichuan region, from which the Ma-Po tofu originated, wrapped each piece of tofu. Aha! The wondrous taste had its most contribution from a special spice, Chinese pepper, the kind that numbs my tongue! It was ground and dredged on the ready dish at last. The brown powder camouflaged itself until my first bite. Anyone can recognize its distinctiveness.

    The most recommended way to take Ma-Po tofu is to dip the tofu in the sauce a bit or to just use a spoon to take one piece of tofu and the sauce together. The essence in the taste was an incredible integration of different types of spicy tastes at different layers. The numbing sense gave it special magic to level up that mixed taste. Several small pieces of meat occasionally clung to the tofu or garlic. Although very small, the meat was crispy outside and tender inside, adding a playful element to other ingredients. Besides the dynamic flavors, tofu was still being itself: it was tender, smooth, pleasantly chewy, soft yet firm, just as it was before it was cooked. The texture of the tofu for this dish was something in-between of marshmallows and cheese. The tenderness and firmness remained; yet another level of slipperiness was built upon it because now the tofu was made hot, not only hot as spicy but also hot in temperature. At least it was warm enough that I wanted to take my time before taking anything from it. While the rich taste fills every corner of my mouth at once the first bite that I just had would smoothly slide to reach my throat and esophagus. Usually, eaters could not resist the fragrant warmth as soon as the dish was served, so they jumped into it. Just like taking an adventure in a wonder land of spices, you might want to do it slowly before suddenly getting your tongue, throat, and esophagus numbed or burned. Don’t ask me how I know it!

    I remembered my lesson ever since but not always successful in applying it; my husband knows that because I sometimes make it at home now. Ma-Po tofu is a test even for masters as making tofu colorful and tasty is inherently a difficult task. But you do not have to make it as stylish as a chef’s signature, it is a treat itself. As a classic in the region where it originates, Ma-Po tofu is an easy, simple, low-key dish that everyone can make very home. It is popular but also homey. Its warmth and amora reminds eaters everything about home. This might have been the reason that we ordered a Ma-Po tofu at the dinner table when a bunch of first-year college students became friends and shared meals together.

    -
    Set up Kubeadm on MacOS with Vagrant and VirtualBox
    \ No newline at end of file +
    Set up Kubeadm on MacOS with Vagrant and VirtualBox
    \ No newline at end of file diff --git a/docs/2021/11/15/Set up Kubeadm on Macbook with Vagrant/index.html b/docs/2021/11/15/Set up Kubeadm on Macbook with Vagrant/index.html index 16178d441..5a7adb9cf 100644 --- a/docs/2021/11/15/Set up Kubeadm on Macbook with Vagrant/index.html +++ b/docs/2021/11/15/Set up Kubeadm on Macbook with Vagrant/index.html @@ -1,13 +1,18 @@ -Set up Kubeadm on MacOS with Vagrant and VirtualBox | Beendless ~ 快节奏,慢生活,无止境 +Set up Kubeadm on MacOS with Vagrant and VirtualBox | Beendless ~ 快节奏,慢生活,无止境 -

    Set up Kubeadm on MacOS with Vagrant and VirtualBox

    Based on kubeadm installation instructions, we can’t directly install it on MacOS. But with the help of Vagrant and VirtualBox, we can quickly create a local kubenetes cluster.

    +

    Set up Kubeadm on MacOS with Vagrant and VirtualBox

    Based on kubeadm installation instructions, we can’t directly install it on MacOS. But with the help of Vagrant and VirtualBox, we can quickly create a local kubenetes cluster.

    1. Install VirtualBox and Vagrant(https://www.vagrantup.com)
    2. Create three virtualbox instances, one as a master node and the other two as workder nodes. You can use this Vagrantfile. Basically we will:
      a. Use ubuntu/bionic64 as the OS
      b. Set up a private network and use IP subnet “192.168.5.X” (master nodes will use 192.168.5.1X, worker nodes will use 192.168.5.2X)
      c. Update /etc/hosts to set up the host record to all nodes
      d. Add Google’s open dns to /etc/resolver.conf file
      e. Once you finish the above process, you can run vagrant status, you will get something like below
      1
      2
      3
         kubemaster                running (virtualbox)
      kubenode01 running (virtualbox)
      kubenode02 running (virtualbox)
    3. @@ -16,4 +21,4 @@
    4. Follow https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ to create a cluster.
      a. Initializing a control-plane node kubeadm init --pod-network-cid=10.244.0.0/16 --apiserver-advertise-address=192.1168.5.11 . Here 10.244.0.0/16 specifies the subnet for pods on worker nodes. You can give a different one. Once it’s installed successfully, you can run kubectl get nodes and the master nodes will be displayed as NotReady as expected
      b. Installing a Pod network add-on by following https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model. Here we choose WeaveNet which doesn’t need any additional configuration.
      c. Join the worker nodes to the cluster. If you forget the tokens, you can run kubeadm token create --print-join-command and run the kubeadm join command in all worker nodes.
    5. Now if you run kubectl get nodes, you can get a result as below.
      1
      2
      3
      4
      NAME         STATUS   ROLES                  AGE   VERSION
      kubemaster Ready control-plane,master 9h v1.22.3
      kubenode01 Ready <none> 9h v1.22.3
      kubenode02 Ready <none> 9h v1.22.3
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/about/index.html b/docs/about/index.html index dd2b0fb91..1cf4ef0bf 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -1,12 +1,17 @@ -关于 | Beendless ~ 快节奏,慢生活,无止境 +关于 | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file diff --git a/docs/archives/2010/03/index.html b/docs/archives/2010/03/index.html index 085c0ab3b..e901bdab8 100644 --- a/docs/archives/2010/03/index.html +++ b/docs/archives/2010/03/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2010

    \ No newline at end of file +

    2010

    \ No newline at end of file diff --git a/docs/archives/2010/04/index.html b/docs/archives/2010/04/index.html index df1e8b9b6..5909abf3c 100644 --- a/docs/archives/2010/04/index.html +++ b/docs/archives/2010/04/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2010

    \ No newline at end of file +

    2010

    \ No newline at end of file diff --git a/docs/archives/2010/06/index.html b/docs/archives/2010/06/index.html index 2abfe0e2e..d5069faf3 100644 --- a/docs/archives/2010/06/index.html +++ b/docs/archives/2010/06/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2010/11/index.html b/docs/archives/2010/11/index.html index f94a47bdd..a5ffdfee7 100644 --- a/docs/archives/2010/11/index.html +++ b/docs/archives/2010/11/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2010/index.html b/docs/archives/2010/index.html index d591cdf4d..6070695aa 100644 --- a/docs/archives/2010/index.html +++ b/docs/archives/2010/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2011/01/index.html b/docs/archives/2011/01/index.html index f6268bc2a..528afc544 100644 --- a/docs/archives/2011/01/index.html +++ b/docs/archives/2011/01/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2011/05/index.html b/docs/archives/2011/05/index.html index fb47dfaf0..51d4cef0e 100644 --- a/docs/archives/2011/05/index.html +++ b/docs/archives/2011/05/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2011/06/index.html b/docs/archives/2011/06/index.html index e3ce20dc2..0a63d70e5 100644 --- a/docs/archives/2011/06/index.html +++ b/docs/archives/2011/06/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2011/11/index.html b/docs/archives/2011/11/index.html index f1f4a2d63..2fcc8ea14 100644 --- a/docs/archives/2011/11/index.html +++ b/docs/archives/2011/11/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2011/12/index.html b/docs/archives/2011/12/index.html index ace2ed257..936258e79 100644 --- a/docs/archives/2011/12/index.html +++ b/docs/archives/2011/12/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2011

    \ No newline at end of file +

    2011

    \ No newline at end of file diff --git a/docs/archives/2011/index.html b/docs/archives/2011/index.html index 2dcef9041..bdf6245c1 100644 --- a/docs/archives/2011/index.html +++ b/docs/archives/2011/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2012/02/index.html b/docs/archives/2012/02/index.html index f4fe92486..31e766290 100644 --- a/docs/archives/2012/02/index.html +++ b/docs/archives/2012/02/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2012/07/index.html b/docs/archives/2012/07/index.html index ade30aa9f..48a92d11e 100644 --- a/docs/archives/2012/07/index.html +++ b/docs/archives/2012/07/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2012/08/index.html b/docs/archives/2012/08/index.html index 7d253c5b3..934b1b94a 100644 --- a/docs/archives/2012/08/index.html +++ b/docs/archives/2012/08/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2012/09/index.html b/docs/archives/2012/09/index.html index 755cd5af1..2dbdb4296 100644 --- a/docs/archives/2012/09/index.html +++ b/docs/archives/2012/09/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2012

    \ No newline at end of file +

    2012

    \ No newline at end of file diff --git a/docs/archives/2012/index.html b/docs/archives/2012/index.html index 5f5051588..1dda7c9bd 100644 --- a/docs/archives/2012/index.html +++ b/docs/archives/2012/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/01/index.html b/docs/archives/2013/01/index.html index 2db3a88f2..a57a307e8 100644 --- a/docs/archives/2013/01/index.html +++ b/docs/archives/2013/01/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2013

    \ No newline at end of file +

    2013

    \ No newline at end of file diff --git a/docs/archives/2013/02/index.html b/docs/archives/2013/02/index.html index 8c9974d0f..198872934 100644 --- a/docs/archives/2013/02/index.html +++ b/docs/archives/2013/02/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/03/index.html b/docs/archives/2013/03/index.html index 38c3a7089..9adf6f2f4 100644 --- a/docs/archives/2013/03/index.html +++ b/docs/archives/2013/03/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/04/index.html b/docs/archives/2013/04/index.html index 7a220a54c..e3197a333 100644 --- a/docs/archives/2013/04/index.html +++ b/docs/archives/2013/04/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/11/index.html b/docs/archives/2013/11/index.html index 196b4e170..b7ee5750e 100644 --- a/docs/archives/2013/11/index.html +++ b/docs/archives/2013/11/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/12/index.html b/docs/archives/2013/12/index.html index 6f5507bed..d4fd4e42d 100644 --- a/docs/archives/2013/12/index.html +++ b/docs/archives/2013/12/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2013/index.html b/docs/archives/2013/index.html index f554e70ab..cd02f597b 100644 --- a/docs/archives/2013/index.html +++ b/docs/archives/2013/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2014/01/index.html b/docs/archives/2014/01/index.html index 9c9080f2d..9c023b3eb 100644 --- a/docs/archives/2014/01/index.html +++ b/docs/archives/2014/01/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2014/02/index.html b/docs/archives/2014/02/index.html index 8e0cab415..973337c09 100644 --- a/docs/archives/2014/02/index.html +++ b/docs/archives/2014/02/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2014

    \ No newline at end of file +

    2014

    \ No newline at end of file diff --git a/docs/archives/2014/03/index.html b/docs/archives/2014/03/index.html index 88f04130b..d6e51ee0b 100644 --- a/docs/archives/2014/03/index.html +++ b/docs/archives/2014/03/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2014

    \ No newline at end of file +

    2014

    \ No newline at end of file diff --git a/docs/archives/2014/05/index.html b/docs/archives/2014/05/index.html index 3ce1a0eb1..be49bc6df 100644 --- a/docs/archives/2014/05/index.html +++ b/docs/archives/2014/05/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2014

    \ No newline at end of file +

    2014

    \ No newline at end of file diff --git a/docs/archives/2014/06/index.html b/docs/archives/2014/06/index.html index dc5dcadc8..ca0214d0d 100644 --- a/docs/archives/2014/06/index.html +++ b/docs/archives/2014/06/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2014

    \ No newline at end of file +

    2014

    \ No newline at end of file diff --git a/docs/archives/2014/09/index.html b/docs/archives/2014/09/index.html index d3eae57b6..e38af6443 100644 --- a/docs/archives/2014/09/index.html +++ b/docs/archives/2014/09/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2014/10/index.html b/docs/archives/2014/10/index.html index 6dd63774f..f2b8f21a9 100644 --- a/docs/archives/2014/10/index.html +++ b/docs/archives/2014/10/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -

    2014

    \ No newline at end of file +

    2014

    \ No newline at end of file diff --git a/docs/archives/2014/index.html b/docs/archives/2014/index.html index a70ebbde6..dfd1e93ac 100644 --- a/docs/archives/2014/index.html +++ b/docs/archives/2014/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2015/01/index.html b/docs/archives/2015/01/index.html index 843b23c0b..b89bc1ab2 100644 --- a/docs/archives/2015/01/index.html +++ b/docs/archives/2015/01/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2015/08/index.html b/docs/archives/2015/08/index.html index 0bf3f823a..be2676093 100644 --- a/docs/archives/2015/08/index.html +++ b/docs/archives/2015/08/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2015/09/index.html b/docs/archives/2015/09/index.html index ea964ab09..4f5677fa7 100644 --- a/docs/archives/2015/09/index.html +++ b/docs/archives/2015/09/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2015/index.html b/docs/archives/2015/index.html index 63619fcd4..28966c53d 100644 --- a/docs/archives/2015/index.html +++ b/docs/archives/2015/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2018/12/index.html b/docs/archives/2018/12/index.html index 89b3c9d50..5a464324c 100644 --- a/docs/archives/2018/12/index.html +++ b/docs/archives/2018/12/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2018/index.html b/docs/archives/2018/index.html index 89b3c9d50..5a464324c 100644 --- a/docs/archives/2018/index.html +++ b/docs/archives/2018/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2019/01/index.html b/docs/archives/2019/01/index.html index bba843729..48f649830 100644 --- a/docs/archives/2019/01/index.html +++ b/docs/archives/2019/01/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2019/index.html b/docs/archives/2019/index.html index bba843729..48f649830 100644 --- a/docs/archives/2019/index.html +++ b/docs/archives/2019/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2020/08/index.html b/docs/archives/2020/08/index.html index 565541598..baafe6703 100644 --- a/docs/archives/2020/08/index.html +++ b/docs/archives/2020/08/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2020/09/index.html b/docs/archives/2020/09/index.html index cdb68f054..2e78c1a60 100644 --- a/docs/archives/2020/09/index.html +++ b/docs/archives/2020/09/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2020/10/index.html b/docs/archives/2020/10/index.html index 95b798ce9..26013772f 100644 --- a/docs/archives/2020/10/index.html +++ b/docs/archives/2020/10/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2020/index.html b/docs/archives/2020/index.html index 392caa3e6..83fba4bfd 100644 --- a/docs/archives/2020/index.html +++ b/docs/archives/2020/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/07/index.html b/docs/archives/2021/07/index.html index 4bf2370bc..77d95c068 100644 --- a/docs/archives/2021/07/index.html +++ b/docs/archives/2021/07/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/08/index.html b/docs/archives/2021/08/index.html index c3cf7cae3..f4e1fc487 100644 --- a/docs/archives/2021/08/index.html +++ b/docs/archives/2021/08/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/09/index.html b/docs/archives/2021/09/index.html index 5068fab99..5c9fc14a6 100644 --- a/docs/archives/2021/09/index.html +++ b/docs/archives/2021/09/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/10/index.html b/docs/archives/2021/10/index.html index b5128a67d..54cab01ce 100644 --- a/docs/archives/2021/10/index.html +++ b/docs/archives/2021/10/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/11/index.html b/docs/archives/2021/11/index.html index 04c335a96..31b43f786 100644 --- a/docs/archives/2021/11/index.html +++ b/docs/archives/2021/11/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/index.html b/docs/archives/2021/index.html index 6f4f46054..d76715b68 100644 --- a/docs/archives/2021/index.html +++ b/docs/archives/2021/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/2021/page/2/index.html b/docs/archives/2021/page/2/index.html index 7e3b4725d..60ca407e7 100644 --- a/docs/archives/2021/page/2/index.html +++ b/docs/archives/2021/page/2/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/index.html b/docs/archives/index.html index 7d8d18266..414412e57 100644 --- a/docs/archives/index.html +++ b/docs/archives/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/page/2/index.html b/docs/archives/page/2/index.html index 134bb79dc..90f33acac 100644 --- a/docs/archives/page/2/index.html +++ b/docs/archives/page/2/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/page/3/index.html b/docs/archives/page/3/index.html index 38688d078..12d898eaa 100644 --- a/docs/archives/page/3/index.html +++ b/docs/archives/page/3/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/page/4/index.html b/docs/archives/page/4/index.html index 506bed51c..17f9f201b 100644 --- a/docs/archives/page/4/index.html +++ b/docs/archives/page/4/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/archives/page/5/index.html b/docs/archives/page/5/index.html index 4d87af1a7..cf03f359c 100644 --- a/docs/archives/page/5/index.html +++ b/docs/archives/page/5/index.html @@ -1,10 +1,15 @@ -Archive | Beendless ~ 快节奏,慢生活,无止境 +Archive | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/atom.xml b/docs/atom.xml index 3e19da6a3..43e3e7692 100644 --- a/docs/atom.xml +++ b/docs/atom.xml @@ -6,7 +6,7 @@ - 2021-11-15T20:30:07.732Z + 2021-11-27T08:03:05.936Z http://blog.beendless.com/ @@ -21,7 +21,7 @@ http://blog.beendless.com/2021/11/15/Set%20up%20Kubeadm%20on%20Macbook%20with%20Vagrant/ 2021-11-15T08:45:23.000Z - 2021-11-15T20:30:07.732Z + 2021-11-27T08:03:05.936Z Based on kubeadm installation instructions, we can’t directly install it on MacOS. But with the help of Vagrant and VirtualBox, we can quickly create a local kubenetes cluster.

    1. Install VirtualBox and Vagrant(https://www.vagrantup.com)
    2. Create three virtualbox instances, one as a master node and the other two as workder nodes. You can use this Vagrantfile. Basically we will:
      a. Use ubuntu/bionic64 as the OS
      b. Set up a private network and use IP subnet “192.168.5.X” (master nodes will use 192.168.5.1X, worker nodes will use 192.168.5.2X)
      c. Update /etc/hosts to set up the host record to all nodes
      d. Add Google’s open dns to /etc/resolver.conf file
      e. Once you finish the above process, you can run vagrant status, you will get something like below
      1
      2
      3
         kubemaster                running (virtualbox)
      kubenode01 running (virtualbox)
      kubenode02 running (virtualbox)
    3. Install Docker runtime on all three instances by following https://docs.docker.com/engine/install/ubuntu/
    4. Follow https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ to install the kubeadm.
      a. Letting iptables see bridged traffic
      b. Installing kubeadm/kubelet and kubectl
    5. Follow https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ to create a cluster.
      a. Initializing a control-plane node kubeadm init --pod-network-cid=10.244.0.0/16 --apiserver-advertise-address=192.1168.5.11 . Here 10.244.0.0/16 specifies the subnet for pods on worker nodes. You can give a different one. Once it’s installed successfully, you can run kubectl get nodes and the master nodes will be displayed as NotReady as expected
      b. Installing a Pod network add-on by following https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model. Here we choose WeaveNet which doesn’t need any additional configuration.
      c. Join the worker nodes to the cluster. If you forget the tokens, you can run kubeadm token create --print-join-command and run the kubeadm join command in all worker nodes.
    6. Now if you run kubectl get nodes, you can get a result as below.
      1
      2
      3
      4
      NAME         STATUS   ROLES                  AGE   VERSION
      kubemaster Ready control-plane,master 9h v1.22.3
      kubenode01 Ready <none> 9h v1.22.3
      kubenode02 Ready <none> 9h v1.22.3
    ]]>
    @@ -45,7 +45,7 @@ http://blog.beendless.com/2021/10/26/Ma-Po%20Tofu/ 2021-10-26T07:00:24.000Z - 2021-10-26T16:28:55.824Z + 2021-11-27T08:03:05.925Z It might be a dish foreign for you; in fact, it was foreign to me too. Ma-Po tofu originates from a region in China but far away from my hometown. The first time that I had it was in my first year of college. It and me, both had left home, just met in a small restaurant next to our campus. Gladly, I was not alone, neither was the dish. There were new friends of mine sitting around a table, and Ma-Po Tofu took the center, having always had the charm to attract people from all over the country. It may be welcomed by people from all over the world one day.

    On a simple plate with certain depth was Ma-Po tofu resting. The white plate made a perfect extension of the dish as the tofu was white itself yet the sauce all over it was flame red. The depth of the plate had to be perfect too as the sauce could be a little glutinous and soupy at the same time. A flat plate too shallow would not match the thickness of Ma-Po tofu. The tofu was cut into small cubes like dice and partly immersed in spicy vegetable oil. Red chili powder and green onion bits decorated the tofu cubes, like sprinkles, adding not only rich flavors but also festivity to the dish. Chopped garlic and ginger pieces may be easily ignored at the first glance, but they were still easier to detect than tiny, ground meat. The meat had been crisped in hot oil, being prepared to support the main role of tofu. Yes, the meat had to surrender and obey the spicy and fragrant of the rest of ingredients. The only purpose for all the ingredients was to give a wondrous taste for tofu that is usually considered the least tasty bean-based curd. While the original flavor of tofu retained, a variety of spices that marked the Sichuan region, from which the Ma-Po tofu originated, wrapped each piece of tofu. Aha! The wondrous taste had its most contribution from a special spice, Chinese pepper, the kind that numbs my tongue! It was ground and dredged on the ready dish at last. The brown powder camouflaged itself until my first bite. Anyone can recognize its distinctiveness.

    The most recommended way to take Ma-Po tofu is to dip the tofu in the sauce a bit or to just use a spoon to take one piece of tofu and the sauce together. The essence in the taste was an incredible integration of different types of spicy tastes at different layers. The numbing sense gave it special magic to level up that mixed taste. Several small pieces of meat occasionally clung to the tofu or garlic. Although very small, the meat was crispy outside and tender inside, adding a playful element to other ingredients. Besides the dynamic flavors, tofu was still being itself: it was tender, smooth, pleasantly chewy, soft yet firm, just as it was before it was cooked. The texture of the tofu for this dish was something in-between of marshmallows and cheese. The tenderness and firmness remained; yet another level of slipperiness was built upon it because now the tofu was made hot, not only hot as spicy but also hot in temperature. At least it was warm enough that I wanted to take my time before taking anything from it. While the rich taste fills every corner of my mouth at once the first bite that I just had would smoothly slide to reach my throat and esophagus. Usually, eaters could not resist the fragrant warmth as soon as the dish was served, so they jumped into it. Just like taking an adventure in a wonder land of spices, you might want to do it slowly before suddenly getting your tongue, throat, and esophagus numbed or burned. Don’t ask me how I know it!

    I remembered my lesson ever since but not always successful in applying it; my husband knows that because I sometimes make it at home now. Ma-Po tofu is a test even for masters as making tofu colorful and tasty is inherently a difficult task. But you do not have to make it as stylish as a chef’s signature, it is a treat itself. As a classic in the region where it originates, Ma-Po tofu is an easy, simple, low-key dish that everyone can make very home. It is popular but also homey. Its warmth and amora reminds eaters everything about home. This might have been the reason that we ordered a Ma-Po tofu at the dinner table when a bunch of first-year college students became friends and shared meals together.

    ]]>
    @@ -69,7 +69,7 @@ http://blog.beendless.com/2021/10/19/Multi-Stage%20Golang%20Docker%20Image/ 2021-10-19T18:15:24.000Z - 2021-10-21T07:15:26.055Z + 2021-11-27T08:03:05.930Z If we have a tiny web service which return the host name as below. We can use golang image and build the executable package, then move it into a basic linux container like alpine.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package main

    import (
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "github.com/gorilla/mux"
    )

    func handler(w http.ResponseWriter, r *http.Request) {
    name, err := os.Hostname()
    if err != nil {
    fmt.Fprintf(w, "Can't get hostname")
    } else {
    fmt.Fprintf(w, "Go Hostname: %s\n", name)
    }
    }

    func main() {
    r := mux.NewRouter()
    r.PathPrefix("/").HandlerFunc(handler)
    srv := &http.Server{
    Handler: r,
    Addr: ":8000",
    // Good practice: enforce timeouts for servers you create!
    WriteTimeout: 15 * time.Second,
    ReadTimeout: 15 * time.Second,
    }

    log.Fatal(srv.ListenAndServe())
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FROM golang:1.17 AS builder
    # https://stackoverflow.com/questions/61515186/when-using-cgo-enabled-is-must-and-what-happens
    # https://gist.github.com/blessdyb/ebe59987e4a4632b28c10ec74a1eda0c
    ENV CGO_ENABLED=0
    WORKDIR /build
    COPY . .
    RUN go mod download
    RUN go build -o app

    FROM alpine:latest
    WORKDIR /app
    COPY --from=builder /build/app .
    EXPOSE 8000
    CMD ["./app"]

    Once we have the docker file, we can build an image with command docker build -t whoami-web . . Now, we can use Kubernetes to deploy it

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: whoami
    labels:
    app: whoami
    version: v1
    spec:
    selector:
    matchLabels:
    app: whoami
    version: v1
    template:
    metadata:
    labels:
    app: whoami
    version: v1
    spec:
    containers:
    - name: whoami-web
    image: whoami-web
    imagePullPolicy: Never

    Run kubectl apply -f deployment.yml we will have the deployment running.

    Run kubectl port-forward deploy/whoami 8001:8000 , then we can check localhost:8001 in our browser.

    You can compare the result of the real container name by running below commands:

    kubectl get pods -o custom-columns=NAME:metadata.name
    kubectl exec deploy/whoami -- sh -c 'hostname'

    ]]>
    @@ -97,7 +97,7 @@ http://blog.beendless.com/2021/10/18/Mastering%20Go%20Notes/ 2021-10-18T18:15:24.000Z - 2021-10-21T06:56:37.429Z + 2021-11-27T08:03:05.926Z
  • If you have to check godoc offline, you could install gdoc go get golang.org/x/tools/cmd/godoc and then run godoc -http :8001 in termilal.

  • Go consider the main() function the entry point to the application and begins the execution of the applicaiton with the code found in the main() function of the main package.

  • Everything that begins with a lowercase letter is considered private and is accessible in the current package only.

  • If no initial value is given to a variable, the Go compiler will automatically initialize that variable to the zero value of its data type.

  • The var keyword is mostly used for declaring global or local variables without an initial value. Since every statement that exists outside of the code of a function must begin with a keywoprd such as func, const or var, you can’t use short assignment statement := outside of the function.

  • The os.Args string slice is properly initialized by Go and is available to the program when referenced.

  • ]]>
    @@ -124,7 +124,7 @@ http://blog.beendless.com/2021/10/16/Monotonic%20Stack/ 2021-10-16T18:15:24.000Z - 2021-10-17T19:24:11.084Z + 2021-11-27T08:03:05.929Z Monotonic Stack is the best time complexity solution for many “range queries in an array” problems. Because every element in the array could only enter the monotonic stack once, the time complexity is O(N). (N represents the length of the array).

    739. Daily Temperatures

    Since we want to get the first larger element after the current element, we can consider using the monotonic stack.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func dailyTemperatures(temperatures []int) []int {
    n := len(temperatures)
    result := make([]int, n)
    stack := []int{}
    for i := 0; i < n; i++ {
    for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack) - 1]]{
    last := stack[len(stack) - 1]
    result[last] = i - last
    stack = stack[:len(stack) - 1]
    }
    stack = append(stack, i)
    }
    return result
    }

    496. Next Greater Element I

    We use a monotonic stack to iterate over the nums2 array. During the iteration, if we find that the top stack value is lower than the current value and the top stack value exist in nums1, it means we get the one result in nums1. Since all elements are unique, we don’t need to worry about the override risk.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    func nextGreaterElement(nums1 []int, nums2 []int) []int {
    result := make([]int, len(nums1))
    hash := make(map[int]int)
    for i := 0; i < len(nums1); i++ {
    result[i] = -1
    hash[nums1[i]] = i
    }
    stack := []int{0}
    for i := 1; i < len(nums2); i++ {
    if nums2[i] <= nums2[stack[len(stack) - 1]] {
    stack = append(stack, i)
    } else {
    for len(stack) > 0 && nums2[i] > nums2[stack[len(stack) - 1]] { // unique values in both nums1 and nums2
    if index, ok := hash[nums2[stack[len(stack) - 1]]] {
    result[index] = nums2[i]
    }
    stack = stack[:len(stack) - 1]
    }
    stack = append(stack, i)
    }
    }
    return result
    }

    503. Next Greater Element II

    We can concat two nums2 to one and get a longer list of result, then reduce the result size to half. It will be a same problem as the above one. We can also use mod operator to get the correct index

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func nextGreaterElements(nums []int) []int {
    n := len(nums)
    stack := []int{0}
    result := make([]int, n)
    for i := 0; i < n; i++ {
    result[i] = -1
    }
    for i := 1; i < 2 * n; i++ {
    for len(stack) > 0 && nums[i % n] > nums[stack[len(stack) - 1]] {
    result[stack[len(stack) - 1]] = nums[i % n]
    stack = stack[:len(stack) - 1]
    }
    stack = append(stack, i % n)
    }
    return result
    }

    42. Trapping Rain Water

    Based on the requirment, for each column, we will need to get the highest value on its left and right and then get the smaller one.

    a. Dynamic Programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    func trap(height []int) int {
    n := len(height)
    left := make([]int, n)
    right := make([]int, n)
    left[0] = height[0]
    right[n - 1] = height[n - 1]
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    for i := 1; i < n; i++ {
    left[i] = max(height[i], left[i - 1])
    }
    for i := n - 2; i >= 0; i-- {
    right[i] = max(height[i], right[i + 1])
    }
    result := 0
    for i := 0; i < n; i++ {
    diff := min(left[i], right[i]) - height[i]
    if diff > 0 {
    result += diff
    }
    }
    return result
    }

    b. Monotonic Stack

    We will get the water layer by layer vertically for each item. [https://leetcode.wang/leetCode-42-Trapping-Rain-Water.html]. Basically, the idea is we have at least two items in the stack, if the stack top is smaller than the current one, it means the stack top is the bottom of the rain trapper, and the second top one in stack is the left bounary and the current one is the right boundary.

    1
    2
    3
    4
    5
    6
    7
     ___
    5| |
    4| | ___
    3| | | |
    2| |__ | |
    1|____|__|_|
    a b c d e

    so result = (min(d, c) - 0) * (d - c) + (min(d, b) - c ) * (d - b)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func trap(height []int) int {
    result := 0
    n := len(height)
    stack := []int{}
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    for i := 0; i < n; i++ {
    for len(stack) > 0 && height[i] > height[stack[len(stack) - 1]] {
    bottom := height[stack[len(stack) - 1]]
    stack = stack[:len(stack) - 1]
    if len(stack) > 0 {
    w := i - stack[len(stack) - 1] - 1;
    h := min(height[stack[len(stack) - 1]], height[i])
    result += w * (h - bottom)
    }
    }
    stack = append(stack, i)
    }
    return result
    }

    c. Two pointers

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func trap(height []int) int {
    result := 0
    n := len(height)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    for i := 1; i < n - 1; i++ {
    left := height[i]
    for l := i - 1; l >= 0; l-- {
    left = max(left, height[l])
    }
    right := height[i]
    for r := i + 1; r < len(height); r++ {
    right = max(right, height[r])
    }
    amount := min(left, right) - height[i]
    if amount > 0 {
    result += amount
    }
    }
    return result
    }

    84. Largest Rectangle in Histogram

    For each item, we need to get the first lower value than the current one on it’s left and right. With this we can get the width of the rectangle.

    a. Dynamic Programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    func largestRectangleArea(heights []int) int {
    n := len(heights)
    left := make([]int, n)
    left[0] = -1
    right := make([]int, n)
    right[n - 1] = n
    for i := 1; i < n; i++ {
    t := i - 1
    for t >= 0 && heights[t] >= heights[i] {
    t = left[t]
    }
    left[i] = t
    }
    for i := n - 2; i >= 0; i-- {
    t := i + 1
    for t < n && heights[t] >= heights[i] {
    t = right[t]
    }
    right[i] = t
    }
    result := 0
    for i := 0; i < n; i++ {
    area := heights[i] * (right[i] - left[i] - 1)
    if result < area {
    result = area
    }
    }
    return result
    }

    b. Monotonic Stack solution

    We can use a monotonic stack to maintain the higher bars’s indices in ascending order. When encounter a lower bar, pop the tallest bar and use it as the bottleneck to compute the area.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func largestRectangleArea(heights []int) int {
    // The reason we have a 0 at the end is if the given heights is a sorted ascending array, we will push everything to the stack without doing anything.
    heights := append(heights, 0)
    n := len(heights)
    result := 0
    stack := []int{}
    for i := 0; i < n; i++ {
    for len(stack) > 0 && height[i] < height[stack[len(stack) - 1]] {
    h := heights[stack[len(stack) - 1]]
    stack = stack[:len(stack) - 1]
    w := i
    if len(stack) > 0 {
    w = i - stack[len(stack) - 1] - 1
    }
    area := h * w
    if result < area {
    result = area
    }
    }
    stack = append(stack, i)
    }
    }
    ]]>
    @@ -158,7 +158,7 @@ http://blog.beendless.com/2021/10/14/Dynamic%20Programming%20IV/ 2021-10-14T18:14:24.000Z - 2021-10-17T03:35:30.282Z + 2021-11-27T08:03:05.899Z 115. Distinct Subsequences

    Let’s denote dp[i][j] as the amount of distinct subsequences in s[:i] which can construct t[:j]. So we can get the state transition function dp[i][j] = s[i - 1] == t[i - 1] ? (dp[i - 1][j - 1] + dp[i - 1][j] : dp[i-1][j]. Also for the initial value, dp[i][0] needs to be 0 (it means there’s one way we can construct empty string from s[:i]).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func numDistinct(s string, t string) int {
    m := len(s)
    n := len(t)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    dp[i][0] = 1
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    if s[i - 1] == t[j - 1] {
    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]
    } else {
    dp[i][j] = dp[i - 1][j]
    }
    }
    }
    return dp[m][n]
    }

    583. Delete Operation for Two Strings

    a. LCS solution.

    Delete characters to make two strings match, in another word, it means we need to find the longest common sequence.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func minDistance(word1 string, word2 string) int {
    m := len(word1)
    n := len(word2)
    dp := make([][]int, m + 1)
    lcs := 0
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    for j := 0; j <= n; j++ {
    if i == 0 || j == 0 {
    continue
    } else if word1[i - 1] == word2[j - 1] {
    dp[i][j] = 1 + dp[i-1][j-1]
    } else {
    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    }
    lcs = max(lcs, dp[i][j])
    }
    }
    return m + n - 2 * lcs
    }

    b. Intuitive dynamic programming solution.

    Let’s denote dp[i][j] as the minimum delete operation to match word1[:i] and word2[:j]. So the state transition function is dp[i][j] = word1[i-1] == word2[j-1] ? dp[i-1][j-1] : max(dp[i - 1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 2).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func minDistance(word1 string, word2 string) int {
    m := len(word1)
    n := len(word2)
    dp := make([][]int, m + 1)
    min := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    for j := 0; j <= n; j++ {
    if i == 0 {
    dp[i][j] = j
    } else if j == 0 {
    dp[i][j] = i
    } else if word1[i - 1] == word2[j - 1] {
    dp[i][j] = dp[i - 1][j - 1]
    } else {
    dp[i][j] = min(dp[i][j - 1] + 1, min(dp[i - 1][j] + 1, dp[i - 1][j - 1] + 2))
    }
    }
    }
    return dp[m][n]
    }

    We can also reduce the space complexity to O(n)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    func minDistance(word1 string, word2 string) int {
    m := len(word1)
    n := len(word2)
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    dp := make([]int, n + 1)
    for i := 0; i <= m; i++ {
    temp := make([]int, n + 1)
    for j := 0; j <= n; j++ {
    if i == 0 {
    temp[j] = j
    } else if j == 0 {
    temp[j] = i
    } else if word1[i - 1] == word2[j - 1] {
    temp[j] = dp[j - 1]
    } else {
    //temp[j] = min(temp[j - 1] + 1, min(dp[j] + 1, temp[j - 1] + 2))
    temp[j] = 1 + min(temp[j - 1], dp[j])
    }
    }
    dp = temp
    }
    return dp[n]
    }

    72. Edit Distance

    This one is similar as the above one. Let’s denote dp[i][j] as the edit distance between word1[:i] and word2[:j]. So if word1[i] == word2[j], we get dp[i][j] = dp[i - 1][j-1]. Otherwise, there will be three cases:

    1. add/delete one from word1, so dp[i-1][j] + 1 or dp[i][j-1] + 1
    2. add/delete one from word2, so dp[i-1][j] + 1 or dp[i][j-1] + 1
    3. replace one from either word1 or word2, so dp[i-1][j-1] + 1

    So dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func minDistance(word1 string, word2 string) int {
    m := len(word1)
    n := len(word2)
    dp := make([][]int, m + 1)
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    for j := 0; j <= n; j++ {
    if i == 0 {
    dp[i][j] = j
    } else if j == 0 {
    dp[i][j] = i
    } else if word1[i - 1] == word2[j - 1] {
    dp[i][j] = dp[i - 1][j - 1]
    } else {
    dp[i][j] = 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1]))
    }
    }
    }
    return dp[m][n]
    }

    we can also reduce the space complexity to O(n)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    func minDistance(word1 string, word2 string) int {
    m := len(word1)
    n := len(word2)
    dp := make([]int, n + 1)
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    for i := 0; i <= m; i++ {
    temp := make([]int, n + 1)
    for j := 0; j <= n; j++ {
    if i == 0 || j == 0 {
    temp[j] = i + j
    } else if word1[i - 1] == word2[j - 1] {
    temp[j] = dp[j - 1]
    } else {
    temp[j] = 1 + min(dp[j - 1], min(dp[j], temp[j - 1]))
    }
    }
    dp = temp
    }
    return dp[n]
    }

    647. Palindromic Substrings

    a. Dynamic Programming

    Let’s denote dp[i][j] as a boolean value to identify if substring s[j:i] is a parlindrom or not. So if s[j] != s[i], then dp[i][j] is false. Otherwise, there are three cases:

    1. i - j <= 1, so dp[i][j] = true
    2. i - j > 1, so dp[i][j] = dp[i - 1][j + 1]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func countSubstrings(s string) int {
    n := len(s)
    dp := make([][]bool, n + 1)
    result := 0
    for i := 0; i <= n; i++ {
    dp[i] = make([]bool, n + 1)
    for j := 0; j <= i; j++ {
    if i == 0 || j == 0 {
    continue
    } else if s[j - 1] == s[i - 1] {
    if i - j <= 1 || dp[i - 1][j + 1] {
    dp[i][j] = true
    result++
    }
    }
    }
    }
    return result
    }

    b. Two pointers expand from center solution

    All parlindrom related problems, we can try to use two pointers solution, we selecte the middle point (it could be only one pointer or two pointers), then we expand to left and right.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func countSubstrings(s string) int {
    n := len(s)
    expanding := func(l, r int) int { // return the numbers of parlindrom substrings the given string contains
    result := 0
    for l >= 0 && r < n && s[l] == s[r] {
    result++
    l--
    r++
    }
    return result
    }
    result := 0
    for i := 0; i < n; i++ {
    result += expanding(i, i)
    result += expanding(i, i + 1)
    }
    return result
    }

    516. Longest Palindromic Subsequence

    Denote dp[i][j] as the longest palindromic sequence in s[i:j], so if s[i] == s[j], dp[i][j] = 2 + dp[i + 1][j - 1]. Otherwise dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]). Since dp[i][j] depends on dp[i+1][?] value, we should reverse the for loop

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func longestPalindromeSubseq(s string) int {
    n := len(s)
    dp := make([][]int, n)
    for i := 0; i < n; i++ {
    dp[i] = make([]int, n)
    dp[i][i] = 1
    }
    for i := n - 1; i >= 0; i-- {
    for j = i + 1; j < n; j++ {
    if s[i] == s[j] {
    dp[i][j] = dp[i + 1][j - 1] + 2
    } else {
    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
    }
    }
    }
    return dp[0][n - 1]
    }

    5. Longest Palindromic Substring

    a. Dynamic Programming

    Same as above, let’s denote dp[i][j] to flag if s[i:j] is a parlindrom. So we know if s[i] == s[j], dp[i][j] = dp[i + 1][j - 1]. and dp[i][i] = true.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func longestPalindrome(s string) string {
    n := len(s)
    dp := make([][]bool, n)
    for i := 0; i < n; i++ {
    dp[i] = make([]bool, n)
    dp[i][i] = true
    }
    max := 1
    result = string(s[0])
    for i := n - 1; i >= 0; i-- {
    for j := i + 1; j < n; j++ {
    if s[i] == s[j] {
    if j - i <= 1 {
    dp[i][j] = true
    } else {
    dp[i][j] = dp[i + 1][j - 1]
    }
    if dp[i][j] && max < j - i + 1 {
    max = j - i + 1
    result = s[i:j + 1]
    }
    }
    }
    }
    return result
    }

    b. Two pointers expand from center solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func longestPalindrome(s string) string {
    n := len(s)
    expanding := func(l, r int) int { // return the longest length of the parlindrom in the given substring
    for l >= 0 && r < n && s[l] == s[r] {
    l--
    r++
    }
    return r - l - 1
    }
    max := 0
    start := 0
    for i := 0; i < n; i++ {
    p1 := expanding(i, i)
    p2 := expanding(i, i + 1)
    if p1 > p2 && max < p1 {
    start = i - (p1 - 1) / 2
    max = p1
    } else if max < p2 && p1 < p2 {
    start = i - (p2 - 2) / 2
    max = p2
    }
    }
    return s[start:start + max]
    }
    ]]>
    @@ -190,7 +190,7 @@ http://blog.beendless.com/2021/10/13/Dynamic%20Programming%20III/ 2021-10-13T18:08:24.000Z - 2021-10-15T05:44:41.055Z + 2021-11-27T08:03:05.896Z 300. Longest Increasing Subsequence

    If we define dp[i] as the longest increasing subsequence of [0, i]. Then dp[i] >= 1. And the state transition function is dp[i] = max(dp[i], dp[j] + 1) here j ∈ [0, i).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func lengthOfLIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    dp[0] = 1
    result = 1
    for i := 1; i < n; i++ {
    dp[i] = 1
    for j := 0; j < i; j++ {
    if nums[i] > nums[j] {
    dp[i] = max(dp[i], dp[j] + 1)
    }
    }
    result = max(result, dp[i])
    }
    return result
    }

    674. Longest Continuous Increasing Subsequence

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func findLengthOfLCIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    dp[0] = 1
    result := 1
    for i := 1; i < n; i++ {
    if nums[i] > nums[i - 1] {
    dp[i] = dp[i - 1] + 1
    } else {
    dp[i] = 1
    }
    if result < dp[i] {
    result = dp[i]
    }
    }
    return result
    }

    We can reduce the space complexity to O(1)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func findLengthOfLCIS(nums []int) int {
    n := len(nums)
    count := 1
    result := 1
    for i := 1; i < n; i++ {
    if nums[i] > nums[i - 1] {
    count++
    } else {
    count = 1
    }
    if count > result {
    result = count
    }
    }
    return result
    }

    718. Maximum Length of Repeated Subarray

    Let’s denote dp[i][j] as the maximum length of repeated subarray which ends with i and j. So we know that dp[i][j] = nums1[i] == nums[j] ? (dp[i-1][j-1] + 1) : 0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func findLength(nums1 []int, nums2 []int) int {
    m := len(nums1)
    n := len(nums2)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    result := 0
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    if nums[i - 1] == nums2[j - 1] {
    dp[i][j] = dp[i - 1][j - 1] + 1
    }
    if dp[i][j] > result {
    result = dp[i][j]
    }
    }
    }
    return result
    }

    1143. Longest Common Subsequence

    Similar like above, if we denote dp[i][j] as the maximum number commen sequence which ends with i and j. So we know dp[i][j] == text1[i] == text2[j] ? dp[i-1][j-1] + 1 : max(dp[i-1][j], dp[i][j-1]).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func longestCommonSubsequence(text1 string, text2 string) int {
    m := len(text1)
    n := len(text2)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    if text[i - 1] == text2[j - 1] {
    dp[i][j] = 1 + dp[i - 1][j - 1]
    } else {
    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
    }
    }
    }
    return dp[m][n]
    }

    1035. Uncrossed Lines

    If you compare this one wtih LCS problem above, actually they are exactly the same. The connection lines doesn’t have intersections means the we just need to get the LCS.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func maxUncrossedLines(nums1 []int, nums2 []int) int {
    m := len(nums1)
    n := len(nums2)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    if nums1[i - 1] == nums2[j - 1] {
    dp[i][j] = 1 + dp[i - 1][j - 1]
    } else {
    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    }
    }
    }
    return dp[m][n]
    }

    392. Is Subsequence

    a. Naive two pointers

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func isSubsequence(s string, t string) bool {
    if len(s) > len(t) {
    return false
    }
    i := 0
    for j := 0; i < len(s) && j < len(t); j++ {
    if s[i] == t[j] {
    i++
    }
    }
    return i == len(s)
    }

    b. Dynamic Programming

    Let’s use dp[i][j] to denote the subsequence length ends with i and j. So the state transition function is dp[i][j] = s[i] == s[j] ? dp[i - 1][j - 1] + 1 : dp[i-1][j - 1]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func isSubsequence(s string, t string) bool {
    m := len(s)
    n := len(t)
    if m > n {
    return false
    }
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
    dp[i][j] = dp[i - 1][j - 1]
    if s[i - 1] == t[j - 1] {
    dp[i][j]++
    }
    }
    }
    return dp[m][n] == m
    }
    ]]>
    @@ -222,7 +222,7 @@ http://blog.beendless.com/2021/10/12/Stock%20Exchange%20Problems/ 2021-10-13T01:30:24.000Z - 2021-10-14T05:59:42.425Z + 2021-11-27T08:03:05.942Z 121. Best Time to Buy and Sell Stock

    a. Two pointers greedy solution.

    Since the profit is defined by the current price and the minimum price before today. So we can have one pointer holds the minimum price so far, and another pointer holds the max price so far, with the lowerest peak from the left and highest peak from the right, we can get the maximum profit.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func maxProfit(prices []int) int {
    profit := 0
    for min, i := 100001, 0; i < len(prices); i++ {
    if min > prices[i] {
    min = prices[i]
    }
    if prices[i] - min > profit {
    profit = prices[i] - min
    }
    }
    return profit
    }

    b. Dynamic programming

    Let’s denote dp[i] as the profit we have so far, it can be two cases:

    1. dp[i][0] We have stock so the profit we have for the first day if we buy stock is dp[0][0] = -prices[0]
    2. dp[i][1] We don’t have stock

    so the state transition function will be :

    dp[i][0] = max(dp[i - 1][0], -prices[i]) the maximum value if we bought the stock in the previous day of we buy the stock on day i
    dp[i][1] = max(dp[i - 1][0] + prices[i], dp[i-1][1]) the maximum value if we bought the stock before and sell it today, or we don’t have stock before and won’t buy today

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func maxProfit(prices []int) int {
    n := len(prices)
    dp := make([][2]int, n)
    dp[0][0] = -prices[0]
    dp[0][1] = 0
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[i][0] = max(dp[i - 1][0], -prices[i])
    dp[i][1] = max(dp[i - 1][0] + prices[i], dp[i - 1][1])
    }
    return dp[n - 1][1]
    }

    122. Best Time to Buy and Sell Stock II

    a. Greedy solution

    To gian the maximum amount of profit, we just need to accumulate the position profits if we buy it on the previous day and sell it on the next day.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    func maxProfit(prices []int) int {
    result := 0
    for i := 1; i < len(prices); i++ {
    profit := prices[i] - prices[i - 1]
    if profit > 0 {
    result += profit
    }
    }
    return result
    }

    b. Peak & Valley solution

    A naive approach is find the local lowest price (valley price) and sell it at the next local highest price (peak price). Then we accumulate all of those local profits.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func maxProfit(prices []int) int {
    result := 0
    peak := prices[0]
    valley := prices[0]
    length := len(prices)
    for i := 0; i < length - 1; {
    for i < length - 1 && prices[i] >= prices[i + 1] {
    i++
    }
    valley = prices[i]
    for i < length - 1 && prices[i] <= prices[i + 1] {
    i++
    }
    peak = prices[i]
    result += peak - valley
    }
    return result
    }

    c. Dynamic programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func maxProfit(prices []int) int {
    length := len(prices)
    dp := make([][2]int, length)
    // dp[i][0] on day i we are holding stock
    // dp[i][1] on day i we don't have stock
    dp[0] = [2]int{-prices[0], 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < length; i++ {
    // stock we got from day i - 1, or stock we are going to buy on day i
    dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
    // we don't have stock from day i - 1, or we are going to sell stock we got from day i - 1
    dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
    }
    return max(dp[length - 1][0], dp[length - 1][1])
    }

    123. Best Time to Buy and Sell Stock III

    Since we can make two transactions at most, so there will be 5 status for a given day dp[i]

    1. dp[i][0] We have made 0 transaction so far
    2. dp[i][1] We bought the stock once so far
    3. dp[i][2] We have made 1 full transaction once (bought/sold the stock once so far)
    4. dp[i][3] We bought the stock twice and sold once so far
    5. dp[i][4] We have made 2 full transaction once (bought/sold the stock twice so far)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func maxProfit(prices []int) int {
    n := len(prices)
    dp := make([][5]int, n)
    dp[0] = [5]int{0, -prices[0], 0, -prices[0], 0} // dp[0][1] = dp[0][0] - prices[0], dp[0][2] = dp[0][1] + prices[0], dp[0][3] = dp[0][2] - prices[0], dp[0][4] = dp[0][3] + prices[0],
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[i][0] = dp[i - 1][0]
    dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
    dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
    dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])
    dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4])
    }
    return dp[n-1][4]
    }

    We can also optimize the space complexity.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func maxProfit(prices []int) int {
    n := len(prices)
    dp := [5]int{0, -prices[0], 0, -prices[0], 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[1] = max(dp[0] - prices[i], dp[1])
    dp[2] = max(dp[1] + prices[i], dp[2])
    dp[3] = max(dp[2] - prices[i], dp[3])
    dp[4] = max(dp[3] + prices[i], dp[4])
    }
    return dp[4]
    }

    188. Best Time to Buy and Sell Stock IV

    Same as the above solution, here each day will won 2 * k + 1 states.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    func maxProfit(k int, prices []int) int {
    n := len(prices)
    if n == 0 {
    return 0
    }
    dp := make([][]int, n)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 0; i < n; i++ {
    dp[i] = make([]int, 2 * k + 1)
    }
    for i := 1; i < 2 * k + 1; i+=2 {
    dp[0][i] = -prices[0]
    }
    for i := 1; i < n; i++ {
    for j := 1; j < 2 * k + 1; j++ {
    if j % 2 == 1 {
    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i])
    } else {
    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i])
    }
    }
    }
    return dp[n - 1][2 * k]
    }

    We can reduce the space complexity to O(n)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func maxProfit(k int, prices []int) int {
    n := len(prices)
    if n == 0 {
    return 0
    }
    dp := make([]int, 2 * k + 1)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < 2 * k + 1; i+=2 {
    dp[i] = -prices[0]
    }
    for i := 1; i < n; i++ {
    for j := 1; j < 2 * k + 1; j++ {
    if j % 2 == 1 {
    dp[j] = max(dp[j], dp[j - 1] - prices[i])
    } else {
    dp[j] = max(dp[j], dp[j - 1] + prices[i])
    }
    }
    }
    return dp[2 * k]
    }

    309. Best Time to Buy and Sell Stock with Cooldown

    Similar like the above problems, we need to define the states of ith day based on the state machine diagram.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                   -----
    | |
    ⌄ |
    ------------
    | Cooldown |
    ------------
    / ^
    __ / \
    | | / \
    ⌄ | ⌄ \
    ------------ ------------
    | Buy |------- >| Sold |
    ------------ ------------

    1. dp[i][0] we are holding the stock, so dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])
    2. dp[i][1] we are selling the stock, so dp[i][1] = dp[i - 1][0] + prices[i]
    3. dp[i][2] we are in the cooldown period, so dp[i][2] = max(dp[i-1][2], dp[i-1][1])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func maxProfit(prices []int) int {
    n := len(prices)
    dp := make([][3]int, n)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    dp[0] = [3]int{-prices[0], 0, 0}
    for i := 1; i < n; i++ {
    dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])
    dp[i][1] = dp[i-1][0] + prices[i]
    dp[i][2] = max(dp[i-1][2], dp[i-1][1])
    }
    return max(dp[n-1][1], dp[n-1][2])
    }

    We can also reduce the space complexity to O(n)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func maxProfit(prices []int) int {
    n := len(prices)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    hold := -prices[0]
    cooldown := 0
    sold := 0
    for i := 1; i < n; i++ {
    previousSold := sold
    sold = hold + prices[i]
    hold = max(hold, cooldown - prices[i])
    cooldown = max(cooldown, previousSold)
    }
    return max(cooldown, sold)
    }

    714. Best Time to Buy and Sell Stock with Transaction Fee

    Same like #122, we just need to process the transaction fee when buying a new stock

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func maxProfit(prices []int, fee int) int {
    n := len(prices)
    dp := make([][2]int, n)
    dp[0] = [2]int{-prices[0]-fee, 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < n; i++ {
    dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i] - fee)
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
    }
    return dp[n-1][1]
    }
    ]]>
    @@ -243,10 +243,10 @@ - - + + @@ -256,7 +256,7 @@ http://blog.beendless.com/2021/10/09/Knapsack%20Problem%20II/ 2021-10-10T05:14:24.000Z - 2021-10-12T06:08:19.229Z + 2021-11-27T08:03:05.922Z 377. Combination Sum IV

    This is also a full knapsack problem. It looks similar to the coins change ii, but the difference here is that we need to get the permutation of the solutions instead of combination. So in this case we need to iterate the knapsack space first, then iterate the items.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func combinationSum4(nums []int, target int) int {
    dp := make([]int, target + 1)
    dp[0] = 1
    for i := 1; i <= target; i++ {
    for j := 0; j < len(nums); j++ {
    if i >= nums[j] {
    dp[i] += dp[i - nums[j]]
    }
    }
    }
    return dp[target]
    }

    279. Perfect Squares

    This is also a full knapsack problem. We can consider all squares not greater than the given n as items, n as the knapsack total capacity, and we can reuse all items to fill the knapsack. To get the minimal items, the state transition function is dp[i] = min(dp[i], dp[i - j] + 1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func numSquares(n int) int {
    squares := []int{}
    for i := 1; i * i <= n; i++ {
    squares = append(squares, i * i)
    }
    dp := make([]int, n + 1)
    dp[1] = 1
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    for i := 2; i <= n; i++ {
    for j := 0; j < len(squares); j++ {
    if i >= squares[j] {
    dp[i] = min(dp[i], dp[i - squares[j]] + 1) // here we are counting the number, so we increase the items count.
    }
    }
    }
    return dp[n]
    }

    We can also try to use backtracking to resolve this problem.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func numSquares(n int) int {
    squares := []int{}
    for i := 1; i * i <= n; i++ {
    squares = append(squares, i * i)
    }
    hash := make(map[int]int)
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    var backtracking func(int) int
    backtracking = func(index int) int {
    if v, ok := hash[index]; ok {
    return v
    }
    if index == 0 {
    return 0
    }
    count := n + 1
    for j := 0; j < len(squares); j++ {
    if index >= squares[j] {
    count = min(count, backtracking(index - squares[j]) + 1)
    }
    }
    hash[index] = count
    return count
    }
    return backtracking(n)
    }

    139. Word Break

    Obviously, an empty string can be part of any string. So if we denote dp[i] as s[:i] which can be constructed by the worddict, dp[0] is true. And the state transition function can be dp[i] = dp[i - len(words[j]] && words[j] == s[i - len(words[j]):i]. We can consider this as a full knapsack problem. Words can be consider as items, and the s can be considered as a special knapsack.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool, len(s) + 1)
    dp[0] = true
    for i := 1; i <= len(s); i++ {
    for j := 0; j < len(wordDict); j++ {
    if i >= wordDict[j] {
    dp[i] = dp[i] || (dp[i - len(wordDict[j])] && wordDict[j] == s[i - len(wordDict[j]):i])
    }
    }
    }
    return dp[len(s)]
    }

    We can also optimize it with a hashmap to store all words

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func wordBreak(s string, wordDict []string) bool {
    dp := make([]bool, len(s) + 1)
    hash := make(map[string]bool)
    for _, word := range wordDict {
    hash[word] = true
    }
    dp[0] = true
    for i := 1; i <= len(s); i++ {
    for j := 0; j < i; j++ {
    dp[i] = dp[i] || (dp[j] && hash[s[j:i]])
    }
    }
    return dp[len(s)]
    }
    ]]>
    @@ -288,7 +288,7 @@ http://blog.beendless.com/2021/10/08/Dynamic%20Programming%20II/ 2021-10-08T18:04:24.000Z - 2021-10-12T07:52:52.523Z + 2021-11-27T08:03:05.894Z 494. Target Sum

    a. Brute-force DFS recursive solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func findTargetSumWays(nums []int, target int) int {
    count := 0
    var dfs func(int ,int)
    dfs = func(index, left int) {
    if index == len(nums) {
    if left == 0 {
    count++
    }
    } else {
    dfs(index + 1, left + nums[index])
    dfs(index + 1, left - nums[index])
    }
    }
    dfs(0, target)
    return count
    }

    b. Dynamic Programming

    dp[i][j] refers to the number of assignments which can lead to a sum of j up to the ith items in the Array. We can get the state transition function: dp[i][j] = dp[i - 1][j + nums[i]] + dp[i - 1][j - nums[i]]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    func findTargetSumWays(nums []int, target int) int {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum < target || -sum > target || (sum + target) % 2 != 0 {
    return 0
    }
    n := len(nums)
    dp := make([][]int, n)
    for i := 0; i < n; i++ {
    dp[i] = make([]int, 2 * sum + 1)
    }
    dp[0][sum + nums[0]] = 1
    dp[0][sum - nums[0]] += 1
    for i := 1; i < n; i++ {
    for j := -sum; j <= sum; j++ {
    if j + nums[i] < sum + 1 {
    dp[i][j + sum + nums[i]] += dp[i - 1][j + sum]
    }
    if j + sum - nums[i] >= 0 {
    dp[i][j + sum - nums[i]] += dp[i - 1][j + sum]
    }
    }
    }
    return dp[n - 1][sum + target]
    }

    c. Knapsack solution (subset sum)

    Based on the problem description, we will have two subsets. One with positive symbol (s1) and another one with negative symbol (s2). So s1 + s2 = sum and s1 - s2 = target. We can convert this problem to a 0-1 knapsack problem — find a subset which subtotal is s1 = (sum + target) / 2.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    func findTargetSumWays(nums []int, target int) int {
    sum := 0
    zero := 0
    sort.Ints(nums) // to make sure we can handle cases contains 0
    for _, num := range nums {
    if num == 0 {
    zero++
    }
    sum += num
    }
    if sum < target || -sum > target || (sum + target) % 2 != 0 {
    return 0
    }
    n := len(nums)
    target = (sum + target) / 2
    dp := make([][]int, n + 1)
    for i := 0; i <= n; i++ {
    dp[i] = make([]int, target + 1)
    dp[i][0] = 1
    }
    for i := 1; i <= n; i++ {
    for j := 1; j <= target; j++ {
    dp[i][j] = dp[i-1][j]
    if j >= nums[i - 1] {
    dp[i][j] += dp[i-1][j - nums[i - 1]]
    }
    }
    }
    return dp[n][target] * int(math.Pow(float64(2), float64(zero)))
    }

    We can use 1D rolling array to reduce the space complexity.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func findTargetSumWays(nums []int, target int) int {
    sum := 0
    zeros := 0
    sort.Ints(nums)
    for _, num := range nums {
    sum += num
    if num == 0 {
    zeros++
    }
    }
    if sum < target || -sum > target || (sum + target) % 2 == 1 {
    return 0
    }
    n := len(nums)
    target = (sum + target) / 2
    dp := make([]int, target + 1)
    dp[0] = 1
    for i := 0; i < n; i++ {
    for j := target; j >= nums[i]; j-- {
    dp[j] += dp[j - nums[i]]
    }
    }
    return dp[target] * int(math.Pow(float64(2), float64(zeros)))
    }

    198. House Robber

    State transition function: dp[i] = max(dp[i - 1], dp[i - 2] + value[i]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func rob(nums []int) int {
    n := len(nums)
    dp := make([]int, n + 1)
    dp[1] = nums[0]
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 2; i <= n; i++ {
    dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
    }
    return dp[n]
    }

    213. House Robber II

    Since we only need to compare [0, n-1] and [1, n] cases, and those two can be resolved with the solution we have above.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func rob(nums []int) int {
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    if len(nums) == 1 {
    return nums[0]
    }
    basicRobber := func(nums []int) int{
    n := len(nums)
    dp := make([]int, n + 1)
    dp[1] = nums[0]
    for i := 2; i <= n; i++ {
    dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
    }
    return dp[n]
    }
    return max(basicRobber(nums[:len(nums) - 1]), basicRobber(nums[1:len(nums)]))
    }

    337. House Robber III

    a. DFS + memorized result

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /**
    * Definition for a binary tree node.
    * type TreeNode struct {
    * Val int
    * Left *TreeNode
    * Right *TreeNode
    * }
    */
    func rob(root *TreeNode) int {
    cache := make(map[*TreeNode]int)
    var dfs func(*TreeNode) int
    dfs = func(root *TreeNode) int {
    if root == nil {
    return 0
    }
    if value, ok := cache[root]; ok {
    return value
    }
    rootValue := root.Val
    if root.Left != nil {
    rootValue += dfs(root.Left.Left) + dfs(root.Left.Right)
    }
    if root.Right != nil {
    rootValue += dfs(root.Right.Left) + dfs(root.Right.Right)
    }
    childValue := dfs(root.Left) + dfs(root.Right)
    maxValue := childValue
    if rootValue > childValue {
    maxValue = rootValue
    }
    cache[root] = maxValue
    return maxValue
    }
    return dfs(root)
    }

    b. Dynamic Programming to cache more calculation results.

    Since each node has two values, with or without its own value. The above one only caches the maxValue, if we cache both of those in an array, it will speed up the calculating.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func rob(root *TreeNode) int {
    cache := make(map[*TreeNode][2]int)
    var dfs func(*TreeNode) [2]int
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    dfs = func(root *TreeNode) [2]int {
    if root == nil {
    return [2]int{0, 0}
    }
    if value, ok := cache[root]; ok {
    return value
    }
    rootValue := root.Val
    leftValue := dfs(root.Left)
    rightValue := dfs(root.Right)
    childValue := max(leftValue[0], leftValue[1]) + max(rightValue[0], rightValue[1])
    cache[root] = [2]int{rootValue + leftValue[1] + rightValue[1], childValue}
    return cache[root]
    }
    value := dfs(root)
    return max(value[0], value[1])
    }
    ]]>
    @@ -309,12 +309,12 @@ - - + + @@ -322,7 +322,7 @@ http://blog.beendless.com/2021/10/07/Knapsack%20Problem%20I/ 2021-10-08T05:12:24.000Z - 2021-10-10T06:57:34.131Z + 2021-11-27T08:03:05.920Z The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.

    416. Partition Equal Subset Sum

    We can quickly get the result if the sum is an odd number. If the sum is an even number s, it means we need to find some items in the slice which can get a sum to s / 2. Now the problem becomes a classical 0-1 knapsack problem.

    a. Classical 0-1 knapsack solution

    Denote dp[i][j] as if we can construct a sum j from the first i items. So the state transition function is dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]. The value is determined by:

    1. If we don’t use the current item, we need to check if we can construct the target j by the first i - 1 items: dp[i-1][j]
    2. If we use the current item, we need to check if we can construct the target j - nums[i] by the first i - 1 items: dp[i - 1][j - nums[i]]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    func canPartition(nums []int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % 2 == 1 {
    return false
    }
    target := sum / 2
    n := len(nums)
    dp := make([][]bool, n + 1)
    for i := 0; i <= n; i++ {
    dp[i] = make([]bool, target + 1)
    dp[i][0] = true
    }
    for i := 1; i <= n; i++ {
    for j := 1; j <= target; j++ {
    if j >= nums[i - 1] {
    dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]]
    } else {
    dp[i][j] = dp[i - 1][j]
    }
    }
    }
    return dp[n][target]
    }

    b. Rolling array solution

    Based on the state transition function above, we can simplifiy it by using a 1D array. dp[i] = dp[i] || dp[i - nums[i]]. Note since this time in the 1D array, the left part has side effect to the right side, so we need to iterate the array from right to left.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func canPartition(nums []int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % 2 == 1 {
    return false
    }
    target := sum / 2
    n := len(nums)
    dp := make([]bool, target + 1)
    dp[0] = true
    for i := 0; i < n; i++ {
    for j := target; j >= nums[i]; j-- {
    dp[j] = dp[j] || dp[j - nums[i]]
    }
    }
    return dp[target]
    }

    Note: the two solutions above are using bool value as dp array value type, we can also use int to store the sum we can get. So the state transition function will be dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]). At the end, we just need to veryfy dp[target] == target.

    1049. Last Stone Weight II

    a. Dynamic programming

    To get the minimum result, we need to try our best to split the stones into two similar weight subsets. Let’s denote the sum as the total weight of all stones, so we need to find target = sum/2 to get the minimum sum - 2 * target

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func lastStoneWeightII(stones []int) int {
    sum := 0
    for _, stone := range stones {
    sum += stone
    }
    target := sum / 2
    n := len(stones)
    dp := make([][]int, n + 1)
    for i := 0; i <= n; i++ {
    dp[i] = make([]int, target + 1)
    }
    for i := 1; i <= n; i++ {
    for j := 0; j <= target; j++ {
    if j >= stones[i - 1] && dp[i - 1][j] < dp[i - 1][j - stones[i - 1]] + stones[i - 1] {
    dp[i][j] = dp[i - 1][j - stones[i - 1]] + stones[i - 1]
    } else {
    dp[i][j] = dp[i - 1][j]
    }
    }
    }
    return sum - 2 * dp[n][target]
    }

    We can use 1D rolling array

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func lastStoneWeightII(stones []int) int {
    sum := 0
    for _, stone := range stones {
    sum += stone
    }
    target := sum / 2
    n := len(stones)
    dp := make([]int, target + 1)
    for i := 0; i < n; i++ {
    for j := target; j >= stones[i]; j-- {
    if dp[j] < dp[j - stones[i]] + stones[i] {
    dp[j] = dp[j - stones[i]] + stones[i]
    }
    }
    }
    return sum - 2 * dp[target]
    }

    b. Brute-force Set

    We can get all possible combinations of the sum and find the minimum absolute value.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    func lastStoneWeightII(stones []int) int {
    sum := stones[0]
    hash := make(map[int]bool)
    hash[stones[0]] = true
    hash[-stones[0]] = true
    n := len(stones)
    for i := 1; i < n; i++ {
    sum += stones[i]
    temp := make(map[int]bool)
    for key, _ := range hash {
    temp[key + stones[i]] = true
    temp[key - stones[i]] = true
    }
    hash = temp
    }
    result := sum + 1
    for key, _ := range hash {
    if key >= 0 && key < result{
    result = key
    } else if key < 0 && -key < result {
    result = -key
    }
    }
    return result
    }

    474. Ones and Zeroes

    Each items have two properties (1 amount and 0 amount) and we need to get the maximum sum of a subset based on the two dememsion restrictions (total 1 amount n and total 0 amount m). It can be considered as a classical two dememsion 0-1 knapsack problem. So the state transition function is dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1) (Note, ideally we need 3D array to solve this problem, but based on the state transition function, we can reduce to a 2D rolling array with reverse for-loop).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func findMaxForm(strs []string, m int, n int) int {
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i++ {
    dp[i] = make([]int, n + 1)
    }
    for _, str := range strs {
    ones := strings.Count("1")
    zeros := strings.Count("0")
    for i := m; i >= zeros; i-- {
    for j := n; j >= ones; j-- {
    pickme := dp[i - zeros][j - ones] + 1
    if dp[i][j] < pickme {
    dp[i][j] = pickme
    }
    }
    }
    }
    return dp[m][j]
    }

    322. Coin Change

    This is a classical full knapsack problem. The state transition function is dp[i] = min(dp[i], dp[i - coins[i]] + 1). Since we need to get the minimal number, so the initial value needs to be an integer which is out of the scope (except dp[0] which is 0). We can either use math.MaxInt32 or amount + 1

    a. Traverse knapsack volume first.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func coinChange(coins []int, amount int) int {
    dp := make([]int, amount + 1)
    dp[0] = 0
    for i := 0; i <= amount; i++ {
    dp[i] = math.MaxInt32
    }
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    for i := 1; i <= amount; i++ {
    for j := 0; j < len(coins); j++ {
    if i >= coins[j] && dp[i - coins[j]] != math.MaxInt32 { // If we pick one current coin and there's some calculated solution to the state dp[i - coins[j]] which is not the initial value, then we have a valid solution
    dp[i] = min(dp[i], dp[i - coins[j]] + 1)
    }
    }
    }
    if dp[amount] == math.MaxInt32 {
    return -1
    }
    return dp[amount]
    }

    b. Traverse items first.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func coinChange(coins []int, amount int) int {
    dp := make([]int, amount + 1)
    dp[0] = 0
    for i := 1; i <= amount; i++ {
    dp[i] = math.MaxInt32
    }
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    for i := 0; i < len(coins); i++ {
    for j := coins[i]; j <= amount; j++ {
    if dp[j - coins[i]] != math.MaxInt32 {
    dp[j] = min(dp[j], dp[j - coins[i]] + 1)
    }
    }
    }
    if dp[amount] == math.MaxInt32 {
    return -1
    }
    return dp[amount]
    }

    518. Coin Change 2

    This is is also a full knapsack problem. The difference between this and the above is that we need to get the amount of combinations. So the state transition function is dp[i] += dp[i - coins[j]]. Since here each coin change solution is a combination problem instead of permutation problem, we can only iterate the coins first. If we iterate the knapsack space first, we will get the duplicated result like [[coins[0], coins[1]], [coins[1], coins[0]]].

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    func change(amount int, coins []int) int {
    dp := make([]int, amount + 1)
    dp[0] = 1
    for i := 0; i < len(coins); i++ {
    for j := coins[i]; j <= amount; j++ {
    dp[j] += dp[j - coins[i]]
    }
    }
    return dp[amount]
    }

    Based on the problems above, we can get a knapsack problem solution template

    0-1 knapsack template

    1
    2
    3
    4
    5
    6
    7
    8
    9
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    for i := 0; i <= len(nums); i++ {
    for j := amount; j >= nums[i]; j-- {
    // state transition function
    // dp[j] = dp[j] || dp[j - nums[i]]
    // dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
    }
    }

    full knapsack template to get the combination of items

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    // dp[i] = // Initial value based on the problem, could be 0 for total solutions counting or min/max value to get the maximum/minimum expectation
    for i := 0; i < len(nums); i++ {
    for j := nums[i]; j <= amount; j++ {
    // state transition function
    // dp[j] += dp[j - nums[i]]
    // dp[j] = min(dp[j], dp[j - nums[i]] + nums[i])
    }
    }

    full knapsack template to get the permutation of items

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dp := make([]int, amount + 1)
    dp[0] = // Initial value based on the problem
    // dp[i] = // Initial value based on the problem, could be 0 for total solutions counting or min/max value to get the maximum/minimum expectation
    for j := 0; j <= amount; j++ {
    for i := 0; i < len(nums); i++ {
    // state transition function
    // dp[j] += dp[j - nums[i]]
    // dp[j] = min(dp[j], dp[j - nums[i]] + nums[i])
    }
    }
    ]]>
    @@ -354,7 +354,7 @@ http://blog.beendless.com/2021/10/06/Dynamic%20Programming%20I/ 2021-10-07T05:00:25.000Z - 2021-10-10T07:08:28.566Z + 2021-11-27T08:03:05.889Z Dynamic Programming (commonly referred to as DP) is an algorithmic technique for solving a problem by recursively breaking it down into simpler subproblems and using the fact that the optimal solution to the overall problem depends upon the optimal solution to it’s individual subproblems. Here is an interesting Quora question How should I explain dynamic programming to a 4-year-old?.

    509. Fibonacci Number

    a. Recursive solution

    1
    2
    3
    4
    5
    6
    7
    8
    func fib(n int) int {
    if n < 2 {
    return n
    }
    fib0 := fib(n - 2)
    fib1 := fib(n - 1)
    return fib0 + fib1
    }

    b. Dynamic Programming

    State transition function: dp[i] = dp[i - 1] + dp[i - 2]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func fib(n int) int {
    if n < 2 {
    return n
    }
    dp := make([]int, n + 1)
    dp[0] = 0
    dp[1] = 1
    for i := 2; i <= n; i++ {
    dp[i] = dp[i - 1] + dp[i - 2]
    }
    return dp[n]
    }

    70. Climbing Stairs

    State transition function: dp[i] = dp[i - 1] + dp[i - 2]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func climbStairs(n int) int {
    if n < 3 {
    return n
    }
    dp := make([]int, n + 1)
    dp[0] = 0
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
    dp[i] = dp[i - 1] + dp[i - 2]
    }
    return dp[n]
    }

    If given we can climb the stairs from 1 ~ m steps each time, how to solve this problem? It becomes a full knapsack problem now. And the state transition function is dp[i] += dp[i - j], here 2 is the special case.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func climbStairs(n int) int {
    steps := []int{1, 2}
    dp := make([]int, n + 1)
    dp[0] = 1
    for i := 1; i <= n; i++ {
    for j := 0; j < len(steps); j++ {
    if i >= steps[j] {
    dp[i] += dp[i - steps[j]]
    }
    }
    }
    return dp[n]
    }

    746. Min Cost Climbing Stairs

    Denote dp[i] to the cost we want to step away from stair ith, so the state transition function: min(dp[i - 1], dp[i - 2]) + cost[i].

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func minCostClimbingStairs(cost []int) int {
    n := len(cost)
    dp := make([]int, n)
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    dp[0] = cost[0]
    dp[1] = cost[1]
    for i := 2; i < n; i++ {
    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]
    }
    return min(dp[n - 1], dp[n - 2]) // To reach to stair n, we can step away from n - 1 or n - 2
    }

    Another way to think about it. If we denote dp[i] as the cost to reach to ith stair, the state transition function is dp[n] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func minCostClimbingStairs(cost []int) int {
    n := len(cost)
    dp := make([]int, n + 1)
    min := func(a, b int) int {
    if a < b {
    return a
    }
    return b
    }
    for i := 2; i <= n; i++ {
    dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
    }
    return dp[n]
    }

    62. Unique Paths

    It’s easy to get the state transition function dp[i][j] = dp[i - 1][j] + dp[i][j - 1] . Note for the special case first line and first row, the value is 1.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func uniquePaths(m int, n int) int {
    dp := make([][]int, m)
    for i := 0; i < m; i++ {
    dp[i] = make([]int, n)
    dp[i][0] = 1
    }
    for i := 0; i < n; i++ {
    dp[0][i] = 1
    }
    for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    }
    }
    return dp[m - 1][n - 1]
    }

    Based on the state transition function, dp[i][j] is defined only by two values, so we can optimize the space complexity from O(m * n) to O(n) by using a new state transition function dp[j] = dp[j] + dp[j - 1]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    func uniquePaths(m int, n int) int {
    dp := make([]int, n)
    for i := 0; i < n; i++ {
    dp[i] = 1
    }
    for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
    dp[j] += dp[j - 1]
    }
    }
    return dp[n - 1]
    }

    63. Unique Paths II

    This is a similar problem to #62. The only difference is that we need to reset the path sum to 0 if there’s an obstacle at the coordinate.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m := len(obstacleGrid)
    n := len(obstacleGrid[0])
    dp := make([]int, n)
    for i := 0; i < n; i++ {
    if obstacleGrid[0][i] = 1 {
    dp[i] = 0
    } else if i == 0 {
    dp[i] = 1
    } else {
    dp[i] = dp[i - 1]
    }
    }
    for i := 1; i < m; i++ {
    for j := 0; j < n; j++ {
    if obstacleGrid[i][j] == 1{
    dp[i] = 0
    } else if j > 0 {
    dp[i] += dp[i - 1]
    }
    }
    }
    return dp[n - 1]
    }

    343. Integer Break

    The key point of solving this problem is to get the state transition function. There are two cases:

    1. we can split the number i into two i - j and j
    2. we can split the number into more than two, this case we can reuse the cached value from dp array. dp[i - j] * j

    So the state transition function dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func integerBreak(n int) int {
    dp := make([]int, n + 1)
    dp[1] = 1
    dp[2] = 1
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 3; i <= n; i++ {
    for j := 1; j < i; j++ {
    two := j * (i - j)
    twoMore := j * dp[i - j]
    dp[i] = max(dp[i], max(two, twoMore))
    }
    }
    return dp[n]
    }

    96. Unique Binary Search Trees

    Based on the BST specs, we can get the state transition function dp[i] = dp[j] * dp[i - j - 1], here dp[i] denotes when i is set to the root node, we have j nodes on left child and i - j - 1 on right child. Note here the base case is 1. If there’s 0 nodes on left tree, it means we can construct the left tree in one uniq way.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func numTrees(n int) int {
    if n < 3 {
    return n
    }
    dp := make([]int, n + 1)
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    for i := 3; i <= n; i++ {
    for j := 0; j < i; j++ {
    dp[i] += dp[j] & dp[i - j - 1]
    }
    }
    return dp[n]
    }
    ]]>
    @@ -386,7 +386,7 @@ http://blog.beendless.com/2021/10/06/Greedy%20%20Problems%20III/ 2021-10-07T04:55:24.000Z - 2021-10-07T04:58:31.120Z + 2021-11-27T08:03:05.907Z 56. Merge Intervals

    Similar to other sgement related problems. The first thing we need to do is to sort the slice. Once we have a sorted segment slice, we can iterate over all items and merge them. Note there is one edge case we need to cover after the iteration, either we merged all segments into one or the last one can’t be merged into the previous segment.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func merge(intervals [][]int) [][]int {
    sort.Slice(intervals, func(a, b int) bool {
    return intervals[a][0] < intervals[b][0]
    })
    result := []int{}
    start := intervals[0][0]
    end := intervals[0][1]
    for i := 0; i < len(intervals); i++ {
    if end < intervals[i][0] {
    result = append(result, []int{start, end})
    start = intervals[i][0]
    end = intervals[i][1]
    } else if end < intervals[i][1] {
    end = intervals[i][1]
    }
    }
    result = append(result, []int{start, end})
    return result
    }

    763. Partition Labels

    738. Monotone Increasing Digits

    968. Binary Tree Cameras

    ]]>
    @@ -416,7 +416,7 @@ http://blog.beendless.com/2021/10/05/Greedy%20%20Problems%20II/ 2021-10-05T17:25:24.000Z - 2021-10-07T04:35:57.648Z + 2021-11-27T08:03:05.905Z 1005. Maximize Sum Of Array After K Negations

    To get a maximum sum, we need to convert as many negative numbers to positive ones. If there is still an odd times of converting number left, we just need to convert the smallest positive number to a negative one

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func largestSumAfterKNegations(nums []int, k int) int {
    sort.Ints(nums)
    i := 0
    for i < k && i < len(nums) {
    if nums[i] < 0 {
    nums[i] = -nums[i]
    i++
    } else {
    break
    }
    }
    if i < k && (k - i) % 2 == 1 {
    sort.Ints(nums)
    nums[0] = -nums[0]
    }
    result := 0
    for _, num := range nums {
    result += num
    }
    return result
    }

    134. Gas Station

    Several cases:
    1) If the total amount of gas is less than the total amount of the cost, we can’t make a round trip
    2) Given an arbitrary start point i, and at i we have gas[i] in the tank. Let’s start at this point and accumulate the gas we left in the tank. If at point i + k the acculation is negative, it means we can’t reach from any point in beteeen [i, i + k - 1) to point k. So we can quickly start from i + k + 1 instead of i + 1.

    So the local optimal solution for a given start point is from this starting point, we are making a round trip, the debet won’t be negative. If it’s negative, we need to start after the negative point. This can lead to a global optimal solution.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func canCompleteCircuit(gas []int, cost []int) int {
    result := 0
    sum := 0
    debet := 0
    for i := 0; i < len(gas); i++ {
    sum += gas[i] - cost[i]
    debet += gas[i] - cost[i]
    if debet < 0 {
    debet = 0
    result = i + 1
    }
    }
    if sum < 0 {
    return -1
    }
    return result
    }

    135. Candy

    Since the rating only have effect to neighbour candy distribution. We can start from one end to distribution the candy once, to make sure all children are happy when looking to their right. Then we make another round from the other end.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func candy(ratings []int) int {
    length := len(ratings)
    candies := make([]int, length)
    candies[0] = 1
    for i := 1; i < length; i++ {
    if ratings[i] > ratings[i - 1] {
    candies[i] = candies[i - 1] + 1
    } else {
    candies[i] = 1
    }
    }
    for i := length - 2; i >= 0; i-- {
    if ratings[i] > ratings[i + 1] && candies[i] < candies[i + 1] + 1 {
    candies[i] = candies[i + 1] + 1
    }
    }
    result := 0
    for i := 0; i < length; i++ {
    result += candies[i]
    }
    return result
    }

    860. Lemonade Change

    A greedy solution will be if we have 10, we provide 10 to customers who pay with $20.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func lemonadeChange(bills []int) bool {
    five := 0
    ten := 0
    for i := 0; i < len(bills); i++ {
    switch bills[i] {
    case 5:
    five++
    case 10:
    ten++
    if five >= 1 {
    five --
    } else {
    return false
    }
    case 20:
    if ten == 0 {
    if five < 3 {
    return false
    }
    five -= 3
    } else if ten > 0 {
    ten--
    if five == 0 {
    return false
    }
    five--
    }
    }
    }
    return true
    }

    406. Queue Reconstruction by Height

    Since there are to demensions, and the demension k depends on h, the idea is we sort the given slice by h as the primary order, k as the secondary order. After that, we use the insert sorting algorithm to insert all slice items one by one based on the k value to a new slice.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func reconstructQueue(people [][]int) [][]int {
    result := [][]int{}
    sort.Slice(people, func(a, b int) bool { // order by h desc, order by k asc
    if people[a][0] == people[b][0] {
    return people[a][1] < people[b][1]
    }
    return people[a][0] > people[b][0]
    })
    for _, p := range people {
    result = append(result, p)
    copy(result[p[1] + 1:], result[p[1]:])
    result[p[1]] = p
    }
    return result
    }

    452. Minimum Number of Arrows to Burst Balloons

    A greedy solution is we choose the shoot point which is the most line segments overlaped as a local optimal, it also leads to a global optimal solution. For example, we have four segments as below. If we sort them by the start point, we can easily get a first point should be between e ~ b. It means we iterate all segments, if the current segment’s start point is no great than the previous one’s end point, we can merge those two by reseting the current one’s end point to the minimum number between itself and the previous one’s end point.

    1
    2
    3
    4
    5
    6
    7
    8
    |--------------|
    a b
    |-----------------|
    c d
    |---------|
    e f
    |---------|
    g h
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func findMinArrowShots(points [][]int) int {
    sort.Slice(points, func(a, b int) bool {
    return points[a][0] < points[b][0]
    })
    result := 1
    for i := 1; i < len(points); i++ {
    if points[i][0] > points[i - 1][1] {
    result++
    } else if points[i][1] > points[i - 1][1] {
    points[i][1] = points[i - 1][1]
    }
    }
    return result

    }

    435. Non-overlapping Intervals

    This one is a similar problem as #452. An intuition to solve this kind of problem is sort if first. Since all line segments have two points, we have two choices to sort it. The local optimal to find the interval is the end of current segment should have a distance between the next one’s start point. With this in mind, we can quickly get the total of intervals. So if we sort by the end point, we can iterate from left to right. Otherwise, we need to reverse the iteration order.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func eraseOverlapIntervals(intervals [][]int) int {
    sort.Slice(intervals, func(a, b int) bool {
    return intervals[a][1] < intervals[b][1]
    })
    end := intervals[0][1]
    count := 1
    for i := 1; i < len(intervals); i++ {
    if end <= intervals[i][0] {
    count++
    end = intervals[i][1]
    }
    }
    return len(intervals) - count
    }
    ]]>
    @@ -446,7 +446,7 @@ http://blog.beendless.com/2021/10/03/JumpGame%20%20Problems/ 2021-10-04T05:05:24.000Z - 2021-10-06T01:29:23.904Z + 2021-11-27T08:03:05.918Z 55. Jump Game

    a. Greedy solutions

    At each step, a greedy jump can give us the local optimal furthest solution. Our global solution can be found in if we always take the greedy jump.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func canJump(nums []int) bool {
    distance := 0
    length := len(nums)
    for i := 0; i <= distance; i++ { // Note: here we use distance to control which items we can check
    if distance < i + nums[i] {
    distance = i + nums[i]
    }
    if distance >= length - 1 {
    return true
    }
    }
    return false
    }

    b. Dynamic programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func canJump(nums []int) bool {
    length := len(nums)
    dp := make([]int, length)
    dp[0] = true
    for i := 0; i < length; i++ {
    if dp[i] {
    for j := 1; j <= nums[i] && i + j < length; j++ {
    dp[i + j] = true
    }
    }
    }
    return dp[length - 1]
    }

    45. Jump Game II

    a. Greedy solution

    Each time, we will jump to a position which can make us future jumping even further. And each jump will resolve to a coverage range as below, so the total jump steps will be the sum of times we reach to the edge of the coverge range.

    1
    2
    3
    4
    5
    6
    | 2 | 3 | 1 | 1 | 4 | 5 | 1 | 2 |

    |---------->|
    |-------------->|

    |-------------->|
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func jump(nums []int) int {
    result := 0
    length := len(nums)
    end := 0
    max := 0
    for i := 0; i < length - 1; i++{
    if max < nums[i] + i { // Get the next coverage edge
    max = nums[i] + i
    }
    if i == end { // Switch to the next range with a jump
    end = max
    result++
    }
    }
    return result
    }

    b. Dynamic programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    func jump(nums []int) int {
    dp := make([]int, len(nums))
    dp[0] = 0
    for i := 1; i < len(nums); i++ {
    dp[i] = -1
    }
    for i := 0; i < len(nums); i ++ {
    for j := 1; j <= nums[i] && i + j < len(nums); j++ {
    if dp[i + j] == -1 {
    dp[i + j] = dp[i] + 1
    } else if dp[i + j] > dp[i] + 1 {
    dp[i + j] = dp[i] + 1
    }
    }
    }
    return dp[len(nums) - 1]
    }

    1306. Jump Game III

    The keypoint here is during the traversal of the recursive, we don’t get lost in a infinite loop. So we need to remember all of the visted nodes in a hash.

    a. Recursive solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    func canReach(arr []int, start int) bool {
    result := false
    reachedNodes := make(map[int]bool)
    var jump func(int)
    jump = func(index int) {
    if arr[index] == 0 {
    result = true
    return
    }
    if reachedNodes[index] {
    return
    }
    reachedNodes[index] = true
    if index - arr[index] >= 0 {
    jump(index - arr[index])
    }
    if index + arr[index] < len(arr) {
    jump(index + arr[index])
    }
    }
    jump(start)
    return result
    }

    b. Queue traversal solution.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func canReach(arr []int, start int) bool {
    reachedNodes := make(map[int]bool)
    queue := []int{start}
    length := len(arr)
    for len(queue) > 0 {
    index := queue[0]
    if arr[index] == 0 {
    return true
    }
    reachedNodes[index] = true
    queue = queue[1:]
    if index + arr[index] < length && !reachedNodes[index + arr[index]] {
    queue = append(queue, index + arr[index])
    }
    if index - arr[index] < length && !reachedNodes[index - arr[index]] {
    queue = append(queue, index - arr[index])
    }
    }
    return false
    }

    1345. Jump Game IV

    This is a classical tree traversal with BFS problem. From each array index we can jump to multiple elements simoteniously, those nextstep elements can be consiered as the tree node’s child nodes. So we jump to all nodes’s children nodes at once which can be considered as one jump (BFS). Since the same value of the nodes can jump to each other, we have to mark the nodes values which have been pushed to the queue to make sure we don’t push the same nodes back to the queue (even we have a visited flag, we can easily run out of memory without another same number flag under this edge case if we have 1000 same value nodes in the slice).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    func minJumps(arr []int) int {
    length := len(arr)
    if length < 3 {
    return length - 1
    }
    jumpIndexes := make(map[int][]int)
    for i, v := range arr {
    jumpIndexes[v] = append(jumpIndexes[v], i)
    }
    queue := make([]int, 1)
    queue[0] = 0
    result := 0
    visited := make([]bool, length)
    sameNumberVisited := make(map[int]bool) // Have a flag is one thing, another solution is to remove the sameNumber key from the jumpIndexes hashmap.
    n := len(queue)
    for n > 0 {
    for i := 0; i < n; i++ {
    index := queue[i]
    if index == length - 1 {
    return result
    }
    if !visited[index] {
    visited[index] = true
    if index - 1 >= 0 && !visited[index - 1]{
    queue = append(queue, index - 1)
    }
    if index + 1 < length && !visited[index + 1] {
    queue = append(queue, index + 1)
    }
    if !sameNumberVisited[arr[index]] {
    sameNumberVisited[arr[index]] = true
    for _, v := range jumpIndexes[arr[index]] {
    if !visited[v] {
    queue = append(queue, v)
    }
    }
    }
    }
    }
    queue = queue[n:]
    n = len(queue)
    result++
    }
    return result
    }

    1340. Jump Game V

    To resolve this problem, we need to understand you can only jump from index i to index j if arr[i] > arr[j] and arr[i] > arr[k] for all indices k between i and j (More formally min(i, j) < k < max(i, j)).. Let’s say we stand at index i, and jumping from i - 1, i + 1 until i - d, i + d inside of for loops. We need to break the loop if we find a k between [i-d, i) or (i, i + d] which makes arr[k] >= arr[i].

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    func maxJumps(arr []int, d int) int {
    result := 0
    length := len(arr)
    dp := make([]int, length)
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    var jump func(int) int
    jump = func(index int) int {
    if dp[index] == 0 {
    dp[index] = 1
    for i := index - 1; i >= max(0, index - d) && arr[i] < arr[index]; i-- {
    dp[index] = max(dp[index], jump(i) + 1)
    }
    for i := index + 1; i <= min(length - 1, index + d) && arr[i] < arr[index]; i++ {
    dp[index] = max(dp[index], jump(i) + 1)
    }
    }
    return dp[index]
    }
    for i := 0; i < length; i++ {
    dp[i] = jump(i)
    result = max(dp[i], result)
    }
    return result
    }

    1696. Jump Game VI

    A naive idea is to iterate over all nodes, so the worse time complexity could be O(n * k) [K = maxJump - minJump] which most likely will cause a TLE issue. This one can be considered as a classic sliding window maximum problem. Since dp[i] = nums[i] + max(dp[i - k], … , dp[i - 1]). We just need to maintain the maximum dp value in the sliding window during the iteration.

    1
    2
    3
    4
    5
    6
    7
    8
    01010101010101011111

    |---------(i)------|
    |----->|
    i-k i-1
    |----------(i + 1)------|
    |----->|
    i-k+1 i
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func maxResult(nums []int, k int) int {
    length := len(nums)
    queue := []int{0} // stores the dp indexes of the sliding window items
    dp := make([]int, length)
    dp[0] = nums[0]
    for i := 1; i < length; i++ {
    maxSumIndex := queue[0]
    dp[i] = nums[i] + dp[maxSumIndex]
    for len(queue) > 0 && dp[queue[len(queue) - 1]] <= dp[i] { // sliding window queue contains all values in a desending order
    queue = queue[:len(queue) - 1]
    }
    for len(queue) > 0 && i - queue[0] >= k { // remove the index which is going to out of the window
    queue = queue[1:]
    }
    queue = append(queue, dp[i])
    }
    return dp[length - 1]
    }

    1871. Jump Game VII

    Same as the above one, a naive dp will get a TLE. A keypoint to solve this problem is we need to avoid the duplicated node visiting. One way is we can use a hashmap to note all visited elements. Another method is that we can bypass the overlap like below:

    1
    2
    3
    4
    5
    01010101010101011111
    |--------->|
    1 2
    |--------->|
    3 4

    The first jump range is 1 ~ 2, the second is 3 ~ 4, here the range 3 ~ 2 doesn’t need to be visited again. With this in mind, we can use tree-like traversal solution with queue or two pointers sliding window to fix this issue.

    a. Queue with traversal solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    func canReach(s string, minJump int, maxJump int) bool {
    queue := []int{0}
    length := len(s)
    visited := make(map[int]bool)
    visited[0] = true
    edge := 0
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for len(queue) > 0 {
    index := queue[0]
    if index == length - 1 {
    return true
    }
    queue = queue[1:]
    left := index + minJump
    right := min(length - 1, index + maxJump)
    for i := max(edge + 1, left); i <= right; i++ {
    if s[i] == '0' && !visited[i]{
    visited[i] = true
    queue = append(queue, i)
    }
    }
    edge = right
    }
    return false
    }

    b. Two pointers

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    func canReach(s string, minJump int, maxJump int) bool {
    length := len(s)
    if s[length - 1] == '0' {
    min := func(a, b int) int {
    if a > b {
    return b
    }
    return a
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    canVisit := make(map[int]bool)
    canVisit[0] = true
    edge := 0
    for i := 0; i <= edge && i < length; i++ {
    if canVisit[i] {
    left := i + minJump
    right := min(length - 1, i + maxJump)
    for j := max(left, edge + 1); j <= right; j++ {
    if s[j] == '0' {
    canVisit[j] = true
    if j == length - 1 {
    return true
    }
    }
    }
    edge = right
    }
    }
    }
    return false
    }
    ]]>
    @@ -469,17 +469,17 @@ - + + + - - - + @@ -490,7 +490,7 @@ http://blog.beendless.com/2021/10/03/Greedy%20%20Problems%20I/ 2021-10-03T17:25:24.000Z - 2021-10-04T05:04:44.655Z + 2021-11-27T08:03:05.901Z Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are best fit for Greedy.

    455. Assign Cookies

    If every child is content, then all children are content. So local optimal leads to a global optimal solution. We can use greedy. Now we want to make more child happy, we can use greedy algorithm to give the children whose gratitude is lower first.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import "sort"
    func findContentChildren(g []int, s []int) int {
    sort.Ints(g)
    sort.Ints(s)
    result := 0
    for i, j := 0, 0; i < len(g) && j < len(s); j++{
    if g[i] <= s[i] {
    i++
    result++
    }
    }
    return result
    }

    376. Wiggle Subsequence

    a. Greedy solution

    If all connected neighbour nodes are wiggle, the whole slice will be wiggle, it means we can use greedy algorithm. We can also draw the wave with all elements in the slice, our target is to calculate how many peaks (positive/negative) in the wave, here the peak is elements which left diff and right diff have different symbols.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func wiggleMaxLength(nums []int) int {
    result := 1
    previous := 0
    current := 0
    for i := 0; i < len(nums) - 1; i++ {
    current = nums[i + 1] - nums[i]
    if (current > 0 && previous <= 0) || (current < 0 && previous >= 0) {
    previous = current
    result++
    }
    }
    return result
    }

    b. Dynamic programming solution. Since we want to get the maximum number, the first algorithm in our mind will be dynamic programming.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func wiggleMaxLength(nums []int) int {
    length := len(nums)
    if length < 2 {
    return length
    }
    dpUp := 1
    dpDown := 1
    for i := 1; i < length; i++ {
    if nums[i] > nums[i - 1] {
    dpUp = dpDown + 1
    } else if nums[i] < nums[i - 1] {
    dpDown = dpUp + 1
    }
    }
    if dpUp > dpDown {
    return dpUp
    }
    return dpDown
    }

    53. Maximum Subarray

    A naive solution will be using a two level nested for loop to go through all combinations of subsets.

    a. Greedy implementation

    The idea of using greedy algorithm is when calculating the local maximum sum, if the current sum of all previous elements are negative, we will reset the start point as the current element.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func maxSubArray(nums []int) int {
    result := nums[0]
    sum := 0
    for i := 0; i < len(nums); i++ {
    sum += nums[i]
    if sum > result {
    result = sum
    }
    if sum < 0 {
    sum = 0
    }
    }
    }

    b. Dynamic programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    func maxSubArray(nums []int) int {
    result := nums[0]
    dp := make([]int, len(nums))
    dp[0] = nums[0]
    for i := 1; i < len(nums); i++ {
    if dp[i - 1] < 0 {
    dp[i] = nums[i]
    } else {
    dp[i] = dp[i - 1] + nums[i]
    }
    if result < dp[i] {
    result = dp[i]
    }
    }
    return result
    }

    func maxSubArray(nums []int) int {
    result := nums[0]
    dp := nums[0]
    for i := 1; i < len(nums); i++ {
    if dp < 0 {
    dp = nums[i]
    } else {
    dp = dp + nums[i]
    }
    if result < dp {
    result = dp
    }
    }
    return result
    }

    c. Devide and conquer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    func maxSubArray(nums []int) int {
    getCrossMiddleMaxSubArray := func(start, end, middle int) int {
    left, right := 0, 0
    if middle > 0 {
    sum := 0
    for i := middle - 1; i >= start; i-- {
    sum += nums[i]
    if sum > left {
    left = sum
    }
    }
    }
    if middle < end {
    sum := 0
    for i := middle + 1; i <= end; i++ {
    sum += nums[i]
    if sum > right {
    right = sum
    }
    }
    }
    return left + nums[middle] + right
    }
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    var getMaxSubArray func(int, int) int
    getMaxSubArray = func(start, end int) int {
    if start == end {
    return nums[start]
    }
    mid := (start + end) / 2
    left := getMaxSubArray(start, mid)
    right := getMaxSubArray(mid + 1, end)
    middle := getCrossMiddleMaxSubArray(start, end, mid)
    return max(max(left, middle), right)
    }
    return getMaxSubArray(0, len(nums) - 1)
    }

    122. Best Time to Buy and Sell Stock II

    a. Greedy solution

    To gian the maximum amount of profit, we just need to accumulate the position profits if we buy it on the previous day and sell it on the next day.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    func maxProfit(prices []int) int {
    result := 0
    for i := 1; i < len(prices); i++ {
    profit := prices[i] - prices[i - 1]
    if profit > 0 {
    result += profit
    }
    }
    return result
    }

    b. Peak & Valley solution

    A naive approach is find the local lowest price (valley price) and sell it at the next local highest price (peak price). Then we accumulate all of those local profits.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    func maxProfit(prices []int) int {
    result := 0
    peak := prices[0]
    valley := prices[0]
    length := len(prices)
    for i := 0; i < length - 1; {
    for i < length - 1 && prices[i] >= prices[i + 1] {
    i++
    }
    valley = prices[i]
    for i < length - 1 && prices[i] <= prices[i + 1] {
    i++
    }
    peak = prices[i]
    result += peak - valley
    }
    return result
    }

    c. Dynamic programming

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func maxProfit(prices []int) int {
    length := len(prices)
    dp := make([][2]int, length)
    // dp[i][0] on day i we are holding stock
    // dp[i][1] on day i we don't have stock
    dp[0] = [2]int{-prices[0], 0}
    max := func(a, b int) int {
    if a > b {
    return a
    }
    return b
    }
    for i := 1; i < length; i++ {
    // stock we got from day i - 1, or stock we are going to buy on day i
    dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
    // we don't have stock from day i - 1, or we are going to sell stock we got from day i - 1
    dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
    }
    return max(dp[length - 1][0], dp[length - 1][1])
    }
    ]]>
    @@ -520,7 +520,7 @@ http://blog.beendless.com/2021/10/01/Backtracking%20-%20Chessboard/ 2021-10-02T05:26:24.000Z - 2021-10-08T17:23:38.911Z + 2021-11-27T08:03:05.877Z Backtracking can also be used to solve chessboard problems.

    51. N-Queens

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    func solveNQueens(n int) [][]string {
    result := [][]string{}
    board := make([][]string, n)
    for i := 0; i < n; i++ {
    board[i] = make([]string, n)
    for j := 0; j < n; j++ {
    board[i][j] = "."
    }
    }
    isValid := func(row, col int) bool {
    for i := 0; i < row; i++ {
    if board[i][col] == "Q" {
    return false
    }
    }
    for i := 0; i < col; i++ {
    if board[row][i] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j >= 0; i, j = i - 1, j - 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j < n; i, j = i - 1, j + 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(row int) {
    if row == n {
    temp := make([]string, n)
    for i, boardRow := range board {
    temp[i] = strings.Join(boardRow, "")
    }
    result = append(result, temp)
    return
    }
    for col := 0; col < n; col++ {
    if isValid(row, col) {
    board[row][col] = "Q"
    backtracking(row + 1)
    board[row][col] = "."
    }
    }
    }
    backtracking(0)
    return result
    }

    52. N-Queens II

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    func totalNQueens(n int) int {
    result := 0
    board := make([][]string, n)
    for i := 0; i < n; i++ {
    board[i] = make([]string, n)
    for j := 0; j < n; j++ {
    board[i][j] = "."
    }
    }
    isValid := func(row, col int) bool {
    for i := 0; i < row; i++ {
    if board[i][col] == "Q" {
    return false
    }
    }
    for i := 0; i < col; i++ {
    if board[row][i] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j >= 0; i, j = i - 1, j - 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j < n; i, j = i - 1, j + 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(row int) {
    if row == n {
    result++
    return
    }
    for col := 0; col < n; col ++ {
    if isValid(row, col) {
    board[row][col] = "Q"
    backtracking(row + 1)
    board[row][col] = "."
    }
    }
    }
    backtracking(0)
    return result
    }

    37. Sudoku Solver

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    func solveSudoku(board [][]byte)  {
    isValid := func(row, col int, value byte) bool {
    for i := 0; i < 9; i++ {
    if board[i][col] == value || board[row][i] == value{
    return false
    }
    }
    squareX := (row / 3) * 3
    squareY := (col / 3) * 3
    for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
    if board[i + squareX][j + squareY] == value {
    return false
    }
    }
    }
    return true
    }
    var backtracking func() bool
    backtracking = func() bool {
    for i := 0; i < 9; i++ {
    for j := 0; j < 9; j++ {
    if board[i][j] == '.' {
    for k := '1'; k <= '9'; k++ {
    if isValid(i, j, byte(k)) {
    board[i][j] = byte(k)
    if backtracking() {
    return true
    }
    board[i][j] = '.'
    }
    }
    return false
    }
    }
    }
    return true
    }
    backtracking()
    }

    980. Unique Paths III

    A classical backtracking problem. The backtracking state transition function is backtracking(i, j) = backtracking(i + 1, j) + backtracking(i - 1, j) + backtracking(i, j - 1) + backtracking(i, j + 1), also we need to keep tracking the global state of the grid.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    func uniquePathsIII(grid [][]int) int {
    m := len(grid)
    n := len(grid[0])
    visited := make([][]bool, m)
    count := 0
    start := []int{}
    end := []int{}
    for i := 0; i < m; i++ {
    visited[i] = make([]bool, n)
    for j := 0; j < n; j++ {
    if grid[i][j] == 1 {
    start = []int{i, j}
    visited[i][j] = true
    } else if grid[i][j] == 2 {
    end = []int{i, j}
    } else if grid[i][j] == -1 {
    visited[i][j] = true
    }
    }
    }
    isSuccess := func(x, y int) bool {
    if x != end[0] || y != end[1] {
    return false
    }
    for i := 0; i < m; i++ {
    for j := 0; j < n; j++ {
    if !visited[i][j] {
    return false
    }
    }
    }
    return true
    }
    var visit func(i, j int)
    visit = func(i, j int) {
    if isSuccess(i, j) {
    count++
    return
    }
    if i - 1 >= 0 && !visited[i - 1][j] {
    visited[i-1][j] = true
    visit(i-1, j)
    visited[i-1][j] = false
    }
    if i + 1 < m && !visited[i + 1][j] {
    visited[i+1][j] = true
    visit(i+1, j)
    visited[i+1][j] = false
    }
    if j - 1 >= 0 && !visited[i][j - 1] {
    visited[i][j-1] = true
    visit(i, j - 1)
    visited[i][j-1] = false
    }
    if j + 1 < n && !visited[i][j + 1] {
    visited[i][j+1] = true
    visit(i, j + 1)
    visited[i][j+1] = false
    }
    }
    visit(start[0], start[1])
    return count
    }

    473. Matchsticks to Square

    Similar to chessboard problem, each matchtick has four choices and we need to try all options.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    func makesquare(matchsticks []int) bool {
    sum := 0
    for _, matchstick := range matchsticks {
    sum += matchstick
    }
    if sum % 4 != 0 {
    return false
    }
    target := sum / 4
    n := len(matchsticks)
    sort.Ints(matchsticks)
    if matchsticks[n - 1] > target {
    return false
    }
    sides := [4]int{0, 0, 0, 0}
    var backtracking func(int) bool
    backtracking = func(index int) bool {
    if index == n {
    return sides[0] == target && sides[1] == target && sides[2] == target
    }
    for i := 0; i < 4; i++ {
    if sides[i] + matchsticks[index] <= target {
    sides[i] += matchsticks[index]
    if backtracking(index + 1) {
    return true
    }
    sides[i] -= matchsticks[index]
    }
    }
    return false
    }
    return backtracking(0)
    }

    698. Partition to K Equal Sum Subsets

    Same to #473, here we just need to change the sides from 4 to a dynamic value k.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    func canPartitionKSubsets(nums []int, k int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % k != 0 {
    return false
    }
    sort.Slice(nums, func(a, b int) bool {
    return a > b
    })
    target := sum / k
    n := len(nums)
    if nums[n - 1] > target {
    return false
    }
    for n > 0 && nums[n - 1] == target {
    n--
    k--
    }
    subsets := make([]int, k)
    var backtracking func(int) bool
    backtracking = func(index int) bool {
    if index == n {
    for _, subset := range subsets {
    if subset != target {
    return false
    }
    }
    return true
    }
    for i := 0; i < k; i++ {
    if subsets[i] + nums[index] <= target {
    subsets[i] += nums[index]
    if backtracking(index + 1) {
    return true
    }
    subsets[i] -= nums[index]
    }
    }
    return false
    }
    return backtracking(0)
    }

    Another faster backtracking solution is to accumulate the successful partition.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    func canPartitionKSubsets(nums []int, k int) bool {
    sum := 0
    for _, num := range nums {
    sum += num
    }
    if sum % k != 0 {
    return false
    }
    target := sum / k
    n := len(nums)
    sort.Slice(nums, func(a, b int) bool { // Sort the slice by desc with a greedy way, so we can quickly get the target number
    return a > b
    })
    if nums[n - 1] > target {
    return false
    }
    for n > 0 && nums[n - 1] == target {
    n--
    k--
    }
    visited := make([]bool, n)
    var backtracking func(int, int, int) bool
    backtracking = func(index, partition, acc int) bool {
    if partition == k {
    return true
    }
    if acc == target {
    return backtracking(0, partition + 1, 0)
    }
    for i := index; i < n; i++ {
    if !visited[i] {
    visited[i] = true
    if backtracking(i + 1, partition, acc + nums[i]) {
    return true
    }
    visited[i] = false
    }
    }
    return false
    }
    return backtracking(0, 0, 0)
    }
    ]]>
    @@ -551,7 +551,7 @@ http://blog.beendless.com/2021/10/01/Backtracking%20-%20Subsets/ 2021-10-02T03:05:24.000Z - 2021-10-03T05:22:26.977Z + 2021-11-27T08:03:05.880Z Backtracking can also help us to get all subsets of a given slice. If Combination and Partitioning problems can be converted to get root-to-leaf paths during a tree DFS traversal, Subsets can be treated as getting all root-to-node paths during a tree DFS traversal.

    78. Subsets

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func subsets(nums []int) [][]int {
    result := [][]int{[]int{}}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    return
    }
    for i := 0; i < length; i++ {
    path = append(path, nums[i])
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }

    90. Subsets II

    It’s similar to #78, the only difference is we can’t have duplicated subsets, which means we can’t pick the same value at the same tree level during traversal.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import "sort"
    func subsetsWithDup(nums []int) [][]int {
    sort.Ints(nums)
    result := [][]int{[]int{}}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    return
    }
    for i := index; i < length; i++ {
    if i > index && nums[i] == nums[i - 1] {
    continue
    }
    path := append(path, nums[i])
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }

    491. Increasing Subsequences

    Since we can’t sort the given slice, so we have to use a hashmap / array to save the used nodes in the same layer.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    func findSubsequences(nums []int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(nums)
    var backtracking func(int)
    backtracking = func(index int) {
    if len(apth) == length {
    return
    }
    used := make(map[int]bool)
    for i := index; i < length; i++ {
    if (len(path) > 0 && path[len(path) - 1] > nums[i]) || used[nums[i]] {
    continue
    }
    used[nums[i]] = true
    path = append(path, nums[i])
    if len(path) >= 2 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    }
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    return result
    }
    ]]>
    @@ -581,7 +581,7 @@ http://blog.beendless.com/2021/10/01/Backtracking%20-%20Partitioning/ 2021-10-02T01:05:24.000Z - 2021-10-02T01:07:37.589Z + 2021-11-27T08:03:05.879Z Partitioning is another classical problem which can be solved with backtracking algorithm.

    131. Palindrome Partitioning

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func partition(s string) [][]string {
    result := [][]string{}
    path := []string{}
    length := len(s)
    isParlindrom := func(s string) bool {
    for i, j := 0, len(s) - 1; i < j; i, j := i + 1, j - 1 {
    if s[i] != s[j] {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if isParlindrom(s[index:i + 1]) {
    path = append(path, s[index: i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    backtracking(0)
    return result
    }

    93. Restore IP Addresses

    We need to consider the edge case that some numbers start with 0 since golang’s strconv.Atoi will convert those string to integer successfully.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import (
    "strings"
    "strconv"
    )

    func restoreIpAddresses(s string) []string {
    result := []string{}
    path := []string{}
    length := len(s)
    var backtracking func(int)
    backtracking = func(index int) {
    if index > length {
    return
    } else if len(path) == 4 {
    if index == length {
    result = append(result, strings.Join(path, "."))
    }
    return
    }
    for i := index; i < length; i++ {
    if i - index <= 2 {
    num, _ := strconv.Atoi(s[index:i + 1])
    if (i - index == 2 && num < 100) || (i - index == 1 && num < 10) {
    continue
    }
    if num < 256 {
    path = append(path, s[index:i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    }
    backtracking(0)
    return result
    }
    ]]>
    @@ -612,7 +612,7 @@ http://blog.beendless.com/2021/10/01/Backtracking%20-%20Combinations/ 2021-10-01T20:35:24.000Z - 2021-10-01T22:19:19.821Z + 2021-11-27T08:03:05.878Z Backtracking is an algorithmic-technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing those solutions that fail to satisfy the constraints of the problem at any point of time (by time, here, is referred to the time elapsed till reaching any level of the search tree). Usually we can consider backtracking as DFS recursively traversal.

    Backtracking template

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func backtracking(...args) {
    if stop_condition {
    // Update the result set
    return
    }
    for i := range nodes_in_current_layer(...args) {
    // Down to next layer
    backtracking(...args, i + 1)
    // Go back to the upper layer
    }
    }

    77. Combinations

    We can’t use a naive bruth force algorithm to solve this one, since it’s almost impossible to write a N-layers nested for loop.

    a. Naive backtracking solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    func combine(n int, k int) [][]int {
    result := [][]int{}
    path := []int{}
    var backtracking func(int, int, int)
    backtracking = func(n, k, index int) {
    if len(path) == k {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i <= n; i++ {
    path = append(path, i)
    backtracking(n, k, i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(n, k, 1)
    return result
    }

    b. Remove the unnecessary backtracking branches

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    func combine(n, k int) [][]int {
    result := [][]int{}
    path := []int{}
    var backtracking func(int, int, int)
    backtracking = func(n, k, index int) {
    if len(path) == k {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    // For example, given n = 4, k = 3, if path is empty, n - (k - 0) + 1 = 2 means the last valid index can be 2
    for i := index; i <= n - (k - len(path)) + 1; i++ {
    path = append(path, i)
    backtracking(n, k, i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(n, k, 1)
    return result
    }

    216. Combination Sum III

    Similar to #77, we can use the backtracking template to solve it.

    a. Naive backtracking solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func combinationSum3(k int, n int) [][]int {
    results := [][]int{}
    path := []int{}
    var backtracking func(int, int, int, int)
    backtracking = func(k, n, index, sum int) {
    if len(path) == k {
    if sum == n {
    temp := make([]int, k)
    copy(temp, path)
    results = append(results, temp)
    }
    return
    }
    for i := index; i <= 9; i++ {
    path = append(path, i)
    backtracking(k, n, i + 1, sum + i)
    path = path[:len(path) - 1]
    }
    }
    backtracking(k, n, 1, 0)
    return results
    }

    b. Remove the unnecessary backtracking branches

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func combinationSum3(k, n int) [][]int {
    result := [][]int{}
    path := []int{}
    var backtracking func(int, int, int, int)
    backtracking = func(k, n, index, sum) {
    if len(path) == k {
    if sum == n {
    temp := make([]int, k)
    copy(temp, path)
    result = append(result, temp)
    }
    return
    }
    for i := index; i < 9 - (k - len(path)) + 1; i++ {
    path = append(path, i)
    backtracking(n, k, i + 1, sum + i)
    path = path[:len(path) - 1]
    }
    }
    backtracking(k, n, 1, 0)
    return result
    }

    39. Combination Sum

    The only difference between #216 and this one is we can reuse the elements of the slice.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    func combinationSum(candidates []int, target int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(candidates)
    var backtracking func(int, int)
    backtracking = func(target, index int) {
    if target < 0 {
    return
    } else if target == 0 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    path = append(path, candidates[i])
    backtracking(target - candidates[i], i)
    path = path[:len(path) - 1]
    }
    }
    backtracking(target, 0)
    return result
    }

    17. Letter Combinations of a Phone Number

    Since we don’t know how long the given digits will be, we have to use backtracking.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import "strconv"

    func letterCombinations(digits string) []string {
    result := []string{}
    if len(digits) > 0 {
    digitsMap := [10]string {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
    }
    path := []byte{}
    var backtracking func(int)
    backtracking = func(index int) {
    if index == len(digits) {
    result = append(result, string(path))
    return
    }
    digit, _ := strconv.Atoi(string(digits[index]))
    for i := 0; i < len(digitsMap[digit]); i++ {
    path = append(path, digitsMap[digit][i])
    backtracking(index + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(0)
    }
    return result
    }

    40. Combination Sum II

    Since we can convert a combination backtracking problem to a DFS traversal problem, if we don’t want to have the duplicated combination result item, it means we can’t pick duplicated nodes from the same layer of a tree. According to the backtracking template, in side of the backtracking for-loop we are handling the same layer logic (push/pop). At this point, if the given candidates is a sorted slice, we just need to compare if the previous element equals to the current element in the same layer.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import "sort"
    func combinationSum2(candidates []int, target int) [][]int {
    result := [][]int{}
    path := []int{}
    length := len(candidates)
    sort.Ints(candidates)
    var backtracking func(int, int)
    backtracking = func(target, index int) {
    if target < 0 {
    return
    } else if target == 0 {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if i > index && candidates[i] == candidates[i - 1] {
    continue
    }
    path = append(path, candidates[i])
    backtracking(target - candidates[i], i + 1)
    path = path[:len(path) - 1]
    }
    }
    backtracking(target, 0)
    return result
    }
    ]]>
    diff --git a/docs/categories/CS/index.html b/docs/categories/CS/index.html index e11d601ad..2441ce09d 100644 --- a/docs/categories/CS/index.html +++ b/docs/categories/CS/index.html @@ -1,10 +1,15 @@ -CS | Beendless ~ 快节奏,慢生活,无止境 +CS | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/categories/CS/page/2/index.html b/docs/categories/CS/page/2/index.html index 8d758144a..6a9d1f1f4 100644 --- a/docs/categories/CS/page/2/index.html +++ b/docs/categories/CS/page/2/index.html @@ -1,10 +1,15 @@ -CS | Beendless ~ 快节奏,慢生活,无止境 +CS | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/categories/CS/page/3/index.html b/docs/categories/CS/page/3/index.html index 42326c18c..df60fa974 100644 --- a/docs/categories/CS/page/3/index.html +++ b/docs/categories/CS/page/3/index.html @@ -1,10 +1,15 @@ -CS | Beendless ~ 快节奏,慢生活,无止境 +CS | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/categories/Recipe/index.html b/docs/categories/Recipe/index.html index 699d5ebb3..682d36be4 100644 --- a/docs/categories/Recipe/index.html +++ b/docs/categories/Recipe/index.html @@ -1,10 +1,15 @@ -Recipe | Beendless ~ 快节奏,慢生活,无止境 +Recipe | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git "a/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/index.html" "b/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/index.html" index f754842d7..4802b29fb 100644 --- "a/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/index.html" +++ "b/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/index.html" @@ -1,10 +1,15 @@ -漲潮﹣退潮 | Beendless ~ 快节奏,慢生活,无止境 +漲潮﹣退潮 | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git "a/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/page/2/index.html" "b/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/page/2/index.html" index 5f82fc591..57ec0f6d7 100644 --- "a/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/page/2/index.html" +++ "b/docs/categories/\346\274\262\346\275\256\357\271\243\351\200\200\346\275\256/page/2/index.html" @@ -1,10 +1,15 @@ -漲潮﹣退潮 | Beendless ~ 快节奏,慢生活,无止境 +漲潮﹣退潮 | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git "a/docs/categories/\347\204\241\347\237\245\357\271\243\346\227\240\347\237\245/index.html" "b/docs/categories/\347\204\241\347\237\245\357\271\243\346\227\240\347\237\245/index.html" index 53e7bd9a0..8f3baf20e 100644 --- "a/docs/categories/\347\204\241\347\237\245\357\271\243\346\227\240\347\237\245/index.html" +++ "b/docs/categories/\347\204\241\347\237\245\357\271\243\346\227\240\347\237\245/index.html" @@ -1,10 +1,15 @@ -無知﹣无知 | Beendless ~ 快节奏,慢生活,无止境 +無知﹣无知 | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git "a/docs/categories/\350\241\214\350\265\260\347\232\204\346\250\271\350\213\227/index.html" "b/docs/categories/\350\241\214\350\265\260\347\232\204\346\250\271\350\213\227/index.html" index 13505c278..a71954ddb 100644 --- "a/docs/categories/\350\241\214\350\265\260\347\232\204\346\250\271\350\213\227/index.html" +++ "b/docs/categories/\350\241\214\350\265\260\347\232\204\346\250\271\350\213\227/index.html" @@ -1,10 +1,15 @@ -行走的樹苗 | Beendless ~ 快节奏,慢生活,无止境 +行走的樹苗 | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 612d32526..54d3f1b10 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,11 +1,16 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Set up Kubeadm on MacOS with Vagrant and VirtualBox

    Based on kubeadm installation instructions, we can’t directly install it on MacOS. But with the help of Vagrant and VirtualBox, we can quickly create a local kubenetes cluster.

    Read More

    MMM, Ma-Po Tofu !

    It might be a dish foreign for you; in fact, it was foreign to me too. Ma-Po tofu originates from a region in China but far away from my hometown. The first time that I had it was in my first year of college. It and me, both had left home, just met in a small restaurant next to our campus. Gladly, I was not alone, neither was the dish. There were new friends of mine sitting around a table, and Ma-Po Tofu took the center, having always had the charm to attract people from all over the country. It may be welcomed by people from all over the world one day.

    Read More

    Multi-Stage Golang Docker Image Build and Kubernetes Deployment

    If we have a tiny web service which return the host name as below. We can use golang image and build the executable package, then move it into a basic linux container like alpine.

    Read More

    Mastering Go Notes

      -
    1. If you have to check godoc offline, you could install gdoc go get golang.org/x/tools/cmd/godoc and then run godoc -http :8001 in termilal.

    Read More

    Monotonic Stack

    Monotonic Stack is the best time complexity solution for many “range queries in an array” problems. Because every element in the array could only enter the monotonic stack once, the time complexity is O(N). (N represents the length of the array).

    Read More

    Dynamic Programming IV

    115. Distinct Subsequences

    Let’s denote dp[i][j] as the amount of distinct subsequences in s[:i] which can construct t[:j]. So we can get the state transition function dp[i][j] = s[i - 1] == t[i - 1] ? (dp[i - 1][j - 1] + dp[i - 1][j] : dp[i-1][j]. Also for the initial value, dp[i][0] needs to be 0 (it means there’s one way we can construct empty string from s[:i]).

    Read More

    Dynamic Programming III

    300. Longest Increasing Subsequence

    If we define dp[i] as the longest increasing subsequence of [0, i]. Then dp[i] >= 1. And the state transition function is dp[i] = max(dp[i], dp[j] + 1) here j ∈ [0, i).

    Read More

    Stock Exchange Problems

    121. Best Time to Buy and Sell Stock

    a. Two pointers greedy solution.

    Read More

    Knapsack Problems II

    377. Combination Sum IV

    This is also a full knapsack problem. It looks similar to the coins change ii, but the difference here is that we need to get the permutation of the solutions instead of combination. So in this case we need to iterate the knapsack space first, then iterate the items.

    Read More

    Dynamic Programming II

    494. Target Sum

    a. Brute-force DFS recursive solution

    Read More

    \ No newline at end of file +

    Set up Kubeadm on MacOS with Vagrant and VirtualBox

    Based on kubeadm installation instructions, we can’t directly install it on MacOS. But with the help of Vagrant and VirtualBox, we can quickly create a local kubenetes cluster.

    Read More

    MMM, Ma-Po Tofu !

    It might be a dish foreign for you; in fact, it was foreign to me too. Ma-Po tofu originates from a region in China but far away from my hometown. The first time that I had it was in my first year of college. It and me, both had left home, just met in a small restaurant next to our campus. Gladly, I was not alone, neither was the dish. There were new friends of mine sitting around a table, and Ma-Po Tofu took the center, having always had the charm to attract people from all over the country. It may be welcomed by people from all over the world one day.

    Read More

    Multi-Stage Golang Docker Image Build and Kubernetes Deployment

    If we have a tiny web service which return the host name as below. We can use golang image and build the executable package, then move it into a basic linux container like alpine.

    Read More

    Mastering Go Notes

      +
    1. If you have to check godoc offline, you could install gdoc go get golang.org/x/tools/cmd/godoc and then run godoc -http :8001 in termilal.

    Read More

    Monotonic Stack

    Monotonic Stack is the best time complexity solution for many “range queries in an array” problems. Because every element in the array could only enter the monotonic stack once, the time complexity is O(N). (N represents the length of the array).

    Read More

    Dynamic Programming IV

    115. Distinct Subsequences

    Let’s denote dp[i][j] as the amount of distinct subsequences in s[:i] which can construct t[:j]. So we can get the state transition function dp[i][j] = s[i - 1] == t[i - 1] ? (dp[i - 1][j - 1] + dp[i - 1][j] : dp[i-1][j]. Also for the initial value, dp[i][0] needs to be 0 (it means there’s one way we can construct empty string from s[:i]).

    Read More

    Dynamic Programming III

    300. Longest Increasing Subsequence

    If we define dp[i] as the longest increasing subsequence of [0, i]. Then dp[i] >= 1. And the state transition function is dp[i] = max(dp[i], dp[j] + 1) here j ∈ [0, i).

    Read More

    Stock Exchange Problems

    121. Best Time to Buy and Sell Stock

    a. Two pointers greedy solution.

    Read More

    Knapsack Problems II

    377. Combination Sum IV

    This is also a full knapsack problem. It looks similar to the coins change ii, but the difference here is that we need to get the permutation of the solutions instead of combination. So in this case we need to iterate the knapsack space first, then iterate the items.

    Read More

    Dynamic Programming II

    494. Target Sum

    a. Brute-force DFS recursive solution

    Read More

    \ No newline at end of file diff --git a/docs/page/10/index.html b/docs/page/10/index.html index 1852b2b14..a6dc7560b 100644 --- a/docs/page/10/index.html +++ b/docs/page/10/index.html @@ -1,16 +1,21 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    今冬第一场雪,我有废话说

    憋这篇日志至少有半个月了,然而终究到考试结束也没想的起来要写。因为顿时就被零碎的生活和新的工作,以及本能的虚妄所充斥了。此刻,窗外飘着雪,就在我眼前不及半米的地方,如果玻璃再能干净一些,我就可以用手接住簌簌的雪片了。于是,我一个人坐下来,觉得想要说话。

    +

    今冬第一场雪,我有废话说

    憋这篇日志至少有半个月了,然而终究到考试结束也没想的起来要写。因为顿时就被零碎的生活和新的工作,以及本能的虚妄所充斥了。此刻,窗外飘着雪,就在我眼前不及半米的地方,如果玻璃再能干净一些,我就可以用手接住簌簌的雪片了。于是,我一个人坐下来,觉得想要说话。

    这两个月,甚至这大半年,我都沉浸在一个人的寂寞里。从一开始逼自己安坐在书桌前,到后来用《寂寞让我如此美丽》这样的自我治愈系方法,现在,我居然真的开始享受这寂寞和孤独。无奈的是,这样的蛰伏并没有给我带来可以量化的收获。我可以分明地感受到英语的听说读写都在进步,当我不用字幕去听谢耳朵废话连篇,当我跟native speaker讲得越来越流畅和清晰,当我读英文原著的速度也越来越快——但却总是不能打败ETS,最终落下马的人,还是我。每每到这样失败的时候,我便坐下来,什么也不说,内心难过却也不忘给自己打气。成功学神马的就没有意义了,毕竟我不是渴望着成功去的。经过一次次地敲打脑袋,我越来越看清自己是谁,想要的东西是什么。规律是,你多么渴望成功,你就会多么废寝忘食。然而我终究从来都做不到。我想要的,是自由,是清净,是捕捉地上的感动,再带给别人。我想更多地认识这个世界,我想亲自去感受一下,倾听那钟,走过那桥。为了这个心愿,这一年,也由于负伤,我每天每天都呆在宿舍里,或家里。尤其近四个月,总是一个人。

    Read More

    路——有选择,是过程,并通向结束

    不知从何时起,悄悄迷恋上“路”这个比喻,时至今日,自己都觉得有些腻烦。除了“在路上”,“生活就是一段航程”之类的附庸风雅外,我还把它写进论文,用来重构******的历史。可是想想,才疏学浅的我仍然没有其他更好的叙述方式来反思我自己的人生,毕竟,它们都是走过的路,未来,也是我要走的路。

    今天是个周年纪念日,去年此时,我的日记里写下“就这样突然起了变化”,不料这个变化居然使我选择一条与曾经截然不同的路。人们常说时间如白驹过隙,随着年龄越来越大,我也更有同感。眨眼的功夫,已经一年了。这一年当中,玛丽猫咪和跳跳虎真正在一起的时间全部加起来都超不过8个星期,它们真的不容易。然而一年前的此时,只是一个闪念,一种莫名的冲动。今天想来,都只能感恩。

    Read More

    给自己一个以寂寞为名的嘴巴子

    曾经听过很多对寂寞的比喻——比如寂寞像流水,无声无息,但我觉得是静水流深;比如寂寞像咖啡,甘苦参半,我看帮助自己清醒。陈明有一首老歌,《寂寞让我如此美丽》,近来总是很喜欢。当然,我不是要发嗲说自己寂寞,只是最近觉得,这是一个很好的语辞。

    总是莫名奇妙地会很想七仙女,时不时就梦见她们。以前梦醒之后就发短信告诉她们,现在学会了偷偷地梦到,再默默地讲给自己听。其实也不远,为什么又不专门跑去见呢?固步自封。我越来越把自己锁在一个小小的世界,只是偶尔开窗透气而已。我已经几乎不参加任何集体活动了,逃不开地参加一次,就发现自己与外面的世界越来越遥远。已经不再看资讯,甚至也不上人人。开电脑只是查单词或者跟某个人说话,一个大言不惭地扬言关注文化交流的人,拒绝了自己与他人,甚至与八卦的交流。因为觉得这个世界每天上演的都是谎言,都是闹剧。从铁道部到央企,食品监管、药品价格,房地产就更不用提了,似乎每天都很热闹,但是我或者我们的关注有什么意义么?问责政府,批判现实,意义呢?富士康昨晚又爆炸了,要是以前的我,肯定又感性地要为人家被烧得面目全非而难过,现在呢,戏称一句可能Ipad2水货会提价,就跑掉了。

    Read More

    一转身,就是一辈子

    今天是一个普普通通,却又不得不写两句的日子。

    这个星期开始跟朋友们say goodbye,满是复杂的情绪——离别,不要悲伤但又不得不悲伤;今天早晨居然意外地去大学say hi to  *。(NND,必须要记住教训!本姑娘太谦虚了!!!)所以我觉得今天很有趣。Say hi的是为了期盼未来;Say goodbye是不得不告别回忆。

    Read More

    当年写给star的信

    猪妹她姐:   

    你什么破地址嘛,发给我三封邮件居然全部都在垃圾邮箱列队里面。前天你生日,好像从你走的那天我就开始算,等着你过生日这天;但是终于等到了,也什么都没有地过去了。我有想过写邮件给你,但我知道每封电子信件都是要计流量的,而且我这种基本没事只是感情泛滥型的不在那个白名单上面。于是我每天都会有一点点时间来想你,或者一念,或者几分钟。想你在做实验还是在聊天,或者在甲板上?偶尔会自言自语说一声,可能海上和陆地上也一样吧,某人习惯了。不多,但每天都尽量会记得带你送我的红石榴石,虽然工作的时候它总是带来不便,因为蹭着键盘或桌子。

    Read More

    一路向西——大美青海

    打点行装,第三次踏上我习惯称之为丝路的旅程。隐隐觉得,这或许是此生最后一趟,保守地说至少是近年内的最后一趟了。跟此前两次的新奇、娱乐和紧张、工作陪同的状态不一样,我担任了前期准备和负责的任务。疲惫,却真的可以用冷眼和热心来感受我的丝路。再想想过去的几年里,我的双脚走过了多少地方,是不是什么时候该算一下里程呢?原来,真的很少细细去体味,更多的是一时情绪,而根本没有留下些纪念的文字,即使有一些照片,那似乎略显无力。感谢冥冥之中的安排吧,为了帮师哥和老师打开OFFICE2007的文档,我带了电脑。走在去青海湖的路上,突然涌上一股想写点什么的冲动,才决定,尽量把每天都记录下来,用心,用手指,用颠簸的公路上轰鸣的发动机的声音。(在途中,我抱着电脑,这些被车震得颤抖的记录。)同样也是因为青海湖,我不再称这趟行程为丝路了,向西,只觉得这是一条向西的无界之路。

    Read More

    形而下的梦

    这几天总是会偶尔的恍惚。恍惚,三个月的恍惚怎么还能持续到现在呢,我也不懂,并以此佩服自己的执拗。只是觉得有一些不一样了,现在的恍惚是我一个人的恍惚,偶尔的恍惚。

    -

    可能因为太赖床的缘故吧,每次睁开眼睛后总有至少两个小时的辗转反侧,脑子里呀就不停不停地演电影,这样就很容易再次入睡,浅浅的,却闷闷的犯迷糊。再次醒来就会发晕,更累。虽然似乎有一个好处,可以用新的恍惚洗掉前一天晚上做的梦。从心理学上的弗洛伊德《梦的解析》,从古代周公解梦的“迷信”,我都把自己清理过了,想想真是可笑。不停地清理自己,却清理不干净自己的生活,这就是我的无能吧。只是,真的不怕什么了,真的不再那么伤感了。现在来面对自己的恍惚和太短暂的清醒,就像喝过酒一样,至少,的确不那么伤感,我拒绝自己无病呻吟。

    Read More

    结束与启程

    心情的持续反复,折腾着自己也折腾着身边的、远方的最亲爱的人,很多天——都没有发现一分部绽开的桃花如此粉嫩得让人心疼,掩在丛丛的枯枝当中;迎春花儿也开了,枝枝丫丫都镶嵌在秃秃的木桩子上。春天来得似乎很拖拉,再加上天空下沙,本来就还没有泛绿的校园显得更加死寂,这些简单的明媚点缀其间,反而会让心情突然莫名其妙地亮起来。前些天的我,根本没有注意到这一切,就好像闭着眼睛没有心的在走路,甚至,我不用心于每一餐饭,每一份作业,每一个朋友。躯壳,漂浮。

    Read More

    \ No newline at end of file +

    可能因为太赖床的缘故吧,每次睁开眼睛后总有至少两个小时的辗转反侧,脑子里呀就不停不停地演电影,这样就很容易再次入睡,浅浅的,却闷闷的犯迷糊。再次醒来就会发晕,更累。虽然似乎有一个好处,可以用新的恍惚洗掉前一天晚上做的梦。从心理学上的弗洛伊德《梦的解析》,从古代周公解梦的“迷信”,我都把自己清理过了,想想真是可笑。不停地清理自己,却清理不干净自己的生活,这就是我的无能吧。只是,真的不怕什么了,真的不再那么伤感了。现在来面对自己的恍惚和太短暂的清醒,就像喝过酒一样,至少,的确不那么伤感,我拒绝自己无病呻吟。

    Read More

    结束与启程

    心情的持续反复,折腾着自己也折腾着身边的、远方的最亲爱的人,很多天——都没有发现一分部绽开的桃花如此粉嫩得让人心疼,掩在丛丛的枯枝当中;迎春花儿也开了,枝枝丫丫都镶嵌在秃秃的木桩子上。春天来得似乎很拖拉,再加上天空下沙,本来就还没有泛绿的校园显得更加死寂,这些简单的明媚点缀其间,反而会让心情突然莫名其妙地亮起来。前些天的我,根本没有注意到这一切,就好像闭着眼睛没有心的在走路,甚至,我不用心于每一餐饭,每一份作业,每一个朋友。躯壳,漂浮。

    Read More

    \ No newline at end of file diff --git a/docs/page/2/index.html b/docs/page/2/index.html index 653c09990..42afa91ca 100644 --- a/docs/page/2/index.html +++ b/docs/page/2/index.html @@ -1,12 +1,17 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Knapsack Problems I

    The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.

    Read More

    Dynamic Programming I

    Dynamic Programming (commonly referred to as DP) is an algorithmic technique for solving a problem by recursively breaking it down into simpler subproblems and using the fact that the optimal solution to the overall problem depends upon the optimal solution to it’s individual subproblems. Here is an interesting Quora question How should I explain dynamic programming to a 4-year-old?.

    Read More

    Greedy Problems - III

    56. Merge Intervals

    Similar to other sgement related problems. The first thing we need to do is to sort the slice. Once we have a sorted segment slice, we can iterate over all items and merge them. Note there is one edge case we need to cover after the iteration, either we merged all segments into one or the last one can’t be merged into the previous segment.

    Read More

    Greedy Problems - II

    1005. Maximize Sum Of Array After K Negations

    To get a maximum sum, we need to convert as many negative numbers to positive ones. If there is still an odd times of converting number left, we just need to convert the smallest positive number to a negative one

    Read More

    JumpGame Problems

    55. Jump Game

    a. Greedy solutions

    Read More

    Greedy Problems - I

    Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are best fit for Greedy.

    Read More

    Backtracking - Chessboard

    Backtracking can also be used to solve chessboard problems.

    +

    Knapsack Problems I

    The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.

    Read More

    Dynamic Programming I

    Dynamic Programming (commonly referred to as DP) is an algorithmic technique for solving a problem by recursively breaking it down into simpler subproblems and using the fact that the optimal solution to the overall problem depends upon the optimal solution to it’s individual subproblems. Here is an interesting Quora question How should I explain dynamic programming to a 4-year-old?.

    Read More

    Greedy Problems - III

    56. Merge Intervals

    Similar to other sgement related problems. The first thing we need to do is to sort the slice. Once we have a sorted segment slice, we can iterate over all items and merge them. Note there is one edge case we need to cover after the iteration, either we merged all segments into one or the last one can’t be merged into the previous segment.

    Read More

    Greedy Problems - II

    1005. Maximize Sum Of Array After K Negations

    To get a maximum sum, we need to convert as many negative numbers to positive ones. If there is still an odd times of converting number left, we just need to convert the smallest positive number to a negative one

    Read More

    JumpGame Problems

    55. Jump Game

    a. Greedy solutions

    Read More

    Greedy Problems - I

    Greedy is an algorithmic paradigm that builds up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit. So the problems where choosing locally optimal also leads to global solution are best fit for Greedy.

    Read More

    Backtracking - Chessboard

    Backtracking can also be used to solve chessboard problems.

    51. N-Queens

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    func solveNQueens(n int) [][]string {
    result := [][]string{}
    board := make([][]string, n)
    for i := 0; i < n; i++ {
    board[i] = make([]string, n)
    for j := 0; j < n; j++ {
    board[i][j] = "."
    }
    }
    isValid := func(row, col int) bool {
    for i := 0; i < row; i++ {
    if board[i][col] == "Q" {
    return false
    }
    }
    for i := 0; i < col; i++ {
    if board[row][i] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j >= 0; i, j = i - 1, j - 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    for i, j := row, col; i >= 0 && j < n; i, j = i - 1, j + 1 {
    if board[i][j] == "Q" {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(row int) {
    if row == n {
    temp := make([]string, n)
    for i, boardRow := range board {
    temp[i] = strings.Join(boardRow, "")
    }
    result = append(result, temp)
    return
    }
    for col := 0; col < n; col++ {
    if isValid(row, col) {
    board[row][col] = "Q"
    backtracking(row + 1)
    board[row][col] = "."
    }
    }
    }
    backtracking(0)
    return result
    }

    Read More

    Backtracking - Subsets

    Backtracking can also help us to get all subsets of a given slice. If Combination and Partitioning problems can be converted to get root-to-leaf paths during a tree DFS traversal, Subsets can be treated as getting all root-to-node paths during a tree DFS traversal.

    Read More

    Backtracking - Partioning

    Partitioning is another classical problem which can be solved with backtracking algorithm.

    -

    131. Palindrome Partitioning

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func partition(s string) [][]string {
    result := [][]string{}
    path := []string{}
    length := len(s)
    isParlindrom := func(s string) bool {
    for i, j := 0, len(s) - 1; i < j; i, j := i + 1, j - 1 {
    if s[i] != s[j] {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if isParlindrom(s[index:i + 1]) {
    path = append(path, s[index: i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    backtracking(0)
    return result
    }

    Read More

    Backtracking - Combinations

    Backtracking is an algorithmic-technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing those solutions that fail to satisfy the constraints of the problem at any point of time (by time, here, is referred to the time elapsed till reaching any level of the search tree). Usually we can consider backtracking as DFS recursively traversal.

    Read More

    \ No newline at end of file +

    131. Palindrome Partitioning

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    func partition(s string) [][]string {
    result := [][]string{}
    path := []string{}
    length := len(s)
    isParlindrom := func(s string) bool {
    for i, j := 0, len(s) - 1; i < j; i, j := i + 1, j - 1 {
    if s[i] != s[j] {
    return false
    }
    }
    return true
    }
    var backtracking func(int)
    backtracking = func(index int) {
    if index == length {
    temp := make([]int, len(path))
    copy(temp, path)
    result = append(result, temp)
    return
    }
    for i := index; i < length; i++ {
    if isParlindrom(s[index:i + 1]) {
    path = append(path, s[index: i + 1])
    backtracking(i + 1)
    path = path[:len(path) - 1]
    }
    }
    }
    backtracking(0)
    return result
    }

    Read More

    Backtracking - Combinations

    Backtracking is an algorithmic-technique for solving problems recursively by trying to build a solution incrementally, one piece at a time, removing those solutions that fail to satisfy the constraints of the problem at any point of time (by time, here, is referred to the time elapsed till reaching any level of the search tree). Usually we can consider backtracking as DFS recursively traversal.

    Read More

    \ No newline at end of file diff --git a/docs/page/3/index.html b/docs/page/3/index.html index fc959ffa7..46e34a369 100644 --- a/docs/page/3/index.html +++ b/docs/page/3/index.html @@ -1,10 +1,15 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Modify Trees

    108. Convert Sorted Array to Binary Search Tree

    Highed balanced means left nodes and right nodes have the minimized same size difference.

    Read More

    Search in Trees

    700. Search in a Binary Search Tree

    Naive BST query.

    Read More

    Construct and Update a Tree

    1008. Construct Binary Search Tree from Preorder Traversal

    Based on the preorder traversal definition for a BST, the first element in the slice is always coming from the root node, we can split the rest elements into two parts from the element which is no less than the root node for child nodes.

    Read More

    Tree Properties

    101. Symmetric Tree

    a. DFS solution

    Read More

    Tree Traversals BFS

    102. Binary Tree Level Order Traversal

    a. BFS solution

    Read More

    Tree Traversals DFS

    94. Binary Tree Inorder Traversal

    a. Recursive solution

    Read More

    Heap and Heap Sort

    A Heap is a special Tree-based data structure in which the tree is a complete binary tree. Generally, there are two types of Heap: Max-Heap (root node is greater than its child nodes) and Min-Heap (root node is smaller than its child nodes).

    Read More

    Query with Stack

    20. Valid Parentheses

    We can simply iterate over all items from the given string and compare the adjacent values each time with the help of stack before pushing the element in.

    Read More

    Design a Stack with Queue

    225. Implement Stack using Queues

    We can’t use the similar solution we did for Design a Queue with Stack. It is because unlike Stack, moving elements from one Queue to another one won’t change the sequence of elements. We have to pop out all previous elements added into the queue when adding a new element, in this way we can simulate a Stack.

    Read More

    Design a Queue with Stack

    232. Implement Queue using Stacks

    Since Queue is FIFO but Stack is FILO. If we need to use Stack to implement a Queue, we need to use at least two Stacks. So we use one stack which only handle Push operations, and another Stack which only handle Pop/Peek operations. And we move elements from the Pop only Stack to the other one when Pop/Peek get called. It will reverse the FILO stack elements sequence after that. So we get a FIFO sequence.

    Read More

    \ No newline at end of file +

    Modify Trees

    108. Convert Sorted Array to Binary Search Tree

    Highed balanced means left nodes and right nodes have the minimized same size difference.

    Read More

    Search in Trees

    700. Search in a Binary Search Tree

    Naive BST query.

    Read More

    Construct and Update a Tree

    1008. Construct Binary Search Tree from Preorder Traversal

    Based on the preorder traversal definition for a BST, the first element in the slice is always coming from the root node, we can split the rest elements into two parts from the element which is no less than the root node for child nodes.

    Read More

    Tree Properties

    101. Symmetric Tree

    a. DFS solution

    Read More

    Tree Traversals BFS

    102. Binary Tree Level Order Traversal

    a. BFS solution

    Read More

    Tree Traversals DFS

    94. Binary Tree Inorder Traversal

    a. Recursive solution

    Read More

    Heap and Heap Sort

    A Heap is a special Tree-based data structure in which the tree is a complete binary tree. Generally, there are two types of Heap: Max-Heap (root node is greater than its child nodes) and Min-Heap (root node is smaller than its child nodes).

    Read More

    Query with Stack

    20. Valid Parentheses

    We can simply iterate over all items from the given string and compare the adjacent values each time with the help of stack before pushing the element in.

    Read More

    Design a Stack with Queue

    225. Implement Stack using Queues

    We can’t use the similar solution we did for Design a Queue with Stack. It is because unlike Stack, moving elements from one Queue to another one won’t change the sequence of elements. We have to pop out all previous elements added into the queue when adding a new element, in this way we can simulate a Stack.

    Read More

    Design a Queue with Stack

    232. Implement Queue using Stacks

    Since Queue is FIFO but Stack is FILO. If we need to use Stack to implement a Queue, we need to use at least two Stacks. So we use one stack which only handle Push operations, and another Stack which only handle Pop/Peek operations. And we move elements from the Pop only Stack to the other one when Pop/Peek get called. It will reverse the FILO stack elements sequence after that. So we get a FIFO sequence.

    Read More

    \ No newline at end of file diff --git a/docs/page/4/index.html b/docs/page/4/index.html index 8403869ce..dfeab24e3 100644 --- a/docs/page/4/index.html +++ b/docs/page/4/index.html @@ -1,13 +1,18 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    String Match with KMP Algorithm

    Search if a given string pattern (needle) is part of a target string (haystack) is a common problem. The naive approach is to use two nested loops with O(n * m) time complexity. KMP is a better way which has a better performance.

    Read More

    Two Pointers

      +

      String Match with KMP Algorithm

      Search if a given string pattern (needle) is part of a target string (haystack) is a common problem. The naive approach is to use two nested loops with O(n * m) time complexity. KMP is a better way which has a better performance.

      Read More

      Two Pointers

      1. Array Elements In-Placed Removal

      Let’s take a look at a easy problem on Leetcode 27. Remove Element. We will demonstrate how to remove an element from an array without allocating extra space for another array.

      Read More

      Common Items Quick Search with Array and HashMap

      Usually when you get a problem about searching the common items between multiple strings, the brute-force solution’s time complexity is usually too high. We can use hashmap to lower the time complexity.

      Read More

      Design A Linked List Class

      For a given linked list, it has 3 common methods: GetByIndex, AddTo(Head/Tail/ToIndex), Delele. Similar to SQL’s CURD. Let’s see how to design a linked list class. 707. Design Linked List

      Read More

      Remove Linked List Elements

      Let’s take a look at a easy problem on Leetcode 203. Remove Linked List Elements. We will demonstrate how to remove elements from a linked list.

      Read More

      Traverse Spiral Matrix

        @@ -17,4 +22,4 @@
      1. O(n)
      1
      2
      3
      4
      for i := 0; i < n; i++ {
      //statements
      }

      Read More

      Binary Search Code Template Deep Dive

      Let’s take a look at a easy problem on Leetcode 704. Binary Search. Besides the brute-force O(n) solution, it’s not hard to get the O(log(n)) solution from the constrains unique and sorted in ascending order. Binary search is one of the most basic algorithms we are using, but most people couldn’t get the right code.

      Read More

      Understand Golang's Function Type

      Based on Golang’s function type spec:

      -
      1
      A function type denotes the set of all functions with the same parameter and result types

      Read More

      JavaScript Async Ready Looping

      When you are following functional programming style guide to write JavaScript, you may find that it’s hard to deal with asynchronous since async function always return promises. So code like below will resolve the promises at same time instead of waiting for them.

      Read More

      \ No newline at end of file +
      1
      A function type denotes the set of all functions with the same parameter and result types

    Read More

    JavaScript Async Ready Looping

    When you are following functional programming style guide to write JavaScript, you may find that it’s hard to deal with asynchronous since async function always return promises. So code like below will resolve the promises at same time instead of waiting for them.

    Read More

    \ No newline at end of file diff --git a/docs/page/5/index.html b/docs/page/5/index.html index 28822aec2..6fe5c840e 100644 --- a/docs/page/5/index.html +++ b/docs/page/5/index.html @@ -1,11 +1,16 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Understand X-Forwarded-Proto

    HTTP requests and HTTP responses use header fields to send information about the HTTP messages. Header fields are colon-separated name-value pairs that are separated by a carriage return (CR) and a line feed (LF). A standard set of HTTP header fields is defined in RFC 2616. There are also non-standard HTTP headers available that are widely used by the applications. Some of the non-standard HTTP headers have an X-Forwarded prefix.

    Read More

    Serving Files on S3 through NodeJS

    NodeJS stream is one of the most powerful modules built-in. If you need to serve files on S3 through NodeJS service, a good idea is to leverage the compatibility of stream, especially if you want to serve big files.

    Read More

    Add WaterMark with JavaScript to Your Website

    If you are an enterprise application developer, you may want to add watermark to your application. You can use below JS to applications like Confluence, Jira and so on. Just need to paste below JS code.

    Read More

    Computer Vision Tasks Summary

    I’m start reading this book <Deep Learning with TensorFlow 2 and Keras> those days, and will keep posting what I learnt from the book here.

    Read More

    Loading Image to Google Colab Notebooks

    Google Colab is one of the best place to start your Machine Learning. Sometime you may want to upload images to the notebooks from your local. Fortunately you can easily make it done throught the built-in API.

    Read More

    Building Asynchronized HTTP Services With Sanic

    Python introduced async/await syntax from Python3.5. it makes your code non-blocking and speedy. Developers can use it to build a high-performance / NIO web services like NodeJS. Most of the Python web developers are familiar with Flask. But unfortunately flask has no plan to support the async request headers. Sanic is a Flask-like webserver that’s written to go fast. It was inspired by uvloop.

    Read More

    Several Important Concepts of CNN

    A trained convolutional layer is made up of many feature detectors, called filters, which slide over an input image tensor as a moving window. This is a very powerful technique and it possesses several advantages over the flatten and classify method or deep learning.

    Read More

    Tips for Hyperparameter Optimization

    One of the biggest headaches of using deep neural networks is that they have tons of hyperparameters that should be optimized so that the network performs optimally. Below are some notes coming from Deep Learning Quick Reference.

    Read More

    Started to go through convnetjs

    After reading several books about deep learning, now I can use keras / tensorflow to train some models, but the mathmatical implementations behind the libraries are still have to follow.

    Read More

    Scaling NodeJS Apps -- Archtectural Patterns

    This is the notes when I read the book Scaling Your Nodej.js Apps.

    -

    Layered Architecture

    It is based on the logistic seperation of concerns of your application (or platform) into layers. And the layers must comply with the following points:

    Read More

    \ No newline at end of file +

    Understand X-Forwarded-Proto

    HTTP requests and HTTP responses use header fields to send information about the HTTP messages. Header fields are colon-separated name-value pairs that are separated by a carriage return (CR) and a line feed (LF). A standard set of HTTP header fields is defined in RFC 2616. There are also non-standard HTTP headers available that are widely used by the applications. Some of the non-standard HTTP headers have an X-Forwarded prefix.

    Read More

    Serving Files on S3 through NodeJS

    NodeJS stream is one of the most powerful modules built-in. If you need to serve files on S3 through NodeJS service, a good idea is to leverage the compatibility of stream, especially if you want to serve big files.

    Read More

    Add WaterMark with JavaScript to Your Website

    If you are an enterprise application developer, you may want to add watermark to your application. You can use below JS to applications like Confluence, Jira and so on. Just need to paste below JS code.

    Read More

    Computer Vision Tasks Summary

    I’m start reading this book <Deep Learning with TensorFlow 2 and Keras> those days, and will keep posting what I learnt from the book here.

    Read More

    Loading Image to Google Colab Notebooks

    Google Colab is one of the best place to start your Machine Learning. Sometime you may want to upload images to the notebooks from your local. Fortunately you can easily make it done throught the built-in API.

    Read More

    Building Asynchronized HTTP Services With Sanic

    Python introduced async/await syntax from Python3.5. it makes your code non-blocking and speedy. Developers can use it to build a high-performance / NIO web services like NodeJS. Most of the Python web developers are familiar with Flask. But unfortunately flask has no plan to support the async request headers. Sanic is a Flask-like webserver that’s written to go fast. It was inspired by uvloop.

    Read More

    Several Important Concepts of CNN

    A trained convolutional layer is made up of many feature detectors, called filters, which slide over an input image tensor as a moving window. This is a very powerful technique and it possesses several advantages over the flatten and classify method or deep learning.

    Read More

    Tips for Hyperparameter Optimization

    One of the biggest headaches of using deep neural networks is that they have tons of hyperparameters that should be optimized so that the network performs optimally. Below are some notes coming from Deep Learning Quick Reference.

    Read More

    Started to go through convnetjs

    After reading several books about deep learning, now I can use keras / tensorflow to train some models, but the mathmatical implementations behind the libraries are still have to follow.

    Read More

    Scaling NodeJS Apps -- Archtectural Patterns

    This is the notes when I read the book Scaling Your Nodej.js Apps.

    +

    Layered Architecture

    It is based on the logistic seperation of concerns of your application (or platform) into layers. And the layers must comply with the following points:

    Read More

    \ No newline at end of file diff --git a/docs/page/6/index.html b/docs/page/6/index.html index 1c4e420c9..be0c0c5df 100644 --- a/docs/page/6/index.html +++ b/docs/page/6/index.html @@ -1,13 +1,18 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Scaling NodeJS Apps -- The Need to Scale

    This is the notes when I read the book Scaling Your Nodej.js Apps.

    +

    Scaling NodeJS Apps -- The Need to Scale

    This is the notes when I read the book Scaling Your Nodej.js Apps.

    An increasing in incoming traffic could affect your system in different ways; we can describe these as direct or indirect.

    Read More

    JavaScript 机器学习之分类与聚合算法

    聚类是接触无监督式学习时常见的一个问题。通常在你想将一个大的数据集重新编排组织成小的群组,或者是将其按逻辑相似性分解成小的群组时我们会考虑聚类。例如,你可以尝试将人口普查数据中的家庭收入分成三个群组:低收入,中等收入及高收入。如果你将家庭收的数据集做为指定的一种聚类算法的输入,你将期望得到三个数据聚点 及其对应的前述三个收入分组的平均值做为结果。即使是这种家庭收入数据的一维聚类问题,你也可能很难通过手动解决——难点在于无法快速地确定两个分组之间的边界值。你可能可以参考政府部门所定义的收入分组的标准,但无法确定这类定义的标准是几何均衡的; 这类的标准可能是被政策制定者所发明出来的,因此它可能无法精确地表达数据之间的正真关系。

    Read More

    Set up SSL for website with Nginx and StartSSL

    If you enable HTTPS and set up the certifications correctly, which means data will not be decrypted or modified during the transportation. Today I try to enable SSL to my website. Here is what I did to make it happen:

    Read More

    我的一个夏日清晨,写在天津塘沽码头集装箱爆炸后

    8月13日,东一区时间早晨六点多。

    我朦胧着醒来,习惯性得拿起手机想看看刚回国的男朋友是在做什么。可还没来得及看他的留言,就被公共号订阅里面的一批文章炸醒了。这些天已经关闭了朋友全功能,是为了免去朋友圈刷屏和被刷屏的干扰,安心写作的。但这些一眼望去的小标题们——天津?爆炸?阴谋论?一线?核弹?——足够把我拉出本来就不够有定力的小世界。原来,天津塘沽码头集装箱发生了爆炸,周边数公里内的居民区都受到严重震摄,并且因为爆炸剧烈且有毒气体、液体蔓延,消防和救护都直接升级到牺牲的警戒线。还躺在床上,一个人,刷一些新闻、图片和视频。没说什么话也没人说话,也根本没想要说什么话。起床冲凉前,却发现,眼角已经不知觉得弄湿了枕巾一片。

    Read More

    走进人生的第一个十年

    2015,我可以把它称作自己的第一个十年。当然,我不是十岁,这不是我的自然生命的第一个十年,而是我打算标记、也可以标记一下的第一个十年。同样,我也不是二十岁或三十岁,这样用十进制来做标记。甚至,这也不是我人生中有多么重要的一个标记——比如像娱乐圈人士走上星光大道的第几个十年,像穿过婚姻殿堂后的第几个十年,甚至开始工作后的第几个十年。真的都不是。如果一定要安置一个名头,那它是我离开家独自生活的第一个十年,也是我进入大学以后的第一个十年——并且我至今还未被放出来。

    Read More

    2014年10月19日

    安穩無憂的日子裡,沒有疼痛,就不會去想愛恨情仇。 痛,才是真實和最寶貴的。 這樣的安穩無憂,是生活的終點,是不快樂的根源。然而,快樂,到底是什麼?幸福,到底是什麼呢? 苦難,是恩賜,是機遇,是命運的另一種可能。

    Read More

    飞鸟

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    海水呀,你说的是什么? 
    What language is thine, o sea?

    是永恒的疑问。
    The language of eternal question.

    天空呀,你回答的话是什么?
    What language is thy answer, o sky?

    是永恒的沉默。
    The language of eternal silence.  

    我今晨坐在窗前,世界如一個路人似的,停留了一會,向我點點頭又走過去了。
    I sit at my window this morning where the world like a passer-by stops for a moment, nods to me and goes.  

    你看不見你自己,你所看見的只是你的影子。
    What you are you do not see, what you see is your shadow.  

    我不能選擇那最好的。 是那最好的選擇我。
    I cannot choose the best, The best chooses me.  

    神呀,我的那些願望真是愚傻呀,它們雜在你的歌聲中叫囂著呢。 讓我只是靜聽著吧。
    My wishes are fools, they shout across thy song, my master. Let me but listen.  

    人是一個初生的孩子,他的力量,就是生長的力量。

    Man is a born child, his power is the power of growth.  

    神希望我們酬答他,在於他送給我們的花朵,而不在於太陽和土地。

    God expects answers for the flowers he sends us, not for the sun and the earth.

    Read More

    写作,再一个重头开始

    或许是欺骗了自己很多年,或许是辜负了自己很多年――我一直以为自己深爱写作,却从未成为一个成功的作者,甚至已经好几年不去尝试。

    @@ -19,4 +24,4 @@

    渴望改变,是的,渴望着改变,那就改变。

    真的不用怕,因为根本没什么好怕的。

    停不住脚步,流浪,为了达不到的远方,为了找不到的家乡。

    -

    一直这样走着,盲目着也纠结着,其实是向着一个可以停下脚步的地方。

    Read More

    \ No newline at end of file +

    一直这样走着,盲目着也纠结着,其实是向着一个可以停下脚步的地方。

    Read More

    \ No newline at end of file diff --git a/docs/page/7/index.html b/docs/page/7/index.html index aeaffe8e9..834c1e479 100644 --- a/docs/page/7/index.html +++ b/docs/page/7/index.html @@ -1,16 +1,21 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    去屎 vs. 去死

    昨晚临睡前看完一本很短的小说,比利时作家 Dimitri Verhulst 十多年前的作品,已被译为英文和中文的畅销书(De helaasheid der dingen; The misfortunates; 《废柴家族》)。这是一本被称作“半自传式”的小说,以一个十多岁少年的视角冷眼旁观自己的家庭——主要是爸爸和叔叔们,一群只能跟老母亲挤在老房子里蹭救济金的醉汉们。他们生活在连小小的比利时地图都可将其遗忘的小镇上(译者称作宝旮旯),每日烂醉、满口粗暴。略有腐臭的黄油和拉屎的味道不相上下,男孩比谁的膀胱能尿得更高更远,而女孩同样能依靠这种方式涓涓地引来一群小鱼。小说里浸透了琥珀色的啤酒,随处可见阴毛,呕吐物更是堆在满纸。可是这个家庭的温暖在兄弟们、叔侄们、父子间默默地储存着。这样的温暖是可以给敌人一记左勾拳的能量。说“敌人”这个词或许太过了,只是一种愤怒,一种可被称为无产阶级的一家人在面对小资产阶级的谩骂和指责时,爆发出来的本能吧。同样,高唱着生理反应的酒歌,这个家庭的热血也浇灭了民俗学家的学术和研究,眼见着后者显得如何虚伪和苍白。兄弟们、小清新的公主表妹、临终前的痴呆奶奶都能唱《采木耳之歌》——“奇迹时代不停息,眼见天干又物燥,我的木耳湿又润。鸡叫过一遍,鸡叫过两遍,我感觉爽翻天。”(引自译文)而偏偏翘首企盼这段歌词的民俗学家们就愣是没机会听得到。

    Read More

    情人节的故事

    早晨天空湛蓝,极目处才望得见丝柔般的白云,遥远,也清清淡淡。晚上睡前就准备好了雨伞,本是要照着天气预报迎接整整一星期的雨天;谁知醒来后却见到这样的明亮。于是,专门绕个稍远的路去甜甜的面包店,去准备一块蝴蝶酥和一杯卡布奇诺的早餐,走在清晨的阳光中。

    +

    去屎 vs. 去死

    昨晚临睡前看完一本很短的小说,比利时作家 Dimitri Verhulst 十多年前的作品,已被译为英文和中文的畅销书(De helaasheid der dingen; The misfortunates; 《废柴家族》)。这是一本被称作“半自传式”的小说,以一个十多岁少年的视角冷眼旁观自己的家庭——主要是爸爸和叔叔们,一群只能跟老母亲挤在老房子里蹭救济金的醉汉们。他们生活在连小小的比利时地图都可将其遗忘的小镇上(译者称作宝旮旯),每日烂醉、满口粗暴。略有腐臭的黄油和拉屎的味道不相上下,男孩比谁的膀胱能尿得更高更远,而女孩同样能依靠这种方式涓涓地引来一群小鱼。小说里浸透了琥珀色的啤酒,随处可见阴毛,呕吐物更是堆在满纸。可是这个家庭的温暖在兄弟们、叔侄们、父子间默默地储存着。这样的温暖是可以给敌人一记左勾拳的能量。说“敌人”这个词或许太过了,只是一种愤怒,一种可被称为无产阶级的一家人在面对小资产阶级的谩骂和指责时,爆发出来的本能吧。同样,高唱着生理反应的酒歌,这个家庭的热血也浇灭了民俗学家的学术和研究,眼见着后者显得如何虚伪和苍白。兄弟们、小清新的公主表妹、临终前的痴呆奶奶都能唱《采木耳之歌》——“奇迹时代不停息,眼见天干又物燥,我的木耳湿又润。鸡叫过一遍,鸡叫过两遍,我感觉爽翻天。”(引自译文)而偏偏翘首企盼这段歌词的民俗学家们就愣是没机会听得到。

    Read More

    情人节的故事

    早晨天空湛蓝,极目处才望得见丝柔般的白云,遥远,也清清淡淡。晚上睡前就准备好了雨伞,本是要照着天气预报迎接整整一星期的雨天;谁知醒来后却见到这样的明亮。于是,专门绕个稍远的路去甜甜的面包店,去准备一块蝴蝶酥和一杯卡布奇诺的早餐,走在清晨的阳光中。

    还未到面包店就看到学校一家书店的橱窗换上了大大的心形和玫瑰的广告。红彤彤的,只让我想起远在中国的农历新年。这是为情人节做准备吧?同样是美好的。从面包店拎着给自己的食粮,心满意足,继续轻快地走去办公室。阳光暖,照着前行的路,刚好让迎面吹来的冷风不会显得那么冰凉。再哼两句小曲儿,还一边心想着怎么用各种七七八八的欧洲语言和中国方言说“早上好”,越发觉得有趣和惬意。眼瞅着路口的交通灯变成红色,也不会不耐烦,等得很安静。 就在我身旁,在十字路口的转角,在一家还没来得及开业的soup bar(就卖汤和三明治)门口,三个年轻人的对话随风飘进我的耳朵。  

    Read More

    一个人跑步

    冬日里的鲁汶在傍晚时分就已经黑黢黢的,砖红的小城一股脑儿得都罩在昏黄的路灯中。淅淅沥沥,还下点儿下雨。今年是个暖冬,可比台北舒服些。听说台北那股子冰冷,冬季还是到鲁汶来看雨吧。我总是小心翼翼地爱着鲁汶的雨。这里的雨很随性,随来随往。(似乎只有两小时内的天气预报才能说得稍微准一点。)它通常是安静的,一点儿都不闹腾。有时候大雨,它就可劲儿了下,像个自娱自乐的、还不会用学步车的孩子。没三五分钟,或许就过去了。天很低,满是像赶着聚会一样的云层,跑那么快。几乎是不会放晴了。过阵子它又开始下,或许就下了一整夜。

    Read More

    是谁曾撩拨过你的心弦

    有没有那么一个瞬间,就不知所以地心动了,或是脸红了。有没有那么一条短信或消息,就让你无法自己地分心了。有没有那么些人,来到你的生命里,没有预约。然而终究,都还是转身走开了。在故事的最后,你也不知道那个人的离开有没有回头的画面;因为,你既没有后视镜,也没有勇气让自己回一回头。似乎所有的爱情、关系,如果没能成就锅碗瓢盆和细水长流,就都有那么一丝的凄婉,不管谁对谁错。开头的时候,辩解和争论更少些,情境也更有趣些。

    Read More

    跨年2013–2014

    写“年终总结”似乎已经成了这个时代辞旧迎新的仪式,或者也可以称作习俗。对我而言,这也曾是个人习惯。不知道从什么时候我开始意识到这个习惯,也意识到很多人有这样的习惯。生日、大的纪念日、新年伊始。然而,就从上个星期到此刻,我心里有个犟到死的小人儿一直在咆哮:“今年不许写总结,不许发任何新年祝福给任何人,不许做任何与旧年新年相关的事情,甚至不要去想这样的话题!逃开逃开逃开,像逃开污染源或传染病一样!”如此病态心理其实是一种对自己的挑衅和批驳,对自己生活的不满和不愿承认,对明天的不敢面对。首先不知不觉得形成某种习惯、进入某种潮流,其实是形成了自己,形成了某个群体的一部分。然后再以挣扎和撕扯的方式,表达另一个自我的存在。任何的快乐、痛苦,或者说任何的情绪和感受,都是要消耗体力的。我再是情绪化,也有无力情绪化的时候。于是,让一场出师无名的、与自我的战争,以中场的方式暂停。

    Read More

    Merry Christmas and Happy New Year

    很快,又到了年末。聖誕加新年,學校學生放假,系裡秘書離職,老闆外出講學,同事去中國探親旅行,室友回家或遊玩。我,什麼都沒有計劃,似乎也好像是都被計劃好了一樣。就這樣留在家裡、留在學校、留在辦公室,留在我本來的生活當中。

    並沒有什麼悲傷或者孤單;如果說有,也完全不是因為沒有回國、沒有旅行。真的,只是沒有那個應該在自己身邊的人在身邊而已。

    Read More

    深呼吸

    寒冷冬日,北风吹。——真正符合字面意义的北风,它来自北极,且强劲到使得斯堪的纳维亚的人们交通瘫痪,飞机无法迫降。还好,我也只是骑车的时候感受到大风吹得自己要侧倒。其他都还好。

    星期五的下午,灰暗和周末。——也是一个真的结束,神学系的国际会议结束了,我的第一篇习作的草稿也结束了。还好,发给那个约稿的教授,也算是意味着发给了编委会。所以,也都还好。

    Read More

    寫作是一件需要堅持的事情

    有一些不得不說的話,也是一些不能隨便貼到網絡上讓人家去指指點點的話──比如,我想讓自己練習和堅持寫作,包括中文和英文。

    本來在SJZJ這篇論文的完整草稿沒寫完之前,因為魂斷藍橋的電影,因為今晚騎車被警察攔下修車燈的巧合,因為疲累和完成草稿的小小興奮,我好想寫點東西。甚至,腹稿都打了好幾遍。然而,最終提不起來的是精神、是勇氣。

    Read More

    黑暗中迎接夕阳

    黑暗中迎接夕阳,这样的经历于我还是第一次。今天周末,国内长假中,比国和鲁村继续安静中。而我,拉着窗帘关了自己在屋里一整天,什么也没有做,直到下午四点。所以才有了如此难得的机会——打开窗帘后,洒进来的,是夕阳。莫名地感受到夕阳的温柔和美丽,不张扬、不喧嚣。它不明媚,所以并不是活泼或愉悦的;它也不沉默,所以并不是阴郁或痛苦的。淡淡的忧伤和浅浅的微笑,这才是我此刻看到的夕阳。

    Read More

    流水账一年记 (二二更健康)

    之前也絮絮叨叨且各种矫情地说了很多自己的生活。近日过得太是开心得不知天高地厚,突然发现,已近一年。

    从初来乍到的兴奋到后来的孤独和不安,从学习工作压力的各种形式主义抓狂到鼻涕一把泪一把地习惯下来——这一年的我过得平平淡淡。或者换句话说,没有那么开心。直到最近的半个月。

    -

    宅在家中直面监狱的我,这个月一开始就跑去了海德堡。有人说这是海德堡的“情缘”。虽然我骂人家好酸啊,但依然无比珍视跟这群人的相识、一起看日落、一起走哲学家小道、一起在沿河的路边嬉笑打骂。似乎,好久,都没有过。还未离开海德堡,亲爱的xixi就从罗马飞来,带着一箱子从香港和台湾一起运来的思念。如此的相见已经计划了大半年、期待了大半年;然而一起却只能有短短两天半。分分秒秒,如何不是我最开心的时光。有朋自远方来,定是欢乐不少,后来也有朋友从法国来旅行。

    Read More

    \ No newline at end of file +

    宅在家中直面监狱的我,这个月一开始就跑去了海德堡。有人说这是海德堡的“情缘”。虽然我骂人家好酸啊,但依然无比珍视跟这群人的相识、一起看日落、一起走哲学家小道、一起在沿河的路边嬉笑打骂。似乎,好久,都没有过。还未离开海德堡,亲爱的xixi就从罗马飞来,带着一箱子从香港和台湾一起运来的思念。如此的相见已经计划了大半年、期待了大半年;然而一起却只能有短短两天半。分分秒秒,如何不是我最开心的时光。有朋自远方来,定是欢乐不少,后来也有朋友从法国来旅行。

    Read More

    \ No newline at end of file diff --git a/docs/page/8/index.html b/docs/page/8/index.html index 0b43d0bc8..f99435a54 100644 --- a/docs/page/8/index.html +++ b/docs/page/8/index.html @@ -1,17 +1,22 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    触底反弹

    或许与荷尔蒙没什么关系,因为它们已经被扔在健身房了。但总还是反反复复地,再次完成近两个星期的忧郁时间。总在有意无意地克制自己,放不开嚣张也放不开坚强。这样看似矫情地在情绪低谷写日志,自己也是嗤之以鼻;但想想却有合情合理的地方。把酒言欢的时候,全身心地投入的时候,或者累得睁不开眼的时候,又不是要卖字为生,能有哪门子的心思或者动力来写点无聊的字?只有在这样——仲夏黑夜,沉默累积,独自一人又无处宣泄的时候。如此的矫情都有了得以存在的理由。如此,我便真是无聊到一定程度了。

    Read More

    那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学

    此处的胡言乱语来自两个尴尬:

    +

    触底反弹

    或许与荷尔蒙没什么关系,因为它们已经被扔在健身房了。但总还是反反复复地,再次完成近两个星期的忧郁时间。总在有意无意地克制自己,放不开嚣张也放不开坚强。这样看似矫情地在情绪低谷写日志,自己也是嗤之以鼻;但想想却有合情合理的地方。把酒言欢的时候,全身心地投入的时候,或者累得睁不开眼的时候,又不是要卖字为生,能有哪门子的心思或者动力来写点无聊的字?只有在这样——仲夏黑夜,沉默累积,独自一人又无处宣泄的时候。如此的矫情都有了得以存在的理由。如此,我便真是无聊到一定程度了。

    Read More

    那年我们还未到的花季雨季——为了忘却我的甘肃省定西县东方红中学

    此处的胡言乱语来自两个尴尬:

    第一个,超级兴奋且意外地收到某大杂志的评审意见(因为最初寄出去稿子的时候压根没想到还会有二审和修改的机会),却尴尬地看到其中最尖锐的问题是我最难以修改的方面——在冷峻的史学分析与感性的区域性描写之间,我重了后者而轻了前者。轻前者是功力不足导致,重后者却是我割舍不下。其实,这篇“学术”论文写的是民国时期的甘肃某某、河西走廊某某、黄土地和戈壁滩某某。甘肃,我那个满面烟火色的家乡。

    Read More

    周末复周末

    我的生活本没有周末的概念。平日里也可以自己跑出去购物、健身或旅行,周末也常常宅在家里看书或工作。拥有自由也同时在挥霍自由。就这样也惯了。只因为这学期的课程刚好以周一早晨开始,以周五下午结束,我便也有了个有模有样的周末。

    周末,窝在沙发里听音乐,读些闲来不羁的东西,或者发呆——一阵遐想也能让时间张牙舞爪地从眼前飞过。而我,就眼看着时间飞过时它那龇牙咧嘴的邪恶表情,向我炫耀它如何地不肯为我停下,如何地不为我的喜怒哀乐所动,如何地继续它比我更自由的旅行、向我证明它才是主宰——而我只是过客。那么多的讨论那么多的技术,都会以它为中心,却从来占据不了它。即使用摄像机记录下每时每刻每分每秒,即使所有的记录都可以无限切割,我们仍然必须要漏掉正在记录它或者正在切割它的时间里所溜走的时间。看过很多讲时间管理和效率管理的理论,也尝试过,然而无论以什么样的主题和视角,却总还是被它所控制。最终,唯一能安慰和调节的只能是自己,让自己面对,并且积极地面对每一秒钟。

    Read More

    存活期与生长期

    看书到一半,带着近乎“失语”的低落感,希望写个阶段性成果,给自己,更给近来没太联系的朋友们。存活期,是我来比读书至今的9个月时间;生长期,是盼望中的接下来3个月。1年光景,不短不长。

    9个月来,有哭有笑,前者更多。想放弃,想找退路回到过去,却发现当你自己无力的时候,都不再能自己做主。那个在泥泞里行走的车轮将不是自己,而是自己心中未灭的火焰、未解的疑问,自己这个人只是泥土中的车辙和狼狈。具体说,9个月,我还好好地活着。几番考试和学习下来,我勉勉强强求得存活。都说第一年是最有挑战的,因为研究方向本身的特点,“文化差异”这个概念对于我,它不是蜻蜓点水般的口头禅,而是切实的冲撞和窒息感。多种语言的挑战和我经常独自一人的生活无法融合。于是,终于,挂了一科。老师说在语法和词汇都很棒的情况下,因为我不愿意跟其他欧洲人讲法语,所以那些知识不能在我的交流中起作用。坦白讲,一直做学生的我是不经常挂科的,要面对已是不易;这样拿出来说给别人听,真的是不易。而且最讽刺的是,一个研究文化“交流”问题的我,居然在自己的生活中不能与人“交流”。很犯贱地说,我自己的这个过度阐释本来是为了自嘲,后来也实实在在伤到了自己,真的不想跟人说话,任何话,情愿“失语”。9个月,就这样结束了。不管学到多少、体会到多少、调整了多少,我在这里给自己的结论是:勉强存活。本来有多次回国探亲、休息的念头,但夏天会有好友来欧洲。无论如何,见到他们,就是情感的安慰。回国的盘算,暂且明年。

    Read More

    轻轻行走在失败的边缘线上

    先说说为什么突然跑来QQ写字,因为孤单寂寞抽风了,因为想要吸引眼球和嘘寒问暖了,因为想要预设一个观众群来上演毫无意义的独角戏。很简单,因为闷骚需要发泄了。我是个很懒的人,不论别人的故事也好、自己的世界也罢,经常写着写着就躲在沙发里做春秋大梦去了。写字,总也是辛苦的事情。即使再闷骚的人,比如类似我这种,也可能有很害羞的一面,或者说就是懦弱和胆怯,就是不敢面对。无论是故事的内容、自己的成长和变化、他人的经历,哪怕是笨拙到让人不齿的写作能力,这一切,我都不敢面对。于是就做了自己的网站,去那里写。没打算走广而告之的路线,所以没使用任何热门字眼,那个网站也很安静。听说从我天朝是上不去那个网站的,大约是因为它的服务器在米国的缘故。于是这样的安静更有了技术上的、实际的解释,网站所有内容都是用中文写的,而中国人最多的地方它却被墙在门外。该自嘲呢还是自嘲呢?直到某天看到一些评论和留言,我甚至怀疑他们只是水军,或者四处乱踩,是希望别人踩回他们的页面。不管是不是真的这样,看到评论的一刹那,某根弦被触动了——原来,我需要的不是面对孤独、塑造孤独的勇气,而是敢于示人的勇气。总之,在这个方面,算是还挺失败的。依然懦弱着。

    Read More

    写给颓废的美丽

    曾经,觉得自己生活得苦。曾经要早起出操,曾经害怕迟到,害怕站在教室门口面对老师的铁面孔和同学来来往往的、并无恶意的玩笑和眼神。后来,就害怕考不上大学,再到害怕挂科,甚至害怕找不到工作或者到不了心目中的地方。当然,也曾害怕不被人喜欢、害怕失恋,害怕丢掉哪怕是一段鸡肋的关系。再后来,害怕生病,害怕毕业,害怕面对一个长大的自己和长大的世界。

    Read More

    25岁,你有什么可失去的?

    无论示爱还是投稿、递交申请或者简历,摇头的速度似乎总是比点头来得快。曾经在哪里见过科学研究是说点头更容易呢?在还胆敢称自己是25岁的时候,我们会有多么害怕遭到拒绝?有多么害怕陷入迷茫?有多么害怕未来不会是自己曾梦想过的画面?然而这样的害怕,可以有一个多久的时限? 最近我常常在想,我们的记忆有多长、我们的生命有多长。某种记不得名字的鱼类,听说它的记忆是三秒,在某些惶恐和灰色的时光里,我有多么羡慕它。然而,当真实地回到生活中——远离痛苦或快乐的幻觉——却又生生地感慨生命的短暂。在这短短的几十年中,好吧,假设一个100年的距离是我们的一生(如果带着呼吸机的日子也算作内),25岁在这个四分之一点上,它又能丈量多远?身处故纸堆的另一个快乐是任意地让自己回到历史上任何一个时间、任何一个地点、任何一群人当中去。那一个25岁的自己,它又能算作什么? 有些情绪是来自于生理期、有些是因为24小时内收到一封拒信(如果是接收函一般要好等个把月甚至一年)、还有些情绪是由于重看了一遍《欲望都市》(the sex and the city) 2008年电影版。这群女人从二十多岁穿着多于普拉达的一身走过四五十岁,从曼哈顿再回到曼哈顿,也陪我度过曾经的大学。如今看来,曾让我感到炫目的或者说偶尔会羡慕的标签似乎减少了。无论是她们的独立、勇敢,还是电视电影里除了爱情和性就一副不食人间烟火的“城里”生活,对于现在的我,都不重要。五年后,我重看她们,却在分分秒秒地拷问自己,“你有什么可失去的?”就像女主人公说,女孩们都是二十多岁来到纽约,然后为名牌和爱情,一路打拼,跨过四十岁就来到该付酒钱的阶段。借着之前的拒信,我便不合逻辑地扯到——25岁的我有什么可失去的?要如何才能积攒一些可以让将来那个40岁的自己可失去的东西? 眼下我回答不了这个问题,正如我们其实经常不断地抛出、然后再撇下一些问题在生活中、在学习中、在关系中一样。这是我一个人住的第一年,并不希望像正在女孩子们当中流行很广的“第五年”那样似乎要标榜点女孩的成长或者之类的东西。只是觉得,25岁,一个人住第一年,真的没什么可失去的。此刻我有个决定,虽然是拒信,一个回复也是要给的。感谢对方写我一封拒信的时间,感谢它给我一个再次启程的地方,趁着25岁还来得及的时候。

    Read More

    一眨眼就平静了

    自己也不曾料想,真的就变成了此刻这样平静的自己。近来的生活一如既往地没有波澜——读书、上课、学语言、过生活。如果一定要说有点什么变化?那是进入了论文选题阶段,有些游移不定和信心不足;那是勇敢地做自己多年来一直被动也主动地丢弃了的事情,重新弹琴。

    如常,每一天的生活就是这样,安静。也不在为某种享受孤独、学会寂寞、与自己相处之类的文青式主题来安排这样的日子了。我看得到,大部分在国外上学的中国孩子,都像从密密麻麻的中国地铁里钻出来却突然来到大草原上或者森林里一样,像小鹿,都突然要适应这份自由、新鲜和更多的孤单、远离热闹。有人拒绝这种改变,便带着出国的名头继续过着北京时间的生活;有人喜欢这种改变,但也终究需要找到一种方式让热气腾腾的中国血液找到流淌的渠道。否则,那不就得中风了么。无论如何,当暂时搁下“自我”,我看得到,这个自己,只是茫茫留学群体中的一员。我的感受并没有什么特别,我的情愫并不怎么重要,更何况,我的文字淡如水,还不够那么煽情。这样的平常的自己和平常的生活,还有这半年多平常的转变,就让她们都呆在那里吧。没什么可提了。

    Read More

    为了穿越的旅行

    今天的主题是无话可说。

    一个放逐自己的理由,拿在手中,就这样走了。奔着降温前的最后一个暖冬日,我在一个晚起的早晨,摸上了去安特的火车。这个距离我只有一小时的比国省份,这个曾在17世纪繁荣整个欧洲和东亚贸易的海港城市,这个让我默默想象了半年的地方,睁开眼,就去了。

    感谢google感谢iphone感谢好天气,胆小的姑娘顺利地开始了独自一人的欧洲旅行。如果除去巴黎的一天外,这是首趟单人往返的出走。为着出走的自由,更为着穿越的乐趣。今天的主要目的地是Plantin Moretus博物馆和Our Lady的大教堂,算是带着“半学术”的任务去的。眼见着我的日子越来越陷入17世纪而不能自拔了,亲自造访一下Plantin家里这个当年最大的印刷出版所,实在是荣幸得不得了。然而,我的感受却是无话可说。从进入博物馆到饿着肚子爬出来觅食,我不知道被美得倒吸了多少口暖气!我拙劣的语言要如何可以讲得了那不计其数的铜活字模、木活字版和后来的铅字模版;我的粗心要如何可以懂得主人的私人藏书馆究竟摆在那里多少热情和智慧;我的无知更是无法读得出各种语言的印刷书籍和手稿。所以,我闭嘴。但是,我要努力记住,恨不得让眼珠跳出来仔仔细细爬过每一页纸。这里的印刷出版从15世纪就开始了,它以己之力支持了伊拉斯谟,帮助了在中国的传教士,也直接促使人文主义从低地国家的广播和欧陆的对话,也曾成为向英伦国家输入不同版本圣经的主要资源。怎样寻找自己与历史的距离呢?我想,这是一个方法。在这里,我甚至不想回到以程序语言和破碎、愤怒、争吵为象征的眼下的时代。于是,情愿又不情愿地活在奔跑在几个世纪之间。而我的无知,让这样的旅程显得激动人心又太过疲惫。

    Read More

    火一团

    一个深居简出的笨女人,却从簌簌的雪天到阴霾的雨夜,浇不灭心里一团火。这样的火焰甚至足以燃烧满屋子的纸片,让其中挑动每一根神经的沉默和疼痛感都燃烧起来。

    -

    前些日子读到罗素的自传序言《我为何而生》,孤陋寡闻的我算是第一次听罗大师讲他的爱情,看他的火焰。记得当时还有些害羞,觉得这老男人怎么如此直白,有什么可让他狂喜、战栗,同时又绝望、亦天堂?那时的我,虽说不是看一个疯子胡言乱语的心境,倒也差不了几步。此刻,却愣是要重新找到这篇小文,因为我的火焰,爱情、知识和怜悯,已然无法浇灭了。

    Read More

    \ No newline at end of file +

    前些日子读到罗素的自传序言《我为何而生》,孤陋寡闻的我算是第一次听罗大师讲他的爱情,看他的火焰。记得当时还有些害羞,觉得这老男人怎么如此直白,有什么可让他狂喜、战栗,同时又绝望、亦天堂?那时的我,虽说不是看一个疯子胡言乱语的心境,倒也差不了几步。此刻,却愣是要重新找到这篇小文,因为我的火焰,爱情、知识和怜悯,已然无法浇灭了。

    Read More

    \ No newline at end of file diff --git a/docs/page/9/index.html b/docs/page/9/index.html index 9fc6d14d7..021b75dc8 100644 --- a/docs/page/9/index.html +++ b/docs/page/9/index.html @@ -1,17 +1,22 @@ -Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End +Beendless ~ 快节奏,慢生活,无止境 | Move Fast, Live Happily, With No End -

    Ym和Yf的聊天:历史是个什么玩意儿

    一直以来,其实对于Yf做什么都不是特别特别地清晰。每次别人问是做什么的,我只能结结巴巴地介绍,是学历史的,是做汉学的,是搞宗教方面的,是研究中外文化交流的。。。每一次介绍,都把身边这帮学理工科的土鳖们给吓得一愣一愣地。晚上看到了她近期给老板准备的文章后,慢慢地好像有点明白了。从尘封的各种纷杂的资料,记录,正史,野史中,抽丝拨茧,考证、还原真正的历史,他(她)们就是站在四维空间来旁观人类历史,来审视人类历史,来重现人类历史的一群人。有点小感悟,以前有句话“历史是由史学家来撰写“的,但我们从小到大看到的,都好像不是真正的历史,这会对Yf从事的事业有些感慨了,最近一堆老男人捧红了柴大女神及她的那本《看见》,但她“看见”的东西真正地剥离了政治环境等等的束缚?司马迁写史记的时候都不自主地有些小心眼,现在的环境这么复杂,这本书在被读者拿到手里的时候,一定也是经过各种各样的处理了的。。。。而现在,Yf,就是在做着还原真相,重现历史的事情呀。

    Read More

    过月子·卖成年人的萌

    “月子”?眼前冷不丁蹦出这么个时间段。因为最近,我过的是月子。而这篇白话,是真的憋了整整一个月,连痛经都不得不包括在里面了。

    +

    Ym和Yf的聊天:历史是个什么玩意儿

    一直以来,其实对于Yf做什么都不是特别特别地清晰。每次别人问是做什么的,我只能结结巴巴地介绍,是学历史的,是做汉学的,是搞宗教方面的,是研究中外文化交流的。。。每一次介绍,都把身边这帮学理工科的土鳖们给吓得一愣一愣地。晚上看到了她近期给老板准备的文章后,慢慢地好像有点明白了。从尘封的各种纷杂的资料,记录,正史,野史中,抽丝拨茧,考证、还原真正的历史,他(她)们就是站在四维空间来旁观人类历史,来审视人类历史,来重现人类历史的一群人。有点小感悟,以前有句话“历史是由史学家来撰写“的,但我们从小到大看到的,都好像不是真正的历史,这会对Yf从事的事业有些感慨了,最近一堆老男人捧红了柴大女神及她的那本《看见》,但她“看见”的东西真正地剥离了政治环境等等的束缚?司马迁写史记的时候都不自主地有些小心眼,现在的环境这么复杂,这本书在被读者拿到手里的时候,一定也是经过各种各样的处理了的。。。。而现在,Yf,就是在做着还原真相,重现历史的事情呀。

    Read More

    过月子·卖成年人的萌

    “月子”?眼前冷不丁蹦出这么个时间段。因为最近,我过的是月子。而这篇白话,是真的憋了整整一个月,连痛经都不得不包括在里面了。

    逍遥自在的巴黎圣诞和布鲁塞尔新年似乎早就为接下来的一个月埋下伏笔,1月4日跟教授吃完饭后,谜团解开。那几天的鲁汶还享受着“印度夏”的温度和满是阴霾的沉寂,指着灯光闪烁的图书馆,教授问我,“好看么?”我还没噎上一句回话的时候,他自己说,“好看,但可能一月底就没有了。”多么惬意轻松的话题,我完全没意识到其中的不详预兆,乐呵呵地抛出对考试月的疑问,“教授,我需要参加考试么?我是旁听了一个学期,但我不需要学分,所以……”如此拙劣的暗示已经将自己出卖得淋漓尽致,可眼前这个绝顶聪明又小有狡猾的大男生用他最擅长的线性思维给我迎头一击,“既然都上课了,那就去考试啊。”我慌张得无所适从,已经结巴地不知道怎么辩解,“我……可是……我以为不需要考试啊,所以上课的时候就认为自己不需要考试啊,所以……”“但是你上课了,对么?”“那当然,我没有逃课!”“所以,很简单啊,直接去考试。晚安!”不由分说,我接下来的一个月便这样诞生了。

    Read More

    阳光下

    28日在神学系图书馆一层赶期末论文报告的时候,那也是一个月的积雪突然在一个早晨被一场小雨化尽的时候。而我,坐在阳光里,就那样盯着歪歪曲曲的树杈,看它好像要使劲伸展,却干瘪得只有筋骨的样子,看它与我一起沐浴在午后的阳光中,等待下一个彩色的春天。

    公园里那一大滩子的水,是刚刚融合的冰渣与细雨,没有波光粼粼,没有白雪簌簌,不透亮、不清新,甚至远看有点被草地和阳光反衬得脏兮兮的墨绿色。但我却爱上它的宁静,甚至坏坏地想象会不会有小孩跑过去以为那是冰面,然后一个踉跄跌倒在上面,湿漉漉地毁掉这独自存在的一滩水。哦,不小心,发掘了我骨子里的侵略快感,坏坏的。没有带相机,但是我要如何才能狠狠地记住眼前的小丘和这一滩水,还有那些也正在盯着我的树枝呢?

    Read More

    只生活,不留学

    “时间过得真快”——一句烂透了的真理!又是一个周末,甚至已经是周日的晚上了,这篇日志被拖延29个小时了。远不同于上个星期那种满肚子的话不知道从何说起的焦急,这个星期过得有些无话可说。

    这七天,说它乏味,只是因为自己懒惰,没有学会多少新东西,在学习上并没有很多进步和收获。但它又真的对我很重要,它是我二十多年来第一次完全独立生活的开始。

    Read More

    初到鲁汶

    除却奔走和疲惫,本是可以早点写日志的。但在不同语言之间切换的贫乏词库和对陌生环境的迟钝反应,都成为难以下笔的原因。于是,拖到不能再拖的时候,已是来到鲁汶的第四天了。

    暂且搁下第一次长途飞行的辛苦吧,那只是自己坐硬座火车的经历太少的缘故。布鲁塞尔国际机场相比北京首都机场的小,就能快速证明我即将生活的地方与北京的不同。只有一个出口,甚至不用乘电梯,直接下飞机,取行李,就可以排队过关了。查验护照和签证,居然像我的第一次考试一样。看到海关在问别人问题,我紧张得好似自己是偷渡或贩运不法物品,不知待会儿得如何回答海关的问题,这样的紧张只是源于怕自己不会说英文、听英文。好吧,过度焦虑了。海关看到是鲁汶的学生,不仅问我很少问题,还差点儿聊起家常来。出去见到接我的老师,一时高兴得差点儿抱住他俩。三言两语之后,居然被问是否在美国生活过,诧异之余更多窃喜了,因为他们都夸我英文好。好吧,那更要少说点儿了,否则露馅更快。

    Read More

    临行前的慵懒

    很久不来码字,是觉着码得不好,废话太多,或者意欲遮掩的情感太多,反而读起来枯燥乏味。是啊,一个情不自禁就要伤春悲秋的姑娘,却要不断抑制那些啼笑,这种纠结是旁人不能懂也完全无需去懂的。有时读到别人的文字,看那些细腻的描写在平淡中绽放流光溢彩,不经意地就挑动读者各种神经,甚至产生生理反应,我更觉得自己无趣,无甚可写。然而,在这个即将离开,不,应该是即将辗转的日子里,似乎不写点什么就是对过去的遗弃,对未来的漠然。

    Read More

    那些常被勾起的情愫

    一篇《春风沉醉的晚上》再次勾起我久违的情愫——懒懒地窝在沙发里捧着心爱的故事。于是,一发不可收拾。清新也好,纠结也罢,却又终止在《红与黑》的挣扎和苦痛当中。这样的周末,最让人怀念。

    读书写字是一个不错的习惯,只是需要付上更多的用心和感情。当眼前空白得只剩下用逻辑演绎的世界,只剩下笔直的通向目的地的天梯,我便再懒得有心、懒得有感情了。想想这几年,一次次启程,都只为了心中那唯一的远方。现在触手可及,反倒更多了几分犹豫。于是,此刻的自己愿意停下来,为那些想念的人,想念的事。

    Read More

    当这个世界只剩下喧嚣

    自己也是个爱热闹的人。我喜欢跟朋友们一起吃火锅,各种犯二,不加收敛。在记忆中,那是用放肆来表达的友爱。我们就在那样的吆喝、聒噪中成长。简单而快乐。

    当这样的热烈已然不在,我们都各自寻找一个饭碗,真的,就为一个饭碗儿吧。留下的,或许还在这样热闹;而离开的,也真是不得不离开。于是,我开始在这个陌生的地方厌倦生活中的各种嘈杂,却常常按捺不住自己内心的喧嚣。我坐立不安,用坐立不安的方式发呆。不经意,大半天就过去了。或者疾步行走,用没有笃定、没有方向感的方式行走,很多风景也就过去了。自己也不记得当时在想什么,甚至不晓得此刻在想什么。

    Read More

    从4战四级470到4战托福105,我的血泪申请之路

    1
    突然发现当年写的这篇文章被无数论坛转载。。。

    Read More

    术后重建

    看着所有人都在倒数、跨年、总结,有些百无聊赖的我终于打开日记本履行我所承诺过的“医院感悟”。也算恰当。这个手术,是陈燕子同学2011年度唯一重要也最重要的事情,可以作为年终总结的主题;术后重建也是她对2012所寄予的最大希望,是对新年的期许。

    -

    或许看起来有些矫情,就做一手术,有什么大不了的,还拿来得瑟。与人无关,这是我必须要跟自己矫情的事情。这是我第一次上手术台,是我第一次躺在医院的病床上,是我婴儿期之后的第一次生活不能自理,是我短暂的生命里最痛、最孤独、最害怕的,但也最坚强的日子。手术后整整十天了,只有此刻想写点儿东西作为留给自己的纪念,为了纪念自己走过的每一步,包括蹒跚的任何一步。

    Read More

    \ No newline at end of file +

    或许看起来有些矫情,就做一手术,有什么大不了的,还拿来得瑟。与人无关,这是我必须要跟自己矫情的事情。这是我第一次上手术台,是我第一次躺在医院的病床上,是我婴儿期之后的第一次生活不能自理,是我短暂的生命里最痛、最孤独、最害怕的,但也最坚强的日子。手术后整整十天了,只有此刻想写点儿东西作为留给自己的纪念,为了纪念自己走过的每一步,包括蹒跚的任何一步。

    Read More

    \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 8a789d148..ab0a9879c 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,1085 +2,1283 @@ - http://blog.beendless.com/2021/11/15/Set%20up%20Kubeadm%20on%20Macbook%20with%20Vagrant/ + http://blog.beendless.com/about/index.html - 2021-11-15 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/26/Ma-Po%20Tofu/ + http://blog.beendless.com/2013/11/15/%E9%BB%91%E6%9A%97%E4%B8%AD%E8%BF%8E%E6%8E%A5%E5%A4%95%E9%98%B3/ - 2021-10-26 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/19/Multi-Stage%20Golang%20Docker%20Image/ + http://blog.beendless.com/2014/10/15/%E9%A3%9E%E9%B8%9F/ - 2021-10-21 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/18/Mastering%20Go%20Notes/ + http://blog.beendless.com/2013/01/28/%E9%98%B3%E5%85%89%E4%B8%8B/ - 2021-10-21 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/16/Monotonic%20Stack/ + http://blog.beendless.com/2013/11/15/%E9%82%A3%E5%B9%B4%E6%88%91%E4%BB%AC%E8%BF%98%E6%9C%AA%E5%88%B0%E7%9A%84%E8%8A%B1%E5%AD%A3%E9%9B%A8%E5%AD%A3%E2%80%94%E2%80%94%E4%B8%BA%E4%BA%86%E5%BF%98%E5%8D%B4%E6%88%91%E7%9A%84%E7%94%98%E8%82%83%E7%9C%81%E5%AE%9A%E8%A5%BF%E5%8E%BF%E4%B8%9C%E6%96%B9%E7%BA%A2%E4%B8%AD%E5%AD%A6/ - 2021-10-17 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/14/Dynamic%20Programming%20IV/ + http://blog.beendless.com/2012/08/12/%E9%82%A3%E4%BA%9B%E5%B8%B8%E8%A2%AB%E5%8B%BE%E8%B5%B7%E7%9A%84%E6%83%85%E6%84%AB/ - 2021-10-17 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/13/Dynamic%20Programming%20III/ + http://blog.beendless.com/2013/02/01/%E8%BF%87%E6%9C%88%E5%AD%90%C2%B7%E5%8D%96%E6%88%90%E5%B9%B4%E4%BA%BA%E7%9A%84%E8%90%8C/ - 2021-10-15 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/12/Stock%20Exchange%20Problems/ + http://blog.beendless.com/2013/11/15/%E8%BD%BB%E8%BD%BB%E8%A1%8C%E8%B5%B0%E5%9C%A8%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%BE%B9%E7%BC%98%E7%BA%BF%E4%B8%8A/ - 2021-10-14 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/08/Dynamic%20Programming%20II/ + http://blog.beendless.com/2011/06/18/%E8%B7%AF%E2%80%94%E2%80%94%E6%9C%89%E9%80%89%E6%8B%A9%EF%BC%8C%E6%98%AF%E8%BF%87%E7%A8%8B%EF%BC%8C%E5%B9%B6%E9%80%9A%E5%90%91%E7%BB%93%E6%9D%9F/ - 2021-10-12 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/09/Knapsack%20Problem%20II/ + http://blog.beendless.com/2013/12/30/%E8%B7%A8%E5%B9%B42013%E2%80%932014/ - 2021-10-12 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/06/Dynamic%20Programming%20I/ + http://blog.beendless.com/2015/01/05/%E8%B5%B0%E8%BF%9B%E4%BA%BA%E7%94%9F%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8D%81%E5%B9%B4/ - 2021-10-10 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/07/Knapsack%20Problem%20I/ + http://blog.beendless.com/2013/11/15/%E8%A7%A6%E5%BA%95%E5%8F%8D%E5%BC%B9/ - 2021-10-10 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/01/Backtracking%20-%20Chessboard/ + http://blog.beendless.com/2011/05/21/%E7%BB%99%E8%87%AA%E5%B7%B1%E4%B8%80%E4%B8%AA%E4%BB%A5%E5%AF%82%E5%AF%9E%E4%B8%BA%E5%90%8D%E7%9A%84%E5%98%B4%E5%B7%B4%E5%AD%90/ - 2021-10-08 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/13/Heap-and-Heap-Sort/ + http://blog.beendless.com/2010/03/20/%E7%BB%93%E6%9D%9F%E4%B8%8E%E5%90%AF%E7%A8%8B/ - 2021-10-08 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/06/Greedy%20%20Problems%20III/ + http://blog.beendless.com/2013/02/26/%E7%81%AB%E4%B8%80%E5%9B%A2/ - 2021-10-07 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/05/Greedy%20%20Problems%20II/ + http://blog.beendless.com/2013/12/20/%E6%B7%B1%E5%91%BC%E5%90%B8/ - 2021-10-07 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/12/Query-with-Stack/ + http://blog.beendless.com/2013/11/15/%E6%B5%81%E6%B0%B4%E8%B4%A6%E4%B8%80%E5%B9%B4%E8%AE%B0%20%EF%BC%88%E4%BA%8C%E4%BA%8C%E6%9B%B4%E5%81%A5%E5%BA%B7%EF%BC%89/ - 2021-10-06 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/03/JumpGame%20%20Problems/ + http://blog.beendless.com/2011/12/31/%E6%9C%AF%E5%90%8E%E9%87%8D%E5%BB%BA/ - 2021-10-06 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/07/Two-Pointers/ + http://blog.beendless.com/2014/01/11/%E6%98%AF%E8%B0%81%E6%9B%BE%E6%92%A9%E6%8B%A8%E8%BF%87%E4%BD%A0%E7%9A%84%E5%BF%83%E5%BC%A6/ - 2021-10-04 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/03/Greedy%20%20Problems%20I/ + http://blog.beendless.com/2015/08/13/%E6%88%91%E7%9A%84%E4%B8%80%E4%B8%AA%E5%A4%8F%E6%97%A5%E6%B8%85%E6%99%A8%EF%BC%8C%E5%86%99%E5%9C%A8%E5%A4%A9%E6%B4%A5%E5%A1%98%E6%B2%BD%E7%A0%81%E5%A4%B4%E9%9B%86%E8%A3%85%E7%AE%B1%E7%88%86%E7%82%B8%E5%90%8E/ - 2021-10-04 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/01/Backtracking%20-%20Subsets/ + http://blog.beendless.com/2014/02/05/%E6%83%85%E4%BA%BA%E8%8A%82%E7%9A%84%E6%95%85%E4%BA%8B/ - 2021-10-03 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/13/Tree-Traversals-DFS/ + http://blog.beendless.com/2010/04/04/%E5%BD%A2%E8%80%8C%E4%B8%8B%E7%9A%84%E6%A2%A6/ - 2021-10-03 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/01/Backtracking%20-%20Partitioning/ + http://blog.beendless.com/2012/07/29/%E5%BD%93%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E5%8F%AA%E5%89%A9%E4%B8%8B%E5%96%A7%E5%9A%A3/ - 2021-10-02 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/10/01/Backtracking%20-%20Combinations/ + http://blog.beendless.com/2010/11/29/%E5%BD%93%E5%B9%B4%E5%86%99%E7%BB%99star%E7%9A%84%E4%BF%A1/ - 2021-10-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/27/Modify%20Trees/ + http://blog.beendless.com/2013/11/15/%E5%AF%AB%E4%BD%9C%E6%98%AF%E4%B8%80%E4%BB%B6%E9%9C%80%E8%A6%81%E5%A0%85%E6%8C%81%E7%9A%84%E4%BA%8B%E6%83%85/ - 2021-09-29 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/27/Search%20in%20Trees/ + http://blog.beendless.com/2013/11/15/%E5%AD%98%E6%B4%BB%E6%9C%9F%E4%B8%8E%E7%94%9F%E9%95%BF%E6%9C%9F/ - 2021-09-28 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/23/Construct-and-Update-a-Tree/ + http://blog.beendless.com/2013/11/15/%E5%91%A8%E6%9C%AB%E5%A4%8D%E5%91%A8%E6%9C%AB/ - 2021-09-23 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/19/Tree-Properties/ + http://blog.beendless.com/2012/09/23/%E5%8F%AA%E7%94%9F%E6%B4%BB%EF%BC%8C%E4%B8%8D%E7%95%99%E5%AD%A6/ - 2021-09-22 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/14/Tree-Traversals-BFS/ + http://blog.beendless.com/2014/03/23/%E5%8E%BB%E5%B1%8E%20vs.%20%E5%8E%BB%E6%AD%BB/ - 2021-09-19 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/12/Design-a-Stack-with-Queue/ + http://blog.beendless.com/2012/09/15/%E5%88%9D%E5%88%B0%E9%B2%81%E6%B1%B6/ - 2021-09-12 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/11/Design-a-Queue-with-Stack/ + http://blog.beendless.com/2014/06/07/%E5%86%99%E9%81%97%E5%98%B1%E4%B9%8B%E5%89%8D/ - 2021-09-12 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/09/String-Match-with-KMP-Algorithm/ + http://blog.beendless.com/2013/04/13/%E5%86%99%E7%BB%99%E9%A2%93%E5%BA%9F%E7%9A%84%E7%BE%8E%E4%B8%BD/ - 2021-09-10 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/ + http://blog.beendless.com/2014/09/22/%E5%86%99%E4%BD%9C%EF%BC%8C%E5%86%8D%E4%B8%80%E4%B8%AA%E9%87%8D%E5%A4%B4%E5%BC%80%E5%A7%8B/ - 2021-09-07 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/08/30/Design-A-Linked-List-Class/ + http://blog.beendless.com/2012/02/15/%E4%BB%8E4%E6%88%98%E5%9B%9B%E7%BA%A7470%E5%88%B04%E6%88%98%E6%89%98%E7%A6%8F105%EF%BC%8C%E6%88%91%E7%9A%84%E8%A1%80%E6%B3%AA%E7%94%B3%E8%AF%B7%E4%B9%8B%E8%B7%AF/ - 2021-08-31 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/08/24/Remove-Linked-List-Elements/ + http://blog.beendless.com/2011/11/02/%E4%BB%8A%E5%86%AC%E7%AC%AC%E4%B8%80%E5%9C%BA%E9%9B%AA%EF%BC%8C%E6%88%91%E6%9C%89%E5%BA%9F%E8%AF%9D%E8%AF%B4/ - 2021-08-25 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/08/18/Spiral-Matrix/ + http://blog.beendless.com/2013/03/09/%E4%B8%BA%E4%BA%86%E7%A9%BF%E8%B6%8A%E7%9A%84%E6%97%85%E8%A1%8C/ - 2021-08-24 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/08/16/Time-Complexity-Calculation-Template/ + http://blog.beendless.com/2014/05/20/%E4%B8%BA%E4%BA%86%E6%B5%81%E6%B5%AA%E7%9A%84%E8%BF%9C%E6%96%B9/ - 2021-08-17 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/08/12/Binary-Search-Deep-Dive/ + http://blog.beendless.com/2012/09/07/%E4%B8%B4%E8%A1%8C%E5%89%8D%E7%9A%84%E6%85%B5%E6%87%92/ - 2021-08-17 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2021/07/06/Understand%20Golang's%20Function%20Type/ + http://blog.beendless.com/2011/01/26/%E4%B8%80%E8%BD%AC%E8%BA%AB%EF%BC%8C%E5%B0%B1%E6%98%AF%E4%B8%80%E8%BE%88%E5%AD%90/ - 2021-07-06 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/10/26/JavaScript-Async-Ready-Looping/ + http://blog.beendless.com/2010/06/22/%E4%B8%80%E8%B7%AF%E5%90%91%E8%A5%BF%E2%80%94%E2%80%94%E5%A4%A7%E7%BE%8E%E9%9D%92%E6%B5%B7/ - 2020-10-27 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/10/26/Understand-X-Forwarded-Proto/ + http://blog.beendless.com/2013/03/25/%E4%B8%80%E7%9C%A8%E7%9C%BC%E5%B0%B1%E5%B9%B3%E9%9D%99%E4%BA%86/ - 2020-10-27 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/10/09/Serving%20Files%20on%20S3%20through%20NodeJS/ + http://blog.beendless.com/2014/01/16/%E4%B8%80%E4%B8%AA%E4%BA%BA%E8%B7%91%E6%AD%A5/ - 2020-10-10 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/10/02/UsePureJSToAddWaterMarkForYourSite/ + http://blog.beendless.com/2013/02/03/Ym%E5%92%8CYf%E7%9A%84%E8%81%8A%E5%A4%A9%EF%BC%9A%E5%8E%86%E5%8F%B2%E6%98%AF%E4%B8%AA%E4%BB%80%E4%B9%88%E7%8E%A9%E6%84%8F%E5%84%BF/ - 2020-10-02 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/08/31/Loading%20Image%20to%20Google%20Colab%20Notebooks/ + http://blog.beendless.com/2020/10/02/UsePureJSToAddWaterMarkForYourSite/ - 2020-10-02 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/about/index.html + http://blog.beendless.com/2020/10/26/Understand-X-Forwarded-Proto/ - 2020-09-02 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2020/09/03/Computer-Vision-Tasks-Summary/ + http://blog.beendless.com/2021/07/06/Understand%20Golang's%20Function%20Type/ - 2020-09-02 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E9%BB%91%E6%9A%97%E4%B8%AD%E8%BF%8E%E6%8E%A5%E5%A4%95%E9%98%B3/ + http://blog.beendless.com/2021/09/07/Two-Pointers/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/01/28/%E9%98%B3%E5%85%89%E4%B8%8B/ + http://blog.beendless.com/2021/09/13/Tree-Traversals-DFS/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/10/15/%E9%A3%9E%E9%B8%9F/ + http://blog.beendless.com/2021/09/14/Tree-Traversals-BFS/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/08/12/%E9%82%A3%E4%BA%9B%E5%B8%B8%E8%A2%AB%E5%8B%BE%E8%B5%B7%E7%9A%84%E6%83%85%E6%84%AB/ + http://blog.beendless.com/2021/09/19/Tree-Properties/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/02/01/%E8%BF%87%E6%9C%88%E5%AD%90%C2%B7%E5%8D%96%E6%88%90%E5%B9%B4%E4%BA%BA%E7%9A%84%E8%90%8C/ + http://blog.beendless.com/2019/01/01/Tips-for-Hyperparameter-Optimization/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E9%82%A3%E5%B9%B4%E6%88%91%E4%BB%AC%E8%BF%98%E6%9C%AA%E5%88%B0%E7%9A%84%E8%8A%B1%E5%AD%A3%E9%9B%A8%E5%AD%A3%E2%80%94%E2%80%94%E4%B8%BA%E4%BA%86%E5%BF%98%E5%8D%B4%E6%88%91%E7%9A%84%E7%94%98%E8%82%83%E7%9C%81%E5%AE%9A%E8%A5%BF%E5%8E%BF%E4%B8%9C%E6%96%B9%E7%BA%A2%E4%B8%AD%E5%AD%A6/ + http://blog.beendless.com/2021/08/16/Time-Complexity-Calculation-Template/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/12/30/%E8%B7%A8%E5%B9%B42013%E2%80%932014/ + http://blog.beendless.com/2021/09/09/String-Match-with-KMP-Algorithm/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2011/06/18/%E8%B7%AF%E2%80%94%E2%80%94%E6%9C%89%E9%80%89%E6%8B%A9%EF%BC%8C%E6%98%AF%E8%BF%87%E7%A8%8B%EF%BC%8C%E5%B9%B6%E9%80%9A%E5%90%91%E7%BB%93%E6%9D%9F/ + http://blog.beendless.com/2021/10/12/Stock%20Exchange%20Problems/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E8%BD%BB%E8%BD%BB%E8%A1%8C%E8%B5%B0%E5%9C%A8%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%BE%B9%E7%BC%98%E7%BA%BF%E4%B8%8A/ + http://blog.beendless.com/2018/12/23/Started-to-go-through-convnetjs/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2015/01/05/%E8%B5%B0%E8%BF%9B%E4%BA%BA%E7%94%9F%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8D%81%E5%B9%B4/ + http://blog.beendless.com/2021/08/18/Spiral-Matrix/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2011/05/21/%E7%BB%99%E8%87%AA%E5%B7%B1%E4%B8%80%E4%B8%AA%E4%BB%A5%E5%AF%82%E5%AF%9E%E4%B8%BA%E5%90%8D%E7%9A%84%E5%98%B4%E5%B7%B4%E5%AD%90/ + http://blog.beendless.com/2019/01/01/Several-Important-Concetps-of-CNN/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E8%A7%A6%E5%BA%95%E5%8F%8D%E5%BC%B9/ + http://blog.beendless.com/2015/09/26/Set%20up%20SSL%20for%20website%20with%20Nginx%20and%20StartSSL/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/12/20/%E6%B7%B1%E5%91%BC%E5%90%B8/ + http://blog.beendless.com/2020/10/09/Serving%20Files%20on%20S3%20through%20NodeJS/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/02/26/%E7%81%AB%E4%B8%80%E5%9B%A2/ + http://blog.beendless.com/2021/11/15/Set%20up%20Kubeadm%20on%20Macbook%20with%20Vagrant/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2010/03/20/%E7%BB%93%E6%9D%9F%E4%B8%8E%E5%90%AF%E7%A8%8B/ + http://blog.beendless.com/2021/09/27/Search%20in%20Trees/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2011/12/31/%E6%9C%AF%E5%90%8E%E9%87%8D%E5%BB%BA/ + http://blog.beendless.com/2018/12/20/Scaling-NodeJS-Apps/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E6%B5%81%E6%B0%B4%E8%B4%A6%E4%B8%80%E5%B9%B4%E8%AE%B0%20%EF%BC%88%E4%BA%8C%E4%BA%8C%E6%9B%B4%E5%81%A5%E5%BA%B7%EF%BC%89/ + http://blog.beendless.com/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2015/08/13/%E6%88%91%E7%9A%84%E4%B8%80%E4%B8%AA%E5%A4%8F%E6%97%A5%E6%B8%85%E6%99%A8%EF%BC%8C%E5%86%99%E5%9C%A8%E5%A4%A9%E6%B4%A5%E5%A1%98%E6%B2%BD%E7%A0%81%E5%A4%B4%E9%9B%86%E8%A3%85%E7%AE%B1%E7%88%86%E7%82%B8%E5%90%8E/ + http://blog.beendless.com/2021/08/24/Remove-Linked-List-Elements/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/01/11/%E6%98%AF%E8%B0%81%E6%9B%BE%E6%92%A9%E6%8B%A8%E8%BF%87%E4%BD%A0%E7%9A%84%E5%BF%83%E5%BC%A6/ + http://blog.beendless.com/2021/09/12/Query-with-Stack/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/07/29/%E5%BD%93%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E5%8F%AA%E5%89%A9%E4%B8%8B%E5%96%A7%E5%9A%A3/ + http://blog.beendless.com/2021/10/19/Multi-Stage%20Golang%20Docker%20Image/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2010/04/04/%E5%BD%A2%E8%80%8C%E4%B8%8B%E7%9A%84%E6%A2%A6/ + http://blog.beendless.com/2021/09/27/Modify%20Trees/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/02/05/%E6%83%85%E4%BA%BA%E8%8A%82%E7%9A%84%E6%95%85%E4%BA%8B/ + http://blog.beendless.com/2021/10/16/Monotonic%20Stack/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E5%AF%AB%E4%BD%9C%E6%98%AF%E4%B8%80%E4%BB%B6%E9%9C%80%E8%A6%81%E5%A0%85%E6%8C%81%E7%9A%84%E4%BA%8B%E6%83%85/ + http://blog.beendless.com/2013/12/20/Merry%20Christmas%20and%20Happy%20New%20Year/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E5%AD%98%E6%B4%BB%E6%9C%9F%E4%B8%8E%E7%94%9F%E9%95%BF%E6%9C%9F/ + http://blog.beendless.com/2021/10/18/Mastering%20Go%20Notes/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2010/11/29/%E5%BD%93%E5%B9%B4%E5%86%99%E7%BB%99star%E7%9A%84%E4%BF%A1/ + http://blog.beendless.com/2021/10/26/Ma-Po%20Tofu/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/09/23/%E5%8F%AA%E7%94%9F%E6%B4%BB%EF%BC%8C%E4%B8%8D%E7%95%99%E5%AD%A6/ + http://blog.beendless.com/2020/08/31/Loading%20Image%20to%20Google%20Colab%20Notebooks/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/11/15/%E5%91%A8%E6%9C%AB%E5%A4%8D%E5%91%A8%E6%9C%AB/ + http://blog.beendless.com/2021/10/09/Knapsack%20Problem%20II/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/06/07/%E5%86%99%E9%81%97%E5%98%B1%E4%B9%8B%E5%89%8D/ + http://blog.beendless.com/2021/10/07/Knapsack%20Problem%20I/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/09/15/%E5%88%9D%E5%88%B0%E9%B2%81%E6%B1%B6/ + http://blog.beendless.com/2021/10/03/JumpGame%20%20Problems/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/03/23/%E5%8E%BB%E5%B1%8E%20vs.%20%E5%8E%BB%E6%AD%BB/ + http://blog.beendless.com/2018/12/18/JavaScript-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%88%86%E7%B1%BB%E4%B8%8E%E8%81%9A%E5%90%88%E7%AE%97%E6%B3%95/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/09/22/%E5%86%99%E4%BD%9C%EF%BC%8C%E5%86%8D%E4%B8%80%E4%B8%AA%E9%87%8D%E5%A4%B4%E5%BC%80%E5%A7%8B/ + http://blog.beendless.com/2020/10/26/JavaScript-Async-Ready-Looping/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/04/13/%E5%86%99%E7%BB%99%E9%A2%93%E5%BA%9F%E7%9A%84%E7%BE%8E%E4%B8%BD/ + http://blog.beendless.com/2021/09/13/Heap-and-Heap-Sort/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/02/15/%E4%BB%8E4%E6%88%98%E5%9B%9B%E7%BA%A7470%E5%88%B04%E6%88%98%E6%89%98%E7%A6%8F105%EF%BC%8C%E6%88%91%E7%9A%84%E8%A1%80%E6%B3%AA%E7%94%B3%E8%AF%B7%E4%B9%8B%E8%B7%AF/ + http://blog.beendless.com/2021/10/06/Greedy%20%20Problems%20III/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/05/20/%E4%B8%BA%E4%BA%86%E6%B5%81%E6%B5%AA%E7%9A%84%E8%BF%9C%E6%96%B9/ + http://blog.beendless.com/2021/10/05/Greedy%20%20Problems%20II/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2011/11/02/%E4%BB%8A%E5%86%AC%E7%AC%AC%E4%B8%80%E5%9C%BA%E9%9B%AA%EF%BC%8C%E6%88%91%E6%9C%89%E5%BA%9F%E8%AF%9D%E8%AF%B4/ + http://blog.beendless.com/2021/10/03/Greedy%20%20Problems%20I/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/03/09/%E4%B8%BA%E4%BA%86%E7%A9%BF%E8%B6%8A%E7%9A%84%E6%97%85%E8%A1%8C/ + http://blog.beendless.com/2021/10/14/Dynamic%20Programming%20IV/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2010/06/22/%E4%B8%80%E8%B7%AF%E5%90%91%E8%A5%BF%E2%80%94%E2%80%94%E5%A4%A7%E7%BE%8E%E9%9D%92%E6%B5%B7/ + http://blog.beendless.com/2021/10/13/Dynamic%20Programming%20III/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2011/01/26/%E4%B8%80%E8%BD%AC%E8%BA%AB%EF%BC%8C%E5%B0%B1%E6%98%AF%E4%B8%80%E8%BE%88%E5%AD%90/ + http://blog.beendless.com/2021/10/08/Dynamic%20Programming%20II/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2012/09/07/%E4%B8%B4%E8%A1%8C%E5%89%8D%E7%9A%84%E6%85%B5%E6%87%92/ + http://blog.beendless.com/2021/10/06/Dynamic%20Programming%20I/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/01/16/%E4%B8%80%E4%B8%AA%E4%BA%BA%E8%B7%91%E6%AD%A5/ + http://blog.beendless.com/2021/09/12/Design-a-Stack-with-Queue/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/03/25/%E4%B8%80%E7%9C%A8%E7%9C%BC%E5%B0%B1%E5%B9%B3%E9%9D%99%E4%BA%86/ + http://blog.beendless.com/2021/09/11/Design-a-Queue-with-Stack/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2019/01/01/Tips-for-Hyperparameter-Optimization/ + http://blog.beendless.com/2021/08/30/Design-A-Linked-List-Class/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/02/03/Ym%E5%92%8CYf%E7%9A%84%E8%81%8A%E5%A4%A9%EF%BC%9A%E5%8E%86%E5%8F%B2%E6%98%AF%E4%B8%AA%E4%BB%80%E4%B9%88%E7%8E%A9%E6%84%8F%E5%84%BF/ + http://blog.beendless.com/2021/09/23/Construct-and-Update-a-Tree/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2019/01/01/Several-Important-Concetps-of-CNN/ + http://blog.beendless.com/2020/09/03/Computer-Vision-Tasks-Summary/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2018/12/23/Started-to-go-through-convnetjs/ + http://blog.beendless.com/2021/09/06/Common-Items-Quick-Search-with-Array-and-HashMap/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2015/09/26/Set%20up%20SSL%20for%20website%20with%20Nginx%20and%20StartSSL/ + http://blog.beendless.com/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2018/12/20/Scaling-NodeJS-Apps/ + http://blog.beendless.com/2021/08/12/Binary-Search-Deep-Dive/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2018/12/20/Scaling-NodeJS-Apps-Archetectural-Patterns/ + http://blog.beendless.com/2021/10/01/Backtracking%20-%20Subsets/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/12/20/Merry%20Christmas%20and%20Happy%20New%20Year/ + http://blog.beendless.com/2021/10/01/Backtracking%20-%20Partitioning/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2019/01/03/Building-Asynchronized-HTTP-Services-With-Sanic/ + http://blog.beendless.com/2021/10/01/Backtracking%20-%20Combinations/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2018/12/18/JavaScript-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%88%86%E7%B1%BB%E4%B8%8E%E8%81%9A%E5%90%88%E7%AE%97%E6%B3%95/ + http://blog.beendless.com/2013/04/03/25%E5%B2%81%EF%BC%8C%E4%BD%A0%E6%9C%89%E4%BB%80%E4%B9%88%E5%8F%AF%E5%A4%B1%E5%8E%BB%E7%9A%84%EF%BC%9F/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2014/10/19/2014%E5%B9%B410%E6%9C%8819%E6%97%A5/ + http://blog.beendless.com/2021/10/01/Backtracking%20-%20Chessboard/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 - http://blog.beendless.com/2013/04/03/25%E5%B2%81%EF%BC%8C%E4%BD%A0%E6%9C%89%E4%BB%80%E4%B9%88%E5%8F%AF%E5%A4%B1%E5%8E%BB%E7%9A%84%EF%BC%9F/ + http://blog.beendless.com/2014/10/19/2014%E5%B9%B410%E6%9C%8819%E6%97%A5/ - 2020-09-01 + 2021-11-27 + monthly + 0.6 http://blog.beendless.com/ - 2021-11-15 + 2022-10-25 daily 1.0 - http://blog.beendless.com/tags/Python/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Machine-Learning/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Async/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Golang/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/HTTP/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Algorithms/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Machine-Learning/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Leetcode/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/DevOps/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Backtracking/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/NodeJS/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Subsets/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Archetecture/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Python/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Deep-Learning/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Async/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/JavaScript/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/HTTP/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/ConvnetJS/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Binary-Search/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Google-Colab/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Array/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/CNN/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/HashMap/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Deep-Learning-with-TensorFlow-2-and-Keras/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/CNN/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/AWS/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Deep-Learning-with-TensorFlow-2-and-Keras/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Functional-Programming/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Linked-List/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Golang/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Binary-Tree/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Algorithms/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Queue/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Leetcode/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Stack/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Binary-Search/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Dynamic-Programming/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Time-complexity/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Knapsack/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Array/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/DFS/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Matrix/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Two-Pointers/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Linked-List/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Greedy/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/HashMap/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Bucket-Sort/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/String/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Top-K-Frequent/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/KMP/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Heap/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Queue/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Priority-Queue/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Stack/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Functional-Programming/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Bucket-Sort/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/JavaScript/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Top-K-Frequent/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/JumpGame/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Heap/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/BFS/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Priority-Queue/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Sliding-Window/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Binary-Tree/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Google-Colab/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/BFS/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Chinese-Food/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/DFS/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Mastering-Go/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Backtracking/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Docker/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Subsets/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Kubernetes/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Greedy/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/DevOps/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/JumpGame/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/NodeJS/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Dynamic-Programming/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Archetecture/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Stock-Exchange/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Monotonic-Stack/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Two-Pointers/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/AWS/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Sliding-Window/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Deep-Learning/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Knapsack/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/ConvnetJS/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Monotonic-Stack/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Matrix/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Docker/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Stock-Exchange/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Mastering-Go/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/String/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Kubernetes/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/KMP/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/tags/Chinese-Food/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/tags/Time-complexity/ + 2022-10-25 + weekly + 0.2 http://blog.beendless.com/categories/CS/ - 2021-11-15 - daily - 0.6 + 2022-10-25 + weekly + 0.2 http://blog.beendless.com/categories/%E6%BC%B2%E6%BD%AE%EF%B9%A3%E9%80%80%E6%BD%AE/ - 2021-11-15 - daily - 0.6 + 2022-10-25 + weekly + 0.2 http://blog.beendless.com/categories/%E8%A1%8C%E8%B5%B0%E7%9A%84%E6%A8%B9%E8%8B%97/ - 2021-11-15 - daily - 0.6 + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/categories/%E7%84%A1%E7%9F%A5%EF%B9%A3%E6%97%A0%E7%9F%A5/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/categories/Recipe/ + 2022-10-25 + weekly + 0.2 - http://blog.beendless.com/categories/Recipe/ - 2021-11-15 - daily - 0.6 + http://blog.beendless.com/categories/%E7%84%A1%E7%9F%A5%EF%B9%A3%E6%97%A0%E7%9F%A5/ + 2022-10-25 + weekly + 0.2 diff --git a/docs/tags/AWS/index.html b/docs/tags/AWS/index.html index 2decdbd8b..9d0588160 100644 --- a/docs/tags/AWS/index.html +++ b/docs/tags/AWS/index.html @@ -1,10 +1,15 @@ -AWS | Beendless ~ 快节奏,慢生活,无止境 +AWS | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Algorithms/index.html b/docs/tags/Algorithms/index.html index 57f1c53d5..6ed387864 100644 --- a/docs/tags/Algorithms/index.html +++ b/docs/tags/Algorithms/index.html @@ -1,10 +1,15 @@ -Algorithms | Beendless ~ 快节奏,慢生活,无止境 +Algorithms | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Algorithms/page/2/index.html b/docs/tags/Algorithms/page/2/index.html index 1e8690561..12071b015 100644 --- a/docs/tags/Algorithms/page/2/index.html +++ b/docs/tags/Algorithms/page/2/index.html @@ -1,10 +1,15 @@ -Algorithms | Beendless ~ 快节奏,慢生活,无止境 +Algorithms | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Archetecture/index.html b/docs/tags/Archetecture/index.html index 7e09144f5..1ab34f648 100644 --- a/docs/tags/Archetecture/index.html +++ b/docs/tags/Archetecture/index.html @@ -1,10 +1,15 @@ -Archetecture | Beendless ~ 快节奏,慢生活,无止境 +Archetecture | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Array/index.html b/docs/tags/Array/index.html index c11dc59b3..2e014477b 100644 --- a/docs/tags/Array/index.html +++ b/docs/tags/Array/index.html @@ -1,10 +1,15 @@ -Array | Beendless ~ 快节奏,慢生活,无止境 +Array | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Async/index.html b/docs/tags/Async/index.html index 4410a8ac5..18666e036 100644 --- a/docs/tags/Async/index.html +++ b/docs/tags/Async/index.html @@ -1,10 +1,15 @@ -Async | Beendless ~ 快节奏,慢生活,无止境 +Async | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/BFS/index.html b/docs/tags/BFS/index.html index f922c868c..825161bb1 100644 --- a/docs/tags/BFS/index.html +++ b/docs/tags/BFS/index.html @@ -1,10 +1,15 @@ -BFS | Beendless ~ 快节奏,慢生活,无止境 +BFS | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Backtracking/index.html b/docs/tags/Backtracking/index.html index b8d19c886..e69e904a6 100644 --- a/docs/tags/Backtracking/index.html +++ b/docs/tags/Backtracking/index.html @@ -1,10 +1,15 @@ -Backtracking | Beendless ~ 快节奏,慢生活,无止境 +Backtracking | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Binary-Search/index.html b/docs/tags/Binary-Search/index.html index 310e904a8..3d8df93f0 100644 --- a/docs/tags/Binary-Search/index.html +++ b/docs/tags/Binary-Search/index.html @@ -1,10 +1,15 @@ -Binary Search | Beendless ~ 快节奏,慢生活,无止境 +Binary Search | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Binary-Tree/index.html b/docs/tags/Binary-Tree/index.html index 36c8443f7..9fa412a40 100644 --- a/docs/tags/Binary-Tree/index.html +++ b/docs/tags/Binary-Tree/index.html @@ -1,10 +1,15 @@ -Binary Tree | Beendless ~ 快节奏,慢生活,无止境 +Binary Tree | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Bucket-Sort/index.html b/docs/tags/Bucket-Sort/index.html index 0241dbd4e..212d7f95f 100644 --- a/docs/tags/Bucket-Sort/index.html +++ b/docs/tags/Bucket-Sort/index.html @@ -1,10 +1,15 @@ -Bucket Sort | Beendless ~ 快节奏,慢生活,无止境 +Bucket Sort | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/CNN/index.html b/docs/tags/CNN/index.html index 71e32a3d7..253cd9681 100644 --- a/docs/tags/CNN/index.html +++ b/docs/tags/CNN/index.html @@ -1,10 +1,15 @@ -CNN | Beendless ~ 快节奏,慢生活,无止境 +CNN | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Chinese-Food/index.html b/docs/tags/Chinese-Food/index.html index 28e8a24d0..db5f13c65 100644 --- a/docs/tags/Chinese-Food/index.html +++ b/docs/tags/Chinese-Food/index.html @@ -1,10 +1,15 @@ -Chinese Food | Beendless ~ 快节奏,慢生活,无止境 +Chinese Food | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/ConvnetJS/index.html b/docs/tags/ConvnetJS/index.html index 0fe3bd4e6..dc798b26d 100644 --- a/docs/tags/ConvnetJS/index.html +++ b/docs/tags/ConvnetJS/index.html @@ -1,10 +1,15 @@ -ConvnetJS | Beendless ~ 快节奏,慢生活,无止境 +ConvnetJS | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/DFS/index.html b/docs/tags/DFS/index.html index 346cbc2c2..583878eb6 100644 --- a/docs/tags/DFS/index.html +++ b/docs/tags/DFS/index.html @@ -1,10 +1,15 @@ -DFS | Beendless ~ 快节奏,慢生活,无止境 +DFS | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Deep-Learning-with-TensorFlow-2-and-Keras/index.html b/docs/tags/Deep-Learning-with-TensorFlow-2-and-Keras/index.html index 0f5df6115..0e834e64f 100644 --- a/docs/tags/Deep-Learning-with-TensorFlow-2-and-Keras/index.html +++ b/docs/tags/Deep-Learning-with-TensorFlow-2-and-Keras/index.html @@ -1,10 +1,15 @@ -Deep Learning with TensorFlow 2 and Keras | Beendless ~ 快节奏,慢生活,无止境 +Deep Learning with TensorFlow 2 and Keras | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Deep-Learning/index.html b/docs/tags/Deep-Learning/index.html index 1c73d4f5a..db356fde1 100644 --- a/docs/tags/Deep-Learning/index.html +++ b/docs/tags/Deep-Learning/index.html @@ -1,10 +1,15 @@ -Deep Learning | Beendless ~ 快节奏,慢生活,无止境 +Deep Learning | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/DevOps/index.html b/docs/tags/DevOps/index.html index 2d3b4af35..504647b90 100644 --- a/docs/tags/DevOps/index.html +++ b/docs/tags/DevOps/index.html @@ -1,10 +1,15 @@ -DevOps | Beendless ~ 快节奏,慢生活,无止境 +DevOps | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Docker/index.html b/docs/tags/Docker/index.html index ee11e792b..62c5fd4e8 100644 --- a/docs/tags/Docker/index.html +++ b/docs/tags/Docker/index.html @@ -1,10 +1,15 @@ -Docker | Beendless ~ 快节奏,慢生活,无止境 +Docker | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Dynamic-Programming/index.html b/docs/tags/Dynamic-Programming/index.html index 93f080e3f..d53c6fe37 100644 --- a/docs/tags/Dynamic-Programming/index.html +++ b/docs/tags/Dynamic-Programming/index.html @@ -1,10 +1,15 @@ -Dynamic Programming | Beendless ~ 快节奏,慢生活,无止境 +Dynamic Programming | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Functional-Programming/index.html b/docs/tags/Functional-Programming/index.html index 8b3a50ea0..681d51f9e 100644 --- a/docs/tags/Functional-Programming/index.html +++ b/docs/tags/Functional-Programming/index.html @@ -1,10 +1,15 @@ -Functional Programming | Beendless ~ 快节奏,慢生活,无止境 +Functional Programming | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Golang/index.html b/docs/tags/Golang/index.html index bbba051d2..8f65c8f35 100644 --- a/docs/tags/Golang/index.html +++ b/docs/tags/Golang/index.html @@ -1,10 +1,15 @@ -Golang | Beendless ~ 快节奏,慢生活,无止境 +Golang | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Golang/page/2/index.html b/docs/tags/Golang/page/2/index.html index 8c8574dc0..f54d2ce1b 100644 --- a/docs/tags/Golang/page/2/index.html +++ b/docs/tags/Golang/page/2/index.html @@ -1,10 +1,15 @@ -Golang | Beendless ~ 快节奏,慢生活,无止境 +Golang | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Google-Colab/index.html b/docs/tags/Google-Colab/index.html index bc68a8d1d..2c54de891 100644 --- a/docs/tags/Google-Colab/index.html +++ b/docs/tags/Google-Colab/index.html @@ -1,10 +1,15 @@ -Google Colab | Beendless ~ 快节奏,慢生活,无止境 +Google Colab | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Greedy/index.html b/docs/tags/Greedy/index.html index e8fd00460..bdc8e8686 100644 --- a/docs/tags/Greedy/index.html +++ b/docs/tags/Greedy/index.html @@ -1,10 +1,15 @@ -Greedy | Beendless ~ 快节奏,慢生活,无止境 +Greedy | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/HTTP/index.html b/docs/tags/HTTP/index.html index d7aaa1fef..02b3365d3 100644 --- a/docs/tags/HTTP/index.html +++ b/docs/tags/HTTP/index.html @@ -1,10 +1,15 @@ -HTTP | Beendless ~ 快节奏,慢生活,无止境 +HTTP | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/HashMap/index.html b/docs/tags/HashMap/index.html index 899b039b0..1424ad7e3 100644 --- a/docs/tags/HashMap/index.html +++ b/docs/tags/HashMap/index.html @@ -1,10 +1,15 @@ -HashMap | Beendless ~ 快节奏,慢生活,无止境 +HashMap | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Heap/index.html b/docs/tags/Heap/index.html index ff27c8825..dd2fbd598 100644 --- a/docs/tags/Heap/index.html +++ b/docs/tags/Heap/index.html @@ -1,10 +1,15 @@ -Heap | Beendless ~ 快节奏,慢生活,无止境 +Heap | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/JavaScript/index.html b/docs/tags/JavaScript/index.html index 63f4f940d..1d3c3dabc 100644 --- a/docs/tags/JavaScript/index.html +++ b/docs/tags/JavaScript/index.html @@ -1,10 +1,15 @@ -JavaScript | Beendless ~ 快节奏,慢生活,无止境 +JavaScript | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/JumpGame/index.html b/docs/tags/JumpGame/index.html index 233c826b0..f0465aec4 100644 --- a/docs/tags/JumpGame/index.html +++ b/docs/tags/JumpGame/index.html @@ -1,10 +1,15 @@ -JumpGame | Beendless ~ 快节奏,慢生活,无止境 +JumpGame | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/KMP/index.html b/docs/tags/KMP/index.html index f5c98a8fb..500f81f1e 100644 --- a/docs/tags/KMP/index.html +++ b/docs/tags/KMP/index.html @@ -1,10 +1,15 @@ -KMP | Beendless ~ 快节奏,慢生活,无止境 +KMP | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Knapsack/index.html b/docs/tags/Knapsack/index.html index 8e3322d24..e49a4f4d0 100644 --- a/docs/tags/Knapsack/index.html +++ b/docs/tags/Knapsack/index.html @@ -1,10 +1,15 @@ -Knapsack | Beendless ~ 快节奏,慢生活,无止境 +Knapsack | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Kubernetes/index.html b/docs/tags/Kubernetes/index.html index cb9d1b20d..fffeb959e 100644 --- a/docs/tags/Kubernetes/index.html +++ b/docs/tags/Kubernetes/index.html @@ -1,10 +1,15 @@ -Kubernetes | Beendless ~ 快节奏,慢生活,无止境 +Kubernetes | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Leetcode/index.html b/docs/tags/Leetcode/index.html index 84213fa78..677ec494f 100644 --- a/docs/tags/Leetcode/index.html +++ b/docs/tags/Leetcode/index.html @@ -1,10 +1,15 @@ -Leetcode | Beendless ~ 快节奏,慢生活,无止境 +Leetcode | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Leetcode/page/2/index.html b/docs/tags/Leetcode/page/2/index.html index 8bfb58baa..9cead923d 100644 --- a/docs/tags/Leetcode/page/2/index.html +++ b/docs/tags/Leetcode/page/2/index.html @@ -1,10 +1,15 @@ -Leetcode | Beendless ~ 快节奏,慢生活,无止境 +Leetcode | Beendless ~ 快节奏,慢生活,无止境 -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/tags/Linked-List/index.html b/docs/tags/Linked-List/index.html index 08081a6fc..a25bdb7ec 100644 --- a/docs/tags/Linked-List/index.html +++ b/docs/tags/Linked-List/index.html @@ -1,10 +1,15 @@ -Linked List | Beendless ~ 快节奏,慢生活,无止境 +Linked List | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Machine-Learning/index.html b/docs/tags/Machine-Learning/index.html index 994cc8294..baeebf1bd 100644 --- a/docs/tags/Machine-Learning/index.html +++ b/docs/tags/Machine-Learning/index.html @@ -1,10 +1,15 @@ -Machine Learning | Beendless ~ 快节奏,慢生活,无止境 +Machine Learning | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Mastering-Go/index.html b/docs/tags/Mastering-Go/index.html index 35b14b512..6c896142a 100644 --- a/docs/tags/Mastering-Go/index.html +++ b/docs/tags/Mastering-Go/index.html @@ -1,10 +1,15 @@ -Mastering Go | Beendless ~ 快节奏,慢生活,无止境 +Mastering Go | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Matrix/index.html b/docs/tags/Matrix/index.html index ec1e6d72d..872005fe5 100644 --- a/docs/tags/Matrix/index.html +++ b/docs/tags/Matrix/index.html @@ -1,10 +1,15 @@ -Matrix | Beendless ~ 快节奏,慢生活,无止境 +Matrix | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Monotonic-Stack/index.html b/docs/tags/Monotonic-Stack/index.html index ac6db92f4..6cb0c28dd 100644 --- a/docs/tags/Monotonic-Stack/index.html +++ b/docs/tags/Monotonic-Stack/index.html @@ -1,10 +1,15 @@ -Monotonic Stack | Beendless ~ 快节奏,慢生活,无止境 +Monotonic Stack | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/NodeJS/index.html b/docs/tags/NodeJS/index.html index 4733ba3a1..a7fbb200b 100644 --- a/docs/tags/NodeJS/index.html +++ b/docs/tags/NodeJS/index.html @@ -1,10 +1,15 @@ -NodeJS | Beendless ~ 快节奏,慢生活,无止境 +NodeJS | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Priority-Queue/index.html b/docs/tags/Priority-Queue/index.html index 98d369080..a4ff11c02 100644 --- a/docs/tags/Priority-Queue/index.html +++ b/docs/tags/Priority-Queue/index.html @@ -1,10 +1,15 @@ -Priority Queue | Beendless ~ 快节奏,慢生活,无止境 +Priority Queue | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Python/index.html b/docs/tags/Python/index.html index ecac05e5d..78fe50e75 100644 --- a/docs/tags/Python/index.html +++ b/docs/tags/Python/index.html @@ -1,10 +1,15 @@ -Python | Beendless ~ 快节奏,慢生活,无止境 +Python | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Queue/index.html b/docs/tags/Queue/index.html index fdd391aa6..92be903df 100644 --- a/docs/tags/Queue/index.html +++ b/docs/tags/Queue/index.html @@ -1,10 +1,15 @@ -Queue | Beendless ~ 快节奏,慢生活,无止境 +Queue | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Sliding-Window/index.html b/docs/tags/Sliding-Window/index.html index 7ec01c121..bb85574c3 100644 --- a/docs/tags/Sliding-Window/index.html +++ b/docs/tags/Sliding-Window/index.html @@ -1,10 +1,15 @@ -Sliding Window | Beendless ~ 快节奏,慢生活,无止境 +Sliding Window | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Stack/index.html b/docs/tags/Stack/index.html index 6bc4dd61d..cdbe4fc42 100644 --- a/docs/tags/Stack/index.html +++ b/docs/tags/Stack/index.html @@ -1,10 +1,15 @@ -Stack | Beendless ~ 快节奏,慢生活,无止境 +Stack | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Stock-Exchange/index.html b/docs/tags/Stock-Exchange/index.html index a1357872f..520bce41a 100644 --- a/docs/tags/Stock-Exchange/index.html +++ b/docs/tags/Stock-Exchange/index.html @@ -1,10 +1,15 @@ -Stock Exchange | Beendless ~ 快节奏,慢生活,无止境 +Stock Exchange | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/String/index.html b/docs/tags/String/index.html index de9e92a7b..e078f9d70 100644 --- a/docs/tags/String/index.html +++ b/docs/tags/String/index.html @@ -1,10 +1,15 @@ -String | Beendless ~ 快节奏,慢生活,无止境 +String | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Subsets/index.html b/docs/tags/Subsets/index.html index 239a3187a..0edf85a17 100644 --- a/docs/tags/Subsets/index.html +++ b/docs/tags/Subsets/index.html @@ -1,10 +1,15 @@ -Subsets | Beendless ~ 快节奏,慢生活,无止境 +Subsets | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Time-complexity/index.html b/docs/tags/Time-complexity/index.html index 63a5c9f9d..88c5f7936 100644 --- a/docs/tags/Time-complexity/index.html +++ b/docs/tags/Time-complexity/index.html @@ -1,10 +1,15 @@ -Time complexity | Beendless ~ 快节奏,慢生活,无止境 +Time complexity | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Top-K-Frequent/index.html b/docs/tags/Top-K-Frequent/index.html index 0f262d8ea..93c964645 100644 --- a/docs/tags/Top-K-Frequent/index.html +++ b/docs/tags/Top-K-Frequent/index.html @@ -1,10 +1,15 @@ -Top K Frequent | Beendless ~ 快节奏,慢生活,无止境 +Top K Frequent | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/docs/tags/Two-Pointers/index.html b/docs/tags/Two-Pointers/index.html index d685fcd07..cb42f2ccb 100644 --- a/docs/tags/Two-Pointers/index.html +++ b/docs/tags/Two-Pointers/index.html @@ -1,10 +1,15 @@ -Two Pointers | Beendless ~ 快节奏,慢生活,无止境 +Two Pointers | Beendless ~ 快节奏,慢生活,无止境 - \ No newline at end of file + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 135cc2df8..b4c2bc553 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,76 +4,91 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/babel-types": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.8.tgz", - "integrity": "sha512-jvu8g4LR7+p6ao30RhTREnEhHxmP4/R9D9/rOR/Kq14FztORty9SKgtOZUNZNMB9CXLxZ54EWu4dArUE8WdTsw==" + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "requires": { - "@types/babel-types": "*" - } + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "@babel/parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", + "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==" }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@babel/types": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" }, "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" } }, "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -81,39 +96,28 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -127,15 +131,44 @@ "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "argparse": { @@ -149,35 +182,45 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "async-foreach": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "atob": { "version": "2.1.2", @@ -187,42 +230,25 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "@babel/types": "^7.9.6" } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "basic-auth": { "version": "2.0.1", @@ -230,25 +256,32 @@ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "requires": { "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "requires": { "tweetnacl": "^0.14.3" } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", "requires": { "inherits": "~2.0.0" } @@ -278,26 +311,30 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -306,28 +343,19 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" } } }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -336,55 +364,30 @@ "character-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", "requires": { "is-regex": "^1.0.3" } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "readdirp": "~3.6.0" } }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" }, "color-convert": { "version": "2.0.1", @@ -450,14 +453,19 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect": { "version": "3.7.0", @@ -481,35 +489,28 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" } }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cross-spawn": { "version": "7.0.3", @@ -522,28 +523,35 @@ } }, "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "requires": { - "inherits": "^2.0.3", + "inherits": "^2.0.4", "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "source-map-resolve": "^0.6.0" + } + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" } } }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" - }, "cuid": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", @@ -552,7 +560,7 @@ "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "requires": { "array-find-index": "^1.0.1" } @@ -560,28 +568,48 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==" }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "deepmerge": { "version": "4.2.2", @@ -591,12 +619,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "depd": { "version": "2.0.0", @@ -604,52 +632,72 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" }, "dom-serializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", - "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "requires": { "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", + "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } } }, "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "requires": { + "webidl-conversions": "^7.0.0" + } }, "domhandler": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz", - "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { - "domelementtype": "^2.0.1" + "domelementtype": "^2.2.0" } }, + "dompurify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==" + }, "domutils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", - "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0" + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -658,12 +706,15 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } }, "emoji-regex": { "version": "7.0.3", @@ -673,12 +724,12 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" }, "error-ex": { "version": "1.3.2", @@ -691,18 +742,35 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -711,7 +779,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "extend": { "version": "3.0.2", @@ -721,7 +789,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { "version": "3.1.3", @@ -733,6 +801,37 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -766,14 +865,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -782,32 +881,32 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "fstream": { @@ -821,10 +920,15 @@ "rimraf": "2" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -839,12 +943,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } @@ -864,30 +968,50 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.2", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { @@ -899,19 +1023,19 @@ } }, "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", "requires": { "glob": "~7.1.1", - "lodash": "~4.17.10", + "lodash": "^4.17.21", "minimatch": "~3.0.2" }, "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -924,14 +1048,14 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", @@ -942,10 +1066,18 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "requires": { "ansi-regex": "^2.0.0" }, @@ -953,7 +1085,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" } } }, @@ -963,19 +1095,27 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "hexo": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/hexo/-/hexo-5.1.1.tgz", - "integrity": "sha512-D+kf3NJ0WTBwyrEZdcgjsVVsSG4/cnKmixbsnCr1dPwI6d7BBJtFprv7usU7u3sV59+LrOYtPuJKsHaaINffvA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/hexo/-/hexo-5.4.2.tgz", + "integrity": "sha512-Af6mxKwx9byalaffKgiQ8/bZfbXPo2SGEn2Q9hFh++15g15/IulvOhu8lQkJdyZNzmj3hOuSrJdqoUvIr3K/qw==", "requires": { "abbrev": "^1.1.1", "archy": "^1.0.0", @@ -987,7 +1127,7 @@ "hexo-i18n": "^1.0.0", "hexo-log": "^2.0.0", "hexo-util": "^2.4.0", - "js-yaml": "^3.12.0", + "js-yaml": "^3.14.1", "micromatch": "^4.0.2", "moment": "^2.22.2", "moment-timezone": "^0.5.21", @@ -1002,9 +1142,9 @@ }, "dependencies": { "hexo-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hexo-cli/-/hexo-cli-4.2.0.tgz", - "integrity": "sha512-NJQYKnD41KUlNZzEyi8wDzPeGhrjwLLTa05dtkwq+lJch+j9idZTh4dgn3w/82o6Q/zygn+ibO1XvihMfFdSfw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hexo-cli/-/hexo-cli-4.3.0.tgz", + "integrity": "sha512-lr46h1tK1RNQJAQZbzKYAWGsmqF5DLrW6xKEakqv/o9JqgdeempBjIm7HqjcZEUBpWij4EO65X6YJiDmT9LR7g==", "requires": { "abbrev": "^1.1.1", "bluebird": "^3.5.5", @@ -1023,7 +1163,7 @@ "hexo-filter-sup": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hexo-filter-sup/-/hexo-filter-sup-1.0.1.tgz", - "integrity": "sha1-NrQMm5ualTPbPf4d429/7b3hYfM=", + "integrity": "sha512-Zi5Nt71pK+WrLEUNxDP96SczgQwjnNzDQzPuwefqEUSWNk1reM1yyWKCNT8Fi+QK3ZHWCSSYr7xaqde/QA4NjA==", "requires": { "object-assign": "^4.1.0" } @@ -1082,9 +1222,9 @@ } }, "hexo-generator-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hexo-generator-sitemap/-/hexo-generator-sitemap-2.1.0.tgz", - "integrity": "sha512-3+gF9lFdTJ67A65Z2f517DGmtloDX7ZwMmJUJxvv2tF+a8Hr6Kg9K/DXqOBpM39A/y9eqoGfQ3bmLlBx9rynTg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hexo-generator-sitemap/-/hexo-generator-sitemap-2.2.0.tgz", + "integrity": "sha512-WoS/GpdrazoiFuhZXS3Qnb22L0uaiKHHWefcsoE7JLjh8WsksFom4v2FoNhr1RIYwFV7SudQFs91P5xcW+Gfow==", "requires": { "hexo-util": "^2.1.0", "micromatch": "^4.0.2", @@ -1131,28 +1271,30 @@ "integrity": "sha512-miEVFgxchPr2qNWxw0JWpJ9R/Yaf7HjHBZVjvCCcqfbsLyYtCvIfJDxcEwz1sDOC/fLzYPqNnhUI73uNxBHRSA==" }, "hexo-renderer-ejs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexo-renderer-ejs/-/hexo-renderer-ejs-1.0.0.tgz", - "integrity": "sha512-O925i69FG4NYO62oWORcPhRZZX0sPx1SXGKUS5DaR/lzajyiXH5i2sqnkj0ya0rNLXIy/D7Xmt7WbFyuQx/kKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz", + "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==", "requires": { - "ejs": "^2.6.1" + "ejs": "^3.1.6" } }, "hexo-renderer-marked": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hexo-renderer-marked/-/hexo-renderer-marked-4.0.0.tgz", - "integrity": "sha512-Rc9tPqCEX+UjKhAHF2AmH4FcIqVSW7FTKH6kAhMWAn/WMxrCD3Al+99zKnnbgaLJ6TOCb1ckvB4BRkwk62ITxQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-marked/-/hexo-renderer-marked-6.0.0.tgz", + "integrity": "sha512-/B/ud8q9pNldbipuv6cPyqL+fir973+blV79n6j59M3S8LRz/4hLXwd0TA4RHxcHVrgPakeWUtiH3UWo6B6Pag==", "requires": { - "hexo-util": "^2.1.0", - "marked": "^2.0.0" + "dompurify": "^2.4.0", + "hexo-util": "^2.7.0", + "jsdom": "^20.0.1", + "marked": "^4.1.1" } }, "hexo-renderer-pug": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexo-renderer-pug/-/hexo-renderer-pug-1.0.0.tgz", - "integrity": "sha512-lzTSZvPxInGsYJGpv8Z9TQ0n1ZWI6fuSbtyvRmX5tloWPQNNdBhlDIlOsSc2KYQ28QOGuti8GkJ0wPBqLeKf8A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-pug/-/hexo-renderer-pug-3.0.0.tgz", + "integrity": "sha512-PmbLx6VkNv+mPLOe97OC4F8iTzTuj665dSYN7bZKArd4M/q7gb2tNs29VGuAOC50i9tvWY2f+tPQimf0GZ9Hyw==", "requires": { - "pug": "^2.0.1" + "pug": "^3.0.2" } }, "hexo-renderer-sass": { @@ -1164,12 +1306,12 @@ } }, "hexo-renderer-stylus": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-2.0.0.tgz", - "integrity": "sha512-pn411nLqlmd9oq2oEPZ7AfYrCUmAVUxJ/QnE0fpoTFbLARVHOkJaKr6GlcWmKs2jdYIu8xa7yB7cEFo406k8DA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-2.1.0.tgz", + "integrity": "sha512-Nef4YCr7JX8jaRaByhzXMSsWnDed+RgJj6aU/ARnYu3Bn5xz/qRz52VJG7KqD0Xuysxa9TIBdVUgNzBrSFn3DQ==", "requires": { - "nib": "^1.1.2", - "stylus": "^0.54.8" + "nib": "^1.2.0", + "stylus": "^0.57.0" } }, "hexo-server": { @@ -1188,71 +1330,105 @@ } }, "hexo-util": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.4.0.tgz", - "integrity": "sha512-IPQvAyn0cznYMU2gskMiZ6LZEvN7wHNusrJoYxrir4f7S7POpZeDTBswiko9R1qqd+/hu07wUYZdm4ceTTCEaA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.7.0.tgz", + "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==", "requires": { "bluebird": "^3.5.2", "camel-case": "^4.0.0", "cross-spawn": "^7.0.0", "deepmerge": "^4.2.2", - "highlight.js": "^10.0.0", - "htmlparser2": "^4.0.0", + "highlight.js": "^11.0.1", + "htmlparser2": "^7.0.0", "prismjs": "^1.17.1", - "strip-indent": "^3.0.0", - "striptags": "^3.1.1" + "strip-indent": "^3.0.0" } }, "highlight.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz", - "integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg==" + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.6.0.tgz", + "integrity": "sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==" }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, "htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", "requires": { "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" } }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "in-publish": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", @@ -1261,7 +1437,7 @@ "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "requires": { "repeating": "^2.0.0" } @@ -1269,7 +1445,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1283,7 +1459,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-binary-path": { "version": "2.1.0", @@ -1293,36 +1469,39 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" + "acorn": "^7.1.1", + "object-assign": "^4.1.1" }, "dependencies": { "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" } } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-finite": { "version": "1.1.0", @@ -1332,15 +1511,15 @@ "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "requires": { "number-is-nan": "^1.0.0" } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -1351,9 +1530,14 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "is-promise": { "version": "2.2.2", @@ -1361,22 +1545,23 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "is-wsl": { "version": "2.2.0", @@ -1389,17 +1574,28 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } }, "js-base64": { "version": "2.6.4", @@ -1409,12 +1605,12 @@ "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1423,12 +1619,45 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==", + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.0", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.9.0", + "xml-name-validator": "^4.0.0" + } }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -1438,28 +1667,28 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", "requires": { "is-promise": "^2.0.0", "promise": "^7.0.1" @@ -1480,23 +1709,19 @@ } } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "requires": { - "is-buffer": "^1.1.5" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -1517,7 +1742,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, @@ -1526,26 +1751,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" } }, "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { - "tslib": "^1.10.0" + "tslib": "^2.0.3" } }, "lru-cache": { @@ -1560,22 +1780,22 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" }, "marked": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", - "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==" }, "mathjax": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.0.tgz", - "integrity": "sha512-PL+rdYRK4Wxif+SQ94zP/L0sv6/oW/1WdQiIx0Jvn9FZaU5W9E6nlIv8liYAXBNPL2Fw/i+o/mZ1212eSzn0Cw==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.2.tgz", + "integrity": "sha512-Bt+SSVU8eBG27zChVewOicYs7Xsdt40qm4+UpHyX7k0/O9NliPc+x77k1/FEsPsjKPZGJvtRZM1vO+geW0OhGw==" }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -1590,30 +1810,30 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "min-indent": { @@ -1622,35 +1842,35 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.31", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", - "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", "requires": { "moment": ">= 2.9.0" } @@ -1678,7 +1898,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -1688,45 +1908,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nib": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz", - "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=", - "requires": { - "stylus": "0.54.5" - }, - "dependencies": { - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", - "requires": { - "css-parse": "1.7.x", - "debug": "*", - "glob": "7.0.x", - "mkdirp": "0.5.x", - "sax": "0.5.x", - "source-map": "0.1.x" - } - } - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nib/-/nib-1.2.0.tgz", + "integrity": "sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==" }, "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node-gyp": { @@ -1751,7 +1953,7 @@ "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==" }, "which": { "version": "1.3.1", @@ -1790,17 +1992,17 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -1812,7 +2014,7 @@ "cross-spawn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==", "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -1821,7 +2023,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } @@ -1829,7 +2031,7 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" }, "which": { "version": "1.3.1", @@ -1844,7 +2046,7 @@ "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "requires": { "abbrev": "1" } @@ -1858,13 +2060,6 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "normalize-path": { @@ -1886,19 +2081,23 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" }, "nunjucks": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz", - "integrity": "sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", - "chokidar": "^3.3.0", "commander": "^5.1.0" } }, + "nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1907,12 +2106,12 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "requires": { "ee-first": "1.1.1" } @@ -1925,29 +2124,42 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "open": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.1.tgz", - "integrity": "sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "osenv": { "version": "0.1.5", @@ -1982,29 +2194,44 @@ "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "requires": { "error-ex": "^1.2.0" } }, + "parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "requires": { + "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "requires": { "pinkie-promise": "^2.0.0" } @@ -2012,7 +2239,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -2027,7 +2254,7 @@ "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -2037,40 +2264,50 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "requires": { "pinkie": "^2.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" }, "prismjs": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", - "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "process-nextick-args": { "version": "2.0.1", @@ -2088,126 +2325,124 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" } }, "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "pug-code-gen": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", - "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", "requires": { - "constantinople": "^3.1.2", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" }, "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" } }, "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" } }, "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" }, "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "requires": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "punycode": { "version": "2.1.1", @@ -2215,9 +2450,14 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "range-parser": { "version": "1.2.1", @@ -2227,7 +2467,7 @@ "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -2237,30 +2477,26 @@ "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } @@ -2268,7 +2504,7 @@ "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -2277,27 +2513,17 @@ "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "requires": { "get-stdin": "^4.0.1" } } } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "requires": { "is-finite": "^1.0.0" } @@ -2327,43 +2553,58 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "rimraf": { "version": "2.7.1", @@ -2371,27 +2612,12 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -2410,9 +2636,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" }, "cliui": { "version": "5.0.0", @@ -2435,7 +2661,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" }, "string-width": { "version": "3.1.0", @@ -2475,14 +2701,22 @@ } }, "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "requires": { + "xmlchars": "^2.2.0" + } }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==", "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" @@ -2491,7 +2725,7 @@ "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", "requires": { "amdefine": ">=0.0.4" } @@ -2499,28 +2733,28 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -2534,47 +2768,55 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -2590,35 +2832,24 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "decode-uri-component": "^0.2.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -2643,19 +2874,19 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -2671,7 +2902,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" }, "stdout-stream": { "version": "1.4.1", @@ -2679,12 +2910,41 @@ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "requires": { "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2694,12 +2954,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } @@ -2707,25 +2967,25 @@ } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "requires": { "is-utf8": "^0.2.0" } @@ -2738,74 +2998,23 @@ "min-indent": "^1.0.0" } }, - "striptags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", - "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" - }, "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", + "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", + "css": "^3.0.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "requires": { - "css": "^2.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" } } }, @@ -2817,6 +3026,16 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "tar": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", @@ -2830,12 +3049,15 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } }, "tildify": { "version": "2.0.0", @@ -2845,7 +3067,7 @@ "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" }, "titlecase": { "version": "1.1.3", @@ -2853,9 +3075,9 @@ "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==" }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "version": "5.0.1", @@ -2866,28 +3088,38 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "requires": { - "psl": "^1.1.28", "punycode": "^2.1.1" } }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==" }, "true-case-path": { "version": "1.0.3", @@ -2895,32 +3127,17 @@ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "requires": { "glob": "^7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -2928,58 +3145,52 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "prelude-ls": "~1.1.2" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "3.4.0", @@ -2998,34 +3209,88 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + } } }, "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "requires": { + "xml-name-validator": "^4.0.0" + } }, "warehouse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/warehouse/-/warehouse-4.0.0.tgz", - "integrity": "sha512-9i6/JiHzjnyene5Pvvl2D2Pd18no129YGy0C0P7x18iTz/SeO9nOBioR64XoCy5xKwBKQtl3MU361qpr0V9uXw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/warehouse/-/warehouse-4.0.2.tgz", + "integrity": "sha512-GixS7SolBGu81rnxYM6bScxdElLM97Jx/kr0a6B6PGBWFqvHeuWFj7QbgEX1YWZSxiJt/aR6dBVQKC/PvvihdQ==", "requires": { - "JSONStream": "^1.0.7", "bluebird": "^3.2.2", "cuid": "^2.1.4", "graceful-fs": "^4.1.3", - "is-plain-object": "^3.0.0", - "rfdc": "^1.1.4" + "hexo-log": "^3.0.0", + "is-plain-object": "^5.0.0", + "jsonparse": "^1.3.1", + "rfdc": "^1.1.4", + "through2": "^4.0.2" + }, + "dependencies": { + "hexo-log": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/hexo-log/-/hexo-log-3.2.0.tgz", + "integrity": "sha512-fk7jOW3hvKiAv4Q/d8UxaQlARwcv+5KjGcnxexUrqBqyWbMCLmw7jhMHTSRLNNQpaoTlF5ff+kQkPi4yhp9iag==", + "requires": { + "picocolors": "^1.0.0" + } + } + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } }, "which": { @@ -3039,34 +3304,31 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" } }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wrap-ansi": { "version": "5.1.0", @@ -3079,9 +3341,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" }, "ansi-styles": { "version": "3.2.1", @@ -3102,12 +3364,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" }, "string-width": { "version": "3.1.0", @@ -3132,28 +3394,32 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==" + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "yargs-parser": { "version": "13.1.2", diff --git a/package.json b/package.json index f09169df2..8415a6c30 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "push": "npm run build && git add . && git commit -m 'Update' && git push origin master" }, "hexo": { - "version": "5.1.1" + "version": "5.4.2" }, "dependencies": { "hexo": "^5.0.0", @@ -22,9 +22,9 @@ "hexo-generator-sitemap": "^2.1.0", "hexo-generator-tag": "^1.0.0", "hexo-math": "^4.0.0", - "hexo-renderer-ejs": "^1.0.0", - "hexo-renderer-marked": "^4.0.0", - "hexo-renderer-pug": "^1.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-marked": "^6.0.0", + "hexo-renderer-pug": "^3.0.0", "hexo-renderer-sass": "^0.4.0", "hexo-renderer-stylus": "^2.0.0", "hexo-server": "^2.0.0" diff --git a/source/_drafts/Backtracking-Permutation.md b/source/_drafts/Backtracking-Permutation.md new file mode 100644 index 000000000..d9f0cc27b --- /dev/null +++ b/source/_drafts/Backtracking-Permutation.md @@ -0,0 +1,2 @@ +1. Recursive +2. Swap inplace diff --git a/source/_drafts/Sliding-window-reverse-linked-list.md b/source/_drafts/Sliding-window-reverse-linked-list.md new file mode 100644 index 000000000..a56fefc17 --- /dev/null +++ b/source/_drafts/Sliding-window-reverse-linked-list.md @@ -0,0 +1,3 @@ +1. Reverse elements value +2. Reverse next pointers value with 3 pointers +3. Recursive solution diff --git a/source/_drafts/Stack-infix-to-postfix-with-assiciativity-and-parenthesis.md b/source/_drafts/Stack-infix-to-postfix-with-assiciativity-and-parenthesis.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/_drafts/Use-linked-list-to-create-a-stack.md b/source/_drafts/Use-linked-list-to-create-a-stack.md new file mode 100644 index 000000000..00a2ecf6a --- /dev/null +++ b/source/_drafts/Use-linked-list-to-create-a-stack.md @@ -0,0 +1 @@ +Always insert element to the head of the linked list diff --git a/themes/maupassant/_config.yml b/themes/maupassant/_config.yml index 07a1b8f14..a0803afd2 100644 --- a/themes/maupassant/_config.yml +++ b/themes/maupassant/_config.yml @@ -24,8 +24,8 @@ valine: ## https://valine.js.org # See: https://github.com/MiniValine/MiniValine minivaline: enable: false - appId: # Your leancloud application appid - appKey: # Your leancloud application appkey + appId: # Your leancloud application appid + appKey: # Your leancloud application appkey placeholder: Write a Comment # Comment box placeholder adminEmailMd5: # The MD5 of Admin Email to show Admin Flag. math: true # Support MathJax. @@ -69,8 +69,8 @@ post_copyright: copyright_text: ## Your copyright text, e.g. The author owns the copyright, please indicate the source reproduced. love: false ## If you want the love to appear when you click anywhere, set the value to true. plantuml: ## Using PlantUML to generate UML diagram, must install hexo-filter-plantuml (https://github.com/miao1007/hexo-filter-plantuml). - render: "PlantUMLServer" ## Local or PlantUMLServer. - outputFormat: "svg" ## Common options: svg/png + render: "PlantUMLServer" ## Local or PlantUMLServer. + outputFormat: "svg" ## Common options: svg/png copycode: true ## If you want to enable one-click copy of the code blocks, set the value to true. dark: false ## If you want to use the dark mode theme, set the value to true. Note: This feature is not complete, please open an issue if you have any problem. diff --git a/themes/maupassant/layout/_partial/head.pug b/themes/maupassant/layout/_partial/head.pug index 7e37b87e9..04c9a8947 100644 --- a/themes/maupassant/layout/_partial/head.pug +++ b/themes/maupassant/layout/_partial/head.pug @@ -21,13 +21,21 @@ head if config.feed link(rel='alternate', type=feed_type, href=url_for(config.feed.path)) if theme.google_analytics + script(type='text/javascript',src='https://www.googletagmanager.com/gtag/js?id=UA-38171545-1') script. - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - ga('create','#{theme.google_analytics}','auto');ga('send','pageview'); - + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'UA-38171545-1'); + script. + (function(h,o,t,j,a,r){ + h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; + h._hjSettings={hjid:3218463,hjsv:6}; + a=o.getElementsByTagName('head')[0]; + r=o.createElement('script');r.async=1; + r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; + a.appendChild(r); + })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); if theme.baidu_analytics script. var _hmt = _hmt || []; diff --git a/yarn.lock b/yarn.lock index 70f5084ef..5b36aa294 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,337 +2,289 @@ # yarn lockfile v1 -"@types/babel-types@*", "@types/babel-types@^7.0.0": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41" - integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" -"@types/babylon@^6.16.2": - version "6.16.5" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" - integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== +"@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + +"@babel/parser@^7.6.0", "@babel/parser@^7.9.6": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + +"@babel/types@^7.6.1", "@babel/types@^7.9.6": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" dependencies: - "@types/babel-types" "*" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" "@types/color-name@^1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" JSONStream@^1.0.7: version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" a-sync-waterfall@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" - integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== + resolved "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz" + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" abbrev@1, abbrev@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" accepts@~1.3.5: version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" dependencies: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" dependencies: - acorn "^4.0.4" + acorn "^8.1.0" + acorn-walk "^8.0.2" -acorn@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" -acorn@^4.0.4, acorn@~4.0.2: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + +acorn@^8.1.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + dependencies: + debug "4" ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + version "6.12.4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz" dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" ansi-regex@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" ansi-regex@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" ansi-styles@^3.2.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz" dependencies: "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@~3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" aproba@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" archy@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" are-we-there-yet@~1.1.2: version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz" dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" dependencies: sprintf-js "~1.0.2" array-find-index@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" asap@^2.0.3, asap@~2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" asn1@~0.2.3: version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" dependencies: safer-buffer "~2.1.0" +assert-never@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" async-foreach@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz" + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.10.1" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz" -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + "@babel/types" "^7.9.6" balanced-match@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" basic-auth@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" dependencies: safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" dependencies: tweetnacl "^0.14.3" binary-extensions@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz" block-stream@*: version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + resolved "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" dependencies: inherits "~2.0.0" bluebird@^3.2.2, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.5: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" dependencies: fill-range "^7.0.1" bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" camel-case@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" - integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz" dependencies: pascal-case "^3.1.1" tslib "^1.10.0" camelcase-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" dependencies: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - camelcase@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" camelcase@^5.0.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" chalk@^1.1.1: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -342,23 +294,27 @@ chalk@^1.1.1: chalk@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -character-parser@^2.1.1: +character-parser@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= dependencies: is-regex "^1.0.3" chokidar@^3.0.0, chokidar@^3.3.0: version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz" dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -370,26 +326,9 @@ chokidar@^3.0.0, chokidar@^3.3.0: optionalDependencies: fsevents "~2.1.2" -clean-css@^4.1.11: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" dependencies: string-width "^3.1.0" strip-ansi "^5.2.0" @@ -397,66 +336,55 @@ cliui@^5.0.0: code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" commander@^2.19.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" commander@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" dependencies: accepts "~1.3.5" bytes "3.0.0" @@ -468,13 +396,11 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" connect@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" dependencies: debug "2.6.9" finalhandler "1.1.2" @@ -483,41 +409,29 @@ connect@^3.7.0: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" -constantinople@^3.0.1, constantinople@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" - integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" dependencies: - "@types/babel-types" "^7.0.0" - "@types/babylon" "^6.16.2" - babel-types "^6.26.0" - babylon "^6.18.0" - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.1" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" cross-spawn@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz" dependencies: lru-cache "^4.0.1" which "^1.2.9" cross-spawn@^7.0.0: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -525,115 +439,132 @@ cross-spawn@^7.0.0: css-parse@1.7.x: version "1.7.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" - integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs= + resolved "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz" css-parse@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + resolved "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz" dependencies: css "^2.0.0" css@^2.0.0: version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz" dependencies: inherits "^2.0.3" source-map "^0.6.1" source-map-resolve "^0.5.2" urix "^0.1.0" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + dependencies: + cssom "~0.3.6" + cuid@^2.1.4: version "2.1.8" - resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" - integrity sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg== + resolved "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz" currently-unhandled@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" dependencies: array-find-index "^1.0.1" dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" dependencies: assert-plus "^1.0.0" +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + debug@*: version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" dependencies: ms "^2.1.1" debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" dependencies: ms "2.0.0" +debug@4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + dependencies: + ms "2.1.2" + debug@~3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" decode-uri-component@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" depd@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" doctypes@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= + resolved "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" dom-serializer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.0.1.tgz#79695eb49af3cd8abc8d93a73da382deb1ca0795" - integrity sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw== + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz" dependencies: domelementtype "^2.0.1" domhandler "^3.0.0" @@ -641,41 +572,45 @@ dom-serializer@^1.0.1: domelementtype@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz" domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + dependencies: + webidl-conversions "^7.0.0" domhandler@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" - integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== + resolved "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz" dependencies: domelementtype "^2.0.1" -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" - integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== +domhandler@^4.2.0, domhandler@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" dependencies: domelementtype "^2.2.0" +dompurify@^2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" + domutils@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.2.0.tgz#f3ce1610af5c30280bde1b71f84b018b958f32cf" - integrity sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg== + resolved "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz" dependencies: dom-serializer "^1.0.1" domelementtype "^2.0.1" domhandler "^3.0.0" -domutils@^2.5.2: +domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" @@ -683,105 +618,117 @@ domutils@^2.5.2: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + dependencies: + jake "^10.8.5" emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" entities@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + resolved "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz" + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" error-ex@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" dependencies: is-arrayish "^0.2.1" escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" escape-string-regexp@^1.0.2: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" -esprima@^4.0.0: +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" -extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + dependencies: + minimatch "^5.0.1" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" dependencies: to-regex-range "^5.0.1" finalhandler@1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -793,28 +740,32 @@ finalhandler@1.1.2: find-up@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" dependencies: locate-path "^3.0.0" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" @@ -822,23 +773,19 @@ form-data@~2.3.2: fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" fsevents@~2.1.2: version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" fstream@^1.0.0, fstream@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -848,12 +795,10 @@ fstream@^1.0.0, fstream@^1.0.12: function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gauge@~2.7.3: version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -866,39 +811,33 @@ gauge@~2.7.3: gaze@^1.0.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz" dependencies: globule "^1.0.0" get-caller-file@^2.0.1: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" get-stdin@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" dependencies: assert-plus "^1.0.0" glob-parent@~5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" dependencies: is-glob "^4.0.1" -glob@7.0.x: +glob@7.0.x, glob@^7.0.0, glob@^7.0.3: version "7.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= + resolved "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -907,10 +846,9 @@ glob@7.0.x: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1: +glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1: version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -921,8 +859,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1: globule@^1.0.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + resolved "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz" dependencies: glob "~7.1.1" lodash "~4.17.10" @@ -930,55 +867,46 @@ globule@^1.0.0: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3: version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" dependencies: ajv "^6.12.3" har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" dependencies: ansi-regex "^2.0.0" has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" has-symbols@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz" has-unicode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hexo-cli@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/hexo-cli/-/hexo-cli-4.2.0.tgz#74647bc72a90b9cebf04af5bc70839ab281a305d" - integrity sha512-NJQYKnD41KUlNZzEyi8wDzPeGhrjwLLTa05dtkwq+lJch+j9idZTh4dgn3w/82o6Q/zygn+ibO1XvihMfFdSfw== + resolved "https://registry.npmjs.org/hexo-cli/-/hexo-cli-4.2.0.tgz" dependencies: abbrev "^1.1.1" bluebird "^3.5.5" @@ -993,22 +921,19 @@ hexo-cli@^4.0.0: hexo-filter-sup@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hexo-filter-sup/-/hexo-filter-sup-1.0.1.tgz#36b40c9b9b9a9533db3dfe1de36f7fedbde161f3" - integrity sha1-NrQMm5ualTPbPf4d429/7b3hYfM= + resolved "https://registry.npmjs.org/hexo-filter-sup/-/hexo-filter-sup-1.0.1.tgz" dependencies: object-assign "^4.1.0" hexo-front-matter@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hexo-front-matter/-/hexo-front-matter-2.0.0.tgz#03f39a9eedb16c5448dbb3bec7dff2c4e224006c" - integrity sha512-IR3tjAyK2Ga/0a/WDAoNy5+n3ju2/mkuAsCDEeGgGLf5+7kkiOkkG/FrnueuYgz0h2MPfWDLBiDsSTCmB0sLCA== + resolved "https://registry.npmjs.org/hexo-front-matter/-/hexo-front-matter-2.0.0.tgz" dependencies: js-yaml "^3.13.1" hexo-fs@^3.0.1, hexo-fs@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hexo-fs/-/hexo-fs-3.1.0.tgz#2052ff72c68cda2c577a87aa0ea7980ae503fa99" - integrity sha512-SfoDH7zlU9Iop+bAfEONXezbNIkpVX1QqjNCBYpapilZR+xVOCfTEdlNixanrKBbLGPb2fXqrdDBFgrKuiVGQQ== + resolved "https://registry.npmjs.org/hexo-fs/-/hexo-fs-3.1.0.tgz" dependencies: bluebird "^3.5.1" chokidar "^3.0.0" @@ -1017,38 +942,33 @@ hexo-fs@^3.0.1, hexo-fs@^3.1.0: hexo-generator-archive@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-archive/-/hexo-generator-archive-1.0.0.tgz#ad2afb12232a65e2f8608fc1ca3f19162fb63786" - integrity sha512-24TeanDGpMBUIq37DHpSESQbeN6ssZ06edsGSI76tN4Yit50TgsgzP5g5DSu0yJk0jUtHJntysWE8NYAlFXibA== + resolved "https://registry.npmjs.org/hexo-generator-archive/-/hexo-generator-archive-1.0.0.tgz" dependencies: hexo-pagination "1.0.0" hexo-generator-category@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-category/-/hexo-generator-category-1.0.0.tgz#cd2a2b03eb326da3ef821d6e29408488cc132eb5" - integrity sha512-kmtwT1SHYL2ismbGnYQXNtqLFSeTdtHNbJIqno3LKROpCK8ybST5QVXF1bZI9LkFcXV/H8ilt8gfg4/dNNcQQQ== + resolved "https://registry.npmjs.org/hexo-generator-category/-/hexo-generator-category-1.0.0.tgz" dependencies: hexo-pagination "1.0.0" hexo-generator-feed@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-feed/-/hexo-generator-feed-3.0.0.tgz#4126ef5e308264c42599fb0efdaf88ed11fa599e" - integrity sha512-Jo35VSRSNeMitS2JmjCq3OHAXXYU4+JIODujHtubdG/NRj2++b3Tgyz9pwTmROx6Yxr2php/hC8og5AGZHh8UQ== + resolved "https://registry.npmjs.org/hexo-generator-feed/-/hexo-generator-feed-3.0.0.tgz" dependencies: hexo-util "^2.1.0" nunjucks "^3.0.0" hexo-generator-index@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-index/-/hexo-generator-index-2.0.0.tgz#15e71f4d28ee9d2172e2d77e8d1dba04882edc8f" - integrity sha512-q/29Vj9BZs0dwBcF+s9IT8ymS4aYZsDwBEYDnh96C8tsX+KPY5v6TzCdttz58BchifaJpP/l9mi6u9rZuYqA0g== + resolved "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-2.0.0.tgz" dependencies: hexo-pagination "1.0.0" timsort "^0.3.0" hexo-generator-sitemap@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/hexo-generator-sitemap/-/hexo-generator-sitemap-2.1.0.tgz#efd938049ddbf9a961a077fcc5947918ba5b213a" - integrity sha512-3+gF9lFdTJ67A65Z2f517DGmtloDX7ZwMmJUJxvv2tF+a8Hr6Kg9K/DXqOBpM39A/y9eqoGfQ3bmLlBx9rynTg== + resolved "https://registry.npmjs.org/hexo-generator-sitemap/-/hexo-generator-sitemap-2.1.0.tgz" dependencies: hexo-util "^2.1.0" micromatch "^4.0.2" @@ -1056,29 +976,25 @@ hexo-generator-sitemap@^2.1.0: hexo-generator-tag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-tag/-/hexo-generator-tag-1.0.0.tgz#54ec23de9409c75584ea81e36057a59031b022f1" - integrity sha512-JDoB2T1EncRlyGSjuAhkGxRfKkN8tq0i8tFlk9I4q2L6iYxPaUnFenhji0oxufTADC16/IchuPjmMk//dt8Msg== + resolved "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-1.0.0.tgz" dependencies: hexo-pagination "1.0.0" hexo-i18n@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-i18n/-/hexo-i18n-1.0.0.tgz#7983fb3a313e90615b84dd8fa946a71c489ef5bd" - integrity sha512-yw90JHr7ybUHN/QOkpHmlWJj1luVk5/v8CUU5NRA0n4TFp6av8NT7ujZ10GDawgnQEdMHnN5PUfAbNIVGR6axg== + resolved "https://registry.npmjs.org/hexo-i18n/-/hexo-i18n-1.0.0.tgz" dependencies: sprintf-js "^1.0.3" hexo-log@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hexo-log/-/hexo-log-2.0.0.tgz#1dcc8e960029b08b21994fe2c56c4e3d6346e893" - integrity sha512-U7zdDae74pXcyhQEyNmpJdq3UI6zWKxQ7/zLoMr/d3CBRdIfB5yO8DWqKUnewfibYv0gODyTWUIhxQDWuwloow== + resolved "https://registry.npmjs.org/hexo-log/-/hexo-log-2.0.0.tgz" dependencies: chalk "^4.0.0" hexo-math@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hexo-math/-/hexo-math-4.0.0.tgz#329a56a122466a55720536078f4d84da0e50238a" - integrity sha512-oMVa9bVXljQ8F3y0euVwOhkkiTfH3vxEV+dWT7lWbxNjtxV9MvpTG4BkDNSgM1frv+sP549FuPx39KqqEHmAgA== + resolved "https://registry.npmjs.org/hexo-math/-/hexo-math-4.0.0.tgz" dependencies: hexo-util "^2.2.0" katex "^0.12.0" @@ -1086,50 +1002,45 @@ hexo-math@^4.0.0: hexo-pagination@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-pagination/-/hexo-pagination-1.0.0.tgz#c9c0ca3665267b9e9d0a89fc3edcaf3276907dc1" - integrity sha512-miEVFgxchPr2qNWxw0JWpJ9R/Yaf7HjHBZVjvCCcqfbsLyYtCvIfJDxcEwz1sDOC/fLzYPqNnhUI73uNxBHRSA== + resolved "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-1.0.0.tgz" -hexo-renderer-ejs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-renderer-ejs/-/hexo-renderer-ejs-1.0.0.tgz#43c4de49eeae224036a457df860eb1c14c68b4b4" - integrity sha512-O925i69FG4NYO62oWORcPhRZZX0sPx1SXGKUS5DaR/lzajyiXH5i2sqnkj0ya0rNLXIy/D7Xmt7WbFyuQx/kKQ== +hexo-renderer-ejs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz#56e0c3de5f6b0e1e68b923c65a7c8bfe9ff715eb" dependencies: - ejs "^2.6.1" + ejs "^3.1.6" -hexo-renderer-marked@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hexo-renderer-marked/-/hexo-renderer-marked-4.0.0.tgz#f6ad880a384be13c7ebc3fc8788f86fafcf15007" - integrity sha512-Rc9tPqCEX+UjKhAHF2AmH4FcIqVSW7FTKH6kAhMWAn/WMxrCD3Al+99zKnnbgaLJ6TOCb1ckvB4BRkwk62ITxQ== +hexo-renderer-marked@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hexo-renderer-marked/-/hexo-renderer-marked-6.0.0.tgz#a6be94a7b3ecac8be762403d3a7c97581123c295" dependencies: - hexo-util "^2.1.0" - marked "^2.0.0" + dompurify "^2.4.0" + hexo-util "^2.7.0" + jsdom "^20.0.1" + marked "^4.1.1" -hexo-renderer-pug@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hexo-renderer-pug/-/hexo-renderer-pug-1.0.0.tgz#e23cfa53d308a0985ae8ec2b25a4f8d24c4b4dcc" - integrity sha512-lzTSZvPxInGsYJGpv8Z9TQ0n1ZWI6fuSbtyvRmX5tloWPQNNdBhlDIlOsSc2KYQ28QOGuti8GkJ0wPBqLeKf8A== +hexo-renderer-pug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hexo-renderer-pug/-/hexo-renderer-pug-3.0.0.tgz#4ca631cd0ecccefc43b70ac44230d5008956adc2" dependencies: - pug "^2.0.1" + pug "^3.0.2" hexo-renderer-sass@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/hexo-renderer-sass/-/hexo-renderer-sass-0.4.0.tgz#d885a04df93e70fdb4ba107505e6b8093c1a5d87" - integrity sha512-goQ/r8J/2s5XnIp+dSDwWgaxHl6h/VVEsp95Jr/+sYqFfXHXDIC4evC+V1to9ezfQwOS//ZZFQptTZIKTuh8Lg== + resolved "https://registry.npmjs.org/hexo-renderer-sass/-/hexo-renderer-sass-0.4.0.tgz" dependencies: node-sass "^4.5.3" hexo-renderer-stylus@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hexo-renderer-stylus/-/hexo-renderer-stylus-2.0.0.tgz#fbc89a06d33f5eecd5b120759d4af247fde0315d" - integrity sha512-pn411nLqlmd9oq2oEPZ7AfYrCUmAVUxJ/QnE0fpoTFbLARVHOkJaKr6GlcWmKs2jdYIu8xa7yB7cEFo406k8DA== + resolved "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-2.0.0.tgz" dependencies: nib "^1.1.2" stylus "^0.54.8" hexo-server@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hexo-server/-/hexo-server-2.0.0.tgz#1ad92cc8a7d3528fec6ffa65ff8453f242f7983f" - integrity sha512-GnxCU0hjepjmqMENcKOKxpzOajb9YrjQczWsZPXU25l5Ze+M9KJLSVljIRFR+ikDRIPDtXaUY2WgYrWPbNEGfg== + resolved "https://registry.npmjs.org/hexo-server/-/hexo-server-2.0.0.tgz" dependencies: bluebird "^3.5.5" chalk "^4.0.0" @@ -1140,10 +1051,9 @@ hexo-server@^2.0.0: open "^7.0.0" serve-static "^1.14.1" -hexo-util@^2.0.0, hexo-util@^2.1.0, hexo-util@^2.4.0: +hexo-util@^2.0.0, hexo-util@^2.1.0, hexo-util@^2.2.0, hexo-util@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/hexo-util/-/hexo-util-2.4.0.tgz#f5c0099a0a1718b3ad27061e5e4d1fb9eb7f2b41" - integrity sha512-IPQvAyn0cznYMU2gskMiZ6LZEvN7wHNusrJoYxrir4f7S7POpZeDTBswiko9R1qqd+/hu07wUYZdm4ceTTCEaA== + resolved "https://registry.npmjs.org/hexo-util/-/hexo-util-2.4.0.tgz" dependencies: bluebird "^3.5.2" camel-case "^4.0.0" @@ -1155,24 +1065,22 @@ hexo-util@^2.0.0, hexo-util@^2.1.0, hexo-util@^2.4.0: strip-indent "^3.0.0" striptags "^3.1.1" -hexo-util@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hexo-util/-/hexo-util-2.5.0.tgz#de5635341116ba2563a789a0ebceb55a875221ad" - integrity sha512-l0zkqcg2524KPO84HQe0JROpPlCM/dEnCJaJrZ1qsq+3+/YxhDa0zxiGtUVY1dtrWzOK/V11Zj+UEklhGP8Jeg== +hexo-util@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/hexo-util/-/hexo-util-2.7.0.tgz#13d09292e79d260db35399710b3e19f3995443a3" dependencies: bluebird "^3.5.2" camel-case "^4.0.0" cross-spawn "^7.0.0" deepmerge "^4.2.2" - highlight.js "^10.7.1" - htmlparser2 "^6.0.0" + highlight.js "^11.0.1" + htmlparser2 "^7.0.0" prismjs "^1.17.1" strip-indent "^3.0.0" hexo@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/hexo/-/hexo-5.1.1.tgz#5cbd979acce5d3915919688d8d6a8c3de3e93fda" - integrity sha512-D+kf3NJ0WTBwyrEZdcgjsVVsSG4/cnKmixbsnCr1dPwI6d7BBJtFprv7usU7u3sV59+LrOYtPuJKsHaaINffvA== + resolved "https://registry.npmjs.org/hexo/-/hexo-5.1.1.tgz" dependencies: abbrev "^1.1.1" archy "^1.0.0" @@ -1199,43 +1107,43 @@ hexo@^5.0.0: highlight.js@^10.0.0: version "10.4.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" - integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz" -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +highlight.js@^11.0.1: + version "11.7.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + dependencies: + whatwg-encoding "^2.0.0" htmlparser2@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" - integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz" dependencies: domelementtype "^2.0.1" domhandler "^3.0.0" domutils "^2.0.0" entities "^2.0.0" -htmlparser2@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== +htmlparser2@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" dependencies: domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" http-errors@~1.7.2: version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" dependencies: depd "~1.1.2" inherits "2.0.4" @@ -1243,207 +1151,233 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + in-publish@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + resolved "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz" indent-string@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" dependencies: repeating "^2.0.0" inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" dependencies: has "^1.0.3" is-docker@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz" -is-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" - integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" dependencies: - acorn "~4.0.2" - object-assign "^4.0.1" + acorn "^7.1.1" + object-assign "^4.1.1" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" is-finite@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" is-plain-object@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" - integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" is-promise@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" is-regex@^1.0.3: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz" dependencies: has-symbols "^1.0.1" is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" is-utf8@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" is-wsl@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" dependencies: is-docker "^2.0.0" isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" js-base64@^2.1.8: version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" -js-stringify@^1.0.1: +js-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= js-yaml@^3.12.0, js-yaml@^3.13.1: version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz" dependencies: argparse "^1.0.7" esprima "^4.0.0" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + +jsdom@^20.0.1: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" json-schema@0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" jsonparse@^1.2.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" jsprim@^1.2.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -1452,35 +1386,27 @@ jsprim@^1.2.2: jstransformer@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" - integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= + resolved "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz" dependencies: is-promise "^2.0.0" promise "^7.0.1" katex@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" - integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== + resolved "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz" dependencies: commander "^2.19.0" -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: - is-buffer "^1.1.5" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + prelude-ls "~1.1.2" + type-check "~0.3.2" load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -1490,64 +1416,50 @@ load-json-file@^1.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" dependencies: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.0.0, lodash@^4.17.15, lodash@^4.17.4, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.17.15, lodash@~4.17.10: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" loud-rejection@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" lower-case@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" - integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz" dependencies: tslib "^1.10.0" lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" -marked@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" - integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== +marked@^4.1.1: + version "4.2.12" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" mathjax@^3.0.5: version "3.2.0" - resolved "https://registry.yarnpkg.com/mathjax/-/mathjax-3.2.0.tgz#ea7c317f8c81776ecfc83b294fc313046bf7f726" - integrity sha512-PL+rdYRK4Wxif+SQ94zP/L0sv6/oW/1WdQiIx0Jvn9FZaU5W9E6nlIv8liYAXBNPL2Fw/i+o/mZ1212eSzn0Cw== + resolved "https://registry.npmjs.org/mathjax/-/mathjax-3.2.0.tgz" meow@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -1562,79 +1474,72 @@ meow@^3.7.0: micromatch@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" dependencies: braces "^3.0.1" picomatch "^2.0.5" mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz" mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz" dependencies: mime-db "1.44.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" mime@^2.4.3: version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + resolved "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + dependencies: + brace-expansion "^2.0.1" + minimist@^1.1.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" dependencies: minimist "^1.2.5" mkdirp@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" moment-timezone@^0.5.21: version "0.5.31" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05" - integrity sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA== + resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz" dependencies: moment ">= 2.9.0" "moment@>= 2.9.0", moment@^2.22.2: version "2.27.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" - integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + resolved "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz" morgan@^1.9.1: version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" dependencies: basic-auth "~2.0.1" debug "2.6.9" @@ -1644,48 +1549,40 @@ morgan@^1.9.1: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nan@^2.13.2: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + version "2.14.1" + resolved "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz" negotiator@0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" nib@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/nib/-/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7" - integrity sha1-amnt5AgblcDe+L4CSkyK4MLLtsc= + resolved "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz" dependencies: stylus "0.54.5" no-case@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" - integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz" dependencies: lower-case "^2.0.1" tslib "^1.10.0" node-gyp@^3.8.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz" dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -1702,8 +1599,7 @@ node-gyp@^3.8.0: node-sass@^4.5.3: version "4.14.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== + resolved "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz" dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -1725,15 +1621,13 @@ node-sass@^4.5.3: "nopt@2 || 3": version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" dependencies: abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" dependencies: hosted-git-info "^2.1.4" resolve "^1.10.0" @@ -1742,13 +1636,11 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -1757,13 +1649,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" nunjucks@^3.0.0, nunjucks@^3.1.6, nunjucks@^3.2.1: version "3.2.2" - resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.2.tgz#45f915fef0f89fbab38c489dc85025f64859f466" - integrity sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA== + resolved "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz" dependencies: a-sync-waterfall "^1.0.0" asap "^2.0.3" @@ -1771,131 +1661,131 @@ nunjucks@^3.0.0, nunjucks@^3.1.6, nunjucks@^3.2.1: optionalDependencies: chokidar "^3.3.0" +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" dependencies: wrappy "1" open@^7.0.0: version "7.2.1" - resolved "https://registry.yarnpkg.com/open/-/open-7.2.1.tgz#07b0ade11a43f2a8ce718480bdf3d7563a095195" - integrity sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA== + resolved "https://registry.npmjs.org/open/-/open-7.2.1.tgz" dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" os-tmpdir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" osenv@0: version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" p-limit@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" dependencies: p-try "^2.0.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" dependencies: p-limit "^2.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" parse-json@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" dependencies: error-ex "^1.2.0" +parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + dependencies: + entities "^4.4.0" + parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" pascal-case@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" - integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz" dependencies: no-case "^3.0.3" tslib "^1.10.0" path-exists@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" path-type@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -1903,195 +1793,177 @@ path-type@^1.0.0: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" pify@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" pretty-hrtime@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" prismjs@^1.17.1: version "1.25.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" - integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz" process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" promise@^7.0.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" dependencies: asap "~2.0.3" pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" psl@^1.1.28: version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" -pug-attrs@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" - integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.5" + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" -pug-code-gen@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz#122eb9ada9b5bf601705fe15aaa0a7d26bc134ab" - integrity sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA== +pug-code-gen@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" dependencies: - constantinople "^3.1.2" + constantinople "^4.0.1" doctypes "^1.1.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.4" - pug-error "^1.3.3" - pug-runtime "^2.0.5" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" - integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.0.0" + pug-runtime "^3.0.0" + void-elements "^3.1.0" + with "^7.0.0" + +pug-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" -pug-filters@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7" - integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg== +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" dependencies: - clean-css "^4.1.11" - constantinople "^3.0.1" + constantinople "^4.0.1" jstransformer "1.0.0" - pug-error "^1.3.3" - pug-walk "^1.1.8" - resolve "^1.1.6" - uglify-js "^2.6.1" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" -pug-lexer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd" - integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA== +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" dependencies: - character-parser "^2.1.1" - is-expression "^3.0.0" - pug-error "^1.3.3" + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" -pug-linker@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb" - integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg== +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" dependencies: - pug-error "^1.3.3" - pug-walk "^1.1.8" + pug-error "^2.0.0" + pug-walk "^2.0.0" -pug-load@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b" - integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" dependencies: - object-assign "^4.1.0" - pug-walk "^1.1.8" + object-assign "^4.1.1" + pug-walk "^2.0.0" -pug-parser@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9" - integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA== +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" dependencies: - pug-error "^1.3.3" - token-stream "0.0.1" + pug-error "^2.0.0" + token-stream "1.0.0" -pug-runtime@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" - integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== +pug-runtime@^3.0.0, pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" -pug-strip-comments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" - integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" dependencies: - pug-error "^1.3.3" + pug-error "^2.0.0" -pug-walk@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" - integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" -pug@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d" - integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw== - dependencies: - pug-code-gen "^2.0.2" - pug-filters "^3.1.1" - pug-lexer "^4.1.0" - pug-linker "^3.0.6" - pug-load "^2.0.12" - pug-parser "^5.0.1" - pug-runtime "^2.0.5" - pug-strip-comments "^1.0.4" +pug@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" + dependencies: + pug-code-gen "^3.0.2" + pug-filters "^4.0.0" + pug-lexer "^5.0.1" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.1" + pug-strip-comments "^2.0.0" punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" qs@~6.5.2: version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" read-pkg-up@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" dependencies: find-up "^1.0.0" read-pkg "^1.0.0" read-pkg@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -2099,8 +1971,7 @@ read-pkg@^1.0.0: readable-stream@^2.0.1, readable-stream@^2.0.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -2112,40 +1983,26 @@ readable-stream@^2.0.1, readable-stream@^2.0.6: readdirp@~3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz" dependencies: picomatch "^2.2.1" redent@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - repeating@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" dependencies: is-finite "^1.0.0" request@^2.87.0, request@^2.88.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -2170,72 +2027,55 @@ request@^2.87.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" -resolve@^1.1.6, resolve@^1.10.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" dependencies: - is-core-module "^2.1.0" path-parse "^1.0.6" -resolve@^1.11.0, resolve@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.15.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" dependencies: - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" rfdc@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" - integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz" rimraf@2: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" dependencies: glob "^7.1.3" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass-graph@2.2.5: version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + resolved "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz" dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -2244,41 +2084,40 @@ sass-graph@2.2.5: sax@0.5.x: version "0.5.8" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= + resolved "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" sax@~1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + dependencies: + xmlchars "^2.2.0" scss-tokenizer@^0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + resolved "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz" dependencies: js-base64 "^2.1.8" source-map "^0.4.2" "semver@2 || 3 || 4 || 5": version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" semver@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + resolved "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" send@0.17.1: version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" dependencies: debug "2.6.9" depd "~1.1.2" @@ -2296,8 +2135,7 @@ send@0.17.1: serve-static@^1.14.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -2306,35 +2144,29 @@ serve-static@^1.14.1: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" setprototypeof@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" signal-exit@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" source-map-resolve@^0.5.2: version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" @@ -2344,78 +2176,57 @@ source-map-resolve@^0.5.2: source-map-url@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz" source-map@0.1.x: version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" dependencies: amdefine ">=0.0.4" source-map@^0.4.2: version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" dependencies: amdefine ">=0.0.4" -source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== - -sprintf-js@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + version "3.0.5" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz" -sprintf-js@~1.0.2: +sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" sshpk@^1.7.0: version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2429,37 +2240,25 @@ sshpk@^1.7.0: "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" stdout-stream@^1.4.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + resolved "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz" dependencies: readable-stream "^2.0.1" -string-width@^1.0.1: +string-width@^1.0.1, "string-width@^1.0.2 || 2": version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" @@ -2467,69 +2266,53 @@ string-width@^3.0.0, string-width@^3.1.0: string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" dependencies: safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" dependencies: ansi-regex "^5.0.0" strip-bom@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" dependencies: is-utf8 "^0.2.0" strip-indent@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" dependencies: get-stdin "^4.0.1" strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" dependencies: min-indent "^1.0.0" striptags@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" - integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== + resolved "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz" stylus@0.54.5: version "0.54.5" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" - integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk= + resolved "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz" dependencies: css-parse "1.7.x" debug "*" @@ -2540,8 +2323,7 @@ stylus@0.54.5: stylus@^0.54.8: version "0.54.8" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" - integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + resolved "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz" dependencies: css-parse "~2.0.0" debug "~3.1.0" @@ -2554,20 +2336,25 @@ stylus@^0.54.8: supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + tar@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" dependencies: block-stream "*" fstream "^1.0.12" @@ -2575,166 +2362,163 @@ tar@^2.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" "through@>=2.2.7 <3": version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" tildify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" - integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + resolved "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz" timsort@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" titlecase@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/titlecase/-/titlecase-1.1.3.tgz#fc6d65ff582b0602410768ef1a09b70506313dc3" - integrity sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw== + resolved "https://registry.npmjs.org/titlecase/-/titlecase-1.1.3.tgz" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" dependencies: is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" + +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" dependencies: psl "^1.1.28" punycode "^2.1.1" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + dependencies: + punycode "^2.1.1" + trim-newlines@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" "true-case-path@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz" dependencies: glob "^7.1.2" tslib@^1.10.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + resolved "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz" tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" -uglify-js@^2.6.1: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" + prelude-ls "~1.1.2" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" uri-js@^4.2.2: version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz" dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" uuid@^3.3.2: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -void-elements@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + dependencies: + xml-name-validator "^4.0.0" warehouse@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/warehouse/-/warehouse-4.0.0.tgz#45832bc43e1fd323bd9d3c86b2761430ba0d1e7b" - integrity sha512-9i6/JiHzjnyene5Pvvl2D2Pd18no129YGy0C0P7x18iTz/SeO9nOBioR64XoCy5xKwBKQtl3MU361qpr0V9uXw== + resolved "https://registry.npmjs.org/warehouse/-/warehouse-4.0.0.tgz" dependencies: JSONStream "^1.0.7" bluebird "^3.2.2" @@ -2743,54 +2527,65 @@ warehouse@^4.0.0: is-plain-object "^3.0.0" rfdc "^1.1.4" +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" which@1, which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -with@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= +with@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" dependencies: ansi-styles "^3.2.0" string-width "^3.0.0" @@ -2798,31 +2593,38 @@ wrap-ansi@^5.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + +ws@^8.11.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" y18n@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz" yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" yargs-parser@^13.1.2: version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" dependencies: camelcase "^5.0.0" decamelize "^1.2.0" yargs@^13.3.2: version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -2834,13 +2636,3 @@ yargs@^13.3.2: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^13.1.2" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0"