support proxy prefix

This commit is contained in:
sentriz
2020-01-27 17:00:23 +00:00
parent 6ad284aa3e
commit 2e85c95018
19 changed files with 401 additions and 361 deletions

View File

@@ -59,6 +59,7 @@ then start with `docker-compose up -d`
|`GONIC_MUSIC_PATH`|`-music-path`|path to your music collection| |`GONIC_MUSIC_PATH`|`-music-path`|path to your music collection|
|`GONIC_DB_PATH`|`-db-path`|**optional** path to database file| |`GONIC_DB_PATH`|`-db-path`|**optional** path to database file|
|`GONIC_LISTEN_ADDR`|`-listen-addr`|**optional** host and port to listen on (eg. `0.0.0.0:4747`, `127.0.0.1:4747`) (*default* `0.0.0.0:4747`)| |`GONIC_LISTEN_ADDR`|`-listen-addr`|**optional** host and port to listen on (eg. `0.0.0.0:4747`, `127.0.0.1:4747`) (*default* `0.0.0.0:4747`)|
|`GONIC_PROXY_PREFIX`|`-proxy-prefix`|**optional** url path prefix to use if behind reverse proxy. eg `/gonic`|
|`GONIC_SCAN_INTERVAL`|`-scan-interval`|**optional** interval (in minutes) to check for new music (automatic scanning disabled if omitted)| |`GONIC_SCAN_INTERVAL`|`-scan-interval`|**optional** interval (in minutes) to check for new music (automatic scanning disabled if omitted)|
## screenshots ## screenshots

View File

@@ -11,7 +11,7 @@ type EmbeddedAsset struct {
} }
var Bytes = map[string]*EmbeddedAsset{ var Bytes = map[string]*EmbeddedAsset{
"pages/change_password.tmpl": &EmbeddedAsset{ "pages/change_password.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384385, 0), ModTime: time.Unix(1580143156, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -20,25 +20,26 @@ var Bytes = map[string]*EmbeddedAsset{
0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x6b,0x65,0x79,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x68,0x61, 0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x6b,0x65,0x79,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x68,0x61,
0x6e,0x67,0x69,0x6e,0x67,0x20,0x7b,0x7b,0x20,0x2e,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e, 0x6e,0x67,0x69,0x6e,0x67,0x20,0x7b,0x7b,0x20,0x2e,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e,
0x61,0x6d,0x65,0x20,0x7d,0x7d,0x27,0x73,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f, 0x61,0x6d,0x65,0x20,0x7d,0x7d,0x27,0x73,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,
0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x2f, 0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x7b,
0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x64,0x6f, 0x7b,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,
0x3f,0x75,0x73,0x65,0x72,0x3d,0x7b,0x7b,0x20,0x2e,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e, 0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x64,0x6f,0x3f,0x75,0x73,0x65,0x72,0x3d,0x25,0x73,0x22,0x20,0x2e,0x53,0x65,
0x61,0x6d,0x65,0x20,0x7d,0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20, 0x6c,0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7c,0x20,0x70,0x61,0x74,0x68,0x20,0x7d,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73, 0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20, 0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,
0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70,0x6c,0x61,0x63, 0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,
0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a, 0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73, 0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22, 0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x70,0x6c,0x61, 0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x6e,0x61,0x6d,0x65,
0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x6e,0x65,0x77,0x20,0x70,0x61,0x73, 0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,
0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, 0x64,0x65,0x72,0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63,0x68,0x61,0x6e, 0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a, 0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63,0x68,0x61,0x6e,0x67,0x65,0x22,0x3e,0x0a,
0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,
0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/login.tmpl": &EmbeddedAsset{ "pages/login.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565387223, 0), ModTime: time.Unix(1580142568, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c,
0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a, 0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,
@@ -46,21 +47,22 @@ var Bytes = map[string]*EmbeddedAsset{
0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64, 0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,
0x69,0x20,0x6d,0x64,0x69,0x2d,0x6c,0x6f,0x67,0x69,0x6e,0x2d,0x76,0x61,0x72,0x69,0x61,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69, 0x69,0x20,0x6d,0x64,0x69,0x2d,0x6c,0x6f,0x67,0x69,0x6e,0x2d,0x76,0x61,0x72,0x69,0x61,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69,
0x3e,0x20,0x6c,0x6f,0x67,0x69,0x6e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c, 0x3e,0x20,0x6c,0x6f,0x67,0x69,0x6e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x6c,0x6f,0x67,0x69, 0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,
0x6e,0x5f,0x64,0x6f,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x64,0x6d,0x69,0x6e,0x2f,0x6c,0x6f,0x67,0x69,0x6e,0x5f,0x64,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,
0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20, 0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,
0x69,0x64,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x75,0x73,0x65,0x72, 0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,
0x6e,0x61,0x6d,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e, 0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,
0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70, 0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72, 0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
0x64,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x70,0x6c,0x61,0x63,0x65, 0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,
0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, 0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x70,0x61,0x73,
0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20, 0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,
0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x6c,0x6f,0x67,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72, 0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x6c,0x6f,0x67,0x69,
0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,
0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/home.tmpl": &EmbeddedAsset{ "pages/home.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1579270806, 0), ModTime: time.Unix(1580143754, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -97,182 +99,190 @@ var Bytes = map[string]*EmbeddedAsset{
0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6c,0x61,0x73,0x74,0x2e,0x66,0x6d,0x2f,0x61,0x70,0x69,0x2f,0x61,0x63,0x63,0x6f,0x75,0x6e, 0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6c,0x61,0x73,0x74,0x2e,0x66,0x6d,0x2f,0x61,0x70,0x69,0x2f,0x61,0x63,0x63,0x6f,0x75,0x6e,
0x74,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x22,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x3d,0x22,0x5f,0x62,0x6c,0x61,0x6e,0x6b, 0x74,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x22,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x3d,0x22,0x5f,0x62,0x6c,0x61,0x6e,0x6b,
0x22,0x3e,0x68,0x65,0x72,0x65,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x22,0x3e,0x68,0x65,0x72,0x65,0x3c,0x2f,0x61,0x3e,0x3c,0x2f,0x70,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x70,0x64,0x61,0x74, 0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,
0x65,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x22,0x3e,0x75,0x70,0x64,0x61,0x74,0x65, 0x6d,0x69,0x6e,0x2f,0x75,0x70,0x64,0x61,0x74,0x65,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x61,0x70,0x69,0x5f,0x6b,0x65,
0x20,0x61,0x70,0x69,0x20,0x6b,0x65,0x79,0x3c,0x2f,0x61,0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, 0x79,0x22,0x20,0x7d,0x7d,0x22,0x3e,0x75,0x70,0x64,0x61,0x74,0x65,0x20,0x61,0x70,0x69,0x20,0x6b,0x65,0x79,0x3c,0x2f,0x61,
0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69, 0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,
0x66,0x20,0x2e,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,0x4c,0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x4b,0x65,0x79,0x20,0x7d, 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x2e,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,0x4c,
0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73, 0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x4b,0x65,0x79,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x20,0x73,0x74,0x61,0x74,0x75,0x73, 0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x63,
0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69, 0x75,0x72,0x72,0x65,0x6e,0x74,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,
0x66,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x4c,0x61,0x73,0x74,0x46,0x4d,0x53,0x65,0x73,0x73,0x69,0x6f,0x6e,0x20,0x7d,0x7d, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x4c,0x61,0x73,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x6b,0x65,0x64,0x0a, 0x74,0x46,0x4d,0x53,0x65,0x73,0x73,0x69,0x6f,0x6e,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c, 0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x6b,0x65,0x64,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,
0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,
0x64,0x6f,0x22,0x3e,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x3c,0x2f,0x61,0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,
0x61,0x6e,0x67,0x72,0x79,0x22,0x3e,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x65,0x64,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,
0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6c,0x61,0x73,0x74,0x2e,0x66,0x6d,0x2f,0x61,0x70,0x69,0x2f,
0x61,0x75,0x74,0x68,0x2f,0x3f,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x3d,0x7b,0x7b,0x20,0x2e,0x43,0x75,0x72,0x72,0x65,0x6e,
0x74,0x4c,0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x4b,0x65,0x79,0x20,0x7d,0x7d,0x26,0x63,0x62,0x3d,0x7b,0x7b,0x20,0x2e,
0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x52,0x6f,0x6f,0x74,0x20,0x7d,0x7d,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x6c,0x69,0x6e,
0x6b,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x64,0x6f,0x22,0x3e,0x6c,0x69,0x6e,0x6b,0x3c,0x2f,0x61,0x3e,0x3c,0x62,0x72,
0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x6e,0x6f,0x74,0x20,
0x2e,0x55,0x73,0x65,0x72,0x2e,0x49,0x73,0x41,0x64,0x6d,0x69,0x6e,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22, 0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,
0x3e,0x61,0x70,0x69,0x20,0x6b,0x65,0x79,0x20,0x6e,0x6f,0x74,0x20,0x73,0x65,0x74,0x2e,0x20,0x70,0x6c,0x65,0x61,0x73,0x65, 0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x61,0x73,0x6b,0x20,0x79,0x6f,0x75,0x72,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x74,0x6f,0x20,0x73,0x65,0x74,0x20,0x69, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,
0x74,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20, 0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x64,0x6f,
0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x64,0x69, 0x22,0x20,0x7d,0x7d,0x22,0x3e,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x3c,0x2f,0x61,0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,
0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,
0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x49,0x73,0x41,0x64,0x6d,0x69,0x6e,0x20,0x7d,0x7d, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x2f,0x2a,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x70,0x61,0x6e,0x65, 0x3d,0x22,0x61,0x6e,0x67,0x72,0x79,0x22,0x3e,0x75,0x6e,0x6c,0x69,0x6e,0x6b,0x65,0x64,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,
0x6c,0x20,0x74,0x6f,0x20,0x6d,0x61,0x6e,0x61,0x67,0x65,0x20,0x61,0x6c,0x6c,0x20,0x75,0x73,0x65,0x72,0x73,0x20,0x2a,0x2f, 0x0a,0x09,0x09,0x7b,0x7b,0x20,0x24,0x63,0x62,0x50,0x61,0x74,0x68,0x20,0x3a,0x3d,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,
0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62, 0x61,0x64,0x6d,0x69,0x6e,0x2f,0x6c,0x69,0x6e,0x6b,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x64,0x6f,0x22,0x20,0x7d,0x7d,
0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, 0x0a,0x09,0x09,0x7b,0x7b,0x20,0x24,0x63,0x62,0x55,0x52,0x4c,0x20,0x3a,0x3d,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x22,
0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74, 0x25,0x73,0x25,0x73,0x22,0x20,0x2e,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x52,0x6f,0x6f,0x74,0x20,0x24,0x63,0x62,0x50,0x61,
0x2d,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x65,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x75,0x73,0x65,0x72,0x73,0x0a,0x20,0x20, 0x74,0x68,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,
0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69, 0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6c,0x61,0x73,0x74,0x2e,
0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20, 0x66,0x6d,0x2f,0x61,0x70,0x69,0x2f,0x61,0x75,0x74,0x68,0x2f,0x3f,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x3d,0x7b,0x7b,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,0x6e,0x67,0x65,0x20,0x24,0x75,0x73,0x65,0x72,0x20,0x3a,0x3d,0x20, 0x2e,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,0x4c,0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x4b,0x65,0x79,0x20,0x7d,0x7d,0x26,
0x2e,0x41,0x6c,0x6c,0x55,0x73,0x65,0x72,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x63,0x62,0x3d,0x7b,0x7b,0x20,0x24,0x63,0x62,0x55,0x52,0x4c,0x20,0x7d,0x7d,0x22,0x3e,0x6c,0x69,0x6e,0x6b,0x3c,0x2f,0x61,
0x20,0x3c,0x69,0x3e,0x7b,0x7b,0x20,0x24,0x75,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x69,0x3e, 0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73, 0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,
0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x20,0x6e,0x6f,0x2d,0x73,0x6d,0x61,0x6c,0x6c,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x75,0x73, 0x6e,0x6f,0x74,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x49,0x73,0x41,0x64,0x6d,0x69,0x6e,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,
0x65,0x72,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x2e,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x22,0x6a,0x61,0x6e,
0x20,0x30,0x32,0x2c,0x20,0x32,0x30,0x30,0x36,0x22,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,
0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, 0x67,0x68,0x74,0x22,0x3e,0x61,0x70,0x69,0x20,0x6b,0x65,0x79,0x20,0x6e,0x6f,0x74,0x20,0x73,0x65,0x74,0x2e,0x20,0x70,0x6c,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63, 0x65,0x61,0x73,0x65,0x20,0x61,0x73,0x6b,0x20,0x79,0x6f,0x75,0x72,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,0x74,0x6f,0x20,0x73,
0x68,0x61,0x6e,0x67,0x65,0x5f,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x3f,0x75,0x73,0x65,0x72,0x3d,0x7b,0x7b,0x20,0x24, 0x65,0x74,0x20,0x69,0x74,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,
0x75,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x22,0x3e,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x70,0x61,0x73, 0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,
0x73,0x77,0x6f,0x72,0x64,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73, 0x0a,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,
0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b, 0x3e,0x0a,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x49,0x73,0x41,0x64,0x6d,0x69,
0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68, 0x6e,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x2f,0x2a,0x20,0x61,0x64,0x6d,0x69,0x6e,0x20,
0x72,0x65,0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x3f, 0x70,0x61,0x6e,0x65,0x6c,0x20,0x74,0x6f,0x20,0x6d,0x61,0x6e,0x61,0x67,0x65,0x20,0x61,0x6c,0x6c,0x20,0x75,0x73,0x65,0x72,
0x75,0x73,0x65,0x72,0x3d,0x7b,0x7b,0x20,0x24,0x75,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x22,0x3e,0x64, 0x73,0x20,0x2a,0x2f,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,
0x65,0x6c,0x65,0x74,0x65,0x3c,0x2f,0x61,0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, 0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, 0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x61,0x63,0x63,
0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x22,0x20,0x63,0x6c, 0x6f,0x75,0x6e,0x74,0x2d,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x65,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x75,0x73,0x65,0x72,
0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x6e,0x65,0x77,0x3c, 0x73,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x7b, 0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,
0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x2f,0x2a,0x20,0x75, 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,0x6e,0x67,0x65,0x20,0x24,0x75,0x73,0x65,0x72,
0x73,0x65,0x72,0x20,0x70,0x61,0x6e,0x65,0x6c,0x20,0x74,0x6f,0x20,0x6d,0x61,0x6e,0x61,0x67,0x65,0x20,0x74,0x68,0x65,0x6d, 0x20,0x3a,0x3d,0x20,0x2e,0x41,0x6c,0x6c,0x55,0x73,0x65,0x72,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x73,0x65,0x6c,0x76,0x65,0x73,0x20,0x2a,0x2f,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76, 0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x3e,0x7b,0x7b,0x20,0x24,0x75,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20, 0x3c,0x2f,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,
0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x20,0x6e,0x6f,0x2d,0x73,0x6d,0x61,0x6c,0x6c,0x22,0x3e,0x7b,0x7b,
0x20,0x24,0x75,0x73,0x65,0x72,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x2e,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,
0x22,0x6a,0x61,0x6e,0x20,0x30,0x32,0x2c,0x20,0x32,0x30,0x30,0x36,0x22,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,
0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,
0x72,0x69,0x6e,0x74,0x66,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x70,0x61,0x73,
0x73,0x77,0x6f,0x72,0x64,0x3f,0x75,0x73,0x65,0x72,0x3d,0x25,0x73,0x22,0x20,0x24,0x75,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,
0x65,0x20,0x7c,0x20,0x70,0x61,0x74,0x68,0x20,0x7d,0x7d,0x22,0x3e,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x70,0x61,0x73,0x73,
0x77,0x6f,0x72,0x64,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,
0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,
0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,
0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x64,0x65,
0x6c,0x65,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x3f,0x75,0x73,0x65,0x72,0x3d,0x25,0x73,0x22,0x20,0x24,0x75,0x73,0x65,0x72,
0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7c,0x20,0x70,0x61,0x74,0x68,0x20,0x7d,0x7d,0x22,0x3e,0x64,0x65,0x6c,0x65,0x74,0x65,0x3c,
0x2f,0x61,0x3e,0x3c,0x62,0x72,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,
0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,
0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x22,
0x20,0x7d,0x7d,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x63,0x72,0x65,0x61,
0x74,0x65,0x20,0x6e,0x65,0x77,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6c,0x73,0x65,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x7b,0x7b,0x2f,0x2a,0x20,0x75,0x73,0x65,0x72,0x20,0x70,0x61,0x6e,0x65,0x6c,0x20,0x74,0x6f,0x20,0x6d,0x61,0x6e,0x61,
0x67,0x65,0x20,0x74,0x68,0x65,0x6d,0x73,0x65,0x6c,0x76,0x65,0x73,0x20,0x2a,0x2f,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,
0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,
0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x79,
0x6f,0x75,0x72,0x20,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,
0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,
0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,
0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x6f,0x77,0x6e,0x5f,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x7d,0x7d,
0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,
0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,
0x0a,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,
0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,
0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x65,0x22,
0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x72,0x65,0x63,0x65,0x6e,0x74,0x20,0x66,0x6f,0x6c,0x64,0x65,0x72,0x73,0x0a,0x20,0x20,0x20,
0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,
0x62,0x6c,0x6f,0x63,0x6b,0x2d,0x72,0x69,0x67,0x68,0x74,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x65,0x71,0x20,0x28,0x6c,0x65,0x6e,0x20,0x2e,
0x52,0x65,0x63,0x65,0x6e,0x74,0x46,0x6f,0x6c,0x64,0x65,0x72,0x73,0x29,0x20,0x30,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,
0x68,0x74,0x22,0x3e,0x6e,0x6f,0x20,0x66,0x6f,0x6c,0x64,0x65,0x72,0x73,0x20,0x79,0x65,0x74,0x3c,0x2f,0x73,0x70,0x61,0x6e,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69,0x64,0x3d,0x22,0x72,0x65,0x63,0x65,0x6e,0x74,0x2d,0x66,0x6f,
0x6c,0x64,0x65,0x72,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,0x6e,0x67,0x65,
0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x20,0x3a,0x3d,0x20,0x2e,0x52,0x65,0x63,0x65,0x6e,0x74,0x46,0x6f,0x6c,0x64,0x65,
0x72,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e,0x0a,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,0x65,
0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2e,0x52,0x69,0x67,
0x68,0x74,0x50,0x61,0x74,0x68,0x20,0x7d,0x7d,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6e,0x6f,0x2d,0x73,0x6d,0x61,0x6c,0x6c,0x22,0x3e,
0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x69,0x74,0x6c,
0x65,0x3d,0x22,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2e,0x4d,0x6f,0x64,0x69,0x66,0x69,0x65,0x64,0x41,0x74,
0x20,0x7d,0x7d,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2e,0x4d,0x6f,0x64,0x69,0x66,0x69,0x65,0x64,
0x41,0x74,0x20,0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,0x74,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,
0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x72,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x2d,0x20,0x69,
0x66,0x20,0x6e,0x6f,0x74,0x20,0x2e,0x49,0x73,0x53,0x63,0x61,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x2d,0x7d,0x7d,0x0a,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,
0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x72,0x74,0x5f,0x73,0x63,0x61,0x6e,0x5f,0x64,0x6f,
0x22,0x20,0x7d,0x7d,0x22,0x3e,0x73,0x74,0x61,0x72,0x74,0x20,0x73,0x63,0x61,0x6e,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x2d,0x20,0x69,0x66,0x20,0x6e,0x6f,0x74,0x20,0x2e,0x4c,0x61,0x73,
0x74,0x53,0x63,0x61,0x6e,0x54,0x69,0x6d,0x65,0x2e,0x49,0x73,0x5a,0x65,0x72,0x6f,0x20,0x2d,0x7d,0x7d,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,
0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x7b,0x7b,0x20,0x2e,0x4c,0x61,0x73,0x74,0x53,0x63,0x61,
0x6e,0x54,0x69,0x6d,0x65,0x20,0x7d,0x7d,0x22,0x3e,0x73,0x63,0x61,0x6e,0x6e,0x65,0x64,0x20,0x7b,0x7b,0x20,0x2e,0x4c,0x61,
0x73,0x74,0x53,0x63,0x61,0x6e,0x54,0x69,0x6d,0x65,0x20,0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,0x74,0x65,0x20,0x7d,
0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,
0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,
0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x64,0x69,0x76,0x20,
0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,
0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x79,0x6f,0x75,0x72,0x20,0x61,0x63,0x63, 0x69,0x2d,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x6d,0x75,0x73,0x69,0x63,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x70,
0x6f,0x75,0x6e,0x74,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20, 0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67, 0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6c,0x6f,0x63,0x6b,0x2d,0x72,0x69,0x67,0x68,0x74,0x20,
0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66, 0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,
0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x6f,0x77,0x6e,0x5f,0x70,0x61,0x73,0x73, 0x69,0x66,0x20,0x65,0x71,0x20,0x28,0x6c,0x65,0x6e,0x20,0x2e,0x50,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x29,0x20,0x30,
0x77,0x6f,0x72,0x64,0x22,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x63,0x68,0x61, 0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,
0x6e,0x67,0x65,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x6e,0x6f,0x20,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,
0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x3c,0x2f, 0x20,0x79,0x65,0x74,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,
0x64,0x69,0x76,0x3e,0x0a,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20, 0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69,0x64,0x3d,
0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x62,0x6f, 0x22,0x72,0x65,0x63,0x65,0x6e,0x74,0x2d,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61, 0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,0x6e,0x67,0x65,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x20,0x3a,
0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6d,0x75,0x6c,0x74,0x69, 0x3d,0x20,0x2e,0x50,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x70,0x6c,0x65,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x72,0x65,0x63,0x65,0x6e,0x74,0x20,0x66,0x6f,0x6c,0x64,0x65,0x72,0x73, 0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,
0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x7b,0x7b,0x20,0x24,
0x73,0x73,0x3d,0x22,0x62,0x6c,0x6f,0x63,0x6b,0x2d,0x72,0x69,0x67,0x68,0x74,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67, 0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,
0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x65,0x71,0x20,0x28,0x6c, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x3e,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,
0x65,0x6e,0x20,0x2e,0x52,0x65,0x63,0x65,0x6e,0x74,0x46,0x6f,0x6c,0x64,0x65,0x72,0x73,0x29,0x20,0x30,0x20,0x7d,0x7d,0x0a, 0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x28,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, 0x54,0x72,0x61,0x63,0x6b,0x43,0x6f,0x75,0x6e,0x74,0x20,0x7d,0x7d,0x20,0x74,0x72,0x61,0x63,0x6b,0x73,0x29,0x3c,0x2f,0x73,
0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x6e,0x6f,0x20,0x66,0x6f,0x6c,0x64,0x65,0x72,0x73,0x20,0x79,0x65,0x74,0x3c,0x2f, 0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,
0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6e,0x6f,0x2d,0x73,0x6d,0x61,0x6c,0x6c,0x22,0x3e,0x3c,0x73,0x70,0x61,0x6e,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69,0x64,0x3d,0x22,0x72,0x65,0x63,0x65,0x6e, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x7b,0x7b,
0x74,0x2d,0x66,0x6f,0x6c,0x64,0x65,0x72,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72, 0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x20,0x7d,0x7d,0x22,
0x61,0x6e,0x67,0x65,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x20,0x3a,0x3d,0x20,0x2e,0x52,0x65,0x63,0x65,0x6e,0x74,0x46, 0x3e,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x20,
0x6f,0x6c,0x64,0x65,0x72,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, 0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,0x74,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x74,
0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73, 0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x72,0x3e,0x0a,0x20,0x20,0x20,
0x3d,0x22,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72, 0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
0x2e,0x52,0x69,0x67,0x68,0x74,0x50,0x61,0x74,0x68,0x20,0x7d,0x7d,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, 0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x0a,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6e,0x6f,0x2d,0x73,0x6d,0x61, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x64,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,
0x6c,0x6c,0x22,0x3e,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x20, 0x6f,0x61,0x64,0x2d,0x66,0x6f,0x72,0x6d,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x63,0x74,
0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2e,0x4d,0x6f,0x64,0x69,0x66,0x69, 0x79,0x70,0x65,0x3d,0x22,0x6d,0x75,0x6c,0x74,0x69,0x70,0x61,0x72,0x74,0x2f,0x66,0x6f,0x72,0x6d,0x2d,0x64,0x61,0x74,0x61,
0x65,0x64,0x41,0x74,0x20,0x7d,0x7d,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2e,0x4d,0x6f,0x64,0x69, 0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x7b,0x7b,0x20,0x70,
0x66,0x69,0x65,0x64,0x41,0x74,0x20,0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,0x74,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x73, 0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x70,0x6c,0x6f,0x61,0x64,0x5f,0x70,0x6c,0x61,0x79,0x6c,
0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f, 0x69,0x73,0x74,0x5f,0x64,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x65,
0x74,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20, 0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,0x0a,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x66,0x6f,0x72,0x3d,0x22,0x70,0x6c,
0x7b,0x2d,0x20,0x69,0x66,0x20,0x6e,0x6f,0x74,0x20,0x2e,0x49,0x73,0x53,0x63,0x61,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x2d,0x7d, 0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x69,0x6e,0x70,0x75,0x74,0x22,0x3e,0x0a,0x20,0x20,
0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x75,0x70,0x6c,0x6f,0x61,0x64,0x20,
0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x72,0x74,0x5f,0x73,0x63,0x61,0x6e,0x5f,0x64,0x6f,0x22,0x3e,0x73,0x74,0x61, 0x6d,0x33,0x75,0x38,0x20,0x66,0x69,0x6c,0x65,0x73,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x72,0x74,0x20,0x73,0x63,0x61,0x6e,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x7b,0x7b,0x2d,0x20,0x69,0x66,0x20,0x6e,0x6f,0x74,0x20,0x2e,0x4c,0x61,0x73,0x74,0x53,0x63,0x61,0x6e,0x54,0x69,0x6d,0x65, 0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x69,0x64,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,
0x2e,0x49,0x73,0x5a,0x65,0x72,0x6f,0x20,0x2d,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x61,0x64,0x2d,0x69,0x6e,0x70,0x75,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,
0x20,0x20,0x20,0x20,0x3c,0x62,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x2d,0x66,0x69,0x6c,0x65,0x73,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x66,0x69,0x6c,0x65,0x22,0x20,0x6d,0x75,0x6c,0x74,
0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x69,0x74, 0x69,0x70,0x6c,0x65,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,
0x6c,0x65,0x3d,0x22,0x7b,0x7b,0x20,0x2e,0x4c,0x61,0x73,0x74,0x53,0x63,0x61,0x6e,0x54,0x69,0x6d,0x65,0x20,0x7d,0x7d,0x22, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x3e,0x73,0x63,0x61,0x6e,0x6e,0x65,0x64,0x20,0x7b,0x7b,0x20,0x2e,0x4c,0x61,0x73,0x74,0x53,0x63,0x61,0x6e,0x54,0x69,0x6d, 0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,
0x65,0x20,0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,0x74,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a, 0x42,0x79,0x49,0x64,0x28,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x69,0x6e,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20, 0x70,0x75,0x74,0x22,0x29,0x2e,0x6f,0x6e,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x3d,0x20,0x28,0x65,0x29,0x20,0x3d,0x3e,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69, 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,
0x76,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61, 0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x70,0x6c,0x61,0x79,0x6c,
0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73, 0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x66,0x6f,0x72,0x6d,0x22,0x29,0x2e,0x73,0x75,0x62,0x6d,0x69,0x74,
0x73,0x3d,0x22,0x62,0x6f,0x78,0x2d,0x74,0x69,0x74,0x6c,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, 0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73, 0x20,0x20,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x3c,
0x74,0x2d,0x6d,0x75,0x73,0x69,0x63,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x0a, 0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,
0x73,0x3d,0x22,0x62,0x6c,0x6f,0x63,0x6b,0x2d,0x72,0x69,0x67,0x68,0x74,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,
0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x69,0x66,0x20,0x65,0x71,0x20,0x28,0x6c,0x65,
0x6e,0x20,0x2e,0x50,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x29,0x20,0x30,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,
0x74,0x22,0x3e,0x6e,0x6f,0x20,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x20,0x79,0x65,0x74,0x3c,0x2f,0x73,0x70,0x61,
0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x69,0x64,0x3d,0x22,0x72,0x65,0x63,0x65,0x6e,0x74,0x2d,0x70,
0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,
0x6e,0x67,0x65,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x20,0x3a,0x3d,0x20,0x2e,0x50,0x6c,0x61,0x79,0x6c,0x69,
0x73,0x74,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x72,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x74,
0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,
0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x3c,0x74,0x64,0x3e,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,
0x3e,0x28,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2e,0x54,0x72,0x61,0x63,0x6b,0x43,0x6f,0x75,0x6e,
0x74,0x20,0x7d,0x7d,0x20,0x74,0x72,0x61,0x63,0x6b,0x73,0x29,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x74,0x64,0x3e,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,
0x6e,0x6f,0x2d,0x73,0x6d,0x61,0x6c,0x6c,0x22,0x3e,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,
0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,
0x74,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x20,0x7d,0x7d,0x22,0x3e,0x7b,0x7b,0x20,0x24,0x70,0x6c,0x61,0x79,
0x6c,0x69,0x73,0x74,0x2e,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x41,0x74,0x20,0x7c,0x20,0x68,0x75,0x6d,0x61,0x6e,0x44,0x61,
0x74,0x65,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x3c,0x2f,0x74,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,
0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0a,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,
0x64,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x66,0x6f,0x72,0x6d,0x22,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x63,0x74,0x79,0x70,0x65,0x3d,0x22,0x6d,0x75,0x6c,0x74,
0x69,0x70,0x61,0x72,0x74,0x2f,0x66,0x6f,0x72,0x6d,0x2d,0x64,0x61,0x74,0x61,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x70,0x6c,0x6f,0x61,0x64,
0x5f,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x5f,0x64,0x6f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x20,0x66,0x6f,0x72,0x3d,0x22,
0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x69,0x6e,0x70,0x75,0x74,0x22,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x3e,0x75,0x70,0x6c,0x6f,0x61,
0x64,0x20,0x6d,0x33,0x75,0x38,0x20,0x66,0x69,0x6c,0x65,0x73,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x69,0x64,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,
0x6c,0x6f,0x61,0x64,0x2d,0x69,0x6e,0x70,0x75,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,
0x73,0x74,0x2d,0x66,0x69,0x6c,0x65,0x73,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x66,0x69,0x6c,0x65,0x22,0x20,0x6d,0x75,
0x6c,0x74,0x69,0x70,0x6c,0x65,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,
0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x70,0x6c,0x61,0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,
0x69,0x6e,0x70,0x75,0x74,0x22,0x29,0x2e,0x6f,0x6e,0x63,0x68,0x61,0x6e,0x67,0x65,0x20,0x3d,0x20,0x28,0x65,0x29,0x20,0x3d,
0x3e,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x6f,0x63,0x75,
0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x70,0x6c,0x61,
0x79,0x6c,0x69,0x73,0x74,0x2d,0x75,0x70,0x6c,0x6f,0x61,0x64,0x2d,0x66,0x6f,0x72,0x6d,0x22,0x29,0x2e,0x73,0x75,0x62,0x6d,
0x69,0x74,0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x3c,0x2f,0x73,0x63,0x72,0x69,0x70,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,
0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/delete_user.tmpl": &EmbeddedAsset{ "pages/delete_user.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384392, 0), ModTime: time.Unix(1580143173, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -288,15 +298,16 @@ var Bytes = map[string]*EmbeddedAsset{
0x73,0x2c,0x20,0x73,0x74,0x61,0x72,0x72,0x65,0x64,0x2c,0x20,0x65,0x74,0x63,0x2e,0x20,0x77,0x69,0x6c,0x6c,0x20,0x61,0x6c, 0x73,0x2c,0x20,0x73,0x74,0x61,0x72,0x72,0x65,0x64,0x2c,0x20,0x65,0x74,0x63,0x2e,0x20,0x77,0x69,0x6c,0x6c,0x20,0x61,0x6c,
0x73,0x6f,0x20,0x62,0x65,0x20,0x64,0x65,0x6c,0x65,0x74,0x65,0x64,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20, 0x73,0x6f,0x20,0x62,0x65,0x20,0x64,0x65,0x6c,0x65,0x74,0x65,0x64,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e, 0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,
0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x5f,0x64,0x6f,0x3f, 0x3d,0x22,0x7b,0x7b,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x64,0x65,0x6c,0x65,
0x75,0x73,0x65,0x72,0x3d,0x7b,0x7b,0x20,0x2e,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e,0x61, 0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x5f,0x64,0x6f,0x3f,0x75,0x73,0x65,0x72,0x3d,0x25,0x73,0x22,0x20,0x2e,0x53,0x65,0x6c,
0x6d,0x65,0x20,0x7d,0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20, 0x65,0x63,0x74,0x65,0x64,0x55,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7c,0x20,0x70,0x61,0x74,0x68,0x20,0x7d,0x7d,
0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69, 0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x79,0x65,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f, 0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,
0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x6c,0x75,0x65,0x3d,0x22,0x79,0x65,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,
0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/update_lastfm_api_key.tmpl": &EmbeddedAsset{ "pages/update_lastfm_api_key.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384400, 0), ModTime: time.Unix(1580143015, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -315,21 +326,22 @@ var Bytes = map[string]*EmbeddedAsset{
0x7b,0x20,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x20,0x22,0x6e,0x6f,0x74,0x20,0x73,0x65,0x74,0x22,0x20,0x2e,0x43,0x75,0x72, 0x7b,0x20,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x20,0x22,0x6e,0x6f,0x74,0x20,0x73,0x65,0x74,0x22,0x20,0x2e,0x43,0x75,0x72,
0x72,0x65,0x6e,0x74,0x4c,0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x53,0x65,0x63,0x72,0x65,0x74,0x20,0x7d,0x7d,0x3c,0x2f, 0x72,0x65,0x6e,0x74,0x4c,0x61,0x73,0x74,0x46,0x4d,0x41,0x50,0x49,0x53,0x65,0x63,0x72,0x65,0x74,0x20,0x7d,0x7d,0x3c,0x2f,
0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20, 0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,
0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x75,0x70,0x64,0x61,0x74,0x65,0x5f,0x6c,0x61, 0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,
0x73,0x74,0x66,0x6d,0x5f,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x5f,0x64,0x6f,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d, 0x75,0x70,0x64,0x61,0x74,0x65,0x5f,0x6c,0x61,0x73,0x74,0x66,0x6d,0x5f,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x5f,0x64,0x6f,
0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74, 0x22,0x20,0x7d,0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x22,0x20, 0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,
0x6e,0x61,0x6d,0x65,0x3d,0x22,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64, 0x69,0x64,0x3d,0x22,0x61,0x70,0x69,0x5f,0x6b,0x65,0x79,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x61,0x70,0x69,0x5f,0x6b,
0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x6b,0x65,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69, 0x65,0x79,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x6b,0x65,0x79,
0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x73,0x65,0x63, 0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
0x72,0x65,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x63,0x72,0x65,0x74,0x22,0x20,0x70,0x6c,0x61,0x63,0x65, 0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x73,0x65,0x63,0x72,0x65,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x73,0x65,0x63,0x72,0x65,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x73,0x65,0x63,0x72,0x65,0x74,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,
0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74, 0x20,0x73,0x65,0x63,0x72,0x65,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,
0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x75,0x70,0x64,0x61,0x74,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f, 0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x75,0x70,
0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x64,0x61,0x74,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,
0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/change_own_password.tmpl": &EmbeddedAsset{ "pages/change_own_password.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384383, 0), ModTime: time.Unix(1580143781, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -338,23 +350,24 @@ var Bytes = map[string]*EmbeddedAsset{
0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x6b,0x65,0x79,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x68,0x61, 0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x6b,0x65,0x79,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x68,0x61,
0x6e,0x67,0x69,0x6e,0x67,0x20,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x0a,0x20, 0x6e,0x67,0x69,0x6e,0x67,0x20,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x0a,0x20,
0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69, 0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,
0x6f,0x6e,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,0x67,0x65,0x5f,0x6f,0x77,0x6e,0x5f,0x70,0x61, 0x6f,0x6e,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x68,0x61,0x6e,
0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x64,0x6f,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22, 0x67,0x65,0x5f,0x6f,0x77,0x6e,0x5f,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x64,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x20,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70, 0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e, 0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,
0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70, 0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,
0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64, 0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,
0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22, 0x22,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74, 0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,
0x77,0x6f,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20, 0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,
0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x6e,0x65,0x77,0x20, 0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, 0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x6e,0x65,0x77,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,
0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,
0x68,0x61,0x6e,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69, 0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63,0x68,0x61,0x6e,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,
0x7d,0x0a,
}}, }},
"pages/create_user.tmpl": &EmbeddedAsset{ "pages/create_user.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384389, 0), ModTime: time.Unix(1580142992, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76,
0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
@@ -362,23 +375,24 @@ var Bytes = map[string]*EmbeddedAsset{
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d, 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,
0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x70,0x6c,0x75,0x73,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x72, 0x64,0x69,0x2d,0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0x2d,0x70,0x6c,0x75,0x73,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x63,0x72,
0x65,0x61,0x74,0x69,0x6e,0x67,0x20,0x6e,0x65,0x77,0x20,0x75,0x73,0x65,0x72,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69, 0x65,0x61,0x74,0x69,0x6e,0x67,0x20,0x6e,0x65,0x77,0x20,0x75,0x73,0x65,0x72,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,
0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x2f,0x61,0x64, 0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,0x6d,0x20,0x61,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x7b,0x7b,0x20,
0x6d,0x69,0x6e,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,0x5f,0x64,0x6f,0x22,0x20,0x6d,0x65,0x74,0x68, 0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x63,0x72,0x65,0x61,0x74,0x65,0x5f,0x75,0x73,0x65,0x72,
0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75, 0x5f,0x64,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,0x0a,
0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x74,0x65,0x78,
0x6d,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x70,0x6c,0x61,0x63, 0x74,0x22,0x20,0x69,0x64,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x75,
0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x75,0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20, 0x73,0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x75,0x73,
0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72, 0x65,0x72,0x6e,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,
0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d, 0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,
0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f, 0x77,0x6f,0x72,0x64,0x5f,0x6f,0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
0x6c,0x64,0x65,0x72,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x5f,0x6f,0x6e,0x65,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,
0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20, 0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,
0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22, 0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x69,0x64,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65, 0x64,0x5f,0x74,0x77,0x6f,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x5f,0x74,0x77,
0x72,0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20, 0x6f,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x76,0x65,0x72,0x69,0x66,0x79,0x20,0x70,
0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74, 0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,
0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63,0x72,0x65,0x61,0x74,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f, 0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x63,0x72,
0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x65,0x61,0x74,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x66,0x6f,0x72,0x6d,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,
0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"pages/not_found.tmpl": &EmbeddedAsset{ "pages/not_found.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384399, 0), ModTime: time.Unix(1565384399, 0),
@@ -10799,32 +10813,34 @@ var Bytes = map[string]*EmbeddedAsset{
0x32,0x3b,0x0a,0x7d,0x0a, 0x32,0x3b,0x0a,0x7d,0x0a,
}}, }},
"partials/head.tmpl": &EmbeddedAsset{ "partials/head.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565382588, 0), ModTime: time.Unix(1579908949, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x68,0x65,0x61,0x64,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x6c,0x69,0x6e, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x68,0x65,0x61,0x64,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x6c,0x69,0x6e,
0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3d, 0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,
0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x72,0x65,0x73,0x65,0x74,0x2e,0x63,0x73,0x73, 0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,
0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74, 0x72,0x65,0x73,0x65,0x74,0x2e,0x63,0x73,0x73,0x22,0x20,0x7d,0x7d,0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,
0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x6d,0x61,0x74,0x65, 0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,
0x72,0x69,0x61,0x6c,0x64,0x65,0x73,0x69,0x67,0x6e,0x69,0x63,0x6f,0x6e,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x33,0x2e,0x36,0x2e, 0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x6d,0x61,0x74,0x65,0x72,0x69,0x61,0x6c,0x64,0x65,0x73,0x69,0x67,0x6e,0x69,
0x39,0x35,0x2f,0x63,0x73,0x73,0x2f,0x6d,0x61,0x74,0x65,0x72,0x69,0x61,0x6c,0x64,0x65,0x73,0x69,0x67,0x6e,0x69,0x63,0x6f, 0x63,0x6f,0x6e,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x33,0x2e,0x36,0x2e,0x39,0x35,0x2f,0x63,0x73,0x73,0x2f,0x6d,0x61,0x74,0x65,
0x6e,0x73,0x2e,0x6d,0x69,0x6e,0x2e,0x63,0x73,0x73,0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22, 0x72,0x69,0x61,0x6c,0x64,0x65,0x73,0x69,0x67,0x6e,0x69,0x63,0x6f,0x6e,0x73,0x2e,0x6d,0x69,0x6e,0x2e,0x63,0x73,0x73,0x22,
0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e, 0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,
0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x6d,0x61,0x69,0x6e,0x2e,0x63,0x73,0x73,0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b, 0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,
0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x68,0x6f,0x72,0x74,0x63,0x75,0x74,0x20,0x69,0x63,0x6f,0x6e,0x22,0x20,0x68,0x72,0x65, 0x74,0x61,0x74,0x69,0x63,0x2f,0x6d,0x61,0x69,0x6e,0x2e,0x63,0x73,0x73,0x22,0x20,0x7d,0x7d,0x22,0x3e,0x0a,0x3c,0x6c,0x69,
0x66,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x66,0x61,0x76,0x69,0x63,0x6f,0x6e, 0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x68,0x6f,0x72,0x74,0x63,0x75,0x74,0x20,0x69,0x63,0x6f,0x6e,0x22,0x20,0x68,
0x2e,0x69,0x63,0x6f,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x2f,0x78,0x2d,0x69,0x63,0x6f,0x6e, 0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,
0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x69,0x63,0x6f,0x6e,0x22,0x20,0x68,0x72,0x65,0x66, 0x74,0x69,0x63,0x2f,0x66,0x61,0x76,0x69,0x63,0x6f,0x6e,0x2e,0x69,0x63,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x20,0x74,0x79,0x70,
0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x66,0x61,0x76,0x69,0x63,0x6f,0x6e,0x2e, 0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x2f,0x78,0x2d,0x69,0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x3c,0x6c,0x69,0x6e,0x6b,0x20,
0x69,0x63,0x6f,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x2f,0x78,0x2d,0x69,0x63,0x6f,0x6e,0x22, 0x72,0x65,0x6c,0x3d,0x22,0x69,0x63,0x6f,0x6e,0x22,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,
0x3e,0x0a,0x3c,0x6d,0x65,0x74,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x76,0x69,0x65,0x77,0x70,0x6f,0x72,0x74,0x22,0x20, 0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x66,0x61,0x76,0x69,0x63,0x6f,0x6e,0x2e,
0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3d,0x64,0x65,0x76,0x69,0x63,0x65,0x2d,0x77,0x69, 0x69,0x63,0x6f,0x22,0x20,0x7d,0x7d,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x2f,0x78,0x2d,0x69,
0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x2d,0x73,0x63,0x61,0x6c,0x65,0x3d,0x31,0x2c,0x20,0x75,0x73, 0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x3c,0x6d,0x65,0x74,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x76,0x69,0x65,0x77,0x70,0x6f,
0x65,0x72,0x2d,0x73,0x63,0x61,0x6c,0x61,0x62,0x6c,0x65,0x3d,0x6e,0x6f,0x22,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20, 0x72,0x74,0x22,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3d,0x22,0x77,0x69,0x64,0x74,0x68,0x3d,0x64,0x65,0x76,0x69,0x63,
0x7d,0x7d,0x0a, 0x65,0x2d,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x2d,0x73,0x63,0x61,0x6c,0x65,0x3d,0x31,
0x2c,0x20,0x75,0x73,0x65,0x72,0x2d,0x73,0x63,0x61,0x6c,0x61,0x62,0x6c,0x65,0x3d,0x6e,0x6f,0x22,0x3e,0x0a,0x7b,0x7b,0x20,
0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"layouts/base.tmpl": &EmbeddedAsset{ "layouts/base.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1574868606, 0), ModTime: time.Unix(1579908703, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x6c,0x61,0x79,0x6f,0x75,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x21, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x6c,0x61,0x79,0x6f,0x75,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x21,
0x64,0x6f,0x63,0x74,0x79,0x70,0x65,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x20,0x20,0x20, 0x64,0x6f,0x63,0x74,0x79,0x70,0x65,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x20,0x20,0x20,
@@ -10836,48 +10852,49 @@ var Bytes = map[string]*EmbeddedAsset{
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e, 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,
0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d, 0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,
0x22,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x22,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69, 0x20,0x20,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,
0x63,0x2f,0x67,0x6f,0x6e,0x69,0x63,0x2e,0x70,0x6e,0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x6d,0x69,0x6e,0x2f,0x73,0x74,0x61,0x74,0x69,0x63,0x2f,0x67,0x6f,0x6e,0x69,0x63,0x2e,0x70,0x6e,0x67,0x22,0x20,0x7d,0x7d,
0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20, 0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,
0x72,0x61,0x6e,0x67,0x65,0x20,0x24,0x66,0x6c,0x61,0x73,0x68,0x20,0x3a,0x3d,0x20,0x2e,0x46,0x6c,0x61,0x73,0x68,0x65,0x73, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x72,0x61,0x6e,0x67,0x65,0x20,0x24,0x66,0x6c,0x61,0x73,
0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61, 0x68,0x20,0x3a,0x3d,0x20,0x2e,0x46,0x6c,0x61,0x73,0x68,0x65,0x73,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x66,0x6c,0x61,0x73,0x68,0x2d,0x7b,0x7b,0x20,0x24,0x66,0x6c,0x61, 0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,
0x73,0x68,0x2e,0x54,0x79,0x70,0x65,0x20,0x7d,0x7d,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x66,0x6c,0x61,0x73,0x68,0x2d,0x7b,0x7b,0x20,0x24,0x66,0x6c,0x61,0x73,0x68,0x2e,0x54,0x79,0x70,0x65,0x20,0x7d,0x7d,0x22,
0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x61, 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x20,0x63,0x6c,0x61,
0x6c,0x65,0x72,0x74,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x7b,0x7b,0x20,0x24,0x66,0x6c, 0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x61,0x6c,0x65,0x72,0x74,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,
0x61,0x73,0x68,0x2e,0x4d,0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x20,0x7b,0x7b,0x20,0x24,0x66,0x6c,0x61,0x73,0x68,0x2e,0x4d,0x65,0x73,0x73,0x61,0x67,0x65,
0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b, 0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,
0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x74, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,
0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x2e,0x20,0x7d,0x7d,0x0a,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x7b,0x20,0x74,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,0x20,0x22,0x63,0x6f,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73, 0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x2e,0x20,0x7d,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x69,0x64,0x65,0x2d,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a, 0x3c,0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x69,0x64,0x65,0x2d,0x70,0x61,0x64,0x64,0x65,0x64,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c, 0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x7b,0x7b,0x20,0x2e,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20, 0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,
0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x3e,0x7b,0x7b,0x20,0x2e,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x7d,0x7d,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,
0x20,0x20,0x73,0x65,0x6e,0x61,0x6e,0x20,0x6b,0x65,0x6c,0x6c,0x79,0x2c,0x20,0x32,0x30,0x31,0x39,0x0a,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6e,0x61,0x6e,0x20,0x6b,0x65,0x6c,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d, 0x6c,0x79,0x2c,0x20,0x32,0x30,0x31,0x39,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20, 0x20,0x3c,0x73,0x70,0x61,0x6e,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6c,0x69,0x67,0x68,0x74,0x22,0x3e,0x26,0x23,0x31,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, 0x32,0x34,0x3b,0x3c,0x2f,0x73,0x70,0x61,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x73,0x65,0x6e,0x61,0x6e,0x2e,0x78,0x79,0x7a,0x2f,0x67,0x2f,0x67,0x6f,0x6e,0x69,0x63, 0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x73,0x65,0x6e,0x61,
0x22,0x3e,0x67,0x69,0x74,0x68,0x75,0x62,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x6e,0x2e,0x78,0x79,0x7a,0x2f,0x67,0x2f,0x67,0x6f,0x6e,0x69,0x63,0x22,0x3e,0x67,0x69,0x74,0x68,0x75,0x62,0x3c,0x2f,0x61,
0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20, 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e, 0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,
0x64,0x20,0x7d,0x7d,0x0a, 0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
"layouts/user.tmpl": &EmbeddedAsset{ "layouts/user.tmpl": &EmbeddedAsset{
ModTime: time.Unix(1565384362, 0), ModTime: time.Unix(1579908924, 0),
Bytes: []byte{ Bytes: []byte{
0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c, 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c,
0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x69,0x64,0x65,0x2d,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x6c, 0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x69,0x64,0x65,0x2d,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x6c,
0x69,0x67,0x68,0x74,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x77,0x65, 0x69,0x67,0x68,0x74,0x20,0x74,0x65,0x78,0x74,0x2d,0x72,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x77,0x65,
0x6c,0x63,0x6f,0x6d,0x65,0x20,0x7b,0x7b,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x0a,0x20, 0x6c,0x63,0x6f,0x6d,0x65,0x20,0x7b,0x7b,0x20,0x2e,0x55,0x73,0x65,0x72,0x2e,0x4e,0x61,0x6d,0x65,0x20,0x7d,0x7d,0x0a,0x20,
0x20,0x20,0x20,0x26,0x23,0x31,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f, 0x20,0x20,0x20,0x26,0x23,0x31,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,
0x61,0x64,0x6d,0x69,0x6e,0x2f,0x68,0x6f,0x6d,0x65,0x22,0x3e,0x68,0x6f,0x6d,0x65,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20, 0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,0x6e,0x2f,0x68,0x6f,0x6d,0x65,0x22,0x20,0x7d,0x7d,0x22,
0x20,0x26,0x23,0x31,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x2f,0x61,0x64, 0x3e,0x68,0x6f,0x6d,0x65,0x3c,0x2f,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x26,0x23,0x31,0x32,0x34,0x3b,0x0a,0x20,0x20,0x20,
0x6d,0x69,0x6e,0x2f,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x22,0x3e,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x20,0x3c,0x69,0x20,0x63,0x6c, 0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x7b,0x7b,0x20,0x70,0x61,0x74,0x68,0x20,0x22,0x2f,0x61,0x64,0x6d,0x69,
0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x2d,0x76,0x61,0x72,0x69, 0x6e,0x2f,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x22,0x20,0x7d,0x7d,0x22,0x3e,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x20,0x3c,0x69,0x20,
0x61,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x3c,0x2f,0x61,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20, 0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x6d,0x64,0x69,0x20,0x6d,0x64,0x69,0x2d,0x6c,0x6f,0x67,0x6f,0x75,0x74,0x2d,0x76,0x61,
0x74,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x2e,0x20,0x7d,0x7d,0x0a,0x7b,0x7b,0x20, 0x72,0x69,0x61,0x6e,0x74,0x22,0x3e,0x3c,0x2f,0x69,0x3e,0x3c,0x2f,0x61,0x3e,0x0a,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,
0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, 0x7b,0x20,0x74,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x2e,0x20,0x7d,0x7d,0x0a,0x7b,
0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a,
}}, }},
} }

View File

@@ -9,7 +9,7 @@
<body> <body>
<div id="content"> <div id="content">
<div id="header"> <div id="header">
<img src="/admin/static/gonic.png"> <img src="{{ path "/admin/static/gonic.png" }}">
</div> </div>
{{ range $flash := .Flashes }} {{ range $flash := .Flashes }}
<div class="padded flash-{{ $flash.Type }}"> <div class="padded flash-{{ $flash.Type }}">

View File

@@ -2,9 +2,9 @@
<div class="side-padded light text-right"> <div class="side-padded light text-right">
welcome {{ .User.Name }} welcome {{ .User.Name }}
&#124; &#124;
<a href="/admin/home">home</a> <a href="{{ path "/admin/home" }}">home</a>
&#124; &#124;
<a href="/admin/logout">logout <i class="mdi mdi-logout-variant"></i></a> <a href="{{ path "/admin/logout" }}">logout <i class="mdi mdi-logout-variant"></i></a>
</div> </div>
{{ template "user" . }} {{ template "user" . }}
{{ end }} {{ end }}

View File

@@ -3,7 +3,7 @@
<div class="box-title"> <div class="box-title">
<i class="mdi mdi-account-key"></i> changing account password <i class="mdi mdi-account-key"></i> changing account password
</div> </div>
<form action="/admin/change_own_password_do" method="post"> <form action="{{ path "/admin/change_own_password_do" }}" method="post">
<input type="password" id="password_one" name="password_one" placeholder="new password"> <input type="password" id="password_one" name="password_one" placeholder="new password">
<input type="password" id="password_two" name="password_two" placeholder="verify new password"> <input type="password" id="password_two" name="password_two" placeholder="verify new password">
<input type="submit" value="change"> <input type="submit" value="change">

View File

@@ -3,7 +3,7 @@
<div class="box-title"> <div class="box-title">
<i class="mdi mdi-account-key"></i> changing {{ .SelectedUser.Name }}'s password <i class="mdi mdi-account-key"></i> changing {{ .SelectedUser.Name }}'s password
</div> </div>
<form action="/admin/change_password_do?user={{ .SelectedUser.Name }}" method="post"> <form action="{{ printf "/admin/change_password_do?user=%s" .SelectedUser.Name | path }}" method="post">
<input type="password" id="password_one" name="password_one" placeholder="new password"> <input type="password" id="password_one" name="password_one" placeholder="new password">
<input type="password" id="password_two" name="password_two" placeholder="verify new password"> <input type="password" id="password_two" name="password_two" placeholder="verify new password">
<input type="submit" value="change"> <input type="submit" value="change">

View File

@@ -3,7 +3,7 @@
<div class="box-title"> <div class="box-title">
<i class="mdi mdi-account-plus"></i> creating new user <i class="mdi mdi-account-plus"></i> creating new user
</div> </div>
<form action="/admin/create_user_do" method="post"> <form action="{{ path "/admin/create_user_do" }}" method="post">
<input type="text" id="username" name="username" placeholder="username"> <input type="text" id="username" name="username" placeholder="username">
<input type="password" id="password_one" name="password_one" placeholder="password"> <input type="password" id="password_one" name="password_one" placeholder="password">
<input type="password" id="password_two" name="password_two" placeholder="verify password"> <input type="password" id="password_two" name="password_two" placeholder="verify password">

View File

@@ -7,7 +7,7 @@
are you sure?<br/> are you sure?<br/>
<span class="light">their plays, starred, etc. will also be deleted</span> <span class="light">their plays, starred, etc. will also be deleted</span>
</div> </div>
<form action="/admin/delete_user_do?user={{ .SelectedUser.Name }}" method="post"> <form action="{{ printf "/admin/delete_user_do?user=%s" .SelectedUser.Name | path }}" method="post">
<input type="submit" value="yes"> <input type="submit" value="yes">
</form> </form>
</div> </div>

View File

@@ -24,17 +24,19 @@
<div class="text-right"> <div class="text-right">
{{ if .User.IsAdmin }} {{ if .User.IsAdmin }}
<p class="light">you can get an api key <a href="https://www.last.fm/api/account/create" target="_blank">here</a></p> <p class="light">you can get an api key <a href="https://www.last.fm/api/account/create" target="_blank">here</a></p>
<a href="/admin/update_lastfm_api_key">update api key</a><br/> <a href="{{ path "/admin/update_lastfm_api_key" }}">update api key</a><br/>
{{ end }} {{ end }}
{{ if .CurrentLastFMAPIKey }} {{ if .CurrentLastFMAPIKey }}
<span class="light">current status</span> <span class="light">current status</span>
{{ if .User.LastFMSession }} {{ if .User.LastFMSession }}
linked linked
<span class="light">&#124;</span> <span class="light">&#124;</span>
<a href="/admin/unlink_lastfm_do">unlink</a><br/> <a href="{{ path "/admin/unlink_lastfm_do" }}">unlink</a><br/>
{{ else }} {{ else }}
<span class="angry">unlinked</span> <span class="angry">unlinked</span>
<a href="https://www.last.fm/api/auth/?api_key={{ .CurrentLastFMAPIKey }}&cb={{ .RequestRoot }}/admin/link_lastfm_do">link</a><br/> {{ $cbPath := path "/admin/link_lastfm_do" }}
{{ $cbURL := printf "%s%s" .RequestRoot $cbPath }}
<a href="https://www.last.fm/api/auth/?api_key={{ .CurrentLastFMAPIKey }}&cb={{ $cbURL }}">link</a><br/>
{{ end }} {{ end }}
{{ else if not .User.IsAdmin }} {{ else if not .User.IsAdmin }}
<span class="light">api key not set. please ask your admin to set it</span> <span class="light">api key not set. please ask your admin to set it</span>
@@ -52,11 +54,11 @@
<i>{{ $user.Name }}</i> <i>{{ $user.Name }}</i>
<span class="light no-small">{{ $user.CreatedAt.Format "jan 02, 2006" }}</span> <span class="light no-small">{{ $user.CreatedAt.Format "jan 02, 2006" }}</span>
<span class="light">&#124;</span> <span class="light">&#124;</span>
<a href="/admin/change_password?user={{ $user.Name }}">change password</a> <a href="{{ printf "/admin/change_password?user=%s" $user.Name | path }}">change password</a>
<span class="light">&#124;</span> <span class="light">&#124;</span>
<a href="/admin/delete_user?user={{ $user.Name }}">delete</a><br/> <a href="{{ printf "/admin/delete_user?user=%s" $user.Name | path }}">delete</a><br/>
{{ end }} {{ end }}
<a href="/admin/create_user" class="button">create new</a> <a href="{{ path "/admin/create_user" }}" class="button">create new</a>
</div> </div>
{{ else }} {{ else }}
{{/* user panel to manage themselves */}} {{/* user panel to manage themselves */}}
@@ -64,7 +66,7 @@
<i class="mdi mdi-account"></i> your account <i class="mdi mdi-account"></i> your account
</div> </div>
<div class="text-right"> <div class="text-right">
<a href="/admin/change_own_password" class="button">change password</a> <a href="{{ path "/admin/change_own_password" }}" class="button">change password</a>
</div> </div>
{{ end }} {{ end }}
</div> </div>
@@ -85,7 +87,7 @@
{{ end }} {{ end }}
</table> </table>
{{- if not .IsScanning -}} {{- if not .IsScanning -}}
<a href="/admin/start_scan_do">start scan</a> <a href="{{ path "/admin/start_scan_do" }}">start scan</a>
{{- if not .LastScanTime.IsZero -}} {{- if not .LastScanTime.IsZero -}}
<br> <br>
<span class="light" title="{{ .LastScanTime }}">scanned {{ .LastScanTime | humanDate }}</span> <span class="light" title="{{ .LastScanTime }}">scanned {{ .LastScanTime | humanDate }}</span>
@@ -113,7 +115,7 @@
<form <form
id="playlist-upload-form" id="playlist-upload-form"
enctype="multipart/form-data" enctype="multipart/form-data"
action="/admin/upload_playlist_do" action="{{ path "/admin/upload_playlist_do" }}"
method="post" method="post"
> >
<label for="playlist-upload-input"> <label for="playlist-upload-input">

View File

@@ -3,7 +3,7 @@
<div class="box-title"> <div class="box-title">
<i class="mdi mdi-login-variant"></i> login <i class="mdi mdi-login-variant"></i> login
</div> </div>
<form action="/admin/login_do" method="post"> <form action="{{ path "/admin/login_do" }}" method="post">
<input type="text" id="username" name="username" placeholder="username"> <input type="text" id="username" name="username" placeholder="username">
<input type="password" id="password" name="password" placeholder="password"> <input type="password" id="password" name="password" placeholder="password">
<input type="submit" value="login"> <input type="submit" value="login">

View File

@@ -7,7 +7,7 @@
<span class="light">current key</span> <i>{{ default "not set" .CurrentLastFMAPIKey }}</i><br/> <span class="light">current key</span> <i>{{ default "not set" .CurrentLastFMAPIKey }}</i><br/>
<span class="light">current secret</span> <i>{{ default "not set" .CurrentLastFMAPISecret }}</i> <span class="light">current secret</span> <i>{{ default "not set" .CurrentLastFMAPISecret }}</i>
</div> </div>
<form action="/admin/update_lastfm_api_key_do" method="post"> <form action="{{ path "/admin/update_lastfm_api_key_do" }}" method="post">
<input type="text" id="api_key" name="api_key" placeholder="new key"> <input type="text" id="api_key" name="api_key" placeholder="new key">
<input type="text" id="secret" name="secret" placeholder="new secret"> <input type="text" id="secret" name="secret" placeholder="new secret">
<input type="submit" value="update"> <input type="submit" value="update">

View File

@@ -1,8 +1,8 @@
{{ define "head" }} {{ define "head" }}
<link rel="stylesheet" href="/admin/static/reset.css"> <link rel="stylesheet" href="{{ path "/admin/static/reset.css" }}">
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/3.6.95/css/materialdesignicons.min.css"> <link rel="stylesheet" href="https://cdn.materialdesignicons.com/3.6.95/css/materialdesignicons.min.css">
<link rel="stylesheet" href="/admin/static/main.css"> <link rel="stylesheet" href="{{ path "/admin/static/main.css" }}">
<link rel="shortcut icon" href="/admin/static/favicon.ico" type="image/x-icon"> <link rel="shortcut icon" href="{{ path "/admin/static/favicon.ico" }}" type="image/x-icon">
<link rel="icon" href="/admin/static/favicon.ico" type="image/x-icon"> <link rel="icon" href="{{ path "/admin/static/favicon.ico" }}" type="image/x-icon">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
{{ end }} {{ end }}

View File

@@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"regexp"
"time" "time"
_ "github.com/jinzhu/gorm/dialects/sqlite" _ "github.com/jinzhu/gorm/dialects/sqlite"
@@ -21,6 +22,7 @@ func main() {
musicPath := set.String("music-path", "", "path to music") musicPath := set.String("music-path", "", "path to music")
dbPath := set.String("db-path", "gonic.db", "path to database (optional)") dbPath := set.String("db-path", "gonic.db", "path to database (optional)")
scanInterval := set.Int("scan-interval", 0, "interval (in minutes) to automatically scan music (optional)") scanInterval := set.Int("scan-interval", 0, "interval (in minutes) to automatically scan music (optional)")
proxyPrefix := set.String("proxy-prefix", "", "url path prefix to use if behind proxy. eg '/gonic' (optional)")
_ = set.String("config-path", "", "path to config (optional)") _ = set.String("config-path", "", "path to config (optional)")
showVersion := set.Bool("version", false, "show gonic version") showVersion := set.Bool("version", false, "show gonic version")
if err := ff.Parse(set, os.Args[1:], if err := ff.Parse(set, os.Args[1:],
@@ -42,11 +44,14 @@ func main() {
log.Fatalf("error opening database: %v\n", err) log.Fatalf("error opening database: %v\n", err)
} }
defer db.Close() defer db.Close()
proxyPrefixExpr := regexp.MustCompile(`^\/*(.*?)\/*$`)
*proxyPrefix = proxyPrefixExpr.ReplaceAllString(*proxyPrefix, `/$1`)
serverOptions := server.Options{ serverOptions := server.Options{
DB: db, DB: db,
MusicPath: *musicPath, MusicPath: *musicPath,
ListenAddr: *listenAddr, ListenAddr: *listenAddr,
ScanInterval: time.Duration(*scanInterval) * time.Minute, ScanInterval: time.Duration(*scanInterval) * time.Minute,
ProxyPrefix: *proxyPrefix,
} }
log.Printf("using opts %+v\n", serverOptions) log.Printf("using opts %+v\n", serverOptions)
s := server.New(serverOptions) s := server.New(serverOptions)

View File

@@ -3,6 +3,7 @@ package ctrladmin
import ( import (
"encoding/gob" "encoding/gob"
"fmt" "fmt"
"strings"
"html/template" "html/template"
"log" "log"
"net/http" "net/http"
@@ -80,6 +81,7 @@ func New(base *ctrlbase.Controller) *Controller {
Funcs(sprig.FuncMap()). Funcs(sprig.FuncMap()).
Funcs(template.FuncMap{ Funcs(template.FuncMap{
"humanDate": humanize.Time, "humanDate": humanize.Time,
"path": base.Path,
}) })
tmplBase = extendFromPaths(tmplBase, prefixPartials) tmplBase = extendFromPaths(tmplBase, prefixPartials)
tmplBase = extendFromPaths(tmplBase, prefixLayouts) tmplBase = extendFromPaths(tmplBase, prefixLayouts)
@@ -140,7 +142,11 @@ func (c *Controller) H(h adminHandler) http.Handler {
} }
} }
if resp.redirect != "" { if resp.redirect != "" {
http.Redirect(w, r, resp.redirect, http.StatusSeeOther) to := resp.redirect
if strings.HasPrefix(to, "/") {
to = c.Path(to)
}
http.Redirect(w, r, to, http.StatusSeeOther)
return return
} }
if resp.err != "" { if resp.err != "" {

View File

@@ -36,7 +36,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response {
r.URL.Scheme, r.URL.Scheme,
) )
host := firstExisting( host := firstExisting(
"localhost:7373", // fallback "localhost:4747", // fallback
r.Header.Get("X-Forwarded-Host"), r.Header.Get("X-Forwarded-Host"),
r.Host, r.Host,
) )

View File

@@ -28,12 +28,12 @@ func (c *Controller) ServeLoginDo(w http.ResponseWriter, r *http.Request) {
// session and put the row into the request context // session and put the row into the request context
session.Values["user"] = user.Name session.Values["user"] = user.Name
sessLogSave(session, w, r) sessLogSave(session, w, r)
http.Redirect(w, r, "/admin/home", http.StatusSeeOther) http.Redirect(w, r, c.Path("/admin/home"), http.StatusSeeOther)
} }
func (c *Controller) ServeLogout(w http.ResponseWriter, r *http.Request) { func (c *Controller) ServeLogout(w http.ResponseWriter, r *http.Request) {
session := r.Context().Value(CtxSession).(*sessions.Session) session := r.Context().Value(CtxSession).(*sessions.Session)
session.Options.MaxAge = -1 session.Options.MaxAge = -1
sessLogSave(session, w, r) sessLogSave(session, w, r)
http.Redirect(w, r, "/admin/login", http.StatusSeeOther) http.Redirect(w, r, c.Path("/admin/login"), http.StatusSeeOther)
} }

View File

@@ -25,7 +25,7 @@ func (c *Controller) WithUserSession(next http.Handler) http.Handler {
if !ok { if !ok {
sessAddFlashW(session, []string{"you are not authenticated"}) sessAddFlashW(session, []string{"you are not authenticated"})
sessLogSave(session, w, r) sessLogSave(session, w, r)
http.Redirect(w, r, "/admin/login", http.StatusSeeOther) http.Redirect(w, r, c.Path("/admin/login"), http.StatusSeeOther)
return return
} }
// take username from sesion and add the user row to the context // take username from sesion and add the user row to the context
@@ -35,7 +35,7 @@ func (c *Controller) WithUserSession(next http.Handler) http.Handler {
// user in the database (maybe the user was deleted) // user in the database (maybe the user was deleted)
session.Options.MaxAge = -1 session.Options.MaxAge = -1
sessLogSave(session, w, r) sessLogSave(session, w, r)
http.Redirect(w, r, "/admin/login", http.StatusSeeOther) http.Redirect(w, r, c.Path("/admin/login"), http.StatusSeeOther)
return return
} }
withUser := context.WithValue(r.Context(), CtxUser, user) withUser := context.WithValue(r.Context(), CtxUser, user)
@@ -51,7 +51,7 @@ func (c *Controller) WithAdminSession(next http.Handler) http.Handler {
if !user.IsAdmin { if !user.IsAdmin {
sessAddFlashW(session, []string{"you are not an admin"}) sessAddFlashW(session, []string{"you are not an admin"})
sessLogSave(session, w, r) sessLogSave(session, w, r)
http.Redirect(w, r, "/admin/login", http.StatusSeeOther) http.Redirect(w, r, c.Path("/admin/login"), http.StatusSeeOther)
return return
} }
next.ServeHTTP(w, r) next.ServeHTTP(w, r)

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
"path"
"senan.xyz/g/gonic/db" "senan.xyz/g/gonic/db"
"senan.xyz/g/gonic/scanner" "senan.xyz/g/gonic/scanner"
@@ -44,9 +45,15 @@ func statusToBlock(code int) string {
} }
type Controller struct { type Controller struct {
DB *db.DB DB *db.DB
MusicPath string MusicPath string
Scanner *scanner.Scanner Scanner *scanner.Scanner
ProxyPrefix string
}
// Path returns a URL path with the proxy prefix included
func (c *Controller) Path(rel string) string {
return path.Join(c.ProxyPrefix, rel)
} }
func (c *Controller) WithLogging(next http.Handler) http.Handler { func (c *Controller) WithLogging(next http.Handler) http.Handler {

View File

@@ -23,26 +23,28 @@ type Options struct {
MusicPath string MusicPath string
ListenAddr string ListenAddr string
ScanInterval time.Duration ScanInterval time.Duration
ProxyPrefix string
} }
type Server struct { type Server struct {
*http.Server *http.Server
router *mux.Router router *mux.Router
ctrlBase *ctrlbase.Controller base *ctrlbase.Controller
opts Options opts Options
} }
func New(opts Options) *Server { func New(opts Options) *Server {
opts.MusicPath = filepath.Clean(opts.MusicPath) opts.MusicPath = filepath.Clean(opts.MusicPath)
ctrlBase := &ctrlbase.Controller{ base := &ctrlbase.Controller{
DB: opts.DB, DB: opts.DB,
MusicPath: opts.MusicPath, MusicPath: opts.MusicPath,
Scanner: scanner.New(opts.DB, opts.MusicPath), Scanner: scanner.New(opts.DB, opts.MusicPath),
ProxyPrefix: opts.ProxyPrefix,
} }
router := mux.NewRouter() router := mux.NewRouter()
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// make the admin page the default // make the admin page the default
http.Redirect(w, r, "/admin/home", http.StatusMovedPermanently) http.Redirect(w, r, base.Path("/admin/home"), http.StatusMovedPermanently)
}) })
router.HandleFunc("/musicFolderSettings.view", func(w http.ResponseWriter, r *http.Request) { router.HandleFunc("/musicFolderSettings.view", func(w http.ResponseWriter, r *http.Request) {
// jamstash seems to call "musicFolderSettings.view" to start a scan. notice // jamstash seems to call "musicFolderSettings.view" to start a scan. notice
@@ -50,11 +52,11 @@ func New(opts Options) *Server {
// custom handler, middleware. etc setup that we've got in `SetupSubsonic()`. // custom handler, middleware. etc setup that we've got in `SetupSubsonic()`.
// instead lets redirect to down there and use the scan endpoint // instead lets redirect to down there and use the scan endpoint
redirectTo := fmt.Sprintf("/rest/startScan.view?%s", r.URL.Query().Encode()) redirectTo := fmt.Sprintf("/rest/startScan.view?%s", r.URL.Query().Encode())
http.Redirect(w, r, redirectTo, http.StatusMovedPermanently) http.Redirect(w, r, base.Path(redirectTo), http.StatusMovedPermanently)
}) })
// common middleware for admin and subsonic routes // common middleware for admin and subsonic routes
router.Use(ctrlBase.WithLogging) router.Use(base.WithLogging)
router.Use(ctrlBase.WithCORS) router.Use(base.WithCORS)
server := &http.Server{ server := &http.Server{
Addr: opts.ListenAddr, Addr: opts.ListenAddr,
Handler: router, Handler: router,
@@ -63,15 +65,15 @@ func New(opts Options) *Server {
IdleTimeout: 15 * time.Second, IdleTimeout: 15 * time.Second,
} }
return &Server{ return &Server{
Server: server, Server: server,
router: router, router: router,
ctrlBase: ctrlBase, base: base,
opts: opts, opts: opts,
} }
} }
func (s *Server) SetupAdmin() error { func (s *Server) SetupAdmin() error {
ctrl := ctrladmin.New(s.ctrlBase) ctrl := ctrladmin.New(s.base)
// //
// begin public routes (creates session) // begin public routes (creates session)
routPublic := s.router.PathPrefix("/admin").Subrouter() routPublic := s.router.PathPrefix("/admin").Subrouter()
@@ -119,7 +121,7 @@ func (s *Server) SetupAdmin() error {
} }
func (s *Server) SetupSubsonic() error { func (s *Server) SetupSubsonic() error {
ctrl := ctrlsubsonic.New(s.ctrlBase) ctrl := ctrlsubsonic.New(s.base)
rout := s.router.PathPrefix("/rest").Subrouter() rout := s.router.PathPrefix("/rest").Subrouter()
rout.Use(ctrl.WithParams) rout.Use(ctrl.WithParams)
rout.Use(ctrl.WithRequiredParams) rout.Use(ctrl.WithRequiredParams)
@@ -167,7 +169,7 @@ func (s *Server) SetupSubsonic() error {
func (s *Server) scanTick() { func (s *Server) scanTick() {
ticker := time.NewTicker(s.opts.ScanInterval) ticker := time.NewTicker(s.opts.ScanInterval)
for range ticker.C { for range ticker.C {
if err := s.ctrlBase.Scanner.Start(); err != nil { if err := s.base.Scanner.Start(); err != nil {
log.Printf("error while scanner: %v", err) log.Printf("error while scanner: %v", err)
} }
} }