1
0
mirror of https://github.com/Luzifer/password.git synced 2024-09-19 18:32:57 +00:00

Add ability to generate XKCD style passwords to tool

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2017-10-31 12:12:51 +01:00
parent cb3fd042e1
commit c8c6485064
Signed by: luzifer
GPG Key ID: DC2729FDD34BE99E
8 changed files with 175 additions and 145 deletions

View File

@ -80,30 +80,31 @@ func (fi bindataFileInfo) Sys() interface{} {
} }
var _frontendAssetsApplicationCoffee = []byte( var _frontendAssetsApplicationCoffee = []byte(
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xc1\x6e\xdb\x38\x10\xbd\xf3\x2b\x06\x8e\x77\x25\x2d\x6c\x45\xc9" + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xc1\x6e\xdb\x38\x10\xbd\xf3\x2b\x06\x8e\x37\x92\x16\xb6\xa2\x64" +
"\xde\x02\x28\xbd\xf4\x92\x22\x6d\x82\xba\xb7\xa2\x07\x46\x1c\xc9\x84\x69\x52\x20\x29\x0b\x41\x90\x7f\x2f\x48\x51" + "\x6f\x01\x94\x3d\x34\x97\xb4\x69\x13\xd4\x3d\x14\x28\x7a\x60\xc8\x91\x4c\x98\x16\x05\x92\xb6\x1b\x04\xfe\xf7\x82" +
"\x96\x14\xcb\x49\x7b\x12\xc8\x79\xef\xcd\xf0\xcd\x90\xe2\x25\xb4\x5c\x32\xd5\xa6\x1b\xab\x34\xad\x10\xa8\x64\xfd" + "\x14\x65\x49\xb1\x9c\xb4\x27\x81\x33\xef\x3d\x72\xde\x0c\x45\x51\xc0\x4e\x54\x5c\xed\xd2\x85\x55\x9a\x96\x08\xb4" +
"\xd6\x97\xcd\xc3\x37\x02\xfd\x6a\x69\x02\x22\x87\x78\x87\xcf\x09\xac\x6f\x09\x00\x80\x41\x7b\x03\xf1\x81\x8a\x06" + "\xe2\x6d\xe8\xe3\xe2\xe1\x0b\x81\x76\x35\x35\x01\x91\x43\xbc\xc2\xe7\x04\xe6\x37\x04\x00\xc0\xa0\xbd\x86\x78\x4b" +
"\x8f\x7b\x00\x42\x15\x54\x04\xcd\xd4\xa0\xbd\xb3\xb8\x77\xb4\x15\x38\xd5\xd4\x58\xcd\x65\xc5\xcb\xe7\x40\x4c\x3c" + "\xe5\x06\x0f\x31\x00\xa9\x18\x95\x41\x33\x35\x68\xef\x2c\xae\x1d\x6d\x06\x4e\x35\x35\x56\x8b\xaa\x14\xc5\x73\x20" +
"\xad\x72\x52\x47\x09\x6e\x71\x0f\xf9\x54\xa9\x1a\x94\x92\x00\xf3\x7a\x35\xd5\x06\x63\xc7\x48\x80\x97\x9e\x4a\xc8" + "\x26\x9e\x56\x3a\xa9\x83\x84\xb0\xb8\x86\x7c\xa8\x54\x76\x4a\x49\x80\x79\xbd\x9a\x6a\x83\xb1\x63\x24\x20\x0a\x4f" +
"\xb2\xd3\x0a\xf5\x0b\x6a\xec\xbd\xa2\x0c\x72\x90\xaa\x8d\x93\x21\xa2\xb1\xd4\x68\xb6\x8f\xd4\x98\x56\x69\x07\xf8" + "\x25\x64\xda\x68\x85\xf3\x4b\x6a\xec\xbd\xa2\x1c\x72\xa8\xd4\x2e\x4e\xba\x8c\xc6\x42\xa3\x59\x3e\x52\x63\x76\x4a" +
"\x3f\xcb\xb2\x6c\x00\x58\x5e\xec\x50\xdf\x49\x8b\xfa\x40\x05\xe4\x70\x9d\x65\xe4\x6d\x18\x72\x67\xc5\x11\xe4\x36" + "\x3b\xc0\x7f\x59\x96\x65\x1d\xc0\x0a\xb6\x42\x7d\x57\x59\xd4\x5b\x2a\x21\x87\xab\x2c\x23\xaf\xd3\x90\x3b\x2b\x0e" +
"\x57\xf3\x02\x04\x60\x19\x47\x17\xa5\x2a\x1a\x83\xec\x4e\xd6\x8d\x8d\x92\xf4\x89\x4b\x06\x51\x21\x78\xb1\x8b\x56" + "\x20\x17\x9c\x8d\x0b\x10\x80\x69\x1c\x9d\x15\x8a\x6d\x0c\xf2\xbb\xaa\xde\xd8\x28\x49\x9f\x44\xc5\x21\x62\x52\xb0" +
"\x60\xac\xaa\xbf\x77\x75\xbd\x07\x7f\x12\x8d\x8e\x56\xa0\xd1\x58\xaa\xed\x94\xa0\x6a\xcb\x95\xdc\xd0\x03\x9e\xaa" + "\x55\x34\x03\x63\x55\xfd\xb5\x39\xd7\x5b\xf0\x27\xb9\xd1\xd1\x0c\x34\x1a\x4b\xb5\x1d\x12\x54\x6d\x85\xaa\x16\x74" +
"\xd3\x03\x3e\xf8\xb0\x71\xe7\x10\x8a\xb2\xb0\xf4\xbe\xb8\x75\xef\x46\x9c\x10\x22\x55\xeb\xba\x1e\xda\xeb\x1d\xc4" + "\x8b\xc7\xea\x74\x8b\x0f\x3e\x6d\x5c\x1d\x52\x51\x1e\x96\xde\x17\xb7\x6e\xdd\x88\x13\x42\x2a\xb5\x73\x5d\x0f\xed" +
"\x16\x3e\x53\x8b\x1e\xce\x5c\x5b\x7e\xf0\xbd\x5b\x91\x51\xe1\x23\x4e\x21\x90\x1e\xcf\x1f\x4f\x5c\x49\xe6\xcf\x67" + "\xf5\x0e\xe2\x0e\x6e\xa9\x45\x0f\xe7\xae\x2d\xdf\xc4\xda\xad\x48\xef\xe0\x3d\x0e\x93\x48\x0f\xf5\xc7\x03\x57\x92" +
"\x50\x60\x61\xbd\x7e\x49\x85\x41\x42\xa6\x87\x1c\x89\x7f\xd8\xe0\xbf\x6e\x10\x31\x68\x1f\xb5\xaa\x34\x1a\xe3\x12" + "\xf1\xfa\x0c\x4a\x64\xd6\xeb\x17\x54\x1a\x24\x64\x58\x64\x4f\xfc\xdd\x06\xff\x75\x83\x88\x41\xfb\xa8\x55\xa9\xd1" +
"\xd5\xa8\x8b\x90\x6c\x19\x47\x69\x1d\x42\xeb\x27\xaa\xa3\x24\x2d\x8c\x89\xa3\x96\x33\xbb\x8d\x56\xb0\xb8\x78\x71" + "\x18\xb7\x51\x8d\x9a\x85\xcd\xa6\x71\x94\xd6\x21\x35\x7f\xa2\x3a\x4a\x52\x66\x4c\x1c\xed\x04\xb7\xcb\x68\x06\x93" +
"\xe8\xd7\x7f\x16\x09\x21\x63\x23\x47\x05\x77\x9d\x31\x7e\xb8\xa7\xce\x2f\x9d\x95\xb0\xb8\x3c\x5c\x5d\x56\x68\x7b" + "\xb3\x17\x87\xde\xff\x33\x49\x08\xe9\x1b\xd9\x3b\x70\xd3\x19\xe3\x87\x7b\xe8\xfc\xd4\x59\x09\x93\x8b\xed\xe5\x45" +
"\xea\x27\x81\xb2\xb2\xdb\xfc\xe2\x25\x30\xd3\x3a\x44\xee\x7d\xe0\xf5\x5f\x53\x63\xc1\xa9\x18\x21\x1a\x83\x9b\x6e" + "\x89\xb6\xa5\xfe\x2f\xb1\x2a\xed\x32\x3f\x7b\x09\xcc\xb4\x0e\x99\x7b\x9f\xd8\x9f\x9b\x1a\x99\xa0\xb2\x87\xd8\x18" +
"\xf3\x75\xb1\x82\x98\x51\x4b\x8f\xd7\x73\xc6\x6e\xd7\x16\x8f\xf1\x80\x73\x8e\x92\xd1\xe0\xcc\x9d\xc7\x93\xa7\xb5" + "\x5c\x34\xc1\xfd\xf9\xaf\x15\xe3\xc3\xd4\xf7\x4f\x1f\x6e\xf7\x93\x19\xc4\x9c\x5a\x7a\xb8\xb6\x23\x6d\x70\xed\xf2" +
"\xdd\xf8\x6c\xd3\xbd\x4e\x21\x64\xed\x32\x0e\xe5\x76\x84\x61\xdd\x83\x7f\x66\xbf\xd2\x62\x8b\xc5\x0e\x19\x39\x7d" + "\x18\x0f\x38\xe5\x34\xe9\x0d\xd4\x58\x9d\x9e\x3c\x3c\xf3\xb5\xdf\x6d\x18\x6b\x14\xc2\xae\xcd\x8e\x5d\x19\x0d\xa1" +
"\x95\xe2\x68\x83\x45\xa3\xb1\xb7\x2c\x14\xe9\x07\xc9\xc6\xa1\xc0\x7e\xd4\x0c\x5a\xcb\x65\x65\xbe\x2a\x46\x45\x94" + "\x5b\xb7\xe0\x1f\xd9\xcf\x94\x2d\x91\xad\x90\xb7\x0c\x57\xdd\x01\xee\x16\x63\xd8\xe3\x3f\x5b\x1c\x2d\x90\x6d\x34" +
"\xa4\x7b\xf7\x8d\xa3\x2d\x67\x18\xcd\xcd\xff\xa8\x4b\xb3\x5d\xfc\xe3\x5a\x2a\xec\x26\x9a\x97\x03\x3b\x87\x46\x32" + "\xb6\xb6\x87\x82\xfc\x30\xda\x38\x14\xd3\x8e\xab\x41\x6b\x45\x55\x9a\xcf\x8a\x53\x19\x25\xe9\xda\x7d\xe3\x68\x29" +
"\x2c\xb9\x44\xe6\x9d\x98\x9a\x79\x6a\xe7\x75\x16\x02\x63\xcb\xba\x2b\x02\x1f\x79\x3d\x3f\x3e\xbd\x2d\xef\x7a\x0e" + "\x38\x46\x63\x77\xa8\xd7\xe9\xd1\x49\xf8\xe3\xb3\x94\xd8\xdc\x0a\x51\x74\xec\x1c\x36\x15\xc7\x42\x54\xc1\x83\xa1" +
"\x39\x9c\x8e\xd6\xe0\x02\x21\xee\x0a\x8d\x5f\x09\x5e\x96\xfd\xdc\xc0\xfa\xed\x44\x11\x00\x77\x4b\x1c\xfe\xcc\x23" + "\xf1\xc7\xd6\x5f\x65\x21\xd1\xb7\xb7\xb9\x66\x87\x78\x63\x62\x1b\x7c\xa7\x59\xe3\x73\xd9\x7a\xf5\x66\xd3\x20\x87" +
"\xbc\xf6\x0a\x09\x5c\x9e\x7b\xa5\xff\x83\x2b\xff\x46\x8f\xaf\xaa\xd3\xec\xec\xf5\xe9\x6f\xf3\x33\x64\xd2\xfd\xa2" + "\xe3\x99\xed\x88\x27\xda\x37\x64\x39\x50\xe7\x26\x21\xee\x3a\xf7\xff\x58\xa2\x28\xda\x59\x85\xf9\xeb\x29\x26\x00" +
"\x26\x5d\xfe\x1d\x00\x00\xff\xff\x19\x94\x55\x68\x0b\x07\x00\x00") "\xee\xc6\x3a\xfc\x89\x07\x61\xee\x15\x12\xb8\x38\xf5\x62\xfc\x0b\x97\xfe\xbd\xe8\xff\x36\x9c\x66\xd3\x26\xbf\xfd" +
"\x4d\x7e\x82\x4c\x9a\xe7\x72\x30\x2d\xbf\x03\x00\x00\xff\xff\x39\xa7\xf2\x28\x97\x07\x00\x00")
func frontendAssetsApplicationCoffeeBytes() ([]byte, error) { func frontendAssetsApplicationCoffeeBytes() ([]byte, error) {
return bindataRead( return bindataRead(
@ -118,42 +119,44 @@ func frontendAssetsApplicationCoffee() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "frontend/assets/application.coffee", size: 1803, md5checksum: "", mode: os.FileMode(420), modTime: time.Unix(1431268437, 0)} info := bindataFileInfo{name: "frontend/assets/application.coffee", size: 1943, md5checksum: "", mode: os.FileMode(420), modTime: time.Unix(1509448738, 0)}
a := &asset{bytes: bytes, info: info} a := &asset{bytes: bytes, info: info}
return a, nil return a, nil
} }
var _frontendAssetsApplicationJs = []byte( var _frontendAssetsApplicationJs = []byte(
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x4d\x8f\xe4\x34\x10\xbd\xf7\xaf\x28\x0d\xcd\xc4\x61\x33\xe9\x9e" + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x4b\x6f\xe3\x36\x10\xbe\xfb\x57\x0c\x52\x37\x92\xba\x8a\xec\xa4" +
"\x81\xd3\x8e\x02\x07\x90\xd0\xa0\x85\x5d\xd1\xdc\x10\x07\x8f\x53\x49\x5b\xe3\x89\x23\xdb\xe9\xd6\x08\xe5\xbf\x23" + "\x3d\x6d\xa0\xf6\xb0\x0b\x14\x69\xb7\xdd\x45\xdd\x43\x81\xa2\x07\x86\x1a\xd9\x84\x19\x51\x20\x69\xbb\x41\xe1\xff" +
"\x7f\x24\x71\xd2\x1f\x0b\xec\xa9\xdb\x76\xb9\xea\xf9\xbd\xe7\x72\x36\x1b\xf8\x19\x1b\x54\xd4\x60\x09\xcf\x6f\xf0" + "\x5e\xf0\x21\x8a\x94\x1f\xdb\xc7\xc9\x26\xf9\xcd\x83\xf3\x7d\x33\xd4\x62\x01\xdf\x63\x87\x92\x68\x6c\xe0\xf9\x15" +
"\xa3\xac\x2a\xc4\x1d\x53\xbc\x35\x70\x9f\xdf\x3f\xe4\xdf\xad\x48\xd5\x35\xcc\x70\xd9\x90\x14\xfe\x5e\x01\x1c\xa8" + "\xde\x89\xb6\x45\x5c\x51\xc9\x7a\x0d\xf7\xd5\xfd\x43\xf5\xcd\x2c\x6f\x77\x1d\xd5\x4c\x74\x79\x01\x7f\xcd\x00\xf6" +
"\x02\x21\x69\xf9\xb1\xb5\x93\x3a\x73\x83\x4f\x54\xeb\xa3\x54\x65\x06\x8d\x3c\x66\xa0\x50\x1b\xaa\xcc\xef\x58\x29" + "\x44\x02\x17\xa4\xf9\xd8\x9b\x4d\x55\xda\xc5\x27\xa2\xd4\x41\xc8\xa6\x84\x4e\x1c\x4a\x90\xa8\x34\x91\xfa\x17\x6c" +
"\xd4\xfb\x0c\x34\x3d\xe0\x18\xaf\xd1\x7c\x52\xb2\x56\xa8\xed\xc0\xc8\x76\x0c\x33\x9c\xbd\x3c\xae\x56\x00\xbc\x02" + "\x25\xaa\x4d\x09\x8a\xec\x31\xe0\x15\xea\x4f\x52\xac\x25\x2a\xb3\xd0\xa2\x0f\x30\xcd\xe8\xf6\x71\x36\x03\x60\x2d" +
"\x72\xe4\x4d\x29\x8f\xf9\xce\x48\x45\x6b\x84\xdb\x5b\x08\x33\xbf\xec\x3e\xfe\xe6\xa1\xc0\x30\xb5\xd6\x21\xaa\x80" + "\xe4\x07\xd6\x35\xe2\x50\xad\xb4\x90\x64\x8d\x70\x7b\x0b\x7e\xe7\x87\xd5\xc7\x9f\x5d\x2a\x30\x6c\xcd\x95\x47\xd5" +
"\x11\xed\x0b\xbe\x0d\x51\x00\x0a\x4d\xa7\x9a\x71\x08\x16\xc4\xfb\x29\xf6\x40\x45\x87\x69\xb4\x3c\xee\x10\x92\x51" + "\x10\xb2\xdd\xe2\xeb\x80\x02\x90\xa8\x77\xb2\x0b\x4b\x30\x49\xbc\x1d\xb1\x7b\xc2\x77\x58\x44\xc7\xc1\x82\x0b\x4a" +
"\x11\x30\xe4\x1a\xcd\x93\xc1\x57\x9b\x3a\x03\x0b\x23\xd7\x46\xf1\xa6\xe6\xd5\x5b\x48\x91\x3e\x8e\x29\xfa\x6c\xfc" + "\xb8\xcf\xa1\x52\xa8\x9f\x34\xbe\x18\xd7\x25\x98\x34\x2a\xa5\x25\xeb\xd6\xac\x7d\xf5\x2e\x8a\xc7\xe0\xe2\x58\x86" +
"\x5b\xcf\x8a\xcd\xeb\x58\x3a\xb9\xc1\xd7\xc7\x68\xce\x8e\xa1\x98\xd7\xae\xa7\xda\xe9\x2c\xb6\x02\x62\xe3\xe7\x59" + "\xbf\xeb\x24\x58\x1a\xc7\x94\x93\x69\x7c\x79\x8c\xf6\xcc\x1a\xea\x34\xf6\x7a\x8c\x5d\x24\xd8\x16\x72\x83\x4f\xbd" +
"\x47\xfc\x0e\x65\x4b\x95\x46\x1f\x15\x6f\xed\x57\xcb\x7f\xbd\x5f\x76\x3f\xbd\x15\x62\xbd\x54\x7f\xa4\x5c\x50\x6d" + "\x86\xfc\x6d\x96\x3d\x91\x0a\x1d\x2a\x36\x3d\xce\xa6\xff\x8e\xee\xd8\xfe\x1c\x0d\x11\xf3\x29\xfb\xa1\xe4\x9c\x28" +
"\x3e\x48\x5a\x42\x61\x25\x27\x21\x71\x58\x54\x5e\xd1\xc1\x15\x50\xc0\xb7\xdb\xed\x76\x3b\x8b\xb1\x62\xa3\x7a\x6a" + "\xfd\x41\x90\x06\x6a\x43\x79\xee\x1d\xfb\x43\xe9\x18\x1d\x54\x01\x35\x7c\xbd\x5c\x2e\x97\x09\xc6\x90\x8d\xf2\xa9" +
"\x0c\xaa\x03\x15\x50\xc0\xc3\xd9\x00\x28\xac\x56\x43\x18\xb1\x93\xd9\xf9\x14\x01\xc2\x9a\x24\x5f\x55\x92\x75\x1a" + "\xd3\x28\xf7\x84\x43\x0d\x0f\x67\x01\x50\x1b\xae\x06\x58\x6e\x36\xcb\xf3\x2e\x7c\x0a\xf3\x3c\xfb\xa2\x15\x74\xa7" +
"\xcb\xa7\xa6\xed\x4c\x92\xe6\xcf\xbc\x29\x49\xc2\x04\x67\x2f\xc9\xcc\x72\x9f\xdb\xf2\x2c\x3a\x95\x2c\xed\x1c\x6d" + "\xb0\x79\xea\xfa\x9d\xce\x8a\xea\x99\x75\x4d\x9e\x51\xce\xe8\x36\x4b\x24\xf7\x39\x93\x67\xbe\x93\xd9\x54\xce\x91" +
"\x92\xce\xd3\x3b\x7a\xc0\xd3\x2a\x93\xe5\xc3\x86\xe8\xd2\x0c\x74\x8d\x26\x9b\x6e\x90\x5f\xea\x53\x77\x0f\x1a\x79" + "\x91\xb0\x9a\x5e\x91\x3d\x9e\x46\x19\x25\xef\x0d\xa2\xa6\x19\xca\x15\x44\x36\x76\x90\x3b\x3a\x16\xb6\x0f\x3a\x71" +
"\x8c\x2d\x3d\x48\x60\x3d\x53\xfa\x0c\x8e\x7f\x3c\xc2\x4f\xd4\xe0\x22\x6b\x69\x3d\xf3\x07\x7f\x0d\xf3\xbd\xcb\x18" + "\x88\x25\x3d\x50\x60\x34\xd3\x38\x0f\xb6\xfe\x78\x80\xf7\x44\xe3\xc4\x6b\x63\x34\xf3\x2b\x7b\xf1\xfb\x47\xeb\x31" +
"\x1d\xfe\x5c\x66\x26\x90\x8e\x84\x92\x19\xcd\x97\xb9\xd2\x28\x90\x99\x45\xf5\x8a\x0a\x8d\x53\xdd\x39\x85\xe7\x4a" + "\xba\xfc\x39\xcf\x94\x23\x09\x05\xcd\x93\x32\x5f\xae\x95\x42\x8e\x54\x4f\xa2\xb7\x84\x2b\x1c\xe3\xa6\x25\x3c\x17" +
"\x5f\xf5\x55\x48\xfa\x25\xce\x08\xe7\x9f\x9a\x4f\x0c\xa2\x45\xc5\x06\x20\xa1\xd6\x9a\x24\x79\x1b\x42\xef\x9e\xa9" + "\xfa\xaa\xae\xbc\xd3\xff\xa3\x0c\x7f\xff\x71\xf8\xc4\x49\xf4\x28\xe9\x90\x88\x8f\x35\xcf\xb3\xaa\xf7\xd0\xbb\x67" +
"\x4a\xd2\x9c\x69\x4d\x92\x23\x2f\xcd\x3e\xc9\xc0\x6e\x81\x77\x70\xf3\xf5\x4d\x94\x3e\x56\xf2\x92\x72\xde\x34\xda" + "\x22\xb3\xa2\xa2\x4a\xe5\xd9\x81\x35\x7a\x93\x95\x60\x4c\xe0\x0d\xdc\x7c\x79\x13\xb9\x8f\x99\xbc\xc4\x9c\x13\x8d" +
"\x1f\x2c\x0c\xdc\x6d\xbf\x64\x8f\xb5\x15\x92\xdc\x6c\x0e\xf7\x9b\x1a\xcd\x90\xfe\x07\x81\x4d\x6d\xf6\xc5\x0d\xbc" + "\x72\x17\xf3\x0b\xdb\xed\x97\xe4\x31\x37\x44\xe6\x37\x8b\xfd\xfd\x62\x8d\x7a\x70\xff\x1d\xc7\x6e\xad\x37\xf5\x0d" +
"\x1b\xb2\xe4\x6d\x58\xfb\xe0\x96\x2c\xba\x5b\xdd\x22\xe3\x54\xcc\xc2\x3a\x8d\x3b\x3f\x9d\x4d\x10\x4b\x6a\xe8\xd4" + "\xbc\x19\xbc\x54\xbd\x3f\xfb\x60\x8f\x4c\x76\xb7\xaa\x47\xca\x08\x4f\x60\x3b\x85\x2b\xb7\x6d\x21\x7f\x6e\x69\x33" +
"\x44\xce\xc8\x6c\x49\x76\x41\x8f\xf3\xa6\x7a\x55\xb8\x3e\xe6\x7e\xba\x12\xff\x91\x9b\x01\xd5\xfc\x7c\xef\x1d\xca" + "\x3d\xff\xed\xc7\x77\xef\xcb\x31\xff\x86\x68\x32\x4e\x98\x33\x1a\x30\x0c\x58\xd0\x63\x3a\x71\xaf\xb2\x7a\x8c\x89" +
"\xf9\x9c\xcf\x1f\xd0\xa6\x43\x0b\x9e\x0e\xec\xf7\x4c\xe3\x21\xfe\xcf\xed\x5f\x39\xdb\x23\x7b\xc1\x72\x15\x75\xc2" + "\x19\xfb\xe5\x5f\x16\x6e\xc8\x2a\xbd\xfc\x5b\x9b\x65\xba\xe7\xfc\xfb\x6c\x8b\x61\x3e\x8f\xd5\x70\x36\xe3\x7a\xc0" +
"\xc5\xfb\x42\x92\x1d\xb2\x4e\xe1\xa0\x41\x38\x8d\xbb\x03\x86\xc8\xd9\x75\xb7\x75\x34\x1a\xc3\x9b\x5a\xff\x2a\x4b" + "\xff\xbe\xfc\xa3\xa2\x1b\xa4\x5b\x6c\x22\x23\x53\xa2\x60\x61\x16\x67\xe0\xb3\x68\xaa\x4e\xde\xaa\x3c\x5b\x21\xdd" +
"\x2a\x92\x34\x7f\xb5\xbf\x24\xd9\xf3\x12\x93\xcf\xb6\x80\xd1\x50\xff\x8f\xb3\x7f\x0d\xdd\x9a\x2b\x80\xb1\x8f\xc9" + "\x49\x1c\xf8\xf4\x97\xb7\xfd\xa4\x73\x91\x8c\x0e\x13\x44\xa1\xd6\xac\x5b\xab\x9f\x44\x43\x78\x56\x54\x2f\xe6\x37" +
"\x98\xa1\x28\xe0\x20\x79\x09\xdb\xc9\x15\xa7\x8a\x9c\x6a\xf2\xb0\x9d\x1e\xbe\x98\x77\xd7\x10\x16\xef\xcc\x48\xd4" + "\xcf\x36\xac\xc1\xec\xb3\xe3\x24\x88\xf3\xbf\x95\xf8\x1f\xa7\x6e\x84\xea\x93\x31\x0f\x53\xf0\x50\xd7\xb0\x17\xac" +
"\x15\x11\xcf\x7b\x3b\x22\xf9\xaa\x98\x50\x9c\x71\xfd\x8c\xf9\x88\x3e\x4f\xb9\xed\x1d\x17\xbb\x2e\xaf\x2a\x7f\xf5" + "\x81\xe5\x28\xa2\x53\x02\x4f\x29\x7c\x58\x8e\x8f\x68\x4c\x93\x1d\x2e\xc9\x91\x23\xc3\xee\x4f\xde\xb2\x50\xc0\x2b" +
"\x43\xfb\xe5\x55\x35\x18\x1e\xee\x96\x57\xc1\xc7\xb8\x46\x51\x8c\x1f\x34\xcb\xb7\xf1\xce\x25\x49\x61\x73\xe9\xf1" + "\x5a\x38\xdf\x3f\x51\xf1\xaf\x6a\x02\xea\x33\x9d\x95\xd8\x5e\x50\x47\x6a\x68\x40\x09\x8f\x11\x19\x8e\x40\x33\xd5" +
"\xfc\x06\xee\x87\x97\x31\xea\x5e\xbe\x65\x4d\xb2\x39\x24\xdf\x17\x17\x92\x9c\x7c\x09\x9d\xfa\xcd\xcb\x61\x29\xe8" + "\x2e\xbe\x07\xac\x6d\xdd\x50\xf2\x0f\x03\x6b\xdb\xa1\xdb\xe0\x6e\xda\x87\x0e\x63\x47\x58\x1d\x3e\xb5\xa6\xaf\xf6" +
"\xd3\x9c\x51\x21\x88\xd9\x73\x6b\xe6\x7f\x02\x00\x00\xff\xff\x13\x7e\x8c\xc4\x25\x0a\x00\x00") "\x9d\x75\x52\xc0\xe2\xd2\xb3\xfe\x15\xdc\x0f\x6f\x76\x34\x57\xdd\x30\x1d\x45\x60\x33\xf9\xb6\xbe\xe0\xe4\xe4\x1b" +
"\xed\x54\xbd\x8e\x44\x53\x82\x63\x51\x51\xc2\x79\xae\x37\xcc\xb4\xc6\xdf\x01\x00\x00\xff\xff\x63\xd8\x3c\xbd\xbf" +
"\x0a\x00\x00")
func frontendAssetsApplicationJsBytes() ([]byte, error) { func frontendAssetsApplicationJsBytes() ([]byte, error) {
return bindataRead( return bindataRead(
@ -168,82 +171,83 @@ func frontendAssetsApplicationJs() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "frontend/assets/application.js", size: 2597, md5checksum: "", mode: os.FileMode(436), modTime: time.Unix(1506096158, 0)} info := bindataFileInfo{name: "frontend/assets/application.js", size: 2751, md5checksum: "", mode: os.FileMode(436), modTime: time.Unix(1509448748, 0)}
a := &asset{bytes: bytes, info: info} a := &asset{bytes: bytes, info: info}
return a, nil return a, nil
} }
var _frontendIndexHtml = []byte( var _frontendIndexHtml = []byte(
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x38\xfd\x6e\xdc\xb8\xf1\xff\xe7\x29\x26\x0a\x7e\xc8\x5d\x10\x49\xb1" + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x18\xed\x92\xd5\xb6\xf5\x3f\x4f\x71\x30\xd3\x21\x61\xb0\xcd\xee\x92" +
"\x9d\xfb\x35\x75\xb4\x2e\xdc\xc4\xbd\xec\x21\x77\xc9\x9d\x73\x68\x83\xc3\xfd\x31\x12\x47\x12\x6d\x8a\x54\xf8\xb1" + "\x94\x2c\xbe\xdb\xa1\x40\xc3\xa6\x24\x90\x40\xa6\x61\x32\x99\xce\xb1\x74\x6c\x6b\x57\x96\x8c\x3e\xee\xdd\x5b\xa6" +
"\xeb\x6d\xd0\xe7\xe8\x03\xf5\xc5\x0a\x52\xd2\xae\x76\x57\xeb\xd8\x6d\x50\x04\xf1\x8a\xc3\xe1\x7c\x71\x3e\x99\x3d" + "\xcf\xd1\x07\xea\x8b\x75\x24\xdb\xf7\xd3\x17\x76\x1b\x26\xc3\xb0\xd7\x3a\x3a\x3a\x5f\x3a\x9f\x2a\x6e\x3f\x7b\xf5" +
"\x7c\xfd\xee\xd5\x87\x8f\xef\x2f\xa0\xb6\x8d\x38\x7b\x90\xf9\x1f\x10\x28\xab\x59\x44\x32\x3a\x7b\x00\x90\xd5\x84" + "\xf4\xed\xbb\xd7\xcf\xa1\x71\xad\x3c\xbb\x55\x84\x1f\x90\xa8\xea\x59\x42\x2a\x39\xbb\x05\x50\x34\x84\x3c\x7c\x00" +
"\xcc\x7f\x00\x64\x0d\x59\x84\xa2\x46\x6d\xc8\xce\x22\x67\xcb\xf8\x45\x34\xde\xaa\xad\x6d\x63\xfa\xe4\xf8\x62\x16" + "\x14\x2d\x39\x04\xd6\xa0\xb1\xe4\x66\x89\x77\x55\xfa\x28\xd9\xdc\x6a\x9c\xeb\x52\x7a\xef\xc5\x7c\x96\xfc\x92\xfe" +
"\xfd\x2d\xfe\xf5\x3c\x7e\xa5\x9a\x16\x2d\xcf\x05\x45\x50\x28\x69\x49\xda\x59\x34\xbf\x98\x11\xab\x68\xeb\xa4\xc4" + "\xfc\x24\x7d\xaa\xdb\x0e\x9d\x28\x25\x25\xc0\xb4\x72\xa4\xdc\x2c\x39\x7f\x3e\x23\x5e\xd3\xd6\x49\x85\x2d\xcd\x92" +
"\x86\x66\xd1\x82\xd3\xb2\x55\xda\x8e\x90\x97\x9c\xd9\x7a\xc6\x68\xc1\x0b\x8a\xc3\xe2\x29\x70\xc9\x2d\x47\x11\x9b" + "\xb9\xa0\x45\xa7\x8d\xdb\x40\x5e\x08\xee\x9a\x19\xa7\xb9\x60\x94\xc6\xc5\x7d\x10\x4a\x38\x81\x32\xb5\x0c\x25\xcd" +
"\x02\x05\xcd\x8e\x9e\x42\x83\x37\xbc\x71\xcd\x06\xe0\x0c\xe9\xb0\xc2\x5c\xd0\x4c\xaa\x81\xd7\xc3\x38\x86\x0f\x35" + "\x8e\xee\x43\x8b\x57\xa2\xf5\xed\x1a\xe0\x2d\x99\xb8\xc2\x52\xd2\x4c\xe9\x91\xd7\xed\x34\x85\xb7\x0d\x01\x96\x7a" +
"\x01\xe6\x6a\x41\x70\x02\x81\xb7\xc5\xca\xc0\x93\xc6\x19\xfb\x04\x0a\xd5\x10\x94\x5c\x1b\x0b\x5c\x82\xad\x09\xbc" + "\x4e\x70\x02\x91\xb7\xc3\xda\xc2\xbd\xd6\x5b\x77\x0f\x98\x6e\x09\x2a\x61\xac\x03\xa1\xc0\x35\x04\x41\xfd\xc7\x80" +
"\xfa\x2f\x01\xe5\x0a\x94\xad\x49\x87\xf5\x20\x1e\xf8\x43\xdd\x99\x27\x58\x5a\xd2\x4f\xfc\x11\x43\x1d\xc9\x38\xee" + "\x6a\x09\xda\x35\x64\xe2\x7a\x14\x0f\xc2\xa1\xfe\xcc\x3d\xac\x1c\x99\x7b\xe1\x88\xa5\x9e\x64\x9a\x0e\x5c\x9d\x70" +
"\xb9\x5a\x6e\x05\x9d\x5d\x52\xe1\x34\xc1\x7b\x34\x66\xa9\x34\xcb\xd2\x0e\xfc\x60\x23\xd9\x9f\x95\xb2\xc6\x6a\x6c" + "\x92\xce\xde\x10\xf3\x86\xe0\x35\x5a\xbb\xd0\x86\x17\x79\x0f\xbe\xb5\x96\xec\xaf\x5a\x3b\xeb\x0c\x76\xeb\xa3\x52" +
"\x37\x47\x05\x97\xd7\xa0\x49\xcc\x22\x63\x57\x82\x4c\x4d\x64\x23\xa8\x35\x95\xb3\xc8\x5b\xdb\x9c\xa6\x69\x83\x37" + "\xa8\x4b\x30\x24\x67\x89\x75\x4b\x49\xb6\x21\x72\x09\x34\x86\xaa\x59\x12\xac\x6d\x4f\xf3\xbc\xc5\x2b\xc6\x55\x56" +
"\x05\x93\x49\x3e\x9c\xf6\x8b\x42\x35\xe9\x1a\x90\x9e\x24\x27\xc9\xf3\xb4\x30\x66\x03\x4b\x1a\x2e\x93\xc2\x98\xe8" + "\x8e\xa7\xc3\x82\xe9\x36\x5f\x01\xf2\x93\xec\x24\x7b\x98\x33\x6b\xd7\xb0\xac\x15\x2a\x63\xd6\x26\x37\x60\x14\x0f" +
"\x1e\x8c\xc2\xe1\x25\xda\xa2\x0e\xf4\x5b\x6c\x49\x4f\x52\xdc\xa8\xf4\xe6\xc3\x8f\x6f\xbf\x03\x53\xf3\x06\x50\x32" + "\x2f\xd0\xb1\x26\xd2\xef\xb0\x23\x33\x49\x71\xad\xd2\x8b\xb7\xdf\xbf\xfc\x0a\x6c\x23\x5a\x40\xc5\xe1\x27\xb2\x9d" +
"\xf8\x85\x4c\xab\x24\x4b\xae\x0c\x94\x4a\xc3\xfc\xe2\x05\x18\xd7\xfa\x2b\x07\x55\xf6\xc8\x24\xa8\x21\x69\x4d\x38" + "\x56\x3c\xbb\xb0\x50\x69\x03\xe7\xcf\x1f\x81\xf5\x5d\xb8\x72\xd0\xd5\x80\x4c\x92\x5a\x52\xce\xc6\x03\x2d\x71\x81" +
"\xd0\x10\xe3\x08\x9f\x1c\x69\x4e\x23\x8b\x7a\xd2\x7f\x3d\xff\xe5\xa7\xf9\x4f\xdf\x9f\x8e\x89\x32\x45\x46\x3e\xb6" + "\xf0\xde\x93\x11\xb4\x61\xd1\x40\xfa\x1f\x4f\x7e\xfa\xe1\xfc\x87\x6f\x4f\x37\x89\x72\x4d\x56\xdd\x75\xb0\xd0\xe6" +
"\xb0\x54\xfa\x1a\x78\x09\x2b\xe5\xc0\x3b\x55\xb8\xc9\x16\x2b\x82\x05\x47\x28\xb9\xa0\xd3\x34\xdd\x22\xf7\x1b\x2f" + "\x12\x44\x05\x4b\xed\x21\x38\x55\xbc\xc9\x0e\x6b\x82\xb9\x40\xa8\x84\xa4\xd3\x3c\xdf\x22\xf7\xab\xa8\x40\x3a\x38" +
"\x41\x58\x98\x5f\xc0\x1f\x7f\xef\xa0\x00\x99\x29\x34\x6f\x2d\x18\x5d\x6c\x8c\xa0\x8c\x49\x7a\x8b\x7b\x23\xf8\x80" + "\x7f\x0e\xdf\xfc\xd6\x43\x01\x0a\xcb\x8c\xe8\x1c\x58\xc3\xd6\x46\xd0\xd6\x66\x83\xc5\x83\x11\x42\xc0\x7c\x65\x1b" +
"\xf9\xce\xd4\x7c\x91\x9e\x24\x7f\x48\x8e\x37\xeb\x60\x8e\x2b\x13\x9d\x65\x69\x47\xe6\x3e\x54\x75\xa7\x52\x7a\x94" + "\x31\xcf\x4f\xb2\x3f\x67\xc7\xeb\x75\x34\xc7\x85\x4d\xce\x8a\xbc\x27\x73\x13\xaa\xa6\x57\x29\x3f\xca\x1e\x66\xc7" +
"\x3c\x4f\x8e\x87\xd5\x01\x8a\xd9\xc3\xdf\x48\x32\x5e\xfe\xbe\x56\x27\xdc\xe0\xc0\x2e\x57\x6c\x05\x9f\x21\xc7\xe2" + "\xe3\xea\x00\xc5\xe2\xf6\xaf\xa4\xb8\xa8\x7e\x5b\xa9\x13\x6f\x70\x64\x57\x6a\xbe\x84\x0f\x50\x22\xbb\xac\x8d\xf6" +
"\xba\xd2\xca\x49\x16\x17\x4a\x28\x7d\x0a\x8f\xe8\xd8\xff\x7b\x09\xff\xe8\x31\x93\x65\xcd\x2d\x4d\xe3\x96\x65\x39" + "\x8a\xa7\x4c\x4b\x6d\x4e\xe1\x0e\x1d\x87\x7f\x8f\xe1\xdf\x03\x66\xb6\x68\x84\xa3\x69\xdc\xaa\xaa\x36\x10\x19\x29" +
"\x42\x2c\x48\x5a\xd2\xf0\x19\x2c\xdd\xd8\x18\x05\xaf\xe4\x29\x74\xc0\x11\x56\x89\x9f\xe0\x33\x34\xa8\x2b\x2e\x63" + "\x47\x06\x3e\x80\xa3\x2b\x97\xa2\x14\xb5\x3a\x85\x1e\xb8\x81\x55\xe1\x7b\xf8\x00\x2d\x9a\x5a\xa8\xd4\xe9\xee\x14" +
"\xab\xda\x53\x38\xa1\x66\xb4\xdf\x6a\x55\x69\x32\x66\x83\x94\x2b\x6b\x55\x73\x0a\xcf\xda\x9b\x11\xde\x95\x6b\x72" + "\x4e\xa8\xdd\xd8\xef\x8c\xae\x0d\x59\xbb\x46\x2a\xb5\x73\xba\x3d\x85\x07\xdd\xd5\x06\xde\x85\x6f\x4b\xed\x8c\x56" +
"\x65\xb5\x92\xd0\x4e\xa0\x0e\x88\x59\xba\x56\x3b\x4b\x87\x9c\x95\x79\xed\x7b\xab\x48\x5c\x40\x21\xd0\x98\x59\x24" + "\xd0\x4d\xa0\x8e\x88\x45\xbe\x52\xbb\xc8\xc7\x9c\x55\x04\xed\x07\xab\x28\x9c\x03\x93\x68\xed\x2c\x51\x38\x2f\xd1" +
"\x71\x91\xa3\x86\xee\x27\x66\x54\xa2\x13\x36\x5a\x5f\x10\xe3\x6b\x4c\x1f\xe8\xc8\x25\xe9\xb8\x14\x8e\xb3\x35\xce" + "\x40\xff\x93\x72\xaa\xd0\x4b\x97\xac\x2e\x88\x8b\x15\x66\x08\x74\x14\x8a\x4c\x5a\x49\x2f\xf8\x0a\x67\x8c\x58\x13" +
"\x10\xb1\xda\x3b\xa9\xff\x6f\x55\x55\x09\x82\x8a\x2c\x78\xd3\xb5\xc4\x82\x87\xe7\x64\xbd\xa5\x1a\x95\x73\x41\xc0" + "\x9c\x34\xfc\x77\xba\xae\x25\x41\x4d\x0e\x82\xe9\x3a\xe2\xd1\xc3\x4b\x72\xc1\x52\xad\x2e\x85\x24\xe0\xc2\x76\x12" +
"\xb8\x69\x05\xae\xd6\x8e\xb7\xcb\xad\x17\xc8\x4b\x4f\x7a\xc4\xcb\x2b\xe2\xac\x55\x12\xec\xaa\xa5\x59\xd4\x2d\xa2" + "\x97\x2b\xc7\xdb\xe5\x36\x08\x14\xa4\x27\xb3\xc1\x2b\x28\xe2\x9d\xd3\x0a\xdc\xb2\xa3\x59\xd2\x2f\x92\x9d\x63\xbd" +
"\x9d\x63\x9d\x08\x11\x30\xb4\xd8\x2f\x66\x51\xa3\x18\x8a\x01\x86\xba\xf2\x89\xfb\x91\x21\x6b\xb9\xac\xcc\x8f\x61" + "\x08\x09\x70\x74\x38\x2c\x66\x49\xab\x39\xca\x11\x86\xa6\x0e\x89\xfb\x8e\x25\xe7\x84\xaa\xed\xf7\x71\x73\x93\x4f" +
"\x73\xcc\xc7\x7b\x4f\x8b\x72\xa0\x5c\x89\x55\x5b\xf3\x42\x49\x58\x7f\xc5\x85\xaa\x22\x40\xcd\x31\xae\x39\x63\x24" + "\xf0\x9e\x0e\xd5\x48\xb9\x96\xcb\xae\x11\x4c\x2b\x58\x7d\xa5\x4c\xd7\x09\xa0\x11\x98\x36\x82\x73\x52\xb3\xc4\x19" +
"\x67\x91\xd5\x8e\x82\x57\xb6\x28\xb7\x84\x4e\x3b\x41\xb7\x60\xb8\x23\x75\xee\x4d\x38\x64\x9a\x47\xd1\x7e\x9a\xc4" + "\x4f\xd1\x2b\x3b\x54\x5b\x42\xe7\xbd\xa0\x5b\x30\xdc\x91\xba\x0c\x26\x1c\x33\xcd\x9d\x64\x3f\x4d\xe2\x86\xad\x72" +
"\x91\xad\x52\xc6\x17\xd3\xa6\x2b\x94\x10\xd8\x1a\x1a\x2e\x75\x58\x47\xc0\xd9\x2c\xca\x4d\x4c\x37\xd8\xb4\x82\xe2" + "\x2e\xe6\xd3\xa6\x63\x5a\x4a\xec\x2c\x8d\x97\x3a\xae\x13\x10\x7c\x96\x94\x36\xa5\x2b\x6c\x3b\x49\xe9\xce\x7e\x7a" +
"\x9d\xfd\xf8\x68\xdb\xce\x4e\x8c\xe4\x1b\x88\x49\x5c\xec\x5a\x49\xf0\xb3\x0c\x77\xf2\x63\xc5\x6d\xed\xf2\x10\xc0" + "\xb4\x6d\x67\x2f\x37\xe4\x1b\x89\x29\x9c\xef\x5a\x49\x8a\xb3\x02\x77\xf2\x63\x2d\x5c\xe3\xcb\x18\xc0\x2f\xfd\xbf" +
"\x6f\xdd\xdf\x79\x49\x3a\x6d\x7b\x35\x1e\x2d\x38\xc6\x28\x4a\x4d\x6c\x87\x12\xc0\x79\x00\xc3\xc5\x8d\x25\x69\xb8" + "\x44\x45\x26\xef\x06\x35\xee\xcc\x05\xa6\x28\x2b\x43\x7c\x87\x12\xc0\x93\x08\x86\xe7\x57\x8e\x94\x15\x5a\x05\x95" +
"\x92\x5e\xe5\x2c\x15\xfc\x6b\x70\x6c\xf9\x3e\xbb\xf7\x73\x78\xad\x0a\xe7\x93\x2c\xda\x03\xfc\xb2\xd4\x89\x3b\xd9" + "\x8b\x5c\x8a\xcf\xc1\xb1\x13\xfb\xec\x5e\x9f\xc3\x33\xcd\x7c\x48\xb2\xe8\x0e\xf0\x2b\x72\x2f\xaf\x65\x97\xf1\xd3" +
"\x65\xf8\xd4\xbc\xaa\xed\x84\x91\x76\x98\xdf\xea\xc7\xb9\x95\x90\x5b\x39\x04\xe4\x40\x3a\xb7\xf2\xbf\x75\xea\xaf" + "\x88\xba\x71\x13\x46\xda\x61\xfe\x51\x3f\x2e\x9d\x82\xd2\xa9\x31\x20\x47\xd2\xa5\x53\xbf\xd7\xa9\x3f\x87\x63\xc3" +
"\xe1\xd8\x70\xd9\x33\xd8\x55\x69\xc2\xcb\x3d\xf4\x36\x83\x6e\x39\xf2\x68\x91\xa5\x12\x17\xe3\x63\x1d\x74\x2a\x21" + "\x9b\x81\xc1\xae\x4a\x13\x5e\x1e\xa0\x1f\x33\xe8\x96\x23\x6f\x2c\x8a\x5c\xe1\x7c\xf3\x58\x0f\x9d\x4a\x48\x93\xe9" +
"\x4d\xa6\x2b\xad\x96\xd1\xc1\xf8\x88\x6f\x4c\x7c\x74\x0c\xfe\xcb\x34\xf1\x8b\xe1\x43\x95\xa5\x21\x1b\x77\x1b\x0d" + "\xca\xe8\x45\x72\x30\x3e\xd2\x2b\x9b\x1e\x1d\x43\xf8\xb2\x6d\xfa\x68\xfc\xd0\x55\x65\xc9\xa5\xfd\x46\xcb\xd3\xaf" +
"\x8b\xff\x7f\xf8\xe8\x37\x4e\x86\x82\xbe\x4f\x74\x9d\x99\x77\x2f\xbe\x5d\xb3\x0d\x45\x61\xef\x36\xe6\xb0\xe4\x42" + "\xc7\x8f\x61\xe3\x64\x2c\xe8\xfb\x44\x57\x99\x79\xf7\xe2\xbb\x15\xdb\x58\x14\xf6\x6e\xe3\x1c\x16\x42\x4a\xa8\x49" +
"\x40\x45\x92\x34\x5a\x02\x04\x49\x4b\x30\x5d\xe8\x0f\x1e\x0c\xb4\x20\xbd\x82\x93\x67\x7e\x43\x49\x66\x12\xf8\x21" + "\x91\x41\x47\x80\xa0\x68\x01\xb6\x0f\xfd\xd1\x83\x81\xe6\x64\x96\x70\xf2\x20\x6c\x68\xc5\x6d\x06\xdf\xc5\x7e\x4b" +
"\xf4\x5b\x82\x17\xd7\x7d\x45\xef\x31\xad\x82\x6b\xa2\x36\x00\x0b\xa7\xb5\xef\xcd\x94\xa4\x04\x76\xee\xa4\xdd\xbe" + "\x0a\x76\x39\x54\xf4\x01\xd3\x69\xb8\x24\xea\x22\x90\x79\x63\x42\x6f\xa6\x15\x65\xb0\x73\x27\xdd\xf6\x95\x44\xbb" +
"\x92\x60\xf7\x03\xba\xb5\x28\x49\x40\xf8\xbb\x57\x21\x0e\x60\x87\xc4\xcd\x65\xb5\xa7\xee\x47\xe5\xf4\x5a\xd8\x1d" + "\x1f\xd0\xad\x43\x45\x12\xe2\xdf\xbd\x0a\x71\x00\x3b\x26\x6e\xa1\xea\x3d\x75\xdf\x69\x6f\x56\xc2\xee\x88\xb4\x95" +
"\x91\xb6\x32\xda\x34\x59\x5f\xc4\xf6\x68\x8e\xd1\x4a\xa5\x9b\x38\x94\x9d\x29\xbf\xe7\xb2\x75\x76\x0b\xd5\x3b\x91" + "\xd1\xa6\xc9\x86\x22\xb6\x47\x73\x13\xad\xd2\xa6\x4d\x63\xd9\x99\xf2\x7b\xa1\x3a\xef\xb6\x50\x83\x13\x19\x2d\x87" +
"\x56\xa2\x2f\xd9\x5d\x8a\x2c\x55\xe1\x0c\xb1\xb9\x47\x8e\xfa\xf8\xf4\xe5\x3d\x82\x05\x0a\x47\xb3\x28\x49\x92\x7d" + "\x92\xdd\xa7\xc8\x4a\x33\x6f\x89\x9f\x07\xe4\x64\x88\xcf\x50\xde\x13\x98\xa3\xf4\x34\x4b\xb2\x2c\xdb\x17\x62\x42" +
"\x21\x26\xc4\xbf\x8b\x46\xa5\x52\x53\x6e\xb1\x85\xd8\x77\x07\x53\x1a\x4d\xa0\xc5\x39\xea\x08\x42\x0b\xd0\x0f\x0d" + "\xfc\xeb\x68\x54\x69\x3d\xe5\x16\x5b\x88\x43\x77\x30\xa5\xd1\x04\x5a\x5a\xa2\x49\x20\xb6\x00\xc3\xd0\x70\x0a\x47" +
"\xa7\x70\xf4\xec\xd9\xff\xbd\xf4\xf1\xbb\x27\xd1\xdd\x24\xff\xdf\x39\xc8\x5f\xce\x7f\xfe\x5a\x6e\xb1\x9d\xb7\x7b" + "\x0f\x1e\xfc\xe9\x71\x88\xdf\x3d\x89\xae\x27\xf9\x1f\xe7\x20\x7f\x7b\xf2\xe3\xe7\x72\x8b\xed\xbc\x3d\x00\x43\xed" +
"\xa0\xaf\x1d\xc6\x07\x6a\x75\xf6\x5a\x85\xae\xd8\x58\xa5\x09\x9a\xd5\xda\x2d\xff\xe4\x1b\xa8\x80\x91\xe5\x7a\x9f" + "\xb0\x21\x50\xeb\xb3\x67\x3a\x76\xc5\xd6\x69\x43\xd0\x2e\x57\x6e\xf9\x97\xd0\x40\x45\x8c\xa2\x34\xfb\x24\xde\x69" +
"\xc4\x47\xe5\x80\x51\xc1\x19\xc1\xb2\xe6\x45\xed\xc3\xcb\x87\x9d\xc5\x6b\x0a\x0d\xd0\x92\xba\x98\x96\xca\xf6\xc4" + "\x0f\x9c\x98\xe0\x04\x8b\x46\xb0\x26\x84\x57\x08\x3b\x87\x97\x14\x1b\xa0\x05\xf5\x31\xad\xb4\x1b\x88\xc7\x99\xa9" +
"\xc3\xcc\x54\x86\x98\x1c\x02\x9d\xad\xd9\x99\x04\x3e\xd4\x68\x61\x89\xab\x20\x4f\x81\x12\x72\x02\xe3\x13\x80\x92" + "\x8a\x31\x39\x06\x3a\x5f\xb1\xb3\x19\xbc\x6d\xd0\xc1\x02\x97\x51\x1e\x86\x0a\x4a\x02\x1b\x12\x80\x56\xb2\x07\x5e" +
"\xa2\x03\x5e\x4b\xb5\xec\xd9\xad\x43\x3d\x20\xd7\xca\x50\xb2\xaf\xe6\x5e\xd1\xdc\x55\xfe\x8d\x5a\x67\x19\xd4\xd4" + "\x2a\xbd\x18\xd8\xad\x42\x3d\x22\x37\xda\x52\xb6\xaf\xe6\x5e\xd1\xdc\x55\xfe\x85\x5e\x65\x19\x34\x34\x0c\x6b\x2b" +
"\x0f\x6b\x6b\x91\xbe\x60\x82\x73\x21\x36\xb8\xe1\x7c\x51\x53\x71\x4d\x0c\xb0\x42\x2e\x8d\x05\x04\x43\x61\x92\xd1" + "\x91\x3e\x61\x82\x27\x52\xae\x71\xe3\x79\xd6\x10\xbb\x24\x0e\x58\xa3\x50\xd6\x01\x82\xa5\x38\xc9\x18\x2f\xc9\x06" +
"\x4e\x90\xf1\xe6\x21\x19\x34\xb2\x35\xad\xc2\x70\x12\xcc\xd3\xe7\x70\x68\xd1\x37\x87\xd2\xf4\x2a\x2e\x95\x13\x0c" + "\xf3\x90\x8a\x1a\xb9\x86\x96\x71\x38\x89\xe6\x19\x72\x38\x74\x18\x9a\x43\x65\x07\x15\x17\xda\x4b\x0e\x6d\x30\xa8" +
"\x1a\x6f\x50\x6e\x81\xd0\xac\x42\x0b\x19\x3c\x1c\x9b\x40\xae\x72\xbe\x5f\x1e\xa7\xbe\xff\xc4\x0a\xaf\x50\xc2\x1c" + "\x70\x40\x68\x97\xb1\x85\x8c\x1e\x8e\x6d\x24\x57\xfb\xd0\x2f\x6f\xa6\xbe\xff\xc7\x0a\x4f\x51\xc1\x39\x98\x30\xc8" +
"\xb4\x1f\x64\x3d\x29\xa3\x9c\x2e\x08\x0a\xc5\xe8\x0b\x16\x78\x57\x42\xa1\x9c\x36\x34\x5c\x59\x02\x73\xfb\xd8\x40" + "\x06\x52\x56\x7b\xc3\x08\x98\xe6\xf4\x09\x0b\xbc\xaa\x80\x69\x6f\x2c\x8d\x57\x96\xc1\xb9\xbb\x6b\xa1\xf3\xa5\x14" +
"\xeb\x72\xc1\x4d\x4d\x0c\x94\x84\xfb\x34\x29\xd1\xd9\xf7\xdc\xbe\x71\xb9\x6f\x41\x7c\x0b\x4d\x61\xc4\x5e\x72\x5b" + "\xb6\x21\x0e\x5a\xc1\x4d\x9a\x94\xe4\xec\x5b\xe1\x5e\xf8\x32\xb4\x20\xa1\x85\xa6\x38\x62\x2f\x84\x6b\x00\xc1\x91" +
"\x03\x82\x25\x63\xc1\x38\x3f\x93\x6c\x59\x72\xe7\x12\x0c\x96\x77\xf4\x85\xdd\xa6\xe6\x0e\x21\x7f\xb8\x50\x6f\xf0" + "\x75\x60\x7d\x98\x49\xb6\x2c\xb9\x73\x09\x16\xab\x6b\xfa\xc2\x6e\x53\x73\x8d\x90\x3f\x5c\xa8\xd7\x78\x9b\x91\x39" +
"\xc6\x91\xd9\x77\x26\x3e\xa1\x4e\xf7\x23\x7b\xc8\x31\xe3\x28\x54\x75\xa0\x6c\x77\x28\xfd\x73\xc3\x76\xa7\xba\x87" + "\x74\x26\x21\xa1\x4e\xf7\x23\x7b\xc8\x29\x17\x28\x75\x7d\xa0\x6c\xf7\x28\xc3\x73\xc3\x76\xa7\xba\x87\x35\x31\x36" +
"\x35\x31\x36\x7c\xa1\xe1\x2a\x84\x32\xc3\xc0\xc0\xb8\x69\xf8\x48\x85\x89\x46\xe8\x5f\xff\x3c\xd0\xeb\xd4\xcf\xb7" + "\x7c\xa2\xe1\x62\x52\xdb\x71\x60\xe0\xc2\xb6\x62\x43\x85\x89\x46\xe8\xbf\xff\x39\xd0\xeb\x34\x0f\xb7\x25\x89\x2f" +
"\x25\x09\x2f\x1b\xbe\x95\xef\x2c\x90\xa5\xf5\xf3\x09\x23\xdf\xa6\xcb\x44\x6e\xbb\x63\xc1\xcb\x04\xe6\x24\x7c\xe4" + "\x1b\xa1\x95\xef\x2d\x50\xe4\xcd\xc3\x09\x23\x7f\x4c\x97\x89\xdc\x76\xcd\x82\x57\x48\x2c\x49\x86\xc8\x09\x79\xb2" +
"\xf8\x3c\xd9\x39\xca\x5b\x92\x95\xad\xdf\xb5\xbe\xdb\x8d\xc6\x9d\x94\x56\x22\x0e\xf8\xd1\xd9\x30\x70\x80\x08\xc8" + "\x77\x94\x97\xa4\x6a\xd7\xbc\xea\x42\xb7\x9b\x6c\x76\x52\x46\xcb\x34\xe2\x27\x67\xe3\xc0\x01\x32\x22\x9f\x16\x79" +
"\xa7\x59\x1a\x36\xf6\xc8\x77\xd5\xb4\x33\xa7\x74\x4d\xee\xeb\xe7\x44\x6d\x5d\x97\xcd\xe3\x67\x9d\x3b\x4c\xca\x72" + "\xdc\xd8\x23\xdf\x57\xd3\xde\x9c\xca\xb7\x65\xa8\x9f\x13\xb5\x75\x55\x36\x8f\x1f\xf4\xee\x30\x29\xcb\x8d\x4a\xe7" +
"\xaf\xd2\xf9\x45\xa5\x0f\xd6\xfe\x4e\xda\x90\xad\x72\x75\xd3\xc9\xe3\x0c\x5d\xb6\x54\x70\x14\x83\x2c\xf0\xab\x21" + "\x27\x95\x3e\x58\xfb\x7b\x69\x63\xb6\x2a\xf5\x55\x2f\x8f\xb7\xf4\xa6\x23\x26\x50\x8e\xb2\xc0\xcf\x96\xc0\xf6\xb0" +
"\x30\x1d\x2c\xbc\xf2\x61\x61\x49\xef\xb7\xbb\x13\xbc\x0e\xc5\xd1\x6d\x57\x3c\xd9\x03\xdc\x67\x3e\x98\x76\xdc\xb3" + "\xf8\xca\x87\xcc\x91\xd9\x6f\x77\x27\x78\xfd\xd1\x92\xff\xf2\xf7\xa7\xcf\xb6\xc4\xde\x4b\x3a\x57\x97\x8c\xc7\x94" +
"\x57\xde\xa9\x0f\x38\xea\x5d\xa8\xb7\x9a\x37\xa8\x57\x9d\x95\x54\xb0\xcd\x25\x2e\xbc\x3b\xe3\xc2\xa7\x7c\x94\x15" + "\xf3\xcd\xc9\xd7\x79\x02\xe3\x94\xf0\xcf\x52\xa2\xba\x4c\xce\x02\x81\xbe\x5b\x58\x67\x93\xad\x51\xf3\x26\xca\x5e" +
"\x99\xc9\xd1\x76\x67\x3a\xbd\x4b\xea\x78\x18\xc7\x70\xf5\xb3\xf3\x7d\xee\x37\x92\x0a\x32\x06\x75\x97\xf6\xd7\x8f" + "\xc3\x9f\x27\x1b\x9e\x9b\x0c\x43\xd3\x51\x7a\xf6\x34\x44\xf0\x81\xa8\xbc\x0e\xf5\xce\x88\x16\xcd\xb2\x37\xac\x8e" +
"\x81\x8f\x0d\xfc\x80\x0b\xbc\xec\x5e\x8d\x5a\xe1\x2a\x2e\xcd\xb7\x9b\xc7\xab\xa9\xe7\x24\xbc\xc2\x9b\xa4\x52\xaa" + "\x16\x7d\x83\xf3\x10\xbb\x38\x0f\xf5\x0d\x55\x4d\x76\x72\x8e\xdf\x19\xc5\xaf\x93\x27\x6f\xa7\x29\x5c\xfc\xe8\x43" +
"\x12\x84\x2d\x37\x21\xf7\x7a\x58\x2a\x78\x6e\xd2\xab\x4f\x9e\x61\x7a\x94\x1c\x1d\x25\xc7\xfd\xea\xe0\xe3\x52\x1c" + "\x53\xff\x85\x22\x46\xd6\xa2\xe9\x6b\xdc\xea\xe5\xf3\xae\x85\xef\x70\x8e\x6f\xfa\x27\xb2\x4e\xfa\x5a\x28\xfb\xe5" +
"\xc3\x5c\x16\xc2\x31\x02\x14\x02\x0a\xd5\xb4\x5c\xf8\x42\xde\x09\x02\xdf\xe4\x24\xd4\xf2\xdb\xa7\xa0\x34\xf0\x1e" + "\xfa\xa5\x6e\xea\xed\x0c\x2f\xf0\x2a\xab\xb5\xae\x25\x61\x27\x6c\xbc\xf5\x00\xcb\xa5\x28\x6d\x7e\xf1\x3e\x30\xcc" +
"\x91\x4b\xc6\x17\x9c\x39\x14\xe1\xad\xcd\x00\x1a\x90\x44\x8c\xd8\xed\x62\xdf\xf5\x25\xf3\x6a\xf7\x21\x73\x42\xf0" + "\x8f\xb2\xa3\xa3\xec\x78\x58\x1d\x7c\x49\x4b\x53\x38\x57\x4c\x7a\x4e\x80\x52\x02\xd3\x6d\x27\x64\xe8\x5a\x7a\x41" +
"\x31\x7d\x34\x86\xac\x49\xb1\x6d\x05\x2f\xc2\xcc\xbb\x77\x22\x4b\xbb\xa7\xa2\x2c\xed\x5e\xc2\xff\x1d\x00\x00\xff" + "\xe0\x8b\x92\xa4\x5e\x7c\x79\x1f\xb4\x01\x31\x20\x0a\xc5\xc5\x5c\x70\x8f\x32\x3e\x2c\x5a\x40\x0b\x8a\x88\x13\xff" +
"\xff\x75\x2d\x32\xd0\x1a\x17\x00\x00") "\xb8\xd8\xd7\x7d\xb6\xbd\xd8\x7d\xb5\x9d\x10\x7c\x93\x3e\x5a\x4b\xce\xe6\xd8\x75\x52\xb0\x38\xe0\xef\x9d\x28\xf2" +
"\xfe\x5d\xac\xc8\xfb\x67\xff\xff\x05\x00\x00\xff\xff\x8d\x8f\xdf\xfd\x07\x18\x00\x00")
func frontendIndexHtmlBytes() ([]byte, error) { func frontendIndexHtmlBytes() ([]byte, error) {
return bindataRead( return bindataRead(
@ -258,7 +262,7 @@ func frontendIndexHtml() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "frontend/index.html", size: 5914, md5checksum: "", mode: os.FileMode(420), modTime: time.Unix(1506096152, 0)} info := bindataFileInfo{name: "frontend/index.html", size: 6151, md5checksum: "", mode: os.FileMode(420), modTime: time.Unix(1509448651, 0)}
a := &asset{bytes: bytes, info: info} a := &asset{bytes: bytes, info: info}
return a, nil return a, nil
} }

View File

@ -6,7 +6,7 @@ import (
"os" "os"
"github.com/Luzifer/password/hasher" "github.com/Luzifer/password/hasher"
"github.com/Luzifer/password/lib" pwd "github.com/Luzifer/password/lib"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -21,14 +21,27 @@ func getCmdGet() *cobra.Command {
cmd.Flags().IntVarP(&flags.CLI.Length, "length", "l", 20, "length of the generated password") cmd.Flags().IntVarP(&flags.CLI.Length, "length", "l", 20, "length of the generated password")
cmd.Flags().BoolVarP(&flags.CLI.SpecialCharacters, "special", "s", false, "use special characters in your password") cmd.Flags().BoolVarP(&flags.CLI.SpecialCharacters, "special", "s", false, "use special characters in your password")
cmd.Flags().BoolVarP(&flags.CLI.XKCD, "xkcd", "x", false, "use XKCD style password")
cmd.Flags().BoolVarP(&flags.CLI.PrependDate, "date", "d", true, "prepend current date to XKCD style passwords")
return &cmd return &cmd
} }
func actionCmdGet(cmd *cobra.Command, args []string) { func actionCmdGet(cmd *cobra.Command, args []string) {
password, err := pwd.GeneratePassword(flags.CLI.Length, flags.CLI.SpecialCharacters) var (
password string
err error
)
if flags.CLI.XKCD {
password, err = pwd.DefaultXKCD.GeneratePassword(flags.CLI.Length, flags.CLI.PrependDate)
} else {
password, err = pwd.NewSecurePassword().GeneratePassword(flags.CLI.Length, flags.CLI.SpecialCharacters)
}
if err != nil { if err != nil {
switch { switch {
case err == securepassword.ErrLengthTooLow: case err == pwd.ErrLengthTooLow:
fmt.Println("The password has to be more than 4 characters long to meet the security considerations") fmt.Println("The password has to be more than 4 characters long to meet the security considerations")
default: default:
fmt.Println("An unknown error occured") fmt.Println("An unknown error occured")

View File

@ -6,6 +6,7 @@ import (
"net/http" "net/http"
"strconv" "strconv"
pwd "github.com/Luzifer/password/lib"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -38,13 +39,20 @@ func handleAPIGetPasswordv1(res http.ResponseWriter, r *http.Request) {
length = 20 length = 20
} }
special := r.URL.Query().Get("special") == "true" special := r.URL.Query().Get("special") == "true"
xkcd := r.URL.Query().Get("xkcd") == "true"
prependDate := r.URL.Query().Get("date") != "false"
if length > 128 || length < 4 { if length > 128 || length < 4 {
http.Error(res, "Please do not use length with more than 128 or fewer than 4 characters!", http.StatusNotAcceptable) http.Error(res, "Please do not use length with more than 128 or fewer than 4 characters!", http.StatusNotAcceptable)
return return
} }
password, err := pwd.GeneratePassword(length, special) var password string
if xkcd {
password, err = pwd.DefaultXKCD.GeneratePassword(length, prependDate)
} else {
password, err = pwd.NewSecurePassword().GeneratePassword(length, special)
}
res.Header().Add("Content-Type", "text/plain") res.Header().Add("Content-Type", "text/plain")
res.Header().Add("Cache-Control", "no-cache") res.Header().Add("Cache-Control", "no-cache")

View File

@ -5,6 +5,9 @@ var flags = struct {
Length int Length int
SpecialCharacters bool SpecialCharacters bool
JSON bool JSON bool
XKCD bool
PrependDate bool
} }
Server struct { Server struct {

View File

@ -37,7 +37,7 @@ setProgress = (perc) ->
loadPassword = () -> loadPassword = () ->
options = loadOptions() options = loadOptions()
$.get "/v1/getPassword?length=#{options.passwordLength}&special=#{options.useSpecial}", (data) -> $.get "/v1/getPassword?length=#{options.passwordLength}&special=#{options.useSpecial}&xkcd=#{options.useXKCD}", (data) ->
$('#focusedInput').val(data) $('#focusedInput').val(data)
window.lastLoad = now() window.lastLoad = now()
@ -45,6 +45,7 @@ saveOptions = () ->
options = options =
passwordLength: $('#passwordLengthOption').val() passwordLength: $('#passwordLengthOption').val()
useSpecial: $('#useSpecialOption')[0].checked useSpecial: $('#useSpecialOption')[0].checked
useXKCD: $('#useXKCDOption')[0].checked
window.$storage('SecurePasswordOptions').set(options) window.$storage('SecurePasswordOptions').set(options)
$('#settingsModal').modal('hide') $('#settingsModal').modal('hide')
@ -56,8 +57,10 @@ loadOptions = () ->
options = options =
passwordLength: 20 passwordLength: 20
useSpecial: false useSpecial: false
useXKCD: false
$('#passwordLengthOption').val(options.passwordLength) $('#passwordLengthOption').val(options.passwordLength)
$('#useSpecialOption')[0].checked = options.useSpecial $('#useSpecialOption')[0].checked = options.useSpecial
$('#useXKCDOption')[0].checked = options.useXKCD
options options
tick = () -> tick = () ->

View File

@ -55,7 +55,7 @@
loadPassword = function() { loadPassword = function() {
var options; var options;
options = loadOptions(); options = loadOptions();
return $.get("/v1/getPassword?length=" + options.passwordLength + "&special=" + options.useSpecial, function(data) { return $.get("/v1/getPassword?length=" + options.passwordLength + "&special=" + options.useSpecial + "&xkcd=" + options.useXKCD, function(data) {
$('#focusedInput').val(data); $('#focusedInput').val(data);
return window.lastLoad = now(); return window.lastLoad = now();
}); });
@ -65,7 +65,8 @@
var options; var options;
options = { options = {
passwordLength: $('#passwordLengthOption').val(), passwordLength: $('#passwordLengthOption').val(),
useSpecial: $('#useSpecialOption')[0].checked useSpecial: $('#useSpecialOption')[0].checked,
useXKCD: $('#useXKCDOption')[0].checked
}; };
window.$storage('SecurePasswordOptions').set(options); window.$storage('SecurePasswordOptions').set(options);
$('#settingsModal').modal('hide'); $('#settingsModal').modal('hide');
@ -78,11 +79,13 @@
if (options === void 0) { if (options === void 0) {
options = { options = {
passwordLength: 20, passwordLength: 20,
useSpecial: false useSpecial: false,
useXKCD: false
}; };
} }
$('#passwordLengthOption').val(options.passwordLength); $('#passwordLengthOption').val(options.passwordLength);
$('#useSpecialOption')[0].checked = options.useSpecial; $('#useSpecialOption')[0].checked = options.useSpecial;
$('#useXKCDOption')[0].checked = options.useXKCD;
return options; return options;
}; };

View File

@ -120,6 +120,11 @@
<input type="checkbox" id="useSpecialOption"> Use special characters <input type="checkbox" id="useSpecialOption"> Use special characters
</label> </label>
</div> </div>
<div class="form-group">
<label>
<input type="checkbox" id="useXKCDOption"> Use <a href="https://xkcd.com/936/" target="_blank">XKCD style passwords</a>
</label>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>

11
main.go
View File

@ -1,20 +1,11 @@
package main package main
import ( import "github.com/spf13/cobra"
"github.com/Luzifer/password/lib"
"github.com/spf13/cobra"
)
var ( var (
version = "dev" version = "dev"
) )
var pwd *securepassword.SecurePassword
func init() {
pwd = securepassword.NewSecurePassword()
}
func main() { func main() {
rootCmd := cobra.Command{ rootCmd := cobra.Command{
Use: "password", Use: "password",