diff --git a/internal/cmd/print.go b/internal/cmd/print.go index e90cd5b..e1c8ac2 100644 --- a/internal/cmd/print.go +++ b/internal/cmd/print.go @@ -25,6 +25,7 @@ func printCmd() *cobra.Command { cmd.Flags().BoolP("index-only", "i", false, "Only print the index of bookmarks") cmd.Flags().StringP("search", "s", "", "Search bookmark with specified keyword") cmd.Flags().StringSliceP("tags", "t", []string{}, "Print bookmarks with matching tag(s)") + cmd.Flags().StringSliceP("exclude-tags", "e", []string{}, "Print bookmarks without these tag(s)") return cmd } @@ -36,6 +37,7 @@ func printHandler(cmd *cobra.Command, args []string) { useJSON, _ := cmd.Flags().GetBool("json") indexOnly, _ := cmd.Flags().GetBool("index-only") orderLatest, _ := cmd.Flags().GetBool("latest") + excludedTags, _ := cmd.Flags().GetStringSlice("exclude-tags") // Convert args to ids ids, err := parseStrIndices(args) @@ -51,10 +53,11 @@ func printHandler(cmd *cobra.Command, args []string) { } searchOptions := database.GetBookmarksOptions{ - IDs: ids, - Tags: tags, - Keyword: keyword, - OrderMethod: orderMethod, + IDs: ids, + Tags: tags, + ExcludedTags: excludedTags, + Keyword: keyword, + OrderMethod: orderMethod, } bookmarks, err := db.GetBookmarks(searchOptions) diff --git a/internal/database/database.go b/internal/database/database.go index e41238c..3e69750 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -20,13 +20,14 @@ const ( // GetBookmarksOptions is options for fetching bookmarks from database. type GetBookmarksOptions struct { - IDs []int - Tags []string - Keyword string - WithContent bool - OrderMethod OrderMethod - Limit int - Offset int + IDs []int + Tags []string + ExcludedTags []string + Keyword string + WithContent bool + OrderMethod OrderMethod + Limit int + Offset int } // DB is interface for accessing and manipulating data in database. diff --git a/internal/database/mysql.go b/internal/database/mysql.go index 34ca0cb..c53a75a 100644 --- a/internal/database/mysql.go +++ b/internal/database/mysql.go @@ -228,28 +228,72 @@ func (db *MySQLDatabase) GetBookmarks(opts GetBookmarksOptions) ([]model.Bookmar // Add where clause args := []interface{}{} + // Add where clause for IDs if len(opts.IDs) > 0 { query += ` AND id IN (?)` args = append(args, opts.IDs) } + // Add where clause for search keyword if opts.Keyword != "" { query += ` AND ( url LIKE ? OR MATCH(title, excerpt, content) AGAINST (? IN BOOLEAN MODE) )` - args = append(args, - "%"+opts.Keyword+"%", - opts.Keyword) + args = append(args, "%"+opts.Keyword+"%", opts.Keyword) } + // Add where clause for tags. + // First we check for * in excluded and included tags, + // which means all tags will be excluded and included, respectively. + excludeAllTags := false + for _, excludedTag := range opts.ExcludedTags { + if excludedTag == "*" { + excludeAllTags = true + opts.ExcludedTags = []string{} + break + } + } + + includeAllTags := false + for _, includedTag := range opts.Tags { + if includedTag == "*" { + includeAllTags = true + opts.Tags = []string{} + break + } + } + + // If all tags excluded, we will only show bookmark without tags. + // In other hand, if all tags included, we will only show bookmark with tags. + if excludeAllTags { + query += ` AND id NOT IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } else if includeAllTags { + query += ` AND id IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } + + // Now we only need to find the normal tags if len(opts.Tags) > 0 { query += ` AND id IN ( - SELECT bookmark_id FROM bookmark_tag - WHERE tag_id IN (SELECT id FROM tag WHERE name IN (?)))` + SELECT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?) + GROUP BY bt.bookmark_id + HAVING COUNT(bt.bookmark_id) = ?)` - args = append(args, opts.Tags) + args = append(args, opts.Tags, len(opts.Tags)) + } + + if len(opts.ExcludedTags) > 0 { + query += ` AND id NOT IN ( + SELECT DISTINCT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?))` + + args = append(args, opts.ExcludedTags) } // Add order clause @@ -312,11 +356,13 @@ func (db *MySQLDatabase) GetBookmarksCount(opts GetBookmarksOptions) (int, error // Add where clause args := []interface{}{} + // Add where clause for IDs if len(opts.IDs) > 0 { query += ` AND id IN (?)` args = append(args, opts.IDs) } + // Add where clause for search keyword if opts.Keyword != "" { query += ` AND ( url LIKE ? OR @@ -328,12 +374,56 @@ func (db *MySQLDatabase) GetBookmarksCount(opts GetBookmarksOptions) (int, error opts.Keyword) } + // Add where clause for tags. + // First we check for * in excluded and included tags, + // which means all tags will be excluded and included, respectively. + excludeAllTags := false + for _, excludedTag := range opts.ExcludedTags { + if excludedTag == "*" { + excludeAllTags = true + opts.ExcludedTags = []string{} + break + } + } + + includeAllTags := false + for _, includedTag := range opts.Tags { + if includedTag == "*" { + includeAllTags = true + opts.Tags = []string{} + break + } + } + + // If all tags excluded, we will only show bookmark without tags. + // In other hand, if all tags included, we will only show bookmark with tags. + if excludeAllTags { + query += ` AND id NOT IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } else if includeAllTags { + query += ` AND id IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } + + // Now we only need to find the normal tags if len(opts.Tags) > 0 { query += ` AND id IN ( - SELECT bookmark_id FROM bookmark_tag - WHERE tag_id IN (SELECT id FROM tag WHERE name IN (?)))` + SELECT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?) + GROUP BY bt.bookmark_id + HAVING COUNT(bt.bookmark_id) = ?)` - args = append(args, opts.Tags) + args = append(args, opts.Tags, len(opts.Tags)) + } + + if len(opts.ExcludedTags) > 0 { + query += ` AND id NOT IN ( + SELECT DISTINCT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?))` + + args = append(args, opts.ExcludedTags) } // Expand query, because some of the args might be an array diff --git a/internal/database/sqlite.go b/internal/database/sqlite.go index 4e933eb..198472b 100644 --- a/internal/database/sqlite.go +++ b/internal/database/sqlite.go @@ -224,11 +224,13 @@ func (db *SQLiteDatabase) GetBookmarks(opts GetBookmarksOptions) ([]model.Bookma // Add where clause args := []interface{}{} + // Add where clause for IDs if len(opts.IDs) > 0 { query += ` AND b.id IN (?)` args = append(args, opts.IDs) } + // Add where clause for search keyword if opts.Keyword != "" { query += ` AND (b.url LIKE ? OR b.excerpt LIKE ? OR b.id IN ( SELECT docid id @@ -242,12 +244,56 @@ func (db *SQLiteDatabase) GetBookmarks(opts GetBookmarksOptions) ([]model.Bookma opts.Keyword) } + // Add where clause for tags. + // First we check for * in excluded and included tags, + // which means all tags will be excluded and included, respectively. + excludeAllTags := false + for _, excludedTag := range opts.ExcludedTags { + if excludedTag == "*" { + excludeAllTags = true + opts.ExcludedTags = []string{} + break + } + } + + includeAllTags := false + for _, includedTag := range opts.Tags { + if includedTag == "*" { + includeAllTags = true + opts.Tags = []string{} + break + } + } + + // If all tags excluded, we will only show bookmark without tags. + // In other hand, if all tags included, we will only show bookmark with tags. + if excludeAllTags { + query += ` AND b.id NOT IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } else if includeAllTags { + query += ` AND b.id IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } + + // Now we only need to find the normal tags if len(opts.Tags) > 0 { query += ` AND b.id IN ( - SELECT bookmark_id FROM bookmark_tag - WHERE tag_id IN (SELECT id FROM tag WHERE name IN (?)))` + SELECT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?) + GROUP BY bt.bookmark_id + HAVING COUNT(bt.bookmark_id) = ?)` - args = append(args, opts.Tags) + args = append(args, opts.Tags, len(opts.Tags)) + } + + if len(opts.ExcludedTags) > 0 { + query += ` AND b.id NOT IN ( + SELECT DISTINCT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?))` + + args = append(args, opts.ExcludedTags) } // Add order clause @@ -313,11 +359,13 @@ func (db *SQLiteDatabase) GetBookmarksCount(opts GetBookmarksOptions) (int, erro // Add where clause args := []interface{}{} + // Add where clause for IDs if len(opts.IDs) > 0 { query += ` AND b.id IN (?)` args = append(args, opts.IDs) } + // Add where clause for search keyword if opts.Keyword != "" { query += ` AND (b.url LIKE ? OR b.excerpt LIKE ? OR b.id IN ( SELECT docid id @@ -331,12 +379,56 @@ func (db *SQLiteDatabase) GetBookmarksCount(opts GetBookmarksOptions) (int, erro opts.Keyword) } + // Add where clause for tags. + // First we check for * in excluded and included tags, + // which means all tags will be excluded and included, respectively. + excludeAllTags := false + for _, excludedTag := range opts.ExcludedTags { + if excludedTag == "*" { + excludeAllTags = true + opts.ExcludedTags = []string{} + break + } + } + + includeAllTags := false + for _, includedTag := range opts.Tags { + if includedTag == "*" { + includeAllTags = true + opts.Tags = []string{} + break + } + } + + // If all tags excluded, we will only show bookmark without tags. + // In other hand, if all tags included, we will only show bookmark with tags. + if excludeAllTags { + query += ` AND b.id NOT IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } else if includeAllTags { + query += ` AND b.id IN (SELECT DISTINCT bookmark_id FROM bookmark_tag)` + } + + // Now we only need to find the normal tags if len(opts.Tags) > 0 { query += ` AND b.id IN ( - SELECT bookmark_id FROM bookmark_tag - WHERE tag_id IN (SELECT id FROM tag WHERE name IN (?)))` + SELECT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?) + GROUP BY bt.bookmark_id + HAVING COUNT(bt.bookmark_id) = ?)` - args = append(args, opts.Tags) + args = append(args, opts.Tags, len(opts.Tags)) + } + + if len(opts.ExcludedTags) > 0 { + query += ` AND b.id NOT IN ( + SELECT DISTINCT bt.bookmark_id + FROM bookmark_tag bt + LEFT JOIN tag t ON bt.tag_id = t.id + WHERE t.name IN(?))` + + args = append(args, opts.ExcludedTags) } // Expand query, because some of the args might be an array diff --git a/internal/view/js/component/bookmark.js b/internal/view/js/component/bookmark.js index 0a653d9..1748f20 100644 --- a/internal/view/js/component/bookmark.js +++ b/internal/view/js/component/bookmark.js @@ -11,7 +11,7 @@ var template = `

{{id}}

- {{tag.name}} + {{tag.name}}
@@ -78,8 +78,8 @@ export default { } }, methods: { - tagClicked(name) { - this.$emit("tag-clicked", name); + tagClicked(name, event) { + this.$emit("tag-clicked", name, event); }, selectBookmark() { this.$emit("select", this.eventItem); diff --git a/internal/view/js/page/home.js b/internal/view/js/page/home.js index a78ea73..9332244 100644 --- a/internal/view/js/page/home.js +++ b/internal/view/js/page/home.js @@ -8,7 +8,7 @@ var template = ` - + @@ -46,6 +46,7 @@ var template = ` :imageURL="book.imageURL" :hasContent="book.hasContent" :hasArchive="book.hasArchive" + :tags="book.tags" :index="index" :key="book.id" :editMode="editMode" @@ -53,7 +54,7 @@ var template = ` :listMode="displayOptions.listMode" :selected="isSelected(book.id)" @select="toggleSelection" - @tag-clicked="filterTag" + @tag-clicked="bookmarkTagClicked" @edit="showDialogEdit" @delete="showDialogDelete" @update="showDialogUpdateCache"> @@ -68,8 +69,10 @@ var template = `

No saved bookmarks yet :(

-
- {{tag.name}}{{tag.nBookmarks}} + (all tagged) + (all untagged) + + #{{tag.name}}{{tag.nBookmarks}} @@ -156,33 +159,46 @@ export default { fetchTags = (typeof fetchTags === "boolean") ? fetchTags : false; // Parse search query - var rxTagA = /['"]#([^'"]+)['"]/g, // "#tag with space" - rxTagB = /(^|\s+)#(\S+)/g, // #tag-without-space - keyword = this.search, + var keyword = this.search, + rxExcludeTagA = /(^|\s)-tag:["']([^"']+)["']/i, // -tag:"with space" + rxExcludeTagB = /(^|\s)-tag:(\S+)/i, // -tag:without-space + rxIncludeTagA = /(^|\s)tag:["']([^"']+)["']/i, // tag:"with space" + rxIncludeTagB = /(^|\s)tag:(\S+)/i, // tag:without-space tags = [], + excludedTags = [], rxResult; - // Fetch tag A first - while (rxResult = rxTagA.exec(keyword)) { - tags.push(rxResult[1]); + // Get excluded tag first, while also removing it from keyword + while (rxResult = rxExcludeTagA.exec(keyword)) { + keyword = keyword.replace(rxResult[0], ""); + excludedTags.push(rxResult[2]); } - // Clear tag A from keyword - keyword = keyword.replace(rxTagA, ""); + while (rxResult = rxExcludeTagB.exec(keyword)) { + keyword = keyword.replace(rxResult[0], ""); + excludedTags.push(rxResult[2]); + } - // Fetch tag B - while (rxResult = rxTagB.exec(keyword)) { + // Get included tags + while (rxResult = rxIncludeTagA.exec(keyword)) { + keyword = keyword.replace(rxResult[0], ""); tags.push(rxResult[2]); } - // Clear tag B from keyword, then trim keyword - keyword = keyword.replace(rxTagB, "").trim().replace(/\s+/g, " "); + while (rxResult = rxIncludeTagB.exec(keyword)) { + keyword = keyword.replace(rxResult[0], ""); + tags.push(rxResult[2]); + } + + // Trim keyword + keyword = keyword.trim().replace(/\s+/g, " "); // Prepare URL for API var url = new URL("/api/bookmarks", document.URL); url.search = new URLSearchParams({ keyword: keyword, tags: tags.join(","), + exclude: excludedTags.join(","), page: this.page }); @@ -268,23 +284,59 @@ export default { isSelected(bookId) { return this.selection.findIndex(el => el.id === bookId) > -1; }, - tagClicked(idx, tag) { + dialogTagClicked(event, idx, tag) { if (!this.dialogTags.editMode) { - this.filterTag(tag.name); + this.filterTag(tag.name, event.altKey); } else { this.dialogTags.visible = false; this.showDialogRenameTag(idx, tag); } }, - filterTag(tagName) { - var rxSpace = /\s+/g, - newTag = rxSpace.test(tagName) ? `"#${tagName}"` : `#${tagName}`; + bookmarkTagClicked(event, tagName) { + this.filterTag(tagName, event.altKey); + }, + filterTag(tagName, excludeMode) { + // Set default parameter + excludeMode = (typeof excludeMode === "boolean") ? excludeMode : false; - if (!this.search.includes(newTag)) { - this.search += ` ${newTag}`; - this.search = this.search.trim(); + if (tagName === "*") { + this.search = excludeMode ? "-tag:*" : "tag:*"; this.loadData(); + return; } + + var rxSpace = /\s+/g, + includeTag = rxSpace.test(tagName) ? `tag:"${tagName}"` : `tag:${tagName}`, + excludeTag = "-" + includeTag, + rxIncludeTag = new RegExp(`(^|\\s)${includeTag}`, "ig"), + rxExcludeTag = new RegExp(`(^|\\s)${excludeTag}`, "ig"), + search = this.search; + + if (excludeMode) { + if (rxExcludeTag.test(search)) { + return; + } + + if (rxIncludeTag.test(search)) { + this.search = search.replace(rxIncludeTag, "$1" + excludeTag); + } else { + search += ` ${excludeTag}`; + this.search = search.trim(); + } + } else { + if (rxIncludeTag.test(search)) { + return; + } + + if (rxExcludeTag.test(search)) { + this.search = search.replace(rxExcludeTag, "$1" + includeTag); + } else { + search += ` ${includeTag}`; + this.search = search.trim(); + } + } + + this.loadData(); }, showDialogAdd() { this.showDialog({ diff --git a/internal/webserver/assets-prod.go b/internal/webserver/assets-prod.go index 34f616f..e2cec90 100644 --- a/internal/webserver/assets-prod.go +++ b/internal/webserver/assets-prod.go @@ -232,10 +232,10 @@ var assets = func() http.FileSystem { }, "/js/component/bookmark.js": &vfsgen۰CompressedFileInfo{ name: "bookmark.js", - modTime: time.Date(2019, 8, 8, 11, 48, 9, 113313145, time.UTC), - uncompressedSize: 2919, + modTime: time.Date(2019, 8, 11, 8, 52, 53, 484947311, time.UTC), + uncompressedSize: 2941, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x56\x4d\x8f\xa3\x38\x10\xbd\xe7\x57\xd4\x5a\x73\x48\x24\x12\x76\xaf\x4c\x88\x76\x66\x76\x0f\x2d\xcd\xee\x61\x46\x7d\xda\xaf\x38\xb8\x12\xac\x36\x36\x32\x26\xe9\x56\xc4\x7f\x5f\xd9\xd8\x7c\x04\xba\x27\xcd\x81\x18\xd7\xab\x57\x8f\x2a\x17\x95\x33\xd5\x60\xb0\x28\x05\x35\x08\x29\xec\x17\x5b\xc6\xcf\x90\x09\x5a\x55\x29\x39\x28\xf5\x54\x50\xfd\x44\x20\xf1\x3b\x57\xc1\x2b\x93\x80\xbd\xff\xa1\x18\x46\x50\xa1\xc0\xcc\x20\x4b\xba\x55\x04\x65\x7d\x10\x3c\x4b\xfc\x2f\xec\x52\xf8\xa5\x21\xbb\x05\x00\xc0\x96\xde\x72\xaf\x5b\x3f\xa5\x09\x38\x84\xbd\xce\x6b\x7e\x4c\x09\x32\xee\x82\x0c\x0c\xbf\x66\x82\x67\x4f\x29\x69\x7d\x3e\x07\x79\x9e\x3b\xa6\xaf\x06\x11\x5c\xda\xb7\xc8\x35\x1e\x53\x52\x50\x2e\x1f\xbf\x7d\x25\x60\xa8\x3e\xa1\x49\xc9\x7f\x07\x41\xad\x5d\xa3\x48\x89\x54\xaa\x44\x89\xda\xb3\x3a\xc2\xaa\xa4\x32\x70\x9a\xbc\x2e\x0e\x92\x72\x41\xbc\x4e\x5e\xd0\x13\x3a\xbe\xa4\x32\x2f\x02\x07\x90\xef\xf6\xd9\x9a\x76\xdb\xd8\x72\x0c\x28\xcb\x8e\x8f\x1b\x81\x64\x77\xbd\xba\x45\xd3\x6c\xe3\x72\x0e\x86\xcf\x19\xea\xd2\x84\xa0\x3f\x75\x51\x77\xd7\xab\xb7\xbd\xea\xcb\x99\x75\xab\x72\x75\x49\x89\xbd\x3f\x30\xeb\xc5\xd9\xc0\xa1\x4f\xde\x4c\xfd\xd7\x86\x9e\xaa\x10\xd9\xae\x37\x02\xe5\xc9\xe4\xb0\x83\x9f\x87\x69\xa2\x70\x5e\x1f\x95\x76\x18\xe0\x12\x5a\xb7\x50\x34\x43\x4f\x5f\xec\x0a\xd9\xd2\xd0\xd3\x46\xd2\x02\x57\xee\xbd\xfd\x83\x55\x13\x44\xc4\x8c\x9f\xa7\x7a\xaa\x92\x66\xb6\x30\xaf\x98\x3b\xb9\x05\xca\x7a\xac\xcb\x23\x6a\x2d\xba\x53\xe0\xd6\xf7\x9e\x00\x7b\x5d\xaf\xb9\xaa\x8c\x55\xfa\xf8\xed\x6b\xd3\xf4\xf4\x41\xb5\x7b\xe8\x9a\xc9\xd7\xa9\x3b\xc5\x63\xb2\x2d\x05\x57\xef\x94\xfc\xce\xb8\x81\xbe\xd3\x42\xb6\xac\xdf\xcd\x01\x1f\xf9\xf3\xf0\x4e\x47\x5a\xc1\x91\xae\x8f\x17\x7b\x2f\x51\x66\x5c\xac\xa9\x30\x36\x4b\xfc\x26\xe6\x50\xe8\x58\xc4\x6f\x28\xd0\xe0\x8c\x0c\xe6\x0c\xef\x17\x62\x34\xad\xf2\xf7\xeb\x78\x2c\x99\xcd\x1d\xd5\x59\xce\xcf\xd8\xcb\xa8\xdd\xfe\xfb\x65\x64\x42\xd5\x6c\xcd\xd4\x45\x0a\x45\xd9\x3d\x7a\xb6\x71\xa8\xe0\xe8\x28\xb6\x3f\xfb\x8f\x8b\x05\x3e\x97\x4a\x1b\x60\x78\xa4\xb5\x30\x70\x75\xa8\xe0\x93\x74\xab\xc8\xed\x97\x5a\x95\x55\xe2\x41\xf6\xe2\x2c\x81\x3f\xeb\xe2\x80\x3a\xea\xf6\x6a\x2d\x12\xf8\x6e\x34\x97\xa7\x7e\xd3\x25\x64\xba\xed\x5b\x7d\x6a\x08\x1f\xdd\x5b\xf2\xf0\x9d\x98\x7a\xe4\xb4\xfa\xa2\xa4\x41\x69\x12\xf8\xac\x94\x40\x2a\x47\xc6\x4f\x6d\x11\x66\x8c\x5c\x32\x7c\x9e\x86\x6a\x3f\x2d\x33\xf8\xd0\x03\x33\xa6\x30\x49\x66\x4c\xfd\x68\x99\x98\xec\x87\x65\x98\x55\xb7\xf7\x52\x62\x02\x9f\xb4\xa6\x2f\xd1\xc8\x10\x2a\xb5\x5c\xdd\x78\xd8\x4b\xa3\xa9\xb5\x84\xbf\xfe\x19\x59\xfa\xe6\x6e\x57\x4d\xcb\x98\xa9\xa2\xac\x9d\xa2\x9e\xc8\x0f\x93\x09\x39\x3f\xc2\xd2\xe4\xbc\xda\xf4\x69\x5e\x85\x68\xfb\x38\x34\x5a\xfc\xe1\xea\x40\x9c\x35\x71\xd6\xa2\xf6\x1f\x47\x3c\x28\x2a\x1c\x91\xf9\xb2\xfc\x80\xcc\x77\xd0\x1c\x99\xf7\x73\xd0\x5a\x8b\x1e\xd1\x0c\xca\xdf\x7f\xe9\x26\x6f\x66\xff\x32\xd4\x5a\x40\x0a\x12\x2f\x60\x11\x81\x6a\x35\x8e\xe6\x03\xd5\x5a\x6c\x02\xdf\x46\x63\x29\x68\x86\xcb\xf8\xdf\xcb\xe5\xf2\xf7\x26\x8e\x80\x90\xd5\xac\x84\xc9\x10\x9d\x08\xf1\xfc\xd3\xa2\x1e\x68\xf6\x74\xd2\xaa\x96\xec\xc1\x9e\xfe\x04\xf6\xb5\x16\x4b\x12\xd2\xe3\x3b\xa2\x21\xab\xfd\x6b\x55\x1f\x9c\xdd\x33\x4a\xf3\x60\xb0\xb8\x3f\xbc\xed\x71\x5f\x88\x68\x6a\x6c\x7b\xa7\xb5\xdb\x75\x74\xcf\xc9\x2b\xd0\xe4\x8a\x8d\xce\xfc\x60\x9c\xba\x51\x7a\xdb\x0e\x36\xc0\x07\x2c\xb8\x59\xda\xc9\xbb\xce\x5a\x2c\x89\xc0\xa1\x67\x53\x3e\xfe\x5b\x35\x79\xe1\x21\x65\x0b\x25\x51\xbb\xd9\x25\x69\x9e\x77\x38\xcb\xde\x64\xb5\xc0\x3b\x39\xc7\x83\xe9\x4d\xd6\x16\x7a\x27\xef\x78\xd2\xbc\xc9\xdb\x42\xdf\xe4\x6d\x6b\xb8\x68\xfe\x0f\x00\x00\xff\xff\xdf\xe3\xca\xde\x67\x0b\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x56\x4d\x8f\xe2\x38\x13\xbe\xf3\x2b\xea\xb5\xfa\x00\x52\x20\xef\x5e\x33\x04\xed\xcc\xec\x1e\x5a\x9a\xdd\xc3\x8c\xfa\xb4\x5f\x98\xb8\x20\x56\x3b\x76\xe4\x38\xd0\x2d\x94\xff\xbe\xb2\x63\xe7\x83\xa4\x7b\xe9\x1c\x82\xe3\xaa\x7a\xea\x71\x7d\xb8\x38\x53\x0d\x06\x8b\x52\x50\x83\x90\xc2\x7e\xb1\x65\xfc\x0c\x99\xa0\x55\x95\x92\x83\x52\xcf\x05\xd5\xcf\x04\x12\xbf\x73\x15\xbc\x32\x09\xd8\xf7\x6f\x8a\x61\x04\x15\x0a\xcc\x0c\xb2\xa4\x5b\x45\x50\xd6\x07\xc1\xb3\xc4\xff\xc2\x2e\x85\x9f\x1a\xb2\x5b\x00\x00\x6c\xe9\x2d\xf6\xba\xb5\x53\x9a\x80\xd3\xb0\xcf\x79\xcd\x8f\x29\x41\xc6\x9d\x93\x81\xe0\xe7\x4c\xf0\xec\x39\x25\xad\xcd\x97\x40\xcf\x63\xc7\xf4\x4d\x27\x82\x4b\x7b\x8a\x5c\xe3\x31\x25\x05\xe5\xf2\xe9\xfb\x37\x02\x86\xea\x13\x9a\x94\xfc\x73\x10\xd4\xca\x35\x8a\x94\x48\xa5\x4a\x94\xa8\x3d\xaa\x03\xac\x4a\x2a\x03\xa6\xc9\xeb\xe2\x20\x29\x17\xc4\xf3\xe4\x05\x3d\xa1\xc3\x4b\x2a\xf3\x2a\x70\xa0\xf2\xc3\x7e\x5b\xd1\x6e\x1b\x5b\x8c\x01\x64\xd9\xe1\x71\x23\x90\xec\xae\x57\xb7\x68\x9a\x6d\x5c\xce\xa9\xe1\x4b\x86\xba\x34\xc1\xe9\xff\x3a\xaf\xbb\xeb\xd5\xcb\xde\xb4\xe5\xcc\x9a\x55\xb9\xba\xa4\xc4\xbe\x1f\x99\xb5\xe2\x6c\x60\xd0\x07\x6f\x26\xff\x6b\x43\x4f\x55\xf0\x6c\xd7\x1b\x81\xf2\x64\x72\xd8\xc1\xff\x87\x61\xa2\x70\x5e\x1f\x95\x76\x3a\xc0\x25\xb4\x66\x21\x69\x86\x9e\xbe\xda\x15\xb2\xe5\x03\x9e\x51\x9a\xc8\x2a\x6c\x24\x2d\x70\xe5\xce\xef\x3f\x2c\xab\x40\x26\x66\xfc\x3c\xe5\x55\x95\x34\xb3\x09\x7a\x43\xdc\xd1\x2e\x50\xd6\x63\x7e\x5e\xa3\xd6\xa2\xab\x06\xb7\xbe\xb7\x12\xec\x73\xbd\xe6\xaa\x32\x96\xe9\xd3\xf7\x6f\x4d\xd3\xc3\x07\xd6\xee\xa3\x6b\x2a\x9f\xaf\xae\x9a\xc7\x60\x5b\x0a\x2e\xef\x29\xf9\x95\x71\x03\x7d\xc7\x85\xa8\x59\xbb\x9b\x42\x1f\xd9\xf3\x70\xa6\x23\xad\xe0\x48\xd7\xc7\x8b\x7d\x97\x28\x33\x2e\xd6\x54\x18\x1b\x25\x7e\xe3\x73\x48\x74\x4c\xe2\x17\x14\x68\x70\x86\x06\x73\x82\x8f\x13\x31\x9a\x56\xf9\xc7\x79\x3c\x95\xcc\xc6\x8e\xea\x2c\xe7\x67\xec\x69\xd4\x6e\xff\xe3\x34\x32\xa1\x6a\xb6\x66\xea\x22\x85\xa2\xec\x1e\x3e\xdb\x38\x64\x70\x54\x8a\xed\xcf\xfe\xd3\x62\x81\x2f\xa5\xd2\x06\x18\x1e\x69\x2d\x0c\x5c\x9d\x56\xb0\x49\xba\x55\xe4\xf6\x4b\xad\xca\x2a\xf1\x4a\xf6\xe1\x2c\x81\xdf\xeb\xe2\x80\x3a\xea\xf6\x6a\x2d\x12\xf8\x61\x34\x97\xa7\x7e\xd3\x05\x64\xba\xed\x5b\x7e\x2a\x08\x97\xef\x2d\x78\xb8\x2f\xa6\x16\x39\xad\xbe\x2a\x69\x50\x9a\x04\xbe\x28\x25\x90\xca\x91\xf0\x73\x9b\x84\x19\x21\x97\x0c\x5f\xa6\xae\xda\x2b\x66\x46\x3f\xf4\xc0\x8c\x28\x4c\x94\x19\x51\x3f\x62\x26\x22\x7b\xc1\x0c\xa3\xea\xf6\x5e\x4b\x4c\xe0\xb3\xd6\xf4\x35\x1a\x09\x42\xa6\x96\xab\x1b\x0b\xfb\x68\x34\xb5\x96\xf0\xc7\x5f\x23\x49\xdf\xdc\xed\xaa\x69\x11\x33\x55\x94\xb5\x63\xd4\x03\xf9\xa1\x32\x01\xe7\x47\x58\x9a\x9c\x57\x9b\x3e\xcc\xab\xe0\x6d\x1f\x87\x46\x8b\x1f\xae\x4e\x89\xb3\x26\xce\x5a\xad\xfd\xa7\x11\x0e\x8a\x0a\x47\x60\x3e\x2d\xff\x01\xe6\x3b\x68\x0e\xcc\xdb\x39\xd5\x5a\x8b\x5e\xa3\x19\xa4\xbf\xbf\xe9\x26\x27\xb3\x7f\x1d\x6a\x2d\x20\x05\x89\x17\xb0\x1a\x01\x6a\x35\xf6\xe6\x1d\xd5\x5a\x6c\x02\xde\x46\x63\x29\x68\x86\xcb\xf8\xef\xcb\xe5\xf2\xe7\x26\x8e\x80\x90\xd5\x2c\x85\xc9\x30\x9d\x10\xf1\xf8\xd3\xa4\x1e\x68\xf6\x7c\xd2\xaa\x96\xec\xd1\x56\x7f\x02\xfb\x5a\x8b\x25\x09\xe1\xf1\x1d\xd1\x90\xd5\xfe\xad\xac\x0f\x6a\xd7\x4e\xac\x47\x83\xc5\xfd\xee\x6d\x8f\xfb\x44\x44\x53\x61\xdb\x3b\xad\xdc\xae\xa3\x7b\x2a\xaf\x40\x93\x2b\x36\xaa\xf9\xc1\x58\xb5\x91\x8d\x5a\xa6\xb7\x24\x9d\x9f\x07\x2c\xb8\x59\xda\x41\xbc\xce\x5a\x13\x12\xc1\xd0\x68\x36\x01\xe3\x3f\x5b\x93\xe3\x0f\x91\x5b\x55\x12\xb5\x9b\x5d\xc8\xe6\x71\x87\x93\xed\x5d\x54\xab\x78\x27\xe6\x78\x4c\xbd\x8b\xda\xaa\xde\x89\x3b\x9e\x3b\xef\xe2\xb6\xaa\xef\xe2\xb6\x19\x5d\x34\xff\x06\x00\x00\xff\xff\x98\xda\x2f\x7a\x7d\x0b\x00\x00"), }, "/js/component/dialog.js": &vfsgen۰CompressedFileInfo{ name: "dialog.js", @@ -260,7 +260,7 @@ var assets = func() http.FileSystem { }, "/js/page": &vfsgen۰DirInfo{ name: "page", - modTime: time.Date(2019, 8, 3, 14, 33, 57, 906039330, time.UTC), + modTime: time.Date(2019, 8, 11, 8, 24, 54, 871598891, time.UTC), }, "/js/page/base.js": &vfsgen۰CompressedFileInfo{ name: "base.js", @@ -271,10 +271,10 @@ var assets = func() http.FileSystem { }, "/js/page/home.js": &vfsgen۰CompressedFileInfo{ name: "home.js", - modTime: time.Date(2019, 8, 10, 12, 46, 14, 693814706, time.UTC), - uncompressedSize: 30519, + modTime: time.Date(2019, 8, 11, 8, 53, 6, 204947425, time.UTC), + uncompressedSize: 32704, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5d\x77\xdb\xb6\x92\xef\xf9\x15\x13\x36\x27\xa6\x1a\x89\x8a\xef\xa3\x6a\x39\x75\xdc\xdc\x6e\xb6\x69\x9a\x1b\x3b\xbb\x67\x4f\x92\x1e\xc3\x24\x24\xa1\xa6\x48\x5e\x00\xb4\xac\xe3\xe8\xbf\xef\xc1\x17\x09\x92\x20\x45\x29\xb5\xfb\x71\xcd\x87\x84\x02\x66\x80\xc1\x70\x30\x98\x19\x0c\xe0\x6b\x44\x81\xe3\x65\x16\x23\x8e\x61\x0a\x17\x8f\x8e\x22\x72\x0d\x24\x9a\x7a\x19\x9a\xe3\xd1\x22\x5d\x62\xef\xf8\x11\x00\x80\xac\x08\x63\xc4\x98\xa9\xc3\x28\xc2\x54\xd7\x4a\x08\x92\x64\x39\x07\xbe\xce\xf0\xd4\xe3\xf8\x86\x7b\x90\xc5\x28\xc4\x8b\x34\x8e\x30\x9d\x7a\x67\x18\xd1\x70\x01\x39\x8d\x87\x70\x85\xd7\xab\x94\x46\x90\x52\xe0\x68\xce\x3c\xb8\x1e\x2d\xd3\x08\xc7\x01\xa7\x64\x39\xf5\x98\x04\xf5\xe0\xfb\x59\x1a\xe6\x6c\xea\x3d\xc1\xd7\x38\xe1\x01\x47\x74\x8e\x79\xc0\x70\x8c\x43\xee\x0f\x3c\xf8\xfe\x0a\xaf\xf3\x2c\xc0\x09\x17\x1d\x28\xac\x97\x69\x7a\xb5\x44\xf4\x8a\x79\x63\x8b\x36\x04\x9c\xf0\x18\x4f\xbd\xf7\x78\x46\x31\x5b\x00\xe3\x29\x45\x73\xec\xc1\xf7\x61\x4c\xc2\xab\xa9\x47\x71\x9c\xa2\xe8\x07\xc4\x91\x35\x26\x35\x2e\x33\xee\x19\x62\x30\x43\xa3\xd9\x4a\xfc\xcb\xd6\x49\x38\x42\x31\xf7\x60\xa2\xab\x05\x3e\x49\xe6\xf0\xf4\x29\x1c\x08\x80\x8c\x24\x07\xde\xf1\xd1\x98\x58\x74\x8c\x91\x8b\xa8\x93\x28\x82\x04\xaf\xe0\x52\xd3\x5e\x52\xc5\x16\xe9\xea\x07\x82\xe2\x74\x7e\x12\x45\xfd\x08\xcb\xe2\x9c\x8d\x42\x42\xc3\x18\xf7\xeb\xfd\x6c\x91\xae\xf4\x67\x68\x76\x7b\x2e\xca\x7b\xf5\x2b\x5b\xe8\xd5\xe1\x4b\xc4\xc3\x05\xe0\x88\xf0\xb2\x47\x9e\xce\xe7\x31\x7e\x15\x11\xfe\x73\x1a\xe1\x9e\x23\xc5\x49\x48\x62\xf9\x11\x5a\xfa\x3d\x1a\x47\xe4\xba\x5b\x80\xa5\xb4\x0b\x5a\x46\x97\xe9\x8d\x10\x44\x32\x53\xbf\x6b\x74\x1c\x65\xc7\xb7\xb7\x4a\xf4\x48\x9a\x04\x31\x4e\xe6\x7c\xb1\xd9\x00\xe1\x78\xc9\x40\x55\xe0\xe8\x68\x9c\xb9\x46\xfc\x03\x8e\x31\xc7\x9d\xdf\x57\x81\xf8\x45\x0f\x83\x9e\x5c\xa7\x88\x2d\xba\x58\xd0\x94\xb4\xb6\x4f\x7d\x12\x45\xe2\x6b\xef\x4e\x42\xef\x0f\xff\x21\x8b\x84\xa2\x11\xd3\x94\x5c\x63\x27\x11\x0a\xe4\x14\x85\x8b\xdd\x79\x11\xc6\x69\x1e\x8d\xa2\x74\x95\x88\xa9\xd8\x9f\x29\xa7\x28\x09\x71\xfc\x75\xb2\xc8\xc9\x12\xb7\x72\xa1\x2e\x86\x42\xe4\x8c\x2c\xb0\xd1\x9c\x92\xc8\x03\x8a\x67\x56\xe1\x8f\xb2\xcc\x68\x96\xdb\x98\x30\x3e\x81\x88\xb0\x2c\x46\xeb\x5f\x32\xc1\x13\x16\x88\x42\x41\xe0\xa6\x22\xa5\x68\x4e\x12\x24\x00\x84\x3c\x6b\x71\x5e\xa2\x9b\x77\x68\x8e\xe1\x18\x0e\x3d\xa8\x8c\x66\x22\xa6\x82\x9a\x10\xf5\x1a\x8d\x54\x60\xd7\xeb\xcd\x1c\xb1\x66\x4b\x05\xe0\xfb\x70\x81\x12\x81\xaf\xfe\x97\x4d\xd8\xbc\xa9\x52\x6a\xd5\x18\x26\x8c\xc4\xd4\x82\xeb\xd1\x2c\xa5\x53\xcf\x17\xa5\x43\x20\x49\x84\x6f\x06\x40\x92\x62\x2e\xb1\x3a\x5d\x86\xb9\x01\x89\xaa\x04\x4d\x72\x1a\xeb\xaa\x9c\xc6\xb5\x3a\x2d\x0a\xb2\x56\xbe\xd7\xea\xf1\x4d\x88\x69\xc6\x35\x84\xfe\x55\x83\xc9\xf2\xcb\x98\x84\x1a\x44\xfd\xa8\x41\x90\x25\x9a\xe3\x0f\xef\xdf\x18\x0a\xf5\xcf\x1a\xd4\x02\xb1\xd3\x34\xe1\x38\x31\xdd\x95\x05\x4d\xc8\x13\x35\x99\x4a\x48\x5d\x50\xef\x59\x30\x6e\xea\xc9\xff\x6a\x55\x57\x78\x5d\x72\x6c\xc7\x8f\x3c\x11\x33\xf7\x75\x34\xf5\x6a\xb2\xa9\x8a\x6b\xb0\x46\x60\x1b\xd0\xa6\xa2\xde\xb6\x56\xaa\x53\x8f\xb0\x33\xfd\xee\x6b\x42\x07\x35\x61\x53\xb0\x66\xee\x9e\x19\xcd\x51\x83\xe2\x68\x3e\x92\x93\x5c\x34\x3a\x23\x31\xc7\xf4\x1c\xcd\x6b\x40\x62\xa4\xb6\x4a\x12\x8a\xa0\x06\x12\x49\x65\xdd\x54\xdf\x35\xb0\x5c\x2a\xb3\x16\xf5\x56\x99\x0c\x15\x99\xff\xdb\x4c\x67\x5b\xef\x65\x46\x6d\xe2\x65\xc6\xd7\xa3\x25\x66\x4c\x52\xa1\x86\xf4\xd8\x32\x9e\x84\x34\xbc\x66\xaf\x04\x98\x77\xfc\x36\x05\x86\xae\x71\x54\xce\x77\x58\x63\x0e\x13\xbf\x58\x69\xed\x85\x5d\xb7\x32\x4a\xaf\x31\x8d\xd1\xda\xb4\xae\x8b\xbd\xe3\x36\x5b\x2e\x23\x89\xf9\x3f\x11\x46\xad\x50\xe3\x36\xf1\x61\xce\x78\xba\x1c\x45\xf2\x1b\x4a\xf5\xad\x5e\x47\xc6\x7a\xbd\x24\x49\x51\x58\x33\x99\x8e\x50\xa1\xc3\x38\x9a\x0f\x81\x44\x4a\x81\x55\x97\x61\x8e\xe6\xa7\x4a\x30\x7d\x12\xdd\x0c\x45\x6d\x7d\xd5\xbb\xbd\xe5\x68\x1e\x24\x68\x89\x37\x9b\x23\x96\xa1\xe4\x58\x97\x14\x26\xef\x66\x73\x34\x96\x15\xae\x25\xa8\x32\x06\xe7\xb8\xaa\xc3\x10\xf6\xb3\xe2\xc1\xc5\xa3\x47\x64\x99\xa5\x94\x43\xf9\x91\x5f\xa6\x37\x30\xa3\xe9\x12\xbc\x20\x18\x87\xe9\x32\x4b\x13\x9c\x70\x4b\x0a\x82\xdf\x98\xf7\x9d\xc1\x33\x1f\xef\xb5\xd0\xe8\x0e\x34\x53\x5f\x41\x52\xc4\xa9\x79\xe3\x42\x52\x64\x56\xfb\x41\x4c\x4a\xa6\x01\x1f\x8b\x02\x05\xf1\x08\xdf\x48\x90\x08\xcf\x50\x1e\x73\xb8\x95\x1c\x30\xce\xcf\xa4\x78\x1b\xca\xf2\x25\xb9\x21\x09\x9b\xc0\x47\xd3\xe2\x67\x55\x5e\xf4\xce\x26\xba\x05\xf1\xd8\xc3\x1b\x16\xa5\x15\x66\x95\xc5\xf6\xb0\x64\xe1\x46\xd5\x45\x88\x23\x7f\x60\xb5\x4a\x31\xcf\x69\x62\x15\x88\x47\x8b\xf2\x04\x66\x28\x66\x78\x58\xa9\x33\x13\xd7\x59\x59\x18\x53\x13\xf8\xf8\x79\xf8\xa8\x56\x27\x4c\xb2\x09\x78\x5e\x15\x47\xe8\x91\x09\x3c\xaf\x16\x6a\xfd\xd1\x28\x2f\x26\xa8\xea\xc0\xae\x12\xa2\xee\xe8\xb6\x9c\x2e\x93\xda\x28\xc5\x73\x4d\x18\xb9\x8c\xdd\x83\xd9\x3a\x5a\xd9\xab\x58\xc6\x27\x70\xf0\xea\x86\x30\x2e\x74\x8b\xe8\xe9\xa0\x09\xb7\x44\x24\x39\xc7\x37\x7c\x02\x07\xbf\xfc\xe4\xa8\x67\x38\x4c\x93\x48\x43\xbc\xc7\x62\x02\x76\x35\x25\xa7\xf1\x04\xfc\x01\x4c\x8f\x1d\xc3\x12\x0f\x99\x81\xcf\x17\x84\x05\x25\x07\x02\x33\x9c\x41\x0b\x8e\x1c\x51\x0b\x0e\x4c\x15\x0f\xbe\x73\x62\x6e\x00\xc7\x0c\xef\xd0\xac\xe6\xfc\x96\x56\x1b\xa5\x9b\x36\xd6\xf5\xe0\x48\xc7\xc8\x38\xcd\x1d\x24\x38\x3a\xc3\x2c\x7c\x47\x31\x63\x38\xda\xad\xaf\x5e\xc3\xdd\x9d\xf5\x55\x06\x59\xf4\x6e\xec\x59\x2f\x14\x4a\xce\x05\xc9\x25\xb1\xd6\x02\xe8\xd7\xc5\x41\x2b\x05\x49\x4e\x31\xe3\xb4\x37\x0a\x47\x53\x78\xfe\x9d\xbb\x9f\x95\xf0\xb9\xed\x4e\x3c\xc7\x60\x3c\xbf\x4d\x0a\x85\xc4\x76\x49\x68\x9d\x3d\x72\xee\xc1\x14\x3c\x6b\xbe\x78\x4d\x1e\xd5\xd1\xcc\x54\x14\x98\xda\x2b\xdb\x8e\x54\xce\x4f\x81\x56\x43\x68\x15\xfe\x56\x8a\x2b\xea\x62\x47\x9a\x7f\xf9\x69\x67\x7a\xdb\x19\xb4\x71\x7f\xc9\x25\xe6\x8b\x34\xaa\xa8\xcc\x32\x76\xd5\x90\x97\x42\xd5\xe8\x85\x63\xa0\x25\xa8\xda\x95\x84\x10\xda\x1e\xa6\x70\xe8\xa8\x52\x0b\x84\x83\xbd\x45\xd3\xb2\x73\x31\x55\x87\x72\xc2\x0e\x2c\x31\x2c\x25\xbf\x00\x14\x26\xdd\x19\x17\xab\x2d\xcc\x30\x0f\x17\x62\xf4\xfd\x29\xaf\x80\x8d\xc7\x70\x86\xcb\x65\x1d\xd1\x39\xab\xae\x6d\xa6\x2b\x98\x82\xcf\xd7\x19\x4e\x67\x76\xd9\x74\x0a\xc2\xf7\x89\x31\x4a\xbc\x01\xbc\xb0\xaa\x26\x0e\xcd\x53\x10\x6b\x35\x66\x95\xd5\x1b\x2b\xab\x26\x46\x4b\xd4\x69\x7f\x87\x28\xc3\x7a\x01\x86\x7f\xe7\x98\xae\x2b\x10\xd7\x88\x02\xbd\x39\x47\xf3\x13\x98\xc2\xf8\xe3\x81\xf7\xf9\x1b\xff\xe3\xaf\x07\xde\xe7\x67\x03\xf1\x63\x3c\x1f\x8a\x46\xbc\x6f\x38\x9a\xc3\x8a\xf0\x05\xb0\x0c\x85\x35\xcb\x5d\x4a\x88\x68\xe3\xa5\x68\xc3\xff\xf5\xcb\x27\xf6\x6c\xf0\x8d\xff\xe9\xec\xd9\x40\xe3\x0b\xf4\x91\x40\x4f\x73\x3e\x92\x2d\x34\x1a\x30\x11\xdb\xa9\x2d\x10\x8e\x35\x57\xf1\xa6\x6e\x00\x28\x12\xde\x63\x96\xc7\xbc\xc9\x83\x7f\x0a\x36\x09\x54\x38\x81\x19\xa1\x8c\x57\x00\x56\x0b\x12\x63\xf0\x0d\x3a\x4c\x35\x43\x02\x7c\x83\x43\x5f\xd3\x35\x70\x2a\x25\x31\xdb\xb2\x9c\x2d\x0a\xe4\x8f\x87\x9f\x07\xf5\x49\x56\xa7\xe6\x34\xc6\x88\x1a\x6a\x84\x19\xa9\xbb\x78\xe4\x66\x87\x7e\x0b\x28\x96\xd1\x6e\x5f\x11\x37\x04\xcf\x1b\x74\x8d\xf4\x65\x9f\x31\xbe\xdc\x6b\x8c\xff\xd8\x65\x8c\x2f\x2b\x63\x1c\x02\x5f\xe0\x04\x38\x25\x7b\x0d\xfb\xa5\x1c\xb6\x0c\xe2\xfb\x83\xa2\x6a\xfc\x89\x3d\x13\x82\xe6\x81\x8b\x25\xef\x28\xce\x10\xc5\xf0\xe1\xfd\x1b\x98\xa5\x14\x4e\xde\xbd\x6e\xcc\x80\x9c\xc6\x30\x95\x11\xf2\x0f\xef\xdf\xf8\xde\x18\x65\x64\x5c\xc6\x7f\x86\x10\xa5\x61\xbe\xc4\x09\x0f\x3e\xbc\x7f\x53\x1b\x7b\x4e\xe3\x52\x7b\xe9\x16\xd4\x4e\xc4\x3b\x44\xd1\x92\xf9\x4d\x96\xea\xa1\x4d\x0a\xa6\x38\x99\x3e\x51\xac\xff\x2d\x25\x89\xef\x0d\xbd\x41\x13\x4a\x59\xcf\x85\x6a\xad\x7e\x92\x56\xe1\x10\x6e\x80\xfa\x26\x2e\x4e\xb0\x2b\x92\xfd\xd3\x52\x42\xaf\x28\x4d\xa9\xef\x89\x62\xa5\x6d\xc4\xc2\x25\x3d\xcb\x7a\x07\xb6\x2a\x75\x5a\x55\x12\xdd\xcf\x69\x3c\x68\x8c\x24\x10\x52\xe1\x53\xcc\xb2\x34\x61\xb8\xdb\xae\x7d\x6c\xc0\x82\xf4\x6a\x00\x7c\x41\xd3\x15\x98\x22\xb7\x69\xa5\x4d\x9a\x02\xef\x37\x96\x26\xfe\xc0\x61\x50\xb5\x11\x26\x10\xda\x89\x32\x0b\x04\xe2\xa8\xdd\xb2\xd3\x6b\x9f\x68\x49\xbe\x77\x18\x81\x26\xfa\xa2\xa1\xf5\xcf\x0e\x84\x32\x72\xa1\x51\x8a\x82\xda\x27\xb2\x29\x46\xd7\x18\x98\x5c\x87\x50\x12\x81\x8a\xb9\xc8\x39\x42\x66\x90\x60\x1c\xe1\xa8\xf5\x0b\x14\x4b\x58\x97\x2b\x21\x84\x69\x41\x18\x4f\xe9\x1a\xa6\x1d\x70\xe2\x41\x21\x27\xd7\x58\x39\x7d\xd6\xc6\x60\x53\xe2\xed\xc7\xf8\x94\x9d\xcb\x85\xfd\x74\x4d\x17\xfb\xd9\xb4\x70\x0d\x4a\x65\xf1\xaf\x1c\x53\x82\xd5\x42\xe4\xfe\x30\x60\x1b\x18\x99\x0e\xa6\x0d\x2c\x5c\xa5\x53\x2f\x64\x3c\xed\xc9\x6d\x01\xb6\xb9\x70\x08\x66\xa3\x41\xad\x70\x1e\x0b\x7b\xc0\x73\xb4\xaa\xea\x4d\xbb\xea\x97\x6c\x79\xdb\xc0\x84\x05\xf6\x8d\x64\x7e\x27\x11\x56\x87\xda\x33\x38\x86\xe7\x5d\xd2\x00\x4a\x53\xc2\xb3\x29\x5c\xbc\x78\x72\x6b\xe1\x2b\xfd\xf6\xd4\x1b\x6c\x2e\xda\x07\xbe\x69\x27\x7c\x45\x92\x28\x5d\x05\x5a\xd4\xe4\xf8\xa5\x6c\xfa\xba\x64\x58\x91\x28\x41\x44\x0b\x83\x5b\xfa\xb0\x17\x55\x26\x06\x4f\xf1\xbf\x73\xcc\x78\xc7\xfc\x68\xb5\x38\xed\x47\x2b\x25\xa5\x14\xd5\x8a\x63\xd4\xaa\x93\xba\x5e\x3e\x76\xa9\x7e\x3b\x3c\x4d\x05\x2d\xd4\x66\x45\xd9\xf7\xf6\xc2\xff\x66\xea\x5b\x32\x4e\x9b\x95\x02\xb2\x43\xd1\x6e\x65\xaf\x8b\x84\x50\x38\xc6\x3e\xa6\x74\x0b\x09\x8d\xc6\x5b\x59\x28\xda\x12\x53\xbf\xf2\xf9\xba\x64\x0d\x53\x1a\x70\x7c\xc3\xfd\x81\x62\xc8\x92\xcd\xdb\x89\xa9\x10\xc5\x16\xe9\x4a\x9a\x00\x2a\x9c\x28\x30\x87\xb2\x39\xb1\x74\xe4\xac\x43\x57\x39\x58\x01\x2d\xf2\xe4\x74\xe5\x6a\xc9\x16\x0d\xbf\x73\x9b\x47\x59\x3a\xac\xce\xe6\xcb\x4d\x06\x5f\x34\xd2\xd5\x7a\x73\xb9\x96\xb5\x4f\x28\x9e\x59\x6b\xef\x8f\x94\x44\x01\x0b\x69\x1a\xc7\xe7\x69\x06\x95\x40\x49\x5f\xa2\xaa\xfb\xc2\xee\x21\x17\x61\x56\xc7\xe2\x23\x01\xac\xc0\xd1\xe3\x4a\x41\x47\x97\xc5\x76\x96\x4f\x38\x5e\xd6\xfb\x15\x6b\x03\x89\x6e\x4a\xd7\xcc\xe4\x28\xcc\x48\x12\xbd\x4e\x22\x7c\xe3\xe3\x58\x08\x14\x8e\x03\x12\x49\x2f\x55\x34\x13\x90\xa8\x26\x1f\x42\x78\x65\x43\xd3\x29\x8c\x0e\x07\xf5\xe6\xe4\xda\x25\x09\xa8\xa2\x49\xcd\x57\x83\x65\x59\x4c\x42\xac\xb6\x32\x0e\xdd\xdc\xac\xed\xe9\xbd\x8e\xba\x42\x5d\x7d\x06\x65\x5a\x39\x86\xd1\xa1\x9b\x99\x8e\x3d\x16\x47\xd0\xe1\xf1\x2e\xa1\x59\x09\x5b\xec\x24\xfa\x66\x87\xa6\xee\x81\xf5\x8d\x42\x6d\x8d\x45\x16\xd3\x5e\xcd\x78\x15\x3d\x12\x3d\x17\x23\x6a\x0d\x22\x95\x8c\xa8\xd0\xfb\x56\x90\xeb\x10\x29\x7a\x73\x96\xa1\x50\x90\xa2\x1d\xb8\x06\x2d\x09\x5e\x9d\xa3\xb9\x74\x56\x25\x68\xc0\x31\xe3\x65\x93\x2f\xe0\xc2\xfb\xe6\xc9\xad\xfe\xbd\xf1\x2e\x60\x02\x17\x56\xc1\x45\x4d\x87\x96\xbc\x57\xca\x25\x20\x49\x18\xe7\x11\x66\xbe\xea\xc8\xed\xff\x5a\xf6\x96\xb0\x5e\xe0\xc9\xad\x82\x76\xd9\x2b\xd5\x58\x96\xdd\x95\x72\x59\x5b\x30\x5c\x6a\xa1\x95\xb7\x95\x7c\x9a\x16\x1d\x51\x80\x38\xbc\x4f\xbd\x6b\xe1\xbd\xc5\x2b\x30\xea\xd5\x61\x6a\x87\x2a\x1f\x60\x02\xde\x29\xc5\xd2\x4d\xa8\x66\x90\x35\x31\x66\x04\xc7\x11\x9b\xc0\x47\xf7\xba\x22\xe4\x68\x02\x5e\x4e\xe3\x16\xc3\x3e\x46\x97\x38\x9e\x80\xf7\x81\xc6\x43\xe1\x9a\x50\xae\x22\x4e\x0b\xce\xb3\xc9\x78\x1c\x04\x81\x03\x71\x33\x6c\x59\xc6\x74\x77\x2a\xd5\xa2\xbb\xc3\x53\xb9\x61\xa6\x18\x03\x7e\x2a\x73\x06\x50\x3c\x68\x9a\xc0\xdb\x3a\x33\x59\x1b\xbd\xba\xd3\xc0\x76\x87\x6e\x3c\xbe\xce\x44\xe3\x88\x62\xb4\x3b\x49\xd2\xa6\xdc\x42\x4f\xba\x5c\x22\x60\x38\x43\x14\x71\xac\xd2\xb7\xb6\x53\xa5\xe1\x53\x3a\x01\x6f\xd8\x02\x13\x11\xa9\x52\x11\x5d\x4f\x4a\x33\x2b\x58\xa2\x4c\xcc\x61\xa1\x5b\x0b\x6d\xb6\xf3\xb8\x42\x29\x94\x26\x15\x65\xcb\x00\xb5\x00\x77\x02\x6b\x2e\x87\x0b\x1c\xba\x84\x1b\xa4\xd2\x8a\x73\xe3\x41\xd6\x12\x4c\x72\x66\x68\xd9\x5d\x44\x97\xe8\x0a\xbf\x53\xc9\x3c\xdd\xe3\xf8\x19\x5d\x15\xa3\x00\x95\xfe\x13\xaf\x01\x5d\x23\x12\xa3\xcb\x56\x29\xff\xba\x81\x95\xc4\x39\x06\xe6\x08\xc2\x96\x7b\x9d\xde\x2f\x3f\x39\xba\xb3\xf7\x3a\xcd\x0e\x4c\xf7\x36\x67\x84\x38\xea\xd8\x6c\x1b\x8f\x41\xf2\x85\xe5\x3a\xc6\x47\x18\x24\x29\x07\x99\x05\xd2\x6a\x42\x8b\x46\x83\x9c\xc6\x5a\x2f\xab\xc8\xba\xb7\x75\x6b\xb4\x6e\x0e\x7b\xa2\xc3\x65\xce\x78\xd9\x65\x9b\x03\x07\x85\xc1\xb1\xab\xfb\x69\x02\x98\x62\xf2\xb4\x7c\x3e\x6a\xe2\xe2\x72\x5c\xad\x80\x20\x5d\xa2\xf4\x4d\xba\xc2\xf4\x14\x31\xec\xbb\x6d\x74\x09\xe6\x0a\xae\xb6\x43\x0b\x73\x8c\x0b\xd8\x6f\x87\x9f\xd8\xb7\xe3\x79\x07\xa8\xb2\x0d\x6c\x0d\xa0\xbf\x81\x8e\x66\xb4\x63\x5a\x8a\xa3\xdb\x75\x71\x26\x36\xb8\x1e\x35\x03\x4b\x1a\x3a\x11\x36\x5d\xce\x4e\x47\xa4\x0d\x27\x51\x7b\x70\x50\x7c\x3b\x19\x91\xed\x8a\x91\xe5\x34\x9e\x40\x4d\x64\xdb\x63\x5d\x7a\x81\x57\xa2\x20\xde\xb7\x62\xe8\xa5\x48\xe3\xe8\x5f\x5b\xb1\x94\x06\xd2\x48\xa5\x9e\x80\x17\x70\x08\x8d\xe4\x8d\x0a\x81\x45\x74\xbb\x1d\xa6\xa2\xdf\x75\x1f\x95\x32\x37\x6a\x5b\xec\xce\x32\x83\x3b\x63\xd4\xe6\xb1\xc3\x32\xf6\x46\x40\xb7\x48\xa9\x9d\xd3\x09\x78\x59\xca\xda\xac\x00\xf3\x5c\xa6\xd1\x7a\x02\xff\x7d\xf6\xcb\xdb\x80\x71\x4a\x92\x39\x99\xad\x95\xae\xeb\xc6\x53\x59\xe5\xce\x84\x96\xfa\xe3\xe9\x9c\xce\xd1\xf9\x3a\xc3\x9e\x30\x21\x32\xe1\x35\xc9\x8c\xa1\xf1\x6f\x2c\x4d\xb6\x90\xe8\x48\x81\x28\xaa\x3a\xa6\x69\xcf\x60\x90\x79\xf6\x0b\x0a\x99\xa7\x6f\x70\xa8\x37\xe1\xdd\xc1\x22\xf3\xb8\xe5\x69\x4b\xd0\xad\x8e\xd8\x2b\x2f\xa4\x82\x58\x26\x64\x68\xff\xf7\xf9\x10\x9e\x0f\x65\xd8\x6a\xcf\x31\xf7\x88\x4e\x7d\xf5\x98\xf7\x0a\x3f\xc1\xd7\x87\xa0\xb6\x8c\x7d\xe3\x8a\x21\x3e\x6a\x83\x70\x7a\x60\xaf\x22\xc2\x9d\x21\x93\xf1\x18\x4e\x85\xc1\x05\x7c\x81\x65\x30\xa4\xe1\x88\xea\xcd\x7d\x99\x82\x2e\x57\xbe\xf4\xf2\x37\x1c\x72\xaf\x25\x0b\x41\xc5\x60\xac\xac\x00\x1d\x61\x51\x96\x4b\x92\x2f\x2f\x31\x95\x29\x01\xa6\xdc\xa9\x81\x65\x76\x76\xa3\x11\x55\xe8\x6c\x47\x56\x4d\x64\xbc\xc3\x11\xc9\x81\x23\x38\x84\x2f\x5f\x74\xb3\x47\xf0\xbc\x3d\x85\xe2\x47\xcc\x25\x2f\xb0\x49\x7e\x31\xa2\xac\x8c\xcf\xc6\x58\x45\x35\x4c\x95\x7e\xcc\x10\x65\xd8\xaf\xa9\xca\xea\x7c\xf8\x28\x49\xf8\x3c\x70\x28\x4f\xc6\xa9\xde\xcb\x54\xb9\xf7\x6d\x2e\x88\xd9\x69\x6d\x6e\x22\xf7\xf7\xa9\x85\x3c\xf4\x73\xaa\x25\xa4\x60\x88\x19\xc2\x01\x93\x8b\x9c\xcb\x64\x5e\xa4\xab\x37\xca\x05\x90\xf9\x2f\x77\xe9\x78\x77\x3b\x08\xe6\x68\xc3\xdd\xb8\xe1\xe7\x1d\x30\x36\x01\xb2\xad\xdd\x49\xe8\xe7\x9c\xbf\xea\x84\xb2\x5d\xf1\xed\x84\xea\x1e\xf7\xe0\xd6\x76\xa7\xfd\xbc\x1d\x44\x93\xa0\xe5\xfe\x4f\xe9\xbd\xff\x69\x5c\x5e\xeb\x24\x0d\x1c\x4f\xe1\xf0\xcf\xeb\xe4\xfe\x0f\x8a\x89\x3c\xdc\x26\x4f\xc1\x76\x3b\xb6\xb6\xd5\x5f\xb8\xb6\x4e\xcd\x6c\x75\xf0\xe0\x66\x6a\xcc\xbf\xaa\x9b\xc9\x65\x80\xb6\xd5\xd3\x34\xca\xdb\x7c\xbe\xd2\x95\x74\x77\x58\xea\xda\xe2\x83\x5b\x62\xd5\x81\x63\x02\x9b\x53\x97\x3b\xd9\x81\xa7\xa7\xe1\xb4\xcd\xa1\xec\x22\x53\x89\x25\x97\xdb\xd8\xfb\x39\xe2\xf7\xed\x21\xe6\x7b\x39\x88\xa2\xa7\x07\x07\xf1\xc1\x41\x6c\x43\x6c\x38\x88\xd2\x2e\x1e\xc2\xe1\x83\x93\xd8\xf1\xdc\xad\x93\xa8\x0f\xde\xcb\x73\xfc\xad\x7e\x22\x4a\x22\xbd\x6b\xaa\x0e\xfc\x77\xf9\x8b\xac\xc5\x61\xac\xa3\x3c\x3e\xa1\x14\xad\x03\xc2\xe4\xff\x9a\x80\x81\x6e\x62\x0a\x1f\xe5\xcb\xe7\xba\x67\xa7\x6b\xe5\xff\x66\x15\x95\x5e\xaa\xf3\x6b\xfc\x3e\x7e\x29\xfc\x9e\xbe\x29\x94\xb3\x9e\x44\x70\x0c\xcf\xe1\xe9\x53\xdd\x7a\x75\xe7\x1e\x5c\x4b\xaa\xf4\x6c\xe5\xd8\x75\x66\x9b\xe8\xbc\xc3\xb1\x3d\x13\x26\x09\x90\x88\xc9\x4f\x48\x92\x88\x84\x98\x39\x5c\xf7\x92\xa7\xc2\xbe\x30\x0c\x35\x79\x12\x4e\x57\x5d\xb4\xd4\x81\x25\x4f\xaa\x07\x2c\xa5\xdc\xf7\xd1\x10\x2e\xa5\xfd\x78\x09\x23\x40\x8e\xdc\x5f\xbd\x07\xa6\xd6\x73\x99\xf1\xa9\x54\x7f\x83\xd2\xe2\x98\x8a\xbe\x52\xa2\xbc\xee\xa4\xd5\x9d\xb5\xa0\x85\x47\x6b\x4e\x55\x5b\x27\x6a\x5f\xc0\xf9\x82\x30\x99\xe7\x99\x26\x40\x18\x10\x4a\xf1\x35\xa6\x52\xbd\x05\x5e\x9f\x4f\x70\xe8\xdc\x9c\x6f\x21\xd6\x71\x48\xc6\xa2\xf5\x84\x62\x58\xa7\xb9\xda\x32\xda\x4a\x5a\x45\x5a\x9a\x9f\x7f\x91\xae\xf4\x39\xc3\xfd\x62\x06\x2d\xde\x6c\x11\x29\xd0\x2f\x9d\x4e\xc8\xff\x61\xd7\xd7\xa9\x78\x21\x6f\xd3\x2d\x1e\x48\xbf\xf3\x6c\xf7\x61\x1a\xa9\xb3\xef\xfb\x58\x47\x24\x62\x0f\xc6\xd1\x57\x18\x47\x5f\x61\x15\x75\xc9\x8f\x79\xb6\xe6\xaf\x39\x11\xfa\x9d\x41\xad\xa0\xdc\xab\xdd\xa5\x15\x75\x30\x4b\xe9\x2b\x14\x2e\x7c\xbd\x64\x1d\x6f\x31\xc8\x06\x83\xf6\x9c\x66\xb0\x73\xbd\x9b\x87\x30\xe1\x1f\x5b\x73\xad\xa1\x91\x5a\x24\x47\xb2\xcd\x0e\xba\x17\xeb\xf0\x8f\x94\x80\xff\x50\x13\xd4\xbe\xf4\xe8\xc1\x0e\xfd\x7b\xda\xa1\x2d\x86\x48\x1f\xeb\x73\xef\xfd\x0e\x7d\xdf\x96\xba\x6e\xa6\x6b\xbb\x43\x03\x86\x02\x50\x9e\xc2\xdb\xdd\x48\xdc\x77\xdf\xe3\x0a\xe3\xec\x67\xcc\x51\xcb\xee\x0a\x58\xd1\xe6\x9f\x30\xce\xa4\x09\x9b\xc6\x91\x65\x2a\x77\xef\x1c\x7c\x5d\x7e\x95\x4d\xdd\xee\x1b\x05\xbb\x64\xc1\x55\xef\x46\x03\xc4\x60\x85\xe3\xb6\x0d\x9f\x3b\xcc\x86\xeb\x8e\xa7\xff\x1e\xa6\xec\x96\x60\x7a\xaf\x94\x1b\x22\x04\x8b\x44\xbf\x7f\x86\x0a\xc8\x03\xa0\xe5\x47\xd7\x98\xdd\x72\x00\x77\x94\xda\x12\xaa\x89\x7b\xc7\x41\xcb\x87\xac\x96\xbf\x52\xd0\xf2\x2f\x69\xa0\x77\x62\xca\x33\xb1\xc6\x3c\x57\x89\x05\x7d\xac\x3a\xb9\x72\xca\x95\xb2\x30\x42\x92\xc8\x79\x28\xa4\x79\xd2\xa5\x75\x00\x4d\x7f\xa0\xb0\x21\x64\x94\x56\x06\xf8\xb7\x99\x8a\xf7\x13\xc5\x7d\xb0\xd3\x1d\xcf\xdd\xda\xe9\xe6\x86\xd4\x07\x1b\xfd\x3f\xca\x46\xef\x6f\x70\x9f\x44\x11\xbc\xc5\x2b\x68\x49\xff\x28\x0d\x6e\x73\xe3\xb3\xdc\x19\xe5\xa9\xc3\xde\xde\xdb\xa0\xde\xf3\x48\x49\xb7\x19\x59\xbf\x19\xce\x3c\x77\x9d\xa8\xd2\x69\x8d\xf6\xb8\xae\x4d\x65\x77\x6c\xb9\xa9\xed\x77\xc9\xee\xb8\x97\xf4\x8b\x03\x38\xb8\x87\xf4\x8b\x83\xae\x4e\xfe\x82\xe9\x17\x52\xe7\x0a\x99\xeb\xa1\x06\xcc\xd3\xeb\x64\x80\xbe\x6b\xa0\x87\xa7\xb2\xc3\xce\x92\x79\xca\x34\x7c\xb7\xbf\x71\x87\x99\xf4\xea\xaa\x83\xbb\xf6\x3b\x34\xf7\x1e\x5c\x8f\x07\xd7\xa3\x44\x79\x70\x3d\x1e\x5c\x8f\x07\xd7\xc3\xbc\x56\xff\x0e\x87\xfb\x34\x79\xef\x4b\x49\xdb\xef\x1a\xa8\x2e\x0f\xce\xfe\x1d\x17\x0d\xec\x7d\xb4\xbd\xbc\xf2\xb2\xcb\x46\xbe\x38\x55\x97\x5e\xf1\x05\x96\x26\x82\x8c\x4b\x0b\xcb\x43\x5f\x2a\xa0\x6e\xc2\xf6\x2e\xf6\xb5\x93\x13\xbc\x7a\x8b\x5a\xaf\xb1\x32\xa6\xf2\x5b\x65\xa4\x4b\xa4\x2d\x91\x56\x4d\xd2\x7d\xe6\x28\xef\x73\xbf\xee\x7e\xf7\xdd\xb6\x09\x4b\x31\xc6\x26\x71\x7b\xdc\xc7\x7b\x6f\xb4\xed\x66\xfe\xcb\xdb\xd8\xcc\xc6\x43\xf3\x92\x4e\xf3\xf4\xbb\x35\xc3\x3c\x69\x1c\x9d\xa3\xf9\xbf\x44\x6b\x8e\x2b\x34\x94\x43\x64\xdd\xa1\x61\xc4\xbd\xbc\x44\x43\x95\x38\xe4\xdf\x3c\xea\x22\x0c\x67\x0f\xd2\x45\xd1\x33\xa0\xe8\xc5\x2e\x2c\x7b\xaa\x94\xd6\xef\xec\xb0\x99\xb4\xd5\x5c\x4e\xf0\xea\x87\xed\x81\x7d\x35\x93\x88\xe3\xda\xc5\x62\x5c\x72\x02\xdb\x74\xdd\x5f\x48\x9e\x0b\xa5\xd5\xd7\x30\x7e\xf7\xe1\x7c\x1f\xc3\x58\xf3\xe9\xc1\x30\xfe\x43\x0d\xe3\x5e\x29\x33\x7a\x16\x1a\xa7\x5f\x8b\xe3\x16\x2b\xe5\x0f\x4a\x3e\xde\x41\x63\x76\xe1\xee\x61\xcb\x49\xe7\xbb\x96\x09\xd9\xcf\xca\x46\x6f\x15\x77\x91\x64\x73\x35\x6c\xd2\x2d\xb3\xe6\xb9\xd4\x2d\x5c\x3a\x5a\xd8\xf2\x9d\x40\x0b\xa5\x22\xe2\x48\x35\x65\xe2\x06\x8d\xf0\xa3\xeb\x91\xb7\x3e\x95\x4d\x1c\xd7\x9a\xe8\xdb\x82\x06\x6f\x39\x62\x61\x9e\xd6\xf8\x87\x3d\x16\xe7\xfd\x4a\xd6\x52\xe4\xbc\x64\xa9\xfe\xb4\xdf\xa3\x64\x02\x56\x56\x8b\x43\x7b\x1d\xea\xeb\x0c\xb5\x5d\xb9\xd4\x18\xf3\xbd\xf8\x3b\x5f\x39\x57\xfb\xff\x95\x81\x36\xe4\xdd\xe6\xdc\x5f\xc9\x0b\x1a\x6e\x73\x83\xcc\xad\xf7\x69\x9e\x70\x5c\xbd\x50\xcb\x3a\x15\x67\xae\xb2\x55\x57\xe6\xca\x3f\x76\x80\x69\x01\x28\x6f\x4e\x16\x35\xff\xab\x2a\x60\x0a\x3e\x76\x68\xa1\x02\x0e\xa6\x80\x03\xf5\xf6\xe5\x0b\xdc\x3a\xd6\xbf\xf2\x4e\x5c\x98\x2a\x9c\xc0\x2a\xfa\xf2\xa5\xfb\xa2\xdc\x62\xee\x28\x4c\xfd\x53\x60\x39\x80\x33\xbb\x93\x4c\x37\xef\x3a\xf1\x6d\x11\x20\x77\x95\x4a\x0a\x5a\x82\x9d\x3d\xae\x51\x2c\x29\x95\x2f\x5d\x97\x26\xd6\x53\x18\xad\x08\xa5\xbe\x05\x16\x45\xd1\xab\x6b\x9c\xf0\x37\x84\x71\x9c\x60\xea\x1f\x64\x69\x26\xc7\x75\x30\xac\x7c\x20\xab\x15\x75\x99\x63\x9a\x84\xd8\x3f\x58\xa4\xe9\xd5\xe4\x12\xcf\x52\x8a\x7f\xc0\x8c\xd3\x74\x7d\x30\x84\x59\x9e\xa8\xbb\x11\xeb\x9a\x4b\x77\x4a\xf1\x32\xbd\xc6\x3b\xf7\xbb\xb1\x12\x40\xf5\xf9\x3d\x92\x10\x4e\x50\x0c\x19\xa2\x68\x89\x79\x4d\xc0\xac\x4b\xca\xeb\x47\xb0\x35\xa2\x96\x96\x9c\xc6\xc1\x02\xb1\x52\x59\x8e\x7f\xf5\x3f\xfe\xfa\xe2\xf3\xb3\x41\xf0\xed\x93\xf1\x10\xbc\x27\x87\x95\x33\xee\x72\x1b\xcb\x6e\x41\x7c\x5b\xfd\x59\x9b\xf2\x9b\xd3\xf8\xbf\x10\x5b\xb8\xfa\xb1\x1a\x91\x17\xb5\x77\xc8\xa5\x6e\xc5\x22\x31\xf8\xd6\xff\xf4\xe2\xcb\xd3\x81\xbe\xbb\x58\x50\xfc\xf4\xf3\xb7\x05\xc9\xff\x68\xbb\x01\xbd\xb3\x31\x79\xbd\xb2\xff\x29\x7a\x66\xb7\xe3\x4c\x77\x33\x84\x45\x38\x4c\x23\xfc\xe1\xfd\xeb\x53\xf3\x97\x98\x7c\x55\x37\x50\xd3\xc7\x21\xa0\x85\x80\x53\x86\x5f\x27\x5c\x5f\x28\xaa\xe6\x90\x43\x56\x1d\x42\x5d\xf9\x9b\x16\x9b\x47\x9b\xff\x0f\x00\x00\xff\xff\xde\xbc\x39\x06\x37\x77\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\xef\x77\xd3\xb8\xb2\xdf\xf9\x2b\x06\x5f\x0e\x75\x20\x71\xe8\x7e\xcc\x36\x65\x81\xe5\xee\xe3\x2d\xcb\x72\xa1\xbc\x77\xde\x01\xf6\x54\xb5\x95\x44\x5b\xc7\xf6\x95\xe4\xa6\x39\x25\xff\xfb\x3b\xfa\x65\xcb\xb6\xfc\x23\x2d\x65\x7f\xdc\xfa\x03\xb8\x92\x66\x34\x92\x46\xa3\x99\xd1\x78\x72\x81\x28\x70\xbc\xce\x62\xc4\x31\xcc\xe1\xf4\xde\x51\x44\x2e\x80\x44\x73\x2f\x43\x4b\x3c\x59\xa5\x6b\xec\x1d\xdf\x03\x00\x90\x15\x61\x8c\x18\x33\x75\x18\x45\x98\xea\x5a\xd9\x82\x24\x59\xce\x81\x6f\x33\x3c\xf7\x38\xbe\xe4\x1e\x64\x31\x0a\xf1\x2a\x8d\x23\x4c\xe7\xde\x7b\x8c\x68\xb8\x82\x9c\xc6\x63\x38\xc7\xdb\x4d\x4a\x23\x48\x29\x70\xb4\x64\x1e\x5c\x4c\xd6\x69\x84\xe3\x80\x53\xb2\x9e\x7b\x4c\x36\xf5\xe0\x87\x45\x1a\xe6\x6c\xee\x3d\xc0\x17\x38\xe1\x01\x47\x74\x89\x79\xc0\x70\x8c\x43\xee\x8f\x3c\xf8\xe1\x1c\x6f\xf3\x2c\xc0\x09\x17\x1d\x28\xa8\xe7\x69\x7a\xbe\x46\xf4\x9c\x79\x53\x8b\x36\x04\x9c\xf0\x18\xcf\xbd\x77\x78\x41\x31\x5b\x01\xe3\x29\x45\x4b\xec\xc1\x0f\x61\x4c\xc2\xf3\xb9\x47\x71\x9c\xa2\xe8\x47\xc4\x91\x35\x26\x35\x2e\x33\xee\x05\x62\xb0\x40\x93\xc5\x46\xfc\xcb\xb6\x49\x38\x41\x31\xf7\x60\xa6\xab\x05\x3c\x49\x96\xf0\xf0\x21\x1c\x88\x06\x19\x49\x0e\xbc\xe3\xa3\x29\xb1\xe8\x98\x22\x17\x51\xcf\xa2\x08\x12\xbc\x81\x33\x4d\x7b\x49\x15\x5b\xa5\x9b\x1f\x09\x8a\xd3\xe5\xb3\x28\x1a\x46\x58\x16\xe7\x6c\x12\x12\x1a\xc6\xb8\xa7\xf7\x8b\x09\x59\xcc\x3d\xb1\x00\x41\x8c\x93\x25\x5f\xc1\x31\x3c\xf1\x0c\x51\xef\x57\xe9\x46\xaf\x4e\x93\x9a\x13\x51\x3e\x88\x1c\x89\x61\xd0\x2c\x3c\x47\x3c\x5c\x01\x8e\x08\x2f\x7b\xe4\xe9\x72\x19\xe3\x97\x11\xe1\xbf\xa4\x11\x1e\x38\x01\x38\x09\x49\x2c\xd7\xa6\xa5\xdf\xa3\x69\x44\x2e\xba\xf9\x5a\x6e\x02\x41\xcb\xe4\x2c\xbd\xf4\xf4\x54\xe1\x26\x1d\x47\xd9\xf1\xd5\x95\xe2\x48\x92\x26\x7a\x1e\x77\x3b\x20\x1c\xaf\x19\xa8\x0a\x1c\x1d\x4d\x33\xd7\x88\x7f\xc4\x31\xe6\xb8\x73\xd9\x55\x13\xbf\xe8\x61\x34\x70\xd6\x29\x62\xab\xae\x29\x68\x32\x60\xdb\x52\x3f\x8b\x22\xb1\xda\xfb\x93\x30\x78\xe1\x3f\x64\x91\x90\x3f\x62\xf7\x92\x0b\xec\x24\x42\x35\x79\x81\xc2\xd5\xfe\x73\x11\xc6\x69\x1e\x4d\xa2\x74\x93\x88\x1d\x3a\x7c\x52\x5e\xa0\x24\xc4\xf1\xcd\x78\x91\x93\x35\x6e\x9d\x85\x3a\x1b\x0a\x96\x33\xbc\xc0\x26\x4b\x4a\x22\x0f\x28\x5e\x58\x85\x3f\xc9\x32\x23\x70\xae\x62\xc2\xf8\x0c\x22\xc2\xb2\x18\x6d\x7f\xcd\xc4\x9c\xb0\x40\x14\x0a\x02\x77\x15\x2e\x45\x4b\x92\x20\xd1\x40\xf0\xb3\x66\xe7\x35\xba\x7c\x8b\x96\x18\x8e\xe1\xd0\x83\xca\x68\x66\x62\x2b\xa8\x0d\x51\xaf\xd1\x40\x05\x74\xbd\xde\xec\x11\x6b\xb7\x54\x1a\xfc\x10\xae\x50\x22\xe0\xd5\xff\x12\x85\x3d\x37\x55\x4a\xad\x1a\x33\x09\x13\xb1\xb5\xe0\x62\xb2\x48\xe9\xdc\xf3\x45\xe9\x18\x48\x12\xe1\xcb\x11\x90\xa4\xd8\x4b\xac\x4e\x97\x99\xdc\x80\x44\x55\x82\x66\x39\x8d\x75\x55\x4e\xe3\x5a\x9d\x66\x05\x59\x2b\xdf\x6b\xf5\xf8\x32\xc4\x34\xe3\xba\x85\xfe\xab\xd6\x26\xcb\xcf\x62\x12\xea\x26\xea\x8f\x5a\x0b\xb2\x46\x4b\xfc\xe1\xdd\x6b\x43\xa1\xfe\xb3\xd6\x6a\x85\xd8\x8b\x34\xe1\x38\x31\xdd\x95\x05\xcd\x96\xcf\xd4\x66\x2a\x5b\xea\x82\xfa\xf8\xd0\x92\x99\xe1\x89\xfd\x5a\xa3\x4b\x4c\xeb\xdc\x93\xff\xd5\xaa\xce\xf1\xb6\x9c\xcf\x3d\x59\x60\x26\xf6\xf5\xab\x68\xee\xd5\x38\x57\x15\xd7\xda\x1a\x76\x6e\xb4\x36\x15\x75\xdc\x5a\xe4\xce\x3d\xc2\xde\xeb\x77\x5f\x13\x3a\xaa\xb1\xa2\x6a\x6b\x76\xf6\x7b\x23\x57\x6a\xad\x38\x5a\x4e\xa4\x08\xc0\xd6\xfe\x3c\x41\xcb\x17\xaa\xac\xd6\x5a\x0c\xd9\x96\x5c\x42\x5e\xd4\x9a\x44\x52\xa6\x37\xa5\x7c\xad\x59\x2e\x65\x5e\x8b\x14\xac\xec\x99\xca\xd6\xf8\xdb\xec\x7a\x5b\x3c\x66\x46\xba\xe2\x75\xc6\xb7\x93\x35\x66\x4c\x52\xa1\x86\x74\xdf\x52\xbd\x04\x5b\xbc\x62\x2f\x45\x33\xef\xf8\x4d\x0a\x0c\x5d\xe0\xa8\x14\x0b\xb0\xc5\x1c\x66\x7e\x71\x20\xdb\xe7\xbf\xc6\x32\x49\x2f\x30\x8d\xd1\xd6\x60\xd7\xc5\xde\x71\x9b\x26\x98\x91\xc4\xfc\x9f\x08\x95\x58\x48\x7b\x9b\xf8\x30\x67\x3c\x5d\x4f\x22\xb9\x86\x52\xca\xab\xd7\x89\xd1\x7d\xcf\x48\x52\x14\xd6\x34\xab\x23\x54\x9c\x3f\x0b\x12\x73\x4c\x4f\xd0\xd2\x3f\x78\x74\x30\xf2\x8e\x7d\x14\xc7\xe2\xd4\x5e\xe2\x68\x54\x3f\xc2\x9c\x30\x63\xe0\x34\xc7\x06\x32\x4f\x5a\x60\x8d\x68\xe5\x68\x39\x06\x12\x29\xb9\x5a\xd5\x0e\x0a\x52\xf5\x1e\xf0\x95\x86\x2e\x9b\x8f\x45\xdb\xfa\xd1\xfc\x8f\xab\x2b\x8e\x96\x41\x82\xd6\x78\xb7\x3b\x62\x19\x4a\x8e\x75\x49\xa1\xaf\xef\x76\x47\x53\x59\xe1\x3a\x28\x2b\x53\xe8\x9c\xd6\xea\x2c\x0a\xe5\x5f\x2d\xc1\xe9\xbd\x7b\x64\x9d\xa5\x94\x43\xc9\x63\xcf\xd3\x4b\x58\xd0\x74\x0d\x5e\x10\x4c\xc3\x74\x9d\xa5\x09\x4e\xb8\xc5\x84\xc1\xef\xcc\xfb\xde\xc0\x19\xde\x79\x25\xce\x1d\x07\x98\xa9\xaf\x00\x29\xe2\xd4\xb6\x75\x01\x29\x32\xab\xfd\x20\x26\x37\x86\x69\x3e\x15\x05\xaa\xc5\x3d\x7c\x29\x9b\x44\x78\x81\xf2\x98\xc3\x95\x9c\x01\x63\xb9\xcd\x8a\xb7\xb1\x2c\x5f\x93\x4b\x92\xb0\x19\x7c\x34\x18\x3f\xab\xf2\xa2\x77\x36\xd3\x18\xc4\x63\x0f\x6f\x5c\x94\x56\x26\xab\x2c\xb6\x87\x25\x0b\x77\xaa\x2e\x42\x1c\xf9\x23\x0b\x2b\xc5\x3c\xa7\x89\x55\x20\x1e\xbd\x93\x66\xb0\x40\x31\xc3\xe3\x4a\x9d\x91\x1b\xce\xca\x42\xe5\x9b\xc1\xc7\xcf\xe3\x7b\xb5\x3a\xa1\x38\xce\xc0\xf3\xaa\x30\x42\x8c\xcd\xe0\x49\xb5\x50\x8b\xaf\x46\x79\x21\x1f\x54\x07\x76\x95\xe0\x7c\x47\xb7\xe5\x6e\x9d\xd5\x46\x29\x9e\x0b\xc2\xc8\x59\xec\x1e\x4c\xef\x68\x65\xaf\x42\xd9\x98\xc1\xc1\xcb\x4b\xc2\xb8\x10\x6d\xa2\xa7\x83\x66\xbb\x35\x22\xc9\x09\xbe\xe4\x33\x38\xf8\xf5\x67\x47\x3d\xc3\x61\x9a\x44\xba\xc5\x3b\x2c\x36\x60\x17\x2a\xb9\x9f\x67\xe0\x8f\x60\x7e\xec\x18\x96\x78\xc8\x02\x7c\xbe\x22\x2c\x28\x67\x20\x30\xc3\x19\xb5\xc0\xc8\x11\xb5\xc0\xc0\x5c\xcd\xc1\xf7\x4e\xc8\x1d\xe0\x98\xe1\x3d\xd0\xea\x99\xef\xc1\xda\x28\xdd\xb5\x4d\xdd\x80\x19\xe9\x18\x99\x10\xb8\x4d\x12\x1c\x9d\x61\x16\xbe\xa5\x98\x31\x1c\xed\xd7\xd7\xa0\xe1\xee\x3f\xf5\xd5\x09\xb2\xe8\xdd\xd9\xbb\x5e\x08\x94\x9c\x0b\x92\x4b\x62\xad\xf3\xd7\xaf\xb3\x83\x16\x0a\x92\x9c\x62\xc7\x19\xdf\xc3\xd1\x1c\x9e\x7c\xef\xee\x67\x83\xb8\xd8\xe1\x25\x32\xcf\x31\x18\xcf\x6f\xe3\x42\xc1\xb1\x5d\x1c\x5a\x9f\x1e\xb9\xf7\x60\x0e\x9e\xb5\x5f\xbc\xe6\x1c\xd5\xc1\xcc\x56\x14\x90\xda\x76\xec\x07\x2a\xf7\xa7\x00\xab\x01\xb4\x32\x7f\x2b\xc5\x15\x71\xb1\x27\xcd\xbf\xfe\xbc\x37\xbd\xed\x13\xb4\x73\xaf\xe4\x1a\xf3\x55\x1a\x55\x44\x66\xe9\x78\x6b\xf0\x4b\x21\x6a\xf4\xc1\x31\xd2\x1c\x54\xed\x4a\xb6\x10\xd2\x1e\xe6\x70\xe8\xa8\x52\x07\x84\x63\x7a\x0b\xd4\xb2\x73\xb1\x55\xb5\x86\x64\xb1\x61\xc9\xf9\x45\x43\xa1\x51\xbe\xe7\xe2\xb4\x85\x05\xe6\xe1\x4a\x8c\x7e\x38\xe5\x95\x66\xd3\x29\xbc\xc7\xe5\xb1\x8e\xe8\x92\x55\xcf\x36\xd3\x15\xcc\xc1\xe7\xdb\x0c\xa7\x0b\xbb\x6c\x3e\x07\x61\x90\xc4\x18\x25\xde\x08\x9e\x5a\x55\x33\x87\xe4\x29\x88\xb5\x90\x59\x65\x75\x64\x65\xd5\xcc\x48\x89\x3a\xed\x6f\x11\x65\x58\x1f\xc0\xf0\xef\x1c\xd3\x6d\xa5\xc5\x05\xa2\x85\xa7\x77\x6e\xaf\x45\x53\xfc\xd1\xcb\x97\x97\x61\x9c\x47\xf8\x04\x2d\x9f\xc1\x1c\xa6\xfe\x6f\x5f\x3e\xb1\x91\xd0\x90\x67\x1f\xbd\x83\xcf\xfe\xc7\xdf\xbc\x83\xcf\x8f\x47\xe2\x7d\x4a\xc6\xa2\x73\x59\xe7\x6d\x08\x5f\x01\xcb\x50\x58\x33\x38\xea\x48\x9f\xd7\x90\xfa\x9f\xde\x3f\x1e\xd9\x98\x04\xa2\x34\xe7\x13\x89\xcb\x81\xea\x55\xe2\xa0\xaf\x83\xbc\x01\xd4\x95\x28\x9f\x57\x51\xda\xc4\xf5\xd3\xc6\xd5\x92\xd6\xf5\x16\xf1\x60\x35\xfe\xe8\xa4\xbd\x09\xbd\x7c\x87\x59\x1e\xf3\xe6\xea\xfe\x84\x79\x81\x40\x74\x02\x0b\x42\x19\x1f\xc3\x66\x45\x62\x0c\x28\x66\x29\x50\xbc\x4e\x2f\x84\xb8\x21\x5c\x69\xad\x7a\xb9\x2b\xa8\x54\x7b\xdf\x74\x04\xf3\xea\x6a\x07\xf8\x12\x87\xbe\x06\x1c\xb9\xe4\x73\xc9\x43\xfa\x2d\xa0\x58\x5e\x2d\x14\x38\x3f\x3e\xf9\x3c\x06\xcf\x1b\x35\xe5\x97\x3d\x03\x41\x96\xb3\x55\x09\xf3\xdd\xe7\x51\x5d\x66\xed\x41\xf7\xf3\x3f\x2d\xdd\x7a\xe9\x48\x52\x2e\x1d\xeb\x1d\x98\xc5\xde\xb7\x3b\x30\xfe\x75\x16\xc2\xda\x3b\x7f\x3a\x7a\xa7\x53\x38\xa1\xc4\xbd\x19\x9a\xa4\x70\x4a\xd6\xfe\xa8\xa0\x68\xfa\x89\x3d\x9e\x2e\xc7\xe0\x81\xa0\xa6\x21\x71\x29\xce\x10\xc5\xf0\xe1\xdd\x6b\x58\xa4\x14\x9e\xbd\x7d\xd5\x10\xb9\x39\x8d\x61\x2e\xef\x93\x3e\xbc\x7b\xed\x7b\x53\x94\x91\x69\xe9\x16\x1d\x43\x94\x86\xf9\x1a\x27\x3c\xf8\xf0\xee\x75\x6d\x20\x39\x8d\xcb\xe3\x52\x63\x50\xf7\x76\x6f\x11\x45\x6b\xe6\xb7\xce\xed\xcc\xbc\x38\x4c\x19\x69\x23\xc9\x79\xfc\x3d\x25\x89\xef\x8d\xbd\x51\xab\xa8\x9a\x55\x39\xbf\x03\x40\xd9\x77\xc5\xe1\x5f\x5d\x10\xc7\xd4\xfd\x53\x9c\x67\xd2\x50\x55\xa2\xca\x35\x75\xec\x9c\x64\xff\xb4\x8e\xc9\x97\x94\xa6\xd4\xf7\x44\xb1\x3a\x0f\x85\xac\x93\xae\x90\x7a\x07\xf6\x61\xef\xd4\xfb\x25\xb8\x9f\xd3\x78\xd4\x18\x49\xc0\x57\x38\xf1\x29\x66\x59\x9a\x30\xdc\x6d\x79\xdd\x37\xcd\x82\xf4\x7c\x04\x7c\x45\xd3\x0d\x98\x22\xb7\xf2\xaf\x95\xee\x02\xee\x77\x96\x26\xbe\x83\xd1\x77\x6d\x84\x09\x80\x76\xa2\x8c\x0a\x83\x38\x6a\xb7\x3d\xb4\x76\x26\x30\xc9\xf7\x0e\x33\xc5\xb8\x27\x75\x6b\xfd\x67\x07\x40\xe9\xda\xd3\x20\x45\x41\x6d\x89\x6c\x8a\xd1\x05\x06\x26\x35\x25\x94\x44\xa0\x9c\x92\x72\x53\x91\x05\x24\x18\x47\x38\x6a\x5d\x81\x42\xc9\xea\x32\x76\x05\x33\xad\x08\xe3\x29\xdd\xc2\xbc\xa3\x9d\x78\x50\xc8\xc9\x05\x56\x6e\x09\xeb\xde\xbd\xc9\xf1\xf6\x63\xbc\x1e\x9d\x5a\x95\xfd\x74\x6d\x17\xfb\xd9\xb5\xcc\x1a\x94\xd2\xe5\x5f\x39\xa6\x04\x2b\x85\xc2\xbd\x30\x60\xab\xc0\x99\xf6\x36\x8f\x2c\x58\x25\x51\x4f\xa5\xc3\xf9\xc1\x55\xd1\x6c\x77\xea\x60\xcc\x06\x42\x2d\xa1\xee\x0b\x8d\xd5\x73\x60\x55\xf5\x06\xaf\xfa\x4b\x62\xee\x1b\x98\xb0\x11\xfe\x21\x27\xbf\x93\x08\xab\xc3\xf2\xde\xbc\x8b\x1b\x40\x89\x56\x78\x3c\x87\xd3\xa7\x0f\xae\x2c\x78\x25\xdf\x1e\x7a\xa3\xdd\x69\xfb\xc0\x77\xed\x84\x6f\x48\x12\xa5\x9b\x40\xb3\x9a\x1c\xbf\xe4\x4d\x5f\x97\x8c\x2b\x1c\x25\x88\x68\x99\xe0\x96\x3e\x0a\xb9\x29\x95\x4c\xb2\x00\x8a\xff\x9d\x63\xc6\x3b\xf6\x47\xab\x4d\x64\x3f\x5a\x28\x29\xa1\xa8\x8e\x28\x23\x56\x9d\xd4\x0d\xf2\x02\x95\xe2\xb7\xc3\x17\xa2\x5a\x0b\xb1\x59\x11\xf6\x83\xfd\x44\x7f\x33\xf1\x2d\x27\x4e\x5b\x10\xa2\x65\x87\xa0\xed\x9d\x5e\x17\x09\x21\x12\x2b\x8c\x29\xed\x21\xa1\x81\xbc\x75\x0a\x05\x2e\xb1\xf5\x2b\xcb\xd7\xc5\x6b\x98\xd2\x80\xe3\x4b\xee\x8f\xd4\x84\xac\xd9\xb2\x9d\x98\x0a\x51\x6c\x95\x6e\xa4\x0a\xa0\x1c\xde\x02\x72\x2c\xd1\x89\xa3\x23\x67\x1d\xb2\xca\x31\x15\xd0\xc2\x4f\x4e\x67\x43\x2d\x96\xa9\xe1\x19\xe9\xf3\x79\x94\x2e\x15\x27\xfa\xf2\x16\xce\x17\x48\xba\xb0\x37\x8f\x6b\x59\xfb\x80\xe2\x85\x75\xf6\xfe\x44\x49\x14\xb0\x90\xa6\x71\x7c\x92\x66\x50\x71\xe5\x0d\x25\xaa\x1a\x5f\xe1\x1e\x72\x71\x11\xe0\x38\x7c\x64\x03\xcb\xb5\x79\xbf\x52\xd0\xd1\x65\x71\xf1\xeb\x13\x8e\xd7\xf5\x7e\xc5\xd9\x40\xa2\xcb\xd2\x83\x61\x62\x7d\x16\x24\x89\x5e\x25\x11\xbe\xf4\x71\x2c\x18\x0a\xc7\x01\x89\xa4\x1f\x45\xa0\x09\x48\x54\xe3\x0f\xc1\xbc\x12\xd1\x7c\x0e\x93\xc3\x51\x1d\x9d\x3c\xbb\x24\x01\x55\x30\x29\xf9\x6a\x6d\x59\x16\x93\x10\xfb\xf2\xb6\xed\xd0\x3d\x9b\xb5\xdb\xef\x57\x51\x97\x33\x76\xc8\xa0\x0c\x96\x63\x98\x1c\x3a\x7b\x6c\x5c\x0a\xd6\xef\x04\x1d\x3e\xb2\xfb\xfb\xdc\x24\xc8\xb6\xe5\x8d\xa6\xb9\x50\x1c\x83\x0a\x0f\x44\x31\xff\x19\x6f\xeb\xa6\xd9\x50\x17\x6a\xaf\x23\xbd\x90\x08\x4a\x18\x28\xd7\xa7\xa0\xa3\x18\x5f\xab\x07\xb4\x9c\xa3\x66\xf8\x80\x99\x25\x8e\x96\x6f\xd0\xda\xbd\x15\x2b\x63\x7e\xd3\x35\x64\xab\x2b\x17\x90\x32\xad\x5c\xf3\x5b\xf3\x44\x66\xc2\xdc\xc3\x1c\xd3\x2a\x2b\x96\xf0\x96\x0f\xb1\x52\x5a\xf7\x22\xda\x95\x6e\x3f\xa2\x54\xeb\x14\x85\x0a\xfc\x91\xd7\xba\xf8\x85\x6d\x6a\xa3\x7d\x0a\x9e\xf4\xe0\x3d\xf2\x60\x06\x9e\x7a\x6b\x59\x3e\x97\x04\x32\x8f\xcb\xb5\x5c\xd3\x8a\x84\x28\xa0\x97\xef\x33\x14\x8a\xf1\x6b\x4b\xbd\x81\x88\x14\xae\x09\xe9\xa9\x90\xcd\x03\x8e\x19\xf7\x8b\x35\x7e\x0a\xa7\xd2\x3f\xf8\xe0\x4a\x17\xed\xbc\x53\x98\xa9\xc2\xb2\xec\xb4\xd5\x4a\x56\xb8\xbd\x89\x07\x8f\xad\xee\x5c\xce\xbd\x57\x36\x31\xc2\xa2\x7f\x87\x97\x2f\x2f\x33\xff\xd4\xff\xed\xcb\xa7\x4f\x6c\xf4\xe0\xaa\x84\xdf\x9d\x8e\xc1\x23\x4b\x97\xb1\x6d\x7b\xbe\xda\x10\x95\xb4\x75\x20\x2a\x56\xd0\x5a\x4f\x07\x43\x74\x70\xaa\x69\x62\x93\xa4\xa6\x57\x61\x73\x7a\x80\xda\x16\xd8\xb1\xc8\x25\xfe\x72\xee\x06\xe1\xaf\x72\xa8\x7a\xb1\x1c\x4d\x25\xb6\x31\x78\x0f\x0e\xc5\xd2\x95\x33\xe6\x52\xe8\xba\x74\x5e\xdd\x8d\x30\x28\xa0\x3a\xf3\x1d\x0a\x5c\x9d\x36\xe5\x79\xea\xbd\xfc\x6b\xa3\xe3\x5a\x93\xb4\xf7\x22\xec\xb9\xc8\x3d\x8b\x50\x62\x2b\x16\xa1\xe4\xff\x9b\x2d\x82\xbd\x8f\xbe\xfe\x22\xb4\x78\x9b\x3a\xd4\xa9\x4a\x04\x6f\x8b\x36\x55\x34\x71\x38\xf6\x74\x04\x82\xf7\x06\x6f\xc0\x28\xa2\x0e\xa7\x44\xa8\x22\x10\x67\xe0\xbd\xa0\x58\x3a\x54\xaa\xa1\xec\x4d\x88\x05\xc1\x71\xc4\x66\xf0\xd1\x3d\xab\xe2\x58\x9d\x81\x97\xd3\xb8\xc5\x05\x12\xa3\x33\x1c\xcf\xc0\xfb\x40\xe3\x31\x30\x8e\x28\x07\x79\xcf\xb2\xe2\x3c\x9b\x4d\xa7\x41\x10\x38\x00\x77\xe3\x96\x45\xd4\xdd\xa9\xe0\xce\xee\x0e\x5f\xc8\xe0\x17\x35\x31\xe0\xa7\x32\x0e\x11\xc5\xa3\xa6\xb3\xa0\xaf\x33\x13\x27\x3a\xa8\x3b\xdd\xd8\xee\xd0\x0d\x27\x8e\xe3\x19\x78\x88\x62\xb4\x3f\x49\xd2\xfa\xee\xa1\x27\x5d\xaf\x11\x30\x2c\x74\x03\xae\xef\x15\xfa\xa9\xd2\xed\x53\x3a\x03\x6f\xdc\xd2\x26\x22\x52\xf9\x44\x74\x3b\x2b\x0d\xd2\x60\x8d\x32\x71\x62\x0a\x2d\xd4\xa8\x7a\x4d\xab\xaa\x6f\x5c\xa1\x64\x4a\x13\xfc\xda\x33\x40\xcd\xc0\x9d\x8d\xf5\x2c\x87\x2b\x1c\xba\x98\x1b\xa4\x9a\x10\xe7\xc6\xd7\x56\x0b\x5a\xcd\x99\xa1\x65\x7f\x16\x5d\xa3\x73\xfc\x56\x85\x0f\x77\x8f\xe3\x17\x74\x5e\x8c\x02\x54\xc0\x71\xbc\x05\x74\x81\x48\x8c\xce\x5a\xb9\xfc\x66\x03\x2b\x89\x73\x0c\xcc\x71\xed\x58\xc6\x2d\x79\xbf\xfe\xec\xe8\xce\x8e\x5b\x32\xd1\x14\xdd\x21\x4b\x11\xe2\xa8\x23\x70\x66\x3a\x05\x39\x2f\x2c\xd7\xd7\x27\x84\x41\x92\x72\x90\x01\xa5\xad\xce\x06\x81\x34\xc8\x69\xac\xc5\xb4\x52\x50\x9d\xfa\x69\x31\x8d\x2e\xc7\x81\x27\x3a\x5c\xe7\x8c\x97\x5d\xb6\xb9\xba\xa0\xe3\x90\x84\x4e\x47\x9d\xb9\x1b\x6a\xdc\xf7\x99\x47\x7e\xed\xa5\x5c\x3d\x72\x5c\xad\x0d\x41\x3a\x8f\xd2\xd7\xe9\x06\xd3\x17\x88\x61\xdf\xed\xcd\x90\xcd\x5c\xf7\x56\xed\xad\x85\xe1\xca\x45\xdb\x47\xe3\x4f\xec\xd1\x74\xd9\xd1\x54\xd9\x2f\xb6\x04\xd0\x6b\xa0\xfd\xbe\xed\x90\x96\xe0\xe8\x76\xf2\x38\x83\x14\x5d\x8f\xda\x81\x25\x0d\x9d\x00\xbb\x2e\xb7\x50\xc7\x9d\x04\x4e\xa2\xf6\x6b\x14\xb1\x76\xf2\xee\xaa\xeb\x36\x21\xa7\xf1\x0c\x6a\x2c\xdb\x7e\x2b\xa0\x0f\x78\xc5\x0a\xe2\xbd\x17\x42\x1f\x45\x1a\x46\xff\xd5\x0b\xa5\x24\x90\x06\x2a\xe5\x04\x3c\x85\x43\x68\x04\x62\x56\x08\x2c\x2e\x0e\xdb\xdb\x54\xe4\xbb\xee\xa3\x52\xe6\x06\x6d\xbb\xe5\xb0\xbc\x02\x9d\xb7\x79\xe6\xb1\x1d\xd8\xf6\x1d\x6b\x37\x4b\xa9\x28\xa8\x19\x78\x59\xca\xda\xb4\x00\xf3\x9c\xa5\xd1\x76\x06\xff\xfd\xfe\xd7\x37\x01\xe3\x94\x24\x4b\xb2\xd8\x2a\x59\xd7\x0d\xa7\xbe\x63\x73\x06\xa7\xd6\x1f\x4f\x7f\x45\x32\x39\xd9\x66\xd8\x13\x2a\x44\x96\xc5\x24\x94\xd1\xbf\xd3\xdf\x59\x9a\xf4\x90\xe8\x08\x67\x2c\xaa\x3a\xb6\xe9\x40\xb7\xb9\x79\xae\xe7\x3e\x37\xcf\x50\x37\xfa\x60\xc2\xbb\xdd\xea\xe6\x71\xf3\x53\xcf\xf5\x44\x1d\x70\x50\x8c\x67\x05\xb0\x0c\xae\xd4\x9e\xc2\x27\x63\x78\x32\x96\x0e\xfe\x6b\x8e\x79\x80\x1f\xff\xc6\x63\xbe\x96\xa3\x1e\x6e\xee\xac\xef\x19\xfb\xae\xdf\x3a\xeb\xb3\xc0\x5e\x46\x84\x3b\x9d\xcb\xd3\x29\xbc\x10\x0a\x17\xf0\x15\x96\x6e\xe3\xa6\x6b\x4c\x39\xd9\xe4\x47\x6f\xf2\xe4\x4b\xcf\x7e\xc7\x21\xf7\x5a\x22\x0a\x95\xb7\xda\xf2\xce\x69\x5f\xb4\xd2\x5c\x92\x7c\x7d\x86\xa9\x74\xcc\x99\x72\xa7\x04\x96\x5f\x7c\x35\x90\xa8\x42\x27\x1e\x59\x35\x93\x9e\xe1\xc6\x08\x48\x04\x47\x70\x08\x5f\xbe\x68\xb4\x47\xf0\xa4\x3d\x1c\xf2\x27\xcc\xe5\x5c\x60\x13\xc8\x6a\x58\x59\x29\x9f\x8d\xb1\x8a\x6a\x98\x2b\xf9\x98\x21\xca\xb0\x5f\x13\x95\xd5\xfd\xf0\x51\x92\xf0\x79\xe4\xf2\x4c\x71\xaa\xa3\x3e\x8a\xcf\xe1\x9c\x26\x88\x89\x49\x69\xc6\xe7\x0c\xb7\xa9\x05\x3f\x0c\x33\xaa\x65\x4b\x31\x21\x66\x08\x07\x4c\x1e\x72\x2e\x95\x79\x95\x6e\x5e\x2b\x13\x40\xc6\xb2\xde\xa6\xe1\xdd\x6d\x20\x98\x8f\x29\x6f\xc7\x0c\x3f\xe9\x68\x63\x13\x20\x71\xed\x4f\xc2\x30\xe3\xfc\x65\x67\x2b\xdb\x14\xef\x27\x54\xf7\x78\x8d\xd9\xea\x37\xda\x4f\xda\x9b\x68\x12\x34\xdf\xff\x29\xad\xf7\x3f\x8d\xc9\x6b\x7d\xbb\x0b\xc7\x73\x38\xfc\xf3\x1a\xb9\xff\x83\x62\x22\x3f\xa7\x97\xe9\x38\xba\x0d\x5b\x5b\xeb\x2f\x4c\x5b\xa7\x64\xb6\x3a\xb8\x33\x33\x35\xe4\x5f\xd5\xcc\xe4\xd2\x41\xdb\x6a\x69\x1a\xe1\x6d\x96\xaf\x34\x25\xdd\x1d\x96\xb2\xb6\x58\x70\x8b\xad\x3a\x60\x8c\x63\x73\xee\x32\x27\x3b\xe0\xf4\x36\x9c\xb7\x19\x94\x5d\x64\x2a\xb6\xe4\x32\xe0\xe7\x7a\x86\xf8\xb7\xb6\x10\xf3\x6b\x19\x88\xa2\xa7\x3b\x03\xf1\xce\x40\x6c\x03\x6c\x18\x88\x52\x2f\x1e\xc3\xe1\x9d\x91\xd8\xf1\xdc\xae\x91\xa8\x53\xfd\xc8\xcc\x41\xad\x76\x22\x4a\x22\x1d\xd9\xa1\x52\x0c\x75\xd9\x8b\xac\xc5\x60\xac\x83\xdc\x7f\x46\x29\xda\x06\x84\xc9\xff\x35\x01\x23\x8d\x62\x0e\x1f\xe5\xcb\xe7\xba\x65\xa7\x6b\xe5\xff\xe6\x14\x95\x56\xaa\x73\x35\xbe\x8e\x5d\x0a\x5f\xd3\x36\x85\x72\xd7\x93\x08\x8e\xe1\x09\x3c\x7c\xa8\xb1\x57\x63\x9c\xc0\x75\xa4\x4a\xcb\x56\x8e\x5d\xc7\x00\x8b\xce\x3b\x0c\xdb\xf7\x42\x25\x01\x12\x31\xb9\x84\x24\x89\x48\x88\x99\xc3\x74\x2f\xe7\x54\xe8\x17\x66\x42\x4d\x44\x99\xd3\x54\x17\x98\x3a\xa0\x64\x6e\x9c\x80\xa5\x94\xfb\x3e\x1a\xc3\x99\xd4\x1f\xcf\x60\x02\xc8\xf1\x95\x84\xbe\x03\x53\xe7\xb9\x8c\x8d\x57\xa2\xbf\x41\x69\xf1\xc9\xa9\x4e\x62\x55\xe6\x5d\x6b\x35\x67\xad\xd6\xc2\xa2\x35\x99\x5a\xac\xe4\x1c\x4f\xe1\x64\x45\x98\x8c\x88\x4f\x13\x20\x0c\x08\xa5\xf8\x02\x53\x29\xde\x02\x6f\xc8\x12\x1c\x3a\x83\x87\x5a\x88\x75\xc4\x09\x59\xb4\x3e\xa3\x18\xb6\x69\xae\xae\x8c\x7a\x49\xab\x70\x4b\x73\xf9\x57\xe9\x46\x47\xc8\x5d\xcf\x67\xd0\x62\xcd\x16\x9e\x02\xfd\xd2\x69\x84\xfc\x1f\x76\xad\x4e\xc5\x0a\x79\x93\xf6\x58\x20\xc3\xbe\x4d\xff\x16\xaa\x91\x4a\xa3\x73\x1d\xed\x88\x44\xec\x4e\x39\xba\x81\x72\x74\x03\xad\xa8\x8b\x7f\xcc\xd3\x1b\xe9\xeb\x04\x18\x96\x4f\xa2\x02\xf2\x4d\xf5\x2e\x2d\xa8\x83\x45\x4a\x5f\xa2\x70\xe5\xeb\x23\xeb\xb8\x47\x21\x1b\x8d\xda\xbf\xfe\x00\xfb\xab\x98\x66\x42\x05\xf8\xae\xf7\xab\x14\x68\x04\x13\xc9\x91\xf4\xe9\x41\xdf\x44\x3b\xfc\x23\x39\xe0\x3f\x54\x05\xb5\xd3\x2c\xde\xe9\xa1\x7f\x4f\x3d\xb4\x45\x11\x19\xa2\x7d\x5e\xfb\xbe\x43\x67\xf8\x54\x99\xeb\xba\xae\x3b\x74\xc3\x50\x34\x94\x1f\x38\xef\xaf\x24\x5e\xf7\xde\xe3\x1c\xe3\xec\x17\xcc\x51\xcb\xed\x0a\x58\xde\xe6\x9f\x31\xce\xa4\x0a\x9b\xc6\x91\xa5\x2a\x77\xdf\x1c\xdc\x2c\xbe\xca\xa6\x6e\xff\x8b\x82\x7d\xa2\xe0\xaa\xd9\x58\x01\x31\xd8\xe0\xb8\xed\xc2\xe7\x16\xa3\xe1\xba\xfd\xe9\x5f\x43\x95\xed\x71\xa6\x0f\x0a\xb9\x21\x82\xb1\x48\xf4\xf5\x23\x54\x40\x7e\x5b\x5f\x2e\xba\x86\xec\xe6\x03\xb8\xa5\xd0\x96\x50\x6d\xdc\x5b\x76\x5a\xde\x45\xb5\xfc\x95\x9c\x96\x7f\x49\x05\xbd\x13\x52\x66\x0f\x30\xea\xb9\x0a\x2c\x18\xa2\xd5\xc9\x93\x53\x9e\x94\x85\x12\x92\x44\xce\xcf\xe7\x9a\xdf\x04\xb6\x0e\xa0\x69\x0f\x14\x3a\x84\xf4\xd2\x4a\x07\x7f\x9f\xaa\xf8\x6d\xbc\xb8\x77\x7a\xba\xe3\xb9\x5d\x3d\xdd\xe4\x64\xbf\xd3\xd1\xff\xa3\x74\xf4\xe1\x0a\xf7\xb3\x28\x82\x37\x78\x03\x2d\xe1\x1f\xa5\xc2\x6d\x7e\x7a\x42\xde\x8c\xf2\xd4\xa1\x6f\x5f\x5b\xa1\xbe\xe6\x27\x25\xdd\x6a\x64\x3d\xcb\xab\x79\x6e\x3b\x50\xa5\x53\x1b\x1d\x90\x7a\x55\x45\x77\xf4\x64\x5d\xfd\x2a\xd1\x1d\xdf\x24\xfc\xe2\x00\x0e\xbe\x41\xf8\xc5\x41\x57\x27\x7f\xc1\xf0\x0b\xfd\xa9\xf3\x20\x31\x60\x9e\x41\x5f\x06\xe8\xac\x2c\x03\x2c\x95\x3d\x6e\x96\xcc\x53\x86\xe1\xbb\xed\x8d\x5b\x8c\xa4\x57\x49\x61\x6e\xdb\xee\xd0\xb3\x77\x67\x7a\xdc\x99\x1e\x25\xc8\x9d\xe9\x71\x67\x7a\xdc\x99\x1e\xe6\xb5\xfa\xcb\x5f\xee\xaf\xc9\x07\x27\x18\x6f\x4f\xbd\x52\x3d\x1e\x9c\xfd\x3b\xf2\xae\x5c\xfb\xd3\xf6\x32\x7d\x75\x97\x8e\x7c\xfa\x42\xa5\x07\xe4\x2b\x2c\x55\x04\xe9\x97\x16\x9a\x87\xf7\x8f\x07\xe5\xaf\x5a\x78\x8e\x6c\x1d\xc3\xf4\xe4\x04\x6f\xde\xa0\xd6\x84\x7f\x46\x55\x7e\xa3\x94\x74\x09\xd4\xe3\x69\x35\x79\x71\xf6\xf5\xa9\xde\x20\x46\xf9\x3a\xb9\xf2\xaf\x97\xbb\xbe\x8d\x59\x8a\x31\x3a\x92\xa6\xec\x9f\x5b\xff\x9b\xd1\xb6\x9f\xfa\x2f\xf3\x56\x9a\x8b\x87\x66\xc2\x6d\xf3\x0c\xcb\x53\x63\x9e\x34\x8e\x4e\xd0\xf2\x5f\x02\x9b\x23\x61\x8d\x32\x88\xe0\x29\x9c\xd6\xd8\x1d\x66\x70\x6a\x97\x38\xf8\xdf\x3c\x09\xde\xb4\xf5\x20\x4d\x14\xbd\x03\x8a\x5e\xec\xc2\xb2\xa7\x4a\xe9\xe9\x4d\xd4\xe5\x04\x6f\x7e\xec\x77\xec\xab\x9d\x44\x1c\x19\x6d\x8b\x71\xc9\x0d\x6c\xd3\xf5\xed\x5c\xf2\x5c\x08\xad\xa1\x8a\xf1\xdb\x0f\x27\xd7\x51\x8c\xf5\x3c\xdd\x29\xc6\x7f\xa8\x62\x3c\x28\x64\x46\xef\x42\x63\xf4\x6b\x76\xec\xd1\x52\xfe\xa0\xe0\xe3\x3d\x24\x66\x17\xec\x35\x74\x39\x69\x7c\xd7\x22\x21\x87\x69\xd9\x48\xe5\x27\x03\x24\xa7\xb9\xea\x36\xe9\xe6\x59\xf3\x9c\x69\x0c\x67\x0e\x0c\x3d\xeb\x04\x9a\x29\x15\x11\x47\x0a\x95\xf1\x1b\x34\xdc\x8f\xae\x47\x66\x31\x2a\x51\x1c\xd7\x50\x0c\xc5\xa0\x9b\xb7\x7c\x62\x61\x9e\x56\xff\x87\x3d\x16\x2b\x19\x52\xa0\x53\x27\x31\xdf\x3a\x8a\x5a\x33\x3c\xd9\x4f\x35\xa3\x92\x8d\xd2\x38\xac\x2c\x8c\x63\xfb\x1c\x1a\x6a\x0c\x75\x65\x8c\xab\x8c\xf9\x9b\xd8\x3b\x37\xdc\xab\xc3\x7f\x31\xa8\x0d\x78\xbf\x3d\xf7\x57\xb2\x82\xc6\x7d\x66\x90\xf9\x05\x9b\x34\x4f\x38\xae\x26\xd4\xb2\xbe\x8a\x33\x49\xbf\x55\x72\x71\xf9\xc3\x45\x56\x12\x45\x99\x63\x5e\xd4\xfc\xaf\xaa\x80\x39\xf8\xd8\x21\x85\x8a\x76\x30\x07\x1c\xa8\xb7\x2f\x5f\xe0\xca\x71\xfe\x95\xd9\xc3\x61\xae\x60\x02\xab\xe8\xcb\x97\xee\x94\xe2\x65\x36\x32\x09\xa9\xff\x14\x50\x8e\xc6\x99\xdd\x49\xa6\xd1\xbb\xbe\xf8\xb6\x08\x90\xb7\x4a\x25\x05\x2d\xce\xce\x01\x09\x67\x6b\x79\xd3\xba\xd2\xcb\xd6\x43\x18\x2d\x0f\xa5\xce\x97\x8d\xa2\xe8\xe5\x05\x4e\xf8\x6b\xc2\x38\x4e\x30\xf5\x0f\xb2\x34\x93\xe3\x3a\x18\x57\x16\xc8\xc2\xa2\xd2\xde\xa6\x49\x88\xfd\x83\x55\x9a\x9e\xcf\xce\xf0\x22\xa5\xf8\x47\xcc\x38\x4d\xb7\x07\x63\x58\xe4\x89\xca\x22\x5b\x97\x5c\xba\x53\xf9\x63\x29\x78\xef\x7e\x77\x56\x00\xa8\xfe\x7e\x8f\x24\x84\x13\x14\x3b\xb2\x74\xd6\x7e\xff\xa1\xfe\x09\xb6\x06\xd4\xdc\x92\xd3\x38\x58\x21\x56\x0a\xcb\xe9\x6f\xfe\xc7\xdf\x9e\x7e\x7e\x3c\x0a\x1e\x3d\x98\xaa\x04\x79\xb6\x28\x97\xd7\x58\x36\x06\xb1\xb6\x7a\x59\x9b\xfc\x9b\xd3\xf8\xbf\x10\x5b\xb9\xfa\xb1\x90\xc8\x5f\xdd\xe8\xe0\x4b\x8d\xc5\x22\x31\x78\xe4\x7f\x7a\xfa\xe5\xe1\x48\x67\x79\x17\x14\x3f\xfc\xfc\xa8\x20\xf9\xbb\xb6\xdf\x8a\xe8\x44\x26\x13\xd1\xfb\x9f\xa2\xc7\x36\x1e\x67\xb8\x9b\x21\x2c\xc2\x61\x1a\xe1\x0f\xef\x5e\xbd\x30\xbf\xaa\x68\x52\x13\xaa\xed\xe3\x60\xd0\x82\xc1\x29\xc3\xaf\x12\xae\x53\x2f\xab\x3d\xe4\xe0\x55\x07\x53\x57\x7e\x9f\x6a\x77\x6f\xf7\xff\x01\x00\x00\xff\xff\xb6\x05\xd8\xd6\xc0\x7f\x00\x00"), }, "/js/page/setting.js": &vfsgen۰CompressedFileInfo{ name: "setting.js", diff --git a/internal/webserver/handler-api.go b/internal/webserver/handler-api.go index b472f0c..f90e04b 100644 --- a/internal/webserver/handler-api.go +++ b/internal/webserver/handler-api.go @@ -121,14 +121,20 @@ func (h *handler) apiGetBookmarks(w http.ResponseWriter, r *http.Request, ps htt // Get URL queries keyword := r.URL.Query().Get("keyword") - strTags := r.URL.Query().Get("tags") strPage := r.URL.Query().Get("page") + strTags := r.URL.Query().Get("tags") + strExcludedTags := r.URL.Query().Get("exclude") tags := strings.Split(strTags, ",") if len(tags) == 1 && tags[0] == "" { tags = []string{} } + excludedTags := strings.Split(strExcludedTags, ",") + if len(excludedTags) == 1 && excludedTags[0] == "" { + excludedTags = []string{} + } + page, _ := strconv.Atoi(strPage) if page < 1 { page = 1 @@ -136,11 +142,12 @@ func (h *handler) apiGetBookmarks(w http.ResponseWriter, r *http.Request, ps htt // Prepare filter for database searchOptions := database.GetBookmarksOptions{ - Tags: tags, - Keyword: keyword, - Limit: 30, - Offset: (page - 1) * 30, - OrderMethod: database.ByLastAdded, + Tags: tags, + ExcludedTags: excludedTags, + Keyword: keyword, + Limit: 30, + Offset: (page - 1) * 30, + OrderMethod: database.ByLastAdded, } // Calculate max page