{"id":19372,"date":"2020-09-22T11:08:51","date_gmt":"2020-09-22T02:08:51","guid":{"rendered":"https:\/\/its-more.jp\/ja_jp\/?p=19372"},"modified":"2020-09-23T10:53:51","modified_gmt":"2020-09-23T01:53:51","slug":"gshell-0-4-9-%e2%88%92","status":"publish","type":"post","link":"https:\/\/its-more.jp\/ja_jp\/?p=19372","title":{"rendered":"\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30b8\u30e3\u30fc\u53ec\u559a\u6cd5"},"content":{"rendered":"\n<p>\u793e\u9577\uff1a\u4eca\u65e5\u306f\u3082\u3046\u304a\u663c\u8fd1\u3044\u306e\u306b\u3001\u5999\u306b\u9759\u304b\u306a\u65e5\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u304a\u6b63\u6708\u307f\u305f\u3044\u3067\u3059\u306d\u3002\u4ea4\u901a\u97f3\u3082\u751f\u6d3b\u97f3\u3082\u3057\u3066\u6765\u306a\u3044\u3002\u30ab\u30e9\u30b9\u304c\u9cf4\u3044\u3066\u308b\u3057\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u3046\u3044\u3048\u3070\u30a4\u30c4\u30e2\u306f\u4f55\u306e\u97f3\u304c\u805e\u3053\u3048\u3066\u308b\u3093\u3067\u3057\u3087\u3046\u306d\u3002\u4eca\u805e\u3053\u3048\u308b\u306e\u306f\u30ec\u30ce\u30dc\u304c\u308f\u305a\u304b\u306b\u30e2\u30fc\u3063\u3066\u3044\u3063\u3066\u308b\u97f3\u304f\u3089\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u9759\u304b\u3060\u3068\u8033\u9cf4\u308a\u306b\u6c17\u3065\u304d\u307e\u3059 (^-^;<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u304a\u306a\u304b\u304c\u3059\u3044\u305f\u306e\u3067\u98df\u4e8b\u3057\u3066\u6765\u307e\u3059\u3002\u4eca\u65e5\u306f\u4e45\u3057\u3076\u308a\u306b\u3057\u3089\u3059\u4e3c\u304b\u306a\u3002<\/p>\n\n\n\n<p class=\"has-text-align-center\">\uff0a\u3000\uff0a\u3000\uff0a<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u6848\u306e\u5b9a\u3001\u4eca\u65e5\u3082\u3088\u3044\u7a7a\u304c\u304c\u51fa\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/26BC8728-DFA2-41A8-96E4-55DF3BB23C45_1_105_c.jpeg\" alt=\"\" class=\"wp-image-19394\" width=\"513\" height=\"384\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/26BC8728-DFA2-41A8-96E4-55DF3BB23C45_1_105_c.jpeg 1025w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/26BC8728-DFA2-41A8-96E4-55DF3BB23C45_1_105_c-300x224.jpeg 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/26BC8728-DFA2-41A8-96E4-55DF3BB23C45_1_105_c-768x575.jpeg 768w\" sizes=\"(max-width: 513px) 100vw, 513px\" \/><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-gallery columns-4 is-cropped\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"1024\" height=\"768\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/1200FE72-085E-4A80-ACE6-C4595177E4F7_1_105_c.jpeg\" alt=\"\" data-id=\"19396\" data-link=\"https:\/\/its-more.jp\/ja_jp\/?attachment_id=19396\" class=\"wp-image-19396\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/1200FE72-085E-4A80-ACE6-C4595177E4F7_1_105_c.jpeg 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/1200FE72-085E-4A80-ACE6-C4595177E4F7_1_105_c-300x225.jpeg 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/1200FE72-085E-4A80-ACE6-C4595177E4F7_1_105_c-768x576.jpeg 768w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"1024\" height=\"756\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51-1024x756.png\" alt=\"\" data-id=\"19407\" data-link=\"https:\/\/its-more.jp\/ja_jp\/?attachment_id=19407\" class=\"wp-image-19407\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51-1024x756.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51-300x221.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51-768x567.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51-1536x1134.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-13.51.51.png 1681w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"1024\" height=\"768\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/F9E22FE2-ACB8-49AD-ABAF-54EFB0097784_1_105_c.jpeg\" alt=\"\" data-id=\"19408\" data-link=\"https:\/\/its-more.jp\/ja_jp\/?attachment_id=19408\" class=\"wp-image-19408\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/F9E22FE2-ACB8-49AD-ABAF-54EFB0097784_1_105_c.jpeg 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/F9E22FE2-ACB8-49AD-ABAF-54EFB0097784_1_105_c-300x225.jpeg 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/F9E22FE2-ACB8-49AD-ABAF-54EFB0097784_1_105_c-768x576.jpeg 768w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" width=\"1024\" height=\"768\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/7E3967D4-70B3-4FE7-8C9F-D90C58F2E54F_1_105_c-1.jpeg\" alt=\"\" data-id=\"19409\" data-full-url=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/7E3967D4-70B3-4FE7-8C9F-D90C58F2E54F_1_105_c-1.jpeg\" data-link=\"https:\/\/its-more.jp\/ja_jp\/?attachment_id=19409\" class=\"wp-image-19409\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/7E3967D4-70B3-4FE7-8C9F-D90C58F2E54F_1_105_c-1.jpeg 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/7E3967D4-70B3-4FE7-8C9F-D90C58F2E54F_1_105_c-1-300x225.jpeg 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/7E3967D4-70B3-4FE7-8C9F-D90C58F2E54F_1_105_c-1-768x576.jpeg 768w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>\u958b\u767a\uff1a\u65e5\u5e38\u751f\u6d3b\u306e\u4e2d\u306b\u3053\u3093\u306a\u98a8\u666f\u304c\u3042\u3063\u305f\u3068\u3044\u3046\u306e\u304c\u3061\u3087\u3063\u3068\u9a5a\u304d\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30b9\u30e9\u30e0\u306e\u4e0a\u306b\u3082\u7f8e\u3057\u3044\u7a7a\u304c\u5e73\u7b49\u306b\u51fa\u3066\u3044\u308b\u306e\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3053\u3053\u306f\u30b9\u30e9\u30e0\u3067\u306f\u306a\u3044\u3067\u3059\u3051\u3069\u306d\u3002\u305f\u3060\u3001\u3068\u3082\u304b\u304f\u96fb\u7dda\u304c\u3046\u3056\u3044\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u6700\u8fd1\u306f\u6b69\u304f\u6642\u306b\u3082\u773c\u93e1\u3092\u304b\u3051\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u305b\u3044\u304b\u3001\u7a7a\u3092\u898b\u308b\u306e\u304c\u697d\u3057\u3044\u3067\u3059\u3002\u5730\u7403\u306e\u7a7a\u306e\u7d20\u6674\u3089\u3057\u3055\u3092\u518d\u8a8d\u8b58\u3055\u305b\u3089\u308c\u3066\u3044\u308b\u3068\u3053\u308d\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u7a7a\u306e\u518d\u767a\u898b\u3002\u30c7\u30a3\u30b9\u30ab\u30d0\u30fc\u30b9\u30ab\u30a4\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308c\u3067\u5e30\u308a\u306b\u5bc4\u3063\u305f\u30a5\u30a8\u30eb\u30b7\u30a1\u3067\u306f\u76ee\u306e\u5927\u304d\u306a\u30ed\u30dc\u30c3\u30c8\u304a\u59c9\u3055\u3093\u304c\u30ec\u30b8\u3092\u3057\u3066\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u76ee\u306e\u30d1\u30c3\u30c1\u30ea\u3057\u305f\u4eba\u304c\u30de\u30b9\u30af\u3057\u3066\u308b\u3068\u3001\u3044\u3064\u3082\u9a5a\u3044\u3066\u3044\u308b\u3088\u3046\u306b\u898b\u3048\u307e\u3059\u3088\u306d\uff57<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u672c\u5f53\u306b\u30ed\u30dc\u30c3\u30c8\u306a\u3093\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u76f4\u63a5\u805e\u3044\u3066\u307f\u3066\u306f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u300c\u79c1\u306f\u30ed\u30dc\u30c3\u30c8\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u300d\u3068\u7b54\u3048\u308b\u306e\u3067\u306f\u306a\u3044\u3067\u3057\u3087\u3046\u304b\uff57<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3067\u3082\u6700\u8fd1\u306f\u5b66\u7fd2\u304c\u9032\u3093\u3060\u307f\u305f\u3044\u3067\u3001\u30ec\u30b8\u888b\u306f\u3069\u3046\u306a\u3055\u3044\u307e\u3059\u304b\u3068\u304b\u3001\u30b9\u30d7\u30fc\u30f3\u306f\u304a\u4ed8\u3051\u3057\u307e\u3059\u304b\u3068\u304b\u805e\u3044\u3066\u304f\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u305d\u308c\u306f\u305d\u3046\u3068\u3001\u30ec\u30ce\u30dc\u6a5f\u306f\u307b\u3068\u3093\u3069\u4f7f\u3063\u3066\u3044\u306a\u3044\u3088\u3046\u3067\u3059\u306e\u3067\u3001\u30b9\u30ea\u30fc\u30d7\u3055\u305b\u3066\u304a\u3044\u3066\u306f\u3044\u304b\u304c\u3067\u3057\u3087\u3046\uff1f<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u78ba\u304b\u306b\u3002\u3067\u306f1\u5206\u3067\u30b9\u30ea\u30fc\u30d7\u2026<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-1024x576.png\" alt=\"\" class=\"wp-image-19417\" width=\"256\" height=\"144\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-1024x576.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-300x169.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-768x432.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-1536x864.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Screen-Shot-2020-09-22-at-14.16.15-2048x1152.png 2048w\" sizes=\"(max-width: 256px) 100vw, 256px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u3069\u3046\u3084\u3063\u3066\u8d77\u3053\u3059\u3093\u3067\u3057\u3087\u3046\uff1f<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30cd\u30c3\u30c8\u3067\u7279\u5b9a\u30dd\u30fc\u30c8\u3092\u76e3\u8996\u3057\u3066\u8d77\u304d\u308b\u3068\u304b\u3067\u304d\u308b\u306f\u305a\u3067\u3059\u306d\u3002RemoteDesktop\u3067\u8d77\u304d\u3066\u304f\u308c\u308b\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3044\u3084\u3001\u624b\u3092\u4f38\u3070\u305b\u3070\u96fb\u6e90\u30b9\u30a4\u30c3\u30c1\u304c\u3042\u308a\u307e\u3059\u304b\u3089\u3001\u305d\u308c\u3067\u3082\u826f\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"has-text-align-center\">\uff0a\u3000\uff0a\u3000\uff0a<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u304a\u3084\u3001\u76ee\u304c\u9192\u3081\u305f\u3089\u5916\u306f\u3082\u3046\u6697\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u65e5\u304c\u77ed\u304f\u306a\u308a\u307e\u3057\u305f\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u3046\u3044\u3048\u3070\u3001\u4eca\u65e5\u306f\u79cb\u5206\u306e\u65e5\u3063\u3066\u3084\u3064\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3055\u3059\u304c\u306b\u6628\u65e5\u306f\u671d\u304b\u3089\u6df1\u591c\u307e\u3067\u3084\u3063\u305f\u306e\u3067\u75b2\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1agsh.go.html \u3082500\u884c\u8fd1\u304f\u5927\u304d\u304f\u306a\u308a\u307e\u3057\u305f\u306d\u3002<\/p>\n\n\n\n<h2>HTML\u3067\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u9b5a\u62d3<\/h2>\n\n\n\n<p>\u793e\u9577\uff1a\u5b9f\u8cea\u7684\u306b\u4e00\u756a\u5927\u304d\u306a\u9032\u6b69\u304c\u3042\u3063\u305f\u65e5\u306a\u306e\u304b\u3082\u77e5\u308c\u307e\u305b\u3093\u3002@media screen \u306e\u8a18\u5ff5\u5199\u771f\u3092Safari\u3067\u30d1\u30b7\u30e3\u3002<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/screen-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\">screen-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/screen-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\u3060\u3051\u306e\u5370\u5237\u3068\u306f\u307e\u305f\u9055\u3063\u305f\u58ca\u308c\u65b9\u3092\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30b5\u30a4\u30c8\u306e\u5370\u5237\u3067\u306fDOM\u306e\u73fe\u72b6\u3092\u5410\u3044\u3066\u5370\u5237\u3059\u308b\u307f\u305f\u3044\u3067\u3059\u304b\u3089\u3001DOM\u306e\u72b6\u614b\u3092\u5370\u5237\u7528\u306e\u72b6\u614b\u306b\u3059\u308b\u3001\u3068\u3044\u3046\u304b\u30b9\u30af\u30ea\u30fc\u30f3\u8868\u793a\u30e2\u30fc\u30c9\u3092\u3001GShell\u3067\u4f5c\u3063\u3066\u3084\u308b\u3068\u826f\u3044\u306e\u3067\u3057\u3087\u3046\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u3046\u601d\u3044\u307e\u3059\u3002\u3068\u3044\u3044\u307e\u3059\u304b\u3001\u305d\u3082\u305d\u3082\u30b5\u30a4\u30c8\u5168\u4f53\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u8868\u793a\u306e\u73fe\u72b6\u3092\u5410\u304d\u51fa\u3057\u3066PDF\u306b\u3057\u3066\u304f\u308c\u308b\u6a5f\u80fd\u3063\u3066\u3001\u3072\u3087\u3063\u3068\u3059\u308b\u3068 Safari \u306e File &gt; Export as PDF \u3057\u304b\u306a\u304b\u3063\u305f\u308a\u3057\u306a\u3044\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aOpera \u306b\u3082\u3001File &gt; Save Page as PDF \u306f\u3042\u308a\u307e\u3059\u306d\u3002\u305f\u3060\u3001\u30da\u30fc\u30b8\u306e\u524d\u534a\u304c\u7121\u304f\u306a\u3063\u3066\u305f\u308a\u3001details \u304c\u5316\u3051\u305f\u308a\u3068\u3001\u60b2\u60e8\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Opera-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\">Opera-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/Opera-GShell-0.4.8-\u2212-\u81ea\u5206\u8a8d\u8a3c\u65b9\u5f0f-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u306a\u305c details \u306e\u3088\u3046\u306a\u57fa\u672c\u4e2d\u306e\u57fa\u672c\u306e\u5370\u5237\u304c\u58ca\u308c\u308b\u3093\u3067\u3059\u304b\u306d\u3002Chromium\u7cfb\u306b\u5171\u901a\u306e\u3088\u3046\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aOpera \u306b\u3042\u308b\u306a\u3089\u3001Vivaldi \u306b\u3082\u3042\u308b\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u898b\u5f53\u305f\u3089\u306a\u3044\u3067\u3059\u306d\u3002\u30e1\u30cb\u30e5\u30fc\u306e\u305d\u306e\u4ed8\u8fd1\u306b\u306f\u3001\u5f97\u610f\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u4fdd\u5b58\u6a5f\u80fd\u304c\u8868\u793a\u3055\u308c\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30d6\u30e9\u30a6\u30b6\u306e\u9ece\u660e\u671f\u306b\u306f\u3001Mozaic \u3068\u304b Netscape \u3068\u304b\u3001\u753b\u9762\u306b\u8868\u793a\u3055\u308c\u3066\u308b\u72b6\u614b\u3092\u305d\u306e\u307e\u307e\u5370\u5237\u3057\u3066\u307e\u3057\u305f\u3088\u306d\u3002\u3060\u304b\u3089\u3001\u753b\u9762\u306e\u8868\u793a\u5e45\u3092\u5909\u3048\u3066\u8abf\u6574\u3057\u3066\u304b\u3089\u5370\u5237\u3068\u304b\u3057\u3066\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u753b\u9762\u8868\u793a\u306e\u5b8c\u74a7\u306a\u518d\u73fe\u3068\u3044\u3046\u304b\u9b5a\u62d3\u3092\u671f\u5f85\u3059\u308b\u306a\u3089\u3001\u305d\u308c\u304c\u6b63\u3057\u3044\u65b9\u6cd5\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3064\u307e\u308a\u3001\u8868\u793a\u3059\u308b\u524d\u306eDOM\u3067\u306f\u306a\u304f\u3066\u3001\u8868\u793a\u3055\u308c\u305f\u5f8c\u306e\u30d3\u30c3\u30c8\u30de\u30c3\u30d7\u304c\u624b\u306b\u5165\u308c\u3070\u826f\u3044\u3068\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3069\u306e x, y \u5ea7\u6a19\u306b\u8868\u793a\u3055\u308c\u3066\u308b\u306e\u306f\u3069\u306e\u30a8\u30ec\u30e1\u30f3\u30c8\u3060\u3068\u9006\u63a2\u77e5\u3067\u304d\u308b\u304f\u3089\u3044\u3067\u3059\u304b\u3089\u3001\u30a4\u30e1\u30fc\u30b8\u3092\u5168\u90e8\u4f5c\u3063\u3066\u308b\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u308c\u3092\u9802\u3044\u3066\u3001PNG\u306b\u3057\u3061\u3083\u3046\u3068\u304b\uff57<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u975e\u5e38\u306b\u3072\u3087\u3046\u304d\u3093\u306a\u30b5\u30a4\u30ba\u306e\u753b\u50cf\u304c\u3067\u304d\u308b\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u305d\u308c\u304c\u6b63\u3057\u3044\u9053\u306e\u4e00\u3064\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3068\u3046\u304bPNG\u3058\u3083\u306a\u304f\u3066\u3001\u30b9\u30b4\u30fc\u30af\u7e26\u9577\u306e1\u30da\u30fc\u30b8\u306ePDF\u306b\u5410\u3044\u3066\u304f\u308c\u308b\u30d6\u30e9\u30a6\u30b6\u304c\u3042\u3063\u305f\u3088\u3046\u306a\u8a18\u61b6\u3082\u3042\u308b\u3093\u3067\u3059\u304c\u3002\u5272\u3068\u6700\u8fd1\u306b\u898b\u305f\u8a18\u61b6\u304c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30d0\u30a4\u30ca\u30ea\u306e\u30c0\u30f3\u30d7\u3068\u3057\u3066\u306f\u6b63\u3057\u3044\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u30bd\u30fc\u30b9\u30ec\u30d9\u30eb\u3067\u306e\u30c0\u30f3\u30d7\u3082\u6b32\u3057\u3044\u3002GShell\u3067\u3084\u3063\u3066\u308b\u3001DOM\u306e\u73fe\u72b6\u3092\u3001\u306a\u308b\u3079\u304f\u30aa\u30ea\u30b8\u30ca\u30eb\u306b\u8fd1\u3044HTML\u3067\u5410\u304f\u3068\u3044\u3046\u306e\u3082\u3001\u3072\u3068\u3064\u306e\u6709\u308b\u3079\u304d\u9053\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u300char \/ \u306f\u3042\u300d\u5f62\u5f0f\u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u3067\u3059\u306d\u3002\u751f\u304d\u305fDOM\u306e\u72b6\u614b\u3068\u3044\u3046\u304b\u5024\u304cHTML\u306e\u30a4\u30f3\u30e9\u30a4\u30f3\u3067\u5c55\u958b\u3055\u308c\u3066\u3057\u307e\u3046\u306e\u304c\u5acc\u3067\u3059\u304c\u3001\u3042\u305d\u3053\u306f\u3001\u305d\u306e\u5024\u3092\u5225\u9014JavaScript\u3067\u751f\u6210\u3059\u308b\u3088\u3046\u306ascript\u306b\u5206\u96e2\u3059\u308c\u3070\u3088\u3044\u306e\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u4eba\u9593\u304c\u898b\u308b\u306e\u306b\u8010\u3048\u308b\u3001\u3068\u3044\u3046\u306e\u306f\u304b\u306a\u308a\u96e3\u3057\u3044\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u306a\u3093\u3067\u3082\u3044\u3044\u304b\u3089\u30c0\u30f3\u30d7\u3057\u3066\u4fdd\u5b58\u3057\u3088\u3046\u3001\u3042\u308a\u306e\u307e\u307e\u3092\u4fdd\u5b58\u3057\u3066\u5f8c\u3067\u305d\u306e\u3068\u304a\u308a\u306b\u8868\u793a\u3057\u3088\u3046\u3001\u5b9f\u884c\u3092\u7d99\u7d9a\u3057\u3088\u3046\u3001\u3068\u3044\u3046\u610f\u5473\u3067\u306f\u3001\u5358\u306bDOM\u306e\u30c0\u30f3\u30d7\u3068\u3044\u3046\u304b\u3001outerHTML\u3092\u5c65\u3051\u3070\u826f\u3044\u306e\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aDOM\u3068\u3001style \u306e\u30d0\u30a4\u30ca\u30ea\u3067\u3042\u308bCSSOM\u3082\u3067\u3059\u306d\u3002\u3042\u308c\u3092CSS\u306e\u3054\u3068\u304f\u304b\u3001\u8a2d\u5b9ascript\u5f62\u5f0f\u306b\u3057\u3066\u5410\u304f\u3002\u751f\u6210\u3055\u308c\u305f script \u30b3\u30fc\u30c9\u306b\u3064\u3044\u3066\u306f\u3069\u3046\u304b\u3001\u4e0d\u660e\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aWebAssembly \u306e\u9006\u30b3\u30f3\u30d1\u30a4\u30eb\u307f\u305f\u3044\u306a\u3053\u3068\u306b\u306a\u308b\u3093\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u306a\u3093\u306b\u3057\u3066\u3082\u3001\u3053\u308c\u306f\u3001\u30d0\u30a4\u30ca\u30ea\u306e\u5b9f\u884c\u72b6\u614b\u3092\u30bd\u30fc\u30b9\u5f62\u5f0f\u3067\u30c0\u30f3\u30d7\u3059\u308b\u3068\u3044\u3046\u3001\u666e\u901a\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fb\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u96e3\u3057\u3044\u3053\u3068\u304c\u3001\u30a6\u30a7\u30d6\u51e6\u7406\u7cfb\u3067\u306f\u3067\u304d\u308b\u53ef\u80fd\u6027\u304c\u3042\u308b\u308f\u3051\u3067\u3059\u3002\u9762\u767d\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307b\u3093\u3068\u3046\u306e\u5b9f\u884c\u72b6\u614b\u3068\u3044\u3046\u610f\u5473\u3067\u306f\u3001JavaScript \u306e\u30b9\u30bf\u30c3\u30af\u3068\u304b\u30d2\u30fc\u30d7\u306e\u30c0\u30f3\u30d7\u3082\u5fc5\u8981\u3058\u3083\u306a\u3044\u304b\u3068\u306f\u601d\u3044\u307e\u3059\u3051\u3069\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3001\u52d5\u3044\u3066\u308b\u9014\u4e2d\u3068\u3044\u3046\u306e\u307e\u3067\u671b\u307e\u306a\u3044\u306a\u3044\u3067\u3059\u304c\u3002\u5c11\u306a\u304f\u3068\u3082DOM\u306b\u7d10\u4ed8\u3051\u3089\u308c\u305f\u9759\u7684\u306a\u30c7\u30fc\u30bf\u69cb\u9020\u306b\u3064\u3044\u3066\u306f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u3001Lisp\u306a\u3089\u51fa\u6765\u308b\u3063\u3066\u8a00\u3046\u4eba\u3082\u3044\u308b\u3067\u3057\u3087\u3046\u3051\u3069\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aWebAssembly \u3063\u3066\u3001Lisp \u307f\u305f\u3044\u306a\u3084\u3064\u3058\u3083\u306a\u304b\u3063\u305f\u3067\u3057\u305f\u3063\u3051\u3002<\/p>\n\n\n\n<h2>GShell\u3067\u30d6\u30e9\u30a6\u30b6\u9593\u30d1\u30b9\u30ef\u30fc\u30c9\u79fb\u8ee2<\/h2>\n\n\n\n<p>\u793e\u9577\uff1a\u3055\u3066\u3001\u4eca\u65e5\u3082\u307e\u3060\u6570\u6642\u9593\u306f\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4f55\u304b\u3084\u308a\u307e\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u30c6\u30fc\u30de\u3068\u3057\u3066\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u79fb\u8ee2\u304c\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aiMac\u3078\u306e\u79fb\u884c\u304c\u5b8c\u4e86\u3057\u306a\u3044\u7406\u7531\u3082\u305d\u308c\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3068\u3044\u3044\u307e\u3059\u304b\u30016\u30d6\u30e9\u30a6\u30b6\u305d\u308c\u305e\u308c\u306b\u826f\u3044\u3068\u3053\u308d\u306f\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u3069\u308c\u3082\u4e26\u884c\u3057\u3066\u4f7f\u3044\u305f\u3044\u306e\u3067\u3059\u3002\u306a\u306e\u3067\u3001\u79fb\u8ee2\u3068\u3044\u3046\u3088\u308a\u306f\u3001\u7406\u60f3\u7684\u306b\u306f\u5e38\u306b\u5171\u6709\u3057\u3066\u3044\u305f\u3044\u3002\u305d\u3082\u305d\u3082\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u8a18\u61b6\u3055\u305b\u308b\u306e\u3082\u5acc\u3067\u3059\u3057\u3002\u306a\u306e\u3067\u3001\u81ea\u524d\u306e\u79d8\u5bc6\u8a18\u61b6\u306b\u7f6e\u3044\u3066\u304a\u3044\u3066\u3001\u305d\u308c\u3092\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u53d6\u308a\u306b\u6765\u308c\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4efb\u610f\u306e\u30b5\u30a4\u30c8\u3078\u306e\u30ed\u30b0\u30a4\u30f3\u7528\u306b\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u624b\u3092\u5165\u308c\u308b\u304b\u3001\u5c11\u306a\u304f\u3068\u3082 extention \u306f\u5fc5\u8981\u3067\u3057\u3087\u3046\u3051\u3069\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1aclinet-side CSS\u307f\u305f\u3044\u306b\u3001client-side \u30b9\u30af\u30ea\u30d7\u30c8\u3092\u6dfb\u52a0\u3067\u304d\u308b\u3068\u826f\u3044\u306e\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30d7\u30ed\u30ad\u30b7\u3067\u7a81\u3063\u8fbc\u3093\u3067\u3084\u308b\u3068\u304b\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aHTTPS\u3060\u3068\u305d\u308c\u304c\u7d50\u69cb\u3080\u305a\u304b\u3057\u3044\u306e\u3067\u3059\u3002SSL\u7684\u306b\u306f\u5fa9\u53f7\u30fb\u518d\u6697\u53f7\u5316\u3067\u901a\u305b\u307e\u3059\u304c\u3001\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u304cMITM\u3092\u691c\u67fb\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u9ad8\u3044\u3002\u6614\u306fDeleGate\u3067\u3084\u3063\u3066\u307e\u3057\u305f\u3051\u3069\u3001\u6700\u8fd1\u306f\u901a\u7528\u3057\u306a\u3044\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\uff1f\u305d\u308c\u304c\u3067\u304d\u3066\u3057\u307e\u3046\u306a\u3089\u3001\u30cd\u30c3\u30c8\u30d0\u30f3\u30af\u306a\u3093\u3066\u4f7f\u3046\u6c17\u306b\u306a\u3089\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3001\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3068\u540c\u3058\u79d8\u5bc6\u9375\u3092\u6301\u3063\u3066\u3066\u518d\u6697\u53f7\u5316\u3067\u304d\u308c\u3070\u3001\u3063\u3066\u304f\u3089\u3044\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u901a\u4fe1\u3058\u3083\u306a\u304f\u3066\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u90e8\u54c1\u5358\u4f4d\u306b\u7f72\u540d\u3055\u308c\u3066\u308c\u3070\u826f\u3044\u306e\u3067\u306f\u3002\u81ea\u5206\u306e\u7f72\u540d\u306e\u3042\u308b\u6dfb\u52a0\u30b9\u30af\u30ea\u30d7\u30c8\u306a\u3089\u4fe1\u983c\u3059\u308b\u3068\u3044\u3046\u306e\u306f\u666e\u901a\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u306e\u3078\u3093\u306f\u9006\u306b\u3001HTTP\u3058\u3083\u306a\u304f\u3066S\/MIME\u306a\u3089\u3067\u304d\u308b\u3068\u3044\u3046\u8a71\u3067\u3057\u3087\u3046\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5229\u7528\u8005\u5074\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u5074\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u306f\u8a31\u3057\u3066\u3082\u3001\u30b5\u30fc\u30d0\u5074\u3001\u63d0\u4f9b\u8005\u304c\u3001\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u306e\u6539\u5909\u3092\u8a31\u3055\u306a\u3044\u53ef\u80fd\u6027\u306f\u9ad8\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u5229\u7528\u8005\u30d5\u30a1\u30fc\u30b9\u30c8\u3058\u3083\u306a\u3044\u3093\u3067\u3059\u306d\u3002\u307e\u3042\u3001\u78ba\u304b\u306b\u5229\u7528\u8005\u81ea\u8eab\u306f\u4fe1\u983c\u3067\u304d\u306a\u3044\u3067\u3059\u304c\uff57<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u3082\u305d\u3082HTML\/HTTPS\u306e\u901a\u4fe1\u306fGo\u3067\u3084\u3063\u3066\u3001\u8868\u793a\u306f\u65e2\u5b58\u306e\u30d6\u30e9\u30a6\u30b6\u306b\u4efb\u305b\u308b\u3001\u3068\u3044\u3046\u69cb\u9020\u304c\u304c\u6709\u529b\u306a\u306e\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002\u3053\u308c\u306a\u3089\u3070\u3001\u30d6\u30e9\u30a6\u30b6\u306e\u30b3\u30fc\u30c9\u3068\u304bextension\u306b\u624b\u3092\u67d3\u3081\u308b\u5fc5\u8981\u306f\u9cf4\u3044\u3002\u305f\u3060\u3057\u3001\u958b\u767a\u306b\u306f\u304b\u306a\u308a\u30b3\u30b9\u30c8\u304c\u304b\u304b\u308a\u305d\u3046\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u4e00\u70b9\u7a81\u7834\u7684\u306b\u3001\u30ed\u30b0\u30a4\u30f3\u6642\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u79fb\u8ee2\u306b\u3060\u3051\u4f7f\u3048\u308b\u30a8\u30f3\u30b8\u30f3\u306a\u3089\u306a\u3093\u3068\u304b\u306a\u308b\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u3046\u304b\u3082\u77e5\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<h2>\u73fe\u5728\u306e\u30da\u30fc\u30b8\u306e\u30e6\u30fc\u30b6\u540d\u3092\u77e5\u308b<\/h2>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u308c\u3067\u306f\u307e\u305a\u3001\u6c17\u5408\u3092\u5165\u308c\u308b\u305f\u3081\u306b\u3053\u306e\u30d6\u30ed\u30b0\u8a18\u4e8b\u306bGShell\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059\u3002\u3067\u3001\u6628\u65e5\u5bdd\u308b\u524d\u306bMDN\u3067\u8aad\u3093\u3060<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Location\">Location API<\/a>\u3002 location.username \u3092 eval\u3002\u3053\u308c\u3060\u3051\u3067\u3044\u3051\u308b\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"1024\" height=\"943\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37-1024x943.png\" alt=\"\" class=\"wp-image-19452\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37-1024x943.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37-300x276.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37-768x707.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37-1536x1414.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.03.37.png 1588w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u6b8b\u5ff5\uff01<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6642\u4ee3\u932f\u8aa4\u3060\u3063\u305f\u6a21\u69d8\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Location\/username\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.14.42-1024x892.png\" alt=\"\" class=\"wp-image-19455\" width=\"512\" height=\"446\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.14.42-1024x892.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.14.42-300x261.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.14.42-768x669.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.14.42.png 1438w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Location\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-1024x816.png\" alt=\"\" class=\"wp-image-19457\" width=\"512\" height=\"408\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-1024x816.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-300x239.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-768x612.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-1536x1224.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-22-21.16.10-2048x1633.png 2048w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u601d\u3046\u306b\u3001\u305d\u308c\u306f\u3082\u3046obsolete\u3060\u304b\u3089\u3001\u4eca\u5f8c\u306f\u3053\u308c\u3092\u4f7f\u3048\u3063\u3066\u3044\u3046\u6307\u793a\u304c\u3042\u3063\u3066\u6b32\u3057\u3044\u3067\u3059\u3088\u306d\u3002\u30ef\u30f3\u30b9\u30c8\u30c3\u30d7\u30b5\u30fc\u30d3\u30b9\u3067\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u898f\u683c\u7cfb\u306e\u60c5\u5831\u6e90\u306f\u6b63\u78ba\u306a\u4e00\u6b21\u60c5\u5831\u3060\u3051\u306e\u8a18\u8f09\u306b\u7559\u3081\u308b\u306e\u306f\u4ed5\u65b9\u304c\u306a\u3044\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002\u3067\u3082\u5b9f\u969b\u6628\u5e74 table \u95a2\u4fc2\u306e col \u3060\u3063\u305f\u304b\u304c\u601d\u3063\u305f\u3088\u3046\u306b\u52b9\u304b\u306a\u304f\u3066\u63a2\u3057\u305f\u3089\u300cHTML5\u3067\u306f\u3053\u308c\u306f\u524a\u9664\u3055\u308c\u305f\u300d\u3068\u3060\u3051\u3042\u3063\u3066\u3001\u306a\u305c\u3001\u3044\u3064\u305d\u3046\u306a\u3063\u305f\u306e\u304b\u3001\u304c\u308f\u304b\u3089\u306a\u3044\u3002\u4ee3\u66ff\u306f\u4f55\u304b\u3082\u691c\u7d22\u3059\u308b\u306e\u306b\u6642\u9593\u304c\u304b\u304b\u3063\u3066\u3002\u3042\u306e\u6642\u306f\u975e\u5e38\u306b\u3001HTML5\u3068\u304b\u3044\u3046\u3082\u306e\u306b\u8179\u304c\u305f\u3063\u305f\u3082\u306e\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3067\u3059\u304c\u4e00\u65b9\u3067MDN\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u3067\u306e\u5b9f\u88c5\u72b6\u6cc1\u3068\u3044\u3046\u975e\u5e38\u306b\u30e9\u30a4\u30d6\u306a\u60c5\u5831\u3082\u30b5\u30fc\u30d3\u30b9\u3057\u3066\u3044\u308b\u308f\u3051\u3067\u3059\u3002\u305d\u308c\u304cMDN\u3092\u4fbf\u308a\u306b\u3057\u3066\u3044\u308b\u7406\u7531\u3067\u3082\u3042\u308b\u3093\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u306e\u30d6\u30e9\u30a6\u30b6\u306e\u7248\u306f\u4f55\u5e74\u306e\u3082\u306e\u3060\u3001\u3063\u3066\u3044\u3046\u60c5\u5831\u304c\u306a\u3044\u306e\u3082\u6b8b\u5ff5\u3067\u3059\u3002\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u66f4\u65b0\u306e\u6642\u9593\u8ef8\u3082\u308f\u304b\u3089\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6a5f\u68b0\u7684\u306b\u3001\u6614\u306e\u8a18\u8f09\u3092\u6b8b\u3057\u3066\u3001\u305d\u3053\u3078\u306e\u30ea\u30f3\u30af\u304c\u306f\u3063\u3066\u3042\u308c\u3070\u826f\u3044\u3068\u601d\u3046\u306e\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aWikiPedia\u306f\u305d\u306e\u70b9\u304c\u5b8c\u74a7\u3067\u3059\u306d\u3002\u3069\u3046\u3044\u3046\u8b70\u8ad6\u304c\u3042\u3063\u3066\u305d\u3046\u306a\u3063\u305f\u304b\u3082\u3061\u3083\u3093\u3068\u6b8b\u3055\u308c\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<h2>\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30b8\u30e3\u30fc\u53ec\u559a\u306e\u8853<\/h2>\n\n\n\n<p>\u958b\u767a\uff1a\u3068\u3044\u3046\u308f\u3051\u3067\u4ed5\u5207\u308a\u76f4\u3057\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3001JavaScript\u304b\u3089\u30c0\u30a4\u30ec\u30af\u30c8\u306b\u73fe\u5728\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u898b\u3048\u3061\u3083\u3046\u306a\u3093\u3066\u3001\u306e\u3069\u304b\u3059\u304e\u307e\u3059\u3088\u306d\u3002\u3042\u30fc\u3001\u9577\u9591\u3063\u3066\u66f8\u304f\u3093\u3067\u3059\u304b\u3002\u3067\u3082\u3001\u81ea\u5206\u3067\u306f\u66f8\u3051\u306a\u3044\u6f22\u5b57\u3068\u304b\u4f7f\u3044\u305f\u304f\u306a\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u308c\u3067\u601d\u3044\u51fa\u3057\u305f\u3093\u3067\u3059\u304c\u3001\u6628\u65e5 BlinderText \u3092\u4f5c\u3063\u305f\u6642\u306b\u3001\u300c\u3053\u306e\u30a8\u30ec\u30e1\u30f3\u30c8\u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u308c\u3066\u306d\u300d\u3063\u3066\u3044\u3046\u3001autofil \u6a5f\u80fd\u304cCSS\u306b\u3042\u3063\u305f\u306a\u3063\u3066\u3002HTTPS\u6587\u8108\u3058\u3083\u306a\u3044\u3068\u30d6\u30e9\u30a6\u30b6\u306e\u8b66\u544a\u304c\u3046\u308b\u3055\u304b\u3063\u305f\u304b\u4f55\u304b\u3067\u3084\u3081\u307e\u3057\u305f\u304c\u3002<\/p>\n\n\n\n<h2>\u30ec\u30f3\u30b8\u3067\u30c1\u30f3\u3067\u304d\u308b\u4e3c<\/h2>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3061\u3087\u3063\u3068\u304a\u8179\u304c\u7a7a\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6211\u304c\u793e\u3067\u306f\u30ab\u30c3\u30d7\u30e9\u30fc\u30e1\u30f3\u30d6\u30fc\u30e0\u304c\u4e0b\u706b\u3067\u30ec\u30c8\u30eb\u30c8\u30d6\u30fc\u30e0\u304c\u304d\u3066\u3044\u307e\u3059\u304c\u3001\u30ec\u30f3\u30b8\u3067\u5177\u3092\u4e57\u305b\u3066\u30c1\u30f3\u3057\u3066\u3082\u71b1\u304f\u306a\u3089\u306a\u3044\u4e3c\u304c\u3042\u308b\u3068\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u30a2\u30de\u30be\u30f3\u3067\u691c\u7d22\u3002\u5b89\u3044\u306e\u3067\u306f500\u5186\u30013000\u5186\u3042\u305f\u308a\u304c\u591a\u6570\u3001\u9ad8\u3081\u3060\u30685000\u5186\u300110000\u5186\u306a\u3093\u3066\u3044\u3046\u306e\u3082\u3042\u308a\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u8efd\u304f\u3066\u65ad\u71b1\u6027\u306e\u3042\u308b\u306e\u304c\u3044\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u9676\u5668\u3060\u3068\u3044\u3068\u3062\u7406\u2026\u3000macOS\u306e\u30c7\u30d5\u30a9\u30eb\u30c8IME\u3063\u3066\u3084\u3063\u3071\u308a\u30c0\u30e1\u3058\u3083\u306a\u3044\u3067\u3059\u304b\uff1f\u7cf8\u5c3b\u304c\u71b1\u304f\u306a\u3063\u305f\u308a\u3059\u308b\u306e\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u898b\u305f\u76ee\u306b\u3053\u308c\u3044\u3044\u306a\u3068\u601d\u3046\u3068\u30015000\u5186\u304f\u3089\u3044\u3057\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3053\u308c\u3001\u98df\u6750\u306e\u5165\u3063\u305f\u5199\u771f\u304c\u7121\u3044\u3068\u30b9\u30b1\u30fc\u30eb\u611f\u304c\u308f\u304b\u3089\u306a\u3044\u3067\u3059\u306d\u3002\u5bf8\u3060\u30a4\u30f3\u30c1\u3060\u3068\u66f8\u304b\u308c\u307e\u3057\u3066\u3082\u2026<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3053\u308c\u3063\u3066\u3001\u2261GShell\u3068\u304b\u30ed\u30b4\u306e\u5165\u3063\u305f\u30dc\u30a6\u30eb\u3060\u3068\u304b\u308f\u3044\u3044\u3067\u3057\u3087\u3046\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3053\u306e\u7f8e\u6fc3\u713c\u30e9\u30fc\u30e1\u30f3\u4e3c\u306f\u3044\u3044\u3067\u3059\u306d\u30021800\u5186\u3060\u3057\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5185\u5074\u304c\u304b\u3063\u3053\u3044\u3044\u3051\u3069\u3001\u5916\u5074\u304c\u3044\u307e\u3044\u3061\u306e\u3088\u3046\u306a\u300219.5cm \u3066\u30c7\u30ab\u3059\u304e\u307e\u305b\u3093\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u98df\u6750\u306e\u5165\u3063\u305f\u5229\u7528\u4f8b\u3092\u307f\u308b\u3068\u305d\u3046\u3067\u3082\u7121\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3058\u3083\u3053\u308c\u3092\u3072\u3068\u3064\u3002\u3061\u3087\u3063\u3068\u3053\u306e\u30e1\u30fc\u30ab\u30fc\u3067\u63a2\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3053\u306e\u76bf\u304c\u3059\u3054\u304f\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u300224.2cm\u3067\u3059\u3051\u3069\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u30ab\u30ec\u30fc\u3092\u98df\u3079\u308b\u306e\u306b\u826f\u3055\u305d\u3046\u3067\u3059\u3002\u3042\u3042\u3001\u3053\u3063\u3061\u306e\u3082\u826f\u3044\u3067\u3059\u306d\u3002\u3084\u3063\u3071\u308a\u65e5\u672c\u88fd\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3042\u3001\u3053\u306e\u5c0f\u3055\u3081\u306e3\u70b9\u30bb\u30c3\u30c8\u3001\u3044\u3044\u611f\u3058\u3060\u3057\u3059\u3054\u304f\u304a\u624b\u9803\u4fa1\u683c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308c\u3082\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046\u3002\u305d\u308d\u305d\u308d\u63a2\u3057\u75b2\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u305f\u3060\u3044\u307e\u3001\u30ab\u30fc\u30c8\u306e\u7dcf\u8a08\u300110\u70b9\u306733,661\u5186\u3067\u3059\uff08\u7b11\uff09<\/p>\n\n\n\n<p>\u793e\u9577\uff1a3000\u5186\u4ee5\u4e0a\u306e\u3068\u3001\u30d7\u30e9\u30a4\u30e0\u3058\u3083\u306a\u3044\u306e\u3092\u5168\u524a\u9664\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u3077\u3061\u3077\u3061\u3077\u3061\u3063\u2026\u30003\u4ef6\u30675090\u5186\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308c\u3067Go\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1aOpera\u306b\u30a2\u30de\u30be\u30f3business\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u6559\u3048\u3066\u3044\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u304b\u3061\u3083\u304b\u3061\u3083\u3002\u3067\u3082\u3001\u3053\u308c\u306f\u7d4c\u8cbb\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3061\u3087\u3063\u3068\u5f85\u3063\u305f\u3002\u305d\u306e\u5b89\u30443\u70b9\u30bb\u30c3\u30c8\u3001\u96fb\u5b50\u30ec\u30f3\u30b8\u5bfe\u5fdc\u3067\u306f\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4f55\u304b\u3089\u4f55\u307e\u3067\u30c1\u30f3\u3059\u308b\u308f\u3051\u3067\u3082\u306a\u3044\u3067\u3059\u3051\u3069\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3082\u3063\u3068\u5c0f\u3055\u3081\u306e\u3082\u6b32\u3057\u3044\u304b\u306a\u3002\u3053\u306e\u307e\u3063\u3057\u308d\u7121\u5730\u3067\u3075\u306b\u3083\u3063\u3068\u5f62\u72b6\u306e\u304c\u826f\u3044\u3067\u3059\u3002\u304a\u5024\u6253\u3061\u3060\u3057\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a11cm, 14cm, 18cm\u3001\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3058\u3083\u3042\u305d\u308c\u3067\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30b3\u30fc\u30d2\u30fc\u30ab\u30c3\u30d7\u3082\u6b32\u3057\u3044\u3067\u3059\u306d\u3002\u3053\u306e\u4f55\u5341\u5e74\u3082\u306e\u306e\u5b89\u7269\u3057\u304b\u306a\u304f\u3066\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5272\u308c\u305f\u3089\u8003\u3048\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u3067\u306f\u3053\u308c\u3067\u3002\u3042\u3001\u3044\u3061\u3069\u898b\u7a4d\u66f8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u898b\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4e00\u70b9\u3060\u3051\u6cd5\u4eba\u4fa1\u683c\u3063\u3066\u3042\u308a\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3053\u306e\u4f1a\u793e\u306f\u7a0e\u8fbc\u307f\u3067\u30b8\u30e3\u30b9\u30c8\u306b\u306a\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u307e\u3042\u666e\u901a\u306e\u4f1a\u793e\u3060\u3068\u3053\u308c\u3092\u4e0a\u306b\u4e0a\u3052\u3066\u627f\u8a8d\u3092\u3068\u308b\u308f\u3051\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u627f\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u3067\u306f\u3077\u3061\u3063\u3002\u660e\u5f8c\u65e5\u5348\u524d\u4e2d\u7740\u3067\u3059\u3002\u5bfe\u9762\u914d\u9054\u9078\u629e\u53ef\u80fd\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u7f6e\u304d\u914d\u3067\u3002<\/p>\n\n\n\n<p>\u7d4c\u7406\uff1a\u6ce8\u6587\u3092\u78ba\u5b9a\u3059\u308b\u3002\u3077\u3061\u3063\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u3046\u3044\u3048\u3070\u4eca\u56de\u306f\u3001\u6ce8\u6587ID\u306e\u8a2d\u5b9a\u3092\u805e\u304b\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u306a\u3093\u304b\u5165\u308a\u53e3\u304c\u9055\u3063\u305f\u3093\u3067\u3059\u3057\u3087\u3046\u304b\u306d\uff1f\u3042\u306e\u6a5f\u80fd\u3092\u3084\u3081\u3061\u3083\u3063\u305f\u3068\u304b\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3046\u3061\u3067\u306f\u3068\u308a\u3042\u3048\u305a\u5fc5\u8981\u306a\u3044\u3067\u3059\u304b\u3089\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u5024\u6bb5\u3068\u30c7\u30b6\u30a4\u30f3\u3067\u9078\u3093\u3060\u3089\u3001\u7d50\u679c\u7684\u306b\u65e5\u672c\u306e3\u793e\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306e\u90e8\u54c1\u3068\u304b\u3001\u6d77\u5916\u88fd\u304c\u5618\u307f\u305f\u3044\u306b\u5b89\u3044\u3067\u3059\u3051\u3069\u306d\u3002\u98df\u5668\u306a\u3093\u3066\u539f\u4fa1\u306f\u5927\u3057\u305f\u3053\u3068\u306a\u3044\u3068\u601d\u3046\u306e\u3067\u3059\u304c\u3001\u30bb\u30f3\u30b9\u306e\u58c1\u307f\u305f\u3044\u306a\u306e\u304c\u3042\u308b\u3093\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u98df\u6d17\u6a5f\u3063\u3066\u3044\u3046\u306e\u306f\u3069\u3046\u306a\u3093\u3067\u3057\u3087\u3046\u306d\uff1f<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u6d17\u3044\u7269\u4f5c\u696d\u81ea\u4f53\u3068\u3044\u3046\u3088\u308a\u3001\u8170\u304c\u75db\u304f\u306a\u308b\u306e\u304c\u554f\u984c\u3060\u3068\u601d\u3044\u307e\u3059\u304b\u3089\u3001\u305d\u308c\u306e\u5bfe\u7b56\u3068\u3057\u3066\u306f\u826f\u3044\u304b\u3082\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6614\u3001\u6d17\u3044\u7269\u3092\u4e00\u30f6\u6708\u304f\u3089\u3044\u653e\u7f6e\u3057\u3066\u305f\u3089\u3001\u4e0b\u7a4d\u307f\u306b\u306a\u3063\u3066\u305f\u76bf\u304b\u3089\u30e1\u30ed\u30f3\u7a2e\u304c\u305e\u305e\u305e\u30fc\u3063\u3068\u82bd\u3092\u51fa\u3057\u3066\u3001\u3055\u308f\u3063\u305f\u3089\u3055\u308f\u3055\u308f\u3063\u3068\u3057\u3066\u6c17\u6301\u3061\u3088\u304b\u3063\u305f\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30e1\u30ed\u30f3\u7248\u306e\u304b\u3044\u308f\u308c\u3067\u3059\u306d\u3002\u98df\u3079\u3066\u307f\u307e\u3057\u305f\u304b\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6c17\u304c\u56de\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5927\u6839\u306a\u3093\u304b\u3082\u5e7c\u5c11\u306e\u307f\u304e\u308a\u304b\u3089\u5927\u6839\u3089\u3057\u3055\u304c\u3042\u308a\u307e\u3059\u304b\u3089\u306d\u3002\u30e1\u30ed\u30f3\u306e\u9999\u308a\u304c\u3059\u308b\u306e\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u5b50\u4f9b\u306e\u3053\u308d\u306f\u305f\u3060\u306e\u304d\u3085\u30fc\u3061\u3083\u3093\u304b\u3082\u3057\u308c\u306a\u3044\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3068\u3053\u308d\u3067\u3053\u306e\u30ec\u30c8\u30eb\u30c8\u30ab\u30ec\u30fc\u3001\u5c01\u3092\u5207\u3089\u305a\u306b\u30ec\u30f3\u30b8\u306b\u304b\u3051\u308d\u3068\u3002\u84b8\u6c17\u3092\u9003\u3059\u5f01\u304c\u3064\u3044\u3066\u308b\u3093\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u6e29\u307e\u3063\u3066\u304b\u3089\u958b\u3051\u308b\u3068\u4e2d\u8eab\u304c\u6b8b\u3089\u306a\u304f\u3066\u7121\u99c4\u304c\u306a\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u554f\u984c\u306f\u5473\u3067\u3059\u304c\u2026\u3000\u306f\u3075\u306f\u3075\u2026\u3000\u5408\u683c\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u30cf\u30d5\u30cf\u30d5\u3002\u3053\u308c\u3063\u3066\u3001\u91a4\u6cb9\u306e\u30d1\u30c3\u30af\u306e\u5bc6\u9589\u53e3\u4ee5\u6765\u306e\u30d2\u30c3\u30c8\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3082\u3050\u3082\u3050\u3002\u307e\u3042\u6709\u52b9\u6027\u306e\u30a4\u30f3\u30d1\u30af\u30c8\u7684\u306b\u306f\u3042\u308c\u306b\u307e\u3055\u308b\u767a\u660e\u306f\u306a\u304b\u306a\u304b\u7121\u3044\u3068\u601d\u3044\u307e\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u91a4\u6cb9\u3063\u3066\u3059\u3050\u306b\u9178\u5316\u3057\u3066\u60b2\u60e8\u3067\u3057\u305f\u304b\u3089\u306d\u3002\u3042\u308c\u306f\u91a4\u6cb9\u306e\u6b74\u53f2\u4e0a\u307f\u3093\u306a\u304c\u305d\u3046\u3044\u3046\u3082\u306e\u3060\u3068\u8ae6\u3081\u3066\u3044\u305f\u554f\u984c\u3092\u89e3\u6c7a\u3057\u3066\u3057\u307e\u3063\u305f\u7d20\u6674\u3089\u3057\u3044\u6280\u8853\u3060\u3068\u601d\u3044\u307e\u3059\u3002\u3082\u3050\u3082\u3050\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6280\u8853\u304c\u7d20\u6674\u3089\u3057\u3044\u3068\u3044\u3046\u304b\u3001\u4eca\u306a\u3089\u6280\u8853\u3067\u5b89\u4fa1\u306b\u89e3\u6c7a\u3067\u304d\u308b\u554f\u984c\u3060\u3068\u601d\u3044\u5f97\u305f\u3068\u3044\u3046\u70b9\u3067\u3059\u306d\u3002\u3054\u3061\u305d\u3046\u3055\u307e\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3001\u3042\u308c\u3092\u3042\u306e\u5f62\u3067\u5e97\u306b\u51fa\u3057\u305f\u3089\u304b\u3063\u3053\u60aa\u3044\u304b\u3089\u3001\u4f53\u88c1\u3092\u6c17\u306b\u3059\u308b\u5e97\u3067\u306f\u4f7f\u308f\u306a\u3044\u3002\u306a\u306e\u3067\u3001\u9ad8\u3044\u5e97\u306e\u307b\u3046\u304c\u9006\u306b\u91a4\u6cb9\u304c\u307e\u305a\u304b\u3063\u305f\u308a\u3059\u308b\u308f\u3051\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6b21\u306e\u30d5\u30a7\u30fc\u30ba\u306f\u3001\u898b\u305f\u76ee\u306b\u30ab\u30c3\u30b3\u826f\u304f\u3066\u3001\u4f7f\u3044\u6368\u3066\u3067\u306f\u306a\u3044\u91a4\u6cb9\u3055\u3057\u306e\u5b9f\u73fe\u6280\u8853\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u4f7f\u3044\u6368\u3066\u3067\u3082\u5927\u3057\u305f\u3053\u3068\u306a\u3044\u6d17\u5264\u306e\u5bb9\u5668\u3068\u304b\u3067\u3082\u8a70\u3081\u66ff\u3048\u30d1\u30c3\u30af\u304c\u666e\u901a\u306a\u306e\u3067\u3001\u305d\u3046\u3044\u3046\u5f62\u3067\u3082\u62b5\u6297\u611f\u306f\u5c11\u306a\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5c0f\u3055\u304f\u8efd\u304f\u4f5c\u3089\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u304c\u6280\u8853\u7684\u306a\u56f0\u96e3\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308c\u3067\u3001\u601d\u3044\u51fa\u3057\u305f\u306e\u3067\u3059\u304c\u3001\u305d\u308d\u305d\u308d\u934b\u306e\u5b63\u7bc0\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u767d\u83dc\u304c\u5b89\u304f\u306a\u308b\u3068\u826f\u3044\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308d\u305d\u308d\u5409\u7530\u62d3\u90ce\u3082\u98fd\u304d\u305f\u306e\u3067\u3001\u6614 iPhone \u306b\u305f\u3081\u305f\u306e\u3092\u8272\u3005\u3064\u304f\u3063\u305f\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u3067\u8074\u304d\u305f\u3044\u3067\u3059\u3002iMac\u3067\u64cd\u4f5c\u3057\u3066\u3001iMac\u306e\u30b9\u30d4\u30fc\u30ab\u30fc\u3067\u8074\u304d\u305f\u3044\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1aiPhone\u3092iMac\u306b\u63a5\u7d9a\u2026\u3000\u3053\u3046\u3044\u3046\u4e8b\u306b\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52-1024x386.png\" alt=\"\" class=\"wp-image-19500\" width=\"400\" height=\"151\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52-1024x386.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52-300x113.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52-768x289.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52-1536x579.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.05.52.png 1598w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u4ed6\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3063\u3066\u306a\u3093\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u81ea\u5206\u3067\u8cb7\u3063\u305fCD\u3068iTunes\u304b\u3089\u8cb7\u3063\u305f\u66f2\u3057\u304b\u5165\u3063\u3066\u306a\u3044\u3067\u3059\u304c\u3001\u305d\u308c\u3082\u524a\u9664\u3055\u308c\u3061\u3083\u3046\u3066\u610f\u5473\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u3046\u3044\u3046\u4e8b\u307f\u305f\u3044\u3067\u3059\u306d\u3002\u300c\u3053\u306eiPhone\u3092\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u3068\u540c\u671f\u3059\u308b\u3068\u3001\u6614\u306eMacBookAir\u4e0a\u306e\u5225\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u304b\u3089\u306e\u30e1\u30c7\u30a3\u30a2\u306f\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3059\u3002iPhone\u306f\u4e00\u5ea6\u306b1\u53f0\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u3068\u3057\u304b\u540c\u671f\u3067\u304d\u307e\u305b\u3093\u300d\u3068\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u300c\u7f6e\u304d\u63db\u3048\u3089\u308c\u308b\u300d\u3063\u3066\u300c\u524a\u9664\u3055\u308c\u308b\u300d\u3063\u3066\u610f\u5473\u3067\u3059\u3088\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5225\u306b\u540c\u671f\u3057\u305f\u3044\u308f\u3051\u3067\u306a\u304f\u3066\u3001\u5358\u306biMac\u3092iPhone\u306e\u30ea\u30e2\u30b3\u30f3\u306b\u3067\u304d\u308c\u3070\u826f\u3044\u306e\u3067\u3059\u304c\u3002\u3044\u3084\u3001\u30aa\u30fc\u30c7\u30a3\u30aa\u306e\u51fa\u529b\u5148\u3068\u3057\u3066\u3082\u4f7f\u3044\u305f\u3044\u3067\u3059\u304c\u2026\u3000\u3093\uff1f\u307e\u3066\u3088\u3001\u6614\u306eMacBookAir\u306f\u30ad\u30fc\u30dc\u30fc\u30c9\u304c\u30d0\u30fc\u30dc\u30f3\u6f2c\u3051\u306b\u306a\u3063\u3066\u6b7b\u3093\u3067\u307e\u3059\u304c\u3001\u4ed6\u306f\u751f\u304d\u3066\u308b\u3093\u3067\u3059\u3002\u3042\u308c\u3092\u5fa9\u6d3b\u3055\u305b\u3066\u306f\u3069\u3046\u3067\u3057\u3087\u3046\u3002\u753b\u9762\u5171\u6709\u3067\u5236\u5fa1\u3059\u308c\u3070\u5341\u5206\u304b\u3068\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30aa\u30fc\u30c7\u30a3\u30aa\u306f\u753b\u9762\u5171\u6709\u3067iMac\u306b\u306f\u6301\u3063\u3066\u3053\u308c\u306a\u3044\u3088\u3046\u306a\u6c17\u3082\u3057\u307e\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6301\u3063\u3066\u3053\u308c\u305f\u3068\u3057\u3066\u3082\u3001\u901a\u4fe1\u304c\u6df7\u3093\u3067\u308b\u3068\u96d1\u97f3\u304c\u5165\u308b\u3068\u304b\u60b2\u3057\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5f15\u304d\u7d9a\u304d\u691c\u8a0e\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u305d\u3046\u3053\u3046\u3057\u3066\u3044\u308b\u3046\u3061\u306b\u3001\u3082\u3046\u7d42\u696d\u6642\u9593\u304c\u8fd1\u3065\u3044\u3066\u304d\u305f\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<h2>\u8a8d\u8a3c\u60c5\u5831\u306eJavaScirpt\u3067\u306e\u8aad\u307f\u51fa\u3057<\/h2>\n\n\n\n<p>\u958b\u767a\uff1a\u4eca\u65e5\u306f\u307e\u3060\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u9001\u4fe1\u30c6\u30b9\u30c8\u7528\u306eHTML\u3092\u6570\u884c\u66f8\u3044\u305f\u3060\u3051\u3067\u3059\uff57<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3068\u3053\u308d\u3067\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u3001\u3053\u3053\u3067\u8003\u3048\u3066\u3044\u308b\u30e6\u30fc\u30b6\u540d\u3084\u30d1\u30b9\u30ef\u30fc\u30c9\u3063\u3066\u3001HTTP\u3067\u9001\u3089\u308c\u308bbasic\u3068\u304bdigest\u306eauthorization\u3058\u3083\u306a\u304f\u3066\u3001\u3042\u304f\u307e\u3067HTML\u306e\u4e2d\u306eform data\u304bURL\u306e\u4e2d\u306e\u7b49\u4fa1\u306a\u305d\u308c\u306e\u4e8b\u3058\u3083\u306a\u3044\u304b\u3063\u3066\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u3046\u8a00\u3048\u3070\u3002HTML\u306e\u30b3\u30f3\u30c6\u30af\u30b9\u30c8\u306e\u4e2d\u3067\u8a9e\u3089\u308c\u3066\u307e\u3059\u3057\u306d\u3002\u307e\u3042\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u8a18\u61b6\u3059\u308b\u8a8d\u8a3c\u60c5\u5831\u3068\u3057\u3066\u3001\u305d\u306e2\u3064\u3092\u533a\u5225\u3057\u3066\u3044\u308b\u306e\u304b\u3069\u3046\u304b\u308f\u304b\u308a\u307e\u305b\u3093\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u8abf\u3079\u308b\u306e\u3082\u624b\u9593\u304c\u304b\u304b\u308a\u307e\u3059\u304b\u3089\u3001\u5b9f\u969b\u306b\u52d5\u304b\u3057\u3066\u78ba\u304b\u3081\u307e\u3059\u3002\u672c\u65e5\u306e GShell work product \u306f\u3053\u306e6\u884c\u3067\u3059\u3002\u3067\u3001\u3053\u308c\u3092\u30d6\u30e9\u30a6\u30b6\u3067\u8868\u793a\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.05.52-1024x359.png\" alt=\"\" class=\"wp-image-19510\" width=\"512\" height=\"180\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.05.52-1024x359.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.05.52-300x105.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.05.52-768x269.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.05.52.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u30fc\u3001\u3053\u308c\u3067\u3059\u306d\u6628\u65e5\u3046\u3056\u3044\u3068\u601d\u3063\u305f\u306e\u306f\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.41.41-1024x424.png\" alt=\"\" class=\"wp-image-19501\" width=\"512\" height=\"212\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.41.41-1024x424.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.41.41-300x124.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.41.41-768x318.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.41.41.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u3001\u3067\u3082\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5165\u529b\u3067\u306f\u3061\u3087\u3063\u3068\u671f\u5f85\u3092\u6301\u305f\u305b\u308b\u3088\u3046\u306a\u4f55\u304b\u304c\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.45.41-1024x419.png\" alt=\"\" class=\"wp-image-19502\" width=\"512\" height=\"210\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.45.41-1024x419.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.45.41-300x123.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.45.41-768x314.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.45.41.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u30d1\u30b9\u30ef\u30fc\u3092\u5165\u308c\u3066submit\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.47.14-1024x419.png\" alt=\"\" class=\"wp-image-19503\" width=\"512\" height=\"210\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.47.14-1024x419.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.47.14-300x123.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.47.14-768x314.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.47.14.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u57fa\u76e4\uff1a\u300c\u958b\u793a\u300d\u3063\u3066\u3001\u672c\u4eba\u4ee5\u5916\u306b\u6559\u3048\u3061\u3083\u3046\u4e8b\u3067\u3059\u3088\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4fdd\u5b58\u3059\u308b\u3002\u3067\u3001\u3082\u3046\u4e00\u5ea6\u30d5\u30a9\u30fc\u30e0\u3092\u898b\u306b\u884c\u304f\u2026<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.52.39-1024x419.png\" alt=\"\" class=\"wp-image-19505\" width=\"512\" height=\"210\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.52.39-1024x419.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.52.39-300x123.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.52.39-768x314.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.52.39.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u81ea\u52d5\u3067 fill \u306f\u3055\u308c\u3066\u306a\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305f\u3076\u3093\u3001\"on\" \u3067\u306f\u6307\u793a\u304c\u5f31\u3044\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u3002\u3068\u3082\u304b\u304f\u300caaa \u3053\u306e\u30b5\u30a4\u30c8\u304b\u3089\u300d\u3092\u30af\u30ea\u30c3\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.54.18-1024x419.png\" alt=\"\" class=\"wp-image-19506\" width=\"512\" height=\"210\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.54.18-1024x419.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.54.18-300x123.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.54.18-768x314.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.54.18.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u30e6\u30fc\u30b6\u306e\u3059\u3079\u304d\u64cd\u4f5c\u3068\u3057\u3066\u306f\u3001\u3069\u3046\u3067\u3082\u3044\u3044\u8a8d\u8a3c\u4ee5\u5916\u3067\u306a\u3051\u308c\u3070\u3001\u3053\u306e\u307b\u3046\u304c\u826f\u3044\u304b\u3082\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3067\u3001\u554f\u984c\u306f\u3053\u306eUN\u3068PW\u3092eval\u3067\u8aad\u3081\u308b\u304b\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.58.36-1024x822.png\" alt=\"\" class=\"wp-image-19507\" width=\"512\" height=\"411\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.58.36-1024x822.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.58.36-300x241.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.58.36-768x616.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-1.58.36.png 1368w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u554f\u984c\u306a\u3057\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u308c\u30fc\u3001Firefox \u306f autocomplete=current-password \u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u306a\u3044\u3093\u3067\u3059\u304b\u306d\u3002MDN\u3092\u898b\u308b\u2026\u3000\u304a\u3063\u3068\u3001<a href=\"https:\/\/mdn-web-dna.s3-us-west-2.amazonaws.com\/MDN-Browser-Compatibility-Report-2020.pdf\">\u3053\u3046\u3044\u3046\u304a\u3059\u3059\u3081\u304c\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7<\/a>\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/mdn-web-dna.s3-us-west-2.amazonaws.com\/MDN-Browser-Compatibility-Report-2020.pdf\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.11.53-1024x400.png\" alt=\"\" class=\"wp-image-19513\" width=\"512\" height=\"200\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.11.53-1024x400.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.11.53-300x117.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.11.53-768x300.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.11.53.png 1496w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u308c\u3092\u30d3\u30e5\u30fc\u30c6\u30a3\u30d5\u30eb\u30ef\u30fc\u30eb\u30c9\u3063\u3066\u8a00\u3044\u307e\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u304d\u3061\u3093\u3068\u3057\u3066\u308b\u4e8b\u304c\u597d\u304d\u306a\u4eba\u3067\u3057\u3087\u3046\u306d\u3002\u307e\u3042\u305d\u3046\u3044\u3046\u30a6\u30a7\u30d6\u958b\u767a\u8005\u3082\u3044\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1aA\u3067\u3059\u304b\u3089\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3067\u3082\u5185\u5bb9\u306f\u3001\u307e\u3055\u306b\u3046\u3061\u304c\u6b32\u3057\u304c\u3063\u3066\u308b\u60c5\u5831\u306e\u7dcf\u307e\u3068\u3081\u307f\u305f\u3044\u306a\u611f\u3058\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aautocomplete\u306f\u3001\u30c8\u30e9\u30d6\u30eb\u30e1\u30fc\u30ab\u30fc\u306e\u7b2c\uff14\u4f4d\u306b\u30e9\u30f3\u30af\u30a4\u30f3\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-1024x1016.png\" alt=\"\" class=\"wp-image-19516\" width=\"512\" height=\"508\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-1024x1016.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-300x298.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-150x150.png 150w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-768x762.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05-100x100.png 100w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.19.05.png 1496w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u3057\u304b\u3057\u3053\u306ePDF\u3001\u8457\u8005\u3082\u65e5\u4ed8\u3082\u30da\u30fc\u30b8\u756a\u53f7\u3082\u306a\u3044\u3063\u3066\u3001\u3069\u3046\u3057\u305f\u3082\u306e\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u3001\u8457\u8005\u306f A Web Developer \u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002URL\u306f\u4ee5\u4e0b\u3002<\/p>\n\n\n\n<p class=\"has-small-font-size\"><a href=\"https:\/\/mdn-web-dna.s3-us-west-2.amazonaws.com\/MDN-Browser-Compatibility-Report-2020.pdf\">https:\/\/mdn-web-dna.s3-us-west-2.amazonaws.com\/MDN-Browser-Compatibility-Report-2020.pdf<\/a><\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u307e\u3055\u304b\u3053\u308c\u3001\u30e9\u30a4\u30c8\u30bb\u30fc\u30eb\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u5225\u306b\u56f0\u7aae\u306f\u3057\u3066\u306a\u3044\u3093\u3058\u3083\u306a\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u3051\u3069\u306d\u3002Wikipedia\u3068\u9055\u3063\u3066\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u308c\u306f\u3068\u3082\u304b\u304f\u3001\u300c\u4fdd\u5b58\u3055\u308c\u305f\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u3092\u8868\u793a\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u3001Firefox\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u306f\u306a\u304b\u306a\u304b\u304b\u308f\u304b\u308a\u3084\u3059\u304f\u51fa\u6765\u3066\u3044\u308b\u3053\u3068\u3082\u308f\u304b\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01-1024x913.png\" alt=\"\" class=\"wp-image-19520\" width=\"512\" height=\"457\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01-1024x913.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01-300x267.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01-768x685.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01-1536x1369.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-2.30.01.png 1678w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3055\u3059\u304c\u306b\u300c\u958b\u793a\u300d\u3067\u306f\u7121\u3044\u6a21\u69d8\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3053\u306e\u975e\u8868\u793a\u306e\u307e\u307e\u3001\u901a\u5e38\u306e\u30b3\u30d4\u30fc\u3067\u3001\u96a0\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u304c\u30af\u30ea\u30c3\u30d7\u3067\u304d\u308b\u4e00\u822c\u7684\u306a\u898f\u7d04\u304c\u3042\u308b\u3068\u826f\u3044\u3068\u601d\u3046\u3093\u3067\u3059\u3051\u3069\u306d\u3002BlinderText\u3068\u3057\u3066\u3082\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3068\u3081\u308b\u3068\u3001\u8a8d\u8a3c\u60c5\u5831\u3068\u3044\u3046\u304bform\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u306efill\u306b\u306f\u8272\u3005\u898f\u7d04\u304c\u3042\u308b\u3051\u308c\u3069\u3001\u3044\u3063\u305f\u3093fill\u3055\u308c\u305f\u3089\u5358\u306b\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u5024\u3060\u3068\u8a00\u3046\u4e8b\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3060\u3068\u601d\u3044\u307e\u3059\u3002\u307e\u3042\u3001form\u306e\u4e2d\u3001input\u3067\u306a\u304f\u3066\u3082\u3001autocomplete=password \u306f\u4f7f\u3048\u308b\u306f\u305a\u306a\u3093\u3067\u3059\u3051\u3069\u306d\u3002 textarea\u3067\u3082\u3002\u3067\u306a\u3044\u3068\u3001\u666e\u901a\u306btextarea\u3067\u3042\u308bBlinderText\u7684\u306b\u306f\u3061\u3087\u3063\u3068\u6b8b\u5ff5\u306a\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3067\u6838\u5fc3\u306f\u3001\u4efb\u610f\u306e\u30b5\u30a4\u30c8\u306e\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u3092\u53ec\u559a\u3067\u304d\u308b\u304b\u3068\u3044\u3046\u70b9\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3082\u3057 action \u306b\u4ed6\u306e\u30b5\u30a4\u30c8\u3092\u66f8\u3044\u3066\u547c\u3073\u51fa\u305b\u305f\u3089\u53ef\u80fd\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u6050\u308d\u3057\u3059\u304e\u308b\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u30c0\u30e1\u3067\u3057\u3087\u3046\u3051\u3069\u3002\u4f55\u304b\u7279\u5225\u306e\u78ba\u8a8d\u624b\u9806\u3092\u7d4c\u308c\u3070\u51fa\u6765\u308b\u53ef\u80fd\u6027\u306f\u306a\u304d\u306b\u3057\u3082\u3042\u3089\u305a\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3084\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u5b9f\u9a13\u306b\u3057\u3066\u3082\u6050\u308d\u3057\u3044\u306e\u3067\u2026\u3000\u307e\u3042\u3042\u306e\u30bf\u30b3\u30eb\u30fc\u30bf\u3067\u8a66\u3057\u307e\u3057\u3087\u3046\u3002\u8a8d\u8a3c\u753b\u9762\u306e\u30bd\u30fc\u30b9\u3092\u898b\u308b\u2026\u3000\u30d5\u30a3\u30fc\u30eb\u30c9\u540d\u306f user \u3068 pass \u3067\u3059\u306d\u3002\u3067\u306f\u3053\u308c\u3067\u3001\u3077\u3061\u3063\uff01<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.05.22-1024x574.png\" alt=\"\" class=\"wp-image-19524\" width=\"512\" height=\"287\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.05.22-1024x574.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.05.22-300x168.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.05.22-768x430.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.05.22.png 1496w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u57fa\u76e4\uff1a\u51e6\u7406\u4e2d\u3063\u3066\u306a\u3093\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4f8b\u306b\u3088\u3063\u3066\u30ea\u30d6\u30fc\u30c8\u6e96\u5099\u4e2d\u3068\u304b\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3069\u3046\u3084\u3063\u3066\u81ea\u5206\u3058\u3083\u306a\u3044\u30b5\u30a4\u30c8\u304b\u3089\u98db\u3070\u3055\u308c\u3066\u6765\u305f\u304b\u3092\u8b58\u5225\u3057\u3066\u308b\u304b\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aReferer \u304b Cookie\u3067\u3059\u304b\u306d\u3002\u3067\u3082Referer\u306f\u7c21\u5358\u306b\u8a50\u79f0\u3067\u304d\u308b\u3057\u3002\u3042\u3042\u3001\u30ed\u30b0\u30a4\u30f3\u753b\u9762\u306eform\u306e\u4e2d\u306b\u3001hidden \u3067\u30bb\u30c3\u30b7\u30e7\u30f3ID\u304c\u5165\u3063\u3066\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.29.41-1024x85.png\" alt=\"\" class=\"wp-image-19529\" width=\"512\" height=\"43\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.29.41-1024x85.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.29.41-300x25.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.29.41-768x64.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-3.29.41.png 1496w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3053\u308c\u3001\u4e00\u5ea6\u30b2\u30c3\u30c8\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3ID\u3092\u540c\u3058\u307e\u307e\u305a\u3063\u3068\u30d5\u30a9\u30fc\u30e0\u306e\u4e2d\u3067\u6295\u3052\u7d9a\u3051\u3066\u3044\u308b\u3088\u3046\u306b\u601d\u3048\u308b\u306e\u3067\u3059\u304c\u3002\u4e00\u65e6ID\u3092\u76d7\u307e\u308c\u305f\u3089\u6210\u308a\u6e08\u307e\u3055\u308c\u653e\u984c\u306e\u3088\u3046\u306a\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u306a\u3093\u3067HTTP\u306e\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u8a8d\u8a3c\u3092\u4f7f\u308f\u306a\u3044\u3093\u3067\u3057\u3087\u3046\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u3001\u3044\u3084\u3001\u30bb\u30c3\u30b7\u30e7\u30f3ID\u306f\u6bce\u56de\u5909\u3048\u3066\u307e\u3059\u306d\u3002\u3060\u304b\u3089\u5272\u308a\u8fbc\u3080\u30c1\u30e3\u30f3\u30b9\u306f\u3001\u672c\u6765\u306e\u6301\u3061\u4e3b\u304c\u6b21\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51fa\u3059\u524d\u306b\u3001\u76d7\u3093\u3067\u7e4b\u3044\u3058\u3083\u3046\u3068\u3044\u3046\u3053\u3068\u3067\u306f\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u305d\u308c\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u30cf\u30a4\u30b8\u30e3\u30c3\u30af\u3066\u547c\u3070\u308c\u308b\u3093\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1aTCP\u306e\u30bd\u30fc\u30b9\u306e\u30dd\u30fc\u30c8\u756a\u53f7\u3092\u898b\u3066\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306d\u3002\u307e\u3042\u3001\u30d7\u30ed\u30ad\u30b7\u304b\u3089\u6765\u3066\u305f\u3089\u533a\u5225\u3064\u304b\u306a\u3044\u3067\u3059\u304c\u3002\u540c\u3058\u30bd\u30fc\u30b9\u30dd\u30fc\u30c8\u3092\u7e70\u308a\u8fd4\u3057\u4f7f\u3046\u306e\u3082\u4e00\u822c\u30e6\u30fc\u30b6\u6a29\u9650\u3067\u306f\u51fa\u6765\u306a\u304b\u3063\u305f\u3068\u601d\u3044\u307e\u3059\u3057\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u30bb\u30c3\u30b7\u30e7\u30f3\u30ec\u30b9\u3067\u6697\u53f7\u5316\u3055\u308c\u3066\u306a\u3044\u901a\u4fe1\u3067\u30ed\u30b0\u30a4\u30f3\u3063\u3066\u3084\u3063\u3071\u308a\u30c0\u30e1\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u306a\u306e\u3067APOP\u3068\u304bHTTP\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u8a8d\u8a3c\u3068\u304b\u304c\u3042\u308b\u3093\u3060\u3068\u601d\u3046\u3093\u3067\u3059\u304c\u3001\u306a\u3093\u3067\u4f7f\u308f\u306a\u3044\u3093\u3067\u3057\u3087\u3046\u306d\uff1f\u516c\u958b\u8a18\u4e8b\u307f\u305f\u3044\u306b\u3001\u901a\u4fe1\u5185\u5bb9\u7684\u306b\u306f\u516c\u958b\u60c5\u5831\u306a\u3093\u3060\u3051\u3069\u3001\u8ab0\u304c\u305d\u308c\u3092\u3084\u3063\u3066\u308b\u304b\u3060\u3051\u8a3c\u660e\u3057\u305f\u3044\u4e8b\u3082\u591a\u3044\u3068\u601d\u3046\u3093\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u591a\u304f\u306f\u306a\u3044\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002\u30cd\u30c3\u30c8\u30cb\u30e5\u30fc\u30b9\u3068\u304b\u306e\u6642\u4ee3\u3068\u9055\u3063\u3066\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3053\u308c\u306f\u9762\u767d\u3044\u306e\u3067\u3001\u5225\u306e\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30bb\u30c3\u30b7\u30e7\u30f3\u30cf\u30a4\u30b8\u30e3\u30c3\u30af\u5b9f\u9a13\u3082\u3084\u308a\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u306a\u308a\u3059\u307e\u3057\u30b5\u30a4\u30c8\u304b\u3089\u98db\u3070\u3055\u308c\u3066\u6765\u305f\u306e\u3092\u77e5\u3063\u305f\u3089\u3001\u3059\u3050\u306b\u305d\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u51cd\u7d50\u3059\u3079\u304d\u3067\u3059\u3088\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305f\u3060\u3001Firefox\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u306f\u3001action \u304c\u3001\u305d\u306e\u30b5\u30a4\u30c8\u81ea\u4f53\u3092\u5411\u3044\u3066\u306a\u3044\u6642\u306b\u3082\u3001\u30c0\u30de\u3067autofill\u3057\u3066\u304f\u308c\u3061\u3083\u3046\u3068\u3044\u3046\u3053\u3068\u306f\u308f\u304b\u308a\u307e\u3057\u305f\u3002\u81ea\u5206\u3067\u4ed6\u306e\u30b5\u30a4\u30c8\u306b\u3064\u306a\u3044\u3067\u3001\u305d\u308c\u3092\u9001\u3063\u3066\u3057\u307e\u3046\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u5024\u3092\u30d5\u30a3\u30eb\u3057\u3066\u3042\u3052\u308b\u3068\u3053\u308d\u3068\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u308a\u51fa\u3059\u3068\u3053\u308d\u306f\u30a2\u30c8\u30df\u30c3\u30af\u3067\u306f\u306a\u3044\u3067\u3059\u304b\u3089\u306d\u3002\u305d\u306e2\u3064\u306e\u64cd\u4f5c\u306e\u9593\u306e\u95a2\u9023\u306f\u898f\u7a0b\u3055\u308c\u3066\u306a\u3044\u3093\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u306d\u3002\u5024\u3092\u30b2\u30c3\u30c8\u3057\u3066\u304b\u3089\u3001action \u3068\u306f\u7121\u95a2\u4fc2\u306a\u51e6\u7406\u3092\u3059\u308b\u4e8b\u3092\u59a8\u3052\u306a\u308c\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3044\u3084\u3001\u5024\u3092\u30d5\u30a3\u30eb\u3057\u3066\u3042\u3052\u308b\u306e\u3082\u3001\u5b9f\u969b\u306b action \u3092\u8d77\u3053\u3059\u306e\u3082\u81ea\u5206\u306a\u3093\u3067\u3059\u304b\u3089\u3001\u5024\u3092\u30d5\u30a3\u30eb\u3057\u305f\u6642\u3068\u9055\u3046\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u3057\u306a\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u826f\u3055\u305d\u3046\u306a\u6c17\u3082\u3057\u307e\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3044\u3084\u3001\u305d\u3082\u305d\u3082\u305d\u306e\u30d5\u30a9\u30fc\u30e0\u3092\u5b9f\u884c\u3059\u308b\u304b\u3082\u5236\u7d04\u3067\u304d\u306a\u3044\u3067\u3059\u3088\u306d\u3002\u5024\u3092\u30b2\u30c3\u30c8\u3057\u305f\u3089\u3001\u305f\u3068\u3048\u3070\u305d\u308c\u3092 WebSocket \u3067\u3069\u3063\u304b\u306b\u9001\u3063\u3061\u3083\u3046\u304b\u3082\u3057\u308c\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u3082\u305d\u3082\u30d6\u30e9\u30a6\u30b6\u3068\u3057\u3066\u306f\u7d50\u5c40\u3001\u3042\u304f\u307e\u3067\u73fe\u5728\u8868\u793a\u3057\u3066\u3044\u308b\u30da\u30fc\u30b8\u3068\u3044\u3046\u304b\u30b5\u30a4\u30c8\u306e\u305f\u3081\u306b\u30d5\u30a3\u30eb\u3057\u3066\u3042\u3052\u3066\u308b\u3060\u3051\u3068\u3044\u3046\u7acb\u5834\u306a\u3093\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<h2>\u30bb\u30c3\u30b7\u30e7\u30f3\u5f15\u304d\u7d99\u304e\u5b9f\u9a13<\/h2>\n\n\n\n<p>\u958b\u767a\uff1a\u3057\u307e\u3063\u305f\u3001\u3082\u3046\u3053\u3093\u306a\u6642\u9593\u306b\u2026\u3000\u3067\u3082\u3001\u3088\u3046\u3084\u304f\u6e96\u5099\u304c\u5b9f\u9a13\u306e\u6574\u3044\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u4f55\u304b\u96e3\u3057\u3044\u554f\u984c\u304c\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3044\u3084\u3001\u7d50\u5c40\u3001\u9589\u3058\u308b\u5074\u306e script \u30bf\u30b0\u3092\u30b9\u30da\u30eb\u30df\u30b9\u3057\u3066\u305f\u3068\u308f\u304b\u3063\u305f\u3093\u3067\u3059\u304c\u3001\u305d\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u5b9f\u884c\u3055\u308c\u306a\u304f\u3066\u82e6\u3057\u3093\u3067\u307e\u3057\u305f\u3002\u9589\u3058\u3066\u306a\u3044\u5148\u306f JavaScript \u3068\u3057\u3066\u6587\u6cd5\u30a8\u30e9\u30fc\u306a\u306e\u3067\u3059\u304c\u3001\u306a\u305c\u304bconsole.log\u306b\u30a8\u30e9\u30fc\u304c\u51fa\u306a\u304f\u3066\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3068\u3044\u3046\u304b\u305d\u3082\u305d\u3082\u6c7a\u3081\u6253\u3061\u306a\u3089\u30b9\u30af\u30ea\u30d7\u30c8\u3082\u3044\u3089\u306a\u304f\u3066HTML\u3060\u3051\u306a\u3093\u3067\u3059\u304c\u3002\u4ed5\u639b\u3051\u306f\u3053\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58-1024x871.png\" alt=\"\" class=\"wp-image-19533\" width=\"512\" height=\"436\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58-1024x871.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58-300x255.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58-768x653.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58-1536x1306.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.35.58.png 1632w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u793e\u9577\uff1a\u6c7a\u3081\u6253\u3061\u3067\u3059\u306d (^-^;<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3067\u3001Firefox\u3067\u767a\u884c\u3057\u3066\u3082\u3089\u3063\u305f\u30bb\u30c3\u30b7\u30e7\u30f3ID\u3092Safari\u3067\u5f15\u304d\u7d99\u3044\u3067\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u3068\u3044\u3046\u5b9f\u9a13\u3092\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28-1024x743.png\" alt=\"\" class=\"wp-image-19534\" width=\"512\" height=\"372\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28-1024x743.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28-300x218.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28-768x557.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28-1536x1114.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.39.28.png 1632w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u3067\u3001Submit\u3092\u30dd\u30c1\u30c3\u3068\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44-1024x743.png\" alt=\"\" class=\"wp-image-19535\" width=\"512\" height=\"372\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44-1024x743.png 1024w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44-300x218.png 300w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44-768x557.png 768w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44-1536x1114.png 1536w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2020-09-23-5.41.44.png 1632w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u7121\u4e8b\u5f15\u304d\u7d99\u304e\u6210\u529f\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30bb\u30c3\u30b7\u30e7\u30f3ID\u3068\u8a00\u3063\u3066\u3082\u8a8d\u8a3c\u524d\u306e\u6574\u7406\u756a\u53f7\u307f\u305f\u3044\u306a\u3082\u306e\u3060\u304b\u3089\u3001\u554f\u984c\u306a\u3044\u306e\u3067\u306f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u6574\u7406\u756a\u53f7\u3092\u53d6\u3089\u308c\u3066\u6012\u308b\u4eba\u3082\u3044\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u3058\u3083\u306a\u3044\u3067\u3059\u304b\u3002User-Agent\u304c\u9055\u3046\u4e8b\u304f\u3089\u3044\u6c17\u3065\u3044\u3066\u304f\u3060\u3055\u3044\u3088\u3068\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3053\u306e\u5148\u306f\u672c\u984c\u3067\u306f\u306a\u3044\u306e\u3067\u3001\u3053\u306e\u3078\u3093\u3067\u7d42\u696d\u306b\u3057\u307e\u3057\u3087\u3046\u3002\u660e\u308b\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u4eca\u65e5\u306e\u307e\u3068\u3081\u3068\u3057\u3066\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u304cJavaScript\u306b\u6559\u3048\u3066\u304f\u308c\u308b\u306e\u306f\u3001\u73fe\u5728\u63a5\u7d9a\u3057\u3066\u3044\u308b\u30b5\u30fc\u30d0\u3068\u63a5\u7d9a\u3057\u3066\u3044\u308b\u6642\u306b\u8a18\u61b6\u3055\u308c\u305f\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u3068\u3044\u3046\u304b\u30d5\u30a9\u30fc\u30e0\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u5024\u3060\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u306d\u3002\u5f53\u305f\u308a\u524d\u3060\u3068\u306f\u601d\u3044\u307e\u3059\u3002\u3060\u304b\u3089\u3053\u308c\u306f\u3001HTTP\u306e\u30d7\u30ed\u30c8\u30b3\u30eb\u30ec\u30d9\u30eb\u3067\u306e\u8a8d\u8a3c\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u306f\u5225\u7269\u3067\u3042\u308b\u3068\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u307e\u3042\u3001\u5916\u90e8\u306b\u3042\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u306a\u30b5\u30a4\u30c8\u306b\u63a5\u7d9a\u3059\u308b\u306b\u306f\u3001\u307e\u305a\u81ea\u5206\u3061\u306e\u5916\u51fa\u6e96\u5099\u30da\u30fc\u30b8\u306b\u884c\u3063\u3066\u3001\u305d\u3053\u3067\u51fa\u5f35\u5148\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u304b\u3089\u6559\u3048\u3066\u3082\u3089\u3063\u3066\u3001\u4f55\u304b\u30c6\u30f3\u30dd\u30e9\u30ea\u306b\u66f8\u304d\u7559\u3081\u3066\u3001\u305d\u308c\u3092\u5b9f\u969b\u306b\u51fa\u5148\u306b\u884c\u3063\u305f\u6642\u306b\u5165\u529b\u3059\u308b\u3001\u3063\u3066\u611f\u3058\u3067\u3059\u304b\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u306e\u30d5\u30ed\u30fc\u306a\u3089\u3001\u500b\u5225\u30d6\u30e9\u30a6\u30b6\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u3067\u3042\u308b\u5fc5\u8981\u306f\u7121\u3044\u3067\u3059\u306d\u3002\u73fe\u5728\u306e\u5165\u529b\u306f\u3001\u3069\u306eURL\u3067\u30e6\u30fc\u30b6\u540d\u3084\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u805e\u304b\u308c\u3066\u3044\u308b\u3082\u306e\u3060\u3068\u3044\u3046\u6587\u8108\u304c\u308f\u304b\u308c\u3070\u3001IME\u3067\u51fa\u6765\u308b\u4e8b\u3002IME\u3067\u81ea\u52d5\u30d5\u30a3\u30eb\u3082\u3001\u5fc5\u8981\u306a\u3089\u81ea\u52d5\u9001\u4fe1\u3082\u3067\u304d\u308b\u3068\u601d\u308f\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u7d50\u5c40\u3001IME\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u306b\u3068\u3044\u3046\u65b9\u5411\u3067\u3059\u306d\u3002\u5b9f\u73fe\u3067\u304d\u305f\u3089\u9762\u767d\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u8ab2\u984c\u306f\u3001\u305d\u306e\u6587\u8108\u3092IME\u304c\u77e5\u308c\u308b\u306e\u304b\u3068\u8a00\u3046\u3068\u3053\u308d\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u306a\u3093\u306a\u3089\u3001\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u306e\u753b\u50cf\u8a8d\u8b58\u3068\u304b\u3057\u3066\u3001\u73fe\u5728\u306e\u30de\u30a6\u30b9\u30dd\u30f3\u30bf\u306f\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u3042\u308b\u3068\u3044\u3046\u306e\u3092\u8b58\u5225\u3059\u308b\u3093\u3058\u3083\u7121\u3044\u3067\u3059\u304b\u306d\u3002\u3053\u308c\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u306b\u9650\u3089\u306a\u3044\u3001\u3069\u3093\u306a\u30a2\u30d7\u30ea\u3067\u3082\u4f7f\u3048\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30fc\u30b8\u30e3\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u305d\u3082\u305d\u3082\u30ed\u30b0\u30a4\u30f3\u307e\u3067\u306f\u81ea\u524d\u306e\u30a6\u30a7\u30d6\u30a8\u30f3\u30b8\u30f3\u3067\u3084\u3063\u3066\u3001\u8a8d\u8a3c\u5f8c\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u3092\u666e\u901a\u306e\u30d6\u30e9\u30a6\u30b6\u306b\u5f15\u304d\u7d99\u3050\u3068\u3044\u3046\u306e\u3082\u3001\u691c\u8a0e\u3057\u305f\u3044\u3067\u3059\u306d\u3002document.write\u3068\u304b\u3057\u3066\u3002\u8a8d\u8a3c\u6bb5\u968e\u3067\u306fGUI\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306a\u304f\u3066\u3082\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u8a8d\u8a3c\u524d\u306e\u7384\u95a2\u306breCAPTCHA\u307f\u305f\u3044\u306e\u304c\u69cb\u3048\u3066\u3044\u308b\u3068\u9762\u5012\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3051\u3069\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u601d\u3046\u306b\u3001gmail \u3068\u304b\u306f\u81ea\u52d5\u30d5\u30a3\u30eb\u3068\u304b\u306a\u304f\u3066\u76f4\u63a5\u5165\u308a\u307e\u3059\u304b\u3089\u3001\u3042\u308c\u306fHTTP\u30ec\u30d9\u30eb\u3067\u306e\u8a8d\u8a3c\u306a\u3093\u3067\u306f\u306a\u3044\u3067\u3057\u3087\u3046\u304b\u3002\u305d\u308c\u3068\u3082\u3001\u81ea\u52d5\u30d5\u30a3\u30eb\u3057\u3066\u304b\u3064\u81ea\u52d5\u63a5\u7d9a\u3068\u3044\u3046\u30da\u30fc\u30b8\u306b\u306a\u3063\u3066\u308b\u3093\u3067\u3057\u3087\u3046\u304b\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u3042\u305d\u306e\u3078\u3093\u306f\u81ea\u52d5\u30d5\u30a3\u30eb\u3057\u306a\u3044\u30d6\u30e9\u30a6\u30b6\u3068\u3044\u3046\u304b\u3001\u624b\u52d5\u3067 http:\/\/mail.google.com \u3092\u30b2\u30c3\u30c8\u3057\u3066\u4e2d\u8eab\u3092\u898b\u308c\u3070\u308f\u304b\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u306f\u8a8d\u8a3c\u306e\u30a4\u30f3\u30d5\u30e9\u306b\u3082\u306a\u3063\u3066\u3044\u308b\u308f\u3051\u3067\u3001CUI\u306a\u30d6\u30e9\u30a6\u30b6\u306f\u30b0\u30e9\u30d5\u30a3\u30ab\u30eb\u306a\u74b0\u5883\u306e\u306a\u3044\u4e16\u754c\u3067\u306f\u6709\u7528\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1avi\u4e92\u63db\u306e\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30d9\u30fc\u30b9\u306e\u30d6\u30e9\u30a6\u30b6\u3068\u304b\u9762\u767d\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u4eca\u65e5\u306fGShell\u958b\u59cb\u4ee5\u6765\u521d\u3081\u3066\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u66f4\u65b0\u306e\u7121\u3044\u65e5\u306b\u306a\u308a\u307e\u3057\u305f\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5225\u306e\u5b9f\u308a\u306f\u591a\u304b\u3063\u305f\u65e5\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u96fb\u5b50\u30ec\u30f3\u30b8\u5bfe\u5fdc\u3069\u3093\u3076\u308a\u3068\u304b\u3002<\/p>\n\n\n\n<p>-- 2020-0923 SatoxITS<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3053\u306e\u6295\u7a3f\u306e\u30bf\u30a4\u30c8\u30eb\u306f\u300c\u30d6\u30e9\u30a6\u30b6\u30e6\u30cb\u30aa\u30f3\u300d\u3067\u306f\u7121\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u9b5a\u62d3\u3068\u308b\u524d\u306b\u30bf\u30a4\u30c8\u30eb\u5909\u3048\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\">\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more-1.pdf\">\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more-1<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/09\/\u30cf\u309a\u30b9\u30ef\u30fc\u30c8\u3099\u30de\u30cd\u30b7\u3099\u30e3\u30fc\u53ec\u559a\u6cd5-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more-1.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n\/*<span\n id=\"gsh-digest\"\n class=\"_digest_\"\n data-target-id=\"gsh\"\n data-crc32u=\"2064798218\"\n data-length=\"243095\"\n data-lines=\"8767\"\n data-time=\"1600781081860\"\n ><\/span>\n*\/\n\/*<html>\n<span id=\"gsh\" data-title=\"GShell\" data-author=\"sato@its-more.jp\">\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<link rel=\"icon\" id=\"GshFaviconURL\" href=\"\"><!-- place holder -->\n<span hidden=\"\" id=\"GshVersion\">gsh--0.4.9--2020-09-22--SatoxITS<\/span>\n<title>GShell-0.4.9 by SatoxITS<\/title>\n<header id=\"GshBanner\" height=\"100px\" onclick=\"shiftBG();\">\n<div align=\"right\"><note><a href=\"http:\/\/archive.gshell.org\">GShell<\/a> version 0.4.9 \/\/ 2020-09-22 \/\/ SatoxITS<\/note><\/div>\n<\/header>\n<h2>GShell \/\/ a General purpose Shell built on the top of Golang<\/h2>\n<p>\n<note>\nIt is a shell for myself, by myself, of myself. --SatoxITS(^-^)\n<\/note>\n<\/p>\n<div id=\"GJFactory_x\"><\/div>\n<span id=\"gsh-WinId\" onclick=\"win_jump('0.1');\">0<\/span>\n<span id=\"GshMenu\">\n<span class=\"GshMenu1\" id=\"gsh-menu-exit\" onclick=\"html_close();\"><\/span>\n<span class=\"GshMenu1\" id=\"gsh-menu-fork\" onclick=\"html_fork();\">Fork<\/span>\n<span class=\"GshMenu1\" id=\"GshMenuStop\" onclick=\"html_stop(this,true);\">Stop<\/span>\n<span class=\"GshMenu1\" id=\"GshMenuFold\" onclick=\"html_fold(this);\">Unfold<\/span>\n<span class=\"GshMenu1\" id=\"gsh-menu-cksum\" onclick=\"html_digest();\">Digest<\/span>\n<span class=\"GshMenu1\" id=\"GshMenuSign\" onclick=\"html_sign(this);\" style=\"\">Source<\/span>\n<!-- | <span id=\"gsh-menu-pure\" onclick=\"html_pure(this);\">Pure<\/span> -->\n<\/span>\n*\/\n\/*\n<details id=\"GshStatement\" class=\"gsh-document\"><summary>Statement<\/summary>\n<h3>Fun to create a shell<\/h3>\n<p>For a programmer, it must be far easy and fun to create his own simple shell\nrightly fitting to his favor and necessities, than learning existing shells with\ncomplex full features that he never use.\nI, as one of programmers, am writing this tiny shell for my own real needs,\ntotally from scratch, with fun.\n<\/p><p>\nFor a programmer, it is fun to learn new computer languages.  For long years before\nwriting this software, I had been specialized to C and early HTML2 :-).\nNow writing this software,  I'm learning Go language, HTML5, JavaScript and CSS\non demand as a novice of these, with fun.\n<\/p><p>\nThis single file \"gsh.go\", that is executable by Go, contains all of the code written\nin Go. Also it can be displayed as \"gsh.go.html\" by browsers. It is a standalone\nHTML file that works as the viewer of the code of itself, and as the \"home page\" of\nthis software.\n<\/p><p>\nBecause this HTML file is a Go program, you may run it as a real shell program\non your computer.\nBut you must be aware that this program is written under situation like above.\nNeedless to say, there is no warranty for this program in any means.\n<\/p>\n<address>Aug 2020, SatoxITS (sato@its-more.jp)<\/address>\n<\/details>\n*\/\n\/*\n<details id=\"GshFeatures\" class=\"gsh-document\"><summary>Features<\/summary><p>\n<\/p>\n<h3>Vi compatible command line editor<\/h3>\n<p>\nThe command line of GShell can be edited with commands compatible with\n<a href=\"https:\/\/www.washington.edu\/computing\/unix\/vi.html\"><b>vi<\/b><\/a>.\nAs in vi, you can enter <i><b>command mode<\/b><\/i> by <b>ESC<\/b> key,\nthen move around in the history by <b><code>j k \/ ? n N<\/code><\/b>,\nor within the current line by <b><code>l h f w b 0 $ %<\/code><\/b> or so.\n<\/p>\n<\/details>\n*\/\n\/*\n<details id=\"gsh-gindex\">\n<summary>Index<\/summary><div class=\"gsh-src\">\nDocuments\n\t<span class=\"gsh-link\" onclick=\"jumpto_JavaScriptView();\">Command summary<\/span>\nGo lang part<span class=\"gsh-src\" onclick=\"document.getElementById('gsh-gocode').open=true;\">\n\tPackage structures\n\t\t<a href=\"#import\">import<\/a>\n\t\t<a href=\"#struct\">struct<\/a>\n\tMain functions\n\t\t<a href=\"#comexpansion\">str-expansion<\/a>\t\/\/ macro processor\n\t\t<a href=\"#finder\">finder<\/a>\t\t\/\/ builtin find + du\n\t\t<a href=\"#grep\">grep<\/a>\t\t\/\/ builtin grep + wc + cksum + ...\n\t\t<a href=\"#plugin\">plugin<\/a>\t\t\/\/ plugin commands\n\t\t<a href=\"#ex-commands\">system<\/a>\t\t\/\/ external commands\n\t\t<a href=\"#builtin\">builtin<\/a>\t\t\/\/ builtin commands\n\t\t<a href=\"#network\">network<\/a>\t\t\/\/ socket handler\n\t\t<a href=\"#remote-sh\">remote-sh<\/a>\t\/\/ remote shell\n\t\t<a href=\"#redirect\">redirect<\/a>\t\/\/ StdIn\/Out redireciton\n\t\t<a href=\"#history\">history<\/a>\t\t\/\/ command history\n\t\t<a href=\"#rusage\">rusage<\/a>\t\t\/\/ resouce usage\n\t\t<a href=\"#encode\">encode<\/a>\t\t\/\/ encode \/ decode\n\t\t<a href=\"#IME\">IME<\/a>\t\t\/\/ command line IME\n\t\t<a href=\"#getline\">getline<\/a>\t\t\/\/ line editor\n\t\t<a href=\"#scanf\">scanf<\/a>\t\t\/\/ string decomposer\n\t\t<a href=\"#interpreter\">interpreter<\/a>\t\/\/ command interpreter\n\t\t<a href=\"#main\">main<\/a>\n<\/span>\nJavaScript part\n\t<a href=\"#script-src-view\" class=\"gsh-link\" onclick=\"jumpto_JavaScriptView();\">Source<\/a>\n\t<a href=\"#gsh-data-frame\" class=\"gsh-link\" onclick=\"jumpto_DataView();\">Builtin data<\/a>\nCSS part\n\t<a href=\"#style-src-view\" class=\"gsh-link\" onclick=\"jumpto_StyleView();\">Source<\/a>\nReferences\n\t<a href=\"#\" class=\"gsh-link\" onclick=\"jumpto_WholeView();\">Internal<\/a>\n\t<a href=\"#gsh-reference\" class=\"gsh-link\" onclick=\"jumpto_ReferenceView();\">External<\/a>\nWhole parts\n\t<a href=\"#whole-src-view\" class=\"gsh-link\" onclick=\"jumpto_WholeView();\">Source<\/a>\n\t<a href=\"#whole-src-view\" class=\"gsh-link\" onclick=\"jumpto_WholeView();\">Download<\/a>\n\t<a href=\"#whole-src-view\" class=\"gsh-link\" onclick=\"jumpto_WholeView();\">Dump<\/a>\n\n<\/div>\n<\/details>\n*\/\n\/\/<details id=\"gsh-gocode\">\n\/\/<summary>Go Source<\/summary><div class=\"gsh-src\" onclick=\"document.getElementById('gsh-gocode').open=false;\">\n\/\/ gsh - Go lang based Shell\n\/\/ (c) 2020 ITS more Co., Ltd.\n\/\/ 2020-0807 created by SatoxITS (sato@its-more.jp)\n\npackage main \/\/ gsh main\n\n\/\/ <a name=\"import\">Imported packages<\/a> \/\/ <a href=\"https:\/\/golang.org\/pkg\/\">Packages<\/a>\nimport (\n\t\"fmt\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/fmt\/\">fmt<\/a>\n\t\"strings\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/strings\/\">strings<\/a>\n\t\"strconv\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/strconv\/\">strconv<\/a>\n\t\"sort\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/sort\/\">sort<\/a>\n\t\"time\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/time\/\">time<\/a>\n\t\"bufio\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/bufio\/\">bufio<\/a>\n\t\"io\/ioutil\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/io\/ioutil\/\">ioutil<\/a>\n\t\"os\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/os\/\">os<\/a>\n\t\"syscall\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/syscall\/\">syscall<\/a>\n\t\"plugin\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/plugin\/\">plugin<\/a>\n\t\"net\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/net\/\">net<\/a>\n\t\"net\/http\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/net\/http\/\">http<\/a>\n\t\/\/\"html\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/html\/\">html<\/a>\n\t\"path\/filepath\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/path\/filepath\/\">filepath<\/a>\n\t\"go\/types\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/go\/types\/\">types<\/a>\n\t\"go\/token\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/go\/token\/\">token<\/a>\n\t\"encoding\/base64\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/encoding\/base64\/\">base64<\/a>\n\t\"unicode\/utf8\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/unicode\/utf8\/\">utf8<\/a>\n\t\/\/\"gshdata\"\t\/\/ gshell's logo and source code\n\t\"hash\/crc32\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/unicode\/hash\/crc32\/\">crc32<\/a>\n\t\"golang.org\/x\/net\/websocket\"\n)\n\n\/\/ \/\/ 2020-0906 added,\n\/\/ \/\/ <a href=\"https:\/\/golang.org\/cmd\/cgo\/\">CGo<\/a>\n\/\/ #include \"poll.h\" \/\/ <poll.h> \/\/ <\/poll.h> to be closed as HTML tag :-p\n\/\/ typedef struct { struct pollfd fdv[8]; } pollFdv; \n\/\/ int pollx(pollFdv *fdv, int nfds, int timeout){\n\/\/\treturn poll(fdv->fdv,nfds,timeout);\n\/\/ }\nimport \"C\"\n\n\/\/ \/\/ 2020-0906 added,\nfunc CFpollIn1(fp*os.File, timeoutUs int)(ready uintptr){\n\tvar fdv = C.pollFdv{}\n\tvar nfds = 1\n\tvar timeout = timeoutUs\/1000\n\n\tfdv.fdv[0].fd = C.int(fp.Fd())\n\tfdv.fdv[0].events = C.POLLIN\n\tif( 0 < EventRecvFd ){\n\t\tfdv.fdv[1].fd = C.int(EventRecvFd)\n\t\tfdv.fdv[1].events = C.POLLIN\n\t\tnfds += 1\n\t}\n\tr := C.pollx(&fdv,C.int(nfds),C.int(timeout))\n\tif( r <= 0 ){\n\t\treturn 0\n\t}\n\tif (int(fdv.fdv[1].revents) & int(C.POLLIN)) != 0 {\n\t\t\/\/fprintf(stderr,\"--De-- got Event\\n\");\n\t\treturn uintptr(EventFdOffset + fdv.fdv[1].fd)\n\t}\n\tif (int(fdv.fdv[0].revents) & int(C.POLLIN)) != 0 {\n\t\treturn uintptr(NormalFdOffset + fdv.fdv[0].fd)\n\t}\n\treturn 0\n}\n\nconst (\n\tNAME = \"gsh\"\n\tVERSION = \"0.4.9\"\n\tDATE = \"2020-09-22\"\n\tAUTHOR = \"SatoxITS(^-^)\/\/\"\n)\nvar (\n\tGSH_HOME = \".gsh\"\t\/\/ under home directory\n\tGSH_PORT = 9999\n\tMaxStreamSize = int64(128*1024*1024*1024) \/\/ 128GiB is too large?\n\tPROMPT = \"> \"\n\tLINESIZE = (8*1024)\n\tPATHSEP = \":\"\t\/\/ should be \";\" in Windows\n\tDIRSEP = \"\/\"\t\/\/ canbe \\ in Windows\n)\n\n\/\/ -xX logging control\n\/\/ --A-- all\n\/\/ --I-- info.\n\/\/ --D-- debug\n\/\/ --T-- time and resource usage\n\/\/ --W-- warning\n\/\/ --E-- error\n\/\/ --F-- fatal error\n\/\/ --Xn- network\n\n\/\/ <a name=\"struct\">Structures<\/a>\ntype GCommandHistory struct {\n\tStartAt\t\ttime.Time \/\/ command line execution started at\n\tEndAt\t\ttime.Time \/\/ command line execution ended at\n\tResCode\t\tint       \/\/ exit code of (external command)\n\tCmdError\terror     \/\/ error string\n\tOutData\t\t*os.File  \/\/ output of the command\n\tFoundFile\t[]string  \/\/ output - result of ufind\n\tRusagev\t\t[2]syscall.Rusage \/\/ Resource consumption, CPU time or so\n\tCmdId\t\tint       \/\/ maybe with identified with arguments or impact\n\t\t\t          \/\/ redireciton commands should not be the CmdId\n\tWorkDir\t\tstring    \/\/ working directory at start\n\tWorkDirX\tint       \/\/ index in ChdirHistory\n\tCmdLine\t\tstring    \/\/ command line\n}\ntype GChdirHistory struct {\n\tDir\t\tstring\n\tMovedAt\t\ttime.Time\n\tCmdIndex\tint\n}\ntype CmdMode struct {\n\tBackGround\tbool\n}\ntype Event struct {\n\twhen\t\ttime.Time\n\tevent\t\tint\n\tevarg\t\tint64\n\tCmdIndex\tint\n}\nvar CmdIndex int\nvar Events []Event\ntype PluginInfo struct {\n\tSpec\t\t*plugin.Plugin\n\tAddr\t\tplugin.Symbol\n\tName\t\tstring \/\/ maybe relative\n\tPath\t\tstring \/\/ this is in Plugin but hidden\n}\ntype GServer struct {\n\thost\t\tstring\n\tport\t\tstring\n}\n\n\/\/ <a href=\"https:\/\/tools.ietf.org\/html\/rfc3230\">Digest<\/a>\nconst ( \/\/ SumType\n\tSUM_ITEMS\t= 0x000001 \/\/ items count\n\tSUM_SIZE\t= 0x000002 \/\/ data length (simplly added)\n\tSUM_SIZEHASH\t= 0x000004 \/\/ data length (hashed sequence)\n\tSUM_DATEHASH\t= 0x000008 \/\/ date of data (hashed sequence)\n\t\/\/ also envelope attributes like time stamp can be a part of digest\n\t\/\/ hashed value of sizes or mod-date of files will be useful to detect changes\n\n\tSUM_WORDS\t= 0x000010 \/\/ word count is a kind of digest\n\tSUM_LINES\t= 0x000020 \/\/ line count is a kind of digest\n\tSUM_SUM64\t= 0x000040 \/\/ simple add of bytes, useful for human too\n\n\tSUM_SUM32_BITS\t= 0x000100 \/\/ the number of true bits\n\tSUM_SUM32_2BYTE = 0x000200 \/\/ 16bits words\n\tSUM_SUM32_4BYTE = 0x000400 \/\/ 32bits words\n\tSUM_SUM32_8BYTE = 0x000800 \/\/ 64bits words\n\n\tSUM_SUM16_BSD\t= 0x001000 \/\/ UNIXsum -sum -bsd\n\tSUM_SUM16_SYSV\t= 0x002000 \/\/ UNIXsum -sum -sysv\n\tSUM_UNIXFILE\t= 0x004000\n\tSUM_CRCIEEE\t= 0x008000\n)\ntype CheckSum struct {\n\tFiles\t\tint64\t\/\/ the number of files (or data)\n\tSize\t\tint64\t\/\/ content size\n\tWords\t\tint64\t\/\/ word count\n\tLines\t\tint64\t\/\/ line count\n\tSumType\t\tint\n\tSum64\t\tuint64\n\tCrc32Table\tcrc32.Table\n\tCrc32Val\tuint32\n\tSum16\t\tint\n\tCtime\t\ttime.Time\n\tAtime\t\ttime.Time\n\tMtime\t\ttime.Time\n\tStart\t\ttime.Time\n\tDone\t\ttime.Time\n\tRusgAtStart\t[2]syscall.Rusage\n\tRusgAtEnd\t[2]syscall.Rusage\n}\ntype ValueStack [][]string\ntype GshContext struct {\n\tStartDir\tstring\t\/\/ the current directory at the start\n\tGetLine\t\tstring\t\/\/ gsh-getline command as a input line editor\n\tChdirHistory\t[]GChdirHistory \/\/ the 1st entry is wd at the start\n\tgshPA\t\tsyscall.ProcAttr\n\tCommandHistory\t[]GCommandHistory\n\tCmdCurrent\tGCommandHistory\n\tBackGround\tbool\n\tBackGroundJobs\t[]int\n\tLastRusage\tsyscall.Rusage\n\tGshHomeDir\tstring\n\tTerminalId\tint\n\tCmdTrace\tbool \/\/ should be [map]\n\tCmdTime\t\tbool \/\/ should be [map]\n\tPluginFuncs\t[]PluginInfo\n\tiValues\t\t[]string\n\tiDelimiter\tstring \/\/ field sepearater of print out\n\tiFormat\t\tstring \/\/ default print format (of integer)\n\tiValStack\tValueStack\n\tLastServer\tGServer\n\tRSERV\t\tstring \/\/ [gsh:\/\/]host[:port]\n\tRWD\t\tstring \/\/ remote (target, there) working directory\n\tlastCheckSum\tCheckSum\n}\n\nfunc nsleep(ns time.Duration){\n\ttime.Sleep(ns)\n}\nfunc usleep(ns time.Duration){\n\tnsleep(ns*1000)\n}\nfunc msleep(ns time.Duration){\n\tnsleep(ns*1000000)\n}\nfunc sleep(ns time.Duration){\n\tnsleep(ns*1000000000)\n}\n\nfunc strBegins(str, pat string)(bool){\n\tif len(pat) <= len(str){\n\t\tyes := str[0:len(pat)] == pat\n\t\t\/\/fmt.Printf(\"--D-- strBegins(%v,%v)=%v\\n\",str,pat,yes)\n\t\treturn yes\n\t}\n\t\/\/fmt.Printf(\"--D-- strBegins(%v,%v)=%v\\n\",str,pat,false)\n\treturn false\n}\nfunc isin(what string, list []string) bool {\n\tfor _, v := range list  {\n\t\tif v == what {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc isinX(what string,list[]string)(int){\n\tfor i,v := range list {\n\t\tif v == what {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc env(opts []string) {\n\tenv := os.Environ()\n\tif isin(\"-s\", opts){\n\t\tsort.Slice(env, func(i,j int) bool {\n\t\t\treturn env[i] < env[j]\n\t\t})\n\t}\n\tfor _, v := range env {\n\t\tfmt.Printf(\"%v\\n\",v)\n\t}\n}\n\n\/\/ - rewriting should be context dependent\n\/\/ - should postpone until the real point of evaluation\n\/\/ - should rewrite only known notation of symobl\nfunc scanInt(str string)(val int,leng int){\n\tleng = -1\n\tfor i,ch := range str {\n\t\tif '0' <= ch && ch <= '9' {\n\t\t\tleng = i+1\n\t\t}else{\n\t\t\tbreak\n\t\t}\n\t}\n\tif 0 < leng {\n\t\tival,_ := strconv.Atoi(str[0:leng])\n\t\treturn ival,leng\n\t}else{\n\t\treturn 0,0\n\t}\n}\nfunc substHistory(gshCtx *GshContext,str string,i int,rstr string)(leng int,rst string){\n\tif len(str[i+1:]) == 0 {\n\t\treturn 0,rstr\n\t}\n\thi := 0\n\thistlen := len(gshCtx.CommandHistory)\n\tif str[i+1] == '!' {\n\t\thi = histlen - 1\n\t\tleng = 1\n\t}else{\n\t\thi,leng = scanInt(str[i+1:])\n\t\tif leng == 0 {\n\t\t\treturn 0,rstr\n\t\t}\n\t\tif hi < 0 {\n\t\t\thi = histlen + hi\n\t\t}\n\t}\n\tif 0 <= hi && hi < histlen {\n\t\tvar ext byte\n\t\tif 1 < len(str[i+leng:]) {\n\t\t\text = str[i+leng:][1]\n\t\t}\n\t\t\/\/fmt.Printf(\"--D-- %v(%c)\\n\",str[i+leng:],str[i+leng])\n\t\tif ext == 'f' {\n\t\t\tleng += 1\n\t\t\txlist := []string{}\n\t\t\tlist := gshCtx.CommandHistory[hi].FoundFile\n\t\t\tfor _,v := range list {\n\t\t\t\t\/\/list[i] = escapeWhiteSP(v)\n\t\t\t\txlist = append(xlist,escapeWhiteSP(v))\n\t\t\t}\n\t\t\t\/\/rstr += strings.Join(list,\" \")\n\t\t\trstr += strings.Join(xlist,\" \")\n\t\t}else\n\t\tif ext == '@' || ext == 'd' {\n\t\t\t\/\/ !N@ .. workdir at the start of the command\n\t\t\tleng += 1\n\t\t\trstr += gshCtx.CommandHistory[hi].WorkDir\n\t\t}else{\n\t\t\trstr += gshCtx.CommandHistory[hi].CmdLine\n\t\t}\n\t}else{\n\t\tleng = 0\n\t}\n\treturn leng,rstr\n}\nfunc escapeWhiteSP(str string)(string){\n\tif len(str) == 0 {\n\t\treturn \"\\\\z\" \/\/ empty, to be ignored\n\t}\n\trstr := \"\"\n\tfor _,ch := range str {\n\t\tswitch ch {\n\t\t\tcase '\\\\': rstr += \"\\\\\\\\\"\n\t\t\tcase ' ': rstr += \"\\\\s\"\n\t\t\tcase '\\t': rstr += \"\\\\t\"\n\t\t\tcase '\\r': rstr += \"\\\\r\"\n\t\t\tcase '\\n': rstr += \"\\\\n\"\n\t\t\tdefault: rstr += string(ch)\n\t\t}\n\t}\n\treturn rstr\n}\nfunc unescapeWhiteSP(str string)(string){ \/\/ strip original escapes\n\trstr := \"\"\n\tfor i := 0; i < len(str); i++ {\n\t\tch := str[i]\n\t\tif ch == '\\\\' {\n\t\t\tif i+1 < len(str) {\n\t\t\t\tswitch str[i+1] {\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trstr += string(ch)\n\t}\n\treturn rstr\n}\nfunc unescapeWhiteSPV(strv []string)([]string){ \/\/ strip original escapes\n\tustrv := []string{}\n\tfor _,v := range strv {\n\t\tustrv = append(ustrv,unescapeWhiteSP(v))\n\t}\n\treturn ustrv\n}\n\n\/\/ <a name=\"comexpansion\">str-expansion<\/a>\n\/\/ - this should be a macro processor\nfunc strsubst(gshCtx *GshContext,str string,histonly bool) string {\n\trbuff := []byte{}\n\tif false {\n\t\t\/\/@@U Unicode should be cared as a character\n\t\treturn str\n\t}\n\t\/\/rstr := \"\"\n\tinEsc := 0 \/\/ escape characer mode \n\tfor i := 0; i < len(str); i++ {\n\t\t\/\/fmt.Printf(\"--D--Subst %v:%v\\n\",i,str[i:])\n\t\tch := str[i]\n\t\tif inEsc == 0 {\n\t\t\tif ch == '!' {\n\t\t\t\t\/\/leng,xrstr := substHistory(gshCtx,str,i,rstr)\n\t\t\t\tleng,rs := substHistory(gshCtx,str,i,\"\")\n\t\t\t\tif 0 < leng {\n\t\/\/_,rs := substHistory(gshCtx,str,i,\"\")\n\trbuff = append(rbuff,[]byte(rs)...)\n\t\t\t\t\ti += leng\n\t\t\t\t\t\/\/rstr = xrstr\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch ch {\n\t\t\t\tcase '\\\\': inEsc = '\\\\'; continue\n\t\t\t\t\/\/case '%':  inEsc = '%';  continue\n\t\t\t\tcase '$':\n\t\t\t}\n\t\t}\n\t\tswitch inEsc {\n\t\tcase '\\\\':\n\t\t\tswitch ch {\n\t\t\t\tcase '\\\\': ch = '\\\\'\n\t\t\t\tcase 's': ch = ' '\n\t\t\t\tcase 't': ch = '\\t'\n\t\t\t\tcase 'r': ch = '\\r'\n\t\t\t\tcase 'n': ch = '\\n'\n\t\t\t\tcase 'z': inEsc = 0; continue \/\/ empty, to be ignored\n\t\t\t}\n\t\t\tinEsc = 0 \n\t\tcase '%':\n\t\t\tswitch {\n\t\t\t\tcase ch == '%': ch = '%'\n\t\t\t\tcase ch == 'T':\n\t\t\t\t\t\/\/rstr = rstr + time.Now().Format(time.Stamp)\n\trs := time.Now().Format(time.Stamp)\n\trbuff = append(rbuff,[]byte(rs)...)\n\t\t\t\t\tinEsc = 0\n\t\t\t\t\tcontinue;\n\t\t\t\tdefault:\n\t\t\t\t\t\/\/ postpone the interpretation\n\t\t\t\t\t\/\/rstr = rstr + \"%\" + string(ch)\n\trbuff = append(rbuff,ch)\n\t\t\t\t\tinEsc = 0\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinEsc = 0\n\t\t}\n\t\t\/\/rstr = rstr + string(ch)\n\t\trbuff = append(rbuff,ch)\n\t}\n\t\/\/fmt.Printf(\"--D--subst(%s)(%s)\\n\",str,string(rbuff))\n\treturn string(rbuff)\n\t\/\/return rstr\n}\nfunc showFileInfo(path string, opts []string) {\n\tif isin(\"-l\",opts) || isin(\"-ls\",opts) {\n\t\tfi, err := os.Stat(path)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"---------- ((%v))\",err)\n\t\t}else{\n\t\t\tmod := fi.ModTime()\n\t\t\tdate := mod.Format(time.Stamp)\n\t\t\tfmt.Printf(\"%v %8v %s \",fi.Mode(),fi.Size(),date)\n\t\t}\n\t}\n\tfmt.Printf(\"%s\",path)\n\tif isin(\"-sp\",opts) {\n\t\tfmt.Printf(\" \")\n\t}else\n\tif ! isin(\"-n\",opts) {\n\t\tfmt.Printf(\"\\n\")\n\t}\n}\nfunc userHomeDir()(string,bool){\n\t\/*\n\thomedir,_ = os.UserHomeDir() \/\/ not implemented in older Golang\n\t*\/\n\thomedir,found := os.LookupEnv(\"HOME\")\n\t\/\/fmt.Printf(\"--I-- HOME=%v(%v)\\n\",homedir,found)\n\tif !found {\n\t\treturn \"\/tmp\",found\n\t}\n\treturn homedir,found\n}\n\nfunc toFullpath(path string) (fullpath string) {\n\tif path[0] == '\/' {\n\t\treturn path\n\t}\n\tpathv := strings.Split(path,DIRSEP)\n\tswitch {\n\tcase pathv[0] == \".\":\n\t\tpathv[0], _ = os.Getwd()\n\tcase pathv[0] == \"..\": \/\/ all ones should be interpreted\n\t\tcwd, _ := os.Getwd()\n\t\tppathv := strings.Split(cwd,DIRSEP)\n\t\tpathv[0] = strings.Join(ppathv,DIRSEP)\n\tcase pathv[0] == \"~\":\n\t\tpathv[0],_ = userHomeDir()\n\tdefault:\n\t\tcwd, _ := os.Getwd()\n\t\tpathv[0] = cwd + DIRSEP + pathv[0]\n\t}\n\treturn strings.Join(pathv,DIRSEP)\n}\n\nfunc IsRegFile(path string)(bool){\n\tfi, err := os.Stat(path)\n\tif err == nil {\n\t\tfm := fi.Mode()\n\t\treturn fm.IsRegular();\n\t}\n\treturn false\n}\n\n\/\/ <a name=\"encode\">Encode \/ Decode<\/a>\n\/\/ <a href=\"https:\/\/golang.org\/pkg\/encoding\/base64\/#example_NewEncoder\">Encoder<\/a>\nfunc (gshCtx *GshContext)Enc(argv[]string){\n\tfile := os.Stdin\n\tbuff := make([]byte,LINESIZE)\n\tli := 0\n\tencoder := base64.NewEncoder(base64.StdEncoding,os.Stdout)\t\n\tfor li = 0; ; li++ {\n\t\tcount, err := file.Read(buff)\n\t\tif count <= 0 {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tencoder.Write(buff[0:count])\n\t}\n\tencoder.Close()\n}\nfunc (gshCtx *GshContext)Dec(argv[]string){\n\tdecoder := base64.NewDecoder(base64.StdEncoding,os.Stdin)\t\n\tli := 0\n\tbuff := make([]byte,LINESIZE)\n\tfor li = 0; ; li++ {\n\t\tcount, err := decoder.Read(buff)\n\t\tif count <= 0 {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tos.Stdout.Write(buff[0:count])\n\t}\n}\n\/\/ lnsp [N] [-crlf][-C \\\\]\nfunc (gshCtx *GshContext)SplitLine(argv[]string){\n\tstrRep := isin(\"-str\",argv) \/\/ \"...\"+\n\treader := bufio.NewReaderSize(os.Stdin,64*1024)\n\tni := 0\n\ttoi := 0\n\tfor ni = 0; ; ni++ {\n\t\tline, err := reader.ReadString('\\n')\n\t\tif len(line) <= 0 {\n\t\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr,\"--I-- lnsp %d to %d (%v)\\n\",ni,toi,err)\n\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\toff := 0\n\t\tilen := len(line)\n\t\tremlen := len(line)\n\t\tif strRep { os.Stdout.Write([]byte(\"\\\"\")) }\n\t\tfor oi := 0; 0 < remlen; oi++ {\n\t\t\tolen := remlen\n\t\t\taddnl := false\n\t\t\tif 72 < olen {\n\t\t\t\tolen = 72\n\t\t\t\taddnl = true\n\t\t\t}\n\t\t\tfmt.Fprintf(os.Stderr,\"--D-- write %d [%d.%d] %d %d\/%d\/%d\\n\",\n\t\t\t\ttoi,ni,oi,off,olen,remlen,ilen)\n\t\t\ttoi += 1\n\t\t\tos.Stdout.Write([]byte(line[0:olen]))\n\t\t\tif addnl {\n\t\t\t\tif strRep {\n\t\t\t\t\tos.Stdout.Write([]byte(\"\\\"+\\n\\\"\"))\n\t\t\t\t}else{\n\t\t\t\t\t\/\/os.Stdout.Write([]byte(\"\\r\\n\"))\n\t\t\t\t\tos.Stdout.Write([]byte(\"\\\\\"))\n\t\t\t\t\tos.Stdout.Write([]byte(\"\\n\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tline = line[olen:]\n\t\t\toff += olen\n\t\t\tremlen -= olen\n\t\t}\n\t\tif strRep { os.Stdout.Write([]byte(\"\\\"\\n\")) }\n\t}\n\tfmt.Fprintf(os.Stderr,\"--I-- lnsp %d to %d\\n\",ni,toi)\n}\n\n\/\/ CRC32 <a href=\"http:\/\/golang.jp\/pkg\/hash-crc32\">crc32<\/a>\n\/\/ 1 0000 0100 1100 0001 0001 1101 1011 0111\nvar CRC32UNIX uint32 = uint32(0x04C11DB7) \/\/ Unix cksum\nvar CRC32IEEE uint32 = uint32(0xEDB88320)\nfunc byteCRC32add(crc uint32,str[]byte,len uint64)(uint32){ \n\tvar oi uint64\n\tfor oi = 0; oi < len; oi++ {\n\t\tvar oct = str[oi]\n\t\tfor bi := 0; bi < 8; bi++ {\n\t\t\t\/\/fprintf(stderr,\"--CRC32 %d %X (%d.%d)\\n\",crc,oct,oi,bi)\n\t\t\tovf1 := (crc & 0x80000000) != 0\n\t\t\tovf2 := (oct & 0x80) != 0\n\t\t\tovf := (ovf1 && !ovf2) || (!ovf1 && ovf2)\n\t\t\toct <<= 1\n\t\t\tcrc <<= 1\n\t\t\tif ovf { crc ^= CRC32UNIX }\n\t\t}\n\t}\n\t\/\/fprintf(stderr,\"--CRC32 return %d %d\\n\",crc,len)\n\treturn crc;\n}\nfunc byteCRC32end(crc uint32, len uint64)(uint32){\n\tvar slen = make([]byte,4)\n\tvar li = 0\n        for li = 0; li < 4; {\n                slen[li] = byte(len)\n\t\tli += 1\n                len >>= 8\n                if( len == 0 ){\n                        break\n\t\t}\n        }\n        crc = byteCRC32add(crc,slen,uint64(li))\n        crc ^= 0xFFFFFFFF\n        return crc\n}\nfunc strCRC32(str string,len uint64)(crc uint32){\n\tcrc = byteCRC32add(0,[]byte(str),len)\n\tcrc = byteCRC32end(crc,len)\n\t\/\/fprintf(stderr,\"--CRC32 %d %d\\n\",crc,len)\n\treturn crc\n}\nfunc CRC32Finish(crc uint32, table *crc32.Table, len uint64)(uint32){\n\tvar slen = make([]byte,4)\n\tvar li = 0\n        for li = 0; li < 4; {\n                slen[li] = byte(len & 0xFF)\n\t\tli += 1\n                len >>= 8\n                if( len == 0 ){\n                        break\n\t\t}\n        }\n\tcrc = crc32.Update(crc,table,slen)\n        crc ^= 0xFFFFFFFF\n        return crc\n}\n\nfunc (gsh*GshContext)xCksum(path string,argv[]string, sum*CheckSum)(int64){\n\tif isin(\"-type\/f\",argv) && !IsRegFile(path){\n\t\treturn 0\n\t}\n\tif isin(\"-type\/d\",argv) && IsRegFile(path){\n\t\treturn 0\n\t}\n\tfile, err := os.OpenFile(path,os.O_RDONLY,0)\n\tif err != nil {\n\t\tfmt.Printf(\"--E-- cksum %v (%v)\\n\",path,err)\n\t\treturn -1\n\t}\n\tdefer file.Close()\n\tif gsh.CmdTrace { fmt.Printf(\"--I-- cksum %v %v\\n\",path,argv) }\n\n\tbi := 0\n\tvar buff = make([]byte,32*1024)\n\tvar total int64 = 0\n\tvar initTime = time.Time{}\n\tif sum.Start == initTime {\n\t\tsum.Start = time.Now()\n\t}\n\tfor bi = 0; ; bi++ {\n\t\tcount,err := file.Read(buff)\n\t\tif count <= 0 || err != nil {\n\t\t\tbreak\n\t\t}\n\t\tif (sum.SumType & SUM_SUM64) != 0 {\n\t\t\ts := sum.Sum64\n\t\t\tfor _,c := range buff[0:count] {\n\t\t\t\ts += uint64(c)\n\t\t\t}\n\t\t\tsum.Sum64 = s\n\t\t}\n\t\tif (sum.SumType & SUM_UNIXFILE) != 0 {\n\t\t\tsum.Crc32Val = byteCRC32add(sum.Crc32Val,buff,uint64(count))\n\t\t}\n\t\tif (sum.SumType & SUM_CRCIEEE) != 0 {\n\t\t\tsum.Crc32Val = crc32.Update(sum.Crc32Val,&sum.Crc32Table,buff[0:count])\n\t\t}\n\t\t\/\/ <a href=\"https:\/\/en.wikipedia.org\/wiki\/BSD_checksum\">BSD checksum<\/a>\n\t\tif (sum.SumType & SUM_SUM16_BSD) != 0 {\n\t\t\ts := sum.Sum16\n\t\t\tfor _,c := range buff[0:count] {\n\t\t\t\ts = (s >> 1) + ((s & 1) << 15)\n\t\t\t\ts += int(c)\n\t\t\t\ts &= 0xFFFF\n\t\t\t\t\/\/fmt.Printf(\"BSDsum: %d[%d] %d\\n\",sum.Size+int64(i),i,s)\n\t\t\t}\n\t\t\tsum.Sum16 = s\n\t\t}\n\t\tif (sum.SumType & SUM_SUM16_SYSV) != 0 {\n\t\t\tfor bj := 0; bj < count; bj++ {\n\t\t\t\tsum.Sum16 += int(buff[bj])\n\t\t\t}\n\t\t}\n\t\ttotal += int64(count)\n\t}\n\tsum.Done = time.Now()\n\tsum.Files += 1\n\tsum.Size += total\n\tif !isin(\"-s\",argv) {\n\t\tfmt.Printf(\"%v \",total)\n\t}\n\treturn 0\n}\n\n\/\/ <a name=\"grep\">grep<\/a>\n\/\/ \"lines\", \"lin\" or \"lnp\" for \"(text) line processor\" or \"scanner\"\n\/\/ a*,!ab,c, ... sequentioal combination of patterns\n\/\/ what \"LINE\" is should be definable\n\/\/ generic line-by-line processing\n\/\/ grep [-v]\n\/\/ cat -n -v\n\/\/ uniq [-c]\n\/\/ tail -f\n\/\/ sed s\/x\/y\/ or awk\n\/\/ grep with line count like wc\n\/\/ rewrite contents if specified\nfunc (gsh*GshContext)xGrep(path string,rexpv[]string)(int){\n\tfile, err := os.OpenFile(path,os.O_RDONLY,0)\n\tif err != nil {\n\t\tfmt.Printf(\"--E-- grep %v (%v)\\n\",path,err)\n\t\treturn -1\n\t}\n\tdefer file.Close()\n\tif gsh.CmdTrace { fmt.Printf(\"--I-- grep %v %v\\n\",path,rexpv) }\n\t\/\/reader := bufio.NewReaderSize(file,LINESIZE)\n\treader := bufio.NewReaderSize(file,80)\n\tli := 0\n\tfound := 0\n\tfor li = 0; ; li++ {\n\t\tline, err := reader.ReadString('\\n')\n\t\tif len(line) <= 0 {\n\t\t\tbreak\n\t\t}\n\t\tif 150 < len(line) {\n\t\t\t\/\/ maybe binary\n\t\t\tbreak;\n\t\t}\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tif 0 <= strings.Index(string(line),rexpv[0]) {\n\t\t\tfound += 1\n\t\t\tfmt.Printf(\"%s:%d: %s\",path,li,line)\n\t\t}\n\t}\n\t\t\/\/fmt.Printf(\"total %d lines %s\\n\",li,path)\n\t\/\/if( 0 < found ){ fmt.Printf(\"((found %d lines %s))\\n\",found,path); }\n\treturn found\n}\n\n\/\/ <a name=\"finder\">Finder<\/a>\n\/\/ finding files with it name and contents\n\/\/ file names are ORed\n\/\/ show the content with %x fmt list\n\/\/ ls -R\n\/\/ tar command by adding output\ntype fileSum struct {\n\tErr\tint64\t\/\/ access error or so\n\tSize\tint64\t\/\/ content size\n\tDupSize\tint64\t\/\/ content size from hard links\n\tBlocks\tint64\t\/\/ number of blocks (of 512 bytes)\n\tDupBlocks int64\t\/\/ Blocks pointed from hard links\n\tHLinks\tint64\t\/\/ hard links\n\tWords\tint64\n\tLines\tint64\n\tFiles\tint64\n\tDirs\tint64\t\/\/ the num. of directories\n\tSymLink\tint64\n\tFlats\tint64\t\/\/ the num. of flat files\n\tMaxDepth\tint64\n\tMaxNamlen\tint64\t\/\/ max. name length\n\tnextRepo\ttime.Time\n}\nfunc showFusage(dir string,fusage *fileSum){\n\tbsume := float64(((fusage.Blocks-fusage.DupBlocks)\/2)*1024)\/1000000.0\n\t\/\/bsumdup := float64((fusage.Blocks\/2)*1024)\/1000000.0\n\n\tfmt.Printf(\"%v: %v files (%vd %vs %vh) %.6f MB (%.2f MBK)\\n\",\n\t\tdir,\n\t\tfusage.Files,\n\t\tfusage.Dirs,\n\t\tfusage.SymLink,\n\t\tfusage.HLinks,\n\t\tfloat64(fusage.Size)\/1000000.0,bsume);\n}\nconst (\n\tS_IFMT    = 0170000\n\tS_IFCHR   = 0020000\n\tS_IFDIR   = 0040000\n\tS_IFREG   = 0100000\n\tS_IFLNK   = 0120000\n\tS_IFSOCK  = 0140000\n)\nfunc cumFinfo(fsum *fileSum, path string, staterr error, fstat syscall.Stat_t, argv[]string,verb bool)(*fileSum){\n\tnow := time.Now()\n\tif time.Second <= now.Sub(fsum.nextRepo) {\n\t\tif !fsum.nextRepo.IsZero(){\n\t\t\ttstmp := now.Format(time.Stamp)\n\t\t\tshowFusage(tstmp,fsum)\n\t\t}\n\t\tfsum.nextRepo = now.Add(time.Second)\n\t}\n\tif staterr != nil {\n\t\tfsum.Err += 1\n\t\treturn fsum\n\t}\n\tfsum.Files += 1\n\tif 1 < fstat.Nlink {\n\t\t\/\/ must count only once...\n\t\t\/\/ at least ignore ones in the same directory\n\t\t\/\/if finfo.Mode().IsRegular() {\n\t\tif (fstat.Mode & S_IFMT) == S_IFREG {\n\t\t\tfsum.HLinks += 1\n\t\t\tfsum.DupBlocks += int64(fstat.Blocks)\n\t\t\t\/\/fmt.Printf(\"---Dup HardLink %v %s\\n\",fstat.Nlink,path)\n\t\t}\n\t}\n\t\/\/fsum.Size += finfo.Size()\n\tfsum.Size += fstat.Size\n\tfsum.Blocks += int64(fstat.Blocks) \n\t\/\/if verb { fmt.Printf(\"(%8dBlk) %s\",fstat.Blocks\/2,path) }\n\tif isin(\"-ls\",argv){\n\t\t\/\/if verb { fmt.Printf(\"%4d %8d \",fstat.Blksize,fstat.Blocks) }\n\/\/\t\tfmt.Printf(\"%d\\t\",fstat.Blocks\/2)\n\t}\n\t\/\/if finfo.IsDir()\n\tif (fstat.Mode & S_IFMT) == S_IFDIR {\n\t\tfsum.Dirs += 1\n\t}\n\t\/\/if (finfo.Mode() & os.ModeSymlink) != 0 \n\tif (fstat.Mode & S_IFMT) == S_IFLNK {\n\t\t\/\/if verb { fmt.Printf(\"symlink(%v,%s)\\n\",fstat.Mode,finfo.Name()) }\n\t\t\/\/{ fmt.Printf(\"symlink(%o,%s)\\n\",fstat.Mode,finfo.Name()) }\n\t\tfsum.SymLink += 1\n\t}\n\treturn fsum\n}\nfunc (gsh*GshContext)xxFindEntv(depth int,total *fileSum,dir string, dstat syscall.Stat_t, ei int, entv []string,npatv[]string,argv[]string)(*fileSum){\n\tnols := isin(\"-grep\",argv)\n\t\/\/ sort entv\n\t\/*\n\tif isin(\"-t\",argv){\n\t\tsort.Slice(filev, func(i,j int) bool {\n\t\t\treturn 0 < filev[i].ModTime().Sub(filev[j].ModTime())\n\t\t})\n\t}\n\t*\/\n\t\t\/*\n\t\tif isin(\"-u\",argv){\n\t\t\tsort.Slice(filev, func(i,j int) bool {\n\t\t\t\treturn 0 < filev[i].AccTime().Sub(filev[j].AccTime())\n\t\t\t})\n\t\t}\n\t\tif isin(\"-U\",argv){\n\t\t\tsort.Slice(filev, func(i,j int) bool {\n\t\t\t\treturn 0 < filev[i].CreatTime().Sub(filev[j].CreatTime())\n\t\t\t})\n\t\t}\n\t\t*\/\n\t\/*\n\tif isin(\"-S\",argv){\n\t\tsort.Slice(filev, func(i,j int) bool {\n\t\t\treturn filev[j].Size() < filev[i].Size()\n\t\t})\n\t}\n\t*\/\n\tfor _,filename := range entv {\n\t\tfor _,npat := range npatv {\n\t\t\tmatch := true\n\t\t\tif npat == \"*\" {\n\t\t\t\tmatch = true\n\t\t\t}else{\n\t\t\t\tmatch, _ = filepath.Match(npat,filename)\n\t\t\t}\n\t\t\tpath := dir + DIRSEP + filename\n\t\t\tif !match {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvar fstat syscall.Stat_t\n\t\t\tstaterr := syscall.Lstat(path,&fstat)\n\t\t\tif staterr != nil {\n\t\t\t\tif !isin(\"-w\",argv){fmt.Printf(\"ufind: %v\\n\",staterr) }\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif isin(\"-du\",argv) && (fstat.Mode & S_IFMT) == S_IFDIR {\n\t\t\t\t\/\/ should not show size of directory in \"-du\" mode ...\n\t\t\t}else\n\t\t\tif !nols && !isin(\"-s\",argv) && (!isin(\"-du\",argv) || isin(\"-a\",argv)) {\n\t\t\t\tif isin(\"-du\",argv) {\n\t\t\t\t\tfmt.Printf(\"%d\\t\",fstat.Blocks\/2)\n\t\t\t\t}\n\t\t\t\tshowFileInfo(path,argv)\n\t\t\t}\n\t\t\tif true { \/\/ && isin(\"-du\",argv)\n\t\t\t\ttotal = cumFinfo(total,path,staterr,fstat,argv,false)\n\t\t\t}\n\t\t\t\/*\n\t\t\tif isin(\"-wc\",argv) {\n\t\t\t}\n\t\t\t*\/\n\t\t\tif gsh.lastCheckSum.SumType != 0 {\n\t\t\t\tgsh.xCksum(path,argv,&gsh.lastCheckSum);\n\t\t\t}\n\t\t\tx := isinX(\"-grep\",argv); \/\/ -grep will be convenient like -ls\n\t\t\tif 0 <= x && x+1 <= len(argv) { \/\/ -grep will be convenient like -ls\n\t\t\t\tif IsRegFile(path){\n\t\t\t\t\tfound := gsh.xGrep(path,argv[x+1:])\n\t\t\t\t\tif 0 < found {\n\t\t\t\t\t\tfoundv := gsh.CmdCurrent.FoundFile\n\t\t\t\t\t\tif len(foundv) < 10 {\n\t\t\t\t\t\t\tgsh.CmdCurrent.FoundFile =\n\t\t\t\t\t\t\tappend(gsh.CmdCurrent.FoundFile,path)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !isin(\"-r0\",argv) { \/\/ -d 0 in du, -depth n in find\n\t\t\t\t\/\/total.Depth += 1\n\t\t\t\tif (fstat.Mode & S_IFMT) == S_IFLNK {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif dstat.Rdev != fstat.Rdev {\n\t\t\t\t\tfmt.Printf(\"--I-- don't follow differnet device %v(%v) %v(%v)\\n\",\n\t\t\t\t\t\tdir,dstat.Rdev,path,fstat.Rdev)\n\t\t\t\t}\n\t\t\t\tif (fstat.Mode & S_IFMT) == S_IFDIR {\n\t\t\t\t\ttotal = gsh.xxFind(depth+1,total,path,npatv,argv)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn total\n}\nfunc (gsh*GshContext)xxFind(depth int,total *fileSum,dir string,npatv[]string,argv[]string)(*fileSum){\n\tnols := isin(\"-grep\",argv)\n\tdirfile,oerr := os.OpenFile(dir,os.O_RDONLY,0)\n\tif oerr == nil {\n\t\t\/\/fmt.Printf(\"--I-- %v(%v)[%d]\\n\",dir,dirfile,dirfile.Fd())\n\t\tdefer dirfile.Close()\n\t}else{\n\t}\n\n\tprev := *total\n\tvar dstat syscall.Stat_t\n\tstaterr := syscall.Lstat(dir,&dstat) \/\/ should be flstat\n\n\tif staterr != nil {\n\t\tif !isin(\"-w\",argv){ fmt.Printf(\"ufind: %v\\n\",staterr) }\n\t\treturn total\n\t}\n\t\t\/\/filev,err := ioutil.ReadDir(dir)\n\t\t\/\/_,err := ioutil.ReadDir(dir) \/\/ ReadDir() heavy and bad for huge directory\n\t\t\/*\n\t\tif err != nil {\n\t\t\tif !isin(\"-w\",argv){ fmt.Printf(\"ufind: %v\\n\",err) }\n\t\t\treturn total\n\t\t}\n\t\t*\/\n\tif depth == 0 {\n\t\ttotal = cumFinfo(total,dir,staterr,dstat,argv,true)\n\t\tif !nols && !isin(\"-s\",argv) && (!isin(\"-du\",argv) || isin(\"-a\",argv)) {\n\t\t\tshowFileInfo(dir,argv)\n\t\t}\n\t}\n\t\/\/ it it is not a directory, just scan it and finish\n\n\tfor ei := 0; ; ei++ {\n\t\tentv,rderr := dirfile.Readdirnames(8*1024)\n\t\tif len(entv) == 0 || rderr != nil {\n\t\t\t\/\/if rderr != nil { fmt.Printf(\"[%d] len=%d (%v)\\n\",ei,len(entv),rderr) }\n\t\t\tbreak\n\t\t}\n\t\tif 0 < ei {\n\t\t\tfmt.Printf(\"--I-- xxFind[%d] %d large-dir: %s\\n\",ei,len(entv),dir)\n\t\t}\n\t\ttotal = gsh.xxFindEntv(depth,total,dir,dstat,ei,entv,npatv,argv)\n\t}\n\tif isin(\"-du\",argv) {\n\t\t\/\/ if in \"du\" mode\n\t\tfmt.Printf(\"%d\\t%s\\n\",(total.Blocks-prev.Blocks)\/2,dir)\n\t}\n\treturn total\n}\n\n\/\/ {ufind|fu|ls} [Files] [\/\/ Names] [-- Expressions]\n\/\/  Files is \".\" by default\n\/\/  Names is \"*\" by default\n\/\/  Expressions is \"-print\" by default for \"ufind\", or -du for \"fu\" command\nfunc (gsh*GshContext)xFind(argv[]string){\n\tif 0 < len(argv) && strBegins(argv[0],\"?\"){\n\t\tshowFound(gsh,argv)\n\t\treturn\n\t}\n\tif isin(\"-cksum\",argv) || isin(\"-sum\",argv) {\n\t\tgsh.lastCheckSum = CheckSum{}\n\t\tif isin(\"-sum\",argv) && isin(\"-add\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_SUM64\n\t\t}else\n\t\tif isin(\"-sum\",argv) && isin(\"-size\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_SIZE\n\t\t}else\n\t\tif isin(\"-sum\",argv) && isin(\"-bsd\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_SUM16_BSD\n\t\t}else\n\t\tif isin(\"-sum\",argv) && isin(\"-sysv\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_SUM16_SYSV\n\t\t}else\n\t\tif isin(\"-sum\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_SUM64\n\t\t}\n\t\tif isin(\"-unix\",argv) {\n\t\t\tgsh.lastCheckSum.SumType |= SUM_UNIXFILE\n\t\t\tgsh.lastCheckSum.Crc32Table = *crc32.MakeTable(CRC32UNIX)\n\t\t}\n\t\tif isin(\"-ieee\",argv){\n\t\t\tgsh.lastCheckSum.SumType |= SUM_CRCIEEE\n\t\t\tgsh.lastCheckSum.Crc32Table = *crc32.MakeTable(CRC32IEEE)\n\t\t}\n\t\tgsh.lastCheckSum.RusgAtStart = Getrusagev()\n\t}\n\tvar total = fileSum{}\n\tnpats := []string{}\n\tfor _,v := range argv {\n\t\tif 0 < len(v) && v[0] != '-' {\n\t\t\tnpats = append(npats,v)\n\t\t}\n\t\tif v == \"\/\/\" { break }\n\t\tif v == \"--\" { break }\n\t\tif v == \"-grep\" { break }\n\t\tif v == \"-ls\" { break }\n\t}\n\tif len(npats) == 0 {\n\t\tnpats = []string{\"*\"}\n\t}\n\tcwd := \".\"\n\t\/\/ if to be fullpath ::: cwd, _ := os.Getwd()\n\tif len(npats) == 0 { npats = []string{\"*\"} }\n\tfusage := gsh.xxFind(0,&total,cwd,npats,argv)\n\tif gsh.lastCheckSum.SumType != 0 {\n\t\tvar sumi uint64 = 0\n\t\tsum := &gsh.lastCheckSum\n\t\tif (sum.SumType & SUM_SIZE) != 0 {\n\t\t\tsumi = uint64(sum.Size)\n\t\t}\n\t\tif (sum.SumType & SUM_SUM64) != 0 {\n\t\t\tsumi = sum.Sum64\n\t\t}\n\t\tif (sum.SumType & SUM_SUM16_SYSV) != 0 {\n\t\t\ts := uint32(sum.Sum16)\n\t\t\tr := (s & 0xFFFF) + ((s & 0xFFFFFFFF) >> 16)\n\t\t\ts = (r & 0xFFFF) + (r >> 16)\n\t\t\tsum.Crc32Val = uint32(s)\n\t\t\tsumi = uint64(s)\n\t\t}\n\t\tif (sum.SumType & SUM_SUM16_BSD) != 0 {\n\t\t\tsum.Crc32Val = uint32(sum.Sum16)\n\t\t\tsumi = uint64(sum.Sum16)\n\t\t}\n\t\tif (sum.SumType & SUM_UNIXFILE) != 0 {\n\t\t\tsum.Crc32Val = byteCRC32end(sum.Crc32Val,uint64(sum.Size))\n\t\t\tsumi = uint64(byteCRC32end(sum.Crc32Val,uint64(sum.Size)))\n\t\t}\n\t\tif 1 < sum.Files {\n\t\t\tfmt.Printf(\"%v %v \/\/ %v \/ %v files, %v\/file\\r\\n\",\n\t\t\t\tsumi,sum.Size,\n\t\t\t\tabssize(sum.Size),sum.Files,\n\t\t\t\tabssize(sum.Size\/sum.Files))\n\t\t}else{\n\t\t\tfmt.Printf(\"%v %v %v\\n\",\n\t\t\t\tsumi,sum.Size,npats[0])\n\t\t}\n\t}\n\tif !isin(\"-grep\",argv) {\n\t\tshowFusage(\"total\",fusage)\n\t}\n\tif !isin(\"-s\",argv){\n\t\thits := len(gsh.CmdCurrent.FoundFile)\n\t\tif 0 < hits {\n\t\t\tfmt.Printf(\"--I-- %d files hits \/\/ can be refered with !%df\\n\",\n\t\t\t\thits,len(gsh.CommandHistory))\n\t\t}\n\t}\n\tif gsh.lastCheckSum.SumType != 0 {\n\t\tif isin(\"-ru\",argv) {\n\t\t\tsum := &gsh.lastCheckSum\n\t\t\tsum.Done = time.Now()\n\t\t\tgsh.lastCheckSum.RusgAtEnd = Getrusagev()\n\t\t\telps := sum.Done.Sub(sum.Start)\n\t\t\tfmt.Printf(\"--cksum-size: %v (%v) \/ %v files, %v\/file\\r\\n\",\n\t\t\t\tsum.Size,abssize(sum.Size),sum.Files,abssize(sum.Size\/sum.Files))\n\t\t\tnanos := int64(elps)\n\t\t\tfmt.Printf(\"--cksum-time: %v\/total, %v\/file, %.1f files\/s, %v\\r\\n\",\n\t\t\t\tabbtime(nanos),\n\t\t\t\tabbtime(nanos\/sum.Files),\n\t\t\t\t(float64(sum.Files)*1000000000.0)\/float64(nanos),\n\t\t\t\tabbspeed(sum.Size,nanos))\n\t\t\tdiff := RusageSubv(sum.RusgAtEnd,sum.RusgAtStart)\n\t\t\tfmt.Printf(\"--cksum-rusg: %v\\n\",sRusagef(\"\",argv,diff))\n\t\t}\n\t}\n\treturn\n}\n\nfunc showFiles(files[]string){\n\tsp := \"\"\n\tfor i,file := range files {\n\t\tif 0 < i { sp = \" \" } else { sp = \"\" }\n\t\tfmt.Printf(sp+\"%s\",escapeWhiteSP(file))\n\t}\n}\nfunc showFound(gshCtx *GshContext, argv[]string){\n\tfor i,v := range gshCtx.CommandHistory {\n\t\tif 0 < len(v.FoundFile) {\n\t\t\tfmt.Printf(\"!%d (%d) \",i,len(v.FoundFile))\n\t\t\tif isin(\"-ls\",argv){\n\t\t\t\tfmt.Printf(\"\\n\")\n\t\t\t\tfor _,file := range v.FoundFile {\n\t\t\t\t\tfmt.Printf(\"\") \/\/sub number?\n\t\t\t\t\tshowFileInfo(file,argv)\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tshowFiles(v.FoundFile)\n\t\t\t\tfmt.Printf(\"\\n\")\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc showMatchFile(filev []os.FileInfo, npat,dir string, argv[]string)(string,bool){\n\tfname := \"\"\n\tfound := false\n\tfor _,v := range filev {\n\t\tmatch, _ := filepath.Match(npat,(v.Name()))\n\t\tif match {\n\t\t\tfname = v.Name()\n\t\t\tfound = true\n\t\t\t\/\/fmt.Printf(\"[%d] %s\\n\",i,v.Name())\n\t\t\tshowIfExecutable(fname,dir,argv)\n\t\t}\n\t}\n\treturn fname,found\n}\nfunc showIfExecutable(name,dir string,argv[]string)(ffullpath string,ffound bool){\n\tvar fullpath string\n\tif strBegins(name,DIRSEP){\n\t\tfullpath = name\n\t}else{\n\t\tfullpath = dir + DIRSEP + name\n\t}\n\tfi, err := os.Stat(fullpath)\n\tif err != nil {\n\t\tfullpath = dir + DIRSEP + name + \".go\"\n\t\tfi, err = os.Stat(fullpath)\n\t}\n\tif err == nil {\n\t\tfm := fi.Mode()\n\t\tif fm.IsRegular() {\n\t\t  \/\/ R_OK=4, W_OK=2, X_OK=1, F_OK=0\n\t\t  if syscall.Access(fullpath,5) == nil {\n\t\t\tffullpath = fullpath\n\t\t\tffound = true\n\t\t\tif ! isin(\"-s\", argv) {\n\t\t\t\tshowFileInfo(fullpath,argv)\n\t\t\t}\n\t\t  }\n\t\t}\n\t}\n\treturn ffullpath, ffound\n}\nfunc which(list string, argv []string) (fullpathv []string, itis bool){\n\tif len(argv) <= 1 {\n\t\tfmt.Printf(\"Usage: which comand [-s] [-a] [-ls]\\n\")\n\t\treturn []string{\"\"}, false\n\t}\n\tpath := argv[1]\n\tif strBegins(path,\"\/\") {\n\t\t\/\/ should check if excecutable?\n\t\t_,exOK := showIfExecutable(path,\"\/\",argv)\n\t\tfmt.Printf(\"--D-- %v exOK=%v\\n\",path,exOK)\n\t\treturn []string{path},exOK\n\t}\n\tpathenv, efound := os.LookupEnv(list)\n\tif ! efound {\n\t\tfmt.Printf(\"--E-- which: no \\\"%s\\\" environment\\n\",list)\n\t\treturn []string{\"\"}, false\n\t}\n\tshowall := isin(\"-a\",argv) || 0 <= strings.Index(path,\"*\")\n\tdirv := strings.Split(pathenv,PATHSEP)\n\tffound := false\n\tffullpath := path\n\tfor _, dir := range dirv {\n\t\tif 0 <= strings.Index(path,\"*\") { \/\/ by wild-card\n\t\t\tlist,_ := ioutil.ReadDir(dir)\n\t\t\tffullpath, ffound = showMatchFile(list,path,dir,argv)\n\t\t}else{\n\t\t\tffullpath, ffound = showIfExecutable(path,dir,argv)\n\t\t}\n\t\t\/\/if ffound && !isin(\"-a\", argv) {\n\t\tif ffound && !showall {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn []string{ffullpath}, ffound\n}\n\nfunc stripLeadingWSParg(argv[]string)([]string){\n\tfor ; 0 < len(argv); {\n\t\tif len(argv[0]) == 0 {\n\t\t\targv = argv[1:]\n\t\t}else{\n\t\t\tbreak\n\t\t}\n\t}\n\treturn argv\n}\nfunc xEval(argv []string, nlend bool){\n\targv = stripLeadingWSParg(argv)\n\tif len(argv) == 0 {\n\t\tfmt.Printf(\"eval [%%format] [Go-expression]\\n\")\n\t\treturn\n\t}\n\tpfmt := \"%v\"\n\tif argv[0][0] == '%' {\n\t\tpfmt = argv[0]\n\t\targv = argv[1:]\n\t}\n\tif len(argv) == 0 {\n\t\treturn\n\t}\n\tgocode := strings.Join(argv,\" \");\n\t\/\/fmt.Printf(\"eval [%v] [%v]\\n\",pfmt,gocode)\n\tfset := token.NewFileSet()\n\trval, _ := types.Eval(fset,nil,token.NoPos,gocode)\n\tfmt.Printf(pfmt,rval.Value)\n\tif nlend { fmt.Printf(\"\\n\") }\n}\n\nfunc getval(name string) (found bool, val int) {\n\t\/* should expand the name here *\/\n\tif name == \"gsh.pid\" {\n\t\treturn true, os.Getpid()\n\t}else\n\tif name == \"gsh.ppid\" {\n\t\treturn true, os.Getppid()\n\t}\n\treturn false, 0\n}\n\nfunc echo(argv []string, nlend bool){\n\tfor ai := 1; ai < len(argv); ai++ {\n\t\tif 1 < ai {\n\t\t\tfmt.Printf(\" \");\n\t\t}\n\t\targ := argv[ai]\n\t\tfound, val := getval(arg)\n\t\tif found {\n\t\t\tfmt.Printf(\"%d\",val)\n\t\t}else{\n\t\t\tfmt.Printf(\"%s\",arg)\n\t\t}\n\t}\n\tif nlend {\n\t\tfmt.Printf(\"\\n\");\n\t}\n}\n\nfunc resfile() string {\n\treturn \"gsh.tmp\"\n}\n\/\/var resF *File\nfunc resmap() {\n\t\/\/_ , err := os.OpenFile(resfile(), os.O_RDWR|os.O_CREATE, os.ModeAppend)\n\t\/\/ https:\/\/developpaper.com\/solution-to-golang-bad-file-descriptor-problem\/\n\t_ , err := os.OpenFile(resfile(), os.O_RDWR|os.O_CREATE, 0600)\n\tif err != nil {\n\t\tfmt.Printf(\"refF could not open: %s\\n\",err)\n\t}else{\n\t\tfmt.Printf(\"refF opened\\n\")\n\t}\n}\n\n\/\/ @@2020-0821\nfunc gshScanArg(str string,strip int)(argv []string){\n\tvar si = 0\n\tvar sb = 0\n\tvar inBracket = 0\n\tvar arg1 = make([]byte,LINESIZE)\n\tvar ax = 0\n\tdebug := false\n\n\tfor ; si < len(str); si++ {\n\t\tif str[si] != ' ' {\n\t\t\tbreak\n\t\t}\n\t}\n\tsb = si\n\tfor ; si < len(str); si++ {\n\t\tif sb <= si {\n\t\t\tif debug {\n\t\t\t\tfmt.Printf(\"--Da- +%d %2d-%2d %s ... %s\\n\",\n\t\t\t\t\tinBracket,sb,si,arg1[0:ax],str[si:])\n\t\t\t}\n\t\t}\n\t\tch := str[si]\n\t\tif ch  == '{' {\n\t\t\tinBracket += 1\n\t\t\tif 0 < strip && inBracket <= strip {\n\t\t\t\t\/\/fmt.Printf(\"stripLEV %d <= %d?\\n\",inBracket,strip)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif 0 < inBracket {\n\t\t\tif ch == '}' {\n\t\t\t\tinBracket -= 1\n\t\t\t\tif 0 < strip && inBracket < strip {\n\t\t\t\t\t\/\/fmt.Printf(\"stripLEV %d <  %d?\\n\",inBracket,strip)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\targ1[ax] = ch\n\t\t\tax += 1\n\t\t\tcontinue\n\t\t}\n\t\tif str[si] == ' ' {\n\t\t\targv = append(argv,string(arg1[0:ax]))\n\t\t\tif debug {\n\t\t\t\tfmt.Printf(\"--Da- [%v][%v-%v] %s ... %s\\n\",\n\t\t\t\t\t-1+len(argv),sb,si,str[sb:si],string(str[si:]))\n\t\t\t}\n\t\t\tsb = si+1\n\t\t\tax = 0\n\t\t\tcontinue\n\t\t}\n\t\targ1[ax] = ch\n\t\tax += 1\n\t}\n\tif sb < si {\n\t\targv = append(argv,string(arg1[0:ax]))\n\t\tif debug {\n\t\t\tfmt.Printf(\"--Da- [%v][%v-%v] %s ... %s\\n\",\n\t\t\t\t-1+len(argv),sb,si,string(arg1[0:ax]),string(str[si:]))\n\t\t}\n\t}\n\tif debug {\n\t\tfmt.Printf(\"--Da- %d [%s] => [%d]%v\\n\",strip,str,len(argv),argv)\n\t}\n\treturn argv\n}\n\n\/\/ should get stderr (into tmpfile ?) and return\nfunc (gsh*GshContext)Popen(name,mode string)(pin*os.File,pout*os.File,err bool){\n\tvar pv = []int{-1,-1}\n\tsyscall.Pipe(pv)\n\n\txarg := gshScanArg(name,1)\n\tname = strings.Join(xarg,\" \")\n\n\tpin = os.NewFile(uintptr(pv[0]),\"StdoutOf-{\"+name+\"}\")\n\tpout = os.NewFile(uintptr(pv[1]),\"StdinOf-{\"+name+\"}\")\n\tfdix := 0\n\tdir := \"?\"\n\tif mode == \"r\" {\n\t\tdir = \"<\"\n\t\tfdix = 1 \/\/ read from the stdout of the process\n\t}else{\n\t\tdir = \">\"\n\t\tfdix = 0 \/\/ write to the stdin of the process\n\t}\n\tgshPA := gsh.gshPA\n\tsavfd := gshPA.Files[fdix]\n\n\tvar fd uintptr = 0\n\tif mode == \"r\" {\n\t\tfd = pout.Fd()\n\t\tgshPA.Files[fdix] = pout.Fd()\n\t}else{\n\t\tfd = pin.Fd()\n\t\tgshPA.Files[fdix] = pin.Fd()\n\t}\n\t\t\/\/ should do this by Goroutine?\n\t\tif false {\n\t\t\tfmt.Printf(\"--Ip- Opened fd[%v] %s %v\\n\",fd,dir,name)\n\t\t\tfmt.Printf(\"--RED1 [%d,%d,%d]->[%d,%d,%d]\\n\",\n\t\t\t\tos.Stdin.Fd(),os.Stdout.Fd(),os.Stderr.Fd(),\n\t\t\t\tpin.Fd(),pout.Fd(),pout.Fd())\n\t\t}\n\t\t\tsavi := os.Stdin\n\t\t\tsavo := os.Stdout\n\t\t\tsave := os.Stderr\n\t\t\tos.Stdin  = pin\n\t\t\tos.Stdout = pout\n\t\t\tos.Stderr = pout\n\t\tgsh.BackGround = true\n\t\tgsh.gshelllh(name)\n\t\tgsh.BackGround = false\n\t\t\tos.Stdin  = savi\n\t\t\tos.Stdout = savo\n\t\t\tos.Stderr = save\n\n\tgshPA.Files[fdix] = savfd\n\treturn pin,pout,false\n}\n\n\/\/ <a name=\"ex-commands\">External commands<\/a>\nfunc (gsh*GshContext)excommand(exec bool, argv []string) (notf bool,exit bool) {\n\tif gsh.CmdTrace { fmt.Printf(\"--I-- excommand[%v](%v)\\n\",exec,argv) }\n\n\tgshPA := gsh.gshPA\n\tfullpathv, itis := which(\"PATH\",[]string{\"which\",argv[0],\"-s\"})\n\tif itis == false {\n\t\treturn true,false\n\t}\n\tfullpath := fullpathv[0]\n\targv = unescapeWhiteSPV(argv)\n\tif 0 < strings.Index(fullpath,\".go\") {\n\t\tnargv := argv \/\/ []string{}\n\t\tgofullpathv, itis := which(\"PATH\",[]string{\"which\",\"go\",\"-s\"})\n\t\tif itis == false {\n\t\t\tfmt.Printf(\"--F-- Go not found\\n\")\n\t\t\treturn false,true\n\t\t}\n\t\tgofullpath := gofullpathv[0]\n\t\tnargv = []string{ gofullpath, \"run\", fullpath }\n\t\tfmt.Printf(\"--I-- %s {%s %s %s}\\n\",gofullpath,\n\t\t\tnargv[0],nargv[1],nargv[2])\n\t\tif exec {\n\t\t\tsyscall.Exec(gofullpath,nargv,os.Environ())\n\t\t}else{\n\t\t\tpid, _ := syscall.ForkExec(gofullpath,nargv,&gshPA)\n\t\t\tif gsh.BackGround {\n\t\t\t\tfmt.Fprintf(stderr,\"--Ip- in Background pid[%d]%d(%v)\\n\",pid,len(argv),nargv)\n\t\t\t\tgsh.BackGroundJobs = append(gsh.BackGroundJobs,pid)\n\t\t\t}else{\n\t\t\t\trusage := syscall.Rusage {}\n\t\t\t\tsyscall.Wait4(pid,nil,0,&rusage)\n\t\t\t\tgsh.LastRusage = rusage\n\t\t\t\tgsh.CmdCurrent.Rusagev[1] = rusage\n\t\t\t}\n\t\t}\n\t}else{\n\t\tif exec {\n\t\t\tsyscall.Exec(fullpath,argv,os.Environ())\n\t\t}else{\n\t\t\tpid, _ := syscall.ForkExec(fullpath,argv,&gshPA)\n\t\t\t\/\/fmt.Printf(\"[%d]\\n\",pid); \/\/ '&' to be background\n\t\t\tif gsh.BackGround {\n\t\t\t\tfmt.Fprintf(stderr,\"--Ip- in Background pid[%d]%d(%v)\\n\",pid,len(argv),argv)\n\t\t\t\tgsh.BackGroundJobs = append(gsh.BackGroundJobs,pid)\n\t\t\t}else{\n\t\t\t\trusage := syscall.Rusage {}\n\t\t\t\tsyscall.Wait4(pid,nil,0,&rusage);\n\t\t\t\tgsh.LastRusage = rusage\n\t\t\t\tgsh.CmdCurrent.Rusagev[1] = rusage\n\t\t\t}\n\t\t}\n\t}\n\treturn false,false\n}\n\n\/\/ <a name=\"builtin\">Builtin Commands<\/a>\nfunc (gshCtx *GshContext) sleep(argv []string) {\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Sleep 100ms, 100us, 100ns, ...\\n\")\n\t\treturn\n\t}\n\tduration := argv[1];\n\td, err := time.ParseDuration(duration)\n\tif err != nil {\n\t\td, err = time.ParseDuration(duration+\"s\")\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"duration ? %s (%s)\\n\",duration,err)\n\t\t\treturn\n\t\t}\n\t}\n\t\/\/fmt.Printf(\"Sleep %v\\n\",duration)\n\ttime.Sleep(d)\n\tif 0 < len(argv[2:]) {\n\t\tgshCtx.gshellv(argv[2:])\n\t}\n}\nfunc (gshCtx *GshContext)repeat(argv []string) {\n\tif len(argv) < 2 {\n\t\treturn\n\t}\n\tstart0 := time.Now()\n\tfor ri,_ := strconv.Atoi(argv[1]); 0 < ri; ri-- {\n\t\tif 0 < len(argv[2:]) {\n\t\t\t\/\/start := time.Now()\n\t\t\tgshCtx.gshellv(argv[2:])\n\t\t\tend := time.Now()\n\t\t\telps := end.Sub(start0);\n\t\t\tif( 1000000000 < elps ){\n\t\t\t\tfmt.Printf(\"(repeat#%d %v)\\n\",ri,elps);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (gshCtx *GshContext)gen(argv []string) {\n\tgshPA := gshCtx.gshPA\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: %s N\\n\",argv[0])\n\t\treturn\n\t}\n\t\/\/ should br repeated by \"repeat\" command\n\tcount, _ := strconv.Atoi(argv[1])\n\tfd := gshPA.Files[1] \/\/ Stdout\n\tfile := os.NewFile(fd,\"internalStdOut\")\n\tfmt.Printf(\"--I-- Gen. Count=%d to [%d]\\n\",count,file.Fd())\n\t\/\/buf := []byte{}\n\toutdata := \"0123 5678 0123 5678 0123 5678 0123 5678\\r\"\n\tfor gi := 0; gi < count; gi++ {\n\t\tfile.WriteString(outdata)\n\t}\n\t\/\/file.WriteString(\"\\n\")\n\tfmt.Printf(\"\\n(%d B)\\n\",count*len(outdata));\n\t\/\/file.Close()\n}\n\n\/\/ <a name=\"rexec\">Remote Execution<\/a> \/\/ 2020-0820\nfunc Elapsed(from time.Time)(string){\n\telps := time.Now().Sub(from)\n\tif 1000000000 < elps {\n\t\treturn fmt.Sprintf(\"[%5d.%02ds]\",elps\/1000000000,(elps%1000000000)\/10000000)\n\t}else\n\tif 1000000 < elps {\n\t\treturn fmt.Sprintf(\"[%3d.%03dms]\",elps\/1000000,(elps%1000000)\/1000)\n\t}else{\n\t\treturn fmt.Sprintf(\"[%3d.%03dus]\",elps\/1000,(elps%1000))\n\t}\n}\nfunc abbtime(nanos int64)(string){\n\tif 1000000000 < nanos {\n\t\treturn fmt.Sprintf(\"%d.%02ds\",nanos\/1000000000,(nanos%1000000000)\/10000000)\n\t}else\n\tif 1000000 < nanos {\n\t\treturn fmt.Sprintf(\"%d.%03dms\",nanos\/1000000,(nanos%1000000)\/1000)\n\t}else{\n\t\treturn fmt.Sprintf(\"%d.%03dus\",nanos\/1000,(nanos%1000))\n\t}\n}\nfunc abssize(size int64)(string){\n\tfsize := float64(size)\n\tif 1024*1024*1024 < size {\n\t\treturn fmt.Sprintf(\"%.2fGiB\",fsize\/(1024*1024*1024))\n\t}else\n\tif 1024*1024 < size {\n\t\treturn fmt.Sprintf(\"%.3fMiB\",fsize\/(1024*1024))\n\t}else{\n\t\treturn fmt.Sprintf(\"%.3fKiB\",fsize\/1024)\n\t}\n}\nfunc absize(size int64)(string){\n\tfsize := float64(size)\n\tif 1024*1024*1024 < size {\n\t\treturn fmt.Sprintf(\"%8.2fGiB\",fsize\/(1024*1024*1024))\n\t}else\n\tif 1024*1024 < size {\n\t\treturn fmt.Sprintf(\"%8.3fMiB\",fsize\/(1024*1024))\n\t}else{\n\t\treturn fmt.Sprintf(\"%8.3fKiB\",fsize\/1024)\n\t}\n}\nfunc abbspeed(totalB int64,ns int64)(string){\n\tMBs := (float64(totalB)\/1000000) \/ (float64(ns)\/1000000000)\n\tif 1000 <= MBs {\n\t\treturn fmt.Sprintf(\"%6.3fGB\/s\",MBs\/1000)\n\t}\n\tif 1 <= MBs {\n\t\treturn fmt.Sprintf(\"%6.3fMB\/s\",MBs)\n\t}else{\n\t\treturn fmt.Sprintf(\"%6.3fKB\/s\",MBs*1000)\n\t}\n}\nfunc abspeed(totalB int64,ns time.Duration)(string){\n\tMBs := (float64(totalB)\/1000000) \/ (float64(ns)\/1000000000)\n\tif 1000 <= MBs {\n\t\treturn fmt.Sprintf(\"%6.3fGBps\",MBs\/1000)\n\t}\n\tif 1 <= MBs {\n\t\treturn fmt.Sprintf(\"%6.3fMBps\",MBs)\n\t}else{\n\t\treturn fmt.Sprintf(\"%6.3fKBps\",MBs*1000)\n\t}\n}\nfunc fileRelay(what string,in*os.File,out*os.File,size int64,bsiz int)(wcount int64){\n\tStart := time.Now()\n\tbuff := make([]byte,bsiz)\n\tvar total int64 = 0\n\tvar rem int64 = size\n\tnio := 0\n\tPrev := time.Now()\n\tvar PrevSize int64 = 0\n\n\tfmt.Printf(Elapsed(Start)+\"--In- X: %s (%v\/%v\/%v) START\\n\",\n\t\twhat,absize(total),size,nio)\n\n\tfor i:= 0; ; i++ {\n\t\tvar len = bsiz\n\t\tif int(rem) < len {\n\t\t\tlen = int(rem)\n\t\t}\n\t\tNow := time.Now()\n\t\tElps := Now.Sub(Prev);\n\t\tif 1000000000 < Now.Sub(Prev) {\n\t\t\tfmt.Printf(Elapsed(Start)+\"--In- X: %s (%v\/%v\/%v) %s\\n\",\n\t\t\t\twhat,absize(total),size,nio,\n\t\t\t\tabspeed((total-PrevSize),Elps))\n\t\t\tPrev = Now;\n\t\t\tPrevSize = total\n\t\t}\n\t\trlen := len\n\t\tif in != nil {\n\t\t\t\/\/ should watch the disconnection of out\n\t\t\trcc,err := in.Read(buff[0:rlen])\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--En- X: %s read(%v,%v)<%v\\n\",\n\t\t\t\t\twhat,rcc,err,in.Name())\n\t\t\t\tbreak\n\t\t\t}\n\t\t\trlen = rcc\n\t\t\tif string(buff[0:10]) == \"((SoftEOF \" {\n\t\t\t\tvar ecc int64 = 0\n\t\t\t\tfmt.Sscanf(string(buff),\"((SoftEOF %v\",&ecc)\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--En- X: %s Recv ((SoftEOF %v))\/%v\\n\",\n\t\t\t\t\twhat,ecc,total)\n\t\t\t\tif ecc == total {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twlen := rlen\n\t\tif out != nil {\n\t\t\twcc,err := out.Write(buff[0:rlen])\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"-En-- X: %s write(%v,%v)>%v\\n\",\n\t\t\t\t\twhat,wcc,err,out.Name())\n\t\t\t\tbreak\n\t\t\t}\n\t\t\twlen = wcc\n\t\t}\n\t\tif wlen < rlen {\n\t\t\tfmt.Printf(Elapsed(Start)+\"--En- X: %s incomplete write (%v\/%v)\\n\",\n\t\t\t\twhat,wlen,rlen)\n\t\t\tbreak;\n\t\t}\n\n\t\tnio += 1\n\t\ttotal += int64(rlen)\n\t\trem -= int64(rlen)\n\t\tif rem <= 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\tDone := time.Now()\n\tElps := float64(Done.Sub(Start))\/1000000000 \/\/Seconds\n\tTotalMB := float64(total)\/1000000 \/\/MB\n\tMBps := TotalMB \/ Elps\n\tfmt.Printf(Elapsed(Start)+\"--In- X: %s (%v\/%v\/%v) %v %.3fMB\/s\\n\",\n\t\twhat,total,size,nio,absize(total),MBps)\n\treturn total\n}\nfunc tcpPush(clnt *os.File){\n\t\/\/ shrink socket buffer and recover\n\tusleep(100);\n}\nfunc (gsh*GshContext)RexecServer(argv[]string){\n\tdebug := true\n\tStart0 := time.Now()\n\tStart := Start0\n\/\/\tif local == \":\" { local = \"0.0.0.0:9999\" }\n\tlocal := \"0.0.0.0:9999\"\n\n\tif 0 < len(argv) {\n\t\tif argv[0] == \"-s\" {\n\t\t\tdebug = false\n\t\t\targv = argv[1:]\n\t\t}\n\t}\n\tif 0 < len(argv) {\n\t\targv = argv[1:]\n\t}\n\tport, err := net.ResolveTCPAddr(\"tcp\",local);\n\tif err != nil {\n\t\tfmt.Printf(\"--En- S: Address error: %s (%s)\\n\",local,err)\n\t\treturn\n\t}\n\tfmt.Printf(Elapsed(Start)+\"--In- S: Listening at %s...\\n\",local);\n\tsconn, err := net.ListenTCP(\"tcp\", port)\n\tif err != nil {\n\t\tfmt.Printf(Elapsed(Start)+\"--En- S: Listen error: %s (%s)\\n\",local,err)\n\t\treturn\n\t}\n\n\treqbuf := make([]byte,LINESIZE)\n\tres := \"\"\n\tfor {\n\t\tfmt.Printf(Elapsed(Start0)+\"--In- S: Listening at %s...\\n\",local);\n\t\taconn, err := sconn.AcceptTCP()\n\t\tStart = time.Now()\n\t\tif err != nil {\n\t\t\tfmt.Printf(Elapsed(Start)+\"--En- S: Accept error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tclnt, _ := aconn.File()\n\t\tfd := clnt.Fd()\n\t\tar := aconn.RemoteAddr()\n\t\tif debug { fmt.Printf(Elapsed(Start0)+\"--In- S: Accepted TCP at %s [%d] <- %v\\n\",\n\t\t\tlocal,fd,ar) }\n\t\tres = fmt.Sprintf(\"220 GShell\/%s Server\\r\\n\",VERSION)\n\t\tfmt.Fprintf(clnt,\"%s\",res)\n\t\tif debug { fmt.Printf(Elapsed(Start)+\"--In- S: %s\",res) }\n\t\tcount, err := clnt.Read(reqbuf)\n\t\tif err != nil {\n\t\t\tfmt.Printf(Elapsed(Start)+\"--En- C: (%v %v) %v\",\n\t\t\t\tcount,err,string(reqbuf))\n\t\t}\n\t\treq := string(reqbuf[:count])\n\t\tif debug { fmt.Printf(Elapsed(Start)+\"--In- C: %v\",string(req)) }\n\t\treqv := strings.Split(string(req),\"\\r\")\n\t\tcmdv := gshScanArg(reqv[0],0)\n\t\t\/\/cmdv := strings.Split(reqv[0],\" \")\n\t\tswitch cmdv[0] {\n\t\t\tcase \"HELO\":\n\t\t\t\tres = fmt.Sprintf(\"250 %v\",req)\n\t\t\tcase \"GET\":\n\t\t\t\t\/\/ download {remotefile|-zN} [localfile]\n\t\t\t\tvar dsize int64 = 32*1024*1024\n\t\t\t\tvar bsize int = 64*1024\n\t\t\t\tvar fname string = \"\"\n\t\t\t\tvar in *os.File = nil\n\t\t\t\tvar pseudoEOF = false\n\t\t\t\tif 1 < len(cmdv) {\n\t\t\t\t\tfname = cmdv[1]\n\t\t\t\t\tif strBegins(fname,\"-z\") {\n\t\t\t\t\t\tfmt.Sscanf(fname[2:],\"%d\",&dsize)\n\t\t\t\t\t}else\n\t\t\t\t\tif strBegins(fname,\"{\") {\n\t\t\t\t\t\txin,xout,err := gsh.Popen(fname,\"r\")\n\t\t\t\t\t\tif err {\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\txout.Close()\n\t\t\t\t\t\t\tdefer xin.Close()\n\t\t\t\t\t\t\tin = xin\n\t\t\t\t\t\t\tdsize = MaxStreamSize\n\t\t\t\t\t\t\tpseudoEOF = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\txin,err := os.Open(fname)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tfmt.Printf(\"--En- GET (%v)\\n\",err)\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tdefer xin.Close()\n\t\t\t\t\t\t\tin = xin\n\t\t\t\t\t\t\tfi,_ := xin.Stat()\n\t\t\t\t\t\t\tdsize = fi.Size()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\/\/fmt.Printf(Elapsed(Start)+\"--In- GET %v:%v\\n\",dsize,bsize)\n\t\t\t\tres = fmt.Sprintf(\"200 %v\\r\\n\",dsize)\n\t\t\t\tfmt.Fprintf(clnt,\"%v\",res)\n\t\t\t\ttcpPush(clnt); \/\/ should be separated as line in receiver\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: %v\",res)\n\t\t\t\twcount := fileRelay(\"SendGET\",in,clnt,dsize,bsize)\n\t\t\t\tif pseudoEOF {\n\t\t\t\t\tin.Close() \/\/ pipe from the command\n\t\t\t\t\t\/\/ show end of stream data (its size) by OOB?\n\t\t\t\t\tSoftEOF := fmt.Sprintf(\"((SoftEOF %v))\",wcount)\n\t\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: Send %v\\n\",SoftEOF)\n\n\t\t\t\t\ttcpPush(clnt); \/\/ to let SoftEOF data apper at the top of recevied data\n\t\t\t\t\tfmt.Fprintf(clnt,\"%v\\r\\n\",SoftEOF)\n\t\t\t\t\ttcpPush(clnt); \/\/ to let SoftEOF alone in a packet (separate with 200 OK)\n\t\t\t\t\t\t\/\/ with client generated random?\n\t\t\t\t\t\/\/fmt.Printf(\"--In- L: close %v (%v)\\n\",in.Fd(),in.Name())\n\t\t\t\t}\n\t\t\t\tres = fmt.Sprintf(\"200 GET done\\r\\n\")\n\t\t\tcase \"PUT\":\n\t\t\t\t\/\/ upload {srcfile|-zN} [dstfile]\n\t\t\t\tvar dsize int64 = 32*1024*1024\n\t\t\t\tvar bsize int = 64*1024\n\t\t\t\tvar fname string = \"\"\n\t\t\t\tvar out *os.File = nil\n\t\t\t\tif 1 < len(cmdv) { \/\/ localfile\n\t\t\t\t\tfmt.Sscanf(cmdv[1],\"%d\",&dsize)\n\t\t\t\t}\n\t\t\t\tif 2 < len(cmdv) {\n\t\t\t\t\tfname = cmdv[2]\n\t\t\t\t\tif fname == \"-\" {\n\t\t\t\t\t\t\/\/ nul dev\n\t\t\t\t\t}else\n\t\t\t\t\tif strBegins(fname,\"{\") {\n\t\t\t\t\t\txin,xout,err := gsh.Popen(fname,\"w\")\n\t\t\t\t\t\tif err {\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\txin.Close()\n\t\t\t\t\t\t\tdefer xout.Close()\n\t\t\t\t\t\t\tout = xout\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\/\/ should write to temporary file\n\t\t\t\t\t\/\/ should suppress ^C on tty\n\t\t\txout,err := os.OpenFile(fname,os.O_CREATE|os.O_RDWR|os.O_TRUNC,0600)\n\t\t\t\/\/fmt.Printf(\"--In- S: open(%v) out(%v) err(%v)\\n\",fname,xout,err)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tfmt.Printf(\"--En- PUT (%v)\\n\",err)\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tout = xout\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- L: open(%v,w) %v (%v)\\n\",\n\t\t\t\t\tfname,local,err)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- PUT %v (\/%v)\\n\",dsize,bsize)\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: 200 %v OK\\r\\n\",dsize)\n\t\t\t\tfmt.Fprintf(clnt,\"200 %v OK\\r\\n\",dsize)\n\t\t\t\tfileRelay(\"RecvPUT\",clnt,out,dsize,bsize)\n\t\t\t\tres = fmt.Sprintf(\"200 PUT done\\r\\n\")\n\t\t\tdefault:\n\t\t\t\tres = fmt.Sprintf(\"400 What? %v\",req)\n\t\t}\n\t\tswcc,serr := clnt.Write([]byte(res))\n\t\tif serr != nil {\n\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: (wc=%v er=%v) %v\",swcc,serr,res)\n\t\t}else{\n\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: %v\",res)\n\t\t}\n\t\taconn.Close();\n\t\tclnt.Close();\n\t}\n\tsconn.Close();\n}\nfunc (gsh*GshContext)RexecClient(argv[]string)(int,string){\n\tdebug := true\n\tStart := time.Now()\n\tif len(argv) == 1 {\n\t\treturn -1,\"EmptyARG\"\n\t}\n\targv = argv[1:]\n\tif argv[0] == \"-serv\" {\n\t\tgsh.RexecServer(argv[1:])\n\t\treturn 0,\"Server\"\n\t}\n\tremote := \"0.0.0.0:9999\"\n\tif argv[0][0] == '@' {\n\t\tremote = argv[0][1:]\n\t\targv = argv[1:]\n\t}\n\tif argv[0] == \"-s\" {\n\t\tdebug = false\n\t\targv = argv[1:]\n\t}\n\tdport, err := net.ResolveTCPAddr(\"tcp\",remote);\n\tif err != nil {\n\t\tfmt.Printf(Elapsed(Start)+\"Address error: %s (%s)\\n\",remote,err)\n\t\treturn -1,\"AddressError\"\n\t}\n\tfmt.Printf(Elapsed(Start)+\"--In- C: Connecting to %s\\n\",remote)\n\tserv, err := net.DialTCP(\"tcp\",nil,dport)\n\tif err != nil {\n\t\tfmt.Printf(Elapsed(Start)+\"Connection error: %s (%s)\\n\",remote,err)\n\t\treturn -1,\"CannotConnect\"\n\t}\n\tif debug {\n\t\tal := serv.LocalAddr()\n\t\tfmt.Printf(Elapsed(Start)+\"--In- C: Connected to %v <- %v\\n\",remote,al)\n\t}\n\n\treq := \"\"\n\tres := make([]byte,LINESIZE)\n\tcount,err := serv.Read(res)\n\tif err != nil {\n\t\tfmt.Printf(\"--En- S: (%3d,%v) %v\",count,err,string(res))\n\t}\n\tif debug { fmt.Printf(Elapsed(Start)+\"--In- S: %v\",string(res)) }\n\n\tif argv[0] == \"GET\" {\n\t\tsavPA := gsh.gshPA\n\t\tvar bsize int = 64*1024\n\t\treq = fmt.Sprintf(\"%v\\r\\n\",strings.Join(argv,\" \"))\n\t\tfmt.Printf(Elapsed(Start)+\"--In- C: %v\",req)\n\t\tfmt.Fprintf(serv,req)\n\t\tcount,err = serv.Read(res)\n\t\tif err != nil {\n\t\t}else{\n\t\t\tvar dsize int64 = 0\n\t\t\tvar out *os.File = nil\n\t\t\tvar out_tobeclosed *os.File = nil\n\t\t\tvar fname string = \"\"\n\t\t\tvar rcode int = 0\n\t\t\tvar pid int = -1\n\t\t\tfmt.Sscanf(string(res),\"%d %d\",&rcode,&dsize)\n\t\t\tfmt.Printf(Elapsed(Start)+\"--In- S: %v\",string(res[0:count]))\n\t\t\tif 3 <= len(argv) {\n\t\t\t\tfname = argv[2]\n\t\t\t\tif strBegins(fname,\"{\") {\n\t\t\t\t\txin,xout,err := gsh.Popen(fname,\"w\")\n\t\t\t\t\tif err {\n\t\t\t\t\t}else{\n\t\t\t\t\t\txin.Close()\n\t\t\t\t\t\tdefer xout.Close()\n\t\t\t\t\t\tout = xout\n\t\t\t\t\t\tout_tobeclosed = xout\n\t\t\t\t\t\tpid = 0 \/\/ should be its pid\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t\/\/ should write to temporary file\n\t\t\t\t\t\/\/ should suppress ^C on tty\n\t\t\t\t\txout,err := os.OpenFile(fname,os.O_CREATE|os.O_RDWR|os.O_TRUNC,0600)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tfmt.Print(\"--En- %v\\n\",err)\n\t\t\t\t\t}\n\t\t\t\t\tout = xout\n\t\t\t\t\t\/\/fmt.Printf(\"--In-- %d > %s\\n\",out.Fd(),fname)\n\t\t\t\t}\n\t\t\t}\n\t\t\tin,_ := serv.File()\n\t\t\tfileRelay(\"RecvGET\",in,out,dsize,bsize)\n\t\t\tif 0 <= pid {\n\t\t\t\tgsh.gshPA = savPA \/\/ recovery of Fd(), and more?\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- L: close Pipe > %v\\n\",fname)\n\t\t\t\tout_tobeclosed.Close()\n\t\t\t\t\/\/syscall.Wait4(pid,nil,0,nil) \/\/@@\n\t\t\t}\n\t\t}\n\t}else\n\tif argv[0] == \"PUT\" {\n\t\tremote, _ := serv.File()\n\t\tvar local *os.File = nil\n\t\tvar dsize int64 = 32*1024*1024\n\t\tvar bsize int = 64*1024\n\t\tvar ofile string = \"-\"\n\t\t\/\/fmt.Printf(\"--I-- Rex %v\\n\",argv)\n\t\tif 1 < len(argv) {\n\t\t\tfname := argv[1]\n\t\t\tif strBegins(fname,\"-z\") {\n\t\t\t\tfmt.Sscanf(fname[2:],\"%d\",&dsize)\n\t\t\t}else\n\t\t\tif strBegins(fname,\"{\") {\n\t\t\t\txin,xout,err := gsh.Popen(fname,\"r\")\n\t\t\t\tif err {\n\t\t\t\t}else{\n\t\t\t\t\txout.Close()\n\t\t\t\t\tdefer xin.Close()\n\t\t\t\t\t\/\/in = xin\n\t\t\t\t\tlocal = xin\n\t\t\t\t\tfmt.Printf(\"--In- [%d] < Upload output of %v\\n\",\n\t\t\t\t\t\tlocal.Fd(),fname)\n\t\t\t\t\tofile = \"-from.\"+fname\n\t\t\t\t\tdsize = MaxStreamSize\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\txlocal,err := os.Open(fname)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"--En- (%s)\\n\",err)\n\t\t\t\t\tlocal = nil\n\t\t\t\t}else{\n\t\t\t\t\tlocal = xlocal\n\t\t\t\t\tfi,_ := local.Stat()\n\t\t\t\t\tdsize = fi.Size()\n\t\t\t\t\tdefer local.Close()\n\t\t\t\t\t\/\/fmt.Printf(\"--I-- Rex in(%v \/ %v)\\n\",ofile,dsize)\n\t\t\t\t}\n\t\t\t\tofile = fname\n\t\t\t\tfmt.Printf(Elapsed(Start)+\"--In- L: open(%v,r)=%v %v (%v)\\n\",\n\t\t\t\t\tfname,dsize,local,err)\n\t\t\t}\n\t\t}\n\t\tif 2 < len(argv) && argv[2] != \"\" {\n\t\t\tofile = argv[2]\n\t\t\t\/\/fmt.Printf(\"(%d)%v B.ofile=%v\\n\",len(argv),argv,ofile)\n\t\t}\n\t\t\/\/fmt.Printf(Elapsed(Start)+\"--I-- Rex out(%v)\\n\",ofile)\n\t\tfmt.Printf(Elapsed(Start)+\"--In- PUT %v (\/%v)\\n\",dsize,bsize)\n\t\treq = fmt.Sprintf(\"PUT %v %v \\r\\n\",dsize,ofile)\n\t\tif debug { fmt.Printf(Elapsed(Start)+\"--In- C: %v\",req) }\n\t\tfmt.Fprintf(serv,\"%v\",req)\n\t\tcount,err = serv.Read(res)\n\t\tif debug { fmt.Printf(Elapsed(Start)+\"--In- S: %v\",string(res[0:count])) }\n\t\tfileRelay(\"SendPUT\",local,remote,dsize,bsize)\n\t}else{\n\t\treq = fmt.Sprintf(\"%v\\r\\n\",strings.Join(argv,\" \"))\n\t\tif debug { fmt.Printf(Elapsed(Start)+\"--In- C: %v\",req) }\n\t\tfmt.Fprintf(serv,\"%v\",req)\n\t\t\/\/fmt.Printf(\"--In- sending RexRequest(%v)\\n\",len(req))\n\t}\n\t\/\/fmt.Printf(Elapsed(Start)+\"--In- waiting RexResponse...\\n\")\n\tcount,err = serv.Read(res)\n\tress := \"\"\n\tif count == 0 {\n\t\tress = \"(nil)\\r\\n\"\n\t}else{\n\t\tress = string(res[:count])\n\t}\n\tif err != nil {\n\t\tfmt.Printf(Elapsed(Start)+\"--En- S: (%d,%v) %v\",count,err,ress)\n\t}else{\n\t\tfmt.Printf(Elapsed(Start)+\"--In- S: %v\",ress)\n\t}\n\tserv.Close()\n\t\/\/conn.Close()\n\n\tvar stat string\n\tvar rcode int\n\tfmt.Sscanf(ress,\"%d %s\",&rcode,&stat)\n\t\/\/fmt.Printf(\"--D-- Client: %v (%v)\",rcode,stat)\n\treturn rcode,ress\n}\n\n\/\/ <a name=\"remote-sh\">Remote Shell<\/a>\n\/\/ gcp file [...] { [host]:[port:][dir] | dir } \/\/ -p | -no-p\nfunc (gsh*GshContext)FileCopy(argv[]string){\n\tvar host = \"\"\n\tvar port = \"\"\n\tvar upload = false\n\tvar download = false\n\tvar xargv = []string{\"rex-gcp\"}\n\tvar srcv = []string{}\n\tvar dstv = []string{}\n\targv = argv[1:]\n\n\tfor _,v := range argv {\n\t\t\/*\n\t\tif v[0] == '-' { \/\/ might be a pseudo file (generated date)\n\t\t\tcontinue\n\t\t}\n\t\t*\/\n\t\tobj := strings.Split(v,\":\")\n\t\t\/\/fmt.Printf(\"%d %v %v\\n\",len(obj),v,obj)\n\t\tif 1 < len(obj) {\n\t\t\thost = obj[0]\n\t\t\tfile := \"\"\n\t\t\tif 0 < len(host) { \n\t\t\t\tgsh.LastServer.host = host\n\t\t\t}else{\n\t\t\t\thost = gsh.LastServer.host\n\t\t\t\tport = gsh.LastServer.port\n\t\t\t}\n\t\t\tif 2 < len(obj) {\n\t\t\t\tport = obj[1]\n\t\t\t\tif 0 < len(port) {\n\t\t\t\t\tgsh.LastServer.port = port\n\t\t\t\t}else{\n\t\t\t\t\tport = gsh.LastServer.port\n\t\t\t\t}\n\t\t\t\tfile = obj[2]\n\t\t\t}else{\n\t\t\t\tfile = obj[1]\n\t\t\t}\n\t\t\tif len(srcv) == 0 {\n\t\t\t\tdownload = true\n\t\t\t\tsrcv = append(srcv,file)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tupload = true\n\t\t\tdstv = append(dstv,file)\n\t\t\tcontinue\n\t\t}\n\t\t\/*\n\t\tidx := strings.Index(v,\":\")\n\t\tif 0 <= idx {\n\t\t\tremote = v[0:idx]\n\t\t\tif len(srcv) == 0 {\n\t\t\t\tdownload = true\n\t\t\t\tsrcv = append(srcv,v[idx+1:])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tupload = true\n\t\t\tdstv = append(dstv,v[idx+1:])\n\t\t\tcontinue\n\t\t}\n\t\t*\/\n\t\tif download {\n\t\t\tdstv = append(dstv,v)\n\t\t}else{\n\t\t\tsrcv = append(srcv,v)\n\t\t}\n\t}\n\thostport := \"@\" + host + \":\" + port\n\tif upload {\n\t\tif host != \"\" { xargv = append(xargv,hostport) }\n\t\txargv = append(xargv,\"PUT\")\n\t\txargv = append(xargv,srcv[0:]...)\n\t\txargv = append(xargv,dstv[0:]...)\n\t\/\/fmt.Printf(\"--I-- FileCopy PUT gsh:\/\/%s\/%v < %v \/\/ %v\\n\",hostport,dstv,srcv,xargv)\n\tfmt.Printf(\"--I-- FileCopy PUT gsh:\/\/%s\/%v < %v\\n\",hostport,dstv,srcv)\n\t\tgsh.RexecClient(xargv)\n\t}else\n\tif download {\n\t\tif host != \"\" { xargv = append(xargv,hostport) }\n\t\txargv = append(xargv,\"GET\")\n\t\txargv = append(xargv,srcv[0:]...)\n\t\txargv = append(xargv,dstv[0:]...)\n\t\/\/fmt.Printf(\"--I-- FileCopy GET gsh:\/\/%v\/%v > %v \/\/ %v\\n\",hostport,srcv,dstv,xargv)\n\tfmt.Printf(\"--I-- FileCopy GET gsh:\/\/%v\/%v > %v\\n\",hostport,srcv,dstv)\n\t\tgsh.RexecClient(xargv)\n\t}else{\n\t}\n}\n\n\/\/ target\nfunc (gsh*GshContext)Trelpath(rloc string)(string){\n\tcwd, _ := os.Getwd()\n\tos.Chdir(gsh.RWD)\n\tos.Chdir(rloc)\n\ttwd, _ := os.Getwd()\n\tos.Chdir(cwd)\n\n\ttpath := twd + \"\/\" + rloc\n\treturn tpath\n}\n\/\/ join to rmote GShell - [user@]host[:port] or cd host:[port]:path\nfunc (gsh*GshContext)Rjoin(argv[]string){\n\tif len(argv) <= 1 {\n\t\tfmt.Printf(\"--I-- current server = %v\\n\",gsh.RSERV)\n\t\treturn\n\t}\n\tserv := argv[1]\n\tservv := strings.Split(serv,\":\")\n\tif 1 <= len(servv) {\n\t\tif servv[0] == \"lo\" {\n\t\t\tservv[0] = \"localhost\"\n\t\t}\n\t}\n\tswitch len(servv) {\n\t\tcase 1:\n\t\t\t\/\/if strings.Index(serv,\":\") < 0 {\n\t\t\tserv = servv[0] + \":\" + fmt.Sprintf(\"%d\",GSH_PORT)\n\t\t\t\/\/}\n\t\tcase 2: \/\/ host:port\n\t\t\tserv = strings.Join(servv,\":\")\n\t}\n\txargv := []string{\"rex-join\",\"@\"+serv,\"HELO\"}\n\trcode,stat := gsh.RexecClient(xargv)\n\tif (rcode \/ 100) == 2 {\n\t\tfmt.Printf(\"--I-- OK Joined (%v) %v\\n\",rcode,stat)\n\t\tgsh.RSERV = serv\n\t}else{\n\t\tfmt.Printf(\"--I-- NG, could not joined (%v) %v\\n\",rcode,stat)\n\t}\n}\nfunc (gsh*GshContext)Rexec(argv[]string){\n\tif len(argv) <= 1 {\n\t\tfmt.Printf(\"--I-- rexec command [ | {file || {command} ]\\n\",gsh.RSERV)\n\t\treturn\n\t}\n\n\t\/*\n\tnargv := gshScanArg(strings.Join(argv,\" \"),0)\n\tfmt.Printf(\"--D-- nargc=%d [%v]\\n\",len(nargv),nargv)\n\tif nargv[1][0] != '{' {\n\t\tnargv[1] = \"{\" + nargv[1] + \"}\"\n\t\tfmt.Printf(\"--D-- nargc=%d [%v]\\n\",len(nargv),nargv)\n\t}\n\targv = nargv\n\t*\/\n\tnargv := []string{}\n\tnargv = append(nargv,\"{\"+strings.Join(argv[1:],\" \")+\"}\")\n\tfmt.Printf(\"--D-- nargc=%d %v\\n\",len(nargv),nargv)\n\targv = nargv\n\n\txargv := []string{\"rex-exec\",\"@\"+gsh.RSERV,\"GET\"}\n\txargv = append(xargv,argv...)\n\txargv = append(xargv,\"\/dev\/tty\")\n\trcode,stat := gsh.RexecClient(xargv)\n\tif (rcode \/ 100) == 2 {\n\t\tfmt.Printf(\"--I-- OK Rexec (%v) %v\\n\",rcode,stat)\n\t}else{\n\t\tfmt.Printf(\"--I-- NG Rexec (%v) %v\\n\",rcode,stat)\n\t}\n}\nfunc (gsh*GshContext)Rchdir(argv[]string){\n\tif len(argv) <= 1 {\n\t\treturn\n\t}\n\tcwd, _ := os.Getwd()\n\tos.Chdir(gsh.RWD)\n\tos.Chdir(argv[1])\n\ttwd, _ := os.Getwd()\n\tgsh.RWD = twd\n\tfmt.Printf(\"--I-- JWD=%v\\n\",twd)\n\tos.Chdir(cwd)\n}\nfunc (gsh*GshContext)Rpwd(argv[]string){\n\tfmt.Printf(\"%v\\n\",gsh.RWD)\n}\nfunc (gsh*GshContext)Rls(argv[]string){\n\tcwd, _ := os.Getwd()\n\tos.Chdir(gsh.RWD)\n\targv[0] = \"-ls\"\n\tgsh.xFind(argv)\n\tos.Chdir(cwd)\n}\nfunc (gsh*GshContext)Rput(argv[]string){\n\tvar local string = \"\"\n\tvar remote string = \"\"\n\tif 1 < len(argv) {\n\t\tlocal = argv[1]\n\t\tremote = local \/\/ base name\n\t}\n\tif 2 < len(argv) {\n\t\tremote = argv[2]\n\t}\n\tfmt.Printf(\"--I-- jput from=%v to=%v\\n\",local,gsh.Trelpath(remote))\n}\nfunc (gsh*GshContext)Rget(argv[]string){\n\tvar remote string = \"\"\n\tvar local string = \"\"\n\tif 1 < len(argv) {\n\t\tremote = argv[1]\n\t\tlocal = remote \/\/ base name\n\t}\n\tif 2 < len(argv) {\n\t\tlocal = argv[2]\n\t}\n\tfmt.Printf(\"--I-- jget from=%v to=%v\\n\",gsh.Trelpath(remote),local)\n}\n\n\/\/ <a name=\"network\">network<\/a>\n\/\/ -s, -si, -so \/\/ bi-directional, source, sync (maybe socket)\nfunc (gshCtx*GshContext)sconnect(inTCP bool, argv []string) {\n\tgshPA := gshCtx.gshPA\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: -s [host]:[port[.udp]]\\n\")\n\t\treturn\n\t}\n\tremote := argv[1]\n\tif remote == \":\" { remote = \"0.0.0.0:9999\" }\n\n\tif inTCP { \/\/ TCP\n\t\tdport, err := net.ResolveTCPAddr(\"tcp\",remote);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tconn, err := net.DialTCP(\"tcp\",nil,dport)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Connection error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := conn.File();\n\t\tfd := file.Fd()\n\t\tfmt.Printf(\"Socket: connected to %s, socket[%d]\\n\",remote,fd)\n\n\t\tsavfd := gshPA.Files[1]\n\t\tgshPA.Files[1] = fd;\n\t\tgshCtx.gshellv(argv[2:])\n\t\tgshPA.Files[1] = savfd\n\t\tfile.Close()\n\t\tconn.Close()\n\t}else{\n\t\t\/\/dport, err := net.ResolveUDPAddr(\"udp4\",remote);\n\t\tdport, err := net.ResolveUDPAddr(\"udp\",remote);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/conn, err := net.DialUDP(\"udp4\",nil,dport)\n\t\tconn, err := net.DialUDP(\"udp\",nil,dport)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Connection error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := conn.File();\n\t\tfd := file.Fd()\n\n\t\tar := conn.RemoteAddr()\n\t\t\/\/al := conn.LocalAddr()\n\t\tfmt.Printf(\"Socket: connected to %s [%s], socket[%d]\\n\",\n\t\t\tremote,ar.String(),fd)\n\n\t\tsavfd := gshPA.Files[1]\n\t\tgshPA.Files[1] = fd;\n\t\tgshCtx.gshellv(argv[2:])\n\t\tgshPA.Files[1] = savfd\n\t\tfile.Close()\n\t\tconn.Close()\n\t}\n}\nfunc (gshCtx*GshContext)saccept(inTCP bool, argv []string) {\n\tgshPA := gshCtx.gshPA\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: -ac [host]:[port[.udp]]\\n\")\n\t\treturn\n\t}\n\tlocal := argv[1]\n\tif local == \":\" { local = \"0.0.0.0:9999\" }\n\tif inTCP { \/\/ TCP\n\t\tport, err := net.ResolveTCPAddr(\"tcp\",local);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/fmt.Printf(\"Listen at %s...\\n\",local);\n\t\tsconn, err := net.ListenTCP(\"tcp\", port)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Listen error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/fmt.Printf(\"Accepting at %s...\\n\",local);\n\t\taconn, err := sconn.AcceptTCP()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Accept error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := aconn.File()\n\t\tfd := file.Fd()\n\t\tfmt.Printf(\"Accepted TCP at %s [%d]\\n\",local,fd)\n\n\t\tsavfd := gshPA.Files[0]\n\t\tgshPA.Files[0] = fd;\n\t\tgshCtx.gshellv(argv[2:])\n\t\tgshPA.Files[0] = savfd\n\n\t\tsconn.Close();\n\t\taconn.Close();\n\t\tfile.Close();\n\t}else{\n\t\t\/\/port, err := net.ResolveUDPAddr(\"udp4\",local);\n\t\tport, err := net.ResolveUDPAddr(\"udp\",local);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"Listen UDP at %s...\\n\",local);\n\t\t\/\/uconn, err := net.ListenUDP(\"udp4\", port)\n\t\tuconn, err := net.ListenUDP(\"udp\", port)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Listen error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := uconn.File()\n\t\tfd := file.Fd()\n\t\tar := uconn.RemoteAddr()\n\t\tremote := \"\"\n\t\tif ar != nil { remote = ar.String() }\n\t\tif remote == \"\" { remote = \"?\" }\n\n\t\t\/\/ not yet received\n\t\t\/\/fmt.Printf(\"Accepted at %s [%d] <- %s\\n\",local,fd,\"\")\n\n\t\tsavfd := gshPA.Files[0]\n\t\tgshPA.Files[0] = fd;\n\t\tsavenv := gshPA.Env\n\t\tgshPA.Env = append(savenv, \"REMOTE_HOST=\"+remote)\n\t\tgshCtx.gshellv(argv[2:])\n\t\tgshPA.Env = savenv\n\t\tgshPA.Files[0] = savfd\n\n\t\tuconn.Close();\n\t\tfile.Close();\n\t}\n}\n\n\/\/ empty line command\nfunc (gshCtx*GshContext)xPwd(argv[]string){\n\t\/\/ execute context command, pwd + date\n\t\/\/ context notation, representation scheme, to be resumed at re-login\n\tcwd, _ := os.Getwd()\n\tswitch {\n\tcase isin(\"-a\",argv):\n\t\tgshCtx.ShowChdirHistory(argv)\n\tcase isin(\"-ls\",argv):\n\t\tshowFileInfo(cwd,argv)\n\tdefault:\n\t\tfmt.Printf(\"%s\\n\",cwd)\n\tcase isin(\"-v\",argv): \/\/ obsolete emtpy command\n\t\tt := time.Now()\n\t\tdate := t.Format(time.UnixDate)\n\t\texe, _ := os.Executable()\n\t\thost, _ := os.Hostname()\n\t\tfmt.Printf(\"{PWD=\\\"%s\\\"\",cwd)\n\t\tfmt.Printf(\" HOST=\\\"%s\\\"\",host)\n\t\tfmt.Printf(\" DATE=\\\"%s\\\"\",date)\n\t\tfmt.Printf(\" TIME=\\\"%s\\\"\",t.String())\n\t\tfmt.Printf(\" PID=\\\"%d\\\"\",os.Getpid())\n\t\tfmt.Printf(\" EXE=\\\"%s\\\"\",exe)\n\t\tfmt.Printf(\"}\\n\")\n\t}\n}\n\n\/\/ <a name=\"history\">History<\/a>\n\/\/ these should be browsed and edited by HTTP browser\n\/\/ show the time of command with -t and direcotry with -ls\n\/\/ openfile-history, sort by -a -m -c\n\/\/ sort by elapsed time by -t -s\n\/\/ search by \"more\" like interface\n\/\/ edit history\n\/\/ sort history, and wc or uniq\n\/\/ CPU and other resource consumptions\n\/\/ limit showing range (by time or so)\n\/\/ export \/ import history\nfunc (gshCtx *GshContext)xHistory(argv []string){\n\tatWorkDirX := -1\n\tif 1 < len(argv) && strBegins(argv[1],\"@\") {\n\t\tatWorkDirX,_ = strconv.Atoi(argv[1][1:])\n\t}\n\t\/\/fmt.Printf(\"--D-- showHistory(%v)\\n\",argv)\n\tfor i, v := range gshCtx.CommandHistory {\n\t\t\/\/ exclude commands not to be listed by default\n\t\t\/\/ internal commands may be suppressed by default\n\t\tif v.CmdLine == \"\" && !isin(\"-a\",argv) {\n\t\t\tcontinue;\n\t\t}\n\t\tif 0 <= atWorkDirX {\n\t\t\tif v.WorkDirX != atWorkDirX {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif !isin(\"-n\",argv){ \/\/ like \"fc\"\n\t\t\tfmt.Printf(\"!%-2d \",i)\n\t\t}\n\t\tif isin(\"-v\",argv){\n\t\t\tfmt.Println(v) \/\/ should be with it date\n\t\t}else{\n\t\t\tif isin(\"-l\",argv) || isin(\"-l0\",argv) {\n\t\t\t\telps := v.EndAt.Sub(v.StartAt);\n\t\t\t\tstart := v.StartAt.Format(time.Stamp)\n\t\t\t\tfmt.Printf(\"@%d \",v.WorkDirX)\n\t\t\t\tfmt.Printf(\"[%v] %11v\/t \",start,elps)\n\t\t\t}\n\t\t\tif isin(\"-l\",argv) && !isin(\"-l0\",argv){\n\t\t\t\tfmt.Printf(\"%v\",Rusagef(\"%t %u\\t\/\/ %s\",argv,v.Rusagev))\n\t\t\t}\n\t\t\tif isin(\"-at\",argv) { \/\/ isin(\"-ls\",argv){\n\t\t\t\tdhi := v.WorkDirX \/\/ workdir history index\n\t\t\t\tfmt.Printf(\"@%d %s\\t\",dhi,v.WorkDir)\n\t\t\t\t\/\/ show the FileInfo of the output command??\n\t\t\t}\n\t\t\tfmt.Printf(\"%s\",v.CmdLine)\n\t\t\tfmt.Printf(\"\\n\")\n\t\t}\n\t}\n}\n\/\/ !n - history index\nfunc searchHistory(gshCtx GshContext, gline string) (string, bool, bool){\n\tif gline[0] == '!' {\n\t\thix, err := strconv.Atoi(gline[1:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- (%s : range)\\n\",hix)\n\t\t\treturn \"\", false, true\n\t\t}\n\t\tif hix < 0 || len(gshCtx.CommandHistory) <= hix {\n\t\t\tfmt.Printf(\"--E-- (%d : out of range)\\n\",hix)\n\t\t\treturn \"\", false, true\n\t\t}\n\t\treturn gshCtx.CommandHistory[hix].CmdLine, false, false\n\t}\n\t\/\/ search\n\t\/\/for i, v := range gshCtx.CommandHistory {\n\t\/\/}\n\treturn gline, false, false\n}\nfunc (gsh*GshContext)cmdStringInHistory(hix int)(cmd string, ok bool){\n\tif 0 <= hix && hix < len(gsh.CommandHistory) {\n\t\treturn gsh.CommandHistory[hix].CmdLine,true\n\t}\n\treturn \"\",false\n}\n\n\/\/ temporary adding to PATH environment\n\/\/ cd name -lib for LD_LIBRARY_PATH\n\/\/ chdir with directory history (date + full-path)\n\/\/ -s for sort option (by visit date or so)\nfunc (gsh*GshContext)ShowChdirHistory1(i int,v GChdirHistory, argv []string){\n\tfmt.Printf(\"!%-2d \",v.CmdIndex) \/\/ the first command at this WorkDir\n\tfmt.Printf(\"@%d \",i)\n\tfmt.Printf(\"[%v] \",v.MovedAt.Format(time.Stamp))\n\tshowFileInfo(v.Dir,argv)\n}\nfunc (gsh*GshContext)ShowChdirHistory(argv []string){\n\tfor i, v := range gsh.ChdirHistory {\n\t\tgsh.ShowChdirHistory1(i,v,argv)\n\t}\n}\nfunc skipOpts(argv[]string)(int){\n\tfor i,v := range argv {\n\t\tif strBegins(v,\"-\") {\n\t\t}else{\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\nfunc (gshCtx*GshContext)xChdir(argv []string){\n\tcdhist := gshCtx.ChdirHistory\n\tif isin(\"?\",argv ) || isin(\"-t\",argv) || isin(\"-a\",argv) {\n\t\tgshCtx.ShowChdirHistory(argv)\n\t\treturn\n\t}\n\tpwd, _ := os.Getwd()\n\tdir := \"\"\n\tif len(argv) <= 1 {\n\t\tdir = toFullpath(\"~\")\n\t}else{\n\t\ti := skipOpts(argv[1:])\n\t\tif i < 0 {\n\t\t\tdir = toFullpath(\"~\")\n\t\t}else{\n\t\t\tdir = argv[1+i]\n\t\t}\n\t}\n\tif strBegins(dir,\"@\") {\n\t\tif dir == \"@0\" { \/\/ obsolete\n\t\t\tdir = gshCtx.StartDir\n\t\t}else\n\t\tif dir == \"@!\" {\n\t\t\tindex := len(cdhist) - 1\n\t\t\tif 0 < index { index -= 1 }\n\t\t\tdir = cdhist[index].Dir\n\t\t}else{\n\t\t\tindex, err := strconv.Atoi(dir[1:])\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"--E-- xChdir(%v)\\n\",err)\n\t\t\t\tdir = \"?\"\n\t\t\t}else\n\t\t\tif len(gshCtx.ChdirHistory) <= index {\n\t\t\t\tfmt.Printf(\"--E-- xChdir(history range error)\\n\")\n\t\t\t\tdir = \"?\"\n\t\t\t}else{\n\t\t\t\tdir = cdhist[index].Dir\n\t\t\t}\n\t\t}\n\t}\n\tif dir != \"?\" {\n\t\terr := os.Chdir(dir)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- xChdir(%s)(%v)\\n\",argv[1],err)\n\t\t}else{\n\t\t\tcwd, _ := os.Getwd()\n\t\t\tif cwd != pwd {\n\t\t\t\thist1 := GChdirHistory { }\n\t\t\t\thist1.Dir = cwd\n\t\t\t\thist1.MovedAt = time.Now()\n\t\t\t\thist1.CmdIndex = len(gshCtx.CommandHistory)+1\n\t\t\t\tgshCtx.ChdirHistory = append(cdhist,hist1)\n\t\t\t\tif !isin(\"-s\",argv){\n\t\t\t\t\t\/\/cwd, _ := os.Getwd()\n\t\t\t\t\t\/\/fmt.Printf(\"%s\\n\",cwd)\n\t\t\t\t\tix := len(gshCtx.ChdirHistory)-1\n\t\t\t\t\tgshCtx.ShowChdirHistory1(ix,hist1,argv)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif isin(\"-ls\",argv){\n\t\tcwd, _ := os.Getwd()\n\t\tshowFileInfo(cwd,argv);\n\t}\n}\nfunc TimeValSub(tv1 *syscall.Timeval, tv2 *syscall.Timeval){\n\t*tv1 = syscall.NsecToTimeval(tv1.Nano() - tv2.Nano())  \n}\nfunc RusageSubv(ru1, ru2 [2]syscall.Rusage)([2]syscall.Rusage){\n\tTimeValSub(&ru1[0].Utime,&ru2[0].Utime)\n\tTimeValSub(&ru1[0].Stime,&ru2[0].Stime)\n\tTimeValSub(&ru1[1].Utime,&ru2[1].Utime)\n\tTimeValSub(&ru1[1].Stime,&ru2[1].Stime)\n\treturn ru1\n}\nfunc TimeValAdd(tv1 syscall.Timeval, tv2 syscall.Timeval)(syscall.Timeval){\n\ttvs := syscall.NsecToTimeval(tv1.Nano() + tv2.Nano())  \n\treturn tvs\n}\n\/*\nfunc RusageAddv(ru1, ru2 [2]syscall.Rusage)([2]syscall.Rusage){\n\tTimeValAdd(ru1[0].Utime,ru2[0].Utime)\n\tTimeValAdd(ru1[0].Stime,ru2[0].Stime)\n\tTimeValAdd(ru1[1].Utime,ru2[1].Utime)\n\tTimeValAdd(ru1[1].Stime,ru2[1].Stime)\n\treturn ru1\n}\n*\/\n\n\/\/ <a name=\"rusage\">Resource Usage<\/a>\nfunc sRusagef(fmtspec string, argv []string, ru [2]syscall.Rusage)(string){\n\t\/\/ ru[0] self , ru[1] children\n\tut := TimeValAdd(ru[0].Utime,ru[1].Utime)\n\tst := TimeValAdd(ru[0].Stime,ru[1].Stime)\n\tuu := (ut.Sec*1000000 + int64(ut.Usec)) * 1000\n\tsu := (st.Sec*1000000 + int64(st.Usec)) * 1000\n\ttu := uu + su\n\tret := fmt.Sprintf(\"%v\/sum\",abbtime(tu))\n\tret += fmt.Sprintf(\", %v\/usr\",abbtime(uu))\n\tret += fmt.Sprintf(\", %v\/sys\",abbtime(su))\n\treturn ret\n}\nfunc Rusagef(fmtspec string, argv []string, ru [2]syscall.Rusage)(string){\n\tut := TimeValAdd(ru[0].Utime,ru[1].Utime)\n\tst := TimeValAdd(ru[0].Stime,ru[1].Stime)\n\tfmt.Printf(\"%d.%06ds\/u \",ut.Sec,ut.Usec) \/\/ru[1].Utime.Sec,ru[1].Utime.Usec)\n\tfmt.Printf(\"%d.%06ds\/s \",st.Sec,st.Usec) \/\/ru[1].Stime.Sec,ru[1].Stime.Usec)\n\treturn \"\"\n}\nfunc Getrusagev()([2]syscall.Rusage){\n\tvar ruv = [2]syscall.Rusage{}\n\tsyscall.Getrusage(syscall.RUSAGE_SELF,&ruv[0])\n\tsyscall.Getrusage(syscall.RUSAGE_CHILDREN,&ruv[1])\n\treturn ruv\n}\nfunc showRusage(what string,argv []string, ru *syscall.Rusage){\n\tfmt.Printf(\"%s: \",what);\n\tfmt.Printf(\"Usr=%d.%06ds\",ru.Utime.Sec,ru.Utime.Usec)\n\tfmt.Printf(\" Sys=%d.%06ds\",ru.Stime.Sec,ru.Stime.Usec)\n\tfmt.Printf(\" Rss=%vB\",ru.Maxrss)\n\tif isin(\"-l\",argv) {\n\t\tfmt.Printf(\" MinFlt=%v\",ru.Minflt)\n\t\tfmt.Printf(\" MajFlt=%v\",ru.Majflt)\n\t\tfmt.Printf(\" IxRSS=%vB\",ru.Ixrss)\n\t\tfmt.Printf(\" IdRSS=%vB\",ru.Idrss)\n\t\tfmt.Printf(\" Nswap=%vB\",ru.Nswap)\n\tfmt.Printf(\" Read=%v\",ru.Inblock)\n\tfmt.Printf(\" Write=%v\",ru.Oublock)\n\t}\n\tfmt.Printf(\" Snd=%v\",ru.Msgsnd)\n\tfmt.Printf(\" Rcv=%v\",ru.Msgrcv)\n\t\/\/if isin(\"-l\",argv) {\n\t\tfmt.Printf(\" Sig=%v\",ru.Nsignals)\n\t\/\/}\n\tfmt.Printf(\"\\n\");\n}\nfunc (gshCtx *GshContext)xTime(argv[]string)(bool){\n\tif 2 <= len(argv){\n\t\tgshCtx.LastRusage = syscall.Rusage{}\n\t\trusagev1 := Getrusagev()\n\t\tfin := gshCtx.gshellv(argv[1:])\n\t\trusagev2 := Getrusagev()\n\t\tshowRusage(argv[1],argv,&gshCtx.LastRusage)\n\t\trusagev := RusageSubv(rusagev2,rusagev1)\n\t\tshowRusage(\"self\",argv,&rusagev[0])\n\t\tshowRusage(\"chld\",argv,&rusagev[1])\n\t\treturn fin\n\t}else{\n\t\trusage:= syscall.Rusage {}\n\t\tsyscall.Getrusage(syscall.RUSAGE_SELF,&rusage)\n\t\tshowRusage(\"self\",argv, &rusage)\n\t\tsyscall.Getrusage(syscall.RUSAGE_CHILDREN,&rusage)\n\t\tshowRusage(\"chld\",argv, &rusage)\n\t\treturn false\n\t}\n}\nfunc (gshCtx *GshContext)xJobs(argv[]string){\n\tfmt.Printf(\"%d Jobs\\n\",len(gshCtx.BackGroundJobs))\n\tfor ji, pid := range gshCtx.BackGroundJobs {\n\t\t\/\/wstat := syscall.WaitStatus {0}\n\t\trusage := syscall.Rusage {}\n\t\t\/\/wpid, err := syscall.Wait4(pid,&wstat,syscall.WNOHANG,&rusage);\n\t\twpid, err := syscall.Wait4(pid,nil,syscall.WNOHANG,&rusage);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- %%%d [%d] (%v)\\n\",ji,pid,err)\n\t\t}else{\n\t\t\tfmt.Printf(\"%%%d[%d](%d)\\n\",ji,pid,wpid)\n\t\t\tshowRusage(\"chld\",argv,&rusage)\n\t\t}\n\t}\n}\nfunc (gsh*GshContext)inBackground(argv[]string)(bool){\n\tif gsh.CmdTrace { fmt.Printf(\"--I-- inBackground(%v)\\n\",argv) }\n\tgsh.BackGround = true \/\/ set background option\n\txfin := false\n\txfin = gsh.gshellv(argv)\n\tgsh.BackGround = false\n\treturn xfin\n}\n\/\/ -o file without command means just opening it and refer by #N\n\/\/ should be listed by \"files\" comnmand\nfunc (gshCtx*GshContext)xOpen(argv[]string){\n\tvar pv = []int{-1,-1}\n\terr := syscall.Pipe(pv)\n\tfmt.Printf(\"--I-- pipe()=[#%d,#%d](%v)\\n\",pv[0],pv[1],err)\n}\nfunc (gshCtx*GshContext)fromPipe(argv[]string){\n}\nfunc (gshCtx*GshContext)xClose(argv[]string){\n}\n\n\/\/ <a name=\"redirect\">redirect<\/a>\nfunc (gshCtx*GshContext)redirect(argv[]string)(bool){\n\tif len(argv) < 2 {\n\t\treturn false\n\t}\n\n\tcmd := argv[0]\n\tfname := argv[1]\n\tvar file *os.File = nil\n\n\tfdix := 0\n\tmode := os.O_RDONLY\n\n\tswitch {\n\tcase cmd == \"-i\" || cmd == \"<\":\n\t\tfdix = 0\n\t\tmode = os.O_RDONLY\n\tcase cmd == \"-o\" || cmd == \">\":\n\t\tfdix = 1\n\t\tmode = os.O_RDWR | os.O_CREATE\n\tcase cmd == \"-a\" || cmd == \">>\":\n\t\tfdix = 1\n\t\tmode = os.O_RDWR | os.O_CREATE | os.O_APPEND\n\t}\n\tif fname[0] == '#' {\n\t\tfd, err := strconv.Atoi(fname[1:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- (%v)\\n\",err)\n\t\t\treturn false\n\t\t}\n\t\tfile = os.NewFile(uintptr(fd),\"MaybePipe\")\n\t}else{\n\t\txfile, err := os.OpenFile(argv[1], mode, 0600)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- (%s)\\n\",err)\n\t\t\treturn false\n\t\t}\n\t\tfile = xfile\n\t}\n\tgshPA := gshCtx.gshPA\n\tsavfd := gshPA.Files[fdix]\n\tgshPA.Files[fdix] = file.Fd()\n\tfmt.Printf(\"--I-- Opened [%d] %s\\n\",file.Fd(),argv[1])\n\tgshCtx.gshellv(argv[2:])\n\tgshPA.Files[fdix] = savfd\n\n\treturn false\n}\n\n\/\/fmt.Fprintf(res, \"GShell Status: %q\", html.EscapeString(req.URL.Path))\nfunc httpHandler(res http.ResponseWriter, req *http.Request){\n\tpath := req.URL.Path\n\tfmt.Printf(\"--I-- Got HTTP Request(%s)\\n\",path)\n\t{\n\t\tgshCtxBuf, _ :=  setupGshContext()\n\t\tgshCtx := &gshCtxBuf\n\t\tfmt.Printf(\"--I-- %s\\n\",path[1:])\n\t\tgshCtx.tgshelll(path[1:])\n\t}\n\tfmt.Fprintf(res, \"Hello(^-^)\/\/\\n%s\\n\",path)\n}\nfunc (gshCtx *GshContext) httpServer(argv []string){\n\thttp.HandleFunc(\"\/\", httpHandler)\n\taccport := \"localhost:9999\"\n\tfmt.Printf(\"--I-- HTTP Server Start at [%s]\\n\",accport)\n\thttp.ListenAndServe(accport,nil)\n}\nfunc (gshCtx *GshContext)xGo(argv[]string){\n\tgo gshCtx.gshellv(argv[1:]);\n}\nfunc (gshCtx *GshContext) xPs(argv[]string)(){\n}\n\n\/\/ <a name=\"plugin\">Plugin<\/a>\n\/\/ plugin [-ls [names]] to list plugins\n\/\/ Reference: <a href=\"https:\/\/golang.org\/src\/plugin\/\">plugin<\/a> source code\nfunc (gshCtx *GshContext) whichPlugin(name string,argv[]string)(pi *PluginInfo){\n\tpi = nil\t\n\tfor _,p := range gshCtx.PluginFuncs {\n\t\tif p.Name == name && pi == nil {\n\t\t\tpi = &p\n\t\t}\n\t\tif !isin(\"-s\",argv){\n\t\t\t\/\/fmt.Printf(\"%v %v \",i,p)\n\t\t\tif isin(\"-ls\",argv){\n\t\t\t\tshowFileInfo(p.Path,argv)\n\t\t\t}else{\n\t\t\t\tfmt.Printf(\"%s\\n\",p.Name)\n\t\t\t}\n\t\t}\n\t}\n\treturn pi\n}\nfunc (gshCtx *GshContext) xPlugin(argv[]string) (error) {\n\tif len(argv) == 0 || argv[0] == \"-ls\" {\n\t\tgshCtx.whichPlugin(\"\",argv)\n\t\treturn  nil\n\t}\n\tname := argv[0]\n\tPin := gshCtx.whichPlugin(name,[]string{\"-s\"})\n\tif Pin != nil {\n\t\tos.Args = argv \/\/ should be recovered?\n\t\tPin.Addr.(func())()\n\t\treturn nil\n\t}\n\tsofile := toFullpath(argv[0] + \".so\") \/\/ or find it by which($PATH)\n\n\tp, err := plugin.Open(sofile)\n\tif err != nil {\n\t\tfmt.Printf(\"--E-- plugin.Open(%s)(%v)\\n\",sofile,err)\n\t\treturn err\n\t}\n\tfname := \"Main\"\n\tf, err := p.Lookup(fname)\n\tif( err != nil ){\n\t\tfmt.Printf(\"--E-- plugin.Lookup(%s)(%v)\\n\",fname,err)\n\t\treturn err\n\t}\n\tpin := PluginInfo {p,f,name,sofile} \n\tgshCtx.PluginFuncs = append(gshCtx.PluginFuncs,pin)\n\tfmt.Printf(\"--I-- added (%d)\\n\",len(gshCtx.PluginFuncs))\n\n\t\/\/fmt.Printf(\"--I-- first call(%s:%s)%v\\n\",sofile,fname,argv)\n\tos.Args = argv\n\tf.(func())()\n\treturn err\n}\nfunc (gshCtx*GshContext)Args(argv[]string){\n\tfor i,v := range os.Args {\n\t\tfmt.Printf(\"[%v] %v\\n\",i,v)\n\t}\n}\nfunc (gshCtx *GshContext) showVersion(argv[]string){\n\tif isin(\"-l\",argv) {\n\t\tfmt.Printf(\"%v\/%v (%v)\",NAME,VERSION,DATE);\n\t}else{\n\t\tfmt.Printf(\"%v\",VERSION);\n\t}\n\tif isin(\"-a\",argv) {\n\t\tfmt.Printf(\" %s\",AUTHOR)\n\t}\n\tif !isin(\"-n\",argv) {\n\t\tfmt.Printf(\"\\n\")\n\t}\n}\n\n\/\/ <a name=\"scanf\">Scanf<\/a> \/\/ string decomposer\n\/\/ scanf [format] [input]\nfunc scanv(sstr string)(strv[]string){\n\tstrv = strings.Split(sstr,\" \")\n\treturn strv\n}\nfunc scanUntil(src,end string)(rstr string,leng int){\n\tidx := strings.Index(src,end)\n\tif 0 <= idx {\n\t\trstr = src[0:idx]\n\t\treturn rstr,idx+len(end)\n\t}\n\treturn src,0\n}\n\n\/\/ -bn -- display base-name part only \/\/ can be in some %fmt, for sed rewriting\nfunc (gsh*GshContext)printVal(fmts string, vstr string, optv[]string){\n\t\/\/vint,err := strconv.Atoi(vstr)\n\tvar ival int64 = 0\n\tn := 0\n\terr := error(nil)\n\tif strBegins(vstr,\"_\") {\n\t\tvx,_ := strconv.Atoi(vstr[1:])\n\t\tif vx < len(gsh.iValues) {\n\t\t\tvstr = gsh.iValues[vx]\n\t\t}else{\n\t\t}\n\t}\n\t\/\/ should use Eval()\n\tif strBegins(vstr,\"0x\") {\n\t\tn,err = fmt.Sscanf(vstr[2:],\"%x\",&ival)\n\t}else{\n\t\tn,err = fmt.Sscanf(vstr,\"%d\",&ival)\n\/\/fmt.Printf(\"--D-- n=%d err=(%v) {%s}=%v\\n\",n,err,vstr, ival)\n\t}\n\tif n == 1 && err == nil {\n\t\t\/\/fmt.Printf(\"--D-- formatn(%v) ival(%v)\\n\",fmts,ival)\n\t\tfmt.Printf(\"%\"+fmts,ival)\n\t}else{\n\t\tif isin(\"-bn\",optv){\n\t\t\tfmt.Printf(\"%\"+fmts,filepath.Base(vstr))\n\t\t}else{\n\t\t\tfmt.Printf(\"%\"+fmts,vstr)\n\t\t}\n\t}\n}\nfunc (gsh*GshContext)printfv(fmts,div string,argv[]string,optv[]string,list[]string){\n\t\/\/fmt.Printf(\"{%d}\",len(list))\n\t\/\/curfmt := \"v\"\n\toutlen := 0\n\tcurfmt := gsh.iFormat\n\n\tif 0 < len(fmts) {\n\t\tfor xi := 0; xi < len(fmts); xi++ {\n\t\t\tfch := fmts[xi]\n\t\t\tif fch == '%' {\n\t\t\t\tif xi+1 < len(fmts) {\n\t\t\t\t\tcurfmt = string(fmts[xi+1])\n gsh.iFormat = curfmt\n\t\t\t\t\txi += 1\n\tif xi+1 < len(fmts) && fmts[xi+1] == '(' {\n\t\tvals,leng := scanUntil(fmts[xi+2:],\")\")\n\t\t\/\/fmt.Printf(\"--D-- show fmt(%v) val(%v) next(%v)\\n\",curfmt,vals,leng)\n\t\tgsh.printVal(curfmt,vals,optv)\n\t\txi += 2+leng-1\n\t\toutlen += 1\n\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tif fch == '_' {\n\t\t\t\thi,leng := scanInt(fmts[xi+1:])\n\t\t\t\tif 0 < leng {\n\t\t\t\t\tif hi < len(gsh.iValues) {\n\t\t\t\t\t\tgsh.printVal(curfmt,gsh.iValues[hi],optv)\n\t\t\t\t\t\toutlen += 1 \/\/ should be the real length\n\t\t\t\t\t}else{\n\t\t\t\t\t\tfmt.Printf(\"((out-range))\")\n\t\t\t\t\t}\n\t\t\t\t\txi += leng\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Printf(\"%c\",fch)\n\t\t\toutlen += 1\n\t\t}\n\t}else{\n\t\t\/\/fmt.Printf(\"--D-- print {%s}\\n\")\n\t\tfor i,v := range list {\n\t\t\tif 0 < i {\n\t\t\t\tfmt.Printf(div)\n\t\t\t}\n\t\t\tgsh.printVal(curfmt,v,optv)\n\t\t\toutlen += 1\n\t\t}\n\t}\n\tif 0 < outlen {\n\t\tfmt.Printf(\"\\n\")\n\t}\n}\nfunc (gsh*GshContext)Scanv(argv[]string){\n\t\/\/fmt.Printf(\"--D-- Scanv(%v)\\n\",argv)\n\tif len(argv) == 1 {\n\t\treturn\n\t}\n\targv = argv[1:]\n\tfmts := \"\"\n\tif strBegins(argv[0],\"-F\") {\n\t\tfmts = argv[0]\n\t\tgsh.iDelimiter = fmts\n\t\targv = argv[1:]\n\t}\n\tinput := strings.Join(argv,\" \")\n\tif fmts == \"\" { \/\/ simple decomposition\n\t\tv := scanv(input)\n\t\tgsh.iValues = v\n\t\t\/\/fmt.Printf(\"%v\\n\",strings.Join(v,\",\"))\n\t}else{\n\t\tv := make([]string,8)\n\t\tn,err := fmt.Sscanf(input,fmts,&v[0],&v[1],&v[2],&v[3])\n\t\tfmt.Printf(\"--D-- Scanf ->(%v) n=%d err=(%v)\\n\",v,n,err)\n\t\tgsh.iValues = v\n\t}\n}\nfunc (gsh*GshContext)Printv(argv[]string){\n\tif false { \/\/@@U\n\t\tfmt.Printf(\"%v\\n\",strings.Join(argv[1:],\" \"))\n\t\treturn\n\t}\n\t\/\/fmt.Printf(\"--D-- Printv(%v)\\n\",argv)\n\t\/\/fmt.Printf(\"%v\\n\",strings.Join(gsh.iValues,\",\"))\n\tdiv := gsh.iDelimiter\n\tfmts := \"\"\n\targv = argv[1:]\n\tif 0 < len(argv) {\n\t\tif strBegins(argv[0],\"-F\") {\n\t\t\tdiv = argv[0][2:]\n\t\t\targv = argv[1:]\n\t\t}\n\t}\n\n\toptv := []string{}\n\tfor _,v := range argv {\n\t\tif strBegins(v,\"-\"){\n\t\t\toptv = append(optv,v)\n\t\t\targv = argv[1:]\n\t\t}else{\n\t\t\tbreak;\n\t\t}\n\t}\n\tif 0 < len(argv) {\n\t\tfmts = strings.Join(argv,\" \")\n\t}\n\tgsh.printfv(fmts,div,argv,optv,gsh.iValues)\n}\nfunc (gsh*GshContext)Basename(argv[]string){\n\tfor i,v := range gsh.iValues {\n\t\tgsh.iValues[i] = filepath.Base(v)\n\t}\n}\nfunc (gsh*GshContext)Sortv(argv[]string){\n\tsv := gsh.iValues\n\tsort.Slice(sv , func(i,j int) bool {\n\t\treturn sv[i] < sv[j]\n\t})\n}\nfunc (gsh*GshContext)Shiftv(argv[]string){\n\tvi := len(gsh.iValues)\n\tif 0 < vi {\n\t\tif isin(\"-r\",argv) {\n\t\t\ttop := gsh.iValues[0]\n\t\t\tgsh.iValues = append(gsh.iValues[1:],top)\n\t\t}else{\n\t\t\tgsh.iValues = gsh.iValues[1:]\n\t\t}\n\t}\n}\n\nfunc (gsh*GshContext)Enq(argv[]string){\n}\nfunc (gsh*GshContext)Deq(argv[]string){\n}\nfunc (gsh*GshContext)Push(argv[]string){\n\tgsh.iValStack = append(gsh.iValStack,argv[1:])\n\tfmt.Printf(\"depth=%d\\n\",len(gsh.iValStack))\n}\nfunc (gsh*GshContext)Dump(argv[]string){\n\tfor i,v := range gsh.iValStack {\n\t\tfmt.Printf(\"%d %v\\n\",i,v)\n\t}\n}\nfunc (gsh*GshContext)Pop(argv[]string){\n\tdepth := len(gsh.iValStack)\n\tif 0 < depth {\n\t\tv := gsh.iValStack[depth-1]\n\t\tif isin(\"-cat\",argv){\n\t\t\tgsh.iValues = append(gsh.iValues,v...)\n\t\t}else{\n\t\t\tgsh.iValues = v\n\t\t}\n\t\tgsh.iValStack = gsh.iValStack[0:depth-1]\n\t\tfmt.Printf(\"depth=%d %s\\n\",len(gsh.iValStack),gsh.iValues)\n\t}else{\n\t\tfmt.Printf(\"depth=%d\\n\",depth)\n\t}\n}\n\n\/\/ <a name=\"interpreter\">Command Interpreter<\/a>\nfunc (gshCtx*GshContext)gshellv(argv []string) (fin bool) {\n\tfin = false\n\n\tif gshCtx.CmdTrace { fmt.Fprintf(os.Stderr,\"--I-- gshellv((%d))\\n\",len(argv)) }\n\tif len(argv) <= 0 {\n\t\treturn false\n\t}\n\txargv := []string{}\n\tfor ai := 0; ai < len(argv); ai++ {\n\t\txargv = append(xargv,strsubst(gshCtx,argv[ai],false))\n\t}\n\targv = xargv\n\tif false {\n\t\tfor ai := 0; ai < len(argv); ai++ {\n\t\t\tfmt.Printf(\"[%d] %s [%d]%T\\n\",\n\t\t\t\tai,argv[ai],len(argv[ai]),argv[ai])\n\t\t}\n\t}\n\tcmd := argv[0]\n\tif gshCtx.CmdTrace { fmt.Fprintf(os.Stderr,\"--I-- gshellv(%d)%v\\n\",len(argv),argv) }\n\tswitch { \/\/ https:\/\/tour.golang.org\/flowcontrol\/11\n\tcase cmd == \"\":\n\t\tgshCtx.xPwd([]string{}); \/\/ emtpy command\n\tcase cmd == \"-x\":\n\t\tgshCtx.CmdTrace = ! gshCtx.CmdTrace\n\tcase cmd == \"-xt\":\n\t\tgshCtx.CmdTime = ! gshCtx.CmdTime\n\tcase cmd == \"-ot\":\n\t\tgshCtx.sconnect(true, argv)\n\tcase cmd == \"-ou\":\n\t\tgshCtx.sconnect(false, argv)\n\tcase cmd == \"-it\":\n\t\tgshCtx.saccept(true , argv)\n\tcase cmd == \"-iu\":\n\t\tgshCtx.saccept(false, argv)\n\tcase cmd == \"-i\" || cmd == \"<\" || cmd == \"-o\" || cmd == \">\" || cmd == \"-a\" || cmd == \">>\" || cmd == \"-s\" || cmd == \"><\":\n\t\tgshCtx.redirect(argv)\n\tcase cmd == \"|\":\n\t\tgshCtx.fromPipe(argv)\n\tcase cmd == \"args\":\n\t\tgshCtx.Args(argv)\n\tcase cmd == \"bg\" || cmd == \"-bg\":\n\t\trfin := gshCtx.inBackground(argv[1:])\n\t\treturn rfin\n\tcase cmd == \"-bn\":\n\t\tgshCtx.Basename(argv)\n\tcase cmd == \"call\":\n\t\t_,_ = gshCtx.excommand(false,argv[1:])\n\tcase cmd == \"cd\" || cmd == \"chdir\":\n\t\tgshCtx.xChdir(argv);\n\tcase cmd == \"-cksum\":\n\t\tgshCtx.xFind(argv)\n\tcase cmd == \"-sum\":\n\t\tgshCtx.xFind(argv)\n\tcase cmd == \"-sumtest\":\n\t\tstr := \"\"\n\t\tif 1 < len(argv) { str = argv[1] }\n\t\tcrc := strCRC32(str,uint64(len(str)))\n\t\tfprintf(stderr,\"%v %v\\n\",crc,len(str))\n\tcase cmd == \"close\":\n\t\tgshCtx.xClose(argv)\n\tcase cmd == \"gcp\":\n\t\tgshCtx.FileCopy(argv)\n\tcase cmd == \"dec\" || cmd == \"decode\":\n\t\tgshCtx.Dec(argv)\n\tcase cmd == \"#define\":\n\tcase cmd == \"dic\" || cmd == \"d\":\n\t\txDic(argv)\n\tcase cmd == \"dump\":\n\t\tgshCtx.Dump(argv)\n\tcase cmd == \"echo\" || cmd == \"e\":\n\t\techo(argv,true)\n\tcase cmd == \"enc\" || cmd == \"encode\":\n\t\tgshCtx.Enc(argv)\n\tcase cmd == \"env\":\n\t\tenv(argv)\n\tcase cmd == \"eval\":\n\t\txEval(argv[1:],true)\n\tcase cmd == \"ev\" || cmd == \"events\":\n\t\tdumpEvents(argv)\n\tcase cmd == \"exec\":\n\t\t_,_ = gshCtx.excommand(true,argv[1:])\n\t\t\/\/ should not return here\n\tcase cmd == \"exit\" || cmd == \"quit\":\n\t\t\/\/ write Result code EXIT to 3>\n\t\treturn true\n\tcase cmd == \"fdls\":\n\t\t\/\/ dump the attributes of fds (of other process)\n\tcase cmd == \"-find\" || cmd == \"fin\" || cmd == \"ufind\" || cmd == \"uf\":\n\t\tgshCtx.xFind(argv[1:])\n\tcase cmd == \"fu\":\n\t\tgshCtx.xFind(argv[1:])\n\tcase cmd == \"fork\":\n\t\t\/\/ mainly for a server\n\tcase cmd == \"-gen\":\n\t\tgshCtx.gen(argv)\n\tcase cmd == \"-go\":\n\t\tgshCtx.xGo(argv)\n\tcase cmd == \"-grep\":\n\t\tgshCtx.xFind(argv)\n\tcase cmd == \"gdeq\":\n\t\tgshCtx.Deq(argv)\n\tcase cmd == \"genq\":\n\t\tgshCtx.Enq(argv)\n\tcase cmd == \"gpop\":\n\t\tgshCtx.Pop(argv)\n\tcase cmd == \"gpush\":\n\t\tgshCtx.Push(argv)\n\tcase cmd == \"history\" || cmd == \"hi\": \/\/ hi should be alias\n\t\tgshCtx.xHistory(argv)\n\tcase cmd == \"jobs\":\n\t\tgshCtx.xJobs(argv)\n\tcase cmd == \"lnsp\" || cmd == \"nlsp\":\n\t\tgshCtx.SplitLine(argv)\n\tcase cmd == \"-ls\":\n\t\tgshCtx.xFind(argv)\n\tcase cmd == \"nop\":\n\t\t\/\/ do nothing\n\tcase cmd == \"pipe\":\n\t\tgshCtx.xOpen(argv)\n\tcase cmd == \"plug\" || cmd == \"plugin\" || cmd == \"pin\":\n\t\tgshCtx.xPlugin(argv[1:])\n\tcase cmd == \"print\" || cmd == \"-pr\":\n\t\t\/\/ output internal slice \/\/ also sprintf should be\n\t\tgshCtx.Printv(argv)\n\tcase cmd == \"ps\":\n\t\tgshCtx.xPs(argv)\n\tcase cmd == \"pstitle\":\n\t\t\/\/ to be gsh.title\n\tcase cmd == \"rexecd\" || cmd == \"rexd\":\n\t\tgshCtx.RexecServer(argv)\n\tcase cmd == \"rexec\" || cmd == \"rex\":\n\t\tgshCtx.RexecClient(argv)\n\tcase cmd == \"repeat\" || cmd == \"rep\": \/\/ repeat cond command\n\t\tgshCtx.repeat(argv)\n\tcase cmd == \"replay\":\n\t\tgshCtx.xReplay(argv)\n\tcase cmd == \"scan\":\n\t\t\/\/ scan input (or so in fscanf) to internal slice (like Files or map)\n\t\tgshCtx.Scanv(argv)\n\tcase cmd == \"set\":\n\t\t\/\/ set name ...\n\tcase cmd == \"serv\":\n\t\tgshCtx.httpServer(argv)\n\tcase cmd == \"shift\":\n\t\tgshCtx.Shiftv(argv)\n\tcase cmd == \"sleep\":\n\t\tgshCtx.sleep(argv)\n\tcase cmd == \"-sort\":\n\t\tgshCtx.Sortv(argv)\n\n\tcase cmd == \"j\" || cmd == \"join\":\n\t\tgshCtx.Rjoin(argv)\n\tcase cmd == \"a\" || cmd == \"alpa\":\n\t\tgshCtx.Rexec(argv)\n\tcase cmd == \"jcd\" || cmd == \"jchdir\":\n\t\tgshCtx.Rchdir(argv)\n\tcase cmd == \"jget\":\n\t\tgshCtx.Rget(argv)\n\tcase cmd == \"jls\":\n\t\tgshCtx.Rls(argv)\n\tcase cmd == \"jput\":\n\t\tgshCtx.Rput(argv)\n\tcase cmd == \"jpwd\":\n\t\tgshCtx.Rpwd(argv)\n\n\tcase cmd == \"time\":\n\t\tfin = gshCtx.xTime(argv)\n\tcase cmd == \"ungets\":\n\t\tif 1 < len(argv) {\n\t\t\tungets(argv[1]+\"\\n\")\n\t\t}else{\n\t\t}\n\tcase cmd == \"pwd\":\n\t\tgshCtx.xPwd(argv);\n\tcase cmd == \"ver\" || cmd == \"-ver\" || cmd == \"version\":\n\t\tgshCtx.showVersion(argv)\n\tcase cmd == \"where\":\n\t\t\/\/ data file or so?\n\tcase cmd == \"which\":\n\t\twhich(\"PATH\",argv);\n\tcase cmd == \"gj\" && 1 < len(argv) && argv[1] == \"listen\":\n\t\tgo gj_server(argv[1:]);\n\tcase cmd == \"gj\" && 1 < len(argv) && argv[1] == \"join\":\n\t\tgo gj_client(argv[1:]);\n\tcase cmd == \"gj\":\n\t\tjsend(argv);\n\tcase cmd == \"jsend\":\n\t\tjsend(argv);\n\tdefault:\n\t\tif gshCtx.whichPlugin(cmd,[]string{\"-s\"}) != nil {\n\t\t\tgshCtx.xPlugin(argv)\n\t\t}else{\n\t\t\tnotfound,_ := gshCtx.excommand(false,argv)\n\t\t\tif notfound {\n\t\t\t\tfmt.Printf(\"--E-- command not found (%v)\\n\",cmd)\n\t\t\t}\n\t\t}\n\t}\n\treturn fin\n}\n\nfunc (gsh*GshContext)gshelll(gline string) (rfin bool) {\n\targv := strings.Split(string(gline),\" \")\n\tfin := gsh.gshellv(argv)\n\treturn fin\n}\nfunc (gsh*GshContext)tgshelll(gline string)(xfin bool){\n\tstart := time.Now()\n\tfin := gsh.gshelll(gline)\n\tend := time.Now()\n\telps := end.Sub(start);\n\tif gsh.CmdTime {\n\t\tfmt.Printf(\"--T-- \" + time.Now().Format(time.Stamp) + \"(%d.%09ds)\\n\",\n\t\t\telps\/1000000000,elps%1000000000)\n\t}\n\treturn fin\n}\nfunc Ttyid() (int) {\n\tfi, err := os.Stdin.Stat()\n\tif err != nil {\n\t\treturn 0;\n\t}\n\t\/\/fmt.Printf(\"Stdin: %v Dev=%d\\n\",\n\t\/\/\tfi.Mode(),fi.Mode()&os.ModeDevice)\n\tif (fi.Mode() & os.ModeDevice) != 0 {\n\t\tstat := syscall.Stat_t{};\n\t\terr := syscall.Fstat(0,&stat)\n\t\tif err != nil {\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: (%v)\\n\",err)\n\t\t}else{\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: rdev=%d %d\\n\",\n\t\t\t\/\/\tstat.Rdev&0xFF,stat.Rdev);\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: tty%d\\n\",stat.Rdev&0xFF);\n\t\t\treturn int(stat.Rdev & 0xFF)\n\t\t}\n\t}\n\treturn 0\n}\nfunc (gshCtx *GshContext) ttyfile() string {\n\t\/\/fmt.Printf(\"--I-- GSH_HOME=%s\\n\",gshCtx.GshHomeDir)\n\tttyfile := gshCtx.GshHomeDir + \"\/\" + \"gsh-tty\" +\n\t\t fmt.Sprintf(\"%02d\",gshCtx.TerminalId)\n\t\t \/\/strconv.Itoa(gshCtx.TerminalId)\n\t\/\/fmt.Printf(\"--I-- ttyfile=%s\\n\",ttyfile)\n\treturn ttyfile\n}\nfunc (gshCtx *GshContext) ttyline()(*os.File){\n\tfile, err := os.OpenFile(gshCtx.ttyfile(),os.O_RDWR|os.O_CREATE|os.O_TRUNC,0600)\n\tif err != nil {\n\t\tfmt.Printf(\"--F-- cannot open %s (%s)\\n\",gshCtx.ttyfile(),err)\n\t\treturn file;\n\t}\n\treturn file\n}\nfunc (gshCtx *GshContext)getline(hix int, skipping bool, prevline string) (string) {\n\tif( skipping ){\n\t\treader := bufio.NewReaderSize(os.Stdin,LINESIZE)\n\t\tline, _, _ := reader.ReadLine()\n\t\treturn string(line)\n\t}else\n\tif true {\n\t\treturn xgetline(hix,prevline,gshCtx)\n\t}\n\t\/*\n\telse\n\tif( with_exgetline && gshCtx.GetLine != \"\" ){\n\t\t\/\/var xhix int64 = int64(hix); \/\/ cast\n\t\tnewenv := os.Environ()\n\t\tnewenv = append(newenv, \"GSH_LINENO=\"+strconv.FormatInt(int64(hix),10) )\n\n\t\ttty := gshCtx.ttyline()\n\t\ttty.WriteString(prevline)\n\t\tPa := os.ProcAttr {\n\t\t\t\"\", \/\/ start dir\n\t\t\tnewenv, \/\/os.Environ(),\n\t\t\t[]*os.File{os.Stdin,os.Stdout,os.Stderr,tty},\n\t\t\tnil,\n\t\t}\n\/\/fmt.Printf(\"--I-- getline=%s \/\/ %s\\n\",gsh_getlinev[0],gshCtx.GetLine)\nproc, err := os.StartProcess(gsh_getlinev[0],[]string{\"getline\",\"getline\"},&Pa)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--F-- getline process error (%v)\\n\",err)\n\t\t\t\/\/ for ; ; { }\n\t\t\treturn \"exit (getline program failed)\"\n\t\t}\n\t\t\/\/stat, err := proc.Wait()\n\t\tproc.Wait()\n\t\tbuff := make([]byte,LINESIZE)\n\t\tcount, err := tty.Read(buff)\n\t\t\/\/_, err = tty.Read(buff)\n\t\t\/\/fmt.Printf(\"--D-- getline (%d)\\n\",count)\n\t\tif err != nil {\n\t\t\tif ! (count == 0) { \/\/ && err.String() == \"EOF\" ) {\n\t\t\t\tfmt.Printf(\"--E-- getline error (%s)\\n\",err)\n\t\t\t}\n\t\t}else{\n\t\t\t\/\/fmt.Printf(\"--I-- getline OK \\\"%s\\\"\\n\",buff)\n\t\t}\n\t\ttty.Close()\n\t\tgline := string(buff[0:count])\n\t\treturn gline\n\t}else\n\t*\/\n\t{\n\t\t\/\/ if isatty {\n\t\t\tfmt.Printf(\"!%d\",hix)\n\t\t\tfmt.Print(PROMPT)\n\t\t\/\/ }\n\t\treader := bufio.NewReaderSize(os.Stdin,LINESIZE)\n\t\tline, _, _ := reader.ReadLine()\n\t\treturn string(line)\n\t}\n}\n\n\/\/== begin ======================================================= getline\n\/*\n * getline.c\n * 2020-0819 extracted from dog.c\n * getline.go\n * 2020-0822 ported to Go\n *\/\n\/*\npackage main \/\/ getline main\nimport (\n\t\"fmt\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/fmt\/\">fmt<\/a>\n\t\"strings\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/strings\/\">strings<\/a>\n\t\"os\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/os\/\">os<\/a>\n\t\"syscall\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/syscall\/\">syscall<\/a>\n\t\/\/\"bytes\"\t\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/os\/\">os<\/a>\n\t\/\/\"os\/exec\"\t\/\/ <a href=\"https:\/\/golang.org\/pkg\/os\/\">os<\/a>\n)\n*\/\n\n\/\/ C language compatibility functions\nvar errno = 0\nvar stdin  *os.File = os.Stdin\nvar stdout *os.File = os.Stdout\nvar stderr *os.File = os.Stderr\nvar EOF = -1\nvar NULL = 0\ntype FILE os.File\ntype StrBuff []byte\nvar NULL_FP *os.File = nil\nvar NULLSP = 0\n\/\/var LINESIZE = 1024\n\nfunc system(cmdstr string)(int){\n\tPA := syscall.ProcAttr {\n\t\t\"\", \/\/ the starting directory\n\t\tos.Environ(),\n\t\t[]uintptr{os.Stdin.Fd(),os.Stdout.Fd(),os.Stderr.Fd()},\n\t\tnil,\n\t}\n\targv := strings.Split(cmdstr,\" \")\n\tpid,err := syscall.ForkExec(argv[0],argv,&PA)\n\tif( err != nil ){\n\t\tfmt.Printf(\"--E-- syscall(%v) err(%v)\\n\",cmdstr,err)\n\t}\n\tsyscall.Wait4(pid,nil,0,nil)\n\n\t\/*\n\targv := strings.Split(cmdstr,\" \")\n\tfmt.Fprintf(os.Stderr,\"--I-- system(%v)\\n\",argv)\n\t\/\/cmd := exec.Command(argv[0:]...)\n\tcmd := exec.Command(argv[0],argv[1],argv[2])\n\tcmd.Stdin = strings.NewReader(\"output of system\")\n\tvar out bytes.Buffer\n\tcmd.Stdout = &out\n\tvar serr bytes.Buffer\n\tcmd.Stderr = &serr\n\terr := cmd.Run()\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr,\"--E-- system(%v)err(%v)\\n\",argv,err)\n\t\tfmt.Printf(\"ERR:%s\\n\",serr.String())\n\t}else{\n\t\tfmt.Printf(\"%s\",out.String())\n\t}\n\t*\/\n\treturn 0\n}\nfunc atoi(str string)(ret int){\n\tret,err := fmt.Sscanf(str,\"%d\",ret)\n\tif err == nil {\n\t\treturn ret\n\t}else{\n\t\t\/\/ should set errno\n\t\treturn 0\n\t}\n}\nfunc getenv(name string)(string){\n\tval,got := os.LookupEnv(name)\n\tif got {\n\t\treturn val\n\t}else{\n\t\treturn \"?\"\n\t}\n}\nfunc strcpy(dst StrBuff, src string){\n\tvar i int\n\tsrcb := []byte(src)\n\tfor i = 0; i < len(src) && srcb[i] != 0; i++ {\n\t\tdst[i] = srcb[i]\n\t}\n\tdst[i] = 0\n}\nfunc xstrcpy(dst StrBuff, src StrBuff){\n\tdst = src\n}\nfunc strcat(dst StrBuff, src StrBuff){\n\tdst = append(dst,src...)\n}\nfunc strdup(str StrBuff)(string){\n\treturn string(str[0:strlen(str)])\n}\nfunc sstrlen(str string)(int){\n\treturn len(str)\n}\nfunc strlen(str StrBuff)(int){\n\tvar i int\n\tfor i = 0; i < len(str) && str[i] != 0; i++ {\n\t}\n\treturn i\n}\nfunc sizeof(data StrBuff)(int){\n\treturn len(data)\n}\nfunc isatty(fd int)(ret int){\n\treturn 1\n}\n\nfunc fopen(file string,mode string)(fp*os.File){\n\tif mode == \"r\" {\n\t\tfp,err := os.Open(file)\n\t\tif( err != nil ){\n\t\t\tfmt.Printf(\"--E-- fopen(%s,%s)=(%v)\\n\",file,mode,err)\n\t\t\treturn NULL_FP;\n\t\t}\n\t\treturn fp;\n\t}else{\n\t\tfp,err := os.OpenFile(file,os.O_RDWR|os.O_CREATE|os.O_TRUNC,0600)\n\t\tif( err != nil ){\n\t\t\treturn NULL_FP;\n\t\t}\n\t\treturn fp;\n\t}\n}\nfunc fclose(fp*os.File){\n\tfp.Close()\n}\nfunc fflush(fp *os.File)(int){\n\treturn 0\n}\nfunc fgetc(fp*os.File)(int){\n\tvar buf [1]byte\n\t_,err := fp.Read(buf[0:1])\n\tif( err != nil ){\n\t\treturn EOF;\n\t}else{\n\t\treturn int(buf[0])\n\t}\n}\nfunc sfgets(str*string, size int, fp*os.File)(int){\n\tbuf := make(StrBuff,size)\n\tvar ch int\n\tvar i int\n\tfor i = 0; i < len(buf)-1; i++ {\n\t\tch = fgetc(fp)\n\t\t\/\/fprintf(stderr,\"--fgets %d\/%d %X\\n\",i,len(buf),ch)\n\t\tif( ch == EOF ){\n\t\t\tbreak;\n\t\t}\n\t\tbuf[i] = byte(ch);\n\t\tif( ch == '\\n' ){\n\t\t\tbreak;\n\t\t}\n\t}\n\tbuf[i] = 0\n\t\/\/fprintf(stderr,\"--fgets %d\/%d (%s)\\n\",i,len(buf),buf[0:i])\n\treturn i\n}\nfunc fgets(buf StrBuff, size int, fp*os.File)(int){\n\tvar ch int\n\tvar i int\n\tfor i = 0; i < len(buf)-1; i++ {\n\t\tch = fgetc(fp)\n\t\t\/\/fprintf(stderr,\"--fgets %d\/%d %X\\n\",i,len(buf),ch)\n\t\tif( ch == EOF ){\n\t\t\tbreak;\n\t\t}\n\t\tbuf[i] = byte(ch);\n\t\tif( ch == '\\n' ){\n\t\t\tbreak;\n\t\t}\n\t}\n\tbuf[i] = 0\n\t\/\/fprintf(stderr,\"--fgets %d\/%d (%s)\\n\",i,len(buf),buf[0:i])\n\treturn i\n}\nfunc fputc(ch int , fp*os.File)(int){\n\tvar buf [1]byte\n\tbuf[0] = byte(ch)\n\tfp.Write(buf[0:1])\n\treturn 0\n}\nfunc fputs(buf StrBuff, fp*os.File)(int){\n\tfp.Write(buf)\n\treturn 0\n}\nfunc xfputss(str string, fp*os.File)(int){\n\treturn fputs([]byte(str),fp)\n}\nfunc sscanf(str StrBuff,fmts string, params ...interface{})(int){\n\tfmt.Sscanf(string(str[0:strlen(str)]),fmts,params...)\n\treturn 0\n}\nfunc fprintf(fp*os.File,fmts string, params ...interface{})(int){\n\tfmt.Fprintf(fp,fmts,params...)\n\treturn 0\n}\n\n\/\/ <a name=\"IME\">Command Line IME<\/a>\n\/\/----------------------------------------------------------------------- MyIME\nvar MyIMEVER = \"MyIME\/0.0.2\";\ntype RomKana struct {\n\tdic string\t\/\/ dictionaly ID\n\tpat string\t\/\/ input pattern\n\tout string\t\/\/ output pattern\n\thit int64\t\/\/ count of hit and used\n}\nvar dicents = 0\nvar romkana [1024]RomKana\nvar Romkan []RomKana\n\nfunc isinDic(str string)(int){\n\tfor i,v := range Romkan {\n\t\tif v.pat == str {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\nconst (\n\tDIC_COM_LOAD = \"im\"\n\tDIC_COM_DUMP = \"s\"\n\tDIC_COM_LIST = \"ls\"\n\tDIC_COM_ENA  = \"en\"\n\tDIC_COM_DIS  = \"di\"\n)\nfunc helpDic(argv []string){\n\tout := stderr\n\tcmd := \"\"\n\tif 0 < len(argv) { cmd = argv[0] }\n\tfprintf(out,\"--- %v Usage\\n\",cmd)\n\tfprintf(out,\"... Commands\\n\")\n\tfprintf(out,\"...   %v %-3v [dicName] [dicURL ] -- Import dictionary\\n\",cmd,DIC_COM_LOAD)\n\tfprintf(out,\"...   %v %-3v [pattern] -- Search in dictionary\\n\",cmd,DIC_COM_DUMP)\n\tfprintf(out,\"...   %v %-3v [dicName] -- List dictionaries\\n\",cmd,DIC_COM_LIST)\n\tfprintf(out,\"...   %v %-3v [dicName] -- Disable dictionaries\\n\",cmd,DIC_COM_DIS)\n\tfprintf(out,\"...   %v %-3v [dicName] -- Enable dictionaries\\n\",cmd,DIC_COM_ENA)\n\tfprintf(out,\"... Keys ... %v\\n\",\"ESC can be used for '\\\\'\")\n\tfprintf(out,\"...   \\\\c -- Reverse the case of the last character\\n\",)\n\tfprintf(out,\"...   \\\\i -- Replace input with translated text\\n\",)\n\tfprintf(out,\"...   \\\\j -- On\/Off translation mode\\n\",)\n\tfprintf(out,\"...   \\\\l -- Force Lower Case\\n\",)\n\tfprintf(out,\"...   \\\\u -- Force Upper Case (software CapsLock)\\n\",)\n\tfprintf(out,\"...   \\\\v -- Show translation actions\\n\",)\n\tfprintf(out,\"...   \\\\x -- Replace the last input character with it Hexa-Decimal\\n\",)\n}\nfunc xDic(argv[]string){\n\tif len(argv) <= 1 {\n\t\thelpDic(argv)\n\t\treturn\n\t}\n\targv = argv[1:]\n\tvar debug = false\n\tvar info = false\n\tvar silent = false\n\tvar dump = false\n\tvar builtin = false\n\tcmd := argv[0]\n\targv = argv[1:]\n\topt := \"\"\n\targ := \"\"\n\n\tif 0 < len(argv) {\n\t\targ1 := argv[0]\n\t\tif arg1[0] == '-' {\n\t\t\tswitch arg1 {\n\t\t\t\tdefault: fmt.Printf(\"--Ed-- Unknown option(%v)\\n\",arg1)\n\t\t\t\t\treturn\n\t\t\t\tcase \"-b\": builtin = true\n\t\t\t\tcase \"-d\": debug = true\n\t\t\t\tcase \"-s\": silent = true\n\t\t\t\tcase \"-v\": info = true\n\t\t\t}\n\t\t\topt = arg1\n\t\t\targv = argv[1:]\n\t\t}\n\t}\n\n\tdicName := \"\"\n\tdicURL := \"\"\n\tif 0 < len(argv) {\n\t\targ = argv[0]\n\t\tdicName = arg\n\t\targv = argv[1:]\n\t}\n\tif 0 < len(argv) {\n\t\tdicURL = argv[0]\n\t\targv = argv[1:]\n\t}\n\tif false {\n\t\tfprintf(stderr,\"--Dd-- com(%v) opt(%v) arg(%v)\\n\",cmd,opt,arg)\n\t}\n\tif cmd == DIC_COM_LOAD {\n\t\t\/\/dicType := \"\"\n\t\tdicBody := \"\"\n\t\tif !builtin && dicName != \"\" && dicURL == \"\" {\n\t\t\tf,err := os.Open(dicName)\n\t\t\tif err == nil {\n\t\t\t\tdicURL = dicName\n\t\t\t}else{\n\t\t\t\tf,err = os.Open(dicName+\".html\")\n\t\t\t\tif err == nil {\n\t\t\t\t\tdicURL = dicName+\".html\"\n\t\t\t\t}else{\n\t\t\t\t\tf,err = os.Open(\"gshdic-\"+dicName+\".html\")\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\tdicURL = \"gshdic-\"+dicName+\".html\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif err == nil {\n\t\t\t\tvar buf = make([]byte,128*1024)\n\t\t\t\tcount,err := f.Read(buf)\n\t\t\t\tf.Close()\n\t\t\t\tif info {\n\t\t\t\t\tfprintf(stderr,\"--Id-- ReadDic(%v,%v)\\n\",count,err)\n\t\t\t\t}\n\t\t\t\tdicBody = string(buf[0:count])\n\t\t\t}\n\t\t}\n\t\tif dicBody == \"\" {\n\t\t\tswitch arg {\n\t\t\t\tdefault:\n\t\t\t\t\tdicName = \"WorldDic\"\n\t\t\t\t\tdicURL = WorldDic\n\t\t\t\t\tif info {\n\t\t\t\t\tfprintf(stderr,\"--Id-- default dictionary \\\"%v\\\"\\n\",\n\t\t\t\t\t\tdicName);\n\t\t\t\t\t}\n\t\t\t\tcase \"wnn\":\n\t\t\t\t\tdicName = \"WnnDic\"\n\t\t\t\t\tdicURL = WnnDic\n\t\t\t\tcase \"sumomo\":\n\t\t\t\t\tdicName = \"SumomoDic\"\n\t\t\t\t\tdicURL = SumomoDic\n\t\t\t\tcase \"sijimi\":\n\t\t\t\t\tdicName = \"SijimiDic\"\n\t\t\t\t\tdicURL = SijimiDic\n\t\t\t\tcase \"jkl\":\n\t\t\t\t\tdicName = \"JKLJaDic\"\n\t\t\t\t\tdicURL = JA_JKLDic\n\t\t\t}\n\t\t\tif debug {\n\t\t\t\tfprintf(stderr,\"--Id-- %v URL=%v\\n\\n\",dicName,dicURL);\n\t\t\t}\n\t\t\tdicv := strings.Split(dicURL,\",\")\n\t\t\tif debug {\n\t\t\t\tfprintf(stderr,\"--Id-- %v encoded data...\\n\",dicName)\n\t\t\t\tfprintf(stderr,\"Type: %v\\n\",dicv[0])\n\t\t\t\tfprintf(stderr,\"Body: %v\\n\",dicv[1])\n\t\t\t\tfprintf(stderr,\"\\n\")\n\t\t\t}\n\t\t\tbody,_ := base64.StdEncoding.DecodeString(dicv[1])\n\t\t\tdicBody = string(body)\n\t\t}\n\t\tif info {\n\t\t\tfmt.Printf(\"--Id-- %v %v\\n\",dicName,dicURL)\n\t\t\tfmt.Printf(\"%s\\n\",dicBody)\n\t\t}\n\t\tif debug {\n\t\t\tfprintf(stderr,\"--Id-- dicName %v text...\\n\",dicName)\n\t\t\tfprintf(stderr,\"%v\\n\",string(dicBody))\n\t\t}\n\t\tentv := strings.Split(dicBody,\"\\n\");\n\t\tif info {\n\t\t\tfprintf(stderr,\"--Id-- %v scan...\\n\",dicName);\n\t\t}\n\t\tvar added int = 0\n\t\tvar dup int = 0\n\t\tfor i,v := range entv {\n\t\t\tvar pat string\n\t\t\tvar out string\n\t\t\tfmt.Sscanf(v,\"%s %s\",&pat,&out)\n\t\t\tif len(pat) <= 0 {\n\t\t\t}else{\n\t\t\t\tif 0 <= isinDic(pat) {\n\t\t\t\t\tdup += 1\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tromkana[dicents] = RomKana{dicName,pat,out,0}\n\t\t\t\tdicents += 1\n\t\t\t\tadded += 1\n\t\t\t\tRomkan = append(Romkan,RomKana{dicName,pat,out,0})\n\t\t\t\tif debug {\n\t\t\t\t\tfmt.Printf(\"[%3v]:[%2v]%-8v [%2v]%v\\n\",\n\t\t\t\t\t\ti,len(pat),pat,len(out),out)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif !silent {\n\t\t\turl := dicURL\n\t\t\tif strBegins(url,\"data:\") {\n\t\t\t\turl = \"builtin\"\n\t\t\t}\n\t\t\tfprintf(stderr,\"--Id-- %v scan... %v added, %v dup. \/ %v total (%v)\\n\",\n\t\t\t\tdicName,added,dup,len(Romkan),url);\n\t\t}\n\t\t\/\/ should sort by pattern length for conclete match, for performance\n\t\tif debug {\n\t\t\targ = \"\" \/\/ search pattern\n\t\t\tdump = true\n\t\t}\n\t}\n\tif cmd == DIC_COM_DUMP || dump {\n\t\tfprintf(stderr,\"--Id-- %v dump... %v entries:\\n\",dicName,len(Romkan));\n\t\tvar match = 0\n\t\tfor i := 0; i < len(Romkan); i++ {\n\t\t\tdic := Romkan[i].dic\n\t\t\tpat := Romkan[i].pat\n\t\t\tout := Romkan[i].out\n\t\t\tif arg == \"\" || 0 <= strings.Index(pat,arg)||0 <= strings.Index(out,arg) {\n\t\t\t\tfmt.Printf(\"\\\\\\\\%v\\t%v [%2v]%-8v [%2v]%v\\n\",\n\t\t\t\t\ti,dic,len(pat),pat,len(out),out)\n\t\t\t\tmatch += 1\n\t\t\t}\n\t\t}\n\t\tfprintf(stderr,\"--Id-- %v matched %v \/ %v entries:\\n\",arg,match,len(Romkan));\n\t}\n}\nfunc loadDefaultDic(dic int){\n\tif( 0 < len(Romkan) ){\n\t\treturn\n\t}\n\t\/\/fprintf(stderr,\"\\r\\n\")\n\txDic([]string{\"dic\",DIC_COM_LOAD});\n\n\tvar info = false\n\tif info {\n\t\tfprintf(stderr,\"--Id-- Conguraturations!! WorldDic is now activated.\\r\\n\")\n\t\tfprintf(stderr,\"--Id-- enter \\\"dic\\\" command for help.\\r\\n\")\n\t}\n}\nfunc readDic()(int){\n\t\/*\n\tvar rk *os.File;\n\tvar dic = \"MyIME-dic.txt\";\n\t\/\/rk = fopen(\"romkana.txt\",\"r\");\n\t\/\/rk = fopen(\"JK-JA-morse-dic.txt\",\"r\");\n\trk = fopen(dic,\"r\");\n\tif( rk == NULL_FP ){\n\t\tif( true ){\n\t\t\tfprintf(stderr,\"--%s-- Could not load %s\\n\",MyIMEVER,dic);\n\t\t}\n\t\treturn -1;\n\t}\n\tif( true ){\n\t\tvar di int;\n\t\tvar line = make(StrBuff,1024);\n\t\tvar pat string\n\t\tvar out string\n\t\tfor di = 0; di < 1024; di++ {\n\t\t\tif( fgets(line,sizeof(line),rk) == NULLSP ){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfmt.Sscanf(string(line[0:strlen(line)]),\"%s %s\",&pat,&out);\n\t\t\t\/\/sscanf(line,\"%s %[^\\r\\n]\",&pat,&out);\n\t\t\tromkana[di].pat = pat;\n\t\t\tromkana[di].out = out;\n\t\t\t\/\/fprintf(stderr,\"--Dd- %-10s %s\\n\",pat,out)\n\t\t}\n\t\tdicents += di\n\t\tif( false ){\n\t\t\tfprintf(stderr,\"--%s-- loaded romkana.txt [%d]\\n\",MyIMEVER,di);\n\t\t\tfor di = 0; di < dicents; di++ {\n\t\t\t\tfprintf(stderr,\n\t\t\t\t\t\"%s %s\\n\",romkana[di].pat,romkana[di].out);\n\t\t\t}\n\t\t}\n\t}\n\tfclose(rk);\n\n\t\/\/romkana[dicents].pat = \"\/\/ddump\"\n\t\/\/romkana[dicents].pat = \"\/\/ddump\" \/\/ dump the dic. and clean the command input\n\t*\/\n\treturn 0;\n}\nfunc matchlen(stri string, pati string)(int){\n\tif strBegins(stri,pati) {\n\t\treturn len(pati)\n\t}else{\n\t\treturn 0\n\t}\n}\nfunc convs(src string)(string){\n\tvar si int;\n\tvar sx = len(src);\n\tvar di int;\n\tvar mi int;\n\tvar dstb []byte\n\n\tfor si = 0; si < sx; { \/\/ search max. match from the position \n\t\tif strBegins(src[si:],\"%x\/\") {\n\t\t\t\/\/ %x\/integer\/ \/\/ s\/a\/b\/\n\t\t\tix := strings.Index(src[si+3:],\"\/\")\n\t\t\tif 0 < ix {\n\t\t\t\tvar iv int = 0\n\t\t\t\t\/\/fmt.Sscanf(src[si+3:si+3+ix],\"%d\",&iv)\n\t\t\t\tfmt.Sscanf(src[si+3:si+3+ix],\"%v\",&iv)\n\t\t\t\tsval := fmt.Sprintf(\"%x\",iv)\n\t\t\t\tbval := []byte(sval)\n\t\t\t\tdstb = append(dstb,bval...)\n\t\t\t\tsi = si+3+ix+1\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif strBegins(src[si:],\"%d\/\") {\n\t\t\t\/\/ %d\/integer\/ \/\/ s\/a\/b\/\n\t\t\tix := strings.Index(src[si+3:],\"\/\")\n\t\t\tif 0 < ix {\n\t\t\t\tvar iv int = 0\n\t\t\t\tfmt.Sscanf(src[si+3:si+3+ix],\"%v\",&iv)\n\t\t\t\tsval := fmt.Sprintf(\"%d\",iv)\n\t\t\t\tbval := []byte(sval)\n\t\t\t\tdstb = append(dstb,bval...)\n\t\t\t\tsi = si+3+ix+1\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif strBegins(src[si:],\"%t\") {\n\t\t\tnow := time.Now()\n\t\t\tif true {\n\t\t\t\tdate := now.Format(time.Stamp)\n\t\t\t\tdstb = append(dstb,[]byte(date)...)\n\t\t\t\tsi = si+3\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tvar maxlen int = 0;\n\t\tvar len int;\n\t\tmi = -1;\n\t\tfor di = 0; di < dicents; di++ {\n\t\t\tlen = matchlen(src[si:],romkana[di].pat);\n\t\t\tif( maxlen < len ){\n\t\t\t\tmaxlen = len;\n\t\t\t\tmi = di;\n\t\t\t}\n\t\t}\n\t\tif( 0 < maxlen ){\n\t\t\tout := romkana[mi].out;\n\t\t\tdstb = append(dstb,[]byte(out)...);\n\t\t\tsi += maxlen;\n\t\t}else{\n\t\t\tdstb = append(dstb,src[si])\n\t\t\tsi += 1;\n\t\t}\n\t}\n\treturn string(dstb)\n}\nfunc trans(src string)(int){\n\tdst := convs(src);\n\txfputss(dst,stderr);\n\treturn 0;\n}\n\n\/\/------------------------------------------------------------- LINEEDIT\n\/\/ \"?\" at the top of the line means searching history\n\n\/\/ should be compatilbe with Telnet\nconst (\n\tEV_MODE\t\t= 255\n\tEV_IDLE\t\t= 254\n\tEV_TIMEOUT\t= 253\n\n\tGO_UP\t\t= 252\t\/\/ k\n\tGO_DOWN\t\t= 251\t\/\/ j\n\tGO_RIGHT\t= 250\t\/\/ l\n\tGO_LEFT\t\t= 249\t\/\/ h\n\tDEL_RIGHT\t= 248\t\/\/ x\n\tGO_TOPL\t\t= 'A'-0x40\t\/\/ 0\n\tGO_ENDL\t\t= 'E'-0x40\t\/\/ $\n\n\tGO_TOPW\t\t= 239\t\/\/ b\n\tGO_ENDW\t\t= 238\t\/\/ e\n\tGO_NEXTW\t= 237\t\/\/ w\n\n\tGO_FORWCH\t= 229\t\/\/ f\n\tGO_PAIRCH\t= 228\t\/\/ %\n\n\tGO_DEL\t\t= 219\t\/\/ d\n\n\tHI_SRCH_FW\t= 209\t\/\/ \/\n\tHI_SRCH_BK\t= 208\t\/\/ ?\n\tHI_SRCH_RFW\t= 207\t\/\/ n\n\tHI_SRCH_RBK\t= 206\t\/\/ N\n)\n\n\/\/ should return number of octets ready to be read immediately\n\/\/fprintf(stderr,\"\\n--Select(%v %v)\\n\",err,r.Bits[0])\n\n\nvar EventRecvFd = -1 \/\/ file descriptor\nvar EventSendFd = -1\nconst EventFdOffset = 1000000\nconst NormalFdOffset = 100\n\nfunc putEvent(event int, evarg int){\n\tif true {\n\t\tif EventRecvFd < 0 {\n\t\t\tvar pv = []int{-1,-1}\n\t\t\tsyscall.Pipe(pv)\n\t\t\tEventRecvFd = pv[0]\n\t\t\tEventSendFd = pv[1]\n\t\t\t\/\/fmt.Printf(\"--De-- EventPipe created[%v,%v]\\n\",EventRecvFd,EventSendFd)\n\t\t}\n\t}else{\n\t\tif EventRecvFd < 0 {\n\t\t\t\/\/ the document differs from this spec\n\t\t\t\/\/ https:\/\/golang.org\/src\/syscall\/syscall_unix.go?s=8096:8158#L340\n\t\t\tsv,err := syscall.Socketpair(syscall.AF_UNIX,syscall.SOCK_STREAM,0)\n\t\t\tEventRecvFd = sv[0]\n\t\t\tEventSendFd = sv[1]\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"--De-- EventSock created[%v,%v](%v)\\n\",\n\t\t\t\t\tEventRecvFd,EventSendFd,err)\n\t\t\t}\n\t\t}\n\t}\n\tvar buf = []byte{ byte(event)}\n\tn,err := syscall.Write(EventSendFd,buf)\n\tif err != nil {\n\t\tfmt.Printf(\"--De-- putEvent[%v](%3v)(%v %v)\\n\",EventSendFd,event,n,err)\n\t}\n}\nfunc ungets(str string){\n\tfor _,ch := range str {\n\t\tputEvent(int(ch),0)\n\t}\n}\nfunc (gsh*GshContext)xReplay(argv[]string){\n\thix := 0\n\ttempo := 1.0\n\txtempo := 1.0\n\trepeat := 1\n\n\tfor _,a := range argv { \/\/ tempo\n\t\tif strBegins(a,\"x\") {\n\t\t\tfmt.Sscanf(a[1:],\"%f\",&xtempo)\n\t\t\ttempo = 1 \/ xtempo\n\t\t\t\/\/fprintf(stderr,\"--Dr-- tempo=[%v]%v\\n\",a[2:],tempo);\n\t\t}else\n\t\tif strBegins(a,\"r\") { \/\/ repeat\n\t\t\tfmt.Sscanf(a[1:],\"%v\",&repeat)\n\t\t}else\n\t\tif strBegins(a,\"!\") {\n\t\t\tfmt.Sscanf(a[1:],\"%d\",&hix)\n\t\t}else{\n\t\t\tfmt.Sscanf(a,\"%d\",&hix)\n\t\t}\n\t}\n\tif hix == 0 || len(argv) <= 1 {\n\t\thix = len(gsh.CommandHistory)-1\n\t}\n\tfmt.Printf(\"--Ir-- Replay(!%v x%v r%v)\\n\",hix,xtempo,repeat)\n\t\t\/\/dumpEvents(hix)\n\t\/\/gsh.xScanReplay(hix,false,repeat,tempo,argv)\n\tgo gsh.xScanReplay(hix,true,repeat,tempo,argv)\n}\n\n\/\/ <a href=\"https:\/\/golang.org\/pkg\/syscall\/#FdSet\">syscall.Select<\/a>\n\/\/ 2020-0827 GShell-0.2.3\n\/*\nfunc FpollIn1(fp *os.File,usec int)(uintptr){\n\tnfd := 1\n\n\trdv := syscall.FdSet {}\n\tfd1 := fp.Fd()\n\tbank1 := fd1\/32\n\tmask1 := int32(1 << fd1)\n\trdv.Bits[bank1] = mask1\n\n\tfd2 := -1\n\tbank2 := -1\n\tvar mask2 int32 = 0\n\n\tif 0 <= EventRecvFd {\n\t\tfd2 = EventRecvFd\n\t\tnfd = fd2 + 1\n\t\tbank2 = fd2\/32\n\t\tmask2 = int32(1 << fd2)\n\t\trdv.Bits[bank2] |= mask2\n\t\t\/\/fmt.Printf(\"--De-- EventPoll mask added [%d][%v][%v]\\n\",fd2,bank2,mask2)\n\t}\n\n\ttout := syscall.NsecToTimeval(int64(usec*1000))\n\t\/\/n,err := syscall.Select(nfd,&rdv,nil,nil,&tout) \/\/ spec. mismatch\n\terr := syscall.Select(nfd,&rdv,nil,nil,&tout)\n\tif err != nil {\n\t\t\/\/fmt.Printf(\"--De-- select() err(%v)\\n\",err)\n\t}\n\tif err == nil {\n\t\tif 0 <= fd2 && (rdv.Bits[bank2] & mask2) != 0 {\n\t\t\tif false {\n\t\t\t\tfmt.Printf(\"--De-- got Event\\n\")\n\t\t\t}\n\t\t\treturn uintptr(EventFdOffset + fd2)\n\t\t}else\n\t\tif (rdv.Bits[bank1] & mask1) != 0 {\n\t\t\treturn uintptr(NormalFdOffset + fd1)\n\t\t}else{\n\t\t\treturn 1\n\t\t}\n\t}else{\n\t\treturn 0\n\t}\n}\n*\/\nfunc fgetcTimeout1(fp *os.File,usec int)(int){\n  READ1:\n\t\/\/readyFd := FpollIn1(fp,usec)\n\treadyFd := CFpollIn1(fp,usec)\n\tif readyFd < 100 {\n\t\treturn EV_TIMEOUT\n\t}\n\n\tvar buf [1]byte\n\n\tif EventFdOffset <= readyFd {\n\t\tfd := int(readyFd-EventFdOffset)\n\t\t_,err := syscall.Read(fd,buf[0:1])\n\t\tif( err != nil ){\n\t\t\treturn EOF;\n\t\t}else{\n\t\t\tif buf[0] == EV_MODE {\n\t\t\t\trecvEvent(fd)\n\t\t\t\tgoto READ1\n\t\t\t}\n\t\t\treturn int(buf[0])\n\t\t}\n\t}\n\n\t_,err := fp.Read(buf[0:1])\n\tif( err != nil ){\n\t\treturn EOF;\n\t}else{\n\t\treturn int(buf[0])\n\t}\n}\n\nfunc visibleChar(ch int)(string){\n\tswitch {\n\t\tcase '!' <= ch && ch <= '~':\n\t\t\treturn string(ch)\n\t}\n\tswitch ch {\n\t\tcase ' ': return \"\\\\s\"\n\t\tcase '\\n': return \"\\\\n\"\n\t\tcase '\\r': return \"\\\\r\"\n\t\tcase '\\t': return \"\\\\t\"\n\t}\n\tswitch ch {\n\t\tcase 0x00: return \"NUL\"\n\t\tcase 0x07: return \"BEL\"\n\t\tcase 0x08: return \"BS\"\n\t\tcase 0x0E: return \"SO\"\n\t\tcase 0x0F: return \"SI\"\n\t\tcase 0x1B: return \"ESC\"\n\t\tcase 0x7F: return \"DEL\"\n\t}\n\tswitch ch {\n\t\tcase EV_IDLE: return fmt.Sprintf(\"IDLE\")\n\t\tcase EV_MODE: return fmt.Sprintf(\"MODE\")\n\t}\n\treturn fmt.Sprintf(\"%X\",ch)\n}\nfunc recvEvent(fd int){\n\tvar buf = make([]byte,1)\n\t_,_ = syscall.Read(fd,buf[0:1])\n\tif( buf[0] != 0 ){\n\t\tromkanmode = true\n\t}else{\n\t\tromkanmode = false\n\t}\n}\nfunc (gsh*GshContext)xScanReplay(hix int,replay bool,repeat int,tempo float64,argv[]string){\n\tvar Start time.Time\n\tvar events = []Event{}\n\tfor _,e := range Events {\n\t\tif hix == 0 || e.CmdIndex == hix {\n\t\t\tevents = append(events,e)\n\t\t}\n\t}\n\telen := len(events)\n\tif 0 < elen {\n\t\tif events[elen-1].event == EV_IDLE {\n\t\t\tevents = events[0:elen-1]\n\t\t}\n\t}\n\tfor r := 0; r < repeat; r++ {\n\t\tfor i,e := range events {\n\t\t\tnano := e.when.Nanosecond()\n\t\t\tmicro := nano \/ 1000\n\t\t\tif Start.Second() == 0 {\n\t\t\t\tStart = time.Now()\n\t\t\t}\n\t\t\tdiff := time.Now().Sub(Start)\n\t\t\tif replay {\n\t\t\t\tif e.event != EV_IDLE {\n\t\t\t\t\tputEvent(e.event,0)\n\t\t\t\t\tif e.event == EV_MODE { \/\/ event with arg\n\t\t\t\t\t\tputEvent(int(e.evarg),0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\tfmt.Printf(\"%7.3fms #%-3v !%-3v [%v.%06d] %3v %02X %-4v %10.3fms\\n\",\n\t\t\t\t\tfloat64(diff)\/1000000.0,\n\t\t\t\t\ti,\n\t\t\t\t\te.CmdIndex,\n\t\t\t\t\te.when.Format(time.Stamp),micro,\n\t\t\t\t\te.event,e.event,visibleChar(e.event),\n\t\t\t\t\tfloat64(e.evarg)\/1000000.0)\n\t\t\t}\n\t\t\tif e.event == EV_IDLE {\n\t\t\t\td := time.Duration(float64(time.Duration(e.evarg)) * tempo)\n\t\t\t\t\/\/nsleep(time.Duration(e.evarg))\n\t\t\t\tnsleep(d)\n\t\t\t}\n\t\t}\n\t}\n}\nfunc dumpEvents(arg[]string){\n\thix := 0\n\tif 1 < len(arg) {\n\t\tfmt.Sscanf(arg[1],\"%d\",&hix)\n\t}\n\tfor i,e := range Events {\n\t\tnano := e.when.Nanosecond()\n\t\tmicro := nano \/ 1000\n\t\t\/\/if e.event != EV_TIMEOUT {\n\t\tif hix == 0 || e.CmdIndex == hix {\n\t\t\tfmt.Printf(\"#%-3v !%-3v [%v.%06d] %3v %02X %-4v %10.3fms\\n\",i,\n\t\t\t\te.CmdIndex,\n\t\t\t\te.when.Format(time.Stamp),micro,\n\t\t\t\te.event,e.event,visibleChar(e.event),float64(e.evarg)\/1000000.0)\n\t\t}\n\t\t\/\/}\n\t}\n}\nfunc fgetcTimeout(fp *os.File,usec int)(int){\n\tch := fgetcTimeout1(fp,usec)\n\tif ch != EV_TIMEOUT {\n\t\tnow := time.Now()\n\t\tif 0 < len(Events) {\n\t\t\tlast := Events[len(Events)-1]\n\t\t\tdura := int64(now.Sub(last.when))\n\t\t\tEvents = append(Events,Event{last.when,EV_IDLE,dura,last.CmdIndex})\n\t\t}\n\t\tEvents = append(Events,Event{time.Now(),ch,0,CmdIndex})\n\t}\n\treturn ch\n}\n\nvar TtyMaxCol = 72 \/\/ to be obtained by ioctl?\nvar EscTimeout = (100*1000)\nvar (\n\tMODE_VicMode\tbool\t\/\/ vi compatible command mode\n\tMODE_ShowMode\tbool\n\tromkanmode\tbool\t\/\/ shown translation mode, the mode to be retained\n\tMODE_Recursive\tbool\t\/\/ recursive translation\n\tMODE_CapsLock\tbool\t\/\/ software CapsLock\n\tMODE_LowerLock\tbool\t\/\/ force lower-case character lock\n\tMODE_ViInsert\tint\t\/\/ visible insert mode, should be like \"I\" icon in X Window\n\tMODE_ViTrace\tbool\t\/\/ output newline before translation\n)\ntype IInput struct {\n\tlno\t\tint\n\tlastlno\t\tint\n\tpch\t\t[]int\t\/\/ input queue\n\tprompt\t\tstring\n\tline\t\tstring\n\tright\t\tstring\n\tinJmode\t\tbool\n\tpinJmode\tbool\n\twaitingMeta\tstring\t\/\/ waiting meta character\n\tLastCmd\t\tstring\n}\nfunc (iin*IInput)Getc(timeoutUs int)(int){\n\tch1 := EOF\n\tch2 := EOF\n\tch3 := EOF\n\tif( 0 < len(iin.pch) ){ \/\/ deQ\n\t\tch1 = iin.pch[0]\n\t\tiin.pch = iin.pch[1:]\n\t}else{\n\t\tch1 = fgetcTimeout(stdin,timeoutUs);\n\t}\n\tif( ch1 == 033 ){ \/\/\/ escape sequence\n\t\tch2 = fgetcTimeout(stdin,EscTimeout);\n\t\tif( ch2 == EV_TIMEOUT ){\n\t\t}else{\n\t\t\tch3 = fgetcTimeout(stdin,EscTimeout);\n\t\t\tif( ch3 == EV_TIMEOUT ){\n\t\t\t\tiin.pch = append(iin.pch,ch2) \/\/ enQ\n\t\t\t}else{\n\t\t\t\tswitch( ch2 ){\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tiin.pch = append(iin.pch,ch2) \/\/ enQ\n\t\t\t\t\t\tiin.pch = append(iin.pch,ch3) \/\/ enQ\n\t\t\t\t\tcase '[':\n\t\t\t\t\t\tswitch( ch3 ){\n\t\t\t\t\t\t\tcase 'A': ch1 = GO_UP; \/\/ ^\n\t\t\t\t\t\t\tcase 'B': ch1 = GO_DOWN; \/\/ v\n\t\t\t\t\t\t\tcase 'C': ch1 = GO_RIGHT; \/\/ >\n\t\t\t\t\t\t\tcase 'D': ch1 = GO_LEFT; \/\/ <\n\t\t\t\t\t\t\tcase '3':\n\t\t\t\tch4 := fgetcTimeout(stdin,EscTimeout);\n\t\t\t\t\t\t\t\tif( ch4 == '~' ){\n\t\t\t\t\/\/fprintf(stderr,\"x[%02X %02X %02X %02X]\\n\",ch1,ch2,ch3,ch4);\n\t\t\t\t\t\t\t\t\tch1 = DEL_RIGHT\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tcase '\\\\':\n\t\t\t\t\/\/ch4 := fgetcTimeout(stdin,EscTimeout);\n\t\t\t\t\/\/fprintf(stderr,\"y[%02X %02X %02X %02X]\\n\",ch1,ch2,ch3,ch4);\n\t\t\t\t\t\tswitch( ch3 ){\n\t\t\t\t\t\t\tcase '~': ch1 = DEL_RIGHT\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn ch1\n}\nfunc (inn*IInput)clearline(){\n\tvar i int\n\tfprintf(stderr,\"\\r\");\n\t\/\/ should be ANSI ESC sequence\n\tfor i = 0; i < TtyMaxCol; i++ { \/\/ to the max. position in this input action\n\t\tfputc(' ',os.Stderr);\n\t}\n\tfprintf(stderr,\"\\r\");\n}\nfunc (iin*IInput)Redraw(){\n\tredraw(iin,iin.lno,iin.line,iin.right)\n}\nfunc redraw(iin *IInput,lno int,line string,right string){\n\tinMeta := false\n\tshowMode := \"\"\n\tshowMeta := \"\" \/\/ visible Meta mode on the cursor position\n\tshowLino := fmt.Sprintf(\"!%d! \",lno)\n\tInsertMark := \"\" \/\/ in visible insert mode\n\n\tif MODE_VicMode {\n\t}else\n\tif 0 < len(iin.right) {\n\t\tInsertMark = \" \"\n\t}\n\n\tif( 0 < len(iin.waitingMeta) ){\n\t\tinMeta = true\n\t\tif iin.waitingMeta[0] != 033 {\n\t\t\tshowMeta = iin.waitingMeta\n\t\t}\n\t}\n\tif( romkanmode ){\n\t\t\/\/romkanmark = \" *\";\n\t}else{\n\t\t\/\/romkanmark = \"\";\n\t}\n\tif MODE_ShowMode {\n\t\tromkan := \"--\"\n\t\tinmeta := \"-\"\n\t\tinveri := \"\"\n\t\tif MODE_CapsLock {\n\t\t\tinmeta = \"A\"\n\t\t}\n\t\tif MODE_LowerLock {\n\t\t\tinmeta = \"a\"\n\t\t}\n\t\tif MODE_ViTrace {\n\t\t\tinveri = \"v\"\n\t\t}\n\t\tif MODE_VicMode {\n\t\t\tinveri = \":\"\n\t\t}\n\t\tif romkanmode {\n\t\t\tromkan = \"\\343\\201\\202\"\n\t\t\tif MODE_CapsLock {\n\t\t\t\tinmeta = \"R\"\n\t\t\t}else{\n\t\t\t\tinmeta = \"r\"\n\t\t\t}\n\t\t}\n\t\tif inMeta {\n\t\t\tinmeta = \"\\\\\"\n\t\t}\n\t\tshowMode = \"[\"+romkan+inmeta+inveri+\"]\";\n\t}\n\tPre := \"\\r\" + showMode + showLino \n\tOutput := \"\"\n\tLeft := \"\"\n\tRight := \"\"\n\tif romkanmode {\n\t\tLeft = convs(line)\n\t\tRight = InsertMark+convs(right)\n\t}else{\n\t\tLeft = line\n\t\tRight = InsertMark+right\n\t}\n\tOutput = Pre+Left\n\tif MODE_ViTrace {\n\t\tOutput += iin.LastCmd\n\t}\n\tOutput += showMeta+Right\n\tfor len(Output) < TtyMaxCol { \/\/ to the max. position that may be dirty\n\t\tOutput += \" \"\n\t\t\/\/ should be ANSI ESC sequence\n\t\t\/\/ not necessary just after newline\n\t}\n\tOutput += Pre+Left+showMeta \/\/ to set the cursor to the current input position\n\tfprintf(stderr,\"%s\",Output)\n\n\tif MODE_ViTrace {\n\t\tif 0 < len(iin.LastCmd) {\n\t\t\tiin.LastCmd = \"\"\n\t\t\tfprintf(stderr,\"\\r\\n\")\n\t\t}\n\t}\n}\n\/\/ <a href=\"https:\/\/golang.org\/pkg\/unicode\/utf8\/\">utf8<\/a>\nfunc delHeadChar(str string)(rline string,head string){\n\t_,clen := utf8.DecodeRune([]byte(str))\n\thead = string(str[0:clen])\n\treturn str[clen:],head\n}\nfunc delTailChar(str string)(rline string, last string){\n\tvar i = 0\n\tvar clen = 0\n\tfor {\n\t\t_,siz := utf8.DecodeRune([]byte(str)[i:])\n\t\tif siz <= 0 { break }\n\t\tclen = siz\n\t\ti += siz\n\t}\n\tlast = str[len(str)-clen:]\n\treturn str[0:len(str)-clen],last\n}\n\n\/\/ 3> for output and history\n\/\/ 4> for keylog?\n\/\/ <a name=\"getline\">Command Line Editor<\/a>\nfunc xgetline(lno int, prevline string, gsh*GshContext)(string){\n\tvar iin IInput\n\tiin.lastlno = lno\n\tiin.lno = lno\n\n\tCmdIndex = len(gsh.CommandHistory)\n\tif( isatty(0) == 0 ){\n\t\tif( sfgets(&iin.line,LINESIZE,stdin) == NULL ){\n\t\t\tiin.line = \"exit\\n\";\n\t\t}else{\n\t\t}\n\t\treturn iin.line\n\t}\n\tif( true ){\n\t\t\/\/var pts string;\n\t\t\/\/pts = ptsname(0);\n\t\t\/\/pts = ttyname(0);\n\t\t\/\/fprintf(stderr,\"--pts[0] = %s\\n\",pts?pts:\"?\");\n\t}\n\tif( false ){\n\t\tfprintf(stderr,\"! \");\n\t\tfflush(stderr);\n\t\tsfgets(&iin.line,LINESIZE,stdin);\n\t\treturn iin.line\n\t}\n\tsystem(\"\/bin\/stty -echo -icanon\");\n\txline := iin.xgetline1(prevline,gsh)\n\tsystem(\"\/bin\/stty echo sane\");\n\treturn xline\n}\nfunc (iin*IInput)Translate(cmdch int){\n\tromkanmode = !romkanmode;\n\tif MODE_ViTrace {\n\t\tfprintf(stderr,\"%v\\r\\n\",string(cmdch));\n\t}else\n\tif( cmdch == 'J' ){\n\t\tfprintf(stderr,\"J\\r\\n\");\n\t\tiin.inJmode = true\n\t}\n\tiin.Redraw();\n\tloadDefaultDic(cmdch);\n\tiin.Redraw();\n}\nfunc (iin*IInput)Replace(cmdch int){\n\tiin.LastCmd = fmt.Sprintf(\"\\\\%v\",string(cmdch))\n\tiin.Redraw();\n\tloadDefaultDic(cmdch);\n\tdst := convs(iin.line+iin.right);\n\tiin.line = dst\n\tiin.right = \"\"\n\tif( cmdch == 'I' ){\n\t\tfprintf(stderr,\"I\\r\\n\");\n\t\tiin.inJmode = true\n\t}\n\tiin.Redraw();\n}\n\/\/ aa 12 a1a1\nfunc isAlpha(ch rune)(bool){\n\tif 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' {\n\t\treturn true\n\t}\n\treturn false\n}\nfunc isAlnum(ch rune)(bool){\n\tif 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' {\n\t\treturn true\n\t}\n\tif '0' <= ch && ch <= '9' {\n\t\treturn true\n\t}\n\treturn false\n}\n\n\/\/ 0.2.8 2020-0901 created\n\/\/ <a href=\"https:\/\/golang.org\/pkg\/unicode\/utf8\/#DecodeRuneInString\">DecodeRuneInString<\/a>\nfunc (iin*IInput)GotoTOPW(){\n\tstr := iin.line\n\ti := len(str)\n\tif i <= 0 {\n\t\treturn\n\t}\n\t\/\/i0 := i\n\ti -= 1\n\tlastSize := 0\n\tvar lastRune rune\n\tvar found = -1\n\tfor 0 < i { \/\/ skip preamble spaces\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif !isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\ti -= lastSize\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n\tfor 0 < i {\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif lastSize <= 0 { continue } \/\/ not the character top\n\t\tif !isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\tfound = i\n\t\t\tbreak\n\t\t}\n\t\ti -= lastSize\n\t}\n\tif found < 0 && i == 0 {\n\t\tfound = 0\n\t}\n\tif 0 <= found {\n\t\tif isAlnum(lastRune) { \/\/ or non-kana character\n\t\t}else{ \/\/ when positioning to the top o the word\n\t\t\ti += lastSize\n\t\t}\n\t\tiin.right = str[i:] + iin.right\n\t\tif 0 < i {\n\t\t\tiin.line = str[0:i]\n\t\t}else{\n\t\t\tiin.line = \"\"\n\t\t}\n\t}\n\t\/\/fmt.Printf(\"\\n(%d,%d,%d)[%s][%s]\\n\",i0,i,found,iin.line,iin.right)\n\t\/\/fmt.Printf(\"\") \/\/ set debug messae at the end of line\n}\n\/\/ 0.2.8 2020-0901 created\nfunc (iin*IInput)GotoENDW(){\n\tstr := iin.right\n\tif len(str) <= 0 {\n\t\treturn\n\t}\n\tlastSize := 0\n\tvar lastRune rune\n\tvar lastW = 0\n\ti := 0\n\tinWord := false\n\n\tlastRune,lastSize = utf8.DecodeRuneInString(str[0:])\n\tif isAlnum(lastRune) {\n\t\tr,z := utf8.DecodeRuneInString(str[lastSize:])\n\t\tif 0 < z && isAlnum(r) {\n\t\t\tinWord = true\n\t\t}\n\t}\n\tfor i < len(str) {\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif lastSize <= 0 { break } \/\/ broken data?\n\t\tif !isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\tbreak\n\t\t}\n\t\tlastW = i \/\/ the last alnum if in alnum word\n\t\ti += lastSize\n\t}\n\tif inWord {\n\t\tgoto DISP\n\t}\n\tfor i < len(str) {\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif lastSize <= 0 { break } \/\/ broken data?\n\t\tif isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\tbreak\n\t\t}\n\t\ti += lastSize\n\t}\n\tfor i < len(str) {\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif lastSize <= 0 { break } \/\/ broken data?\n\t\tif !isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\tbreak\n\t\t}\n\t\tlastW = i\n\t\ti += lastSize\n\t}\nDISP:\n\tif 0 < lastW {\n\t\tiin.line = iin.line + str[0:lastW]\n\t\tiin.right = str[lastW:]\n\t}\n\t\/\/fmt.Printf(\"\\n(%d)[%s][%s]\\n\",i,iin.line,iin.right)\n\t\/\/fmt.Printf(\"\") \/\/ set debug messae at the end of line\n}\n\/\/ 0.2.8 2020-0901 created\nfunc (iin*IInput)GotoNEXTW(){\n\tstr := iin.right\n\tif len(str) <= 0 {\n\t\treturn\n\t}\n\tlastSize := 0\n\tvar lastRune rune\n\tvar found = -1\n\ti := 1\n\tfor i < len(str) {\n\t\tlastRune,lastSize = utf8.DecodeRuneInString(str[i:])\n\t\tif lastSize <= 0 { break } \/\/ broken data?\n\t\tif !isAlnum(lastRune) { \/\/ character, type, or string to be searched\n\t\t\tfound = i\n\t\t\tbreak\n\t\t}\n\t\ti += lastSize\n\t}\n\tif 0 < found {\n\t\tif isAlnum(lastRune) { \/\/ or non-kana character\n\t\t}else{ \/\/ when positioning to the top o the word\n\t\t\tfound += lastSize\n\t\t}\n\t\tiin.line = iin.line + str[0:found]\n\t\tif 0 < found {\n\t\t\tiin.right = str[found:]\n\t\t}else{\n\t\t\tiin.right = \"\"\n\t\t}\n\t}\n\t\/\/fmt.Printf(\"\\n(%d)[%s][%s]\\n\",i,iin.line,iin.right)\n\t\/\/fmt.Printf(\"\") \/\/ set debug messae at the end of line\n}\n\/\/ 0.2.8 2020-0902 created\nfunc (iin*IInput)GotoPAIRCH(){\n\tstr := iin.right\n\tif len(str) <= 0 {\n\t\treturn\n\t}\n\tlastRune,lastSize := utf8.DecodeRuneInString(str[0:])\n\tif lastSize <= 0 {\n\t\treturn\n\t}\n\tforw := false\n\tback := false\n\tpair := \"\"\n\tswitch string(lastRune){\n\t\tcase \"{\": pair = \"}\"; forw = true\n\t\tcase \"}\": pair = \"{\"; back = true\n\t\tcase \"(\": pair = \")\"; forw = true\n\t\tcase \")\": pair = \"(\"; back = true\n\t\tcase \"[\": pair = \"]\"; forw = true\n\t\tcase \"]\": pair = \"[\"; back = true\n\t\tcase \"<\": pair = \">\"; forw = true\n\t\tcase \">\": pair = \"<\"; back = true\n\t\tcase \"\\\"\": pair = \"\\\"\"; \/\/ context depednet, can be f\" or back-double quote\n\t\tcase \"'\": pair = \"'\"; \/\/ context depednet, can be f' or back-quote\n\t\t\/\/ case Japanese Kakkos\n\t}\n\tif forw {\n\t\tiin.SearchForward(pair)\n\t}\n\tif back {\n\t\tiin.SearchBackward(pair)\n\t}\n}\n\/\/ 0.2.8 2020-0902 created\nfunc (iin*IInput)SearchForward(pat string)(bool){\n\tright := iin.right\n\tfound := -1\n\ti := 0\n\tif strBegins(right,pat) {\n\t\t_,z := utf8.DecodeRuneInString(right[i:])\n\t\tif 0 < z {\n\t\t\ti += z\n\t\t}\n\t}\n\tfor i < len(right) {\n\t\tif strBegins(right[i:],pat) {\n\t\t\tfound = i\n\t\t\tbreak\n\t\t}\n\t\t_,z := utf8.DecodeRuneInString(right[i:])\n\t\tif z <= 0 { break }\n\t\ti += z\n\t}\n\tif 0 <= found {\n\t\tiin.line = iin.line + right[0:found]\n\t\tiin.right = iin.right[found:]\n\t\treturn true\n\t}else{\n\t\treturn false\n\t}\n}\n\/\/ 0.2.8 2020-0902 created\nfunc (iin*IInput)SearchBackward(pat string)(bool){\n\tline := iin.line\n\tfound := -1\n\ti := len(line)-1\n\tfor i = i; 0 <= i; i-- {\n\t\t_,z := utf8.DecodeRuneInString(line[i:])\n\t\tif z <= 0 { \n\t\t\tcontinue\n\t\t}\n\t\t\/\/fprintf(stderr,\"-- %v %v\\n\",pat,line[i:])\n\t\tif strBegins(line[i:],pat) {\n\t\t\tfound = i\n\t\t\tbreak\n\t\t}\n\t}\n\t\/\/fprintf(stderr,\"--%d\\n\",found)\n\tif 0 <= found {\n\t\tiin.right = line[found:] + iin.right\n\t\tiin.line = line[0:found]\n\t\treturn true\n\t}else{\n\t\treturn false\n\t}\n}\n\/\/ 0.2.8 2020-0902 created\n\/\/ search from top, end, or current position\nfunc (gsh*GshContext)SearchHistory(pat string, forw bool)(bool,string){\n\tif forw {\n\t\tfor _,v := range gsh.CommandHistory {\n\t\t\tif 0 <= strings.Index(v.CmdLine,pat) {\n\t\t\t\t\/\/fprintf(stderr,\"\\n--De-- found !%v [%v]%v\\n\",i,pat,v.CmdLine)\n\t\t\t\treturn true,v.CmdLine\n\t\t\t}\n\t\t}\n\t}else{\n\t\thlen := len(gsh.CommandHistory)\n\t\tfor i := hlen-1; 0 < i ; i-- {\n\t\t\tv := gsh.CommandHistory[i]\n\t\t\tif 0 <= strings.Index(v.CmdLine,pat) {\n\t\t\t\t\/\/fprintf(stderr,\"\\n--De-- found !%v [%v]%v\\n\",i,pat,v.CmdLine)\n\t\t\t\treturn true,v.CmdLine\n\t\t\t}\n\t\t}\n\t}\n\t\/\/fprintf(stderr,\"\\n--De-- not-found(%v)\\n\",pat)\n\treturn false,\"(Not Found in History)\"\n}\n\/\/ 0.2.8 2020-0902 created\nfunc (iin*IInput)GotoFORWSTR(pat string,gsh*GshContext){\n\tfound := false\n\tif 0 < len(iin.right) {\n\t\tfound = iin.SearchForward(pat)\n\t}\n\tif !found {\n\t\tfound,line := gsh.SearchHistory(pat,true)\n\t\tif found {\n\t\t\tiin.line = line\n\t\t\tiin.right = \"\"\n\t\t}\n\t}\n}\nfunc (iin*IInput)GotoBACKSTR(pat string, gsh*GshContext){\n\tfound := false\n\tif 0 < len(iin.line) {\n\t\tfound = iin.SearchBackward(pat)\n\t}\n\tif !found {\n\t\tfound,line := gsh.SearchHistory(pat,false)\n\t\tif found {\n\t\t\tiin.line = line\n\t\t\tiin.right = \"\"\n\t\t}\n\t}\n}\nfunc (iin*IInput)getstring1(prompt string)(string){ \/\/ should be editable\n\tiin.clearline();\n\tfprintf(stderr,\"\\r%v\",prompt)\n\tstr := \"\"\n\tfor {\n\t\tch := iin.Getc(10*1000*1000)\n\t\tif ch == '\\n' || ch == '\\r' {\n\t\t\tbreak\n\t\t}\n\t\tsch := string(ch)\n\t\tstr += sch\n\t\tfprintf(stderr,\"%s\",sch)\n\t}\n\treturn str\n}\n\n\/\/ search pattern must be an array and selectable with ^N\/^P\nvar SearchPat = \"\"\nvar SearchForw = true\n\nfunc (iin*IInput)xgetline1(prevline string, gsh*GshContext)(string){\n\tvar ch int;\n\n\tMODE_ShowMode = false\n\tMODE_VicMode = false\n\tiin.Redraw();\n\tfirst := true\n\n\tfor cix := 0; ; cix++ {\n\t\tiin.pinJmode = iin.inJmode\n\t\tiin.inJmode = false\n\n\t\tch = iin.Getc(1000*1000)\n\n\t\tif ch != EV_TIMEOUT && first {\n\t\t\tfirst = false\n\t\t\tmode := 0\n\t\t\tif romkanmode {\n\t\t\t\tmode = 1\n\t\t\t}\n\t\t\tnow := time.Now()\n\t\t\tEvents = append(Events,Event{now,EV_MODE,int64(mode),CmdIndex})\n\t\t}\n\t\tif ch == 033 {\n\t\t\tMODE_ShowMode = true\n\t\t\tMODE_VicMode = !MODE_VicMode\n\t\t\tiin.Redraw();\n\t\t\tcontinue\n\t\t}\n\t\tif MODE_VicMode {\n\t\t\tswitch ch {\n\t\t\t\tcase '0': ch = GO_TOPL\n\t\t\t\tcase '$': ch = GO_ENDL\n\t\t\t\tcase 'b': ch = GO_TOPW\n\t\t\t\tcase 'e': ch = GO_ENDW\n\t\t\t\tcase 'w': ch = GO_NEXTW\n\t\t\t\tcase '%': ch = GO_PAIRCH\n\n\t\t\t\tcase 'j': ch = GO_DOWN\n\t\t\t\tcase 'k': ch = GO_UP\n\t\t\t\tcase 'h': ch = GO_LEFT\n\t\t\t\tcase 'l': ch = GO_RIGHT\n\t\t\t\tcase 'x': ch = DEL_RIGHT\n\t\t\t\tcase 'a': MODE_VicMode = !MODE_VicMode\n\t\t\t\t\tch = GO_RIGHT\n\t\t\t\tcase 'i': MODE_VicMode = !MODE_VicMode\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase '~':\n\t\t\t\t\tright,head := delHeadChar(iin.right)\n\t\t\t\t\tif len([]byte(head)) == 1 {\n\t\t\t\t\t\tch = int(head[0])\n\t\t\t\t\t\tif( 'a' <= ch && ch <= 'z' ){\n\t\t\t\t\t\t\tch = ch + 'A'-'a'\n\t\t\t\t\t\t}else\n\t\t\t\t\t\tif( 'A' <= ch && ch <= 'Z' ){\n\t\t\t\t\t\t\tch = ch + 'a'-'A'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiin.right = string(ch) + right\n\t\t\t\t\t}\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase 'f': \/\/ GO_FORWCH\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tch = iin.Getc(3*1000*1000)\n\t\t\t\t\tif ch == EV_TIMEOUT {\n\t\t\t\t\t\tiin.Redraw();\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tSearchPat = string(ch)\n\t\t\t\t\tSearchForw = true\n\t\t\t\t\tiin.GotoFORWSTR(SearchPat,gsh)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase '\/':\n\t\t\t\t\tSearchPat = iin.getstring1(\"\/\") \/\/ should be editable\n\t\t\t\t\tSearchForw = true\n\t\t\t\t\tiin.GotoFORWSTR(SearchPat,gsh)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase '?':\n\t\t\t\t\tSearchPat = iin.getstring1(\"?\") \/\/ should be editable\n\t\t\t\t\tSearchForw = false\n\t\t\t\t\tiin.GotoBACKSTR(SearchPat,gsh)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase 'n': \n\t\t\t\t\tif SearchForw {\n\t\t\t\t\t\tiin.GotoFORWSTR(SearchPat,gsh)\n\t\t\t\t\t}else{\n\t\t\t\t\t\tiin.GotoBACKSTR(SearchPat,gsh)\n\t\t\t\t\t}\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t\tcase 'N': \n\t\t\t\t\tif !SearchForw {\n\t\t\t\t\t\tiin.GotoFORWSTR(SearchPat,gsh)\n\t\t\t\t\t}else{\n\t\t\t\t\t\tiin.GotoBACKSTR(SearchPat,gsh)\n\t\t\t\t\t}\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tswitch ch {\n\t\t\tcase GO_TOPW:\n\t\t\t\tiin.GotoTOPW()\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase GO_ENDW:\n\t\t\t\tiin.GotoENDW()\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase GO_NEXTW:\n\t\t\t\t\/\/ to next space then\n\t\t\t\tiin.GotoNEXTW()\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase GO_PAIRCH:\n\t\t\t\tiin.GotoPAIRCH()\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t}\n\n\t\t\/\/fprintf(stderr,\"A[%02X]\\n\",ch);\n\t\tif( ch == '\\\\' || ch == 033 ){\n\t\t\tMODE_ShowMode = true\n\t\t\tmetach := ch\n\t\t\tiin.waitingMeta = string(ch)\n\t\t\tiin.Redraw();\n\t\t\t\t\/\/ set cursor \/\/fprintf(stderr,\"???\\b\\b\\b\")\n\t\t\tch = fgetcTimeout(stdin,2000*1000)\n\t\t\t\t\/\/ reset cursor\n\t\t\tiin.waitingMeta = \"\"\n\n\t\t\tcmdch := ch\n\t\t\tif( ch == EV_TIMEOUT ){\n\t\t\t\tif metach == 033 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tch = metach\n\t\t\t}else\n\t\t\t\/*\n\t\t\tif( ch == 'm' || ch == 'M' ){\n\t\t\t\tmch := fgetcTimeout(stdin,1000*1000)\n\t\t\t\tif mch == 'r' {\n\t\t\t\t\tromkanmode = true\n\t\t\t\t}else{\n\t\t\t\t\tromkanmode = false\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\t*\/\n\t\t\tif( ch == 'k' || ch == 'K' ){\n\t\t\t\tMODE_Recursive = !MODE_Recursive\n\t\t\t\tiin.Translate(cmdch);\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'j' || ch == 'J' ){\n\t\t\t\tiin.Translate(cmdch);\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'i' || ch == 'I' ){\n\t\t\t\tiin.Replace(cmdch);\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'l' || ch == 'L' ){\n\t\t\t\tMODE_LowerLock = !MODE_LowerLock\n\t\t\t\tMODE_CapsLock = false\n\t\t\t\tif MODE_ViTrace {\n\t\t\t\t\tfprintf(stderr,\"%v\\r\\n\",string(cmdch));\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'u' || ch == 'U' ){\n\t\t\t\tMODE_CapsLock = !MODE_CapsLock\n\t\t\t\tMODE_LowerLock = false\n\t\t\t\tif MODE_ViTrace {\n\t\t\t\t\tfprintf(stderr,\"%v\\r\\n\",string(cmdch));\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'v' || ch == 'V' ){\n\t\t\t\tMODE_ViTrace = !MODE_ViTrace\n\t\t\t\tif MODE_ViTrace {\n\t\t\t\t\tfprintf(stderr,\"%v\\r\\n\",string(cmdch));\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\t}else\n\t\t\tif( ch == 'c' || ch == 'C' ){\n\t\t\t\tif 0 < len(iin.line) {\n\t\t\t\t\txline,tail := delTailChar(iin.line)\n\t\t\t\t\tif len([]byte(tail)) == 1 {\n\t\t\t\t\t\tch = int(tail[0])\n\t\t\t\t\t\tif( 'a' <= ch && ch <= 'z' ){\n\t\t\t\t\t\t\tch = ch + 'A'-'a'\n\t\t\t\t\t\t}else\n\t\t\t\t\t\tif( 'A' <= ch && ch <= 'Z' ){\n\t\t\t\t\t\t\tch = ch + 'a'-'A'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiin.line = xline + string(ch)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif MODE_ViTrace {\n\t\t\t\t\tfprintf(stderr,\"%v\\r\\n\",string(cmdch));\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\t}else{\n\t\t\t\tiin.pch = append(iin.pch,ch) \/\/ push\n\t\t\t\tch = '\\\\'\n\t\t\t}\n\t\t} \n\t\tswitch( ch ){\n\t\t\tcase 'P'-0x40: ch = GO_UP\n\t\t\tcase 'N'-0x40: ch = GO_DOWN\n\t\t\tcase 'B'-0x40: ch = GO_LEFT\n\t\t\tcase 'F'-0x40: ch = GO_RIGHT\n\t\t}\n\t\t\/\/fprintf(stderr,\"B[%02X]\\n\",ch);\n\t\tswitch( ch ){\n\t\t\tcase 0:\n\t\t\t\tcontinue;\n\n\t\t\tcase '\\t':\n\t\t\t\tiin.Replace('j');\n\t\t\t\tcontinue\n\t\t\tcase 'X'-0x40:\n\t\t\t\tiin.Replace('j');\n\t\t\t\tcontinue\n\n\t\t\tcase EV_TIMEOUT:\n\t\t\t\tiin.Redraw();\n\t\t\t\tif iin.pinJmode {\n\t\t\t\t\tfprintf(stderr,\"\\\\J\\r\\n\")\n\t\t\t\t\tiin.inJmode = true\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\tcase GO_UP:\n\t\t\t\tif iin.lno == 1 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcmd,ok := gsh.cmdStringInHistory(iin.lno-1)\n\t\t\t\tif ok {\n\t\t\t\t\tiin.line = cmd\n\t\t\t\t\tiin.right = \"\"\n\t\t\t\t\tiin.lno = iin.lno - 1\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase GO_DOWN:\n\t\t\t\tcmd,ok := gsh.cmdStringInHistory(iin.lno+1)\n\t\t\t\tif ok {\n\t\t\t\t\tiin.line = cmd\n\t\t\t\t\tiin.right = \"\"\n\t\t\t\t\tiin.lno = iin.lno + 1\n\t\t\t\t}else{\n\t\t\t\t\tiin.line = \"\"\n\t\t\t\t\tiin.right = \"\"\n\t\t\t\t\tif iin.lno == iin.lastlno-1 {\n\t\t\t\t\t\tiin.lno = iin.lno + 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase GO_LEFT:\n\t\t\t\tif 0 < len(iin.line) {\n\t\t\t\t\txline,tail := delTailChar(iin.line)\n\t\t\t\t\tiin.line = xline\n\t\t\t\t\tiin.right = tail + iin.right\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue;\n\t\t\tcase GO_RIGHT:\n\t\t\t\tif( 0 < len(iin.right) && iin.right[0] != 0 ){\n\t\t\t\t\txright,head := delHeadChar(iin.right)\n\t\t\t\t\tiin.right = xright\n\t\t\t\t\tiin.line += head\n\t\t\t\t}\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue;\n\t\t\tcase EOF:\n\t\t\t\tgoto EXIT;\n\t\t\tcase 'R'-0x40: \/\/ replace\n\t\t\t\tdst := convs(iin.line+iin.right);\n\t\t\t\tiin.line = dst\n\t\t\t\tiin.right = \"\"\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue;\n\t\t\tcase 'T'-0x40: \/\/ just show the result\n\t\t\t\treadDic();\n\t\t\t\tromkanmode = !romkanmode;\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue;\n\t\t\tcase 'L'-0x40:\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase 'K'-0x40:\n\t\t\t\tiin.right = \"\"\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase 'E'-0x40:\n\t\t\t\tiin.line += iin.right\n\t\t\t\tiin.right = \"\"\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase 'A'-0x40:\n\t\t\t\tiin.right = iin.line + iin.right\n\t\t\t\tiin.line = \"\"\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue\n\t\t\tcase 'U'-0x40:\n\t\t\t\tiin.line = \"\"\n\t\t\t\tiin.right = \"\"\n\t\t\t\tiin.clearline();\n\t\t\t\tiin.Redraw();\n\t\t\t\tcontinue;\n\t\t\tcase DEL_RIGHT:\n\t\t\t\tif( 0 < len(iin.right) ){\n\t\t\t\t\tiin.right,_ = delHeadChar(iin.right)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\tcase 0x7F: \/\/ BS? not DEL\n\t\t\t\tif( 0 < len(iin.line) ){\n\t\t\t\t\tiin.line,_ = delTailChar(iin.line)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t}\n\t\t\t\t\/*\n\t\t\t\telse\n\t\t\t\tif( 0 < len(iin.right) ){\n\t\t\t\t\tiin.right,_ = delHeadChar(iin.right)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t}\n\t\t\t\t*\/\n\t\t\t\tcontinue;\n\t\t\tcase 'H'-0x40:\n\t\t\t\tif( 0 < len(iin.line) ){\n\t\t\t\t\tiin.line,_ = delTailChar(iin.line)\n\t\t\t\t\tiin.Redraw();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t}\n\t\tif( ch == '\\n' || ch == '\\r' ){\n\t\t\tiin.line += iin.right;\n\t\t\tiin.right = \"\"\n\t\t\tiin.Redraw();\n\t\t\tfputc(ch,stderr);\n\t\t\tbreak;\n\t\t}\n\t\tif MODE_CapsLock {\n\t\t\tif 'a' <= ch && ch <= 'z' {\n\t\t\t\tch = ch+'A'-'a'\n\t\t\t}\n\t\t}\n\t\tif MODE_LowerLock {\n\t\t\tif 'A' <= ch && ch <= 'Z' {\n\t\t\t\tch = ch+'a'-'A'\n\t\t\t}\n\t\t}\n\t\tiin.line += string(ch);\n\t\tiin.Redraw();\n\t}\nEXIT:\n\treturn iin.line + iin.right;\n}\n\nfunc getline_main(){\n\tline := xgetline(0,\"\",nil)\n\tfprintf(stderr,\"%s\\n\",line);\n\/*\n\tdp = strpbrk(line,\"\\r\\n\");\n\tif( dp != NULL ){\n\t\t*dp = 0;\n\t}\n\n\tif( 0 ){\n\t\tfprintf(stderr,\"\\n(%d)\\n\",int(strlen(line)));\n\t}\n\tif( lseek(3,0,0) == 0 ){\n\t\tif( romkanmode ){\n\t\t\tvar buf [8*1024]byte;\n\t\t\tconvs(line,buff);\n\t\t\tstrcpy(line,buff);\n\t\t}\n\t\twrite(3,line,strlen(line));\n\t\tftruncate(3,lseek(3,0,SEEK_CUR));\n\t\t\/\/fprintf(stderr,\"outsize=%d\\n\",(int)lseek(3,0,SEEK_END));\n\t\tlseek(3,0,SEEK_SET);\n\t\tclose(3);\n\t}else{\n\t\tfprintf(stderr,\"\\r\\ngotline: \");\n\t\ttrans(line);\n\t\t\/\/printf(\"%s\\n\",line);\n\t\tprintf(\"\\n\");\n\t}\n*\/\n}\n\/\/== end ========================================================= getline\n\n\/\/\n\/\/ $USERHOME\/.gsh\/\n\/\/\t\tgsh-rc.txt, or gsh-configure.txt\n\/\/              gsh-history.txt\n\/\/              gsh-aliases.txt \/\/ should be conditional?\n\/\/\nfunc (gshCtx *GshContext)gshSetupHomedir()(bool) {\n\thomedir,found := userHomeDir()\n\tif !found {\n\t\tfmt.Printf(\"--E-- You have no UserHomeDir\\n\")\n\t\treturn true\n\t}\n\tgshhome := homedir + \"\/\" + GSH_HOME\n\t_, err2 := os.Stat(gshhome)\n\tif err2 != nil {\n\t\terr3 := os.Mkdir(gshhome,0700)\n\t\tif err3 != nil {\n\t\t\tfmt.Printf(\"--E-- Could not Create %s (%s)\\n\",\n\t\t\t\tgshhome,err3)\n\t\t\treturn true\n\t\t}\n\t\tfmt.Printf(\"--I-- Created %s\\n\",gshhome)\n\t}\n\tgshCtx.GshHomeDir = gshhome\n\treturn false\n}\nfunc setupGshContext()(GshContext,bool){\n\tgshPA := syscall.ProcAttr {\n\t\t\"\", \/\/ the staring directory\n\t\tos.Environ(), \/\/ environ[]\n\t\t[]uintptr{os.Stdin.Fd(),os.Stdout.Fd(),os.Stderr.Fd()},\n\t\tnil, \/\/ OS specific\n\t}\n\tcwd, _ := os.Getwd()\n\tgshCtx := GshContext {\n\t\tcwd, \/\/ StartDir\n\t\t\"\", \/\/ GetLine\n\t\t[]GChdirHistory { {cwd,time.Now(),0} }, \/\/ ChdirHistory\n\t\tgshPA,\n\t\t[]GCommandHistory{}, \/\/something for invokation?\n\t\tGCommandHistory{}, \/\/ CmdCurrent\n\t\tfalse,\n\t\t[]int{},\n\t\tsyscall.Rusage{},\n\t\t\"\", \/\/ GshHomeDir\n\t\tTtyid(),\n\t\tfalse,\n\t\tfalse,\n\t\t[]PluginInfo{},\n\t\t[]string{},\n\t\t\" \",\n\t\t\"v\",\n\t\tValueStack{},\n\t\tGServer{\"\",\"\"}, \/\/ LastServer\n\t\t\"\", \/\/ RSERV\n\t\tcwd, \/\/ RWD\n\t\tCheckSum{},\n\t}\n\terr := gshCtx.gshSetupHomedir()\n\treturn gshCtx, err\n}\nfunc (gsh*GshContext)gshelllh(gline string)(bool){\n\tghist := gsh.CmdCurrent\n\tghist.WorkDir,_ = os.Getwd()\n\tghist.WorkDirX = len(gsh.ChdirHistory)-1\n\t\/\/fmt.Printf(\"--D--ChdirHistory(@%d)\\n\",len(gsh.ChdirHistory))\n\tghist.StartAt = time.Now()\n\trusagev1 := Getrusagev()\n\tgsh.CmdCurrent.FoundFile = []string{}\n\tfin := gsh.tgshelll(gline)\n\trusagev2 := Getrusagev()\n\tghist.Rusagev = RusageSubv(rusagev2,rusagev1)\n\tghist.EndAt = time.Now()\n\tghist.CmdLine = gline\n\tghist.FoundFile = gsh.CmdCurrent.FoundFile\n\n\t\/* record it but not show in list by default\n\tif len(gline) == 0 {\n\t\tcontinue\n\t}\n\tif gline == \"hi\" || gline == \"history\" { \/\/ don't record it\n\t\tcontinue\n\t}\n\t*\/\n\tgsh.CommandHistory = append(gsh.CommandHistory, ghist)\n\treturn fin\n}\n\/\/ <a name=\"main\">Main loop<\/a>\nfunc script(gshCtxGiven *GshContext) (_ GshContext) {\n\tgshCtxBuf,err0 := setupGshContext()\n\tif err0 {\n\t\treturn gshCtxBuf;\n\t}\n\tgshCtx := &gshCtxBuf\n\n\t\/\/fmt.Printf(\"--I-- GSH_HOME=%s\\n\",gshCtx.GshHomeDir)\n\t\/\/resmap()\n\n\t\/*\n\tif false {\n\t\tgsh_getlinev, with_exgetline :=\n\t\t\t which(\"PATH\",[]string{\"which\",\"gsh-getline\",\"-s\"})\n\t\tif with_exgetline {\n\t\t\tgsh_getlinev[0] = toFullpath(gsh_getlinev[0])\n\t\t\tgshCtx.GetLine = toFullpath(gsh_getlinev[0])\n\t\t}else{\n\t\tfmt.Printf(\"--W-- No gsh-getline found. Using internal getline.\\n\");\n\t\t}\n\t}\n\t*\/\n\n\tghist0 := gshCtx.CmdCurrent \/\/ something special, or gshrc script, or permanent history\n\tgshCtx.CommandHistory = append(gshCtx.CommandHistory,ghist0)\n\n\tprevline := \"\"\n\tskipping := false\n\tfor hix := len(gshCtx.CommandHistory); ; {\n\t\tgline := gshCtx.getline(hix,skipping,prevline)\n\t\tif skipping {\n\t\t\tif strings.Index(gline,\"fi\") == 0 {\n\t\t\t\tfmt.Printf(\"fi\\n\");\n\t\t\t\tskipping = false;\n\t\t\t}else{\n\t\t\t\t\/\/fmt.Printf(\"%s\\n\",gline);\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif strings.Index(gline,\"if\") == 0 {\n\t\t\t\/\/fmt.Printf(\"--D-- if start: %s\\n\",gline);\n\t\t\tskipping = true;\n\t\t\tcontinue\n\t\t}\n\t\tif false {\n\t\t\tos.Stdout.Write([]byte(\"gotline:\"))\n\t\t\tos.Stdout.Write([]byte(gline))\n\t\t\tos.Stdout.Write([]byte(\"\\n\"))\n\t\t}\n\t\tgline = strsubst(gshCtx,gline,true)\n\t\tif false {\n\t\t\tfmt.Printf(\"fmt.Printf %%v - %v\\n\",gline)\n\t\t\tfmt.Printf(\"fmt.Printf %%s - %s\\n\",gline)\n\t\t\tfmt.Printf(\"fmt.Printf %%x - %s\\n\",gline)\n\t\t\tfmt.Printf(\"fmt.Printf %%U - %s\\n\",gline)\n\t\t\tfmt.Printf(\"Stouut.Write -\")\n\t\t\tos.Stdout.Write([]byte(gline))\n\t\t\tfmt.Printf(\"\\n\")\n\t\t}\n\t\t\/*\n\t\t\/\/ should be cared in substitution ?\n\t\tif 0 < len(gline) && gline[0] == '!' {\n\t\t\txgline, set, err := searchHistory(gshCtx,gline)\n\t\t\tif err {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif set {\n\t\t\t\t\/\/ set the line in command line editor\n\t\t\t}\n\t\t\tgline = xgline\n\t\t}\n\t\t*\/\n\t\tfin := gshCtx.gshelllh(gline)\n\t\tif fin {\n\t\t\tbreak;\n\t\t}\n\t\tprevline = gline;\n\t\thix++;\n\t}\n\treturn *gshCtx\n}\nfunc main() {\n\tgshCtxBuf := GshContext{}\n\tgsh := &gshCtxBuf\n\targv := os.Args\n\n\tif( isin(\"wss\",argv) ){\n\t\tgj_server(argv[1:]);\n\t\treturn;\n\t}\n\tif( isin(\"wsc\",argv) ){\n\t\tgj_client(argv[1:]);\n\t\treturn;\n\t}\n\tif 1 < len(argv) {\n\t\tif isin(\"version\",argv){\n\t\t\tgsh.showVersion(argv)\n\t\t\treturn\n\t\t}\n\t\tif argv[1] == \"gj\" {\n\t\t\tif argv[2] == \"listen\" {\n\t\t\t\tgo gj_server(argv[2:]);\n\t\t\t}\n\t\t\tif argv[2] == \"join\" {\n\t\t\t\tgo gj_client(argv[2:]);\n\t\t\t}\n\t\t}\n\t\tcomx := isinX(\"-c\",argv)\n\t\tif 0 < comx {\n\t\t\tgshCtxBuf,err := setupGshContext()\n\t\t\tgsh := &gshCtxBuf\n\t\t\tif !err {\n\t\t\t\tgsh.gshellv(argv[comx+1:])\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\tif 1 < len(argv) && isin(\"-s\",argv) {\n\t}else{\n\t\tgsh.showVersion(append(argv,[]string{\"-l\",\"-a\"}...))\n\t} \n\tscript(nil)\n\t\/\/gshCtx := script(nil)\n\t\/\/gshelll(gshCtx,\"time\")\n}\n\n\/\/<\/div><\/details>\n\/\/<details id=\"gsh-todo\"><summary>Considerations<\/summary><div class=\"gsh-src\">\n\/\/ - inter gsh communication, possibly running in remote hosts -- to be remote shell\n\/\/ - merged histories of multiple parallel gsh sessions\n\/\/ - alias as a function or macro\n\/\/ - instant alias end environ export to the permanent > ~\/.gsh\/gsh-alias and gsh-environ\n\/\/ - retrieval PATH of files by its type\n\/\/ - gsh as an IME with completion using history and file names as dictionaies\n\/\/ - gsh a scheduler in precise time of within a millisecond\n\/\/ - all commands have its subucomand after \"---\" symbol\n\/\/ - filename expansion by \"-find\" command\n\/\/ - history of ext code and output of each commoand\n\/\/ - \"script\" output for each command by pty-tee or telnet-tee\n\/\/ - $BUILTIN command in PATH to show the priority\n\/\/ - \"?\" symbol in the command (not as in arguments) shows help request \n\/\/ - searching command with wild card like: which ssh-*\n\/\/ - longformat prompt after long idle time (should dismiss by BS)\n\/\/ - customizing by building plugin and dynamically linking it\n\/\/ - generating syntactic element like \"if\" by macro expansion (like CPP) >> alias\n\/\/ - \"!\" symbol should be used for negation, don't wast it just for job control\n\/\/ - don't put too long output to tty, record it into GSH_HOME\/session-id\/comand-id.log\n\/\/ - making canonical form of command at the start adding quatation or white spaces\n\/\/ - name(a,b,c) ... use \"(\" and \")\" to show both delimiter and realm\n\/\/ - name? or name! might be useful\n\/\/ - htar format - packing directory contents into a single html file using data scheme\n\/\/ - filepath substitution shold be done by each command, expecially in case of builtins\n\/\/ - @N substition for the history of working directory, and @spec for more generic ones\n\/\/ - @dir prefix to do the command at there, that means like (chdir @dir; command)\n\/\/ - GSH_PATH for plugins\n\/\/ - standard command output: list of data with name, size, resouce usage, modified time\n\/\/ - generic sort key option -nm name, -sz size, -ru rusage, -ts start-time, -tm mod-time\n\/\/   -wc word-count, grep match line count, ...\n\/\/ - standard command execution result: a list of string, -tm, -ts, -ru, -sz, ...\n\/\/ - -tailf-filename like tail -f filename, repeat close and open before read\n\/\/ - max. size and max. duration and timeout of (generated) data transfer\n\/\/ - auto. numbering, aliasing, IME completion of file name (especially rm of quieer name)\n\/\/ - IME \"?\" at the top of the command line means searching history\n\/\/ - IME %d\/0x10000\/ %x\/ffff\/\n\/\/ - IME ESC to go the edit mode like in vi, and use :command as :s\/x\/y\/g to edit history\n\/\/ - gsh in WebAssembly\n\/\/ - gsh as a HTTP server of online-manual\n\/\/---END--- (^-^)\/\/ITS more<\/div><\/details>\n\n\/\/<span class=\"gsh-golang-data\">\n\nvar WorldDic = \/\/<span id=\"gsh-world-dic\">\n\"data:text\/dic;base64,\"+\n\"Ly8gTXlJTUUvMC4wLjEg6L6e5pu4ICgyMDIwLTA4MTlhKQpzZWthaSDkuJbnlYwKa28g44GT\"+\n\"Cm5uIOOCkwpuaSDjgasKY2hpIOOBoQp0aSDjgaEKaGEg44GvCnNlIOOBmwprYSDjgYsKaSDj\"+\n\"gYQK\";\n\/\/<\/span>\n\nvar WnnDic = \/\/<span id=\"gsh-wnn-dic\">\n\"data:text\/dic;base64,\"+\n\"PG1ldGEgY2hhcnNldD0iVVRGLTgiPgo8dGV4dGFyZWEgY29scz04MCByb3dzPTQwPgovL2Rp\"+\n\"Y3ZlcglHU2hlbGxcc0lNRVxzZGljdGlvbmFyeVxzZm9yXHNXbm5ccy8vXHMyMDIwLTA4MzAK\"+\n\"R1NoZWxsCUdTaGVsbArjgo\/jgZ\/jgZcJ56eBCndhdGFzaGkJ56eBCndhdGFzaQnnp4EK44Gq\"+\n\"44G+44GICeWQjeWJjQpuYW1hZQnlkI3liY0K44Gq44GL44GuCeS4remHjgpuYWthbm8J5Lit\"+\n\"6YeOCndhCeOCjwp0YQnjgZ8Kc2kJ44GXCnNoaQnjgZcKbm8J44GuCm5hCeOBqgptYQnjgb4K\"+\n\"ZQnjgYgKaGEJ44GvCm5hCeOBqgprYQnjgYsKbm8J44GuCmRlCeOBpwpzdQnjgZkKZVxzCWVj\"+\n\"aG8KZGljCWRpYwplY2hvCWVjaG8KcmVwbGF5CXJlcGxheQpyZXBlYXQJcmVwZWF0CmR0CWRh\"+\n\"dGVccysnJVklbSVkLSVIOiVNOiVTJwp0aW9uCXRpb24KJXQJJXQJLy8gdG8gYmUgYW4gYWN0\"+\n\"aW9uCjwvdGV4dGFyZWE+Cg==\"\n\/\/<\/span>\n\nvar SumomoDic = \/\/<span id=\"gsh-sumomo-dic\">\n\"data:text\/dic;base64,\"+\n\"PG1ldGEgY2hhcnNldD0iVVRGLTgiPgo8dGV4dGFyZWEgY29scz04MCByb3dzPTQwPgovL3Zl\"+\n\"cglHU2hlbGxcc0lNRVxzZGljdGlvbmFyeVxzZm9yXHNTdW1vbW9ccy8vXHMyMDIwLTA4MzAK\"+\n\"c3UJ44GZCm1vCeOCggpubwnjga4KdQnjgYYKY2hpCeOBoQp0aQnjgaEKdWNoaQnlhoUKdXRp\"+\n\"CeWGhQpzdW1vbW8J44GZ44KC44KCCnN1bW9tb21vCeOBmeOCguOCguOCggptb21vCeahgwpt\"+\n\"b21vbW8J5qGD44KCCiwsCeOAgQouLgnjgIIKPC90ZXh0YXJlYT4K\"\n\/\/<\/span>\n\nvar SijimiDic = \/\/<span id=\"gsh-sijimi-dic\">\n\"data:text\/dic;base64,\"+\n\"PG1ldGEgY2hhcnNldD0iVVRGLTgiPgo8dGV4dGFyZWEgY29scz04MCByb3dzPTQwPgovL3Zl\"+\n\"cglHU2hlbGxcc0lNRVxzZGljdGlvbmFyeVxzZm9yXHNTaGlqaW1pXHMvL1xzMjAyMC0wODMw\"+\n\"CnNpCeOBlwpzaGkJ44GXCmppCeOBmAptaQnjgb8KbmEJ44GqCmp1CeOBmOOChQp4eXUJ44KF\"+\n\"CnUJ44GGCm5pCeOBqwprbwnjgZMKYnUJ44G2Cm5uCeOCkwpubwnjga4KY2hpCeOBoQp0aQnj\"+\n\"gaEKa2EJ44GLCnJhCeOCiQosLAnjgIEKLi4J44CCCnhuYW5hCeS4gwp4anV1CeWNgQp4bmkJ\"+\n\"5LqMCmtveAnlgIsKa29xCeWAiwprb3gJ5YCLCm5hbmFqdXVuaXgJNzIKbmFuYWp1dW5peHgJ\"+\n\"77yX77ySCm5hbmFqdXVuaVgJ77yX77ySCuS4g+WNgeS6jHgJNzIKa29idW5uCeWAi+WIhgp0\"+\n\"aWthcmFxCeOBoeOBi+OCiQp0aWthcmEJ5YqbCmNoaWthcmEJ5YqbCjwvdGV4dGFyZWE+Cg=\"\n\/\/<\/span>\n\nvar JA_JKLDic = \/\/<span id=\"gsh-ja-jkl-dic\">\n\"data:text\/dic;base64,\"+\n\"Ly92ZXJsCU15SU1FamRpY2ptb3JzZWpKQWpKS0woMjAyMGowODE5KSheLV4pL1NhdG94SVRT\"+\n\"CmtqamprbGtqa2tsa2psIOS4lueVjApqamtqamwJ44GCCmtqbAnjgYQKa2tqbAnjgYYKamtq\"+\n\"amwJ44GICmtqa2trbAnjgYoKa2pra2wJ44GLCmpramtrbAnjgY0Ka2tramwJ44GPCmpramps\"+\n\"CeOBkQpqampqbAnjgZMKamtqa2psCeOBlQpqamtqa2wJ44GXCmpqamtqbAnjgZkKa2pqamts\"+\n\"CeOBmwpqamprbAnjgZ0KamtsCeOBnwpra2prbAnjgaEKa2pqa2wJ44GkCmtqa2pqbAnjgaYK\"+\n\"a2tqa2tsCeOBqApramtsCeOBqgpqa2prbAnjgasKa2tra2wJ44GsCmpqa2psCeOBrQpra2pq\"+\n\"bAnjga4Kamtra2wJ44GvCmpqa2tqbAnjgbIKampra2wJ44G1CmtsCeOBuApqa2tsCeOBuwpq\"+\n\"a2tqbAnjgb4Ka2tqa2psCeOBvwpqbAnjgoAKamtra2psCeOCgQpqa2tqa2wJ44KCCmtqamwJ\"+\n\"44KECmpra2pqbAnjgoYKampsCeOCiApra2tsCeOCiQpqamtsCeOCigpqa2pqa2wJ44KLCmpq\"+\n\"amwJ44KMCmtqa2psCeOCjQpqa2psCeOCjwpramtramwJ44KQCmtqamtrbAnjgpEKa2pqamwJ\"+\n\"44KSCmtqa2prbAnjgpMKa2pqa2psCeODvApra2wJ44KbCmtramprbAnjgpwKa2pramtqbAnj\"+\n\"gIEK\";\n\/\/<\/span>\n\n\/\/<\/span>\n\/*\n<details id=\"references\"><summary>References<\/summary><div class=\"gsh-src\">\n<p>\n<a href=\"https:\/\/golang.org\">The Go Programming Language<\/a>\n<!--\n<iframe loading=\"lazy\" src=\"https:\/\/golang.org\" width=\"100%\" height=\"300\"><\/iframe>\n-->\n\n<a href=\"https:\/\/developer.mozilla.org\/ja\/docs\/Web\">MDN web docs<\/a>\n <a href=\"https:\/\/developer.mozilla.org\/ja\/docs\/Web\/HTML\/Element\">HTML<\/a>\n CSS:\n   <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_Selectors\">Selectors<\/a>\n   <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/background-repeat\">repeat<\/a>\n HTTP\n JavaScript:\n ...\n<\/p>\n<\/div><\/details>\n*\/\n\/*\n<details id=\"html-src\" onclick=\"frame_open();\"><summary>Raw Source<\/summary><div>\n\n<!-- h2>The full of this HTML including the Go code is here.<\/h2 -->\n<details id=\"gsh-whole-view\"><summary>Whole file<\/summary>\n <a name=\"whole-src-view\"><\/a>\n <span id=\"src-frame\"><\/span><!-- a window to show source code -->\n<\/details>\n\n<details id=\"gsh-style-frame\" onclick=\"fill_CSSView()\"><summary>CSS part<\/summary>\n <a name=\"style-src-view\"><\/a>\n <span id=\"gsh-style-view\"><\/span>\n<\/details>\n\n<details id=\"gsh-script-frame\" onclick=\"fill_JavaScriptView()\"><summary>JavaScript part<\/summary>\n <a name=\"script-src-view\"><\/a>\n <span id=\"gsh-script-view\"><\/span>\n<\/details>\n\n<details id=\"gsh-data-frame\" onclick=\"fill_DataView()\"><summary>Builtin data part<\/summary>\n <a name=\"gsh-data-frame\"><\/a>\n <span id=\"gsh-data-view\"><\/span>\n<\/details>\n\n<div id=\"GshFooter\" style=\"\"><\/div>\n<\/div><\/details>\n*\/\n\n\/*\n<!-- 2020-09-17 SatoxITS, visible script -->\n<details><summary>GJScript<\/summary>\n<style>.gjscript { font-family:Georgia; }<\/style>\n<pre id=\"gjscript_1\" class=\"gjscript\"> function gjtest1(){ alert('Hello GJScript!'); }\n  gjtest1()\n<\/pre>\n<script>\n  gjs = document.getElementById('gjscript_1');\n  \/\/eval(gjs.innerHTML);\n  \/\/gjs.outerHTML = \"\"\n<\/script>\n<\/details><!-- ----------- END-OF-VISIBLE-PART ----------- -->\n*\/\n\n\/*\n<!--\n\/\/ 2020-0906 added,\nhttps:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/z-index\nhttps:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/position\n-->\n<span id=\"GshGrid\">(^_^)\/\/<small>{Hit j k l h}<\/small><\/span>\n\n<span id=\"GStat\"><br>\n<\/span>\n<span id=\"GMenu\" onclick=\"GShellMenu(this)\"><\/span>\n<span id=\"GTop\"><\/span>\n<div id=\"GShellPlane\" onclick=\"showGShellPlane();\"><\/div>\n<div id=\"RawTextViewer\"><\/div>\n<div id=\"RawTextViewerClose\" onclick=\"hideRawTextViewer()\"> CLOSE <\/div>\n\n<style id=\"GshStyleDef\">\n #LineNumbered table,tr,td {\n   margin:0;\n   padding:4px;\n   spacing:0;\n   border:12px;\n }\n textarea.LineNumber {\n   font-size:12px;\n   font-family:monospace,Courier New;\n   color:#282;\n   padding:4px;\n   text-align:right;\n }\n textarea.LineNumbered {\n   font-size:12px;\n   font-family:monospace,Courier New;\n   padding:4px;\n   wrap:off;\n }\n #RawTextViewer{\n   z-index:0;\n   position:fixed; top:0px; left:0px;\n   width:100%; height:50px;\n   overflow:auto;\n   color:#fff; background-color:rgba(128,128,256,0.2);\n   font-size:12px;\n   spellcheck:false;\n }\n #RawTextViewerClose{\n   z-index:0;\n   position:fixed; top:-100px; left:-100px;\n   color:#fff; background-color:rgba(128,128,256,0.2);\n   font-size:20px; font-family:Georgia;\n   white-space:pre;\n }\n #GShellPlane{\n   z-index:0;\n   position:fixed; top:0px; left:0px;\n   width:100%; height:50px;\n   overflow:auto;\n   color:#fff; background-color:rgba(128,128,256,0.3);\n   font-size:12px;\n }\n #GTop{\n   z-index:9;\n   opacity:1.0; \n   position:fixed; top:0px; left:0px;\n   width:320px; height:20px;\n   color:#fff; background-color:rgba(32,32,160,0.15);\n   color:#fff; font-size:12px;\n }\n #GPos{\n   z-index:12;\n   position:fixed; top:0px; left:0px;\n   opacity:1.0; \n   width:640px; height:30px;\n   color:#fff; background-color:rgba(0,0,0,0.2);\n   color:#fff; font-size:12px;\n }\n #GMenu{\n   z-index:2000;\n   position:fixed; top:250px; left:0px;\n   opacity:1.0; \n   width:100px; height:100px;\n   color:#fff;\n   color:#fff; background-color:rgba(0,0,0,0.0);\n   color:#fff; font-size:16px; font-family:Georgia;\n   background-repeat:no-repeat;\n }\n #GStat{\n   z-index:8;\n   xopacity:0.0; \n   position:fixed; top:20px; left:0px;\n   xwidth:640px;\n   width:100%; height:90px;\n   color:#fff; background-color:rgba(0,0,128,0.04);\n   font-size:20px; font-family:Georgia;\n }\n #GLog{\n   z-index:10;\n   position:fixed; top:50px; left:0px;\n   opacity:1.0; \n   width:640px; height:60px;\n   color:#fff; background-color:rgba(0,0,128,0.10);\n   font-size:12px;\n }\n #GshGrid {\n   z-index:11;\n   xopacity:0.0;\n   position:fixed; top:0px; left:0px;\n   width:320px; height:30px;\n   color:#9f9; font-size:16px;\n }\n xbody {display:none;}\n .gsh-link{color:green;}\n #gsh {border-width:1;margin:0;padding:0;}\n #gsh {font-family:monospace,Courier New;color:#ddf;font-size:8px;}\n #gsh header{height:100px;}\n #xgsh header{height:100px;background-image:url(GShell-Logo00.png);}\n #GshMenu{font-size:14pt;color:#c44;}\n .GshMenu1{font-size:14pt;color:#2a2;padding:4px;}\n .GshMenu1:hover{font-size:14pt;color:#fff;font-wait:bold;background-color:#2a2;}\n #GshFooter{height:100px;background-size:80px;background-repeat:no-repeat;}\n #gsh note{color:#000;font-size:10pt;}\n #gsh h2{color:#24a;font-family:Georgia;font-size:18pt;}\n #gsh h3{color:#24a;font-family:Georgia;font-size:16pt;}\n #gsh details{color:#888;background-color:#fff;font-family:monospace;}\n #gsh summary{font-size:16pt;color:#fff;background-color:#8af;height:30px;}\n #gsh pre{font-size:11pt;color:#223;background-color:#faffff;}\n #gsh a{color:#24a;}\n #gsh a[name]{color:#24a;font-size:16pt;}\n #gsh .gsh-src{white-space:pre;font-family:monospace,Courier New;font-size:11pt;}\n #gsh .gsh-src{background-color:#faffff;color:#223;}\n #gsh-src-src{spellcheck:false}\n #src-frame-textarea{white-space:pre;font-family:monospace,Courier New;font-size:11pt;}\n #src-frame-textarea{background-color:#faffff;color:#223;}\n .gsh-code {white-space:pre;font-family:monospace !important;}\n .gsh-code {color:#088;font-size:11pt; background-color:#eef;}\n .gsh-golang-data {display:none;}\n #gsh-WinId {color:#000;font-size:14pt;}\n\n .gsh-document {font-size:11pt;background-color:#fff;font-family:Georgia;}\n .gsh-document {color:#000;background-color:#fff !important;}\n .gsh-document > h2{color:#000;background-color:#fff !important;}\n .gsh-document details{color:#000;background-color:#fff;font-family:Georgia;}\n .gsh-document p{max-width:550pt;color:#000;background-color:#fff;font-family:Georgia;}\n .gsh-document address{width:500pt;color:#000;background-color:#fff;font-family:Georgia;}\n\n @media print {\n  #gsh pre{font-size:11pt !important;}\n }\n<\/style>\n\n<!--\n\/\/ Logo image should be drawn by JavaScript from a meta-font.\n\/\/ CSS seems not follow line-splitted URL\n-->\n<script id=\"gsh-data\">\n\/\/GSellLogo=\"QR-ITS-more.jp.png\"\nGSellLogo=\"data:image\/png;base64,\\\niVBORw0KGgoAAAANSUhEUgAAAQEAAAB\/CAYAAADvs3f4AAAAAXNSR0IArs4c6QAAAHhlWElm\\\nTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAAB\\\nAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAQGgAwAE\\\nAAAAAQAAAH8AAAAAYx1BhgAAAAlwSFlzAAALEwAACxMBAJqcGAAAF3RJREFUeAHtnQuUFNWZ\\\nx++t7ukZ3iCggO\/jY6Osb8WgMzAvn7uG4+bISTR7YnQXdQPCkGj2aNwlD2MSlRkeUaPnoCdu\\\n4iuJx7jriYZ50DOGmF2VqIBEiSggCoiMMA+mu+vu\/\/ZMD9U1dau6a2aUbv91GKrq3vvdx6\/q\\\nfnXvdx8tBA8SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAES\\\nIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAES\\\nIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAES\\\nIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIFDl4A8dLP2\\\n2eXs9H9+ftSkSdHxsic2qqdE7YusS+1qaalKfnY5YsokMHwEPtdK4MQFz5UeExlbLYSaYUl5\\\nnpDiLKXEZClFiRM53JSUaq9ScqcU6i+2kK3StuONy5reEGKJ7Qw7mOvKec2ToqOiZwoljhFS\\\njbOVHCstMRb3USXEJ8hFu7DsdmFb2+xU4vWWFVXbBpMeZUlAE\/hcKoGab66eKGOlNykh56PC\\\nHxH2VVBKoRKqh3qUeKi1YdaOfONJ56OkdI6w5BwomnOQlyPzi0N9DLmXpFK\/60p2P\/Piyovf\\\nN8mfM+\/nJWNGnjw9KqOToLVGSFt2p2Ril1gn3ij0Vk7YsoWVMzEuVPfPlRKYdfOak2LRSB0q\\\nzrWocCOG6qEhvgRaCj\/dktj3g7dXXH4gKN6aRS0zpYzerqS6RAoZDQqfk79SKTRXHu\/e+9FN\\\nL66as88pU\/PN1pNlTLQJKSc73dPXSr20ur7iiwPcC8QhbNnCyhUIlryyOTQvYF5JfvqBL7jx\\\n+cNHjBj5gJRyDlJHy39o84D40H2Qtx8THaPeFuIOU+w1C+KnyhK5FGEv0WGgAExB83eXMoLY\\\nrikbd9gHEP52VgQl4h89FUA6kJyYFbbQbnzLJg4zFiesnDHCwvUoeiVQOb\/5C9FY9DlUueOH\\\n+zGhUh9nSqOqrm0uWgurkI9RpjBD4Y6uQcQdD5TUOW63zD3MHesy14V49isbdKyxbGHlCpFR\\\nUJ6toACF7F9VF58NBfDHT0MBaE74Ent+eWrrWr+Lz\/QTw60AdB7QJUjps\/OA7cOoBNBCeMUZ\\\nttCu\/coG28fLpvKElTPFV8juRasEahbHvxaR1guoeBPyfUDo4+OfeBdyb8L4tz9XeSXFAMOc\\\nbgGgov0g1zgGGw4jF392xnHhdc+Mwf3JTjfntZ2yC1YJBJXNUt5KIKyck1sxXRdld6BmcevN\\\naJovy\/VBacMevqEP46\/ZlnJjt9jx17VL53Zl5Mtvap1QGlNHw5pQDqXyNTQlZ2b8nGcMG2ZV\\\nqOoFjSdYvV0AZzDfayidv6FJ35CS4jXZk9hir7e27zm6p3T8hLJpkYicJpV1HtK\/DJFU4Jw1\\\nlImhxM5IR9fzzgRKx4w\/C+HQSPE+krbIyrN3qEPTNahsHaLDs2xh5Q5NCoPPVdEpgcqbm\/8e\\\n7\/zdOaHptag\/mlKJ77U0VG0xybTdX\/Ex\/PTfa\/i7r7Ku+cSoiCxUwrohUxF16wEV9H+ccVgl\\\npd\/CfU42AK2IUPlvTK1L\/sJjyE5PVHqr728NzvfUzvvDODGy9GoopuuhmNLNfcTx48YHL2qH\\\nf\/8hpXVu\/43rQg9xtq6YtcvlXDC3fmWDQn9nbf2le7wKE1bOK65icBu0Eqhd3IaW82dwKPUw\\\nhrauc6ZcWdkcjUZK8EUXMae71zUqwCu2nbi6eVn1Ji9\/P7eW+ioMAogF+NI3iJLSf8dn9ipA\\\nWNW4rPy9jJxuPeDL\/HXzNzgTsveslD2vsWHWI9mu5rvVvZX9foS4v\/LfmqdEIpHDGlfM2uCW\\\ngJIy2wOENPaZ3fEcivd+ZYNCNJYtrNyhyGAo8jRoJTAUmRiqOCJnRW5FpTN++frTwdh4SiUv\\\nbVlWvbffLcRF04qazRD7176\/rBjKylD5pBiZ5Wi4wQu7tikPBeCOpuW+Kj0sqP8GHNoAZuwL\\\niOzuywDhQ9zBr2xoDRqVQFi5QxxH6OwVjRKAAW46pvT+RxAJVLjW7vY9\/+CeUBMkl68\/rPQn\\\nmCufKzaldFN\/yI8gA5iwC3dkIKhsyvZuCYSVG\/KHcwhFWDRKAMMcD8EKX+rHFl2A9bt2d172\\\n2qNzOvzCDYmfEtNy7QogXDXWIKAIQ7cOQZchyADWnerqN5xVXttcJsdGp2OtwqmWJU7A+Eh7\\\nyhYbUgm1IX7f7K1DwaRyUfN42FIuxNDdVEtamL6sYC9R26VtbZaW2px8Nfmehz3EM+mgsolk\\\nd3\/ZnBGElXPGUWzXg1YCq5eW5\/zBGy54aWOgwWKfnWbqptcevWT4FUBvov32gew8DLzDTMaj\\\naupq7t\/bMXX+yw\/egJGKoTksy2d+gFBb9VoDvX5BlZTOR+Wfjyb0pP6U0XGOYNqR\/quta3vB\\\nFgeua6qv2d7vn8dFdV3rldBw34GSPg9i0DG9h5XWknh9kAaMmyJ6dklPzZmtD3cnu77vtw5C\\\nh\/YrG1p7Wxp\/VvuRDuc+wsq54ymm+8zzKOgyRSPRa4IKoGz1i8b6ytagcEPmb9v\/m09cUATz\\\nJow6tVnPcMxHzj+sNNpHsCJyja6csrRsMyrGkiwF4I5UiouliL1RW7fmNLeX3z2+\/GfW1LU2\\\nY572b6EAzkfYoPctJi15Q1nJyLdrFrUZp1\/3pmkuG\/yN9gAoGyMTf7neVIvx\/6CHUghlluh\/\\\nf9Uvo+gG7O3q7rzFL8xQ+zW+\/8F6PW6fV7xSXhiNlayvWdz2X1ULm\/4uL1mPwNoA5uGcdoL9\\\nZFa6cgoxzhTG6Q4lNR5Doj9xuvlcy+rFbcujVsnLkKv0CefphUbICLRMvl+9KP4vngHg6Fc2\\\nNCqMSiCsnCkfxeD+mTflBwuxdmFbOZqT\/l94225Y3TCrzpQWhthG2zHraJO\/yb0kkdhpanZq\\\nGXwFf66\/8Cb5AHcbzdpnhUjeG6YFow1gZeMmtqNCDekzTiXVuc3LK4yVTJepuq5tqSWFkXdA\\\nufu9MfWiG3sqnNtcX76+3xEXQWWzVeqSpvrZmC2afYSVy46l+O4KvyVgicCugG2rp0yPTveJ\\\no2Ulm2JWZEO+f6K0dFtNXfw2U9x7O\/bqZct5z0Poi0+vdpyDJcdxrD34U9XCeHrloSktt3ug\\\nAcwtkOO9FZFn+gWtWdS6ODcFoDrAxneOCfRXWUSoK93pBZXN7vAe+gwr506\/2O4LXgngLbrC\\\n76HgRdvetHz2WlMYVVqqm5zTTP5+7volRR\/zJlOYlx+8ohOzEb+CV\/0TU5ic3NGfjkSs30MZ\\\ntFUtil+Yi4yfAcwkjzqpZyb6HlgJebwpgLYxoO9\/j8k\/\/WW3xS32gQPHrV5aMTp1IDFN2Op6\\\nfz5ywF4HfmXD+\/Buy4NVu73yEFbOK65icot+ZjP+8qf4JkYiTnGKTb\/qST0zMKACq18jjPGL\\\nA4PCxYNpMKOtjREv84HpyOsws\/BsqyT2RGZ6rzl0gA9sBhEp46hsP2ratmOJeGrugBWDB2Pw\\\nNYD1B4OSTMBmcmdS2E\/GG2ZvrF7Uejsqyw\/7A7guEH6Kyyl9q3fpQQvgXtx4dz+Ueg+Lmy5v\\\nbjjYtO+b5LSqpq5Nz6nwbFFhUdaYgemZy4ap1z5dlbByA3NQTC4F3RKYfOTkaUF9Xry0LwU8\\\nsDMC\/H29oV0GTNV1C+iZhTu27rgAebkb4+8H3P553qOOyu\/WHj21ZWbd7z2XLuv4fA1gmQSV\\\n2GML+6KmhorvaQWgne11yZ\/glLX+IBNcn2FQ7F9Y5XQfN\/qUa+Hr3UrAGg1MTLrG3bfPyEtp\\\nm6d5oyCZcJmzX9nQ2jAqgbBymXSL9VzQSgBfxUBjHpbXbzM+vKueRBRiotE\/Bw8ogf\/LIZhY\\\n\/9Tcnsb68lt7DtgnQRE8lEvT2z9eWT5SjF7lFSZoVlyfTLvqUTOb62etccbRO1lHeS68SYeT\\\n2OzUdegWmRTW7S7ng7dKrVi9rLztoMPBK73nA4YrdZfM+5DZsymDymaHnClokvPOVHG5FrQS\\\nwCY6RwU9Dkx5MU9wQXMaX+ePguLw8\/dvfg6U1LPvsPBpXspOniQwagElsm9gqNxctOEQlvj5\\\n7tBBBjAdHkMPdY0\/q\/irW1bf44t5cNKQKwAq7DsuJzHl6Clz8bk+1u2u78FXYWfklQ4\/qY2x\\\ntYvjX8boyWN6zwc9\/Ojwz7pUtv1Lp0NQ2UxLo8PKOdMu1uvooTDjLyxcrNWHEhjQWsyKrkPs\\\n2JHl4LpJicQXoyp6nMs5fYsKeile0G95+WXcEj3m5mcmjNe5b+lyHZYELxGjRmDnY\/HtMK0S\\\naPE7Md34PueUYz8DWDovSjzXVF\/xsFe+Lpz\/wjQQ9eiH94ZWqVS62+CUhV3lMtNjSHfXorHf\\\nwKgZg9FwIrTCRJwjWh5+\/ocSLzQ1zG52BvItG+wOpqXRYeWcaRfrdbSgC5bD\/PySxBHakPWO\\\nqZx9y4L10uABB4xk5we8qDsHO6++b0nwjzFXYaUViy6Ece0O1I7SAZkxOUgxtmZB9RcaVyxx\\\n2CbMBjAdTcruWWyKriwy4myTH9zt3R93\/8Xlj0ESWetyy7qFIj1odwkAmhFEA2KD6DlwNe6h\\\nH52HuWwIaLQHQOUYZwr6yznTLs7rgu4OYBJq4JBWJCayRhTyeYx4X8\/xCw+rus9L5yc50A+W\\\n8v0w0N2ZxAw7VADPZcEDpXpdsLXoDKefrwEM+yj47aEAa7yxzMjXm+61FzUL46ch7cOd6Q\/m\\\nWncf9BTvXbs6Z3hNxPIvm1kJhJUbTFkKRbaglQCWiwbuiiPtyKlhHwZaq8YKoeMcji9Iy9Ly\\\nPwk79U\/55Bk75fSXMchwhj79Y35xY7qu8YspvTbqSG+55hdjjn6YS6ErfyqVOL2xoeLrbmWj\\\nYwkqG5S2p1IOK5djzgs+2LB1B4Z6\/gG+uosa6yuWOYljzcCuoG4llqxVQOYep1wu1xUL4pPR\\\nzD3GL6wlVE4jA35xePk1NlSuBb\/34RcwB6JXGgz6rflBBjBbJH7tlWbGDRVdb4bieXgpPbhN\\\nNQT3iqMHz7ETHvuRxnv45r8FpfQWRnDiqVfV2qBlxEFl6+rqDLV82CTnVYBidBs2JfBpwMJP\\\naW3rXYbqm9qXMLnmChjCnvUN5fKMRc2LbzJBk8mU55cn4x\/2rLdJQzNjtKkyuuO1pdqccfMz\\\ngKGp\/aHfXooVi+JTofimZuJyn8F7QHmhAMxdAaUeTX6c7F07sUUkgyq5Oz33vV\/Z0C7b+scH\\\nLtnpltH3YeW84ipGt4JWAnu7Pn5xwqjxB4IMabBc3Q8rfLzPCJfTc0SF0b8NaDzSFWqYfhBU\\\nnm1djITHGhN3eSRt+42Mk5KWcTsxFMe35RJTvorP3rmn49VMOgfP8oiD19lX6IdvbXmkqjvb\\\nNfydX9m8WimZlMLKZeSL\/VzQSkDPzcdYcyte7lq\/B4XKfKQaNeK3mL47r29fQL\/gaT+\/vrEO\\\ngDTTX0U9UWbKUVMfh9MYuLZjVPzxxu0fPO0\/pTedhOd\/1XXxGZawfuXp6eGIlz+eme2X9lbo\\\n0xuUl19F0bLaKGgQhafa5NVPhxjK7X0gLuOMRm+JAFefsnnaKzLRhZXLyBf5ediUwKc1\/wD7\\\nfD+JL72vEtDPEIqgWkZj6zFP\/d5duzt+ZHihxfkLnhs7umT0l1AjKkyVScenpJ1WAlAACzAE\\\ndqV2Sx\/S+nLN0dPelXVtD\/SkUr+JL5\/9VsbL75z+bYNS8Q2EuQN\/Oa3x1\/FJZS\/VZ30EGcBg\\\nePdtCYCR0RCKr3q6vL0pOf7XfXvDAaVzcGjQECZX56CyYcmxZ\/7CyuWar2IIN2xK4NOC075\/\\\n4yMTRk3XuwyfGJgmxt\/xdbpt8uSRi7Fl1luoFJtQm3Ul7cKXfyqMVsfDvwpVq9RPAeh07FRv\\\nhUL4693pwu1YyN+FX0C+Cy0VrIWXzylh\/w3n7fiibreUtTsVURMitjpKWRYmPKkZmHDzFciM\\\ndMflf6+eWl0\/65lMmCDD2YFEl2dFycgj38aRAbQSPGX1sCGUcCaKrDOUyszauvgcZx6zAvTf\\\nLLGqFlXPjFjyIthCkphR+cN+r76LoLJ1d3d45i+snDv9Yr4veCWg9+SrXtx6G\/arezLXB4WX\\\ntgzv7Wk4n+Z8f\/FFzzUKIa3ky5ULmo9CE8N3HgLinI5IsRNy32hsXxoRnTBmBvWmiP9zT7o3\\\nj0q8vnN35zecGfY1gCm1w2\/fviCjoJXytieolL0xvRGhMyNZ1\/IJtL6Ww3j5y8j+7i1dyU57\\\nxLjDJmM+xOFQgtrucgEUTDVIpFcnovWAf2KAEvArG5T3tjBGQT+5rCIU+U1BzxPIPJumpRVP\\\n4YEuz9wP9xlfvw\/0ppuyxDp9uNPyih9l\/XNXovNSd5dGG8C8wms31CzfrkCQUTCZSHj+wm8q\\\nJV7XE3xM6WqjLSr6LVB668ToEXtHjJ\/4Cdw24+uzFvsJrsT11RkFoOOALtznFZdf2SDl2QrQ\\\n8YSV88pDsboVhRLQD6exvrEOj9y4g9DQPkC5Zmjjyz021LdV7yb3zfL8qmsDmOFARTVWFC3i\\\nN1NQGwX1jEavqOMrZ78D2ZVefmHcdPfCU86nbFBB5rKFlfPMRHE6Fo0S0AtoVm\/d8VV8km7D\\\nC58YrseFuLvspLpbx79z64erdZNyuNLKileJdalUak7j0orr315x+YA9CbQBDF\/ck7JkHDdB\\\nE5sg69OKMH9pdRJd6v3vgEvYbdQcucSlVM9nO\/QaPP3KZlve8zWCmJjk3OkX+30RKQE8KiwN\\\nblxafhe29JqBL8of8GKam6n5P9mdGP5bmUikpmc22tR7BHSKjjP0kmCktCf\/KAMlsOJXtejK\\\nv7q+\/OzmZbN\/Z5IoHT3+NPgZn2eyx7uiZOJDM9xoyTcZBTOya+vndqW3URPijYxbmDOe1\/au\\\nzq4BrYqgslmphGdLIKxcmLwXskzBGwa94OstveB+sf714IiK3oiO5mXod+r9\/I2VxB0P9Ec3\\\nxp7XQYu8JGTqmcatO+NeY\/99v3xbh+21bh03cnotljdfCZnzkeapSDN\/vjDg4XP4Cnb8+W9p\\\n9zzduKz2Q3fevO5lytqtomo30pzk9Ec5sHOY+FXfVl5Or6xr5HkDFMGAadKQ3yAO9DydFdjj\\\nppf5kjNq6qrnYi3DfyKI5h14oOKj1aZehBJ9NtWTfBAGvv1uIawS2xVTahfsB5OdfrpseEaP\\\nmRiFlXOm8Xm4xnP\/fBy6aVg2fty5SkWno2mMPfSF3sgCf3o4UGGSj\/wI548wVLfbVvab7Z0b\\\nXx\/MrwGlf9ZrXPQMbMx5CiAfjiHIyXjhsR7BKkMfG8mLT+D3CdJF2qod1vNN3V3d60xW7hyf\\\nkoSVf0pEpkZFeqJWQtld70c6dnp1H7zi0z933hOLHWYJu1REhZ7ptxeVe69XWH+3Jdasm6tO\\\niEWsY1G5j8Eaj2NR0adga7IeVOR2LBSCcVC8Z0u5Ue1JbspxVqHEcusjRKkYLW0VSSUinTmW\\\nLaycfxHpSwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk\\\nQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk\\\nQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk\\\nQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk\\\nQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk\\\nQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJ5Evh\/ikTb\\\nm38w0ncAAAAASUVORK5CYII=\";\n\nGShellInsideIcon=\"data:image\/png;base64,\"+\n\"iVBORw0KGgoAAAANSUhEUgAAAFQAAAA4CAYAAABjXd\/gAAAAAXNSR0IArs4c6QAAAHhlWElm\"+\n\"TU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAAB\"+\n\"AAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAFSgAwAE\"+\n\"AAAAAQAAADgAAAAA2CVjOwAAAAlwSFlzAAALEwAACxMBAJqcGAAAD8xJREFUeAHtWwt0VMUZ\"+\n\"npm7m5BIEKgpIILvF0gV0QokG5LsJvjAx2kF61vU4qtINkFAqRar9QXJJuZoMfVVpSri8VEV\"+\n\"hGSTkN0Qj4D0SIMo1AeEKKIkIYQ8du9Mv7nZuWyWXZLABg1wz7k7d\/7555+Zb\/5\/Hv\/MEnL0\"+\n\"iSoCNKrSDkBY6rwyC22wnqkRehol\/DSBkFAyhBKRKARLJEQMRDwGoq2BV5ayJ\/A2ge9HQUgt\"+\n\"oaxWCFHDhNjo53TDcbW1m5csmaJL5kP5HHJAM2dW\/prrwgGQxqGhF+AdhXeroGQT5WSzIGIz\"+\n\"JWwbFfqPnNEdOvXv9GnWVmu8z5dYvcMnwak9+fh4q\/AdY\/Fb4plGEoVOjoe84wVhw9ABZ4Nl\"+\n\"BN6hhNDP0UAvIdzLuPAuz0\/5TubvyeeQAJqZ4xnDBZtMqJhIBDkRGlVOKfEITtborb515c+m\"+\n\"7Y52I6H5fbT6mNGUimSAnYxyk9BpNfh+T+j8vdL8lE+jXaaU12OApudUnghzvJVyeq1RcUYW\"+\n\"Q5OWDty27ZOfwxRlHTKyKpKExq4EuFciiiGEvsAFfbnUNX6bUcco\/EQd0AxnxQSY3r2o2wR0\"+\n\"16uMikUrcm1ro1DXqIpIz6o4nzF2O4Reg9dLOX+qOD+l8mALiRqgjhyvNKvHUaHjYM4FlDa9\"+\n\"umLBxKaDrWBP57982pr45r6t12PsnY2ytmA4esSdl1x2oOUeNKDp91WeyvyiANo4AuPVX4pz\"+\n\"ba8eaGV+znyTJ7+p1Q8beq0Q5CFCebWFW5wf5Y\/7prt1OmBAZQXqhh3vRIGzsdR5vH53bOHa\"+\n\"oguMWbi7lfgl8U+eVx1T11iXDWvLhqXlF+cmP9ad+h0QoOnOVUMZ5W8hcyNl+h0rFkz4ujuF\"+\n\"9gbe1Fkfn2D1+1+EssT4LdoN5U+NrelKvbsNaGZOZQoX4nXM4E8X59me7EohvZnH4fTeh+Es\"+\n\"mwr+h2JXysrO2tItQDOyPZPRY4VEiBtKXLaSzoQfLumOmZ5UwukbUKLpUKIl+2tXlwHNyPFg\"+\n\"wKa5RLCJJa7x6\/cn9HBMS3N6R2qULKWEzi3OS1oUqY1dAjQj23sFlhN\/F5RnuHNTNkQSdrjT\"+\n\"02Z4z9Q0Uga\/wdSS3PHLw7W3U0DtORUjqGBewell7vykqnBCjiSaPafyQirEB7pOUsoKkr8I\"+\n\"bTsLJQTHx0xbYwWYi7F8mHUUzHZk3LlJq+GTeBCa+i+JTzBe8tsSSgiOD0hoySGcfFucl\/x8\"+\n\"MH0\/33T8ncsTV\/3U8BPphuvMNr0iUVuv15WXp\/lDZduzvS9hTTgcM20CNKMvhp4En+CZFfkT\"+\n\"Pg\/l7U7c7qx4mUjvVJBczn0Oxiz3h6OXFaSb2liSaytyZHsu6d+3ZQ7KfCS43IiAyrUmETyH\"+\n\"afpvgzOEftunV4wgVno3FeQ8OBtGoYL9HHHxunB6t2JWVFu47VgVoKLmQ+0zVk6hjGUJSkdi\"+\n\"3EkQ51O\/Y7Tna07pRzKOvN+W5NnmcUGWMSIewGRwLoGpANTWn7Zt\/58p6UA\/uFhGmCH3N1Iu\"+\n\"Oq15V\/Omr\/rHnRWWHlqM3En5mb76kukVC5cVpuxQ6RFNHk6N6WBaFGnRPnLymzHo5Yeola1D\"+\n\"M++B5sThvdfv8w1DOAnbUKyw6FT5Ih5kGvOY3el9h2raG0gbi4YshFqOwxh9Bcrzo0LT0bxb\"+\n\"4Bc16lbmSn4THfWhqjCEflq9ZEqbih9o6C6YsBjlLDXzU7J6bdEdvkh0ky\/wEdiWLvJZ2azg\"+\n\"tLAaOs65Kg5O2du4hgZHeAYPG\/IBgMwwkoXYojf5J5YXpf0YYK+x3+O5mMaIDQBNQ\/evUWLS\"+\n\"sxxySyfdZ3jEcrfLZlbIPqPkU6LFfgO5fbBEW93OY\/DBStB84xGrAh8HH1ByoSmEk72epkh0\"+\n\"kznwIUQh2leFsfQBte0Oq6HxVLdDc\/5bOj8prGmlZ3luNMGEbE7E5CAwjdLcz9i+hDa9KyM6\"+\n\"0U1AGRMBMJEgxCaDOfDjLnBsB22xjPpEoBPgM0DU7FhofnRWGpALG7ooULSsS3tHRaKbjHs\/\"+\n\"MIx9hdgX\/fs2T1TUsBrKCMvA+FKsmILDcc6PBqIXchUNlaoqdaV8ouIdQlQS5m4vd6UFdQw9\"+\n\"Q\/EA8Btg\/mvcruRXQAMr9JDSUpwN2T2B4wrH4EFyjOur8uicfO9wel4Epw0e+EGEi3f20O\/u\"+\n\"rHJNaVY89ntKfkViY6H5hoWNhm7HQvpnKGAhynpB8qUPHXwuyjLkog1iD2syAI1EV7L3CeVi\"+\n\"n9N00D+QaWE1FDo3lnPi2SczCHEi\/go0EIdn7Q8mj5fVd2jY3LJnERH6paAbYBnpQngVHxrU\"+\n\"H+b\/MmbyTQD24fR73CdiInoFw8AwxcMtWpL6lqFG2VJMZCkYAXCoh8mL0ZvixODrFY99hmcS\"+\n\"jYnFWRKdhfRqwfWrkBYD\/gtQ1vOp95adY\/BSNl7lAf2LKtfFO\/dLV8whIdPpJ5BtDh1hAYXm\"+\n\"nCAY3RKStz3K2PnBdD\/xlwbHg79XLZz4gzs\/tYOJooFPQCO2B\/Oh4aeiUQ9JINKd3j8hDaT2\"+\n\"Bx1mAgpF+pL49VQ4gHE6ivHZfOhQ+ZmaVXYSEH9NdjjSW5pEbU5pflk5zFlXrBrVjDZ3kCuE\"+\n\"OX5Goqv8oaGfUrmcOl3Rw5o8EgfFtjV8r5iCQxQ4RrVXmkqNv3mrSrc7Pc8AiikqHhxiWTUX\"+\n\"Y06RuyB1tS2rYnQsoX+D2k5WZid5AWockCxMc1asLwt4dkDbC6gQLnfhhHWpqTh6FvQEE3ZK\"+\n\"PpP5LczyGIIE+Q2bKJfDQHp2xR8hWY7DIIlid0GKwYty9mqoIO3jJ3gi0WX+cA9vbW1gfazt\"+\n\"ZYIhrIaC3tqsx1nDCYApDVR0NHbX5sJLW1W8pWHnHDR0BniOUy\/S1gHMi3hb23K4wj5Mvbus\"+\n\"rxwfAe6t9U31g+AKvBU8tUqGDNH6q2XomOEdjibuNX9dN4YLep52EVreT\/IAJD9rajGsBJZl\"+\n\"goR8o9DBazEfFIFpsxB8bkv9zt\/LPKnTy9AZFLLbH134DA2NRFd84cI4rdkHeqxKiwRoI4uN\"+\n\"PVYxdQzFuqD4sXLcU\/HKF69s9Pt9FSpuhDqdL2dDFhObBBAupbFWOaYaz9qiy\/eUumwvtfr4\"+\n\"eTBLs2OgucZCWTAeBJCoK386rVpmZIyYsyo06uOSoowGqbUAzgQJUHsgZ55cF5e4kk93u1Ie\"+\n\"k\/WT+anFaspFh\/yodkGR6DJPpKc15tjBSDOtORKgmyxCnBlOCCar9zvQrda04DjTLDYzjrFL\"+\n\"9\/mMMRQVx1pSap94NPWWsj4mDz5ieBs2RLjmgEcOI1hmLZXfAMs0dyKoNEtgBLpgGHbUIz6W\"+\n\"X4Ft67eKisyys94vL0yrkTRo6932bE+13JCgDqNNPkHWqO9IdJUeLqRcDEetjDJkevgxVJDV\"+\n\"XDMAMEwpWFBpvu11LFsmwWSuk3QcxeZgTFwuzRjhEMy6dyp+tL567yUGagCKfKdbBljKsGW9\"+\n\"zV2YskHOulTD\/hnjp8yH6zizscwKNJIlK1kIDXM34lQ0GHAjgg1AZnqWdzuh+mfIXASSHEeR\"+\n\"QKcCxEYMPVJ70MnCjgsON8td1pBsjzlJodNG4Ej5FkoZ+nTv5BVMx1Lrn4bMMD+wFhvn1OhU\"+\n\"mRxWQwUVpUDdNM1QOXVNG26BOjnBI5ca58RSuhXOgi2xjNWgIliEY2nE+b2tLSR1b14xCuvL\"+\n\"d6CAqwDqWGxZq7FU2mOxWNfLzgH4q5F+SYkrZb7MIzUJ9Whf4iAuiN8Y52Qa52IBgo3yG8CO\"+\n\"wjb5KmhKnf6pbz40XALahvEd8x2dAZAfhuwEznmm3FbKHG0t\/DnwfSO\/wTWcMZoHv8WgSHSD\"+\n\"L8IPbr9kwLhKVDLav+8j3VID+rbUoPvHBXYD+zKBMmbac9Z+caefAkU\/CR0s\/D6yqWL79i2d\"+\n\"eZqwxRyEgewU3GEa6GfsJ7Lbtzl0pxW2wBCinER21rfVffZqx\/P\/MdPej0+I73sG4yy+oWXX\"+\n\"f+RYHZLViErHjg\/7paY9GzfLfbziiURX6So0jtB18XGTYMOrXOPNjYVK7xDCkbrAke11dSAe\"+\n\"jXRAwO6szHdkVz4RTAxr8pIhpk1\/EsENF2dVnSTjR5+OCGTOXHky\/ArX425UYXBKRECljw9j\"+\n\"z9N+5j+qpcGIBb65rsHTRHJDL5pFBFTmq9\/dB+pMhzlyPNPCyDxiSRk53tsB5ol1jX1MJ5EC\"+\n\"I+ykpBJlGDjpq4BDYpJxnhKceAR+27Mqx2EC\/gAnwLZwJ8D71VCJl3GyR9lNcMC\/J8E9AjE0\"+\n\"m5yZs+osgCmvIE0NB6Zk7BRQySTPoDEAz8ZJ3wp54C9pR9rjyKo6mwteAhzm4NDy35Ha3yVA\"+\n\"ZWZ5TRGeppm4PeE2rqZEkngY0jOzKtMJ08uwu5jV2XXNTsfQUHyMG8qUvQHheXA6GLuaUJ7D\"+\n\"KY61+Ey0ZyYui10T9ctiCih51c\/i1xdBY9t0waaGLh0UX28ODdehRv6BNhyDQ7HrSgqSt3Sl\"+\n\"Pd3W0GChWD48gD1xFpYQeQMSBuQtmTeyLTi9N37LC7f1DTunY1UzB+vwvIFba5\/qzp8sDgpQ\"+\n\"CZjcSeHAPx\/eHVwJJ3\/tv3Xb692pwC8J9MANw0ex9t7ANZIV6dR3f3U+aECVcBy0pUHYg4jD\"+\n\"yUufbBJ0UacOA5X5Zwzl\/5ksu2JuxJyAi7XiB4yVc7syVkaqctQAVQXI\/wJxjc3GsYd0Di+G\"+\n\"2+z5nvqTlSrzQMKMrMrzsGicCpfh9bijsgqXC+bD7xn2pLc78qMOqCrcuIdP9KnwN94lex8r\"+\n\"gtdU2s8VYsYei\/pcBrfkFNTBgnP9RdRPXujqhNOVevcYoKpwOJ5vgiv8Khz9\/k7RDkUorxMd\"+\n\"Q\/m58uAOuzxpLRPwbgOgyxB\/q9iVbB59RLM+PQ7oZXM8A1rb6Ddxu\/sMeb\/ogrCO3nANks5b\"+\n\"DXfHqLA0NOq0sa0pxn9K3VfGudOOxMS4OE2La+2j9WO6SIRvOxFnGsPgoT8Z1nAKVh3S038C\"+\n\"xvKNOCGogpBKnNevLH4quTZcWdGk9TigsrL4l10xjiieLXbZ3ums8u1ecPmPPCE1ahdeeVws\"+\n\"z73l+Zfa2UnvuHwbAeAOaN0OmHENLmd8DdpXuE21QU\/Qvyyft+99U6T36BP+kC7aRQr6NqdE\"+\n\"mnxEQKUmt7WRPwtd3ITll2s3Zzf3hlVCKFSHBFCN6+\/qjD0qz6rUtT9VEeOfa7vq7m5tI\/dD\"+\n\"295mGh25YkHSDyq9t4XKhHq03sYf\/3Eha+AxrWnBBeHc6uq6XXUbAKSDcC0VK4G7ejOYsm2H\"+\n\"REMNEKF9WDhLs18hly\/wA+RiDRjHOJ22Ij+p1OA5DH4OyaQkcQocuVZiBl4JjRwHH8CD+7tA\"+\n\"0FuxPWSASoCgmV4sZZZhW5rXGyecX1wny7+E\/+IqFeUK\/R89knneGSwJ7wAAAABJRU5ErkJg\"+\n\"gg==\";\n\nGShellFavicon=\"data:image\/png;base64,\\\niVBORw0KGgoAAAANSUhEUgAAAKwAAAB\/CAYAAABymylZAAAAAXNSR0IArs4c6QAAAHhlWElm\\\nTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAAB\\\nAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAKygAwAE\\\nAAAAAQAAAH8AAAAACt6tZwAAAAlwSFlzAAALEwAACxMBAJqcGAAADQRJREFUeAHtnQ9wFNUd\\\nx9\/b21z+iYCKCiIK1amW1j\/jH6BCkstFEFth1IGpRWdstQoqkEunttrW2nFqO1YTIlatinZ0\\\namdAqY6jIyOXi7kgg1arVv74b3BAQPkbVAjJ3e3r94WcJpe93csmcbjb784kd\/ve7723+3nf\\\nffv+nxA8SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAE\\\nSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESMCGgLRx84\/Tylk\/EYasHcANHxRK\\\nXiEuf65tAHEwaD8ImP2wLTxTadyBmzrT+42pzRSrd3peQvpXsMtrhgNYCn8fewHXFUap+zyH\\\nZUASIAESIAESOKII+LPR9dzsk5ELvxdKBTzlhpQpkbIeFle+8Jan8AzkmYA\/67BKXiek+pmQ\\\nhsf7VweE6PyDZ+oM6JmAxwzznN6REVCqS4SQXwihLI8XtFFcuWqHx7AMRgIkQAIkQAJHIAH\/\\\nNbqem3098iHoOS8sa5O44oUmz+EZcEAE\/FWHXfnjs0FLd\/YP80ZNJkRALvAWlqEGg4C\/BGsE\\\nrgK0AMb\/d3uCJ1WJsIyVnsIy0KAQ8FeVYNmsYWJYR5F3cqmUmLt6v\/fwDDlQAv4S7EBpZYQ\/\\\n65pV5ccdZ46QncHyziL1ZeDt1K7m5lAyw2ywTmXNDa8cLcpLjlWWOiolU1\/s3dO5692nZqBP\\\n2D8HBZtDXp+28KXicYGjq9Fve6Eh5QVCinOVEqOkFL1Ka7gpKVWbUnKnFOodS8i4tKyWaGPT\\\ne0Lc2e8+3+ra1plI62LEVYnPs6SQfapwSqmv0Kf8upDWGkzleSbaWPFuDreUtyYUrEPWhW9e\\\nfawMFi9QQt4CcZ7gYOroBVF9CrE\/2qnEo\/ElFa4DDqHalosCUt4rpJzsGLGNJ56Z10QqVRtt\\\nrHrDxjvvnShYmyysWPTq6UEzEEGJeS2EWmpj4skJ8SVQAt\/zSeLLuz5aemlHZiRVkdhpAVH0\\\nF6R5ZaZff851OgmVOrtlSeXG\/oTLB9s+r5h8uOihusYfzl91fGlp2cNSytlIA2\/\/wU0J8aEK\\\nIX87zhymPtKTb3oc1bXxa\/DKX3bYpoeHh686jqCSExCUgvXALy+CVN0SO8MMmi9BUOOH+oIh\\\nzFN7phGqbb3CkOoJ1FO9zR7rGVn3d1QNRtg4570TS1hkYSjSUok6478h1pHfRo6i4D4mnU7N\\\n4tZxwlBPIu1BE6uOGw2+T9JpFNKn7wUbrmu5WgpjGTK138O1ulcApeIWCLAdDauxqEoclYs4\\\nlBTb03bKUEtQ4panzx0+9yONN9ANsdFQmN4oxSnokzgTn+f0CaNUSnWm3unjXgAOvhZsuC6+\\\nCGJpzDUfdWMGrf0n8BezIJxDYscHa+vntqfDT10QH1kcVCej9jsVJebVqEtOSfv1\/ERXV9fE\\\n74raV8+EyC\/v6Wf7XamnO5KqNr60Ylem\/+GqTOA6dKXNTz8weCCamh8Mobur8I5BblbkD6Cq\\\nRbHvm2bRm7hi95JVl1hSPpWyEn9sXhL6JNe71K1+UwQWK2HcmG5M6VJZWuLU1Y1Tt9TUxe+E\\\nsB0ngishHovWT\/2FW5q6wVhWVnYT4r\/QkuK2WP20gixhfSnYqqqYaZ5btBav0\/PdhIDX8FuW\\\nlfhprLH6fTfbbP7VC6PfkUXFvwHsOZYSjzc1TK3TtjWR1jecr0HtS1rJCXhIuO9BN1xfVgkC\\\n5wZudRZKNx2l1qVU8pLmxuoBCaZpaVgvJdelZO+SUopx3Sll+3idYu2NxneCDUVaJ2Ko847e\\\nGPqe4dUaP7R\/74\/WPD77y76+A3c574a\/FyENPbyb9YB\/cVZPn3oYfrtv3PCjGPJ0FAKqAet3\\\n7T4wc6jEqpkHy0eaEKuDXFG7FWKKHh72Wx453a+vBKsbWtla7r0hpRYM9SyotQ1dvQtfd2\/1\\\nTr\/7DA8W5jK8WHVTLKfuMts4CszRV4I1A+Y8t\/zD1L0now1VcTe7wfDHK3+TazxSTjKLi2K6\\\nC8zV1gcGfhKsRNeUXnGQ9UBVoK390MFfZTUYZA8prA05RYnejKA0\/huOtNw+cc5y9264nCLN\\\nTyPHOlR+3pL9VWMIdCpG6p1LTstasnpJRcQ+BiH0q9kKGnrXmH4dRYnEzujfavZkBtINQKzX\\\neQd16tyHZZX6MCWt2lh9JeY9+O\/wj2AjrQ+hFTPfKYutZOqipvsrX7Oz6ZobW1yiJ0ePsfN3\\\ncsNYwSFsi3RXtKHi7ky7cCT+GEaorst0dzvHgMI\/O9rVwtaHpu1zsy0kf99UCZDBlzllHOqT\\\n2yDWtdlsVHHx9fDrt1h1fOgMKMF\/29W2qY7k7zDUuzlbutncUdLMKykR60OL45Oy2RSiuy8E\\\n213vcxGbegYZDF3bH6gAT7f3yc0VArNdIoMx\/886D1mVSBlTZPt5SDnaCMhXwpHmaf0Mmbfm\\\nvhDsqJNGjXHr80QJu84lF\/WeBp4PPAlZG1gtD1Zu7VBWBRp9q\/ubAB6EYVKYL\/ulF8EXgsVc\\\nV9eGEnbQ\/DSrWOYsRxRiQB34EOx\/ssYPD73WK9owbTpEezP++jfTSoqyoAzc6xR\/ofj5QrDY\\\nBnasW4Zhsv+2rDYr5qZQAvdp5We1t\/GQSumZYW6HgmgfPJRo\/y4aaU+7Gffyl+LS0KKWcC+3\\\nAjzxxVwCLD+BYJ07RA6IHTuc8jclEpNNZZ5qZ4PS8xK09H9p55d2S3TmJNgu8zUPTN+OL\/PC\\\ndc2P4UFahmsfn47H6RP12VnwjzrZ5LufLwSLBs0YF72KosQJJyIzN2fL0OaGkG4U6b8+BxYQ\\\nTkKVwenYqeupTgZ2ftH6qhg26\/jB8aPKnoBo59jZZLh9L+O84E59USUQhki65Vwg6P3njyDW\\\n85ziR500l+qAbRR6TsO+rzbMQxwv2xr0csSSmQI\/fCFY7LPdZ2lJZr5KK+C5dELh6ixYITwL\\\nVl\/nm4\/cmBCW+nXmNWee48EZnelWaOf+EKyUroI1DOGpL3PawpZRGFp1nIhtCOXYQ5CLqPQW\\\nRGj4fb1+LEuY3VncC8bZF4KVlszeZfVNVs6qjsQv++Y0t29BUzqWrjqWZDI1oBJWxzEl8vIx\\\nKEFL9fdsBxp\/2Xs6sgXKM3dfCLatfd8adBN1uOUNhlAfwg6Bw93sevqj1HMULPw\/b14a6npg\\\npkSWlwr06fYMn+v3MlU6MwfbD3KwyWsTXwj2zUcuO4jSJ+6WUyjBTlLlpSv1okE327S\/NJwX\\\nMqJ+21W6VtW1Ti4TY\/bUnDxmS7iu9baqa2OYX5DbUX1z9BRpGEvdrDHJ5lk3m3z394VgdSYp\\\nqZbnklkQbbVhBteHI61\/0vu\/ZgszaeFLR+tNOBCxY90Xa7q7BBtQ6tbuV\/oYiPhu8xhzA4R7\\\no1MaOu3Q4pYZWHWwCt1aI7Ndi3bXo2P7v2p70cmmEPycew8L4Q6770Ev+htZPnED+mNPy\/W2\\\n9LRATHr5EJ\/vQ5gfIlw7StTREMd4gAu5rQ3T6aRSqdmx7Z+\/GB47ui290UWv9JX4AnJ71lIS\\\n16Y+xi8sfm6YcrRQxul4K1ysH6Be9llOYHs79i\/4cxbvgnH2jWB1jlXXxecYQuZU0g5WDluq\\\nY6xMFg2XRcb6wYrTJp5NO7ZuP3v9irmdNn4F5eSbKoHOtab6aStQOt7\/beUgSubPmhrC27B1\\\n0YQhS1OJvclkYo4fxKoZ+kqw+oajDVEsgVEr9PehP+SrXWnkMNLm6VpQnUiKxIzm+0PveQqf\\\nh4F8J1j9WwOrt+64Stf50OWEzd2G5tCd\/FZS\/VXH3nagrQUl+4B2j8m8SsS\/FmI9D3McBjwo\\\nkRn3kXzuqzpsZkZU1cbOCRjmPWhQ1aBxM1gsduI3l5d3JlR9ywOVm9Np1kTiE\/CQYIdtWZV2\\\n8\/KpqxnKkvc1bdveIDDt0Usc+RxmsDIpnxmIw78tYM6HZGdCt2fgZnJ+8xzuSRBvQ4zrhEw9\\\nH926s8VJSOHFzRdII7AAPQwzkI7Lsp1urBj0QPxYbyb\/8dmn2\/\/ll\/qqnago2AwqF\/38+WEl\\\nI4afr5Q5EXMARkAoI2CCP2xvJNV+lMZ78LkH3V27LWVt2n9w4\/+6JqdkxJPLqd7b1TADkw1p\\\nnIhS+QSI+HiEw5RPuVengV20d6Nf7K0t1oF1dj\/ikUsatCEBEiABEiABEiABEiABEiABEiAB\\\nEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiAB\\\nEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiAB\\\nEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiAB\\\nEiABEiABEiABEiABEiABEiABEiABEhD\/B9wOq7SGUV++AAAAAElFTkSuQmCC\";\n\nITSmoreQR=\"data:image\/png;base64,\\\niVBORw0KGgoAAAANSUhEUgAAAG8AAABvAQMAAADYCwwjAAAABlBMVEX\/\/\/9BaeFHqDaJAAAB\\\nHklEQVQ4jdXTsa2EMAwGYCMX7sICkVgjXVaCBe7CArASXdaIlAWgS4HwM5zEVS+mvSgS+ZBQ\\\n8gcb4BdHyzwv8szMSaUBHNm+KAd4QC8LDpDn8ogT4UpPGci2jI8IGFx3eLwPWaHknVyWecev\\\nUEbDXaB0X2aNjueYDOzNklQassPCkjc4nW3E1SfwqYk6jU\/vAkPhg0AlSFhve8Jt0dkwDMwr\\\nyMGSSuPyWHAr19k0tkV2sb3sdW2rUCqW88g4Rp1A9s1JPv9cTp1NRD4XFkin8XaQCIwT6Lzq\\\nZO8dHw\/4+U2GzqlS8gbqVmkfr1N6YXK8OqlD0OmlGTMvzPERA8AL9vvbOifpSoL33fsVytrL\\\nS9wiqDzznhUI38v5n783\/gBuUs2eLg1c8gAAAABJRU5ErkJggg==\";\n\n<\/script>\n\n<div id=\"GJFactory_1\" class=\"xxxGJFactory\"><\/div>\n<!--\nhttps:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/line-height\n-->\n<style>\n  .GJFactory{\n\tresize:both; overflow:scroll;\n\tposition:static;\n\tborder:1.2px dashed #282; xborder-radius:2px;\n\tmargin:0px; padding:10px !important;\n\twidth:340px; height:340px;\n\tflex-wrap: wrap;\n\tcolor:#fff; background-color:rgba(0,0,0,0.0);\n\tline-height:0.0;\n\txxxcolor:#22a !important;\n\ttext-shadow:2px 2px #ddf;\n  }\n  .GJFactory h1,h2,h3,h4 {\n\txxxcolor:#22a !important;\n  }\n  xxxinput {\n\tborder:1px dashed #0f0; border-radius:0px;\n  }\n  .GJWin:hover{\n\tcolor:#df8 !important;\n\tbackground-color:rgba(32,32,160,0.8) !important;\n\tline-height:0.0;\n  }\n  .GJWin:active{\n\tcolor:#df8 !important;\n\tbackground-color:rgba(224,32,32,0.8) !important;\n\tline-height:0.0;\n  }\n  .GJWin:focus{\n\tcolor:#df8 !important;\n\tbackground-color:rgba(32,32,32,1.0) !important;\n\tline-height:0.0;\n  }\n  .GJWin{\n\tz-index:10000;\n\tdisplay:inline;\n\tposition:relative;\n\tflex-wrap: wrap;\n\ttop:0; left:0px;\n\twidth:285px !important; height:205px !important;\n\tborder:1px solid #eea; border-radius:2px;\n\tmargin:0px; padding:0px;\n\tfont-size:8pt;\n\tline-height:0.0;\n\tcolor:#fff; background-color:rgba(0,0,64,0.1) !important;\n  }\n  .GJTab{\n\tdisplay:inline;\n\tposition:relative;\n\ttop:0px; left:0px;\n\tmargin:0px; padding:2px;\n\tborder:0px solid #000; border-radius:2px;\n\twidth:90px; height:20px;\n\tfont-family:Georgia;\n\tfont-size:9pt;\n\tline-height:1.0;\n\twhite-space:nowrap;\n\tcolor:#fff; background-color:rgba(0,0,64,0.7);\n\ttext-align:center;\n\tvertical-align:middle;\n  }\n  .GJStat:focus{\n\tcolor:#df8 !important;\n\tbackground-color:rgba(32,32,32,1.0) !important;\n\tline-height:1.0;\n  }\n  .GJStat{\n\tdisplay:inline;\n\tposition:relative;\n\ttop:0px; left:0px;\n\tmargin:0px; padding:2px;\n\tborder:0px solid #00f; border-radius:2px;\n\twidth:166px; height:20px;\n\tfont-family:monospace;\n\tfont-size:9pt;\n\tline-height:1.0;\n\tcolor:#fff; background-color:rgba(0,0,64,0.2);\n\ttext-align:center;\n\tvertical-align:middle;\n  }\n  .GJIcon{\n\tdisplay:inline;\n\tposition:relative;\n\ttop:0px; left:1px;\n\tborder:2px solid #44a;\n\tmargin:0px; padding:1px;\n\twidth:13.2; height:13.2px;\n\tborder-radius:2px;\n\tfont-family:Georgia;\n\tfont-size:13.2px;\n\tline-height:1.0;\n\twhite-space:nowrap;\n\tcolor:#fff; background-color:rgba(32,32,160,0.8);\n\ttext-align:center;\n\tvertical-align:middle;\n\ttext-shadow:0px 0px;\n  }\n  .GJText:focus{\n\tcolor:#fff !important;\n\tbackground-color:rgba(32,32,160,0.8) !important;\n\tline-height:1.0;\n  }\n  .GJText{\n\tdisplay:inline;\n\tposition:relative;\n\ttop:0px; left:0px;\n\tborder:0px solid #000; margin:0px; padding:0px;\n\twidth:280px; height:160px;\n\tborder:0px;\n\tfont-family:Courier New,monospace !important;\n\tfont-size:8pt;\n\tline-height:1.0;\n\twhite-space:pre;\n\tcolor:#fff; xbackground-color:rgba(0,0,64,0.5);\n\tbackground-color:rgba(32,32,128,0.8) !important;\n  }\n  .GJMode{\n\tdisplay:inline;\n\tposition:relative;\n\ttop:0px; left:0px;\n\tborder:0px solid #000; border-radius:0px;\n\tmargin:0px; padding:0px;\n\twidth:280px; height:20px;\n\tfont-size:9pt;\n\tline-height:1.0;\n\twhite-space:nowrap;\n\tcolor:#fff; background-color:rgba(0,0,64,0.7);\n\ttext-align:left;\n\tvertical-align:middle;\n  }\n<\/style>\n\n<script id=\"gsh-script\">\n  \/\/ 2020-0909 added, permanet local storage\n  \/\/ https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/localStorage\n  var MyHistory = \"\"\n  Permanent = localStorage;\n  MyHistory = Permanent.getItem('MyHistory')\n  if( MyHistory == null ){ MyHistory = \"\" }\n  d = new Date()\n  MyHistory = d.getTime()\/1000+\" \"+document.URL+\"\\n\" + MyHistory\n  Permanent.setItem('MyHistory',MyHistory)\n  \/\/Permanent.setItem('MyWindow',window)\n\n  var GJLog_Win = null\n  var GJLog_Tab = null\n  var GJLog_Stat = null\n  var GJLog_Text = null\n  var GJWin_Mode = null\n  var FProductInterval = 0\n\n  var GJ_FactoryID = -1\n  var GJFactory = null\n  if( e = document.getElementById('GJFactory_0') ){\n\tGJFactory_1.height = 0\n\tGJFactory = e\n\te.setAttribute('class','GJFactory')\n\tvar GJ_FactoryID = 0\n  }else{\n\tGJFactory = GJFactory_1\n\tvar GJ_FactoryID = 1\n  }\n\n  function GJFactory_Destroy(){\n\tgjf = GJFactory\n\t\/\/gjf = document.getElementById('GJFactory')\n\t\/\/alert('gfj='+gjf)\n\tif( gjf != null ){\n\t\tif( gjf.childNodes != null ){\n\t\t\tfor( i = 0; i < gjf.childNodes.length; i++ ){\n\t\t\t\tgjf.removeChild(gjf.childNodes[i])\n\t\t\t}\n\t\t}\n\t\tgjf.innerHTML = ''\n\t\tgjf.style.width = 0\n\t\tgjf.style.height = 0\n\t\tgjf.removeAttribute('style')\n\t\tGJLog_Win = GJLog_Tab = GJLog_Stat = GJLog_Text = GJWin_Mode = null\n\t\twindow.clearInterval(FProductInterval)\n\t\treturn '-- Destroy: work product destroyed'\n\t}else{\n\t\treturn '-- Destroy: work product not exist'\n\t}\n  }\n\n  var TransMode = false\n  var onKeyControl = false\n  var OnKeyShift = false\n  var OnKeyAlt = false\n  var OnKeyJ = false\n  var OnKeyK = false\n  var OnKeyL = false\n\n  function GJWin_OnKeyUp(ev){\n\tkeycode = ev.code;\n\tif( keycode == 'ShiftLeft' ){\n\t\tOnKeyShift = false\n\t}else\n\tif( keycode == 'ControlLeft' ){\n\t\tonKeyControl = false\n\t}else\n\tif( keycode == 'AltLeft' ){\n\t\tOnKeyAlt = false\n\t}else\n\tif( keycode == 'KeyJ' ){ OnKeyJ = false }else\n\tif( keycode == 'KeyK' ){ OnKeyK = false }else\n\tif( keycode == 'KeyL' ){ OnKeyL = false }else\n\t{\n\t}\n\tev.preventDefault()\n  }\n  function and(a,b){ if(a){ if(b){ return true; } return false; } }\n  function GJWin_OnKeyDown(ev){\n\tkeycode = ev.code;\n\tmode = ''\n\tkey = ''\n\tif( keycode == 'ControlLeft' ){\n\t\tonKeyControl = true\n\t\tev.preventDefault()\n\t\treturn;\n\t}else\n\tif( keycode == 'ShiftLeft' ){\n\t\tOnKeyShift = true\n\t\tev.preventDefault()\n\t\treturn;\n\t}else\n\tif( keycode == 'AltLeft' ){\n\t\tev.preventDefault()\n\t\tOnKeyAlt = true\n\t\treturn;\n\t}else\n\tif( keycode == 'Backquote' ){\n  \t\tTransMode = !TransMode\n\t\tev.preventDefault()\n\t}else\n\tif( and(keycode == 'Space', OnKeyShift) ){\n  \t\tTransMode = !TransMode\n\t\tev.preventDefault()\n\t}else\n\tif( keycode == 'ShiftRight' ){\n  \t\tTransMode = !TransMode\n\t}else\n\tif( keycode == 'Escape' ){\n  \t\tTransMode = true\n\t\tev.preventDefault()\n\t}else\n\tif( keycode == 'Enter' ){\n  \t\tTransMode = false\n\t\t\/\/ev.preventDefault()\n\t}\n\tif( keycode == 'KeyJ' ){ OnKeyJ = true }else\n\tif( keycode == 'KeyK' ){ OnKeyK = true }else\n\tif( keycode == 'KeyL' ){ OnKeyL = true }else\n\t{\n\t}\n\n\tif( ev.altKey    ){ key += 'Alt+' }\n\tif( onKeyControl ){ key += 'Ctrl+' }\n\tif( OnKeyShift   ){ key += 'Shift+' }\n\tif( and(keycode != 'KeyJ', OnKeyJ) ){ key += 'J+' }\n\tif( and(keycode != 'KeyK', OnKeyK) ){ key += 'K+' }\n\tif( and(keycode != 'KeyL', OnKeyL) ){ key += 'L+' }\n\tkey += keycode\n\n\tif( TransMode ){\n\t\t\/\/mode = \"[\\343\\201\\202r]\"\n\t\tmode = \"[\u3042r]\"\n\t}else{\n\t\tmode = '[---]'\n\t}\n\t\/\/\/\/  \/gjmode.innerHTML = \"[---]\"\n\tGJWin_Mode.innerHTML = mode + ' ' + key\n\t\/\/alert('Key:'+keycode)\n\tev.stopPropagation()\n\t\/\/ev.preventDefault()\n  }\n  function GJWin_OnScroll(ev){\n\tx = DragStartX = gsh.getBoundingClientRect().left.toFixed(0)\n\ty = DragStatty = gsh.getBoundingClientRect().top.toFixed(0)\n  \tGJLog_append('OnScroll: x='+x+',y='+y)\n  }\n  document.addEventListener('scroll',GJWin_OnScroll)\n  function GJWin_OnResize(ev){\n\tw = window.innerWidth\n\th = window.innerHeight\n  \tGJLog_append('OnResize: w='+w+',h='+h)\n  }\n  window.addEventListener('resize',GJWin_OnResize)\n\n  var DragStartX = 0\n  var DragStartY = 0\n  function GJWin_DragStart(ev){\n\t\/\/ maybe this is the grabbing position\n\tthis.style.position = 'fixed'\n\tx = DragStartX = this.getBoundingClientRect().left.toFixed(0)\n\ty = DragStatty = this.getBoundingClientRect().top.toFixed(0)\n\tGJLog_Stat.value = 'DragStart: x='+x+',y='+y\n  }\n  function GJWin_Drag(ev){\n\tx = ev.clientX; y = ev.clientY \/\/ x = ev.pageX; y = ev.pageY\n\tthis.style.left = x - DragStartX\n\tthis.style.top = y - DragStartY\n\tthis.style.zIndex = '30000'\n\tthis.style.position = 'fixed'\n\tx = this.getBoundingClientRect().left.toFixed(0)\n\ty = this.getBoundingClientRect().top.toFixed(0)\n\tGJLog_Stat.value = 'x='+x+',y='+y\n\tev.preventDefault()\n\tev.stopPropagation()\n  }\n  function GJWin_DragEnd(ev){\n\tx = ev.clientX; y = ev.clientY\n\t\/\/x = ev.pageX; y = ev.pageY\n\tthis.style.left = x - DragStartX\n\tthis.style.top = y - DragStartY\n\tthis.style.zIndex = '30000'\n\tthis.style.position = 'fixed'\n\tif( true ){\n\t\tconsole.log(\"Dropped: \"+this.nodeName+'#'+this.id+' x='+x+' y='+y\n\t\t\t+' parent='+this.parentNode.id)\n\t}\n\tx = this.getBoundingClientRect().left.toFixed(0)\n\ty = this.getBoundingClientRect().top.toFixed(0)\n\tGJLog_Stat.value = 'x='+x+',y='+y\n\tev.preventDefault()\n\tev.stopPropagation()\n  }\n  function GJWin_DragIgnore(ev){\n\tev.preventDefault()\n\tev.stopPropagation()\n  }\n  \/\/ 2020-09-15 let every object have console view!\n  var GJ_ConsoleID = 0\n  var PrevReport = new Date()\n  function GJLog_StatUpdate(){\n\ttxa = GJLog_Stat;\n\tif( txa == null ){\n\t\treturn;\n\t}\n\ttmLap0 = new Date();\n\tp = txa.parentNode;\n\tpw = txa.getBoundingClientRect().width;\n\tph = txa.getBoundingClientRect().height;\n\t\/\/txa.value += '#'+p.id+' pw='+pw+', ph='+ph+'\\n';\n\ttx1 = '#'+p.id+' pw='+pw+', ph='+ph+'\\n';\n\n\tw = txa.getBoundingClientRect().width;\n\th = txa.getBoundingClientRect().height;\n\t\/\/txa.value += 'w='+w+', h='+h+'\\n';\n\ttx1 += 'w='+w+', h='+h+'\\n';\n\n\t\/\/txa.value += '\\n';\n\t\/\/txa.value += DateShort() + '\\n';\n\ttx1 += '\\n';\n\ttx1 += DateShort() + '\\n';\n\ttmLap1 = new Date();\n\n\ttxa.value += tx1;\n\ttmLap2 = new Date();\n\n\t\/\/ vertical centering of the last line\n\tsHeight = txa.scrollHeight - 30; \/\/ depends on the font-size\n\ttmLap3 = new Date();\n\n\ttxa.scrollTop = sHeight; \/\/ depends on the font-size\n\ttmLap4 = new Date();\n\n\tnow = tmLap0.getTime();\n\tif( PrevReport == 0 || 10000 <= now-PrevReport ){\n\t\tPrevReport = now;\n\t\tconsole.log('StatBarUpdate:'\n\t\t\t+ 'leng=' + txa.value.length + ' byte, '\n\t\t\t+ 'time='  + (tmLap4 -tmLap0) + 'ms {'\n\t\t\t+ 'tadd=' + (tmLap2 -tmLap1) + ', '\n\t\t\t+ 'hcal=' + (tmLap3 -tmLap2) + ', '\n\t\t\t+ 'scrl=' + (tmLap4 -tmLap3) + '}'\n\t\t);\n\t}\n  }\n  GJWin_StatUpdate = GJLog_StatUpdate;\n  function GJ_showTime1(wid){\n\t\/\/e = document.getElementById(wid);\n\t\/\/console.log(wid.id+'.value.length='+wid.value.length)\n\tif( e != null ){\n\t\t\/\/e.value = DateShort();\n\t}else{\n\t\t\/\/ should remove the Listener\n\t}\n  }\n  function GJWin_OnResizeTextarea(ev){\n\tthis.value += 'resized:' + '\\n'\n  }\n  function GJ_NewConsole(wname){\n\twid = wname + '_' + GJ_ConsoleID\n\tGJ_ConsoleID += 1\n\n\tGJFactory.style.setProperty('width',360+'px'); \/\/GJFsize\n\tGJFactory.style.setProperty('height',320+'px')\n\te = GJFactory;\n\tconsole.log('GJFa #'+e.id+' from w='+e.style.width+', h='+e.style.height)\n\n\tif( GJFactory.innerHTML == \"\" ){\n\t\tGJFactory.innerHTML = '<'+'H3>GJ Factory_'+ GJ_FactoryID +'<'+'\/H3><'+'hr>\\n'\n\t}else{\n\t\tGJFactory.innerHTML += '<'+'hr>\\n'\n\t}\n\n\tgjwin = GJLog_Win = document.createElement('span')\n\tgjwin.id = wid\n\tgjwin.setAttribute('class','GJWin')\n\tgjwin.setAttribute('draggable','true')\n\tgjwin.addEventListener('dragstart',GJWin_DragStart)\n\tgjwin.addEventListener('drag',GJWin_Drag)\n\tgjwin.addEventListener('dragend',GJWin_Drag)\n\tgjwin.addEventListener('dragover',GJWin_DragIgnore)\n\tgjwin.addEventListener('dragenter',GJWin_DragIgnore)\n\tgjwin.addEventListener('dragleave',GJWin_DragIgnore)\n\tgjwin.addEventListener('dragexit',GJWin_DragIgnore)\n\tgjwin.addEventListener('drop',GJWin_DragIgnore)\n\tgjwin.addEventListener('keydown',GJWin_OnKeyDown)\n\n\tgjtab = GJLog_Tab = document.createElement('textarea')\n\tgjtab.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjtab.style.readonly = true\n\tgjtab.contenteditable = false\n\tgjtab.value = wid\n\tgjtab.id = wid + '_Tab'\n\tgjtab.setAttribute('class','GJTab')\n\tgjtab.setAttribute('spellcheck','false')\n\tgjwin.appendChild(gjtab)\n\n\tgjstat = GJLog_Stat = document.createElement('textarea')\n\tgjstat.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjstat.id = wid + '_Stat'\n\tgjstat.value = DateShort()\n\tgjstat.setAttribute('class','GJStat')\n\tgjstat.setAttribute('spellcheck','false')\n\tgjwin.appendChild(gjstat)\n\n\tgjicon = document.createElement('span')\n\tgjicon.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjicon.id = wid + '_Icon'\n\tgjicon.innerHTML = 'G<font color=\"#f44\">J<\/font>'\n\tgjicon.setAttribute('class','GJIcon')\n\tgjicon.setAttribute('spellcheck','false')\n\tgjwin.appendChild(gjicon)\n\n\tgjtext = GJLog_Text = document.createElement('textarea')\n\tgjtext.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjtext.addEventListener('keyup',GJWin_OnKeyUp)\n\tgjtext.addEventListener('resize',GJWin_OnResizeTextarea)\n\tgjtext.id = wid + '_Text'\n\tgjtext.setAttribute('class','GJText')\n\tgjtext.setAttribute('spellcheck','false')\n\tgjwin.appendChild(gjtext)\n\n\n\t\/\/ user's mode as of IME\n\tgjmode = GJWin_Mode = document.createElement('textarea')\n\tgjmode.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjmode.addEventListener('keydown',GJWin_OnKeyDown)\n\tgjmode.id = wid + '_Mode'\n\tgjmode.setAttribute('class','GJMode')\n\tgjmode.setAttribute('spellcheck','false')\n\tgjmode.innerHTML = '[---]'\n\tgjwin.appendChild(gjmode)\n\n\tgjwin.zIndex = 30000\n\tGJFactory.appendChild(gjwin)\n\n\tgjtab.scrollTop = 0\n\tgjstat.scrollTop = 0\n\n\t\/\/x = gjwin.getBoundingClientRect().left.toFixed(0)\n\t\/\/y = gjwin.getBoundingClientRect().top.toFixed(0)\n\t\/\/gjwin.style.position = 'static'\n\t\/\/gjwin.style.left = 0\n\t\/\/gjwin.style.top = 0\n\n\t\/\/update = '{'+wid+'.value=DateShort()}',\n\tupdate = '{GJ_showTime1('+wid+');}',\n\t\/\/ 2020-09-19 this causes memory leaks\n\t\/\/FProductInterval = window.setInterval(update,200)\n\t\/\/FProductInterval = window.setInterval(GJWin_StatUpdate,200)\n\t\/\/FProductInterval = window.setInterval(GJ_showTime1,200,wid);\n\tFProductInterval = window.setInterval(GJ_showTime1,200,gjstat);\n\treturn update\n  }\n  function xxxGJF_StripClass(){\n\tGJLog_Win.style.removeProperty('width')\n\tGJLog_Tab.style.removeProperty('width')\n\tGJLog_Stat.style.removeProperty('width')\n\tGJLog_Text.style.removeProperty('width')\n\treturn \"Stripped classes\"\n  }\n  function isElem(id){\n\treturn document.getElementById(id) != null\n  }\n  function GJLog_append(...args){\n\ttxt = GJLog_Text;\n\tif( txt == null ){\n\t\treturn; \/\/ maybe GJLog element is removed\n\t}\n\tlogs = args.join(' ')\n\ttxt.value += logs + '\\n'\n\ttxt.scrollTop = txt.scrollHeight\n\t\/\/GJLog_Stat.value = DateShort()\n  }\n  \/\/window.addEventListener('time',GJLog_StatUpdate)\n  function test_GJ_Console(){\n\twindow.setInterval(GJLog_StatUpdate,1000);\n\tGJ_NewConsole('GJ_Console')\n\te = GJFactory;\n\tconsole.log('GJF0 #'+e.id+' from w='+e.style.width+', h='+e.style.height)\n\te.style.width = 360; \/\/GJFsize\n\te.style.height = 320;\n\tconsole.log('GJF0 #'+e.id+' to w='+e.style.width+', h='+e.style.height)\n  }\n  \/\/\/ test_GJ_Console();\n\n  var StopConsoleLog = true\n  \/\/ 2020-09-15 added,\n  \/\/ log should be saved to permanet memory\n  \/\/ const px = new Proxy(console.log,{ alert() })\n  __console_log = console.log \n  __console_info = console.info\n  __console_warn = console.warn\n  __console_error = console.error\n  __console_exception = console.exception\n  \/\/ should pop callstack info.\n  console.exception = function(...args){\n\t__console_exception(...args)\n\talert('-- got console.exception(\"'+args+'\")')\n  }\n  console.error = function(...args){\n\t__console_error(...args)\n\talert('-- got console.error(\"'+args+'\")')\n  }\n  console.warn = function(...args){\n\t__console_warn(...args)\n\talert('-- got console.warn(\"'+args+'\")')\n  }\n  console.info = function(...args){\n\talert('-- got console.info(\"'+args+'\")')\n\t__console_info(...args)\n  }\n  console.log = function(...args){\n\t__console_log(...args)\n\tif( StopConsoleLog ){\n\t\treturn;\n\t}\n\tif( 0 <= args[0].indexOf('!') ){\n\t\t\/\/alert('-- got console.log(\"'+args+'\")')\n\t}\n\tGJLog_append(...args)\n  }\n  console.log('Hello, GJShell!')\n\n\/\/document.getElementById('GshFaviconURL').href = GShellFavicon\ndocument.getElementById('GshFaviconURL').href = GShellInsideIcon\n\/\/document.getElementById('GshFaviconURL').href = ITSmoreQR\n\/\/document.getElementById('GshFaviconURL').href = GSellLogo\n\n\/\/ id of GShell HTML elemets\nvar E_BANNER = \"GshBanner\" \/\/ banner element in HTML\nvar E_FOOTER = \"GshFooter\" \/\/ footer element in HTML\nvar E_GINDEX = \"gsh-gindex\" \/\/ index of Golang code of GShell\nvar E_GOCODE = \"gsh-gocode\" \/\/ Golang code of GSHell\nvar E_TODO   = \"gsh-todo\"   \/\/ TODO of GSHell\nvar E_DICT   = \"gsh-dict\"   \/\/ Dictionaly of GSHell\n\nfunction bannerElem(){ return document.getElementById(E_BANNER); }\nfunction bannerStyleFunc(){ return bannerElem().style; }\nvar bannerStyle = bannerStyleFunc()\nbannerStyle.backgroundImage = \"url(\"+GSellLogo+\")\";\n\/\/bannerStyle.backgroundImage = \"url(\"+GShellInsideIcon+\")\";\n\/\/bannerStyle.backgroundImage = \"url(\"+GShellFavicon+\")\";\nGMenu.style.backgroundImage = \"url(\"+GShellInsideIcon+\")\";\n\nfunction footerElem(){ return document.getElementById(E_FOOTER); }\nfunction footerStyle(){ return footerElem().sytle; }\nfooterElem().style.backgroundImage=\"url(\"+ITSmoreQR+\")\";\n\/\/footerStyle().backgroundImage = \"url(\"+ITSmoreQR+\")\";\n\nfunction html_fold(e){\n\tif( e.innerHTML == \"Fold\" ){\n\t\te.innerHTML = \"Unfold\"\n\t\tdocument.getElementById('gsh-menu-exit').innerHTML=\"\"\n\t\tdocument.getElementById('GshStatement').open=false\n\t\tGshFeatures.open = false\n\t\tdocument.getElementById('html-src').open=false\n\t\tdocument.getElementById(E_GINDEX).open=false\n\t\tdocument.getElementById(E_GOCODE).open=false\n\t\tdocument.getElementById(E_TODO).open=false\n\t\tdocument.getElementById('references').open=false\n\t}else{\n\t\te.innerHTML = \"Fold\"\n\t\tdocument.getElementById('GshStatement').open=true\n\t\tGshFeatures.open = true\n\t\tdocument.getElementById(E_GINDEX).open=true\n\t\tdocument.getElementById(E_GOCODE).open=true\n\t\tdocument.getElementById(E_TODO).open=true\n\t\tdocument.getElementById('references').open=true\n\t}\n}\nfunction html_pure(e){\n\tif( e.innerHTML == \"Pure\" ){\n\t\tdocument.getElementById('gsh').style.display=true\n\t\t\/\/document.style.display = false\n\t\te.innerHTML = \"Unpure\"\n\t}else{\n\t\tdocument.getElementById('gsh').style.display=false\n\t\t\/\/document.style.display = true\n\t\te.innerHTML = \"Pure\"\n\t}\n}\n\nvar bannerIsStopping = false\n\/\/NOTE: .com\/JSREF\/prop_style_backgroundposition.asp\nfunction shiftBG(){\n\tbannerIsStopping = !bannerIsStopping\n\tbannerStyle.backgroundPosition = \"0 0\";\n}\n\/\/ status should be inherited on Window Fork(), so use the status in DOM\nfunction html_stop(e,toggle){\n\tif( toggle ){\n\t\tif( e.innerHTML == \"Stop\" ){\n\t\t\tbannerIsStopping = true\n\t\t\te.innerHTML = \"Start\"\n\t\t}else{\n\t\t\tbannerIsStopping = false\n\t\t\te.innerHTML = \"Stop\"\n\t\t}\n\t}else{\n\t\t\/\/ update JavaScript variable from DOM status\n\t\tif( e.innerHTML == \"Stop\" ){ \/\/ shown if it's running\n\t\t\tbannerIsStopping = false\n\t\t}else{\n\t\t\tbannerIsStopping = true\n\t\t}\n\t}\n}\nhtml_stop(document.getElementById('GshMenuStop'),false) \/\/ onInit.\n\/\/html_stop(bannerElem(),false) \/\/ onInit.\n\n\/\/https:\/\/www.w3schools.com\/jsref\/met_win_setinterval.asp\nfunction shiftBanner(){\n\tvar now = new Date().getTime();\n\t\/\/\"console.log(\"now=\"+(now%10))\n\tif( !bannerIsStopping ){\n\t\tbannerStyle.backgroundPosition = ((now\/10)%100000)+\" 0\";\n\t}\n}\nwindow.setInterval(shiftBanner,10); \/\/ onInit.\n\n\/\/  <a href=\"https:\/\/developer.mozilla.org\/ja\/docs\/Web\/API\/Window\/open\">window.open()<\/a>\n\/\/ from embedded html to standalone page\nvar MyChildren = 0\nfunction html_fork(){\n\tGJFactory_Destroy()\n\tMyChildren += 1\n\tWinId = document.getElementById('gsh-WinId').innerHTML + \".\" + MyChildren;\n\tnewwin = window.open(\"\",WinId,\"\");\n\tsrc = document.getElementById(\"gsh\");\n\tsrchtml = src.outerHTML\n\tnewwin.document.write(\"\/*<\"+\"html>\\n\");\n\tnewwin.document.write(srchtml);\n\tnewwin.document.write(\"<\"+\"\/html>\\n\");\n\tnewwin.document.getElementById('gsh-menu-exit').innerHTML = \"Close\";\n\tnewwin.document.getElementById('gsh-WinId').innerHTML = WinId;\n\tnewwin.document.close();\n\tnewwin.focus();\n}\nfunction html_close(){\n\twindow.close()\n}\nfunction win_jump(win){\n\t\/\/win = window.top;\n\twin = window.openner; \/\/ https:\/\/developer.mozilla.org\/ja\/docs\/Web\/API\/window.opener\n\tif( win == null ){\n\t\tconsole.log(\"jump to window.opener(\"+win+\")(Error)\\n\")\n\t}else{\n\t\tconsole.log(\"jump to window.opener(\"+win+\")\\n\")\n\t\twin.focus();\n\t}\n}\n\n\/\/ 0.2.9 2020-0902 created chekcsum of HTML\nCRC32UNIX = 0x04C11DB7 \/\/ Unix cksum\nfunction byteCRC32add(bigcrc,octstr,octlen){ \n\tvar crc = new Int32Array(1)\n\tcrc[0] = bigcrc\n\n\tlet oi = 0\n\tfor( ; oi < octlen; oi++ ){\n\t\tvar oct = new Int8Array(1)\n\t\toct[0] = octstr[oi]\n\t\tfor( bi = 0; bi < 8; bi++ ){\n\t\t\t\/\/console.log(\"--CRC32 \"+crc[0]+\" \"+oct[0].toString(16)+\" [\"+oi+\".\"+bi+\"]\\n\")\n\t\t\tovf1 = crc[0] < 0 ? 1 : 0\n\t\t\tovf2 = oct[0] < 0 ? 1 : 0\n\t\t\tovf = ovf1 ^ ovf2\n\t\t\toct[0] <<= 1\n\t\t\tcrc[0] <<= 1\n\t\t\tif( ovf ){ crc[0] ^= CRC32UNIX }\n\t\t}\n\t}\n\t\/\/console.log(\"--CRC32 byteAdd return crc=\"+crc[0]+\",\"+oi+\"\/\"+octlen+\"\\n\")\n\treturn crc[0];\n}\nfunction strCRC32add(bigcrc,stri,strlen){ \n\tvar crc = new Uint32Array(1)\n\tcrc[0] = bigcrc\n\tvar code = new Uint8Array(strlen);\n\tfor( i = 0; i < strlen; i++){\n\t\tcode[i] = stri.charCodeAt(i) \/\/ not charAt() !!!!\n\t\t\/\/console.log(\"=== \"+code[i].toString(16)+\" <<== \"+stri[i]+\"\\n\")\n\t}\n\tcrc[0] = byteCRC32add(crc,code,strlen)\n\t\/\/console.log(\"--CRC32 strAdd return crc=\"+crc[0]+\"\\n\")\n\treturn crc[0]\n}\nfunction byteCRC32end(bigcrc,len){\n\tvar crc = new Uint32Array(1)\n\tcrc[0] = bigcrc\n\tvar slen = new Uint8Array(4)\n\tlet li = 0\n        for( ; li < 4; ){\n                slen[li] = len\n\t\tli += 1\n                len >>= 8\n                if( len == 0 ){\n                        break\n\t\t}\n        }\n        crc[0] = byteCRC32add(crc[0],slen,li)\n        crc[0] ^= 0xFFFFFFFF\n        return crc[0]\n}\nfunction strCRC32(stri,len){\n\tvar crc = new Uint32Array(1)\n\tcrc[0] = 0\n\tcrc[0] = strCRC32add(0,stri,len)\n\tcrc[0] = byteCRC32end(crc[0],len)\n\t\/\/console.log(\"--CRC32 \"+crc[0]+\" \"+len+\"\\n\")\n\treturn crc[0]\n}\n\nDestroyGJLink = null; \/\/ to be replaced\n\nfunction getSourceText(){\n\tversion = document.getElementById('GshVersion').innerHTML\n\tsfavico = document.getElementById('GshFaviconURL').href;\n\tsbanner = document.getElementById('GshBanner').style.backgroundImage;\n\tspositi = document.getElementById('GshBanner').style.backgroundPosition;\n\tsfooter = document.getElementById('GshFooter').style.backgroundImage;\n\n\tif( document.getElementById('GJC_1') != null ){ GJC_1.remove() }\n\tif( DestroyGJLink != null ) DestroyGJLink();\n\n\t\/\/ these should be removed by CSS selector or class, after sevaed to non-printed attribute\n\tGshBanner.removeAttribute('style');\n\tGshFooter.removeAttribute('style');\n\tdocument.getElementById('GshMenuSign').removeAttribute(\"style\");\n\tstyleGMenu = GMenu.getAttribute(\"style\")\n\tGMenu.removeAttribute(\"style\");\n\tstyleGStat = GStat.getAttribute(\"style\")\n\tGStat.removeAttribute(\"style\");\n\tstyleGTop = GTop.getAttribute(\"style\")\n\tGTop.removeAttribute(\"style\");\n\tstyleGshGrid = GshGrid.getAttribute(\"style\")\n\tGshGrid.removeAttribute(\"style\");\n\t\/\/styleGPos = GPos.getAttribute(\"style\");\n\t\/\/GPos.removeAttribute(\"style\");\n\t\/\/GPos.innerHTML = \"\";\n\t\/\/styleGLog = GLog.getAttribute(\"style\");\n\t\/\/GLog.removeAttribute(\"style\");\n\t\/\/GLog.innerHTML = \"\";\n\tstyleGShellPlane = GShellPlane.getAttribute(\"style\")\n\tGShellPlane.removeAttribute(\"style\")\n\tstyleRawTextViewer = RawTextViewer.getAttribute(\"style\")\n\tRawTextViewer.removeAttribute(\"style\")\n\tstyleRawTextViewerClose = RawTextViewerClose.getAttribute(\"style\")\n\tRawTextViewerClose.removeAttribute(\"style\")\n\n\tGshFaviconURL.href = \"\";\n\n\t\/\/it seems that interHTML and outerHTML generate style=\"\" for these (??)\n\t\/\/GshBanner.removeAttribute('style');\n\t\/\/GshFooter.removeAttribute('style');\n\t\/\/GshMenuSign.removeAttribute('style');\n\tGshBanner.style=\"\"\n\tGshFooter.style=\"\"\n\tGshMenuSign.style=\"\"\n\n\ttextarea = document.createElement(\"textarea\")\n\tsrchtml = document.getElementById(\"gsh\").outerHTML;\n\t\t\/\/textarea = document.createElement(\"textarea\")\n\t\t\/\/ 2020-0910 ?? ... this causes inserting style=\"\" to Banner and Footer,\n\t\t\/\/ with Chromium?\/ after reloading from file:\/\/\/\n\t\ttextarea.innerHTML = srchtml\n\t\/\/ <a href=\"https:\/\/stackoverflow.com\/questions\/5796718\/html-entity-decode\">Thanks<\/a>\n\t\tvar rawtext = textarea.value\n\t\t\/\/textarea.destroy()\n\t\t\/\/rawtext = gsh.textContent \/\/ this removes #include <FILENAME> too\n\t\tvar orgtext = \"\"\n\t\t + \"\/*<\"+\"html>\\n\"\t\/\/ lost preamble text\n\t\t + rawtext\n\t\t + \"<\"+\"\/html>\\n\"\t\/\/ lost trail text\n\t\t;\n\n\ttlen = orgtext.length\n\t\/\/console.log(\"getSourceText: length=\"+tlen+\"\\n\")\n\tdocument.getElementById('GshFaviconURL').href                 = sfavico;\n\n\tdocument.getElementById('GshBanner').style.backgroundImage    = sbanner;\n\tdocument.getElementById('GshBanner').style.backgroundPosition = spositi;\n\tdocument.getElementById('GshFooter').style.backgroundImage    = sfooter;\n\n\tGStat.setAttribute(\"style\",styleGStat)\n\tGMenu.setAttribute(\"style\",styleGMenu)\n\tGTop.setAttribute(\"style\",styleGTop)\n\t\/\/GLog.setAttribute(\"style\",styleGLog)\n\t\/\/GPos.setAttribute(\"style\",styleGPos)\n\tGshGrid.setAttribute(\"style\",styleGshGrid)\n\tGShellPlane.setAttribute(\"style\",styleGShellPlane)\n\tRawTextViewer.setAttribute(\"style\",styleRawTextViewer)\n\tRawTextViewerClose.setAttribute(\"style\",styleRawTextViewerClose)\n\tcanontext = orgtext.replace(' style=\"\"','')\n\t\/\/ open=\"\" too\n\treturn canontext\n}\nfunction getDigest(){\n\tvar text = \"\"\n\ttext = getSourceText()\n\tvar digest = \"\"\n\ttlen = text.length\n\tdigest = strCRC32(text,tlen) + \" \" + tlen\n\treturn { text, digest }\n}\nfunction html_digest(){\n\tversion = document.getElementById('GshVersion').innerHTML\n\tlet {text, digest} = getDigest()\n\talert(\"cksum: \" + digest + \" \" + version)\n}\nfunction charsin(stri,char){\n\tln = 0;\n\tfor( i = 0; i < stri.length; i++ ){\n\t\tif( stri.charCodeAt(i) == char.charCodeAt(0) )\n\t\t\tln++;\n\t}\n\treturn ln;\n}\n\n\/\/class digestElement extends HTMLElement { }\n\/\/< script>customElements.define('digest',digestElement)< \/script>\nfunction showDigest(e){\n\tresult = 'version=' + GshVersion.innerHTML + '\\n'\n\tresult += 'lines='   + e.dataset.lines   + '\\n'\n\t\t+ 'length='  + e.dataset.length  + '\\n'\n\t\t+ 'crc32u='  + e.dataset.crc32u  + '\\n'\n\t\t+ 'time='    + e.dataset.time    + '\\n';\n\n\talert(result)\n}\n\nfunction html_sign(e){\n\tif( RawTextViewer.style.zIndex == 1000 ){\n\t\thideRawTextViewer()\n\t\treturn\n\t}\n\tGJFactory_Destroy()\n\tif( DestroyGJLink != null ) DestroyGJLink();\n\t\/\/gsh_digest_.innerHTML = \"\";\n\ttext = getSourceText() \/\/ the original text\n\ttlen = text.length\n\tdigest = strCRC32(text,tlen)\n\t\/\/gsh_digest_.innerHTML = digest + \" \" + tlen\n\t\/\/text = getSourceText() \/\/ the text with its digest\n\tLines = charsin(text,'\\n')\n\n\tname = \"gsh\"\n\tsid = name + \"-digest\"\n\td = new Date()\n\tsignedAt = d.getTime()\n\n\tsign = '\/'+'*<'+'span\\n'\n\t\t+ ' id=\"' + sid + '\"\\n'\n\t\t+ ' class=\"_digest_\"\\n'\n\t\t+ ' data-target-id=\"'+name+'\"\\n'\n\t\t+ ' data-crc32u=\"'  + digest    + '\"\\n'\n\t\t+ ' data-length=\"'  + tlen      + '\"\\n'\n\t\t+ ' data-lines=\"'   + Lines     + '\"\\n'\n\t\t+ ' data-time=\"'    + signedAt  + '\"\\n'\n\t\t+ ' ><' + '\/span>\\n*'+'\/\\n'\n\n\ttext = sign + text\n\n\ttxthtml = '<' + 'table id=\"LineNumbered\"><' + 'tr><' + 'td>'\n\t\t+ '<' + 'textarea cols=5 rows=' + Lines + ' class=\"LineNumber\">'\n\tfor( i = 1; i <= Lines; i++ ){\n\t\ttxthtml += i.toString() + '\\n'\n\t}\n\ttxthtml += \"\"\n\t\t+ '<' + '\/textarea>'\n\t\t+ '<' + '\/td><' + 'td>'\n\t\t+ '<' + 'textarea cols=150 rows=' + Lines + 'spellcheck=\"false\"'\n\t\t+ ' class=\"LineNumbered\">'\n\t\t+ text + '<'+'\/textarea>'\n\t\t+ '<' + '\/td><' + '\/tr><' + '\/table>'\n\n\tfor( i = 1; i <= 30; i++ ){\n\t\ttxthtml += '<br>\\n'\n\t}\n\tRawTextViewer.innerHTML = txthtml\n\n\tbtn = e\n\te.style.color = \"rgba(128,128,255,0.9)\";\n\ty = e.getBoundingClientRect().top.toFixed(0)\n\t\/\/h = e.getBoundingClientRect().height.toFixed(0)\n\tRawTextViewer.style.top = Number(y) + 30\n\tRawTextViewer.style.left = 100;\n\tRawTextViewer.style.height = window.innerHeight - 20;\n\t\/\/RawTextViewer.style.Opacity = 1.0;\n   \t\/\/RawTextViewer.style.backgroundColor = \"rgba(0,0,0,0.0)\";\n   \tRawTextViewer.style.backgroundColor = \"rgba(255,255,255,0.8)\";\n\tRawTextViewer.style.zIndex = 1000;\n   \tRawTextViewer.style.display = true;\n\n\tif( RawTextViewerClose.style == null ){\n\t\tRawTextViewerClose.style = \"\";\n\t}\n\tRawTextViewerClose.style.top = Number(y) + 10\n\tRawTextViewerClose.style.left = 100;\n\tRawTextViewerClose.style.zIndex = 1001;\n\n\tScrollToElement(CurElement,RawTextViewerClose)\n}\nfunction hideRawTextViewer(){\n\tRawTextViewer.style.left = 10000;\n\tRawTextViewer.style.zIndex = -100;\n\tRawTextViewer.style.Opacity = 0.0;\n\tRawTextViewer.style = null\n\tRawTextViewer.innerHTML = \"\";\n\n\tGshMenuSign.style.color = \"rgba(255,128,128,1.0)\";\n\tRawTextViewerClose.style.top = 0;\n\tRawTextViewerClose.style = null\n}\n\n\/\/ source code viewr\nfunction frame_close(){\n\tsrcframe = document.getElementById(\"src-frame\");\n\tsrcframe.innterHTML = \"\";\n\t\/\/srcframe.style.cols = 1;\n\tsrcframe.style.rows = 1;\n\tsrcframe.style.height = 0;\n\tsrcframe.style.display = false;\n\tsrc = document.getElementById(\"src-frame-textarea\");\n\tsrc.innerHML = \"\"\n\t\/\/src.cols = 0\n\tsrc.rows = 0\n\tsrc.display = false\n\t\/\/alert(\"--closed--\")\n}\n\/\/<!-- | <span onclick=\"html_view();\">Source<\/span> -->\n\/\/<!-- | <span onclick=\"frame_close();\">SourceClose<\/span> -->\n\/\/<!--| <span>Download<\/span> -->\nfunction frame_open(){\n\tdocument.getElementById('GshFaviconURL').href = \"\";\n\toldsrc = document.getElementById(\"GENSRC\");\n\tif( oldsrc != null ){\n\t\t\/\/alert(\"--I--(erasing old text)\")\n\t\toldsrc.innterHTML = \"\";\n\t\treturn\n\t}else{\n\t\t\/\/alert(\"--I--(no old text)\")\n\t}\n\tstyleBanner = GshBanner.getAttribute(\"style\")\n\tGshBanner.removeAttribute(\"style\")\n\tstyleFooter = GshFooter.getAttribute(\"style\")\n\tGshFooter.removeAttribute(\"style\")\n\tif( document.getElementById('GJC_1') ){ GJC_1.remove() }\n\n\tGshFaviconURL.href = \"\";\n\tGStat.removeAttribute('style')\n\tGshGrid.removeAttribute('style')\n\tGshMenuSign.removeAttribute('style')\n\t\/\/GPos.removeAttribute('style')\n\t\/\/GPos.innerHTML = \"\";\n\t\/\/GLog.removeAttribute('style')\n\t\/\/GLog.innerHTML = \"\";\n\tGMenu.removeAttribute('style')\n\tGTop.removeAttribute('style')\n\tGShellPlane.removeAttribute('style')\n\tRawTextViewer.removeAttribute('style')\n\tRawTextViewerClose.removeAttribute('style')\n\n\tif( DestroyGJLink != null ) DestroyGJLink();\n\tGJFactory_Destroy()\n\n\tsrc = document.getElementById(\"gsh\");\n\tsrchtml = src.outerHTML\n\tsrcframe = document.getElementById(\"src-frame\");\n\tsrcframe.innerHTML = \"\"\n\t + \"<\"+\"cite id=\\\"GENSRC\\\">\\n\"\n\t + \"<\"+\"style>\\n\"\n\t + \"#GENSRC textarea{tab-size:4;}\\n\"\n\t + \"#GENSRC textarea{-o-tab-size:4;}\\n\"\n\t + \"#GENSRC textarea{-moz-tab-size:4;}\\n\"\n\t + \"#GENSRC textarea{spellcheck:false;}\\n\"\n\t + \"<\/\"+\"style>\\n\"\n\t + \"<\"+'textarea id=\"src-frame-textarea\" cols=100 rows=20 class=\"gsh-code\">'\n\t + \"\/*<\"+\"html>\\n\"\t\/\/ lost preamble text\n\t + srchtml\n\t + \"<\"+\"\/html>\\n\"\t\/\/ lost trail text\n\t + \"<\/\"+\"textarea>\\n\"\n\t + \"<\/\"+\"cite><!-- GENSRC -->\\n\";\n\n\t\/\/srcframe.style.cols = 80;\n\t\/\/srcframe.style.rows = 80;\n\n\tGshBanner.setAttribute('style',styleBanner)\n\tGshFooter.setAttribute('style',styleFooter)\n}\nfunction fill_CSSView(){\n\tpart = document.getElementById('GshStyleDef')\n\tview = document.getElementById('gsh-style-view')\n\tview.innerHTML = \"\"\n\t + \"<\"+'textarea cols=100 rows=20 class=\"gsh-code\">'\n\t + part.innerHTML\n\t + \"<\"+\"\/textarea>\"\n}\nfunction fill_JavaScriptView(){\n\tjspart = document.getElementById('gsh-script')\n\tview = document.getElementById('gsh-script-view')\n\tview.innerHTML = \"\"\n\t + \"<\"+'textarea cols=100 rows=20 class=\"gsh-code\">'\n\t + jspart.innerHTML\n\t + \"<\"+\"\/textarea>\"\n}\nfunction fill_DataView(){\n\tpart = document.getElementById('gsh-data')\n\tview = document.getElementById('gsh-data-view')\n\tview.innerHTML = \"\"\n\t + \"<\"+'textarea cols=100 rows=20 class=\"gsh-code\">'\n\t + part.innerHTML\n\t + \"<\"+\"\/textarea>\"\n}\nfunction jumpto_StyleView(){\n\tjsview = document.getElementById('html-src')\n\tjsview.open = true\n\tjsview = document.getElementById('gsh-style-frame')\n\tjsview.open = true\n\tfill_CSSView()\n}\nfunction jumpto_JavaScriptView(){\n\tjsview = document.getElementById('html-src')\n\tjsview.open = true\n\tjsview = document.getElementById('gsh-script-frame')\n\tjsview.open = true\n\tfill_JavaScriptView()\n}\nfunction jumpto_DataView(){\n\tjsview = document.getElementById('html-src')\n\tjsview.open = true\n\tjsview = document.getElementById('gsh-data-frame')\n\tjsview.open = true\n\tfill_DataView()\n}\nfunction jumpto_WholeView(){\n\tjsview = document.getElementById('html-src')\n\tjsview.open = true\n\tjsview = document.getElementById('gsh-whole-view')\n\tjsview.open = true\n\tframe_open()\n}\nfunction html_view(){\n\thtml_stop();\n\n\tbanner = document.getElementById('GshBanner').style.backgroundImage;\n\tfooter = document.getElementById('GshFooter').style.backgroundImage;\n\tdocument.getElementById('GshBanner').style.backgroundImage = \"\";\n\tdocument.getElementById('GshBanner').style.backgroundPosition = \"\";\n\tdocument.getElementById('GshFooter').style.backgroundImage = \"\";\n\n\t\/\/srcwin = window.open(\"\",\"CodeView2\",\"\");\n\tsrcwin = window.open(\"\",\"\",\"\");\n\tsrcwin.document.write(\"<span id=\\\"gsh\\\">\\n\");\n\n\tsrc = document.getElementById(\"gsh\");\n\tsrcwin.document.write(\"<\"+\"style>\\n\");\n\tsrcwin.document.write(\"textarea{tab-size:4;}\\n\");\n\tsrcwin.document.write(\"textarea{-o-tab-size:4;}\\n\");\n\tsrcwin.document.write(\"textarea{-moz-tab-size:4;}\\n\");\n\tsrcwin.document.write(\"<\/style>\\n\");\n\tsrcwin.document.write(\"<h2>\\n\");\n\tsrcwin.document.write(\"<\"+\"span onclick=\\\"window.close();\\\">Close<\/span> | \\n\");\n\t\/\/srcwin.document.write(\"<\"+\"span onclick=\\\"html_stop();\\\">Run<\/span>\\n\");\n\tsrcwin.document.write(\"<\/h2>\\n\");\n\tsrcwin.document.write(\"<\"+\"textarea id=\\\"gsh-src-src\\\" cols=100 rows=60>\");\n\tsrcwin.document.write(\"\/*<\"+\"html>\\n\");\n\tsrcwin.document.write(\"<\"+\"span id=\\\"gsh\\\">\");\n\tsrcwin.document.write(src.innerHTML);\n\tsrcwin.document.write(\"<\"+\"\/span><\"+\"\/html>\\n\");\n\tsrcwin.document.write(\"<\/\"+\"textarea>\\n\");\n\n\tdocument.getElementById('GshBanner').style.backgroundImage = banner;\n\tdocument.getElementById('GshFooter').style.backgroundImage = footer\n\n\tsty = document.getElementById(\"GshStyleDef\");\n\tsrcwin.document.write(\"<\"+\"style>\\n\");\n\tsrcwin.document.write(sty.innerHTML);\n\tsrcwin.document.write(\"<\"+\"\/style>\\n\");\n\n\trun = document.getElementById(\"gsh-script\");\n\tsrcwin.document.write(\"<\"+\"script>\\n\");\n\tsrcwin.document.write(run.innerHTML);\n\tsrcwin.document.write(\"<\"+\"\/script>\\n\");\n\n\tsrcwin.document.write(\"<\"+\"\/span><\"+\"\/html>\\n\"); \/\/ gsh span\n\tsrcwin.document.close();\n\tsrcwin.focus();\n}\nGSH = document.getElementById(\"gsh\")\n\n\/\/GSH.onclick = \"alert('Ouch!')\"\n\/\/GSH.css = \"{background-color:#eef;}\"\n\/\/GSH.style = \"background-color:#eef;\"\n\/\/GSH.style.display = false;\n\/\/alert('Ouch0!')\n\/\/GSH.style.display = true;\n\n\/\/ 2020-0904 created, tentative\ndocument.addEventListener('keydown',jgshCommand);\n\/\/CurElement = GshStatement\nCurElement = GshMenu\nMemElement = GshMenu\n\nfunction nextSib(e){\n\tn = e.nextSibling;\n\tfor( i = 0; i < 100; i++ ){\n\t\tif( n == null ){\n\t\t\tbreak;\n\t\t}\n\t\tif( n.nodeName == \"DETAILS\" ){\n\t\t\treturn n;\n\t\t}\n\t\tn = n.nextSibling;\n\t}\n\treturn null;\n}\nfunction prevSib(e){\n\tn = e.previousSibling;\n\tfor( i = 0; i < 100; i++ ){\n\t\tif( n == null ){\n\t\t\tbreak;\n\t\t}\n\t\tif( n.nodeName == \"DETAILS\" ){\n\t\t\treturn n;\n\t\t}\n\t\tn = n.previousSibling;\n\t}\n\treturn null;\n}\nfunction setColor(e,eName,eColor){\n\tif( e.hasChildNodes() ){\n\t\ts = e.childNodes;\n\t\tif( s != null ){\n\t\t\tfor( ci = 0; ci < s.length; ci++ ){\n\t\t\t\tif( s[ci].nodeName == eName ){\n\t\t\t\t\ts[ci].style.color = eColor;\n\t\t\t\t\t\/\/s[ci].style.backgroundColor = eColor;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\/\/ https:\/\/docs.microsoft.com\/en-us\/previous-versions\/\/hh781509(v=vs.85)\nfunction showCurElementPosition(ev){\n\/\/\tif( document.getElementById(\"GPos\") == null ){\n\/\/\t\treturn;\n\/\/\t}\n\/\/\tif( GPos == null ){\n\/\/\t\treturn;\n\/\/\t}\n\te = CurElement\n\ty = e.getBoundingClientRect().top.toFixed(0)\n\tx = e.getBoundingClientRect().left.toFixed(0)\n\n\th = ev + \" \"\n\th += 'y='+y+\", \"+ 'x='+x+\" -- \"\n\th += \"w=\" + window.innerWidth + \", h=\" + window.innerHeight + \" -- \"\n\t\/\/GPos.test = h\n\t\/\/GPos.innerHTML = h\n\/\/\tGPos.innerHTML = h\n}\n\nfunction DateShort(){\n\td = new Date()\n\treturn\td.getFullYear() + \"\/\" + d.getMonth() + \"\/\" + d.getDate() + \" \"\n\t\t+ d.getHours() + \":\" + d.getMinutes() + \":\" + d.getSeconds()\n}\nfunction DateLong(){\n\td = new Date()\n\treturn\td.getFullYear() + \"\/\" + d.getMonth() + \"\/\" + d.getDate() + \" \"\n\t\t+ d.getHours() + \":\" + d.getMinutes() + \":\" + d.getSeconds()\n\t\t+ \".\" + d.getMilliseconds()\n\t\t+ \" \" + d.getTimezoneOffset()\/60\n\t\t+ \" \"\n\t\t+ d.getTime()  + \".\" + d.getMilliseconds()\n\n}\nfunction GShellMenu(e){\n\t\/\/GLog.innerHTML = \"Hello, World! (\" + DateLong() + \")\"\n\tshowGShellPlane()\n}\n\/\/ placements of planes\nfunction GShellResizeX(ev){\n\t\/\/if( document.getElementById(\"GMenu\") != null ){\n\t\tGMenu.style.left = window.innerWidth - 100\n\t\tGMenu.style.top = window.innerHeight - 90 - 200\n\t\t\/\/console.log(\"place GMENU \"+GMenu.style.left+\" \"+GMenu.style.top)\n\n\t\/\/}\n\tGStat.style.width = window.innerWidth\n\t\/\/if( document.getElementById(\"GPos\") != null ){\n\t\t\/\/GPos.style.width = window.innerWidth\n\t\t\/\/GPos.style.top = window.innerHeight - 30; \/\/GPos.style.height\n\t\/\/}\n\t\/\/if( document.getElementById(\"GLog\") != null ){\n\t\/\/\tGLog.style.width = window.innerWidth\n\t\t\/\/GLog.innerHTML = \"\"\n\t\/\/}\n\t\/\/if( document.getElementById(\"GLog\") != null ){\n\t\t\/\/GLog.innerHTML = \"Resize: w=\" + window.innerWidth +\n\t\t\/\/\", h=\" + window.innerHeight\n\t\/\/}\n\tshowCurElementPosition(ev)\n}\nfunction GShellResize(){\n\tGShellResizeX(\"[RESIZE]\")\n}\nwindow.onresize = GShellResize\nvar prevNode = null\nfunction GJSH_OnMouseMove(ev){\n\tx = ev.clientX\n\ty = ev.clientY\n\td = new Date()\n\tt = d.getTime() \/ 1000\n\tif( document.elementFromPoint ){\n\t\te = document.elementFromPoint(x,y)\n\t\tif( e != null ){\n\t\t\tif( e == prevNode ){\n\t\t\t}else{\n\t\t\t\tconsole.log(t+'('+x+','+y+') '\n\t\t\t\t\t+e.nodeType+' '+e.tagName+'#'+e.id)\n\t\t\t\tprevNode = e\n\t\t\t}\n\t\t}else{\n\t\t\tconsole.log(t+'('+x+','+y+') no element')\n\t\t}\n\t}else{\n\t\tconsole.log(t+'('+x+','+y+') no elementFromPoint')\n\t}\n}\nwindow.addEventListener('mousemove',GJSH_OnMouseMove);\n\nfunction GJSH_OnMouseMoveScreen(ev){\n\tx = ev.screenX\n\ty = ev.screenY\n\td = new Date()\n\tt = d.getTime() \/ 1000\n\tconsole.log(t+'('+x+','+y+') no elementFromPoint')\n}\n\/\/screen.addEventListener('mousemove',GJSH_OnMouseMoveScreen);\n\nfunction ScrollToElement(oe,ne){\n\tne.scrollIntoView()\n\tny = ne.getBoundingClientRect().top.toFixed(0)\n\tnx = ne.getBoundingClientRect().left.toFixed(0)\n\t\/\/GLog.innerHTML = \"[\"+ny+\",\"+nx+\"]\"\n\t\/\/window.scrollTo(0,0)\n\n\tGTop.style.backgroundColor = \"rgba(0,0,0,0.0)\"\n\tGshGrid.style.left = '250px';\n\tGshGrid.style.zIndex = 0\n\tif( false ){\n\t\toy = oe.getBoundingClientRect().top.toFixed(0)\n\t\tox = oe.getBoundingClientRect().left.toFixed(0)\n\t\ty = e.getBoundingClientRect().top.toFixed(0)\n\t\tx = e.getBoundingClientRect().left.toFixed(0)\n\t\twindow.scrollTo(x,y)\n\t\tny = e.getBoundingClientRect().top.toFixed(0)\n\t\tnx = e.getBoundingClientRect().left.toFixed(0)\n\t\t\/\/GLog.innerHTML = \"[\"+oy+\",\"+ox+\"]->[\"+y+\",\"+x+\"]->[\"+ny+\",\"+nx+\"]\"\n\t}\n}\nfunction showGShellPlane(){\n\tif( GShellPlane.style.zIndex == 0 ){\n\t\tGShellPlane.style.zIndex = 1000;\n\t\tGShellPlane.style.left = 30;\n\t\tGShellPlane.style.height = 320;\n\t\tGShellPlane.innerHTML = DateLong() + \"<br>\" +\n\t\t\t\"-- History --<br>\" + MyHistory;\n\t}else{\n\t\tGShellPlane.style.zIndex = 0;\n\t\tGShellPlane.style.left = 0;\n\t\tGShellPlane.style.height = 50;\n\t\tGShellPlane.innerHTML = \"\";\n\t}\n}\nvar SuppressGJShell = false\nfunction jgshCommand(kevent){\n\tif( SuppressGJShell ){\n\t\treturn\n\t}\n\tkey = kevent\n\tkeycode = key.code\n\t\/\/GStat.style.width = window.innerWidth\n\tGStat.style.backgroundColor = \"rgba(0,0,0,0.4)\"\n\n\tconsole.log(\"JSGsh-Key:\"+keycode+\"(^-^)\/\/\")\n\tif( keycode == \"Slash\" ){\n\t\tconsole.log('('+x+','+y+') ')\n\t\te = document.elementFromPoint(x,y)\n\t\tconsole.log('('+x+','+y+') '+e.nodeType+' '+e.tagName+'#'+e.id)\n\t}else\n\tif( keycode == \"Digit0\" ){ \/\/ fold side-bar\n\t\t\/\/ \"Zero page\"\n\t\tshowGShellPlane();\n\t}else\n\tif( keycode == \"Digit1\" ){ \/\/ fold side-bar\n\t\tprimary.style.width = \"94%\"\n\t\tsecondary.style.width = \"0%\"\n\t\tsecondary.style.opacity = 0\n\t\tGStat.innerHTML = \"[Single Column View]\"\n\t}else\n\tif( keycode == \"Digit2\" ){ \/\/ unfold side-bar\n\t\tprimary.style.width = \"58%\"\n\t\tsecondary.style.width = \"36%\"\n\t\tsecondary.style.opacity = 1\n\t\tGStat.innerHTML = \"[Double Column View]\"\n\t}else\n\tif( keycode == \"KeyU\" ){ \/\/ fold\/unfold all\n\t\thtml_fold(GshMenuFold);\n\t\tlocation.href = \"#\"+CurElement.id;\n\t}else\n\tif( keycode == \"KeyO\" || keycode == \"ArrowRight\" ){ \/\/ fold the element\n\t\tCurElement.open = !CurElement.open;\n\t}else\n\tif( keycode == \"ArrowRight\" ){ \/\/ unfold the element\n\t\tCurElement.open = true\n\t}else\n\tif( keycode == \"ArrowLeft\" ){ \/\/ unfold the element\n\t\tCurElement.open = false\n\t}else\n\tif( keycode == \"KeyI\" ){ \/\/ inspect the element\n\t\te = CurElement\n\t\t\/\/GLog.innerHTML =\n\t\tGJLog_append(\"Current Element: \" + e + \"<br>\"\n\t\t\t+ \"name=\"+e.nodeName + \", \"\n\t\t\t+ \"id=\"+e.id + \", \"\n\t\t\t+ \"children=\"+e.childNodes.length + \", \"\n\t\t\t+ \"parent=\"+e.parentNode.id + \"<br>\"\n\t\t\t+ \"text=\"+e.textContent)\n\t\tGStat.style.backgroundColor = \"rgba(0,0,0,0.8)\"\n\t\treturn\n\t}else\n\tif( keycode == \"KeyM\" ){ \/\/ memory the position\n\t\tMemElement = CurElement\n\t}else\n\tif( keycode == \"KeyN\" || keycode == \"ArrowDown\" ){ \/\/ next element\n\t\te = nextSib(CurElement)\n\t\tif( e != null ){\n\t\t\tsetColor(CurElement,\"SUMMARY\",\"#fff\")\n\t\t\tsetColor(e,\"SUMMARY\",\"#8f8\") \/\/ should be complement ?\n\t\t\toe = CurElement\n\t\t\tCurElement = e\n\t\t\t\/\/location.href = \"#\"+e.id;\n\t\t\tScrollToElement(oe,e)\n\t\t}\n\t}else\n\tif( keycode == \"KeyP\" || keycode == \"ArrowUp\" ){ \/\/ previous element\n\t\toe = CurElement\n\t\te = prevSib(CurElement)\n\t\tif( e != null ){\n\t\t\tsetColor(CurElement,\"SUMMARY\",\"#fff\")\n\t\t\tsetColor(e,\"SUMMARY\",\"#8f8\") \/\/ should be complement ?\n\t\t\tCurElement = e\n\t\t\t\/\/location.href = \"#\"+e.id;\n\t\t\tScrollToElement(oe,e)\n\t\t}else{\n\t\t\te = document.getElementById(\"GshBanner\")\n\t\t\tif( e != null ){\n\t\t\t\tsetColor(CurElement,\"SUMMARY\",\"#fff\")\n\t\t\t\tCurElement = e\n\t\t\t\tScrollToElement(oe,e)\n\t\t\t}else{\n\t\t\t\te = document.getElementById(\"primary\")\n\t\t\t\tif( e != null ){\n\t\t\t\t\tsetColor(CurElement,\"SUMMARY\",\"#fff\")\n\t\t\t\t\tCurElement = e\n\t\t\t\t\tScrollToElement(oe,e)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else\n\tif( keycode == \"KeyR\" ){\n\t\tlocation.reload()\n\t}else\n\tif( keycode == \"KeyJ\" ){\n\t\tGshGrid.style.top = '120px';\n\t\tGshGrid.innerHTML = '(>_<){Down}';\n\t}else\n\tif( keycode == \"KeyK\" ){\n\t\tGshGrid.style.top = '0px';\n\t\tGshGrid.innerHTML = '(^-^){Up}';\n\t}else\n \tif( keycode == \"KeyH\" ){\n\t\tGshGrid.style.left = '0px';\n\t\tGshGrid.innerHTML = \"('_'){Left}\";\n\t}else\n\tif( keycode == \"KeyL\" ){\n\t\t\/\/GLog.innerHTML +=\n\t\tGJLog_append(\n\t\t\t'screen='+screen.width+'px'+'<br>'+\n\t\t\t'window='+window.innerWidth+'px'+'<br>'\n\t\t)\n\t\tGshGrid.style.left = (document.documentElement.clientWidth-160).toString(10)+'px';\n\t\tGshGrid.innerHTML = '(@_@){Right}';\n\t}else\n\tif( keycode == \"KeyS\" ){\n\t\thtml_stop(GshMenuStop,true)\n\t}else\n\tif( keycode == \"KeyF\" ){\n\t\thtml_fork()\n\t}else\n\tif( keycode == \"KeyC\" ){\n\t\twindow.close()\n\t}else\n\tif( keycode == \"KeyD\" ){\n\t\thtml_digest()\n\t}else\n\tif( keycode == \"KeyV\" ){\n\t\te = document.getElementById('gsh-digest')\n\t\tif( e != null ){\n\t\t\tshowDigest(e)\n\t\t}\n\t}\n\n\tshowCurElementPosition(\"[\"+key.code+\"] --\");\n\t\/\/if( document.getElementById(\"GPos\") != null ){\n\t\t\/\/GPos.innerHTML += \"[\"+key.code+\"] --\"\n\t\/\/}\n\t\/\/GShellResizeX(\"[\"+key.code+\"] --\");\n}\nGShellResizeX(\"[INIT]\");\n\nDisplaySize = '-- Display: '+ 'screen='+screen.width+'px, '+'window='+window.innerWidth+'px';\n\nlet {text, digest} = getDigest()\n\/\/GLog.innerHTML +=\nGJLog_append(\n\t'-- GShell: ' + GshVersion.innerHTML + '\\n' +\n\t'-- Digest: ' + digest + '\\n' +\n\tDisplaySize\n\t\/\/+ \"<br>\" + \"-- LastVisit:<br>\" + MyHistory\n)\nGShellResizeX(null);\n\n\/\/ <a href=\"https:\/\/www.w3.org\/TR\/WebCryptoAPI\/\">Web Cryptography API<\/a>\n\/\/Convert a string into an ArrayBuffer\n\/\/from https:\/\/developers.google.com\/web\/updates\/2012\/06\/How-to-convert-ArrayBuffer-to-and-from-String\nfunction str2ab(str) {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst bufView = new Uint8Array(buf);\n\tfor (let i = 0, strLen = str.length; i < strLen; i++) {\n\t\tbufView[i] = str.charCodeAt(i);\n\t}\n\treturn buf;\n}\nfunction importPrivateKey(pem) {\n  const binaryDerString = window.atob(pemContents);\n  const binaryDer = str2ab(binaryDerString);\n  return window.crypto.subtle.importKey(\n    \"pkcs8\",\n    binaryDer,\n    {\n     name: \"RSA-PSS\",\n     modulusLength: 2048,\n     publicExponent: new Uint8Array([1, 0, 1]),\n     hash: \"SHA-256\",\n    },\n    true,\n    [\"sign\"]\n  );\n}\n\/\/importPrivateKey(ppem)\n\n\/\/key = {}\n\/\/buf = \"abc\"\n\/\/enc = \"xyzxxxxxx\"; \/\/crypto.publicEncrypt(key,buf)\n\/\/b64 = btoa(enc)\n\/\/dec = atob(b64)\n\/\/GLog.innerHTML = \"enc:\" + b64 + \", dec:\" + dec\n\n<\/script>\n\n<span id=\"gjc\" data-title=\"GJConsole\" data-author=\"sato@its-more.jp\">\n<!-- ----- GJConsole BEGIN { ----- -->\n<p>\n<span id=\"GJE_RootNode0\"><\/span>\n<\/p>\n<style id=\"GJConsoleStyle\">\n  .GJConsole {\n    z-index:1000;\n    width:400; height:200px;\n    margin:2px;\n    color:#fff; background-color:#66a;\n    font-size:12px; font-family:monospace,Courier New;\n  }\n<\/style>\n\n<script id=\"GJConsoleScript\" class=\"GJConsole\">\n  var PS1 = \"% \"\n  function GJC_Keydown(keyevent){\n\tkey = keyevent.code\n\tif( key == \"Enter\" ){\n\t\tGJC_Command(this)\n\t\tthis.value += \"\\n\" + PS1 \/\/ prompt\n\t}else\n\tif( key == \"Escape\"){\n\t\tSuppressGJShell = false\n\t\tGshMenu.focus() \/\/ should be previous focus\n\t}\n  }\n  var GJC_SessionId\n  function GJC_SetSessionId(){\n\tvar xd = new Date()\n  \tGJC_SessionId = xd.getTime() \/ 1000\n  }\n  GJC_SetSessionId()\n  function GJC_Memory(mem,args,text){\n\targv = args.split(' ')\n\tcmd = argv[0]\n\targv.shift()\n\targs = argv.join(' ')\n\tret = \"\"\n\n\tif( cmd == 'clear' ){\n\t\tPermanent.setItem(mem,'')\n\t}else\n\tif( cmd == 'read' ){\n\t\tret = Permanent.getItem(mem)\n\t}else\n\tif( cmd == 'save' ){\n\t\tval = Permanent.getItem(mem)\n\t\tif( val == null ){ val = \"\" }\n\t\td = new Date()\n\t\tval += d.getTime()\/1000+\" \"+GJC_SessionId+\" \"+document.URL+\" \"+args+\"\\n\"\n\t\tval += text.value\n\t\tPermanent.setItem(mem,val)\n\t}else\n\tif( cmd == 'write' ){\n\t\tval = Permanent.getItem(mem)\n\t\tif( val == null ){ val = \"\" }\n\t\td = new Date()\n\t\tval += d.getTime()\/1000+\" \"+GJC_SessionId+\" \"+document.URL+\" \"+args+\"\\n\"\n\t\tPermanent.setItem(mem,val)\n\t}else{\n\t\tret = \"Commands: write | read | save | clear\"\n\t}\n\treturn ret\n  }\n  \/\/ -- 2020-09-14 added TableEditor\n  var GJE_CurElement = null; \/\/GJE_RootNode\n  GJE_NodeSaved = null\n  GJE_TableNo = 1\n  function GJE_StyleKeyCommand(kev){\n\tkeycode = kev.code\n\tconsole.log('GJE-Key: '+keycode)\n\tif( keycode == 'Escape' ){\n\t\tGJE_SetStyle(this);\n\t}\n\tkev.stopPropagation()\n\t\/\/ https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Event\/stopPropagation\n  }\n  var GJE_CommandMode = false\n  function GJE_TableKeyCommand(kev,tab){\n\twasCmdMode = GJE_CommandMode\n\tkey = kev.code\n\tif( key == 'Escape' ){\n\t\tconsole.log(\"To command mode: \"+tab.nodeName+\"#\"+tab.id)\n\t\t\/\/tab.setAttribute('contenteditable','false')\n\t\ttab.style.caretColor = \"blue\"\n\t\tGJE_CommandMode = true\n\t}else\n\tif( key == \"KeyA\" ){\n\t\ttab.style.caretColor = \"red\"\n\t\tGJE_CommandMode = false\n\t}else\n\tif( key == \"KeyI\" ){\n\t\ttab.style.caretColor = \"red\"\n\t\tGJE_CommandMode = false\n\t}else\n\tif( key == \"KeyO\" ){\n\t\ttab.style.caretColor = \"red\"\n\t\tGJE_CommandMode = false\n\t}else\n\tif( key == \"KeyJ\" ){\n\t\tconsole.log(\"ROW-DOWN\")\n\t}else\n\tif( key == \"KeyK\" ){\n\t\tconsole.log(\"ROW-UP\")\n\t}else\n\tif( key == \"Keyw\" ){\n\t\tconsole.log(\"COL-FORW\")\n\t}else\n\tif( key == \"Keyb\" ){\n\t\tconsole.log(\"COL-BACK\")\n\t}\n\n\tkev.stopPropagation()\n\tif( wasCmdMode ){\n\t\tkev.preventDefault()\n\t}\n  }\n  function GJE_DragEvent(ev,elem){\n\tx = ev.clientX\n\ty = ev.clientY\n\tconsole.log(\"Dragged: \"+this.nodeName+'#'+this.id+' x='+x+' y='+y)\n  }\n  \/\/ https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/DragEvent\n  \/\/ https:\/\/www.w3.org\/TR\/uievents\/#events-mouseevents\n  function GJE_DropEvent(ev,elem){\n\tx = ev.clientX\n\ty = ev.clientY\n\tthis.style.x = x\n\tthis.style.y = y\n\tthis.style.position = 'absolute' \/\/ 'fixed'\n\tthis.parentNode = gsh \/\/ just for test\n\tconsole.log(\"Dropped: \"+this.nodeName+'#'+this.id+' x='+x+' y='+y\n\t\t+' parent='+this.parentNode.id)\n  }\n  function GJE_SetTableStyle(ev){\n\tthis.innerHTML = this.value; \/\/ sync. for external representation?\n\tif(false){\n\t\tstid = this.parentNode.id+this.id\n\t\t\t\/\/ and remove \"_span\" at the end\t\n\t\te = document.getElementById(stid)\n\t\t\/\/alert('SetTableStyle #'+e.id+'\\n'+this.value)\n\t\tif( e != null ){\n\t\t\te.innerHTML = this.value\n\t\t}else{\n\t\t\tconsole.log('Style Not found: '+stid)\n\t\t}\n\t\t\/\/alert('event StopPropagetion: '+ev)\n\t}\n  }\n  function setCSSofClass(cclass,cstyle){\n\tconst ss = document.styleSheets[3]; \/\/ 0, 1, 2, 3, ... ?\n\trlen = ss.cssRules.length;\n\tlet tabrule = null;\n\trulex = -1\n\n\t\/\/ should skip white space at the top of cstyle\n\tsel = cstyle.charAt(0);\n\tselector = sel+cclass;\n\tconsole.log('-- search style rule for '+selector)\n\n\tfor(let i = 0; i < rlen; i++){\n\t\tcr = ss.cssRules[i];\n\t\tconsole.log('CSS rule ['+i+'\/'+rlen+'] '+cr.selectorText);\n\t\tif( cr.selectorText  === selector ){ \/\/ css class selector\n\t\t\ttabrule = ss.cssRules[i];\n\t\t\tconsole.log('CSS rule found for:['+i+'\/'+rlen+'] '+selector);\n\t\t\tss.deleteRule(i);\n\t\t\t\/\/rlen = ss.cssRules.length;\n\t\t\trulex = i\n\t\t\t\/\/ should search and replace the property here\n\t\t}\n\t}\n\t\/\/ https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/CSSStyleSheet\/insertRule\n\tif( tabrule == null ){\n\t\tconsole.log('CSS rule NOT found for:['+rlen+'] '+selector);\n\t\tss.insertRule(cstyle,rlen);\n\t\tss.insertRule(cstyle,0); \/\/ override by 0?\n\t\tconsole.log('CSS rule inserted:['+(rlen+1)+']\\n'+cstyle);\n\t}else{\n\t\tss.insertRule(cstyle,rlen);\n\t\tss.insertRule(cstyle,0);\n\t\tconsole.log('CSS rule replaced:['+(rlen+1)+']\\n'+cstyle);\n\t}\n  }\n  function GJE_SetStyle(te){\n\tconsole.log('Apply the style to:'+te.id+'\\n');\n\tconsole.log('Apply the style to:'+te.parentNode.id+'\\n');\n\tconsole.log('Apply the style to:'+te.parentNode.class+'\\n');\n\tcclass = te.parentNode.class;\n\tsetCSSofClass(cclass,te.value); \/\/ should get selecter part from\n\t\t\t\t\t\/\/ selector { rules }\n\n    if(false){\n\t\/\/console.log('Apply the style:')\n\t\/\/stid = this.parentNode.id+this.id+\"\n\t\/\/stid = this.id+\".style\"\n\tcss = te.value\n\tstid = te.parentNode.id+\".style\"\n\te = document.getElementById(stid)\n\tif( e != null ){\n\t\t\/\/console.log('Apply the style:'+e.id+'\\n'+te.value);\n\t\tconsole.log('Apply the style:'+e.id+'\\n'+css);\n\/\/\t\te.innerHTML = css; \/\/te.value;\n\t\t\/\/ncss = e.sheet;\n\t\t\/\/ncss.insertRule(te.value,ncss.cssRules.length);\n\t}else{\n\t\tconsole.log('No element to Apply the style: '+stid)\n\t}\n\ttblid = te.parentNode.id+\".table\";\n\te = document.getElementById(tblid);\n\tif( e != null ){\n\t\t\/\/e.setAttribute('style',css);\n\t\te.setProperty('style',css,'!impotant');\n\t}\n    }\n  }\n  function makeTable(argv){\n\t\/\/tid = ''\n\tcwe = GJE_CurElement\n\ttid = 'table_' + GJE_TableNo\n\n\tnt = new Text('\\n')\n\tcwe.appendChild(nt)\n\n\tne = document.createElement('span'); \/\/ the container\n\tcwe.appendChild(ne)\n\tne.id = tid + '-span'\n\tne.setAttribute('contenteditable',true)\n\n\thtspan = document.createElement('span'); \/\/ html part\n\t\/\/htspan.id = tid + '-html'\n\t\/\/ne.innerHTML = '\\n'\n\tnt = new Text('\\n')\n\tne.appendChild(nt)\n\tne.appendChild(htspan)\n\n\thtspan.id = tid\n\thtspan.setAttribute('class',tid)\n\n\tne.setAttribute('draggable','true')\n\tne.addEventListener('drag',GJE_DragEvent);\n\tne.addEventListener('dragend',GJE_DropEvent);\n\n\tvar col = 3\n\tvar row = 2\n\tif( argv[0] != null ){\n\t\tcol = argv[0]\n\t\targv.shift()\n\t}\n\tif( argv[0] != null ){\n\t\trow = argv[0]\n\t\targv.shift()\n\t}\n\n\t\/\/ne.setAttribute('class',tid)\n\tht = \"\\n\"\n\t\/\/ht += '<'+'table ' + 'id=\"'+tid+'\"' + ' class=\"'+tid+'\"'\n\tht += '<'+'table '\n\t\t+ ' onkeydown=\"GJE_TableKeyCommand(event,this)\"'\n\t\t\/\/+ ' ondrag=\"GJE_DragEvent(event,this)\"\\n'\n\t\t\/\/+ ' ondragend=\"GJE_DropEvent(event,this)\"\\n'\n\t\t\/\/+ ' draggable=\"true\"\\n'\n\t\t\/\/+ ' contenteditable=\"true\"'\n\t\t+ '>\\n'\n\tht += '<'+'tbody>\\n';\n\tfor( r = 0; r < row; r++ ){\n\t\tht += \"<\"+\"tr>\\n\"\n\t\tfor( c = 0; c < col; c++ ){\n\t\t\tht += \"<\"+\"td>\"\n\t\t\tht +=  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".charAt(c) + r\n\t\t\tht += \"<\"+\"\/td>\\n\"\n\t\t}\n\t\tht += \"<\"+\"\/tr>\\n\"\n\t}\n\tht += '<'+'\/tbody>\\n';\n\tht += '<'+'\/table>\\n';\n\thtspan.innerHTML = ht;\n\tnt = new Text('\\n')\n\tne.appendChild(nt)\n\n\tst = '#'+tid+' *{\\n' \/\/ # for instanse specific\n\t\t+'  '+'border:1px solid #aaa;\\n'\n\t\t+'  '+'background-color:#efe;\\n'\n\t\t+'  '+'color:#222;\\n'\n\t\t+'  '+'font-size:#14pt !important;\\n'\n\t\t+'  '+'font-family:monospace,Courier New !important;\\n'\n\t\t+'} \/'+'* hit ESC to apply *'+'\/\\n'\n\n\t\/\/ wish script to be incldued\n\t\/\/nj = document.createElement('script')\n\t\/\/ne.appendChild(nj)\n\t\/\/ne.innerHTML = 'function SetStyle(e){}'\n\n\t\/\/ selector seems lost in dynamic style appending\n\tif(false){\n\t ns = document.createElement('style')\n\t ne.appendChild(ns)\n\t ns.id = tid + '.style'\n\t ns.innerHTML = '\\n'+st\n\t nt = new Text('\\n')\n\t ne.appendChild(nt)\n\t}\n\tsetCSSofClass(tid,st); \/\/ should be in JavaScript script?\n\n\tnx = document.createElement('textarea')\n\tne.appendChild(nx)\n\tnx.id = tid + '-style_def'\n\tnx.setAttribute('class','GJ_StyleEditor')\n\tnx.spellcheck = false\n\tnx.cols = 60\n\tnx.rows = 10\n\tnx.innerHTML = '\\n'+st\n\tnx.addEventListener('change',GJE_SetTableStyle);\n\tnx.addEventListener('keydown',GJE_StyleKeyCommand);\n\t\/\/nx.addEventListener('click',GJE_SetTableStyle);\n\n\tnt = new Text('\\n')\n\tcwe.appendChild(nt)\n\n\tGJE_TableNo += 1\n\treturn 'created TABLE id=\"'+tid+'\"'\n  }\n  function GJE_NodeEdit(argv){\n\tcwe = GJE_CurElement\n\tcmd = argv[0]\n\targv.shift()\n\targs = argv.join(' ')\n\tret = \"\"\n\n\tif( cmd == '.u' || cmd == '.un' || cmd == 'undo' ){\n\t\tif( GJE_NodeSaved != null ){\n\t\t\txn = GJE_RootNode\n\t\t\tGJE_RootNode = GJE_NodeSaved\n\t\t\tGJE_NodeSaved = xn\n\t\t\tret = '-- did undo'\n\t\t}else{\n\t\t\tret = '-- could not undo'\n\t\t}\n\t\treturn ret\n\t}\n\tGJE_NodeSaved = GJE_RootNode.cloneNode()\n\tif( cmd == '.c' || cmd == '.cd' || cmd == 'cd' ){\n\t\tif( argv[0] == null ){\n\t\t\tne = GJE_RootNode\n\t\t}else\n\t\tif( argv[0] == '..' ){\n\t\t\tne = cwe.parentNode\n\t\t}else{\n\t\t\tne = document.getElementById(argv[0])\n\t\t}\n\t\tif( ne != null ){\n\t\t\tGJE_CurElement = ne\n\t\t\tret = \"-- current node: \" + ne.id\n\t\t}else{\n\t\t\tret = \"-- not found: \" + argv[0]\n\t\t}\n\t}else\n\tif( cmd == '.mkt' || cmd == '.mktable' ){\n\t\tmakeTable(argv)\n\t}else\n\tif( cmd == '.m' || cmd == '.mk' || cmd == 'mk' ){\n\t\tne = document.createElement(argv[0])\n\t\t\/\/ne.id = argv[0]\n\t\tret = \"-- created \" + ne + \" under \" + cwe.tagName + \"#\" + cwe.id \n\t\tcwe.appendChild(ne)\n\t\tif( cmd == '.m' || cmd == '.mk' ){\n\t\t\tGJE_CurElement = ne\n\t\t}\n\t}else\n\tif( cmd == '.n' || cmd == '.nm' || cmd == 'nm' ){\n\t\tcwe.id = argv[0]\n\t}else\n\tif( cmd == '.r' || cmd == '.rm' || cmd == 'rm' ){\n\t}else\n\tif( cmd == '.h' || cmd == '.sh' || cmd == 'sh' ){\n\t\ts = argv.join(' ')\n\t\tcwe.innerHTML = s\n\t}else\n\tif( cmd == '.a' || cmd == '.sa' || cmd == 'sa' ){\n\t\tcwe.setAttribute(argv[0],argv[1])\n\t}else\n\tif( cmd == '.l' ){\n\t}else\n\tif( cmd == '.i' || cmd == '.ih' || cmd == 'ih' ){\n\t\tret = cwe.innerHTML\n\t}else\n\tif( cmd == '.p' || cmd == '.pw' || cmd == 'pw' ){\n\t\tret = cwe.nodeType + \" \" + cwe.tagName + \" \" + cwe.id\n\t\tfor( we = cwe.parentNode; we != null; ){\n\t\t\tret += \"\\n\" + \" \" + we.nodeType + \" \" + we.tagName + \" \" + we.id\n\t\t\twe = we.parentNode\n\t\t}\n\t}else\n\t{\n\t\tret = \"Command: mk | rm \\n\"\n\t\tret += \"   pw -- print current node\\n\"\n\t\tret += \"   mk type -- make node with name and type\\n\"\n\t\tret += \"   nm name -- set the id #name of current node\\n\"\n\t\tret += \"   rm name -- remove named node\\n\"\n\t\tret += \"   cd name -- change current node\\n\"\n\t}\n\t\/\/alert(ret)\n\treturn ret\n  }\n  function GJC_Command(text){\n\tlines = text.value.split('\\n')\n\tline = lines[lines.length-1]\n\targv = line.split(' ')\n\ttext.value += '\\n'\n\tif( argv[0] == '%' ){ argv.shift() }\n\targs0 = argv.join(' ')\n\tcmd = argv[0]\n\targv.shift()\n\targs = argv.join(' ')\n\n\tif( cmd == 'nolog' ){\n\t\tStopConsoleLog = true\n\t}else\n\tif( cmd == 'new' ){\n\t\tif( argv[0] == 'table' ){\n\t\t\targv.shift()\n\t\t\tconsole.log('argv='+argv)\n\t\t\ttext.value += makeTable(argv)\n\t\t}else\n\t\tif( argv[0] == 'console' ){\n  \t\t\ttext.value += GJ_NewConsole('GJ_Console')\n\t\t}else{\n\t\t\ttext.value += '-- new { console | table }'\n\t\t}\n\t}else\n\tif( cmd == 'strip' ){\n\t\t\/\/text.value += GJF_StripClass()\n\t}else\n\tif( cmd == 'css' ){\n\tsel = '#table_1'\n\tif(argv[0]=='0')\n\trule1 = sel+'{color:#000 !important; background-color:#fff !important;}';\n\telse\n\trule1 = sel+'{color:#f00 !important; background-color:#eef !important;}';\n\t\tdocument.styleSheets[3].deleteRule(0);\n\t\tdocument.styleSheets[3].insertRule(rule1,0);\n\t\ttext.value += 'CSS rule added: '+rule1\n\t}else\n\tif( cmd == 'print' ){\n\t\te = null;\n\t\tif( e == null ){\n\t\t\te = document.getElementById('GJFactory_0')\n\t\t}\n\t\tif( e == null ){\n\t\t\te = document.getElementById('GJFactory_1')\n\t\t}\n\t\tif( argv[0] != null ){\n\t\t\tid = argv[0]\n\t\t\tif( id  == 'f' ){\n\t\t\t\t\/\/e = document.getElementById('GJE_RootNode');\n\t\t\t}else{\n\t\t\t\te = document.getElementById(id)\n\t\t\t}\n\t\t\tif( e != null ){\n\t\t\t\ttext.value += e.outerHTML\n\t\t\t}else{\n\t\t\t\ttext.value += \"Not found: \" + id\n\t\t\t}\n\t\t}else{\n\t\t\ttext.value += GJE_RootNode.outerHTML\n\t\t\t\/\/text.value += e.innerHTML\n\t\t}\n\t}else\n\tif( cmd == 'destroy' ){\n\t\ttext.value += GJFactory_Destroy()\n\t}else\n\tif( cmd == 'save' ){\n\t\te = document.getElementById('GJFactory')\n\t\tPermanent.setItem('GJFactory-1',e.innerHTML)\n\t\ttext.value += \"-- Saved GJFactory\"\n\t}else\n\tif( cmd == 'load' ){\n\t\tgjf = Permanent.getItem('GJFactory-1')\n\t\te = document.getElementById('GJFactory')\n\t\te.innerHTML = gjf\n\t\t\/\/ must restore EventListener\n\t\ttext.value += \"-- EventListener was not restored\"\n\t}else\n\tif( cmd.charAt(0) == '.' ){\n\t\targv0 = args0.split(' ')\n\t\ttext.value += GJE_NodeEdit(argv0)\n\t}else\n\tif( cmd == 'cont' ){\n\t\tbannerIsStopping = false\n\t\tGshMenuStop.innerHTML = \"Stop\"\n\t}else\n\tif( cmd == 'date' ){\n\t\ttext.value += DateLong()\n\t}else\n\tif( cmd == 'echo' ){\n\t\ttext.value += args\n\t}else\n\tif( cmd == 'fork' ){\n\t\thtml_fork()\n\t}else\n\tif( cmd == 'last' ){\n\t\ttext.value += MyHistory\n\t\t\/\/h = document.createElement(\"span\")\n\t\t\/\/h.innerHTML = MyHistory\n\t\t\/\/text.value += h.innerHTML\n\t\t\/\/tx = MyHistory.replace(\"\\n\",\"\")\n\t\t\/\/text.value += tx.replace(\"<\"+\"br>\",\"\\n\") + \"xxxx<\"+\"br>yyyy\"\n\t}else\n\tif( cmd == 'ne' ){\n\t\ttext.value += GJE_NodeEdit(argv)\n\t}else\n\tif( cmd == 'reload' ){\n\t\tlocation.reload()\n\t}else\n\tif( cmd == 'mem' ){\n\t\ttext.value += GJC_Memory('GJC_Storage',args,text)\n\t}else\n\tif( cmd == 'stop' ){\n\t\tbannerIsStopping = true\n\t\tGshMenuStop.innerHTML = \"Start\"\n\t}else\n\tif( cmd == 'who' ){\n\t\ttext.value += \"SessionId=\"+GJC_SessionId+\" \"+document.URL\n\t}else\n\tif( cmd == 'wall' ){\n\t\ttext.value += GJC_Memory('GJC_Wall','write',text)\n\t}else\n\t{\n\t\ttext.value += \"Commands: help | echo | date | last \\n\"\n\t\t\t    + '          new  | save | load | mem  \\n'\n\t\t\t    + '          who  | wall | fork | nife'\n\t}\n  }\n\n  function GJC_Input(){\n\tif( this.value.endsWith(\"\\n\") ){ \/\/ remove NL added by textarea\n\t\tthis.value = this.value.slice(0,this.value.length-1)\n\t}\n  }\n\n  var GCJ_Id = null\n  function GJC_Resize(){\n\tGJC_Id.style.zIndex = 20000\n\tGJC_Id.style.width = window.innerWidth - 16\n\tGJC_Id.style.height = 300\n\tGJC_Id.style.backgroundColor = \"rgba(0,64,16,1.0)\" \/\/ blackboard color\n\tGJC_Id.style.color = \"rgba(255,255,255,1.0)\"\n  }\n  function GJC_FocusIn(){\n\tthis.spellcheck = false\n\tSuppressGJShell = true\n\tthis.onkeydown = GJC_Keydown\n\tGJC_Resize()\n  }\n  function GJC_FocusOut(){\n\tSuppressGJShell = false\n\tthis.removeEventListener('keydown',GJC_Keydown);\n  }\n  window.addEventListener('resize',GJC_Resize);\n\n  function GJC_OnStorage(e){\n\t\/\/alert('Got Message')\n\t\/\/GJC.value += \"\\n(((ReceivedMessage)))\\n\"\n  }\n  window.addEventListener('storage',GJC_OnStorage);\n  \/\/window.addEventListener('storage',()=>{alert('GotMessage')})\n\n  function GJC_Setup(gjcId){\n\tgjcId.style.width = gsh.getBoundingClientRect().width\n\tgjcId.value = \"GJShell Console \/\/ \" + GshVersion.innerHTML + \"\\n\"\n\t\/\/gjcId.value += \"Date: \" + DateLong() + \"\\n\"\n\tgjcId.value += PS1\n\tgjcId.onfocus = GJC_FocusIn\n\tgjcId.addEventListener('input',GJC_Input);\n\tgjcId.addEventListener('focusout',GJC_FocusOut);\n\tGJC_Id = gjcId\n  }\n  function GJC_Clear(id){\n  }\n  if( document.getElementById(\"GJC_0\") != null ){\n\tGJC_Setup(GJC_0)\n  }else{\n\tdocument.write('<'+'textarea id=\"GJC_1\" class=\"GJConsole\"><'+'\/textarea>')\n\tGJC_Setup(GJC_1)\n\tfactory = document.createElement('span');\n\tgsh.appendChild(factory)\n\tGJE_RootNode = factory;\n\tGJE_CurElement = GJE_RootNode;\n  }\n\n  \/\/ TODO: focus handling\n<\/script>\n<style>\n.GJ_StyleEditor {\n  font-size:9pt !important;\n  font-family:Courier New, monospace !important;\n}\n<\/style>\n\n<!-- ----- GJConsole END } ----- -->\n<\/span><span><\/span>\n*\/\n\n\/*\n<span id=\"BlinderText\">\n<style id=\"BlinderTextStyle\">\n .textField  {\n\tdisplay:inline;\n\tborder:1px solid #000;\n\tcolor:#000; background-color:#fff;\n\twidth:106pt; height:16pt;\n\tpadding:2px;\n\tresize:none;\n\tvertical-align:middle;\n\tfont-size:10pt; font-family:Courier New;\n }\n .VisibleText {\n }\n .BlinderText {\n\tcolor:#000; background-color:#eee;\n }\n .joinButton {\n\tfont-family:Georgia;\n\tfont-size:11pt;\n\tline-height:1.1;\n\theight:16pt;\n\twidth:50pt;\n\tpadding:3px;\n\ttext-align:center !important;\n\tborder-color:#aaa !important;\n\tcolor:#fff; background-color:#4a4 !important;\n\tvertical-align:middle !important;\n }\n .SendButton {\n\tvertical-align:top;\n }\n .ws0_log { font-size:9pt; font-family:Courier New,monospace; white-space:pre; }\n<\/style>\n\n<details id=\"BlinderTextClass\" class=\"gsh-src\"><summary>class BlinderText<\/summary>\n<span id=\"BlinderTextScript\">\n\/\/ https:\/\/w3c.github.io\/uievents\/#event-type-keydown\n\/\/\n\/\/ 2020-09-21 class BlinderText - textarea element not to be readable\n\/\/\n\/\/ BlinderText attributes\n\/\/\tbl_plainText - null\n\/\/\tbl_hideChecksum - [false]\n\/\/\tbl_showLength - [false]\n\/\/\tbl_visible - [false]\n\/\/\tdata-bl_config - []\n\/\/\t - min. length\n\/\/\t - max. length\n\/\/\t - acceptable charset in generete text\n\/\/\nfunction BlinderChecksum(text){\n\tplain = text.bl_plainText;\n\treturn strCRC32(plain,plain.length).toFixed(0);\n}\nfunction BlinderKeydown(ev){\n\tpass = ev.target\n\tif( ev.code == 'Enter' ){\n\t\tev.preventDefault();\n\t}\n\tev.stopPropagation()\n}\nfunction BlinderKeyup1(ev){\n\tblind = ev.target\n\tif( ev.code == 'Backspace'){\n\t\tblind.bl_plainText = blind.bl_plainText.slice(0,blind.bl_plainText.length-1)\n\t}else\n\tif( and(ev.code == 'KeyV', ev.ctrlKey) ){\n\t\tblind.bl_visible = !blind.bl_visible;\n\t}else\n\tif( and(ev.code == 'KeyL', ev.ctrlKey) ){\n\t\tblind.bl_showLength = !blind.bl_showLength;\n\t}else\n\tif( and(ev.code == 'KeyU', ev.ctrlKey) ){\n\t\tblind.bl_plainText = \"\";\n\t}else\n\tif( and(ev.code == 'KeyR', ev.ctrlKey) ){\n\t\tchecksum = BlinderChecksum(blind);\n\t\tblind.bl_plainText = checksum; \/\/.toString(32);\n\t}else\n\tif( ev.code == 'Enter' ){\n\t\tev.stopPropagation();\n\t\tev.preventDefault();\n\t\treturn;\n\t}else\n\tif( ev.key.length != 1 ){\n\t\tconsole.log('KeyUp: '+ev.code+'\/'+ev.key);\n\t\treturn;\n\t}else{\n\t\tblind.bl_plainText += ev.key;\n\t}\n\n\tleng = blind.bl_plainText.length;\n\t\/\/console.log('KeyUp: '+ev.code+'\/'+blind.bl_plainText);\n\tchecksum = BlinderChecksum(blind) % 10; \/\/ show last one digit only\n\n\tvisual = '';\n\tif( !blind.bl_hideCheckSum || blind.bl_showLength ){\n\t\tvisual += '[';\n\t}\n\tif( !blind.bl_hideCheckSum ){\n\t\tvisual += '#'+checksum.toString(10);\n\t}\n\tif( blind.bl_showLength ){\n\t\tvisual += '\/' + leng;\n\t}\n\tif( !blind.bl_hideCheckSum || blind.bl_showLength ){\n\t\tvisual += '] ';\n\t}\n\tif( blind.bl_visible ){\n\t\tvisual += blind.bl_plainText;\n\t}else{\n\t\tvisual += '*'.repeat(leng);\n\t}\n\tblind.value = visual;\n}\nfunction BlinderKeyup(ev){\n\tBlinderKeyup1(ev);\n\tev.stopPropagation();\n}\n\/\/ https:\/\/w3c.github.io\/uievents\/#keyboardevent\n\/\/ https:\/\/w3c.github.io\/uievents\/#uievent\n\/\/ https:\/\/dom.spec.whatwg.org\/#event\nfunction BlinderTextEvent(){\n\tev = event;\n\tblind = ev.target;\n\tconsole.log('Event '+ev.type+'@'+blind.nodeName+'#'+blind.id)\n\tif( ev.type == 'keyup' ){\n\t\tBlinderKeyup(ev);\n\t}else\n\tif( ev.type == 'keydown' ){\n\t\tBlinderKeydown(ev);\n\t}else{\n\t\tconsole.log('thru-event '+ev.type+'@'+blind.nodeName+'#'+blind.id)\n\t}\n}\n\/\/< textarea hidden id=\"BlinderTextClassDef\" class=\"textField\"\"\n\/\/ onkeydown=\"BlinderTextEvent()\" onkeyup=\"BlinderTextEvent()\"\n\/\/ spellcheck=\"false\">< \/textarea>\n\/\/< textarea hidden id=\"gj_pass1\"\n\/\/\tclass=\"textField BlinderText\"\n\/\/\tplaceholder=\"PassWord1\"\n\/\/\tonkeydown=\"BlinderTextEvent()\"\n\/\/\tonkeyup=\"BlinderTextEvent()\"\n\/\/\tspellcheck=\"false\"< \/textarea>\nfunction SetupBlinderText(parent,txa,phold){\n\tif( txa == null ){\n\t\ttxa = document.createElement('textarea');\n\t\t\/\/txa.id = id;\n\t}\n\ttxa.setAttribute('class','textField BlinderText');\n\ttxa.setAttribute('placeholder',phold);\n\ttxa.setAttribute('onkeydown','BlinderTextEvent()');\n\ttxa.setAttribute('onkeyup','BlinderTextEvent()');\n\ttxa.setAttribute('spellcheck','false');\n\t\/\/txa.setAttribute('bl_plainText','false');\n\ttxa.bl_plainText = '';\n\t\/\/parent.appendChild(txa);\n}\nfunction DestroyBlinderText(txa){\n\ttxa.removeAttribute('class');\n\ttxa.removeAttribute('placeholder');\n\ttxa.removeAttribute('onkeydown');\n\ttxa.removeAttribute('onkeyup');\n\ttxa.removeAttribute('spellcheck');\n\ttxa.bl_plainText = '';\n}\n\/\/\n\/\/ visible textarea like Username\n\/\/\nfunction VisibleTextEvent(){\n\tif( event.code == 'Enter' ){\n\t\tif( event.target.NoEnter ){\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\tevent.stopPropagation();\n}\nfunction SetupVisibleText(parent,txa,phold){\n\ttxa.setAttribute('class','textField VisibleText');\n\ttxa.setAttribute('placeholder',phold);\n\ttxa.setAttribute('onkeydown','VisibleTextEvent()');\n\ttxa.setAttribute('onkeyup',  'VisibleTextEvent()');\n\ttxa.setAttribute('spellcheck','false');\n\tcols = txa.getAttribute('cols');\n\tif( cols != null ){\n\t\ttxa.style.width = '580px';\n\t\tconsole.log(txa.id+' cols='+cols)\n\t}else{\n\t\tconsole.log(txa.id+' NO cols')\n\t}\n\trows = txa.getAttribute('rows');\n\tif( rows != null ){\n\t\ttxa.style.height = '40px';\n\t\ttxa.style.resize = 'both';\n\t\ttxa.NoEnter = false;\n\t}else{\n\t\ttxa.NoEnter = true;\n\t}\n}\nfunction DestroyVisibleText(txa){\n\ttxa.removeAttribute('class');\n\ttxa.removeAttribute('placeholder');\n\ttxa.removeAttribute('onkeydown');\n\ttxa.removeAttribute('onkeyup');\n\ttxa.removeAttribute('spellcheck');\n\tcols = txa.removeAttribute('cols');\n}\n<\/span>\n<script>\njs = document.getElementById('BlinderTextScript');\neval(js.innerHTML);\n\/\/js.outerHTML = \"\"\n<\/script>\n\n<\/details>\n<\/span>\n*\/\n\n\/*\n<script id=\"GJLinkScript\">\nfunction addlog(e,msg){\n\te.value += msg;\n\te.scrollTop = e.scrollHeight;\n}\nfunction gjkey_hash(text){\n\treturn strCRC32(text,text.length) % 0x10000;\n}\nvar GJ_Channel = null;\nvar GJ_Log = null;\nfunction GJ_Join(){\n\ttarget = gj_join;\n\tif( target.value == 'Leave' ){\n\t\tGJ_Channel.close();\n\t\tGJ_Channel = null;\n\t\ttarget.value = 'Join';\n\t\treturn;\n\t}\n\n\tvar ws0;\n\tvar ws0_log;\n\tws0 = new WebSocket(\"ws:\/\/localhost:9999\/gshws\");\n\tGJ_Channel = ws0;\n\tws0_log = document.getElementById('ws0_log');\n\tGJ_Log = ws0_log;\n\n\tnow = (new Date().getTime() \/ 1000).toFixed(3);\n\taddlog(ws0_log,'['+now+'] '+'opened the channel\\n');\n\n\tws0.addEventListener('open', function(event){\n\t\tdate1 = new Date().getTime();\n\t\tdate2 = (date1 \/ 1000).toFixed(3);\n\t\tseed = date1.toString(16);\n\n\t\t\/\/ user name and key\n\t\tuser = document.getElementById('gj_user').value;\n\t\tif( user.length == 0 ){\n\t\t\tgj_user.value = 'nemo';\n\t\t\tuser = 'nemo';\n\t\t}\n\t\tkey1 = document.getElementById('gj_ukey').bl_plainText;\n\t\tukey = gjkey_hash(seed+user+key1).toString(16);\n\n\t\t\/\/ session name and key\n\t\tchan = document.getElementById('gj_chan').value;\n\t\tif( chan.length == 0 ){\n\t\t\tgj_chan.value = 'main';\n\t\t\tchan = 'main';\n\t\t}\n\t\tkey2 = document.getElementById('gj_ckey').bl_plainText;\n\t\tckey = gjkey_hash(seed+chan+key2).toString(16);\n\n\t\tmsg = date2 +' JOIN ' + user + '|' + chan + ' ' + ukey + ':' + ckey;\n\t\taddlog(ws0_log,'['+date2+'] send '+msg+'\\n');\n\t\tws0.send(msg);\n\n\t\ttarget.value = 'Leave';\n\t\t\/\/console.log('['+date2+'] #'+target.id+' '+target.value+'\\n');\n\t\t\/\/addlog(ws0_log,'['+date2+'] label '+target.value+'\\n');\n\t});\n\tws0.addEventListener('message', function(event){\n\t\tnow = (new Date().getTime() \/ 1000).toFixed(3);\n\t\tmsg = event.data;\n\t\taddlog(ws0_log,'['+now+'] recv '+msg+'\\n');\n\n\t\targv = msg.split(' ')\n\t\ttstamp = argv[0];\n\t\targv.shift();\n\t\tif( argv[0] == 'reload' ){\n\t\t\tlocation.reload()\n\t\t}\n\t\targv.shift(); \/\/ command\n\t\targv.shift(); \/\/ from|to\n\t\tif( argv[0] == 'auth' ){\n\t\t\t\/\/ doing authorization required\n\t\t}\n\t\tif( argv[0] == 'echo' ){\n\t\t\tnow = (new Date().getTime() \/ 1000).toFixed(3);\n\t\t\tmsg = now+' '+'RESP '+argv.join(' ');\n\t\t\taddlog(ws0_log,'['+now+'] '+'send '+msg+'\\n');\n\t\t\tws0.send(msg);\n\t\t}\n\t\tif( argv[0] == 'eval' ){\n\t\t\targv.shift();\n\t\t\tjs = argv.join(' ');\n\t\t\tret = eval(js);\n\t\t\taddlog(ws0_log,'eval '+js+' = '+ret+'\\n');\n\t\t\tnow = (new Date().getTime() \/ 1000).toFixed(3);\n\t\t\tmsg = now + ' ' + 'RESP ' + ret;\n\t\t\tws0.send(msg);\n\t\t\taddlog(ws0_log,'['+now+'] send '+msg+'\\n')\n\t\t}\n\t});\n\tws0.addEventListener('close', function(event){\n\t\tGJ_Channel.close();\n\t\tGJ_Channel = null;\n\t\ttarget.value = 'Join';\n\t\taddlog(ws0_log,'['+date2+'] closed the channel\\n');\n\t});\n}\nfunction GJ_Send(){\n\tif( GJ_Channel == null ){\n\t\t\/\/addlog(GJ_Log,'['+now+'] send '+msg+'\\n');\n\t\treturn;\n\t}\n\tdate2 = (new Date().getTime() \/ 1000).toFixed(3);\n\ttarget = event.target;\n\tuser = document.getElementById('gj_user').value;\n\tchan = document.getElementById('gj_chan').value;\n\tmsg = date2 +' ISAY '+user+'|'+chan+' '+gj_sendText.value;\n\taddlog(GJ_Log,'['+date2+'] send '+msg+'\\n');\n\tGJ_Channel.send(msg);\n}\n<\/script>\n\n<!-- -------------------------- GJLINK ------------------ -->\n<!--\n\t- User can subscribe to a channel\n\t- A channel will be broadcasted\n\t- A channel can be a pattern (regular expression)\n\t- User is like From:(me) and channel is like To: or Recipient:\n\t- like VIABUS\n\t\t- watch message with SENDME, WATCH, CATCH, HEAR, or so\n\t\t- routing with path expression or name pattern (with routing with DNS like system)\n-->\n*\/\n\n\/\/<span id=\"GJLinkGolang\">\n\/\/ <details id=\"GshWebSocket\" class=\"gsh-src\"><summary>Golang \/ JavaScript Link<\/summary>\n\/\/ 2020-0920 created\n\/\/ <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/net\/websocket\">WS<\/a>\n\/\/ <a href=\"https:\/\/godoc.org\/golang.org\/x\/net\/websocket\">WS<\/a>\n\/\/ INSTALL: go get golang.org\/x\/net\/websocket\n\/\/ INSTALL: sudo {apt,yum} install git (if git is not instlled yet)\n\/\/ import \"golang.org\/x\/net\/websocket\"\nconst gshws_origin = \"http:\/\/locahost:9999\"\nconst gshws_port = \"localhost:9999\"\nconst gshws_path = \"gshws\"\nconst gshws_url = \"ws:\/\/\"+gshws_port+\"\/\"+gshws_path\nconst GSHWS_MSGSIZE = (8*1024)\nfunc fmtstring(fmts string, params ...interface{})(string){\n\treturn fmt.Sprintf(fmts,params...)\n}\nfunc GSHWS_MARK(what string)(string){\n\tnow := time.Now()\n\tus := fmtstring(\"%06d\",now.Nanosecond() \/ 1000)\n\treturn \"[\"+now.Format(time.Stamp)+\".\"+us+\"] --WS-\" + what + \": \"\n}\nfunc gchk(what string,err error){\n\tif( err != nil ){\n\t\tpanic(GSHWS_MARK(what)+err.Error())\n\t}\n}\nfunc glog(what string, fmts string, params ...interface{}){\n\tfmt.Print(GSHWS_MARK(what))\n\tfmt.Printf(fmts+\"\\n\",params...)\n}\n\nvar WSV = []*websocket.Conn{}\nfunc jsend(argv []string){\n\tif len(argv) <= 1 {\n\t\tfmt.Printf(\"--Ij %v [-m] command arguments\\n\",argv[0])\n\t\treturn\n\t}\n\targv = argv[1:]\n\tif( len(WSV) == 0 ){\n\t\tfmt.Printf(\"--Ej-- No link now\\n\")\n\t\treturn\n\t}\n\tif( 1 < len(WSV) ){\n\t\tfmt.Printf(\"--Ij-- multiple links (%v)\\n\",len(WSV))\n\t}\n\n\tmulticast := false \/\/ should be filtered with regexp\n\tif( 0 < len(argv) && argv[0] == \"-m\" ){\n\t\tmulticast = true\n\t\targv = argv[1:]\n\t}\n\targs := strings.Join(argv,\" \")\n\n\t\tnow := time.Now()\n\t\tmsec := now.UnixNano() \/ 1000000;\n\t\ttstamp := fmtstring(\"%.3f\",float64(msec)\/1000.0)\n\t\tmsg := fmtstring(\"%v SEND gshell|* %v\",tstamp,args)\n\n\tif( multicast ){\n\t\tfor i,ws := range WSV {\n\t\t\twn,werr := ws.Write([]byte(msg))\n\t\t\tif( werr != nil ){\n\t\t\t\tfmt.Printf(\"[%v] wn=%v, werr=%v\\n\",i,wn,werr)\n\t\t\t}\n\t\t\tglog(\"SQ\",fmtstring(\"(%v) %v\",wn,msg))\n\t\t}\n\t}else{\n\t\ti := 0\n\t\t\tws := WSV[i]\n\t\t\twn,werr := ws.Write([]byte(msg))\n\t\t\tif( werr != nil ){\n\t\t\t\tfmt.Printf(\"[%v] wn=%v, werr=%v\\n\",i,wn,werr)\n\t\t\t}\n\t\t\tglog(\"SQ\",fmtstring(\"(%v) %v\",wn,msg))\n\t}\n}\nfunc serv1(ws *websocket.Conn) {\n\tWSV = append(WSV,ws)\n\tfmt.Print(\"\\n\")\n\tfmt.Printf(\"-- accepted connections[%v]\\n\",len(WSV))\n\t\/\/remoteAddr := ws.RemoteAddr\n\t\/\/fmt.Printf(\"-- accepted %v\\n\",remoteAddr)\n\t\/\/fmt.Printf(\"-- accepted %v\\n\",ws.Config())\n\t\/\/fmt.Printf(\"-- accepted %v\\n\",ws.Config().Header)\n\t\/\/fmt.Printf(\"-- accepted %v \/\/ %v\\n\",ws,serv1)\n\n\tvar reqb = make([]byte,GSHWS_MSGSIZE)\n\tfor {\n\t\trn, rerr := ws.Read(reqb)\n\t\tif( rerr != nil || rn < 0 ){\n\t\t\tglog(\"SQ\",fmtstring(\"(%v,%v)\",rn,rerr))\n\t\t\tbreak\n\t\t}\n\t\treq := string(reqb[0:rn])\n\t\tglog(\"SQ\",fmtstring(\"(%v) %v\",rn,req))\n\n\t\tmargv := strings.Split(req,\" \");\n\t\tmargv = margv[1:]\n\t\tif( 0 < len(margv) ){\n\t\t\tif( margv[0] == \"RESP\" ){\n\t\t\t\t\/\/ should forward to the destination\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tnow := time.Now()\n\t\tmsec := now.UnixNano() \/ 1000000;\n\t\ttstamp := fmtstring(\"%.3f\",float64(msec)\/1000.0)\n\t\tres := fmtstring(\"%v \"+\"CAST\"+\" %v\",tstamp,req)\n\t\twn, werr := ws.Write([]byte(res))\n\t\tgchk(\"SE\",werr)\n\t\tglog(\"SR\",fmtstring(\"(%v) %v\",wn,string(res)))\n\t}\n\tglog(\"SF\",\"WS response finish\")\n\n\twsv := []*websocket.Conn{}\n\tfor _,v := range WSV {\n\t\tif( v != ws ){\n\t\t\twsv = append(wsv,v)\n\t\t}\n\t}\n\tWSV = wsv\n\tfmt.Printf(\"-- closed %v\\n\",ws)\n\tws.Close()\n}\nfunc gj_server(argv []string) {\n\tport := gshws_port\n\tglog(\"LS\",fmtstring(\"listening at %v\",gshws_url))\n\thttp.Handle(\"\/\"+gshws_path,websocket.Handler(serv1))\n\terr := http.ListenAndServe(port,nil)\n\tgchk(\"LE\",err)\n}\n\nfunc gj_client(argv []string) {\n\tglog(\"CS\",fmtstring(\"connecting to %v\",gshws_url))\n \tws, err := websocket.Dial(gshws_url,\"\",gshws_origin)\n\tgchk(\"C\",err)\n\n\tvar resb = make([]byte, GSHWS_MSGSIZE)\n\tfor qi := 0; qi < 3; qi++ {\n\t\treq := fmtstring(\"Hello, GShell! (%v)\",qi)\n\t\twn, werr := ws.Write([]byte(req))\n\t\tglog(\"QM\",fmtstring(\"(%v) %v\",wn,req))\n\t\tgchk(\"QE\",werr)\n\t\trn, rerr := ws.Read(resb)\n\t\tgchk(\"RE\",rerr)\n\t\tglog(\"RM\",fmtstring(\"(%v) %v\",rn,string(resb)))\n\t}\n\tglog(\"CF\",\"WS request finish\")\n}\n\/\/<\/details><\/span>\n\n\/*\n<span id=\"GJLinkView\">\n <p>\n <note class=\"gsh-note\">Execute command \"gsh gj listen\" on the localhost and push the Join button:<\/note>\n <\/p>\n <p>\n <span id=\"GJLink_1\">\n <input id=\"gj_join\" type=\"button\" class=\"joinButton\" onclick=\"GJ_Join()\" value=\"Join\">\n <script id=\"gj_xxxx_gen\">\n if( true ){\n  document.write('<'+'textarea id=\"gj_user\" class=\"textField\"><'+'\/textarea>');\n  document.write('<'+'textarea id=\"gj_ukey\" class=\"textField\"><'+'\/textarea>');\n  document.write('<'+'textarea id=\"gj_chan\" class=\"textField\"><'+'\/textarea>');\n  document.write('<'+'textarea id=\"gj_ckey\" class=\"textField\"><'+'\/textarea>');\n }\n <\/script>\n <br>\n <input id=\"gj_sendButton\" type=\"button\" class=\"joinButton SendButton\" onclick=\"GJ_Send()\" value=\"Send\" data-bodyid=\"gj_sendText\">\n <script id=\"gj_sendText_gen\">\n if( true ){\n  document.write('<'+'textarea id=\"gj_sendText\" class=\"textField\" cols=60 rows=3><'+'\/textarea>');\n }\n <\/script>\n <\/span><\/p>\n <p>\n <script id=\"ws0_log_gen\">\n if( true ){\n  document.write('<'+'textarea id=\"ws0_log\" class=\"ws0_log\" cols=90 rows=9><'+'\/textarea>');\n }\n <\/script>\n <\/p>\n<\/span>\n<script>\nfunction SetupGJLink(){\n\tSetupVisibleText(GJLink_1,gj_user,'UserName');\n\tSetupBlinderText(GJLink_1,gj_ukey,'UserKey');\n\tSetupVisibleText(GJLink_1,gj_chan,'ChannelName');\n\tSetupBlinderText(GJLink_1,gj_ckey,'ChannelKey');\n\tSetupVisibleText(GJLink_1,gj_sendText,'Message');\n}\nSetupGJLink();\nfunction iselem(eid){\n\treturn document.getElementById(eid);\n}\nfunction DestroyGJLink1(){\n\tif( iselem('gj_user') ) gj_user.parentNode.removeChild(gj_user);\n\tif( iselem('gj_ukey') ) gj_ukey.parentNode.removeChild(gj_ukey);\n\tif( iselem('gj_chan') ) gj_chan.parentNode.removeChild(gj_chan);\n\tif( iselem('gj_ckey') ) gj_ckey.parentNode.removeChild(gj_ckey);\n\tif( iselem('gj_sendText') ) gj_sendText.parentNode.removeChild(gj_sendText);\n\tif( iselem('ws0_log') ) ws0_log.parentNode.removeChild(ws0_log);\n}\nDestroyGJLink = DestroyGJLink1;\n<\/script>\n\n<form style=\"font-family:Courier New;color:black;font-size:12pt;white-space:pre;\">\nUsername: <input name=\"username1\" type=\"text\" autocomplete=\"username\">\nPassword: <input name=\"password1\" type=\"password\" autocomplete=\"current-password\">\n          <input type=\"submit\" value=\"Submit\">\n<\/form>\n*\/\n\n\/*\n*\/\/\/<br><\/span><\/html>\n","protected":false},"excerpt":{"rendered":"<p>\u793e\u9577\uff1a\u4eca\u65e5\u306f\u3082\u3046\u304a\u663c\u8fd1\u3044\u306e\u306b\u3001\u5999\u306b\u9759\u304b\u306a\u65e5\u3067\u3059\u306d\u3002 \u958b\u767a\uff1a\u304a\u6b63\u6708\u307f\u305f\u3044\u3067\u3059\u306d\u3002\u4ea4\u901a\u97f3\u3082\u751f\u6d3b\u97f3\u3082\u3057\u3066\u6765\u306a\u3044\u3002\u30ab\u30e9\u30b9\u304c\u9cf4\u3044\u3066\u308b\u3057\u3002 \u57fa\u76e4\uff1a\u305d\u3046\u3044\u3048\u3070\u30a4\u30c4\u30e2\u306f\u4f55\u306e\u97f3\u304c\u805e\u3053\u3048\u3066\u308b\u3093\u3067\u3057\u3087\u3046\u306d\u3002\u4eca\u805e\u3053\u3048\u308b\u306e\u306f\u30ec\u30ce\u30dc\u304c\u308f\u305a\u304b\u306b\u30e2\u30fc\u3063 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/its-more.jp\/ja_jp\/?p=19372\" class=\"more-link\"><span class=\"screen-reader-text\">\"\u30d1\u30b9\u30ef\u30fc\u30c9\u30de\u30cd\u30b8\u30e3\u30fc\u53ec\u559a\u6cd5\" \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/19372"}],"collection":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19372"}],"version-history":[{"count":130,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/19372\/revisions"}],"predecessor-version":[{"id":19570,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/19372\/revisions\/19570"}],"wp:attachment":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}