Peter Sanchez: 1 Add ability to post links via email. 20 files changed, 2386 insertions(+), 1386 deletions(-)
Copy & paste the following snippet into your terminal to import this patchset into git:
curl -s https://lists.code.netlandish.com/~netlandish/links-dev/patches/210/mbox | git am -3Learn more about email & git
- Enable feature in account settings - You will be given a special email address to use when posting - Support for unread, tags, and visibility Implements: https://todo.code.netlandish.com/~netlandish/links/132 Changelog-added: Ability to post links via email. --- .gitignore | 1 + Makefile | 10 +- accounts/input.go | 14 +- accounts/routes.go | 28 +- api/graph/generated.go | 344 ++- api/graph/model/models_gen.go | 20 +- api/graph/schema.graphqls | 11 + api/graph/schema.resolvers.go | 73 +- cmd/email/main.go | 378 +++ go.mod | 2 +- internal/translations/catalog.go | 2727 +++++++++-------- .../translations/locales/en/out.gotext.json | 42 + .../locales/es/messages.gotext.json | 30 + .../translations/locales/es/out.gotext.json | 30 + models/link_short.go | 2 +- models/qr_codes.go | 2 +- models/user.go | 8 +- models/utils.go | 27 +- templates/profile_edit.html | 14 + templates/settings.html | 9 + 20 files changed, 2386 insertions(+), 1386 deletions(-) create mode 100644 cmd/email/main.go diff --git a/.gitignore b/.gitignore index a5abc1a..d5e72f4 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ db_reset.sh /links-list /links-domains /links-admin +/links-email tmp media fixtures diff --git a/Makefile b/Makefile index 7bee00c..9bc177b 100644 --- a/Makefile +++ b/Makefile @@ -9,14 +9,15 @@ SHORTSRC:=$(shell find ./cmd/short/ -name '*.go') LISTSRC:=$(shell find ./cmd/list/ -name '*.go') DOMSRC:=$(shell find ./cmd/domains/ -name '*.go') ADMSRC:=$(shell find ./cmd/admin/ -name '*.go') +EMAILSRC:=$(shell find ./cmd/email/ -name '*.go') -all: links links-api links-short links-list +all: links links-api links-short links-list links-domains links-email links: $(LINKSRC) rm -f $@ && $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $@ $(LINKSRC) clean: - rm -f ./links ./links-api ./links-short ./links-list ./links-domains ./links-admin + rm -f ./links ./links-api ./links-short ./links-list ./links-domains ./links-admin ./links-email trans: $(GO) generate ./internal/translations/translations.go @@ -39,7 +40,10 @@ links-domains: links-admin: rm -f $@ && $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $@ $(ADMSRC) +links-email: + rm -f $@ && $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $@ $(EMAILSRC) + schema: cd api && $(GO) generate ./graph -.PHONY: all links clean trans test links-api links-short links-list links-domains links-admin schema +.PHONY: all links clean trans test links-api links-short links-list links-domains links-admin links-email schema diff --git a/accounts/input.go b/accounts/input.go index ed1d654..e114803 100644 --- a/accounts/input.go +++ b/accounts/input.go @@ -109,11 +109,13 @@ func (r *RegistrationUserForm) Validate(c echo.Context) error { // ProfileForm ... type ProfileForm struct { - Name string - DefaultLang string - Timezone string - DefaultTagOrder string - DeleteImage bool `form:"delete"` + Name string + DefaultLang string + Timezone string + DefaultTagOrder string + DeleteImage bool `form:"delete"` + EmailPostEnabled bool `form:"email_post_enabled"` + RegenerateEmailPostCode bool `form:"regenerate_email_post_code"` } // Validate ... @@ -125,6 +127,8 @@ func (p *ProfileForm) Validate(c echo.Context) error { String("timezone", &p.Timezone). String("tag_order", &p.DefaultTagOrder). Bool("delete", &p.DeleteImage). + Bool("email_post_enabled", &p.EmailPostEnabled). + Bool("regenerate_email_post_code", &p.RegenerateEmailPostCode). BindErrors() if errs != nil { return validate.GetInputErrors(errs) diff --git a/accounts/routes.go b/accounts/routes.go index fe7f723..3b97912 100644 --- a/accounts/routes.go +++ b/accounts/routes.go @@ -78,6 +78,11 @@ func (s *Service) EditProfile(c echo.Context) error { pd.Data["image"] = lt.Translate("Image") pd.Data["back"] = lt.Translate("Back") pd.Data["cancel"] = lt.Translate("Cancel") + pd.Data["delete_picture"] = lt.Translate("Delete picture") + pd.Data["email_posting"] = lt.Translate("Email Posting") + pd.Data["enable_email_posting"] = lt.Translate("Enable email posting") + pd.Data["regenerate_code"] = lt.Translate("Regenerate code") + pd.Data["email_posting_help"] = lt.Translate("When enabled, you can add links by sending an email to a special address.") user := gctx.User.(*models.User) @@ -160,14 +165,17 @@ func (s *Service) EditProfile(c echo.Context) error { var result GraphQLResponse op := gqlclient.NewOperation( `mutation UpdateProfile($name: String!, $lang: String!, $tz: String!, $to: CloudOrderType!, - $image: Upload, $deleteImg: Boolean) { + $image: Upload, $deleteImg: Boolean, $emailPostEnabled: Boolean, + $regenerateEmailPostCode: Boolean) { updateProfile(input: { name: $name, defaultLang: $lang, timezone: $tz, defaultTagOrder: $to, image: $image, - deleteImg: $deleteImg + deleteImg: $deleteImg, + emailPostEnabled: $emailPostEnabled, + regenerateEmailPostCode: $regenerateEmailPostCode }) { id } @@ -177,6 +185,8 @@ func (s *Service) EditProfile(c echo.Context) error { op.Var("tz", form.Timezone) op.Var("to", form.DefaultTagOrder) op.Var("deleteImg", form.DeleteImage) + op.Var("emailPostEnabled", form.EmailPostEnabled) + op.Var("regenerateEmailPostCode", form.RegenerateEmailPostCode) image, err := c.FormFile("image") if err != nil { @@ -215,10 +225,11 @@ func (s *Service) EditProfile(c echo.Context) error { } form := ProfileForm{ - DefaultLang: defaultLang, - Timezone: defaultTZ, - DefaultTagOrder: defaultTagOrder, - Name: user.Name, + DefaultLang: defaultLang, + Timezone: defaultTZ, + DefaultTagOrder: defaultTagOrder, + Name: user.Name, + EmailPostEnabled: user.Settings.Account.EmailPostEnabled, } gmap["form"] = form @@ -258,6 +269,8 @@ func (s *Service) Settings(c echo.Context) error { pd.Data["add_to_linktaco"] = lt.Translate("Add to LinkTaco") pd.Data["special_link"] = lt.Translate("This special link allows you to save to LinkTaco directly by using a bookmark in your web browser.") pd.Data["drag_drop"] = lt.Translate("Drag and drop this button to your web browser toolbar or your bookmarks.") + pd.Data["email_posting"] = lt.Translate("Email Posting") + pd.Data["email_posting_warning"] = lt.Translate("Do not share this address. Anyone with this email can post links to your account.") user := gctx.User.(*models.User) langTrans := map[string]string{ @@ -303,6 +316,8 @@ func (s *Service) Settings(c echo.Context) error { org = &result.Orgs[0] } + emailPostDomain, _ := gctx.Server.Config.File.Get("links", "links-service-domain") + gmap := gobwebs.Map{ "pd": pd, "user": user, @@ -314,6 +329,7 @@ func (s *Service) Settings(c echo.Context) error { "langTrans": langTrans, "orderTrans": orderTrans, "navFlag": "settings", + "emailPostDomain": emailPostDomain, } return s.Render(c, http.StatusOK, "settings.html", gmap) } diff --git a/api/graph/generated.go b/api/graph/generated.go index da51bab..f072f47 100644 --- a/api/graph/generated.go +++ b/api/graph/generated.go @@ -162,6 +162,11 @@ type ComplexityRoot struct { Result func(childComplexity int) int } + EmailPostUser struct { + Organizations func(childComplexity int) int + User func(childComplexity int) int + } + HTMLMeta struct { Description func(childComplexity int) int Image func(childComplexity int) int @@ -431,6 +436,7 @@ type ComplexityRoot struct { GetUser func(childComplexity int, id int) int GetUsers func(childComplexity int, input *model.GetUserInput) int Me func(childComplexity int) int + VerifyEmailPostCode func(childComplexity int, code string) int Version func(childComplexity int) int } @@ -584,6 +590,7 @@ type QueryResolver interface { GetFeed(ctx context.Context, input *model.GetFeedInput) (*model.OrgLinkCursor, error) GetFeedFollowing(ctx context.Context) ([]*models.Organization, error) GetAuditLogs(ctx context.Context, input *model.AuditLogInput) (*model.AuditLogCursor, error) + VerifyEmailPostCode(ctx context.Context, code string) (*model.EmailPostUser, error) GetUsers(ctx context.Context, input *model.GetUserInput) (*model.UserCursor, error) GetUser(ctx context.Context, id int) (*models.User, error) GetAdminOrganizations(ctx context.Context, input *model.GetAdminOrganizationsInput) (*model.OrganizationCursor, error) @@ -1041,6 +1048,20 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.DomainCursor.Result(childComplexity), true + case "EmailPostUser.organizations": + if e.complexity.EmailPostUser.Organizations == nil { + break + } + + return e.complexity.EmailPostUser.Organizations(childComplexity), true + + case "EmailPostUser.user": + if e.complexity.EmailPostUser.User == nil { + break + } + + return e.complexity.EmailPostUser.User(childComplexity), true + case "HTMLMeta.description": if e.complexity.HTMLMeta.Description == nil { break @@ -2718,6 +2739,18 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Query.Me(childComplexity), true + case "Query.verifyEmailPostCode": + if e.complexity.Query.VerifyEmailPostCode == nil { + break + } + + args, err := ec.field_Query_verifyEmailPostCode_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.VerifyEmailPostCode(childComplexity, args["code"].(string)), true + case "Query.version": if e.complexity.Query.Version == nil { break @@ -3836,6 +3869,17 @@ func (ec *executionContext) field_Query_getUsers_args(ctx context.Context, rawAr return args, nil } +func (ec *executionContext) field_Query_verifyEmailPostCode_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "code", ec.unmarshalNString2string) + if err != nil { + return nil, err + } + args["code"] = arg0 + return args, nil +} + func (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -6946,6 +6990,140 @@ func (ec *executionContext) fieldContext_DomainCursor_pageInfo(_ context.Context return fc, nil } +func (ec *executionContext) _EmailPostUser_user(ctx context.Context, field graphql.CollectedField, obj *model.EmailPostUser) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailPostUser_user(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.User, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*models.User) + fc.Result = res + return ec.marshalNUser2ᚖlinksᚋmodelsᚐUser(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EmailPostUser_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EmailPostUser", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "name": + return ec.fieldContext_User_name(ctx, field) + case "email": + return ec.fieldContext_User_email(ctx, field) + case "createdOn": + return ec.fieldContext_User_createdOn(ctx, field) + case "isEmailVerified": + return ec.fieldContext_User_isEmailVerified(ctx, field) + case "isLocked": + return ec.fieldContext_User_isLocked(ctx, field) + case "lockReason": + return ec.fieldContext_User_lockReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _EmailPostUser_organizations(ctx context.Context, field graphql.CollectedField, obj *model.EmailPostUser) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EmailPostUser_organizations(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Organizations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*models.Organization) + fc.Result = res + return ec.marshalNOrganization2ᚕᚖlinksᚋmodelsᚐOrganizationᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EmailPostUser_organizations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EmailPostUser", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Organization_id(ctx, field) + case "ownerId": + return ec.fieldContext_Organization_ownerId(ctx, field) + case "orgType": + return ec.fieldContext_Organization_orgType(ctx, field) + case "name": + return ec.fieldContext_Organization_name(ctx, field) + case "slug": + return ec.fieldContext_Organization_slug(ctx, field) + case "image": + return ec.fieldContext_Organization_image(ctx, field) + case "imageUrl": + return ec.fieldContext_Organization_imageUrl(ctx, field) + case "timezone": + return ec.fieldContext_Organization_timezone(ctx, field) + case "settings": + return ec.fieldContext_Organization_settings(ctx, field) + case "isActive": + return ec.fieldContext_Organization_isActive(ctx, field) + case "visibility": + return ec.fieldContext_Organization_visibility(ctx, field) + case "createdOn": + return ec.fieldContext_Organization_createdOn(ctx, field) + case "updatedOn": + return ec.fieldContext_Organization_updatedOn(ctx, field) + case "ownerName": + return ec.fieldContext_Organization_ownerName(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Organization", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _HTMLMeta_title(ctx context.Context, field graphql.CollectedField, obj *models.HTMLMeta) (ret graphql.Marshaler) { fc, err := ec.fieldContext_HTMLMeta_title(ctx, field) if err != nil { @@ -20226,6 +20404,86 @@ func (ec *executionContext) fieldContext_Query_getAuditLogs(ctx context.Context, return fc, nil } +func (ec *executionContext) _Query_verifyEmailPostCode(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_verifyEmailPostCode(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + directive0 := func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().VerifyEmailPostCode(rctx, fc.Args["code"].(string)) + } + + directive1 := func(ctx context.Context) (any, error) { + if ec.directives.Internal == nil { + var zeroVal *model.EmailPostUser + return zeroVal, errors.New("directive internal is not implemented") + } + return ec.directives.Internal(ctx, nil, directive0) + } + + tmp, err := directive1(rctx) + if err != nil { + return nil, graphql.ErrorOnPath(ctx, err) + } + if tmp == nil { + return nil, nil + } + if data, ok := tmp.(*model.EmailPostUser); ok { + return data, nil + } + return nil, fmt.Errorf(`unexpected type %T from directive, should be *links/api/graph/model.EmailPostUser`, tmp) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*model.EmailPostUser) + fc.Result = res + return ec.marshalOEmailPostUser2ᚖlinksᚋapiᚋgraphᚋmodelᚐEmailPostUser(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_verifyEmailPostCode(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "user": + return ec.fieldContext_EmailPostUser_user(ctx, field) + case "organizations": + return ec.fieldContext_EmailPostUser_organizations(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EmailPostUser", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_verifyEmailPostCode_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_getUsers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_getUsers(ctx, field) if err != nil { @@ -25951,7 +26209,7 @@ func (ec *executionContext) unmarshalInputProfileInput(ctx context.Context, obj asMap[k] = v } - fieldsInOrder := [...]string{"name", "defaultLang", "timezone", "image", "deleteImg", "defaultTagOrder"} + fieldsInOrder := [...]string{"name", "defaultLang", "timezone", "image", "deleteImg", "defaultTagOrder", "emailPostEnabled", "regenerateEmailPostCode"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -26000,6 +26258,20 @@ func (ec *executionContext) unmarshalInputProfileInput(ctx context.Context, obj return it, err } it.DefaultTagOrder = data + case "emailPostEnabled": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("emailPostEnabled")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err + } + it.EmailPostEnabled = data + case "regenerateEmailPostCode": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("regenerateEmailPostCode")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err + } + it.RegenerateEmailPostCode = data } } @@ -27573,6 +27845,50 @@ func (ec *executionContext) _DomainCursor(ctx context.Context, sel ast.Selection return out } +var emailPostUserImplementors = []string{"EmailPostUser"} + +func (ec *executionContext) _EmailPostUser(ctx context.Context, sel ast.SelectionSet, obj *model.EmailPostUser) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, emailPostUserImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("EmailPostUser") + case "user": + out.Values[i] = ec._EmailPostUser_user(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "organizations": + out.Values[i] = ec._EmailPostUser_organizations(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var hTMLMetaImplementors = []string{"HTMLMeta"} func (ec *executionContext) _HTMLMeta(ctx context.Context, sel ast.SelectionSet, obj *models.HTMLMeta) graphql.Marshaler { @@ -30062,6 +30378,25 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "verifyEmailPostCode": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_verifyEmailPostCode(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "getUsers": field := field @@ -32635,6 +32970,13 @@ func (ec *executionContext) marshalODomainService2ᚖlinksᚋapiᚋgraphᚋmodel return v } +func (ec *executionContext) marshalOEmailPostUser2ᚖlinksᚋapiᚋgraphᚋmodelᚐEmailPostUser(ctx context.Context, sel ast.SelectionSet, v *model.EmailPostUser) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._EmailPostUser(ctx, sel, v) +} + func (ec *executionContext) unmarshalOGetAdminDomainInput2ᚖlinksᚋapiᚋgraphᚋmodelᚐGetAdminDomainInput(ctx context.Context, v any) (*model.GetAdminDomainInput, error) { if v == nil { return nil, nil diff --git a/api/graph/model/models_gen.go b/api/graph/model/models_gen.go index 6f7fb46..c70c0ee 100644 --- a/api/graph/model/models_gen.go +++ b/api/graph/model/models_gen.go @@ -157,6 +157,12 @@ type DomainInput struct { MigrateLinks *bool `json:"migrateLinks,omitempty"` } +// Response type for email posting code verification +type EmailPostUser struct { + User *models.User `json:"user"` + Organizations []*models.Organization `json:"organizations"` +} + type GetAdminDomainInput struct { Limit *int `json:"limit,omitempty"` After *Cursor `json:"after,omitempty"` @@ -397,12 +403,14 @@ type PopularLinksInput struct { } type ProfileInput struct { - Name string `json:"name"` - DefaultLang string `json:"defaultLang"` - Timezone string `json:"timezone"` - Image *graphql.Upload `json:"image,omitempty"` - DeleteImg *bool `json:"deleteImg,omitempty"` - DefaultTagOrder CloudOrderType `json:"defaultTagOrder"` + Name string `json:"name"` + DefaultLang string `json:"defaultLang"` + Timezone string `json:"timezone"` + Image *graphql.Upload `json:"image,omitempty"` + DeleteImg *bool `json:"deleteImg,omitempty"` + DefaultTagOrder CloudOrderType `json:"defaultTagOrder"` + EmailPostEnabled *bool `json:"emailPostEnabled,omitempty"` + RegenerateEmailPostCode *bool `json:"regenerateEmailPostCode,omitempty"` } type QRObject struct { diff --git a/api/graph/schema.graphqls b/api/graph/schema.graphqls index 87db7d3..3f209c8 100644 --- a/api/graph/schema.graphqls +++ b/api/graph/schema.graphqls @@ -64,6 +64,12 @@ type Version { deprecationDate: Time } +"Response type for email posting code verification" +type EmailPostUser { + user: User! + organizations: [Organization!]! +} + enum DomainLevel { SYSTEM USER @@ -717,6 +723,8 @@ input ProfileInput { image: Upload deleteImg: Boolean defaultTagOrder: CloudOrderType! + emailPostEnabled: Boolean + regenerateEmailPostCode: Boolean } input UpdateUserInput { @@ -912,6 +920,9 @@ type Query { "Returns audit log entries for given parameters" getAuditLogs(input: AuditLogInput): AuditLogCursor! @access(scope: PROFILE, kind: RO) + "Verify email posting code and return user with their writable organizations" + verifyEmailPostCode(code: String!): EmailPostUser @internal + # # Admin only. Not open to public calls # diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go index eeaf12e..12126b0 100644 --- a/api/graph/schema.resolvers.go +++ b/api/graph/schema.resolvers.go @@ -1911,6 +1911,30 @@ func (r *mutationResolver) UpdateProfile(ctx context.Context, input *model.Profi user.Settings.Account.Timezone = input.Timezone user.Settings.Account.DefaultTagOrder = string(input.DefaultTagOrder) + if input.EmailPostEnabled != nil { + if *input.EmailPostEnabled { + needsNewCode := user.Settings.Account.EmailPostCode == "" || + (input.RegenerateEmailPostCode != nil && *input.RegenerateEmailPostCode) + if needsNewCode { + _, err := models.GenerateEmailPostCode(ctx, user, true) + if err != nil { + return nil, err + } + } else { + user.Settings.Account.EmailPostEnabled = true + } + } else { + user.Settings.Account.EmailPostEnabled = false + } + } else if input.RegenerateEmailPostCode != nil && *input.RegenerateEmailPostCode { + if user.Settings.Account.EmailPostEnabled { + _, err := models.GenerateEmailPostCode(ctx, user, true) + if err != nil { + return nil, err + } + } + } + err := user.Store(ctx) if err != nil { return nil, err @@ -5082,8 +5106,8 @@ func (r *qRCodeResolver) ImageURL(ctx context.Context, obj *models.QRCode) (*str func (r *queryResolver) Version(ctx context.Context) (*model.Version, error) { return &model.Version{ Major: 0, - Minor: 9, - Patch: 2, + Minor: 10, + Patch: 0, DeprecationDate: nil, }, nil } @@ -7048,6 +7072,51 @@ func (r *queryResolver) GetAuditLogs(ctx context.Context, input *model.AuditLogI return &model.AuditLogCursor{Result: alogs, PageInfo: pageInfo}, nil } +// VerifyEmailPostCode is the resolver for the verifyEmailPostCode field. +func (r *queryResolver) VerifyEmailPostCode(ctx context.Context, code string) (*model.EmailPostUser, error) { + if code == "" { + return nil, nil + } + + opts := &database.FilterOptions{ + Filter: sq.And{ + sq.Expr("u.settings->'account'->>'email_post_code' = ?", code), + sq.Expr("(u.settings->'account'->>'email_post_enabled')::boolean = true"), + }, + Limit: 1, + } + users, err := models.GetUsers(ctx, opts) + if err != nil { + return nil, err + } + if len(users) == 0 { + return nil, nil + } + user := users[0] + + allOrgs, err := user.GetOrgs(ctx, models.OrgUserPermissionWrite) + if err != nil { + return nil, err + } + + srv := server.ForContext(ctx) + var paidOrgs []*models.Organization + for _, org := range allOrgs { + if !links.BillingEnabled(srv.Config) || !org.IsRestricted([]string{models.BillingStatusFree}) { + paidOrgs = append(paidOrgs, org) + } + } + + if len(paidOrgs) == 0 { + return nil, nil + } + + return &model.EmailPostUser{ + User: user, + Organizations: paidOrgs, + }, nil +} + // GetUsers is the resolver for the ADMIN AREA getUsers field. func (r *queryResolver) GetUsers(ctx context.Context, input *model.GetUserInput) (*model.UserCursor, error) { if input == nil { diff --git a/cmd/email/main.go b/cmd/email/main.go new file mode 100644 index 0000000..f1879fb --- /dev/null +++ b/cmd/email/main.go @@ -0,0 +1,378 @@ +package main + +import ( + "bufio" + "context" + "flag" + "fmt" + "io" + "log" + "mime" + "net/http" + "os" + "regexp" + "strings" + "time" + + "git.sr.ht/~emersion/gqlclient" + "github.com/emersion/go-message/mail" + oauth2 "netlandish.com/x/gobwebs-oauth2" + "netlandish.com/x/gobwebs/config" + "netlandish.com/x/gobwebs/crypto" +) + +var ( + configPath = flag.String("config", "./config.ini", "Path to config file") + logPath = flag.String("log", "", "Path to log file (default: stderr)") + + urlRegex = regexp.MustCompile(`https?://\S+`) + codeRegex = regexp.MustCompile(`post\+([a-zA-Z0-9]+)@`) +) + +type parsedEmail struct { + Code string + Title string + URL string + Description string + Unread bool + Public bool + Starred bool + Archive bool + OrgSlug string + Tags string +} + +func main() { + flag.Parse() + + var logger *log.Logger + if *logPath != "" { + f, err := os.OpenFile(*logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to open log file: %v\n", err) + os.Exit(1) + } + defer f.Close() + logger = log.New(f, "", log.LstdFlags) + } else { + logger = log.New(os.Stderr, "", log.LstdFlags) + } + + if err := run(logger); err != nil { + logger.Printf("Error: %v", err) + os.Exit(1) + } +} + +func run(logger *log.Logger) error { + cfg, err := config.LoadConfig(*configPath) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + + entropy, ok := cfg.File.Get("access", "entropy") + if !ok { + return fmt.Errorf("no access entropy set") + } + + apiOrigin, ok := cfg.File.Get("links", "api-origin") + if !ok { + apiOrigin = "http://127.0.0.1:8003/query" + } + + parsed, err := parseEmail(os.Stdin) + if err != nil { + return fmt.Errorf("failed to parse email: %w", err) + } + + if parsed.Code == "" { + return fmt.Errorf("no email post code found in To address") + } + + if parsed.URL == "" { + return fmt.Errorf("no URL found in email body") + } + + ctx := context.Background() + ctx = crypto.Context(ctx, entropy) + + client := newInternalClient(ctx, apiOrigin) + + user, orgs, err := verifyCode(ctx, client, parsed.Code) + if err != nil { + return fmt.Errorf("failed to verify code: %w", err) + } + if user == nil { + return fmt.Errorf("invalid code or user not eligible") + } + + orgSlug := parsed.OrgSlug + if orgSlug == "" { + for _, org := range orgs { + if org.OrgType == "USER" { + orgSlug = org.Slug + break + } + } + } else { + var found bool + for _, org := range orgs { + if strings.EqualFold(org.Slug, orgSlug) { + found = true + orgSlug = org.Slug + break + } + } + if !found { + return fmt.Errorf("org '%s' not found or user lacks write access", parsed.OrgSlug) + } + } + + if orgSlug == "" { + return fmt.Errorf("could not determine target organization") + } + + visibility := "PUBLIC" + if !parsed.Public { + visibility = "PRIVATE" + } + + err = addLink(ctx, client, addLinkInput{ + URL: parsed.URL, + Title: parsed.Title, + Description: parsed.Description, + Visibility: visibility, + Unread: parsed.Unread, + Starred: parsed.Starred, + Archive: parsed.Archive, + OrgSlug: orgSlug, + Tags: parsed.Tags, + }) + if err != nil { + return fmt.Errorf("failed to add link: %w", err) + } + + logger.Printf("Successfully added link for user %d to org %s: %s", user.ID, orgSlug, parsed.URL) + return nil +} + +func parseEmail(r io.Reader) (*parsedEmail, error) { + mr, err := mail.CreateReader(r) + if err != nil { + return nil, err + } + + parsed := &parsedEmail{ + Public: true, + Unread: false, + } + + header := mr.Header + to, _ := header.Text("To") + if matches := codeRegex.FindStringSubmatch(to); len(matches) > 1 { + parsed.Code = matches[1] + } + + subject, _ := header.Subject() + parsed.Title = subject + + var body string + for { + part, err := mr.NextPart() + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + + contentType, _, _ := mime.ParseMediaType(part.Header.Get("Content-Type")) + if contentType == "text/plain" { + b, err := io.ReadAll(part.Body) + if err != nil { + return nil, err + } + body = string(b) + break + } + } + + if body == "" { + return nil, fmt.Errorf("no text/plain content found in email") + } + + var blankCount int + var descLines []string + scanner := bufio.NewScanner(strings.NewReader(body)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + blankCount++ + if blankCount > 1 { + break + } + continue + } + + blankCount = 0 + lower := strings.ToLower(line) + if strings.HasPrefix(lower, "unread:") { + val := strings.TrimSpace(line[7:]) + parsed.Unread = val == "true" || val == "yes" || val == "1" + } else if strings.HasPrefix(lower, "public:") { + val := strings.TrimSpace(line[7:]) + parsed.Public = val == "true" || val == "yes" || val == "1" + } else if strings.HasPrefix(lower, "starred:") { + val := strings.TrimSpace(line[8:]) + parsed.Starred = val == "true" || val == "yes" || val == "1" + } else if strings.HasPrefix(lower, "archive:") { + val := strings.TrimSpace(line[8:]) + parsed.Archive = val == "true" || val == "yes" || val == "1" + } else if strings.HasPrefix(lower, "org:") { + parsed.OrgSlug = strings.TrimSpace(line[4:]) + } else if strings.HasPrefix(lower, "tags:") { + parsed.Tags = strings.TrimSpace(line[5:]) + } else if parsed.URL == "" && urlRegex.MatchString(line) { + parsed.URL = urlRegex.FindString(line) + } else { + descLines = append(descLines, line) + } + } + + parsed.Description = strings.Join(descLines, "\n") + return parsed, nil +} + +type httpTransport struct { + headers map[string]string +} + +func (h *httpTransport) AddHeader(k, v string) { + if h.headers == nil { + h.headers = make(map[string]string) + } + h.headers[k] = v +} + +func (h *httpTransport) RoundTrip(req *http.Request) (*http.Response, error) { + for k, v := range h.headers { + req.Header.Set(k, v) + } + return http.DefaultTransport.RoundTrip(req) +} + +func newInternalClient(ctx context.Context, apiOrigin string) *gqlclient.Client { + trans := &httpTransport{} + + issued := time.Now().UTC() + expires := issued.Add(30 * time.Second) + grant := oauth2.BearerToken{ + Version: oauth2.TokenVersion, + Issued: oauth2.ToTimestamp(issued), + Expires: oauth2.ToTimestamp(expires), + Grants: "", + ClientID: "", + Type: "INTERNAL", + } + + token := grant.Encode(ctx) + trans.AddHeader("Authorization", fmt.Sprintf("Internal %s", token)) + + httpClient := &http.Client{ + Transport: trans, + Timeout: 30 * time.Second, + } + + return gqlclient.New(apiOrigin, httpClient) +} + +type verifyResponse struct { + User *userInfo `json:"user"` + Organizations []*orgInfo `json:"organizations"` +} + +type userInfo struct { + ID int `json:"id"` + Email string `json:"email"` +} + +type orgInfo struct { + ID int `json:"id"` + Slug string `json:"slug"` + OrgType string `json:"orgType"` +} + +func verifyCode(ctx context.Context, client *gqlclient.Client, code string) (*userInfo, []*orgInfo, error) { + op := gqlclient.NewOperation(` + query verifyEmailPostCode($code: String!) { + verifyEmailPostCode(code: $code) { + user { id email } + organizations { id slug orgType } + } + } + `) + op.Var("code", code) + + var resp struct { + VerifyEmailPostCode *verifyResponse + } + + if err := client.Execute(ctx, op, &resp); err != nil { + return nil, nil, err + } + + if resp.VerifyEmailPostCode == nil { + return nil, nil, nil + } + + return resp.VerifyEmailPostCode.User, resp.VerifyEmailPostCode.Organizations, nil +} + +type addLinkInput struct { + URL string + Title string + Description string + Visibility string + Unread bool + Starred bool + Archive bool + OrgSlug string + Tags string +} + +func addLink(ctx context.Context, client *gqlclient.Client, input addLinkInput) error { + op := gqlclient.NewOperation(` + mutation addLink($input: LinkInput) { + addLink(input: $input) { id } + } + `) + + vars := map[string]any{ + "url": input.URL, + "title": input.Title, + "visibility": input.Visibility, + "unread": input.Unread, + "starred": input.Starred, + "archive": input.Archive, + "orgSlug": input.OrgSlug, + "override": true, + "parseBaseUrl": input.Visibility == "PUBLIC", + } + + if input.Description != "" { + vars["description"] = input.Description + } + if input.Tags != "" { + vars["tags"] = input.Tags + } + + op.Var("input", vars) + + var resp struct { + AddLink struct { + ID int `json:"id"` + } + } + + return client.Execute(ctx, op, &resp) +} diff --git a/go.mod b/go.mod index d01a2e8..1bea701 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/Masterminds/squirrel v1.5.4 github.com/alexedwards/scs/postgresstore v0.0.0-20250212122300-421ef1d8611c github.com/alexedwards/scs/v2 v2.8.0 + github.com/emersion/go-message v0.18.2 github.com/jarcoal/httpmock v1.3.0 github.com/labstack/echo/v4 v4.13.3 github.com/lib/pq v1.10.9 @@ -67,7 +68,6 @@ require ( github.com/dlclark/regexp2 v1.11.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09 // indirect - github.com/emersion/go-message v0.18.2 // indirect github.com/emersion/go-pgpmail v0.2.1 // indirect github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 // indirect github.com/emersion/go-smtp v0.24.0 // indirect diff --git a/internal/translations/catalog.go b/internal/translations/catalog.go index 2fe2d7f..9e90222 100644 --- a/internal/translations/catalog.go +++ b/internal/translations/catalog.go @@ -39,731 +39,737 @@ func init() { } var messageKeyToIndex = map[string]int{ - " you can host your own instance if you'd like full control over your own platform.": 424, - "%s": 449, - "%s Links": 544, - "%s: domain not found": 697, - "- LinkTaco Team": 349, - "100%% open source project": 423, - "A link was successfully created.": 501, - "A list was successfully created.": 637, - "A new link was created succesfully": 678, - "A new member invitation was sent to %s": 173, - "A new register invitation was sent to %s": 171, - "A new short was created succesfully": 676, - "A new window called Library will open": 577, - "A valid Organizaiton Slug is required.": 265, - "API Powered": 404, - "About": 605, - "Access Restricted": 285, - "Access denied.": 286, + " you can host your own instance if you'd like full control over your own platform.": 430, + "%s": 455, + "%s Links": 550, + "%s: domain not found": 703, + "- LinkTaco Team": 355, + "100%% open source project": 429, + "A link was successfully created.": 507, + "A list was successfully created.": 643, + "A new link was created succesfully": 684, + "A new member invitation was sent to %s": 179, + "A new register invitation was sent to %s": 177, + "A new short was created succesfully": 682, + "A new window called Library will open": 583, + "A valid Organizaiton Slug is required.": 271, + "API Powered": 410, + "About": 611, + "Access Restricted": 291, + "Access denied.": 292, "Action": 11, - "Actions": 47, - "Add": 317, - "Add Link": 703, - "Add Member": 475, - "Add OAuth2 Client": 319, - "Add Personal Access Token": 306, - "Add to LinkTaco": 55, - "Add unlimited members to organization": 394, - "Admin": 615, - "Admin Write": 480, - "Advanced Search": 517, - "Advanced filtering/search": 371, - "All": 529, - "All Types": 530, - "Already have an account? Click here to login": 65, - "An invitation was sent to this user": 481, - "An note was successfully created.": 598, - "An short link was successfully created.": 690, - "Analytics": 113, - "Apply": 119, - "Approve": 344, - "Archive": 537, - "Archive URL": 498, - "As system admin run this command in the channel you want to connect": 570, + "Actions": 52, + "Add": 323, + "Add Link": 709, + "Add Member": 481, + "Add OAuth2 Client": 325, + "Add Personal Access Token": 312, + "Add to LinkTaco": 60, + "Add unlimited members to organization": 400, + "Admin": 621, + "Admin Write": 486, + "Advanced Search": 523, + "Advanced filtering/search": 377, + "All": 535, + "All Types": 536, + "Already have an account? Click here to login": 71, + "An invitation was sent to this user": 487, + "An note was successfully created.": 604, + "An short link was successfully created.": 696, + "Analytics": 119, + "Apply": 125, + "Approve": 350, + "Archive": 543, + "Archive URL": 504, + "As system admin run this command in the channel you want to connect": 576, "Audit Log": 7, - "Authorize": 339, - "Authorized Clients": 302, + "Authorize": 345, + "Authorized Clients": 308, "Back": 27, - "Back Home": 291, - "BaseURL Not Found": 277, - "Blog": 617, - "Bookmark '%s' on LinkTaco.com": 550, - "Bookmark successfully deleted": 554, - "Bookmarklet": 54, - "Bookmarks": 366, - "Browser bookmark widget": 436, - "Build Your Own Integration": 397, - "Business": 358, - "By": 514, - "CNAME record for domain is incorrect": 216, + "Back Home": 297, + "BaseURL Not Found": 283, + "Blog": 623, + "Bookmark '%s' on LinkTaco.com": 556, + "Bookmark successfully deleted": 560, + "Bookmarklet": 59, + "Bookmarks": 372, + "Browser bookmark widget": 442, + "Build Your Own Integration": 403, + "Business": 364, + "By": 520, + "CNAME record for domain is incorrect": 222, "Cancel": 28, - "Categories": 604, - "Change Email": 92, - "Change Password": 71, - "Change password": 48, - "Chrome Bookmarks": 591, - "City": 116, - "City analytics": 391, - "Clear": 520, - "Click analytics": 388, - "Click here to upgrade": 123, - "Click on Manage Bookmarks from the Bookmarks menu": 576, - "Click on on Export Bookmarks": 585, - "Click on the icon that has two arrows (up and down) and choose 'Export Bookmarks to HTML'": 579, - "Client Applications": 612, - "Client Description": 320, - "Client ID": 315, - "Client Name": 303, - "Client Secret": 323, - "Client URL": 322, - "Clients": 314, - "Code is invalid.": 246, - "Collaboration": 430, - "Collaboration / Integrations": 393, - "Comment": 297, - "Complete Registration": 58, - "Confirm": 109, - "Confirm New Password": 74, - "Confirm Password": 64, - "Confirm your email address": 111, - "Confirmation Not Found": 179, - "Confirmation User Not Found": 198, - "Confirmation key is required.": 178, - "Connect": 572, - "Connect Mattermost": 656, - "Connect User": 662, - "Connect to Slack Workspace": 710, - "Connected": 573, + "Categories": 610, + "Change Email": 98, + "Change Password": 77, + "Change password": 53, + "Chrome Bookmarks": 597, + "City": 122, + "City analytics": 397, + "Clear": 526, + "Click analytics": 394, + "Click here to upgrade": 129, + "Click on Manage Bookmarks from the Bookmarks menu": 582, + "Click on on Export Bookmarks": 591, + "Click on the icon that has two arrows (up and down) and choose 'Export Bookmarks to HTML'": 585, + "Client Applications": 618, + "Client Description": 326, + "Client ID": 321, + "Client Name": 309, + "Client Secret": 329, + "Client URL": 328, + "Clients": 320, + "Code is invalid.": 252, + "Collaboration": 436, + "Collaboration / Integrations": 399, + "Comment": 303, + "Complete Registration": 64, + "Confirm": 115, + "Confirm New Password": 80, + "Confirm Password": 70, + "Confirm your email address": 117, + "Confirmation Not Found": 185, + "Confirmation User Not Found": 204, + "Confirmation key is required.": 184, + "Connect": 578, + "Connect Mattermost": 662, + "Connect User": 668, + "Connect to Slack Workspace": 716, + "Connected": 579, "Continue to Upgrade": 2, - "Count": 31, - "Count (reverse)": 32, - "Country": 115, - "Country analytics": 390, - "Create": 646, - "Create Domain": 444, - "Create Link": 491, - "Create Links": 625, - "Create List": 636, - "Create Note": 597, - "Create Organization": 465, - "Create QR Code": 645, - "Create Short Link": 687, - "Create link listings (ie, social media bios, etc.)": 375, - "Creation Date": 640, - "Current Organization": 44, - "Current Password": 72, - "Current password given is incorrect": 717, - "CurrentSlug is required": 136, - "Custom background image": 648, - "Custom domain + SSL": 373, - "Date Created": 34, - "Date Created (reverse)": 35, - "Days": 121, - "Default Bookmark Visibility": 467, + "Count": 36, + "Count (reverse)": 37, + "Country": 121, + "Country analytics": 396, + "Create": 652, + "Create Domain": 450, + "Create Link": 497, + "Create Links": 631, + "Create List": 642, + "Create Note": 603, + "Create Organization": 471, + "Create QR Code": 651, + "Create Short Link": 693, + "Create link listings (ie, social media bios, etc.)": 381, + "Creation Date": 646, + "Current Organization": 49, + "Current Password": 78, + "Current password given is incorrect": 723, + "CurrentSlug is required": 142, + "Custom background image": 654, + "Custom domain + SSL": 379, + "Date Created": 39, + "Date Created (reverse)": 40, + "Days": 127, + "Default Bookmark Visibility": 473, "Default Lang": 21, - "Default Language": 42, + "Default Language": 47, "Default Tag Order": 23, - "DefaultLang is required": 199, - "DefaultTagOrder is required": 201, - "Delete": 438, - "Delete Bookmark": 552, - "Delete Domain": 448, - "Delete List": 621, - "Delete Org Member": 483, - "Delete Picture": 631, - "Delete QR Code": 563, - "Delete Short Link": 693, - "Delete member %s (%s) from Organization %s?": 486, - "Description": 333, - "Description is required.": 161, + "DefaultLang is required": 205, + "DefaultTagOrder is required": 207, + "Delete": 444, + "Delete Bookmark": 558, + "Delete Domain": 454, + "Delete List": 627, + "Delete Org Member": 489, + "Delete Picture": 637, + "Delete QR Code": 569, + "Delete Short Link": 699, + "Delete member %s (%s) from Organization %s?": 492, + "Delete picture": 29, + "Description": 339, + "Description is required.": 167, "Details": 12, - "Device analytics": 392, - "Devices": 118, - "Disabled": 458, - "Disconnect": 571, - "Disconnect Mattermost": 653, - "Disconnect Slack": 704, - "Do you really want to disconnect this organization from mattermost": 655, - "Do you really want to disconnect this organization from slack": 706, - "Do you really whant to delete this bookmark?": 555, - "Do you really whant to delete this domain": 452, - "Do you really whant to delete this link": 624, - "Do you really whant to delete this list": 644, - "Do you really whant to delete this qr code": 566, - "Do you want to connect this organization to mattermost?": 658, - "Do you want to connect with slack?": 712, - "Do you want to delete": 557, - "Do you want to proceed?": 664, - "Do you want to revoke this personal access token? This can not be undone.": 309, - "Documentation": 410, - "Domain": 629, - "Domain List": 437, - "Domain Not Found": 229, - "Domain created successfully": 447, - "Domain in use. Can not change service.": 268, - "Domain not found": 675, - "Domain successfully deleted": 450, - "DomainID is required": 222, - "Domains": 460, - "Download": 647, - "Download Image": 562, - "Drag and drop this button to your web browser toolbar or your bookmarks.": 57, - "Duplicated short code": 230, - "Edit": 45, + "Device analytics": 398, + "Devices": 124, + "Disabled": 464, + "Disconnect": 577, + "Disconnect Mattermost": 659, + "Disconnect Slack": 710, + "Do not share this address. Anyone with this email can post links to your account.": 63, + "Do you really want to disconnect this organization from mattermost": 661, + "Do you really want to disconnect this organization from slack": 712, + "Do you really whant to delete this bookmark?": 561, + "Do you really whant to delete this domain": 458, + "Do you really whant to delete this link": 630, + "Do you really whant to delete this list": 650, + "Do you really whant to delete this qr code": 572, + "Do you want to connect this organization to mattermost?": 664, + "Do you want to connect with slack?": 718, + "Do you want to delete": 563, + "Do you want to proceed?": 670, + "Do you want to revoke this personal access token? This can not be undone.": 315, + "Documentation": 416, + "Domain": 635, + "Domain List": 443, + "Domain Not Found": 235, + "Domain created successfully": 453, + "Domain in use. Can not change service.": 274, + "Domain not found": 681, + "Domain successfully deleted": 456, + "DomainID is required": 228, + "Domains": 466, + "Download": 653, + "Download Image": 568, + "Drag and drop this button to your web browser toolbar or your bookmarks.": 62, + "Duplicated short code": 236, + "Edit": 50, "Edit Profile": 19, - "Edit profile": 50, - "Element ID is invalid.": 247, - "Element Not Found": 157, - "Email": 41, - "Email Address": 63, - "Email is required": 186, - "Email is required.": 270, - "Email may not exceed 255 characters": 166, - "Email updated successfully": 98, - "Enabled": 457, - "Engagements over time": 114, - "English": 30, - "Enter New Password": 75, - "Error checking the DNS entry for domain. Please try again later": 215, - "Error compiling url regex: %s": 163, - "Error fetching referenced link: %v": 503, - "Error fetching referenced note: %v": 599, - "Error fetching referenced url: Not found": 502, - "Every account can create unlimited organizations. Each organization has it's own bookmarks, listings, analytics, etc. All of the features below belong to each organization with their own unique URL's, groupings, and so on.": 354, - "Exclude Tags": 519, - "Expired": 299, - "Explore Features": 427, - "Export": 462, - "Export Data": 567, - "Export in JSON or HTML": 403, - "Failed the '%s' tag.": 721, - "Feature": 355, - "Feed": 513, - "File format": 568, - "Filter/Search listings": 377, - "Filter/Search shorts": 384, - "Firefox Bookmarks": 592, - "Follow": 538, - "Follow other organizations (social)": 369, - "Following": 510, - "Followings": 521, - "Forgot Password?": 82, - "Free": 356, - "Free accounts are only allowed 1 link listing.": 234, - "Free organizations are not allowed to create private links. Please upgrade": 155, - "Free organizations are not allowed to create private notes. Please upgrade": 162, - "Free organizations can not use Private permission. Please upgrade to use Private permission": 145, - "Full Analytics": 379, - "Full GraphQL API Access": 405, - "Full Name": 59, - "Full RSS feeds": 372, - "Full analytics history": 386, - "Fully open source": 408, - "GQL Playground": 608, - "Go to https://pinboard.in/export/ and click on JSON": 586, - "Go to the Bookmarks menu and choose Bookmark Manager": 582, - "Go to the File menu and chose Export": 580, - "Grants": 304, - "GraphQL Playground": 289, - "Help": 616, - "Here you can mix all your link saving and sharing needs in one tight little bundle. Much like a taco. A link taco if you will.": 414, - "Hi there,": 347, - "Host your own version of Link Taco": 409, - "ID can't be lower than 0.": 243, - "ID is required.": 241, + "Edit profile": 55, + "Element ID is invalid.": 253, + "Element Not Found": 163, + "Email": 46, + "Email Address": 69, + "Email Posting": 30, + "Email is required": 192, + "Email is required.": 276, + "Email may not exceed 255 characters": 172, + "Email updated successfully": 104, + "Enable email posting": 31, + "Enabled": 463, + "Engagements over time": 120, + "English": 35, + "Enter New Password": 81, + "Error checking the DNS entry for domain. Please try again later": 221, + "Error compiling url regex: %s": 169, + "Error fetching referenced link: %v": 509, + "Error fetching referenced note: %v": 605, + "Error fetching referenced url: Not found": 508, + "Every account can create unlimited organizations. Each organization has it's own bookmarks, listings, analytics, etc. All of the features below belong to each organization with their own unique URL's, groupings, and so on.": 360, + "Exclude Tags": 525, + "Expired": 305, + "Explore Features": 433, + "Export": 468, + "Export Data": 573, + "Export in JSON or HTML": 409, + "Failed the '%s' tag.": 727, + "Feature": 361, + "Feed": 519, + "File format": 574, + "Filter/Search listings": 383, + "Filter/Search shorts": 390, + "Firefox Bookmarks": 598, + "Follow": 544, + "Follow other organizations (social)": 375, + "Following": 516, + "Followings": 527, + "Forgot Password?": 88, + "Free": 362, + "Free accounts are only allowed 1 link listing.": 240, + "Free organizations are not allowed to create private links. Please upgrade": 161, + "Free organizations are not allowed to create private notes. Please upgrade": 168, + "Free organizations can not use Private permission. Please upgrade to use Private permission": 151, + "Full Analytics": 385, + "Full GraphQL API Access": 411, + "Full Name": 65, + "Full RSS feeds": 378, + "Full analytics history": 392, + "Fully open source": 414, + "GQL Playground": 614, + "Go to https://pinboard.in/export/ and click on JSON": 592, + "Go to the Bookmarks menu and choose Bookmark Manager": 588, + "Go to the File menu and chose Export": 586, + "Grants": 310, + "GraphQL Playground": 295, + "Help": 622, + "Here you can mix all your link saving and sharing needs in one tight little bundle. Much like a taco. A link taco if you will.": 420, + "Hi there,": 353, + "Host your own version of Link Taco": 415, + "ID can't be lower than 0.": 249, + "ID is required.": 247, "IP Address": 8, - "Id required": 231, - "If OAuth 2.0 bearer tokens issued for your OAuth client, or your client secret, have been disclosed to a third-party, you must revoke all tokens and have replacements issued.": 327, - "If the email address given exists in our system then we just sent it a login link. Click this link to reset your password. The link expires in 1 hour.": 83, - "If you didn't request this link you can safely delete this email now.": 110, + "Id required": 237, + "If OAuth 2.0 bearer tokens issued for your OAuth client, or your client secret, have been disclosed to a third-party, you must revoke all tokens and have replacements issued.": 333, + "If the email address given exists in our system then we just sent it a login link. Click this link to reset your password. The link expires in 1 hour.": 89, + "If you didn't request this link you can safely delete this email now.": 116, "Image": 26, - "Import": 463, - "Import / Export": 398, - "Import Data": 574, - "Import Export": 432, - "Import from Chrome": 401, - "Import from Firefox": 400, - "Import from Pinboard": 399, - "Import from Safari": 402, - "In order to interact with Link Taco you have to connect you slack account with your link user": 708, - "In order to interact with the mattermost you have to connect your account with your link user": 663, - "In the left sidebar select the folder that you want to export": 583, - "In the left sidebar select the folder you want to export. To export all bookmarks select All Bookmarks": 578, - "In the top bookmark bar click on the three points at the top right": 584, - "Inactive Domain": 350, - "Include Tags": 518, - "Informative URL": 334, - "Installed successfully": 680, - "Instructions": 589, - "Integrations": 431, - "Invalid Confirmation Target": 181, - "Invalid Confirmation Type": 180, - "Invalid Email": 193, - "Invalid FQDN format": 209, - "Invalid ID ": 267, - "Invalid Key": 192, - "Invalid Permission": 168, - "Invalid URL.": 148, - "Invalid Visibility value.": 147, - "Invalid code type": 283, - "Invalid default permission value": 146, - "Invalid domain ID.": 217, - "Invalid domain name.": 205, - "Invalid domain value given": 642, - "Invalid email and/or password": 714, - "Invalid email format": 167, - "Invalid level value.": 263, - "Invalid listing ID provided": 287, - "Invalid listing for specified organization": 288, - "Invalid orgType": 261, - "Invalid organization given": 683, - "Invalid origin source for importer.": 292, - "Invalid permissions for Organization ID": 211, - "Invalid service value.": 206, - "Invalid slack response": 711, - "Invalid status value.": 264, - "Invalid tag cloud type without organization slug": 278, - "Invalid visibility": 262, - "Is Active": 40, - "Is Default": 630, - "Is Enabled": 473, - "Issued": 298, - "Just wanted to let you know that your bookmark import has completed successfully!": 348, - "Key is required": 197, - "Lang is invalid": 203, - "Link Detail": 547, + "Import": 469, + "Import / Export": 404, + "Import Data": 580, + "Import Export": 438, + "Import from Chrome": 407, + "Import from Firefox": 406, + "Import from Pinboard": 405, + "Import from Safari": 408, + "In order to interact with Link Taco you have to connect you slack account with your link user": 714, + "In order to interact with the mattermost you have to connect your account with your link user": 669, + "In the left sidebar select the folder that you want to export": 589, + "In the left sidebar select the folder you want to export. To export all bookmarks select All Bookmarks": 584, + "In the top bookmark bar click on the three points at the top right": 590, + "Inactive Domain": 356, + "Include Tags": 524, + "Informative URL": 340, + "Installed successfully": 686, + "Instructions": 595, + "Integrations": 437, + "Invalid Confirmation Target": 187, + "Invalid Confirmation Type": 186, + "Invalid Email": 199, + "Invalid FQDN format": 215, + "Invalid ID ": 273, + "Invalid Key": 198, + "Invalid Permission": 174, + "Invalid URL.": 154, + "Invalid Visibility value.": 153, + "Invalid code type": 289, + "Invalid default permission value": 152, + "Invalid domain ID.": 223, + "Invalid domain name.": 211, + "Invalid domain value given": 648, + "Invalid email and/or password": 720, + "Invalid email format": 173, + "Invalid level value.": 269, + "Invalid listing ID provided": 293, + "Invalid listing for specified organization": 294, + "Invalid orgType": 267, + "Invalid organization given": 689, + "Invalid origin source for importer.": 298, + "Invalid permissions for Organization ID": 217, + "Invalid service value.": 212, + "Invalid slack response": 717, + "Invalid status value.": 270, + "Invalid tag cloud type without organization slug": 284, + "Invalid visibility": 268, + "Is Active": 45, + "Is Default": 636, + "Is Enabled": 479, + "Issued": 304, + "Just wanted to let you know that your bookmark import has completed successfully!": 354, + "Key is required": 203, + "Lang is invalid": 209, + "Link Detail": 553, "Link Listing": 10, - "Link Listings": 374, - "Link Lists": 429, - "Link Not Found": 159, - "Link Search": 700, - "Link Short Not Found": 282, - "Link Shortening": 381, - "Link Shortner": 442, - "Link Taco: Invitation to join organization": 174, - "Link hash required": 156, - "Link listings: Linktree et al": 420, - "Link shortening: Bitly et al": 419, - "Link successfully deleted": 623, - "Link successfully updated.": 558, - "LinkOrder can't be lower than 0.": 239, - "LinkTaco - Confirm account email": 106, - "LinkTaco - Your bookmark import is complete": 346, - "LinkTaco is an open source platform where you can host all of your links. Custom domains, QR codes, Analytics, full API, multiple organizations w/unlimited members are just some of what's included.": 415, - "Links": 127, - "Links - Reset your password": 81, - "Linktaco: Invitation to Register": 272, - "List Not Found": 248, - "List successfully deleted": 643, - "Listing": 380, - "Listing Link Not Found": 244, - "Listing Not Found": 240, - "Listing successfully updated.": 635, - "ListingSlug is required.": 238, - "Lists": 613, - "Log in": 606, - "Log out": 607, - "Login": 93, - "Login Email": 95, - "Lookup Name": 439, - "Manage": 316, - "Manage Links": 638, - "Manage Members": 461, - "Manage Subscription": 459, - "Manage Your Organizations": 51, - "Mark as read": 533, - "Mark as unread": 534, - "MatterMost Integration": 396, - "Mattermost successfully disconnected": 654, - "Member List": 489, - "Member added succesxfully": 487, - "Member successfully deleted": 485, - "Members": 46, - "Members can add/edit/remove links (if allowed)": 434, - "Members have access based on permissions granted": 435, - "Migrate Short Links": 445, - "Most popular links on LinkTaco.com": 507, + "Link Listings": 380, + "Link Lists": 435, + "Link Not Found": 165, + "Link Search": 706, + "Link Short Not Found": 288, + "Link Shortening": 387, + "Link Shortner": 448, + "Link Taco: Invitation to join organization": 180, + "Link hash required": 162, + "Link listings: Linktree et al": 426, + "Link shortening: Bitly et al": 425, + "Link successfully deleted": 629, + "Link successfully updated.": 564, + "LinkOrder can't be lower than 0.": 245, + "LinkTaco - Confirm account email": 112, + "LinkTaco - Your bookmark import is complete": 352, + "LinkTaco is an open source platform where you can host all of your links. Custom domains, QR codes, Analytics, full API, multiple organizations w/unlimited members are just some of what's included.": 421, + "Links": 133, + "Links - Reset your password": 87, + "Linktaco: Invitation to Register": 278, + "List Not Found": 254, + "List successfully deleted": 649, + "Listing": 386, + "Listing Link Not Found": 250, + "Listing Not Found": 246, + "Listing successfully updated.": 641, + "ListingSlug is required.": 244, + "Lists": 619, + "Log in": 612, + "Log out": 613, + "Login": 99, + "Login Email": 101, + "Lookup Name": 445, + "Manage": 322, + "Manage Links": 644, + "Manage Members": 467, + "Manage Subscription": 465, + "Manage Your Organizations": 56, + "Mark as read": 539, + "Mark as unread": 540, + "MatterMost Integration": 402, + "Mattermost successfully disconnected": 660, + "Member List": 495, + "Member added succesxfully": 493, + "Member successfully deleted": 491, + "Members": 51, + "Members can add/edit/remove links (if allowed)": 440, + "Members have access based on permissions granted": 441, + "Migrate Short Links": 451, + "Most popular links on LinkTaco.com": 513, "Name": 24, - "Name (reverse)": 33, - "Name is required": 129, - "Name is required.": 269, - "Name may not exceed 150 characters": 130, - "Name may not exceed 255 characters": 207, - "Name may not exceed 500 characters": 208, - "New Password": 73, - "New passwords do not match": 715, - "New tag is required.": 258, + "Name (reverse)": 38, + "Name is required": 135, + "Name is required.": 275, + "Name may not exceed 150 characters": 136, + "Name may not exceed 255 characters": 213, + "Name may not exceed 500 characters": 214, + "New Password": 79, + "New passwords do not match": 721, + "New tag is required.": 264, "Next": 15, - "No Clients": 318, - "No Data": 128, - "No Domain": 689, - "No Domains": 443, - "No Links": 627, - "No Lists": 639, - "No QR Codes": 652, - "No Short Links": 686, - "No URL argument was given": 696, - "No accounts? Click here to create one": 94, + "No Clients": 324, + "No Data": 134, + "No Domain": 695, + "No Domains": 449, + "No Links": 633, + "No Lists": 645, + "No QR Codes": 658, + "No Short Links": 692, + "No URL argument was given": 702, + "No accounts? Click here to create one": 100, "No audit logs to display": 14, - "No default organization found": 684, - "No links were found for %s": 669, - "No members": 490, - "No organization found": 670, - "No organizations": 512, - "No personal organization found for this user": 204, - "No slack connection found": 666, - "No, nevermind": 311, - "Not Found": 276, - "Note": 527, - "Note '%s' on LinkTaco.com": 595, - "Note: Your access token <strong>will never be shown to you again.</strong> Keep this secret. It will expire a year from now.": 307, - "Note: Your client secret will never be shown to you again.": 324, - "Notes": 531, - "OAuth 2.0 client management": 325, - "OAuth 2.0 client registered": 335, - "OAuth2 Support": 406, - "Old links won't work. All code will be moved to the new domain.": 446, - "Only members with read perm are allowed to perform this action": 279, - "Only members with write perm are allowed to perform this action": 154, - "Only showing country data. Upgrade your organization to paid to view all stats": 124, - "Only showing the last 60 days. Upgrade your organization to paid to view all historical data": 122, - "Only superusers can delete system level domains": 219, - "Only superusers can fetch system level domains": 281, - "Open Source": 454, - "Order": 620, - "Org Not Found": 226, - "Org Slug is required": 233, - "Org Username": 466, - "Org slug is required": 164, - "Org slug is required for this kind of token": 284, - "Org slug is required.": 150, - "Org username is required": 131, - "Org username may not exceed 150 characters": 132, - "Organizaiton Slug is required.": 210, + "No default organization found": 690, + "No links were found for %s": 675, + "No members": 496, + "No organization found": 676, + "No organizations": 518, + "No personal organization found for this user": 210, + "No slack connection found": 672, + "No, nevermind": 317, + "Not Found": 282, + "Note": 533, + "Note '%s' on LinkTaco.com": 601, + "Note: Your access token <strong>will never be shown to you again.</strong> Keep this secret. It will expire a year from now.": 313, + "Note: Your client secret will never be shown to you again.": 330, + "Notes": 537, + "OAuth 2.0 client management": 331, + "OAuth 2.0 client registered": 341, + "OAuth2 Support": 412, + "Old links won't work. All code will be moved to the new domain.": 452, + "Only members with read perm are allowed to perform this action": 285, + "Only members with write perm are allowed to perform this action": 160, + "Only showing country data. Upgrade your organization to paid to view all stats": 130, + "Only showing the last 60 days. Upgrade your organization to paid to view all historical data": 128, + "Only superusers can delete system level domains": 225, + "Only superusers can fetch system level domains": 287, + "Open Source": 460, + "Order": 626, + "Org Not Found": 232, + "Org Slug is required": 239, + "Org Username": 472, + "Org slug is required": 170, + "Org slug is required for this kind of token": 290, + "Org slug is required.": 156, + "Org username is required": 137, + "Org username may not exceed 150 characters": 138, + "Organizaiton Slug is required.": 216, "Organization": 9, - "Organization Not Found": 139, - "Organization Slug is required for user level domains": 266, - "Organization created successfully": 471, - "Organization linked successfully with mattermost": 660, - "Organization linked successfully with slack": 713, - "Organization not found.": 256, - "Organization updated successfully": 474, - "Organizations": 43, - "Organize Bookmarks": 428, - "Organize by tags": 370, - "Organize listings by tag": 376, - "Organize shorts by tags": 383, - "Other": 632, - "Other Name": 633, - "Paid": 456, - "Password": 60, - "Password Changed": 77, - "Password changed successfully": 97, - "Password is required": 187, - "Password may not exceed 100 characters": 188, - "Payment History": 464, - "Peace Pinboard. Bye Bitly. Later Linktree. Hello LinkTaco!": 421, - "Permission": 476, - "Permission Not Found": 182, - "Personal": 357, - "Personal Access Tokens": 296, - "Personal Tokens": 611, - "Please click in the following link to tie a org %s": 679, - "Please click the link below:": 274, - "Please confirm your account": 107, - "Please enter a valid email address.": 719, - "Please enter a valid phone number.": 720, - "Please link your slack user with link: %s": 701, + "Organization Not Found": 145, + "Organization Slug is required for user level domains": 272, + "Organization created successfully": 477, + "Organization linked successfully with mattermost": 666, + "Organization linked successfully with slack": 719, + "Organization not found.": 262, + "Organization updated successfully": 480, + "Organizations": 48, + "Organize Bookmarks": 434, + "Organize by tags": 376, + "Organize listings by tag": 382, + "Organize shorts by tags": 389, + "Other": 638, + "Other Name": 639, + "Paid": 462, + "Password": 66, + "Password Changed": 83, + "Password changed successfully": 103, + "Password is required": 193, + "Password may not exceed 100 characters": 194, + "Payment History": 470, + "Peace Pinboard. Bye Bitly. Later Linktree. Hello LinkTaco!": 427, + "Permission": 482, + "Permission Not Found": 188, + "Personal": 363, + "Personal Access Tokens": 302, + "Personal Tokens": 617, + "Please click in the following link to tie a org %s": 685, + "Please click the link below:": 280, + "Please confirm your account": 113, + "Please enter a valid email address.": 725, + "Please enter a valid phone number.": 726, + "Please link your slack user with link: %s": 707, "Please login to view multiple tag combos (sorry, this is to help stop bot abuse)": 6, - "Please upgrade to a Business organization to add members": 477, - "Please upgrade your account to reactivate it": 352, - "Popular": 603, - "Popular Bookmarks": 505, - "Popular Links": 509, + "Please upgrade to a Business organization to add members": 483, + "Please upgrade your account to reactivate it": 358, + "Popular": 609, + "Popular Bookmarks": 511, + "Popular Links": 515, "Prev": 16, - "Previous": 626, - "Price": 359, - "Pricing": 353, - "Pricing and feature details for LinkTaco.com": 411, - "Private": 470, - "Private Post": 549, - "Profile updated successfully": 36, - "Public": 469, - "Public Post": 548, - "Public only": 364, - "QR Code Details": 561, - "QR Code Listing": 650, - "QR Code Not Found": 252, - "QR Code specific analytics": 387, - "QR Code succesfully created": 649, - "QR Code successfully deleted": 565, - "QR Codes": 641, - "QR Codes powered by Link Taco!": 559, - "QR Scans": 126, - "Read": 478, - "Ready to get started? It's free to make an account and use it forever (with some limitations). To use all features you have to pay just a few bucks a year, or a few per month if you're a business, and that's it. Simple!": 426, - "Recent": 602, - "Recent Bookmarks": 528, - "Recent Links": 543, - "Recent bookmarks for URL %s added on LinkTaco.com": 524, - "Recent public links added to %s on LinkTaco.com": 541, - "Recent public links added to LinkTaco.com": 542, - "Redirect URL": 321, - "Referer analyitcs": 389, - "Referrer": 117, - "Register": 62, - "Register Invitation": 271, - "Registration Completed": 61, - "Registration is not enabled": 191, - "Registration is not enabled on this system. Contact the admin for an account.": 68, - "Reject": 345, - "Reset Password": 76, + "Previous": 632, + "Price": 365, + "Pricing": 359, + "Pricing and feature details for LinkTaco.com": 417, + "Private": 476, + "Private Post": 555, + "Profile updated successfully": 41, + "Public": 475, + "Public Post": 554, + "Public only": 370, + "QR Code Details": 567, + "QR Code Listing": 656, + "QR Code Not Found": 258, + "QR Code specific analytics": 393, + "QR Code succesfully created": 655, + "QR Code successfully deleted": 571, + "QR Codes": 647, + "QR Codes powered by Link Taco!": 565, + "QR Scans": 132, + "Read": 484, + "Ready to get started? It's free to make an account and use it forever (with some limitations). To use all features you have to pay just a few bucks a year, or a few per month if you're a business, and that's it. Simple!": 432, + "Recent": 608, + "Recent Bookmarks": 534, + "Recent Links": 549, + "Recent bookmarks for URL %s added on LinkTaco.com": 530, + "Recent public links added to %s on LinkTaco.com": 547, + "Recent public links added to LinkTaco.com": 548, + "Redirect URL": 327, + "Referer analyitcs": 395, + "Referrer": 123, + "Regenerate code": 32, + "Register": 68, + "Register Invitation": 277, + "Registration Completed": 67, + "Registration is not enabled": 197, + "Registration is not enabled on this system. Contact the admin for an account.": 74, + "Reject": 351, + "Reset Password": 82, "Restricted Page": 0, - "Revoke": 300, - "Revoke Personal Access Token": 308, - "Revoke client tokens": 328, - "Revoke tokens & client secret": 326, - "Safari Bookmarks": 590, + "Revoke": 306, + "Revoke Personal Access Token": 314, + "Revoke client tokens": 334, + "Revoke tokens & client secret": 332, + "Safari Bookmarks": 596, "Save": 20, - "Save Link": 609, - "Save Note": 610, - "Save public/private links": 367, - "Save public/private notes": 368, - "Saved Bookmarks": 522, - "Scopes": 343, - "Search": 515, - "See the installation documentation for more.": 425, - "Select Export Bookmarks": 581, - "Self Hosting": 407, - "Send Reset Link": 84, - "Service": 440, - "Set up your account, so you can save links.": 67, - "Settings": 37, - "Short Code": 688, - "Short Code may not exceed 20 characters": 224, - "Short Link": 685, - "Short Link successfully deleted": 694, - "Short Links": 614, - "Short Not Found": 250, - "Short link successfully updated.": 692, - "Since we're a": 422, - "Slack Integration": 395, - "Slack successfully disconnected": 705, - "Slug": 38, - "Slug is required": 137, - "Slug is required.": 232, - "Slug may not exceed 150 characters": 138, - "Social Links": 634, - "Social bookmarking is not new, it's just been forgotten. Link shortening with analytics has been around forever. Link listings became cool once social media started allowing us to post a link to our websites in our profiles.": 416, + "Save Link": 615, + "Save Note": 616, + "Save public/private links": 373, + "Save public/private notes": 374, + "Saved Bookmarks": 528, + "Scopes": 349, + "Search": 521, + "See the installation documentation for more.": 431, + "Select Export Bookmarks": 587, + "Self Hosting": 413, + "Send Reset Link": 90, + "Service": 446, + "Set up your account, so you can save links.": 73, + "Settings": 42, + "Short Code": 694, + "Short Code may not exceed 20 characters": 230, + "Short Link": 691, + "Short Link successfully deleted": 700, + "Short Links": 620, + "Short Not Found": 256, + "Short link successfully updated.": 698, + "Since we're a": 428, + "Slack Integration": 401, + "Slack successfully disconnected": 711, + "Slug": 43, + "Slug is required": 143, + "Slug is required.": 238, + "Slug may not exceed 150 characters": 144, + "Social Links": 640, + "Social bookmarking is not new, it's just been forgotten. Link shortening with analytics has been around forever. Link listings became cool once social media started allowing us to post a link to our websites in our profiles.": 422, "Social bookmarking plus link sharing, shortening and listings all in one app.": 3, - "Social bookmarking: Pinboard (Delicious)": 418, - "Someone, possibly you, requested this login via email link. To login to your account, just click the link below:": 96, - "Someone, possibly you, requested to reset your Links email address. To complete this update, just click the link below:": 90, - "Someone, possibly you, requested to reset your Links password.": 85, - "Something went wrong, impossible to send invitation": 482, - "Something went wrong. Impossible to get the member data": 488, - "Something went wrong. The QR Code could not be deleted.": 564, - "Something went wrong. The link could not be deleted.": 622, - "Something went wrong. The user could not be linked.": 709, - "Something went wrong. This bookmark could not be deleted.": 553, - "Something went wrong. This member could not be deleted: %s": 484, - "Sorry, free accounts do not support Mattermost Integration. Please upgrade to continue": 661, - "Sorry, free accounts do not support Slack Integration. Please upgrade to continue": 707, - "Sorry, you have exceeded the amount of free accounts available. Please update your current free account to create one more": 468, - "Source": 575, - "Spanish": 29, - "Sponsored": 455, - "Star": 535, - "Starred": 495, - "Store Dashboard": 600, - "Submit Query": 290, - "Subscription": 39, - "Successful login.": 105, - "Successfully added client": 336, - "Successfully added personal access": 312, - "Successfully reissued client.": 338, - "Successfully revoked authorization token.": 313, - "Successfully revoked client.": 337, - "Tag not found.": 257, - "Tag renamed successfully": 260, - "Tags": 496, - "Tags may not exceed 10": 153, - "The %s domain is currently inactive": 351, - "The User is not verified": 184, - "The User you try to invite is not verified": 172, - "The code is required": 673, - "The domain is already registered in the system": 213, - "The domain is required": 674, - "The file is required": 293, - "The file submitted for this source should be html": 294, - "The file submitted for this source should be json": 295, - "The member was removed successfully": 177, + "Social bookmarking: Pinboard (Delicious)": 424, + "Someone, possibly you, requested this login via email link. To login to your account, just click the link below:": 102, + "Someone, possibly you, requested to reset your Links email address. To complete this update, just click the link below:": 96, + "Someone, possibly you, requested to reset your Links password.": 91, + "Something went wrong, impossible to send invitation": 488, + "Something went wrong. Impossible to get the member data": 494, + "Something went wrong. The QR Code could not be deleted.": 570, + "Something went wrong. The link could not be deleted.": 628, + "Something went wrong. The user could not be linked.": 715, + "Something went wrong. This bookmark could not be deleted.": 559, + "Something went wrong. This member could not be deleted: %s": 490, + "Sorry, free accounts do not support Mattermost Integration. Please upgrade to continue": 667, + "Sorry, free accounts do not support Slack Integration. Please upgrade to continue": 713, + "Sorry, you have exceeded the amount of free accounts available. Please update your current free account to create one more": 474, + "Source": 581, + "Spanish": 34, + "Sponsored": 461, + "Star": 541, + "Starred": 501, + "Store Dashboard": 606, + "Submit Query": 296, + "Subscription": 44, + "Successful login.": 111, + "Successfully added client": 342, + "Successfully added personal access": 318, + "Successfully reissued client.": 344, + "Successfully revoked authorization token.": 319, + "Successfully revoked client.": 343, + "Tag not found.": 263, + "Tag renamed successfully": 266, + "Tags": 502, + "Tags may not exceed 10": 159, + "The %s domain is currently inactive": 357, + "The User is not verified": 190, + "The User you try to invite is not verified": 178, + "The code is required": 679, + "The domain is already registered in the system": 219, + "The domain is required": 680, + "The file is required": 299, + "The file submitted for this source should be html": 300, + "The file submitted for this source should be json": 301, + "The member was removed successfully": 183, "The passwords you entered do not match.": 17, "The tag ordering you entered is invalid.": 18, - "The text to be searched is required": 668, - "The title is required": 671, - "The url is required": 672, - "The user for given email is not a member of given organization": 176, - "The user was added successfully": 185, - "There is already a default listing for this domain": 237, - "There is already a domain registered for given service": 214, - "This Slug is already registered for this domain": 236, - "This account is currently unable to access the system.": 104, - "This ain't a popularity contest or anything but this is weird that there are no links!": 506, - "This email domain is not allowed": 169, - "This email is already registered": 194, - "This feature is not allowed for free user. Please upgrade.": 569, - "This feature is restricted to free accounts. Please upgrade.": 659, - "This feed has no links. Booo!": 523, - "This field is required.": 718, - "This function is only allowed for business users.": 170, - "This function is only allowed for paid users.": 212, + "The text to be searched is required": 674, + "The title is required": 677, + "The url is required": 678, + "The user for given email is not a member of given organization": 182, + "The user was added successfully": 191, + "There is already a default listing for this domain": 243, + "There is already a domain registered for given service": 220, + "This Slug is already registered for this domain": 242, + "This account is currently unable to access the system.": 110, + "This ain't a popularity contest or anything but this is weird that there are no links!": 512, + "This email domain is not allowed": 175, + "This email is already registered": 200, + "This feature is not allowed for free user. Please upgrade.": 575, + "This feature is restricted to free accounts. Please upgrade.": 665, + "This feed has no links. Booo!": 529, + "This field is required.": 724, + "This function is only allowed for business users.": 176, + "This function is only allowed for paid users.": 218, "This function is only allowed for paid users. Please upgrade": 1, - "This link will expire in 1 hour. If you didn't request this link you can safely delete this email now.": 87, - "This link will expire in 2 hour. If you didn't request this link you can safely delete this email now.": 91, - "This organization has an active subscription. Please cancel it first": 144, - "This organization name is already registered": 140, - "This organization slug can not be used. Please chose another one": 134, - "This organization slug is already registered": 135, - "This shortCode can not be used. Please chose another one": 225, - "This slug can not be used. Please chose another one": 141, - "This special link allows you to save to LinkTaco directly by using a bookmark in your web browser.": 56, - "This team is already tied to an organization": 657, - "This user does not follow this org": 254, - "This user is not allowed to perform this action": 160, - "This username can not be used. Please chose another one": 195, - "This username is already registered": 196, - "This will permanently unregister your OAuth 2.0 client": 330, + "This link will expire in 1 hour. If you didn't request this link you can safely delete this email now.": 93, + "This link will expire in 2 hour. If you didn't request this link you can safely delete this email now.": 97, + "This organization has an active subscription. Please cancel it first": 150, + "This organization name is already registered": 146, + "This organization slug can not be used. Please chose another one": 140, + "This organization slug is already registered": 141, + "This shortCode can not be used. Please chose another one": 231, + "This slug can not be used. Please chose another one": 147, + "This special link allows you to save to LinkTaco directly by using a bookmark in your web browser.": 61, + "This team is already tied to an organization": 663, + "This user does not follow this org": 260, + "This user is not allowed to perform this action": 166, + "This username can not be used. Please chose another one": 201, + "This username is already registered": 202, + "This will permanently unregister your OAuth 2.0 client": 336, "Timestamp": 13, "Timezone": 22, - "Timezone is invalid": 202, - "Timezone is required": 200, - "Title": 492, - "Title is required": 242, - "Title is required.": 151, - "Title is too long.": 245, - "Title may not exceed 150 characters": 223, - "Title may not exceed 500 characters": 152, - "To complete your password reset, just click the link below:": 86, - "To confirm your email address and complete your Links registration, please click the link below.": 108, - "Tour": 601, - "Try It FREE": 365, - "URL": 619, - "URL Shortening powered by Link Taco!": 695, - "URL is required.": 221, - "URL may not exceed 2048 characters": 149, - "Unable to delete. Domain has active short links or link listings": 220, - "Unable to find suitable organization": 280, - "Unfollow": 511, - "Unlimited": 363, - "Unlimited QR codes per listing": 378, - "Unlimited QR codes per short": 385, - "Unlimited link listings (for social media bios, etc.)": 433, - "Unlimited short links": 382, - "Unread": 494, - "Unregister": 332, - "Unregister this OAuth client": 329, - "Unstar": 536, - "Untagged": 532, - "Up until now, all of these things were hosted on different services.": 417, - "Update Email": 88, - "Update Link": 556, - "Update Links": 618, - "Update List": 628, - "Update Note": 594, - "Update Organization": 472, - "Update Short Link": 691, - "Update email": 49, - "Upgrade Org": 52, - "Upgrade the organization to activate them.": 546, - "Upgrade your account to support private bookmarks.": 588, - "Upgrade your organization to paid to view the detail stats": 125, - "Url is required": 677, - "Use commas to separate your tags. Example: tag 1, tag 2, tag 3": 497, - "User Not Found": 183, - "User connected successfully": 665, - "User email is required": 165, - "User follows %s": 253, - "User is not authenticated": 716, - "User not found for given email": 175, - "User unfollows %s": 255, + "Timezone is invalid": 208, + "Timezone is required": 206, + "Title": 498, + "Title is required": 248, + "Title is required.": 157, + "Title is too long.": 251, + "Title may not exceed 150 characters": 229, + "Title may not exceed 500 characters": 158, + "To complete your password reset, just click the link below:": 92, + "To confirm your email address and complete your Links registration, please click the link below.": 114, + "Tour": 607, + "Try It FREE": 371, + "URL": 625, + "URL Shortening powered by Link Taco!": 701, + "URL is required.": 227, + "URL may not exceed 2048 characters": 155, + "Unable to delete. Domain has active short links or link listings": 226, + "Unable to find suitable organization": 286, + "Unfollow": 517, + "Unlimited": 369, + "Unlimited QR codes per listing": 384, + "Unlimited QR codes per short": 391, + "Unlimited link listings (for social media bios, etc.)": 439, + "Unlimited short links": 388, + "Unread": 500, + "Unregister": 338, + "Unregister this OAuth client": 335, + "Unstar": 542, + "Untagged": 538, + "Up until now, all of these things were hosted on different services.": 423, + "Update Email": 94, + "Update Link": 562, + "Update Links": 624, + "Update List": 634, + "Update Note": 600, + "Update Organization": 478, + "Update Short Link": 697, + "Update email": 54, + "Upgrade Org": 57, + "Upgrade the organization to activate them.": 552, + "Upgrade your account to support private bookmarks.": 594, + "Upgrade your organization to paid to view the detail stats": 131, + "Url is required": 683, + "Use commas to separate your tags. Example: tag 1, tag 2, tag 3": 503, + "User Not Found": 189, + "User connected successfully": 671, + "User email is required": 171, + "User follows %s": 259, + "User is not authenticated": 722, + "User not found for given email": 181, + "User unfollows %s": 261, "Username": 25, - "Username is required": 189, - "Username may not exceed 150 characters": 190, - "View": 651, - "View Audit Logs": 53, - "Visibility": 493, - "We sent you a confirmation email. Please click the link in that email to confirm your account.": 69, - "We sent you a direct message with instructions": 702, - "We sent you a new confirmation email. Please click the link in that email to confirm your account.": 112, - "We sent you a private msg": 667, - "Weeks": 120, - "Welcome to LinkTaco!": 413, + "Username is required": 195, + "Username may not exceed 150 characters": 196, + "View": 657, + "View Audit Logs": 58, + "Visibility": 499, + "We sent you a confirmation email. Please click the link in that email to confirm your account.": 75, + "We sent you a direct message with instructions": 708, + "We sent you a new confirmation email. Please click the link in that email to confirm your account.": 118, + "We sent you a private msg": 673, + "Weeks": 126, + "Welcome to LinkTaco!": 419, "Welcome to LinkTaco! Here you can mix all your link saving and sharing needs in one tight little bundle. Much like a taco. A link taco if you will.": 4, - "Welcome to Links": 66, - "Write": 479, - "Yes": 451, - "Yes, do it": 310, - "You are not allowed to create more free organizations. Please upgrade to a paid org": 133, - "You are not allowed to edit this field for notes": 158, - "You are not allowed to enable/disabled user type organization": 142, - "You are not allowed to have more than two free organizations. Please upgrade": 143, - "You can also submit via the": 500, - "You can not send both after and before cursors": 275, - "You can now": 78, - "You can't create more than 5 qr codes per lists.": 249, - "You can't create more than 5 qr codes per shorts.": 251, - "You have %d restricted link(s) saved.": 545, - "You have been invited by %s to join Link Taco": 273, - "You have not created any personal access tokens for your account.": 301, - "You have not granted any third party clients access to your account.": 305, - "You have reached your monthly short link limit. Please upgrade to remove this limitation.": 227, - "You have successfully registered your account. You can now login.": 70, - "You may revoke this access at any time on the OAuth tab of your account profile.": 342, - "You must verify your email address before logging in": 103, - "You will be redirected in 10 seconds.": 560, - "You've been logged out successfully.": 99, - "You've been sent a confirmation email. Please click the link in the email to confirm your email change. The confirmation email will expire in 2 hours.": 89, - "You've successfully confirmed your email address.": 102, - "You've successfully updated your email address.": 101, - "You've successfully updated your password.": 100, - "Your Organizations": 453, - "Your bookmark import is being processed. We will notify you once it's complete.": 593, - "Your feed is empty :( Go follow some people. Try the Popular or Recent feeds to find some interesting people to follow.": 516, - "Your importing into a free account / organization, any private pinboard bookmarks will be marked restricted.": 587, - "Your link was successfully saved. Details here: %s": 699, - "Your short link was successfully created: %s": 698, - "and login": 80, - "bookmark": 504, - "bookmark, note, detail, popular, links, linktaco": 551, - "bookmarklet": 499, - "done": 682, - "for": 441, - "invalid domain ID": 218, - "is a third-party application operated by": 341, - "list-service-domain is not configured": 235, - "months": 362, - "newTag value is not valid.": 259, - "newest": 539, - "note, detail, popular, links, linktaco": 596, - "oldest": 540, - "per month": 361, - "per year": 360, - "popular, links, linktaco, feature, plans, pricing plans": 508, - "pricing, links, linktaco, feature, plans, pricing plans": 412, - "recent, public, links, linktaco": 525, - "return to the login page": 79, - "revoke all tokens issued to it, and prohibit the issuance of new tokens.": 331, - "saved": 526, - "short-service-domain is not configured": 228, + "Welcome to Links": 72, + "When enabled, you can add links by sending an email to a special address.": 33, + "Write": 485, + "Yes": 457, + "Yes, do it": 316, + "You are not allowed to create more free organizations. Please upgrade to a paid org": 139, + "You are not allowed to edit this field for notes": 164, + "You are not allowed to enable/disabled user type organization": 148, + "You are not allowed to have more than two free organizations. Please upgrade": 149, + "You can also submit via the": 506, + "You can not send both after and before cursors": 281, + "You can now": 84, + "You can't create more than 5 qr codes per lists.": 255, + "You can't create more than 5 qr codes per shorts.": 257, + "You have %d restricted link(s) saved.": 551, + "You have been invited by %s to join Link Taco": 279, + "You have not created any personal access tokens for your account.": 307, + "You have not granted any third party clients access to your account.": 311, + "You have reached your monthly short link limit. Please upgrade to remove this limitation.": 233, + "You have successfully registered your account. You can now login.": 76, + "You may revoke this access at any time on the OAuth tab of your account profile.": 348, + "You must verify your email address before logging in": 109, + "You will be redirected in 10 seconds.": 566, + "You've been logged out successfully.": 105, + "You've been sent a confirmation email. Please click the link in the email to confirm your email change. The confirmation email will expire in 2 hours.": 95, + "You've successfully confirmed your email address.": 108, + "You've successfully updated your email address.": 107, + "You've successfully updated your password.": 106, + "Your Organizations": 459, + "Your bookmark import is being processed. We will notify you once it's complete.": 599, + "Your feed is empty :( Go follow some people. Try the Popular or Recent feeds to find some interesting people to follow.": 522, + "Your importing into a free account / organization, any private pinboard bookmarks will be marked restricted.": 593, + "Your link was successfully saved. Details here: %s": 705, + "Your short link was successfully created: %s": 704, + "and login": 86, + "bookmark": 510, + "bookmark, note, detail, popular, links, linktaco": 557, + "bookmarklet": 505, + "done": 688, + "for": 447, + "invalid domain ID": 224, + "is a third-party application operated by": 347, + "list-service-domain is not configured": 241, + "months": 368, + "newTag value is not valid.": 265, + "newest": 545, + "note, detail, popular, links, linktaco": 602, + "oldest": 546, + "per month": 367, + "per year": 366, + "popular, links, linktaco, feature, plans, pricing plans": 514, + "pricing, links, linktaco, feature, plans, pricing plans": 418, + "recent, public, links, linktaco": 531, + "return to the login page": 85, + "revoke all tokens issued to it, and prohibit the issuance of new tokens.": 337, + "saved": 532, + "short-service-domain is not configured": 234, "social bookmarks, bookmarking, links, link sharing, link shortening, link listings, bookmarks, link saving, qr codes, analytics": 5, - "something went wrong: %s": 681, - "would like to access to your Link Taco account.": 340, + "something went wrong: %s": 687, + "would like to access to your Link Taco account.": 346, } -var enIndex = []uint32{ // 723 elements +var enIndex = []uint32{ // 729 elements // Entry 0 - 1F 0x00000000, 0x00000010, 0x0000004d, 0x00000061, 0x000000af, 0x00000143, 0x000001c3, 0x00000214, @@ -772,205 +778,207 @@ var enIndex = []uint32{ // 723 elements 0x0000027a, 0x0000027f, 0x000002a7, 0x000002d0, 0x000002dd, 0x000002e2, 0x000002ef, 0x000002f8, 0x0000030a, 0x0000030f, 0x00000318, 0x0000031e, - 0x00000323, 0x0000032a, 0x00000332, 0x0000033a, + 0x00000323, 0x0000032a, 0x00000339, 0x00000347, // Entry 20 - 3F - 0x00000340, 0x00000350, 0x0000035f, 0x0000036c, - 0x00000383, 0x000003a0, 0x000003a9, 0x000003ae, - 0x000003bb, 0x000003c5, 0x000003cb, 0x000003dc, - 0x000003ea, 0x000003ff, 0x00000404, 0x0000040c, - 0x00000414, 0x00000424, 0x00000431, 0x0000043e, - 0x00000458, 0x00000464, 0x00000474, 0x00000480, - 0x00000490, 0x000004f3, 0x0000053c, 0x00000552, - 0x0000055c, 0x00000565, 0x0000057c, 0x00000585, + 0x0000035c, 0x0000036c, 0x000003b6, 0x000003be, + 0x000003c6, 0x000003cc, 0x000003dc, 0x000003eb, + 0x000003f8, 0x0000040f, 0x0000042c, 0x00000435, + 0x0000043a, 0x00000447, 0x00000451, 0x00000457, + 0x00000468, 0x00000476, 0x0000048b, 0x00000490, + 0x00000498, 0x000004a0, 0x000004b0, 0x000004bd, + 0x000004ca, 0x000004e4, 0x000004f0, 0x00000500, + 0x0000050c, 0x0000051c, 0x0000057f, 0x000005c8, // Entry 40 - 5F - 0x00000593, 0x000005a4, 0x000005d1, 0x000005e2, - 0x0000060e, 0x0000065c, 0x000006bb, 0x000006fd, - 0x0000070d, 0x0000071e, 0x0000072b, 0x00000740, - 0x00000753, 0x00000762, 0x00000773, 0x0000077f, - 0x00000798, 0x000007a2, 0x000007be, 0x000007cf, - 0x00000866, 0x00000876, 0x000008b5, 0x000008f1, - 0x00000958, 0x00000965, 0x000009fc, 0x00000a75, - 0x00000adc, 0x00000ae9, 0x00000aef, 0x00000b15, + 0x0000061a, 0x00000630, 0x0000063a, 0x00000643, + 0x0000065a, 0x00000663, 0x00000671, 0x00000682, + 0x000006af, 0x000006c0, 0x000006ec, 0x0000073a, + 0x00000799, 0x000007db, 0x000007eb, 0x000007fc, + 0x00000809, 0x0000081e, 0x00000831, 0x00000840, + 0x00000851, 0x0000085d, 0x00000876, 0x00000880, + 0x0000089c, 0x000008ad, 0x00000944, 0x00000954, + 0x00000993, 0x000009cf, 0x00000a36, 0x00000a43, // Entry 60 - 7F - 0x00000b21, 0x00000b92, 0x00000bb0, 0x00000bcb, - 0x00000bf0, 0x00000c1b, 0x00000c4b, 0x00000c7d, - 0x00000cb2, 0x00000ce9, 0x00000cfb, 0x00000d1c, - 0x00000d38, 0x00000d99, 0x00000da1, 0x00000de7, - 0x00000e02, 0x00000e65, 0x00000e6f, 0x00000e85, - 0x00000e8d, 0x00000e92, 0x00000e9b, 0x00000ea3, - 0x00000ea9, 0x00000eaf, 0x00000eb4, 0x00000f11, - 0x00000f27, 0x00000f76, 0x00000fb1, 0x00000fba, + 0x00000ada, 0x00000b53, 0x00000bba, 0x00000bc7, + 0x00000bcd, 0x00000bf3, 0x00000bff, 0x00000c70, + 0x00000c8e, 0x00000ca9, 0x00000cce, 0x00000cf9, + 0x00000d29, 0x00000d5b, 0x00000d90, 0x00000dc7, + 0x00000dd9, 0x00000dfa, 0x00000e16, 0x00000e77, + 0x00000e7f, 0x00000ec5, 0x00000ee0, 0x00000f43, + 0x00000f4d, 0x00000f63, 0x00000f6b, 0x00000f70, + 0x00000f79, 0x00000f81, 0x00000f87, 0x00000f8d, // Entry 80 - 9F - 0x00000fc0, 0x00000fc8, 0x00000fd9, 0x00000ffc, - 0x00001015, 0x00001040, 0x00001094, 0x000010d5, - 0x00001102, 0x0000111a, 0x0000112b, 0x0000114e, - 0x00001165, 0x00001192, 0x000011c6, 0x00001204, - 0x00001251, 0x00001296, 0x000012f2, 0x00001313, - 0x0000132d, 0x0000133a, 0x0000135d, 0x00001373, - 0x00001386, 0x000013aa, 0x000013c1, 0x00001401, - 0x0000144c, 0x0000145f, 0x00001471, 0x000014a2, + 0x00000f92, 0x00000fef, 0x00001005, 0x00001054, + 0x0000108f, 0x00001098, 0x0000109e, 0x000010a6, + 0x000010b7, 0x000010da, 0x000010f3, 0x0000111e, + 0x00001172, 0x000011b3, 0x000011e0, 0x000011f8, + 0x00001209, 0x0000122c, 0x00001243, 0x00001270, + 0x000012a4, 0x000012e2, 0x0000132f, 0x00001374, + 0x000013d0, 0x000013f1, 0x0000140b, 0x00001418, + 0x0000143b, 0x00001451, 0x00001464, 0x00001488, // Entry A0 - BF - 0x000014b1, 0x000014e1, 0x000014fa, 0x00001545, - 0x00001566, 0x0000157b, 0x00001592, 0x000015b6, - 0x000015cb, 0x000015de, 0x000015ff, 0x00001631, - 0x0000165d, 0x00001688, 0x000016b2, 0x000016dd, - 0x000016fc, 0x0000173b, 0x0000175f, 0x0000177d, - 0x00001794, 0x000017ae, 0x000017ca, 0x000017df, - 0x000017ee, 0x00001807, 0x00001827, 0x00001839, - 0x0000184e, 0x00001875, 0x0000188a, 0x000018b1, + 0x0000149f, 0x000014df, 0x0000152a, 0x0000153d, + 0x0000154f, 0x00001580, 0x0000158f, 0x000015bf, + 0x000015d8, 0x00001623, 0x00001644, 0x00001659, + 0x00001670, 0x00001694, 0x000016a9, 0x000016bc, + 0x000016dd, 0x0000170f, 0x0000173b, 0x00001766, + 0x00001790, 0x000017bb, 0x000017da, 0x00001819, + 0x0000183d, 0x0000185b, 0x00001872, 0x0000188c, + 0x000018a8, 0x000018bd, 0x000018cc, 0x000018e5, // Entry C0 - DF - 0x000018cd, 0x000018d9, 0x000018e7, 0x00001908, - 0x00001940, 0x00001964, 0x00001974, 0x00001990, - 0x000019a8, 0x000019bd, 0x000019d9, 0x000019ed, - 0x000019fd, 0x00001a2a, 0x00001a3f, 0x00001a56, - 0x00001a79, 0x00001a9c, 0x00001ab0, 0x00001acf, - 0x00001af7, 0x00001b25, 0x00001b54, 0x00001b8b, - 0x00001bcb, 0x00001bf0, 0x00001c03, 0x00001c15, - 0x00001c45, 0x00001c86, 0x00001c97, 0x00001cac, + 0x00001905, 0x00001917, 0x0000192c, 0x00001953, + 0x00001968, 0x0000198f, 0x000019ab, 0x000019b7, + 0x000019c5, 0x000019e6, 0x00001a1e, 0x00001a42, + 0x00001a52, 0x00001a6e, 0x00001a86, 0x00001a9b, + 0x00001ab7, 0x00001acb, 0x00001adb, 0x00001b08, + 0x00001b1d, 0x00001b34, 0x00001b57, 0x00001b7a, + 0x00001b8e, 0x00001bad, 0x00001bd5, 0x00001c03, + 0x00001c32, 0x00001c69, 0x00001ca9, 0x00001cce, // Entry E0 - FF - 0x00001cd0, 0x00001cf8, 0x00001d31, 0x00001d3f, - 0x00001d99, 0x00001dc0, 0x00001dd1, 0x00001de7, - 0x00001df3, 0x00001e05, 0x00001e1a, 0x00001e49, - 0x00001e6f, 0x00001e9f, 0x00001ed2, 0x00001eeb, - 0x00001f0c, 0x00001f1e, 0x00001f2e, 0x00001f40, - 0x00001f5a, 0x00001f71, 0x00001f84, 0x00001f95, - 0x00001fac, 0x00001fbb, 0x00001fec, 0x00001ffc, - 0x0000202e, 0x00002040, 0x00002053, 0x00002076, + 0x00001ce1, 0x00001cf3, 0x00001d23, 0x00001d64, + 0x00001d75, 0x00001d8a, 0x00001dae, 0x00001dd6, + 0x00001e0f, 0x00001e1d, 0x00001e77, 0x00001e9e, + 0x00001eaf, 0x00001ec5, 0x00001ed1, 0x00001ee3, + 0x00001ef8, 0x00001f27, 0x00001f4d, 0x00001f7d, + 0x00001fb0, 0x00001fc9, 0x00001fea, 0x00001ffc, + 0x0000200c, 0x0000201e, 0x00002038, 0x0000204f, + 0x00002062, 0x00002073, 0x0000208a, 0x00002099, // Entry 100 - 11F - 0x0000208b, 0x000020a3, 0x000020b2, 0x000020c7, - 0x000020e2, 0x000020fb, 0x0000210b, 0x0000211e, - 0x00002133, 0x00002149, 0x00002170, 0x000021a5, - 0x000021b5, 0x000021dc, 0x000021ee, 0x00002201, - 0x00002215, 0x00002236, 0x00002267, 0x00002284, - 0x000022b3, 0x000022bd, 0x000022cf, 0x00002300, - 0x0000233f, 0x00002364, 0x00002393, 0x000023a8, - 0x000023ba, 0x000023e6, 0x000023f8, 0x00002407, + 0x000020ca, 0x000020da, 0x0000210c, 0x0000211e, + 0x00002131, 0x00002154, 0x00002169, 0x00002181, + 0x00002190, 0x000021a5, 0x000021c0, 0x000021d9, + 0x000021e9, 0x000021fc, 0x00002211, 0x00002227, + 0x0000224e, 0x00002283, 0x00002293, 0x000022ba, + 0x000022cc, 0x000022df, 0x000022f3, 0x00002314, + 0x00002345, 0x00002362, 0x00002391, 0x0000239b, + 0x000023ad, 0x000023de, 0x0000241d, 0x00002442, // Entry 120 - 13F - 0x00002423, 0x0000244e, 0x00002461, 0x0000246e, - 0x00002478, 0x0000249c, 0x000024b1, 0x000024e3, - 0x00002515, 0x0000252c, 0x00002534, 0x0000253b, - 0x00002543, 0x0000254a, 0x0000258c, 0x0000259f, - 0x000025ab, 0x000025b2, 0x000025f7, 0x00002611, - 0x0000268e, 0x000026ab, 0x000026f5, 0x00002700, - 0x0000270e, 0x00002731, 0x0000275b, 0x00002763, - 0x0000276d, 0x00002774, 0x00002778, 0x00002783, + 0x00002471, 0x00002486, 0x00002498, 0x000024c4, + 0x000024d6, 0x000024e5, 0x00002501, 0x0000252c, + 0x0000253f, 0x0000254c, 0x00002556, 0x0000257a, + 0x0000258f, 0x000025c1, 0x000025f3, 0x0000260a, + 0x00002612, 0x00002619, 0x00002621, 0x00002628, + 0x0000266a, 0x0000267d, 0x00002689, 0x00002690, + 0x000026d5, 0x000026ef, 0x0000276c, 0x00002789, + 0x000027d3, 0x000027de, 0x000027ec, 0x0000280f, // Entry 140 - 15F - 0x00002795, 0x000027a8, 0x000027b5, 0x000027c0, - 0x000027ce, 0x00002809, 0x00002825, 0x00002843, - 0x000028f2, 0x00002907, 0x00002924, 0x0000295b, - 0x000029a4, 0x000029af, 0x000029bb, 0x000029cb, - 0x000029e7, 0x00002a01, 0x00002a1e, 0x00002a3c, - 0x00002a46, 0x00002a76, 0x00002a9f, 0x00002af0, - 0x00002af7, 0x00002aff, 0x00002b06, 0x00002b32, - 0x00002b3c, 0x00002b8e, 0x00002b9e, 0x00002bae, + 0x00002839, 0x00002841, 0x0000284b, 0x00002852, + 0x00002856, 0x00002861, 0x00002873, 0x00002886, + 0x00002893, 0x0000289e, 0x000028ac, 0x000028e7, + 0x00002903, 0x00002921, 0x000029d0, 0x000029e5, + 0x00002a02, 0x00002a39, 0x00002a82, 0x00002a8d, + 0x00002a99, 0x00002aa9, 0x00002ac5, 0x00002adf, + 0x00002afc, 0x00002b1a, 0x00002b24, 0x00002b54, + 0x00002b7d, 0x00002bce, 0x00002bd5, 0x00002bdd, // Entry 160 - 17F - 0x00002bd5, 0x00002c02, 0x00002c0a, 0x00002ce9, - 0x00002cf1, 0x00002cf6, 0x00002cff, 0x00002d08, - 0x00002d0e, 0x00002d17, 0x00002d21, 0x00002d28, - 0x00002d32, 0x00002d3e, 0x00002d4a, 0x00002d54, - 0x00002d6e, 0x00002d88, 0x00002dac, 0x00002dbd, - 0x00002dd7, 0x00002de6, 0x00002dfa, 0x00002e08, - 0x00002e3b, 0x00002e54, 0x00002e6b, 0x00002e8a, - 0x00002e99, 0x00002ea1, 0x00002eb1, 0x00002ec7, + 0x00002be4, 0x00002c10, 0x00002c1a, 0x00002c6c, + 0x00002c7c, 0x00002c8c, 0x00002cb3, 0x00002ce0, + 0x00002ce8, 0x00002dc7, 0x00002dcf, 0x00002dd4, + 0x00002ddd, 0x00002de6, 0x00002dec, 0x00002df5, + 0x00002dff, 0x00002e06, 0x00002e10, 0x00002e1c, + 0x00002e28, 0x00002e32, 0x00002e4c, 0x00002e66, + 0x00002e8a, 0x00002e9b, 0x00002eb5, 0x00002ec4, + 0x00002ed8, 0x00002ee6, 0x00002f19, 0x00002f32, // Entry 180 - 19F - 0x00002edf, 0x00002ef4, 0x00002f11, 0x00002f28, - 0x00002f43, 0x00002f53, 0x00002f65, 0x00002f77, - 0x00002f86, 0x00002f97, 0x00002fb4, 0x00002fda, - 0x00002fec, 0x00003003, 0x0000301e, 0x0000302e, - 0x00003043, 0x00003057, 0x0000306a, 0x0000307d, - 0x00003094, 0x000030a0, 0x000030b8, 0x000030c7, - 0x000030d4, 0x000030e6, 0x00003109, 0x00003117, - 0x00003144, 0x0000317c, 0x00003191, 0x00003210, + 0x00002f49, 0x00002f68, 0x00002f77, 0x00002f7f, + 0x00002f8f, 0x00002fa5, 0x00002fbd, 0x00002fd2, + 0x00002fef, 0x00003006, 0x00003021, 0x00003031, + 0x00003043, 0x00003055, 0x00003064, 0x00003075, + 0x00003092, 0x000030b8, 0x000030ca, 0x000030e1, + 0x000030fc, 0x0000310c, 0x00003121, 0x00003135, + 0x00003148, 0x0000315b, 0x00003172, 0x0000317e, + 0x00003196, 0x000031a5, 0x000031b2, 0x000031c4, // Entry 1A0 - 1BF - 0x000032d6, 0x000033b7, 0x000033fc, 0x00003425, - 0x00003442, 0x00003460, 0x0000349b, 0x000034a9, - 0x000034c2, 0x00003519, 0x00003546, 0x00003622, - 0x00003633, 0x00003646, 0x00003651, 0x0000365f, - 0x0000366c, 0x0000367a, 0x000036b0, 0x000036df, - 0x00003710, 0x00003728, 0x00003734, 0x0000373b, - 0x00003747, 0x0000374f, 0x00003753, 0x00003761, - 0x0000376c, 0x0000377a, 0x0000378e, 0x000037ce, + 0x000031e7, 0x000031f5, 0x00003222, 0x0000325a, + 0x0000326f, 0x000032ee, 0x000033b4, 0x00003495, + 0x000034da, 0x00003503, 0x00003520, 0x0000353e, + 0x00003579, 0x00003587, 0x000035a0, 0x000035f7, + 0x00003624, 0x00003700, 0x00003711, 0x00003724, + 0x0000372f, 0x0000373d, 0x0000374a, 0x00003758, + 0x0000378e, 0x000037bd, 0x000037ee, 0x00003806, + 0x00003812, 0x00003819, 0x00003825, 0x0000382d, // Entry 1C0 - 1DF - 0x000037ea, 0x000037f8, 0x000037fe, 0x0000381a, - 0x0000381e, 0x00003848, 0x0000385b, 0x00003867, - 0x00003871, 0x00003876, 0x0000387e, 0x00003887, - 0x0000389b, 0x000038a3, 0x000038b2, 0x000038b9, - 0x000038c0, 0x000038d0, 0x000038e4, 0x000038f1, - 0x0000390d, 0x00003988, 0x0000398f, 0x00003997, - 0x000039b9, 0x000039cd, 0x000039d8, 0x000039fa, - 0x00003a05, 0x00003a10, 0x00003a49, 0x00003a4e, + 0x00003831, 0x0000383f, 0x0000384a, 0x00003858, + 0x0000386c, 0x000038ac, 0x000038c8, 0x000038d6, + 0x000038dc, 0x000038f8, 0x000038fc, 0x00003926, + 0x00003939, 0x00003945, 0x0000394f, 0x00003954, + 0x0000395c, 0x00003965, 0x00003979, 0x00003981, + 0x00003990, 0x00003997, 0x0000399e, 0x000039ae, + 0x000039c2, 0x000039cf, 0x000039eb, 0x00003a66, + 0x00003a6d, 0x00003a75, 0x00003a97, 0x00003aab, // Entry 1E0 - 1FF - 0x00003a54, 0x00003a60, 0x00003a84, 0x00003ab8, - 0x00003aca, 0x00003b08, 0x00003b24, 0x00003b59, - 0x00003b73, 0x00003bab, 0x00003bb7, 0x00003bc2, - 0x00003bce, 0x00003bd4, 0x00003bdf, 0x00003be6, - 0x00003bee, 0x00003bf3, 0x00003c32, 0x00003c3e, - 0x00003c4a, 0x00003c66, 0x00003c87, 0x00003cb0, - 0x00003cd6, 0x00003cdf, 0x00003cf1, 0x00003d48, - 0x00003d6b, 0x00003da3, 0x00003db1, 0x00003dbb, + 0x00003ab6, 0x00003ad8, 0x00003ae3, 0x00003aee, + 0x00003b27, 0x00003b2c, 0x00003b32, 0x00003b3e, + 0x00003b62, 0x00003b96, 0x00003ba8, 0x00003be6, + 0x00003c02, 0x00003c37, 0x00003c51, 0x00003c89, + 0x00003c95, 0x00003ca0, 0x00003cac, 0x00003cb2, + 0x00003cbd, 0x00003cc4, 0x00003ccc, 0x00003cd1, + 0x00003d10, 0x00003d1c, 0x00003d28, 0x00003d44, + 0x00003d65, 0x00003d8e, 0x00003db4, 0x00003dbd, // Entry 200 - 21F - 0x00003dc4, 0x00003dd5, 0x00003dda, 0x00003ddd, - 0x00003de4, 0x00003e5c, 0x00003e6c, 0x00003e79, - 0x00003e86, 0x00003e8c, 0x00003e97, 0x00003ea7, - 0x00003ec5, 0x00003efa, 0x00003f1a, 0x00003f20, - 0x00003f25, 0x00003f36, 0x00003f3a, 0x00003f44, - 0x00003f4a, 0x00003f53, 0x00003f60, 0x00003f6f, - 0x00003f74, 0x00003f7b, 0x00003f83, 0x00003f8a, - 0x00003f91, 0x00003f98, 0x00003fcb, 0x00003ff5, + 0x00003dcf, 0x00003e26, 0x00003e49, 0x00003e81, + 0x00003e8f, 0x00003e99, 0x00003ea2, 0x00003eb3, + 0x00003eb8, 0x00003ebb, 0x00003ec2, 0x00003f3a, + 0x00003f4a, 0x00003f57, 0x00003f64, 0x00003f6a, + 0x00003f75, 0x00003f85, 0x00003fa3, 0x00003fd8, + 0x00003ff8, 0x00003ffe, 0x00004003, 0x00004014, + 0x00004018, 0x00004022, 0x00004028, 0x00004031, + 0x0000403e, 0x0000404d, 0x00004052, 0x00004059, // Entry 220 - 23F - 0x00004002, 0x0000400e, 0x00004037, 0x00004062, - 0x0000406e, 0x0000407a, 0x00004087, 0x000040a8, - 0x000040d9, 0x000040e9, 0x00004123, 0x00004141, - 0x0000416e, 0x0000417a, 0x00004190, 0x000041ab, - 0x000041ca, 0x000041f0, 0x00004200, 0x0000420f, - 0x0000421e, 0x00004256, 0x00004273, 0x0000429e, - 0x000042aa, 0x000042b6, 0x000042f1, 0x00004335, - 0x00004340, 0x00004348, 0x00004352, 0x0000435e, + 0x00004061, 0x00004068, 0x0000406f, 0x00004076, + 0x000040a9, 0x000040d3, 0x000040e0, 0x000040ec, + 0x00004115, 0x00004140, 0x0000414c, 0x00004158, + 0x00004165, 0x00004186, 0x000041b7, 0x000041c7, + 0x00004201, 0x0000421f, 0x0000424c, 0x00004258, + 0x0000426e, 0x00004289, 0x000042a8, 0x000042ce, + 0x000042de, 0x000042ed, 0x000042fc, 0x00004334, + 0x00004351, 0x0000437c, 0x00004388, 0x00004394, // Entry 240 - 25F - 0x00004365, 0x00004397, 0x000043bd, 0x00004424, - 0x0000447e, 0x000044a3, 0x000044bb, 0x000044f0, - 0x0000452e, 0x00004571, 0x0000458e, 0x000045c2, - 0x0000462f, 0x00004662, 0x0000466f, 0x00004680, - 0x00004691, 0x000046a3, 0x000046f3, 0x000046ff, - 0x0000471c, 0x00004743, 0x0000474f, 0x00004771, - 0x00004797, 0x000047a7, 0x000047ac, 0x000047b3, - 0x000047bb, 0x000047c6, 0x000047cc, 0x000047d3, + 0x000043cf, 0x00004413, 0x0000441e, 0x00004426, + 0x00004430, 0x0000443c, 0x00004443, 0x00004475, + 0x0000449b, 0x00004502, 0x0000455c, 0x00004581, + 0x00004599, 0x000045ce, 0x0000460c, 0x0000464f, + 0x0000466c, 0x000046a0, 0x0000470d, 0x00004740, + 0x0000474d, 0x0000475e, 0x0000476f, 0x00004781, + 0x000047d1, 0x000047dd, 0x000047fa, 0x00004821, + 0x0000482d, 0x0000484f, 0x00004875, 0x00004885, // Entry 260 - 27F - 0x000047db, 0x000047ea, 0x000047f4, 0x000047fe, - 0x0000480e, 0x00004822, 0x00004828, 0x00004834, - 0x0000483a, 0x0000483f, 0x00004844, 0x00004851, - 0x00004855, 0x0000485b, 0x00004867, 0x0000489c, - 0x000048b6, 0x000048de, 0x000048eb, 0x000048f4, - 0x000048fd, 0x00004909, 0x00004910, 0x0000491b, - 0x0000492a, 0x00004930, 0x0000493b, 0x00004948, - 0x00004966, 0x00004972, 0x00004993, 0x000049a0, + 0x0000488a, 0x00004891, 0x00004899, 0x000048a4, + 0x000048aa, 0x000048b1, 0x000048b9, 0x000048c8, + 0x000048d2, 0x000048dc, 0x000048ec, 0x00004900, + 0x00004906, 0x00004912, 0x00004918, 0x0000491d, + 0x00004922, 0x0000492f, 0x00004933, 0x00004939, + 0x00004945, 0x0000497a, 0x00004994, 0x000049bc, + 0x000049c9, 0x000049d2, 0x000049db, 0x000049e7, + 0x000049ee, 0x000049f9, 0x00004a08, 0x00004a0e, // Entry 280 - 29F - 0x000049a9, 0x000049b7, 0x000049c0, 0x000049db, - 0x000049f5, 0x00004a1d, 0x00004a2c, 0x00004a33, - 0x00004a3c, 0x00004a54, 0x00004a70, 0x00004a80, - 0x00004a85, 0x00004a91, 0x00004aa7, 0x00004acc, - 0x00004b0f, 0x00004b22, 0x00004b4f, 0x00004b87, - 0x00004bc4, 0x00004bf5, 0x00004c4c, 0x00004c59, - 0x00004cb7, 0x00004ccf, 0x00004ceb, 0x00004d05, - 0x00004d1f, 0x00004d43, 0x00004d61, 0x00004d77, + 0x00004a19, 0x00004a26, 0x00004a44, 0x00004a50, + 0x00004a71, 0x00004a7e, 0x00004a87, 0x00004a95, + 0x00004a9e, 0x00004ab9, 0x00004ad3, 0x00004afb, + 0x00004b0a, 0x00004b11, 0x00004b1a, 0x00004b32, + 0x00004b4e, 0x00004b5e, 0x00004b63, 0x00004b6f, + 0x00004b85, 0x00004baa, 0x00004bed, 0x00004c00, + 0x00004c2d, 0x00004c65, 0x00004ca2, 0x00004cd3, + 0x00004d2a, 0x00004d37, 0x00004d95, 0x00004dad, // Entry 2A0 - 2BF - 0x00004d8d, 0x00004da1, 0x00004db6, 0x00004dcd, - 0x00004dde, 0x00004e02, 0x00004e12, 0x00004e35, - 0x00004e6b, 0x00004e82, 0x00004e9e, 0x00004ea3, - 0x00004ebe, 0x00004edc, 0x00004ee7, 0x00004ef6, - 0x00004f08, 0x00004f13, 0x00004f1d, 0x00004f45, - 0x00004f57, 0x00004f78, 0x00004f8a, 0x00004faa, - 0x00004fcf, 0x00004fe9, 0x00005001, 0x00005031, - 0x00005067, 0x00005073, 0x000050a0, 0x000050cf, + 0x00004dc9, 0x00004de3, 0x00004dfd, 0x00004e21, + 0x00004e3f, 0x00004e55, 0x00004e6b, 0x00004e7f, + 0x00004e94, 0x00004eab, 0x00004ebc, 0x00004ee0, + 0x00004ef0, 0x00004f13, 0x00004f49, 0x00004f60, + 0x00004f7c, 0x00004f81, 0x00004f9c, 0x00004fba, + 0x00004fc5, 0x00004fd4, 0x00004fe6, 0x00004ff1, + 0x00004ffb, 0x00005023, 0x00005035, 0x00005056, + 0x00005068, 0x00005088, 0x000050ad, 0x000050c7, // Entry 2C0 - 2DF - 0x000050d8, 0x000050e9, 0x00005109, 0x00005147, - 0x00005199, 0x000051f7, 0x0000522b, 0x00005246, - 0x0000525d, 0x00005280, 0x000052ac, 0x000052ca, - 0x000052e5, 0x000052ff, 0x00005323, 0x0000533b, - 0x0000535f, 0x00005382, 0x0000539a, -} // Size: 2916 bytes + 0x000050df, 0x0000510f, 0x00005145, 0x00005151, + 0x0000517e, 0x000051ad, 0x000051b6, 0x000051c7, + 0x000051e7, 0x00005225, 0x00005277, 0x000052d5, + 0x00005309, 0x00005324, 0x0000533b, 0x0000535e, + 0x0000538a, 0x000053a8, 0x000053c3, 0x000053dd, + 0x00005401, 0x00005419, 0x0000543d, 0x00005460, + 0x00005478, +} // Size: 2940 bytes -const enData string = "" + // Size: 21402 bytes +const enData string = "" + // Size: 21624 bytes "\x02Restricted Page\x02This function is only allowed for paid users. Ple" + "ase upgrade\x02Continue to Upgrade\x02Social bookmarking plus link shari" + "ng, shortening and listings all in one app.\x02Welcome to LinkTaco! Here" + @@ -983,301 +991,304 @@ const enData string = "" + // Size: 21402 bytes "\x02No audit logs to display\x02Next\x02Prev\x02The passwords you entere" + "d do not match.\x02The tag ordering you entered is invalid.\x02Edit Prof" + "ile\x02Save\x02Default Lang\x02Timezone\x02Default Tag Order\x02Name\x02" + - "Username\x02Image\x02Back\x02Cancel\x02Spanish\x02English\x02Count\x02Co" + - "unt (reverse)\x02Name (reverse)\x02Date Created\x02Date Created (reverse" + - ")\x02Profile updated successfully\x02Settings\x02Slug\x02Subscription" + - "\x02Is Active\x02Email\x02Default Language\x02Organizations\x02Current O" + - "rganization\x02Edit\x02Members\x02Actions\x02Change password\x02Update e" + - "mail\x02Edit profile\x02Manage Your Organizations\x02Upgrade Org\x02View" + - " Audit Logs\x02Bookmarklet\x02Add to LinkTaco\x02This special link allow" + - "s you to save to LinkTaco directly by using a bookmark in your web brows" + - "er.\x02Drag and drop this button to your web browser toolbar or your boo" + - "kmarks.\x02Complete Registration\x02Full Name\x02Password\x02Registratio" + - "n Completed\x02Register\x02Email Address\x02Confirm Password\x02Already " + - "have an account? Click here to login\x02Welcome to Links\x02Set up your " + - "account, so you can save links.\x02Registration is not enabled on this s" + - "ystem. Contact the admin for an account.\x02We sent you a confirmation e" + - "mail. Please click the link in that email to confirm your account.\x02Yo" + - "u have successfully registered your account. You can now login.\x02Chang" + - "e Password\x02Current Password\x02New Password\x02Confirm New Password" + - "\x02Enter New Password\x02Reset Password\x02Password Changed\x02You can " + - "now\x02return to the login page\x02and login\x02Links - Reset your passw" + - "ord\x02Forgot Password?\x02If the email address given exists in our syst" + - "em then we just sent it a login link. Click this link to reset your pass" + - "word. The link expires in 1 hour.\x02Send Reset Link\x02Someone, possibl" + - "y you, requested to reset your Links password.\x02To complete your passw" + - "ord reset, just click the link below:\x02This link will expire in 1 hour" + - ". If you didn't request this link you can safely delete this email now." + - "\x02Update Email\x02You've been sent a confirmation email. Please click " + - "the link in the email to confirm your email change. The confirmation ema" + - "il will expire in 2 hours.\x02Someone, possibly you, requested to reset " + - "your Links email address. To complete this update, just click the link " + - "below:\x02This link will expire in 2 hour. If you didn't request this li" + - "nk you can safely delete this email now.\x02Change Email\x02Login\x02No " + - "accounts? Click here to create one\x02Login Email\x02Someone, possibly y" + - "ou, requested this login via email link. To login to your account, just " + - "click the link below:\x02Password changed successfully\x02Email updated " + - "successfully\x02You've been logged out successfully.\x02You've successfu" + - "lly updated your password.\x02You've successfully updated your email add" + - "ress.\x02You've successfully confirmed your email address.\x02You must v" + - "erify your email address before logging in\x02This account is currently " + - "unable to access the system.\x02Successful login.\x02LinkTaco - Confirm " + - "account email\x02Please confirm your account\x02To confirm your email ad" + - "dress and complete your Links registration, please click the link below." + - "\x02Confirm\x02If you didn't request this link you can safely delete thi" + - "s email now.\x02Confirm your email address\x02We sent you a new confirma" + - "tion email. Please click the link in that email to confirm your account." + - "\x02Analytics\x02Engagements over time\x02Country\x02City\x02Referrer" + - "\x02Devices\x02Apply\x02Weeks\x02Days\x02Only showing the last 60 days. " + - "Upgrade your organization to paid to view all historical data\x02Click h" + - "ere to upgrade\x02Only showing country data. Upgrade your organization t" + - "o paid to view all stats\x02Upgrade your organization to paid to view th" + - "e detail stats\x02QR Scans\x02Links\x02No Data\x02Name is required\x02Na" + - "me may not exceed 150 characters\x02Org username is required\x02Org user" + - "name may not exceed 150 characters\x02You are not allowed to create more" + - " free organizations. Please upgrade to a paid org\x02This organization s" + - "lug can not be used. Please chose another one\x02This organization slug " + - "is already registered\x02CurrentSlug is required\x02Slug is required\x02" + - "Slug may not exceed 150 characters\x02Organization Not Found\x02This org" + - "anization name is already registered\x02This slug can not be used. Pleas" + - "e chose another one\x02You are not allowed to enable/disabled user type " + - "organization\x02You are not allowed to have more than two free organizat" + - "ions. Please upgrade\x02This organization has an active subscription. Pl" + - "ease cancel it first\x02Free organizations can not use Private permissio" + - "n. Please upgrade to use Private permission\x02Invalid default permissio" + - "n value\x02Invalid Visibility value.\x02Invalid URL.\x02URL may not exce" + - "ed 2048 characters\x02Org slug is required.\x02Title is required.\x02Tit" + - "le may not exceed 500 characters\x02Tags may not exceed 10\x02Only membe" + - "rs with write perm are allowed to perform this action\x02Free organizati" + - "ons are not allowed to create private links. Please upgrade\x02Link hash" + - " required\x02Element Not Found\x02You are not allowed to edit this field" + - " for notes\x02Link Not Found\x02This user is not allowed to perform this" + - " action\x02Description is required.\x02Free organizations are not allowe" + - "d to create private notes. Please upgrade\x02Error compiling url regex: " + - "%[1]s\x02Org slug is required\x02User email is required\x02Email may not" + - " exceed 255 characters\x02Invalid email format\x02Invalid Permission\x02" + - "This email domain is not allowed\x02This function is only allowed for bu" + - "siness users.\x02A new register invitation was sent to %[1]s\x02The User" + - " you try to invite is not verified\x02A new member invitation was sent t" + - "o %[1]s\x02Link Taco: Invitation to join organization\x02User not found " + - "for given email\x02The user for given email is not a member of given org" + - "anization\x02The member was removed successfully\x02Confirmation key is " + - "required.\x02Confirmation Not Found\x02Invalid Confirmation Type\x02Inva" + - "lid Confirmation Target\x02Permission Not Found\x02User Not Found\x02The" + - " User is not verified\x02The user was added successfully\x02Email is req" + - "uired\x02Password is required\x02Password may not exceed 100 characters" + - "\x02Username is required\x02Username may not exceed 150 characters\x02Re" + - "gistration is not enabled\x02Invalid Key\x02Invalid Email\x02This email " + - "is already registered\x02This username can not be used. Please chose ano" + - "ther one\x02This username is already registered\x02Key is required\x02Co" + - "nfirmation User Not Found\x02DefaultLang is required\x02Timezone is requ" + - "ired\x02DefaultTagOrder is required\x02Timezone is invalid\x02Lang is in" + - "valid\x02No personal organization found for this user\x02Invalid domain " + - "name.\x02Invalid service value.\x02Name may not exceed 255 characters" + - "\x02Name may not exceed 500 characters\x02Invalid FQDN format\x02Organiz" + - "aiton Slug is required.\x02Invalid permissions for Organization ID\x02Th" + - "is function is only allowed for paid users.\x02The domain is already reg" + - "istered in the system\x02There is already a domain registered for given " + - "service\x02Error checking the DNS entry for domain. Please try again lat" + - "er\x02CNAME record for domain is incorrect\x02Invalid domain ID.\x02inva" + - "lid domain ID\x02Only superusers can delete system level domains\x02Unab" + - "le to delete. Domain has active short links or link listings\x02URL is r" + - "equired.\x02DomainID is required\x02Title may not exceed 150 characters" + - "\x02Short Code may not exceed 20 characters\x02This shortCode can not be" + - " used. Please chose another one\x02Org Not Found\x02You have reached you" + - "r monthly short link limit. Please upgrade to remove this limitation." + - "\x02short-service-domain is not configured\x02Domain Not Found\x02Duplic" + - "ated short code\x02Id required\x02Slug is required.\x02Org Slug is requi" + - "red\x02Free accounts are only allowed 1 link listing.\x02list-service-do" + - "main is not configured\x02This Slug is already registered for this domai" + - "n\x02There is already a default listing for this domain\x02ListingSlug i" + - "s required.\x02LinkOrder can't be lower than 0.\x02Listing Not Found\x02" + - "ID is required.\x02Title is required\x02ID can't be lower than 0.\x02Lis" + - "ting Link Not Found\x02Title is too long.\x02Code is invalid.\x02Element" + - " ID is invalid.\x02List Not Found\x02You can't create more than 5 qr cod" + - "es per lists.\x02Short Not Found\x02You can't create more than 5 qr code" + - "s per shorts.\x02QR Code Not Found\x02User follows %[1]s\x02This user do" + - "es not follow this org\x02User unfollows %[1]s\x02Organization not found" + - ".\x02Tag not found.\x02New tag is required.\x02newTag value is not valid" + - ".\x02Tag renamed successfully\x02Invalid orgType\x02Invalid visibility" + - "\x02Invalid level value.\x02Invalid status value.\x02A valid Organizaito" + - "n Slug is required.\x02Organization Slug is required for user level doma" + - "ins\x04\x00\x01 \x0b\x02Invalid ID\x02Domain in use. Can not change serv" + - "ice.\x02Name is required.\x02Email is required.\x02Register Invitation" + - "\x02Linktaco: Invitation to Register\x02You have been invited by %[1]s t" + - "o join Link Taco\x02Please click the link below:\x02You can not send bot" + - "h after and before cursors\x02Not Found\x02BaseURL Not Found\x02Invalid " + - "tag cloud type without organization slug\x02Only members with read perm " + - "are allowed to perform this action\x02Unable to find suitable organizati" + - "on\x02Only superusers can fetch system level domains\x02Link Short Not F" + - "ound\x02Invalid code type\x02Org slug is required for this kind of token" + - "\x02Access Restricted\x02Access denied.\x02Invalid listing ID provided" + - "\x02Invalid listing for specified organization\x02GraphQL Playground\x02" + - "Submit Query\x02Back Home\x02Invalid origin source for importer.\x02The " + - "file is required\x02The file submitted for this source should be html" + - "\x02The file submitted for this source should be json\x02Personal Access" + - " Tokens\x02Comment\x02Issued\x02Expired\x02Revoke\x02You have not create" + - "d any personal access tokens for your account.\x02Authorized Clients\x02" + - "Client Name\x02Grants\x02You have not granted any third party clients ac" + - "cess to your account.\x02Add Personal Access Token\x02Note: Your access " + - "token <strong>will never be shown to you again.</strong> Keep this secre" + - "t. It will expire a year from now.\x02Revoke Personal Access Token\x02Do" + - " you want to revoke this personal access token? This can not be undone." + - "\x02Yes, do it\x02No, nevermind\x02Successfully added personal access" + - "\x02Successfully revoked authorization token.\x02Clients\x02Client ID" + - "\x02Manage\x02Add\x02No Clients\x02Add OAuth2 Client\x02Client Descripti" + - "on\x02Redirect URL\x02Client URL\x02Client Secret\x02Note: Your client s" + - "ecret will never be shown to you again.\x02OAuth 2.0 client management" + - "\x02Revoke tokens & client secret\x02If OAuth 2.0 bearer tokens issued f" + - "or your OAuth client, or your client secret, have been disclosed to a th" + - "ird-party, you must revoke all tokens and have replacements issued.\x02R" + - "evoke client tokens\x02Unregister this OAuth client\x02This will permane" + - "ntly unregister your OAuth 2.0 client\x02revoke all tokens issued to it," + - " and prohibit the issuance of new tokens.\x02Unregister\x02Description" + - "\x02Informative URL\x02OAuth 2.0 client registered\x02Successfully added" + - " client\x02Successfully revoked client.\x02Successfully reissued client." + - "\x02Authorize\x02would like to access to your Link Taco account.\x02is a" + - " third-party application operated by\x02You may revoke this access at an" + - "y time on the OAuth tab of your account profile.\x02Scopes\x02Approve" + - "\x02Reject\x02LinkTaco - Your bookmark import is complete\x02Hi there," + - "\x02Just wanted to let you know that your bookmark import has completed " + - "successfully!\x02- LinkTaco Team\x02Inactive Domain\x02The %[1]s domain " + - "is currently inactive\x02Please upgrade your account to reactivate it" + - "\x02Pricing\x02Every account can create unlimited organizations. Each or" + - "ganization has it's own bookmarks, listings, analytics, etc. All of the " + - "features below belong to each organization with their own unique URL's, " + - "groupings, and so on.\x02Feature\x02Free\x02Personal\x02Business\x02Pric" + - "e\x02per year\x02per month\x02months\x02Unlimited\x02Public only\x02Try " + - "It FREE\x02Bookmarks\x02Save public/private links\x02Save public/private" + - " notes\x02Follow other organizations (social)\x02Organize by tags\x02Adv" + - "anced filtering/search\x02Full RSS feeds\x02Custom domain + SSL\x02Link " + - "Listings\x02Create link listings (ie, social media bios, etc.)\x02Organi" + - "ze listings by tag\x02Filter/Search listings\x02Unlimited QR codes per l" + - "isting\x02Full Analytics\x02Listing\x02Link Shortening\x02Unlimited shor" + - "t links\x02Organize shorts by tags\x02Filter/Search shorts\x02Unlimited " + - "QR codes per short\x02Full analytics history\x02QR Code specific analyti" + - "cs\x02Click analytics\x02Referer analyitcs\x02Country analytics\x02City " + - "analytics\x02Device analytics\x02Collaboration / Integrations\x02Add unl" + - "imited members to organization\x02Slack Integration\x02MatterMost Integr" + - "ation\x02Build Your Own Integration\x02Import / Export\x02Import from Pi" + - "nboard\x02Import from Firefox\x02Import from Chrome\x02Import from Safar" + - "i\x02Export in JSON or HTML\x02API Powered\x02Full GraphQL API Access" + - "\x02OAuth2 Support\x02Self Hosting\x02Fully open source\x02Host your own" + - " version of Link Taco\x02Documentation\x02Pricing and feature details fo" + - "r LinkTaco.com\x02pricing, links, linktaco, feature, plans, pricing plan" + - "s\x02Welcome to LinkTaco!\x02Here you can mix all your link saving and s" + - "haring needs in one tight little bundle. Much like a taco. A link taco i" + - "f you will.\x02LinkTaco is an open source platform where you can host al" + - "l of your links. Custom domains, QR codes, Analytics, full API, multiple" + - " organizations w/unlimited members are just some of what's included.\x02" + - "Social bookmarking is not new, it's just been forgotten. Link shortening" + - " with analytics has been around forever. Link listings became cool once " + - "social media started allowing us to post a link to our websites in our p" + - "rofiles.\x02Up until now, all of these things were hosted on different s" + - "ervices.\x02Social bookmarking: Pinboard (Delicious)\x02Link shortening:" + - " Bitly et al\x02Link listings: Linktree et al\x02Peace Pinboard. Bye Bit" + - "ly. Later Linktree. Hello LinkTaco!\x02Since we're a\x02100% open source" + - " project\x04\x01 \x00R\x02you can host your own instance if you'd like f" + - "ull control over your own platform.\x02See the installation documentatio" + - "n for more.\x02Ready to get started? It's free to make an account and us" + - "e it forever (with some limitations). To use all features you have to pa" + - "y just a few bucks a year, or a few per month if you're a business, and " + - "that's it. Simple!\x02Explore Features\x02Organize Bookmarks\x02Link Lis" + - "ts\x02Collaboration\x02Integrations\x02Import Export\x02Unlimited link l" + - "istings (for social media bios, etc.)\x02Members can add/edit/remove lin" + - "ks (if allowed)\x02Members have access based on permissions granted\x02B" + - "rowser bookmark widget\x02Domain List\x02Delete\x02Lookup Name\x02Servic" + - "e\x02for\x02Link Shortner\x02No Domains\x02Create Domain\x02Migrate Shor" + - "t Links\x02Old links won't work. All code will be moved to the new domai" + - "n.\x02Domain created successfully\x02Delete Domain\x02%[1]s\x02Domain su" + - "ccessfully deleted\x02Yes\x02Do you really whant to delete this domain" + - "\x02Your Organizations\x02Open Source\x02Sponsored\x02Paid\x02Enabled" + - "\x02Disabled\x02Manage Subscription\x02Domains\x02Manage Members\x02Expo" + - "rt\x02Import\x02Payment History\x02Create Organization\x02Org Username" + - "\x02Default Bookmark Visibility\x02Sorry, you have exceeded the amount o" + - "f free accounts available. Please update your current free account to cr" + - "eate one more\x02Public\x02Private\x02Organization created successfully" + - "\x02Update Organization\x02Is Enabled\x02Organization updated successful" + - "ly\x02Add Member\x02Permission\x02Please upgrade to a Business organizat" + - "ion to add members\x02Read\x02Write\x02Admin Write\x02An invitation was " + - "sent to this user\x02Something went wrong, impossible to send invitation" + - "\x02Delete Org Member\x02Something went wrong. This member could not be " + - "deleted: %[1]s\x02Member successfully deleted\x02Delete member %[1]s (%[" + - "2]s) from Organization %[3]s?\x02Member added succesxfully\x02Something " + - "went wrong. Impossible to get the member data\x02Member List\x02No membe" + - "rs\x02Create Link\x02Title\x02Visibility\x02Unread\x02Starred\x02Tags" + - "\x02Use commas to separate your tags. Example: tag 1, tag 2, tag 3\x02Ar" + - "chive URL\x02bookmarklet\x02You can also submit via the\x02A link was su" + - "ccessfully created.\x02Error fetching referenced url: Not found\x02Error" + - " fetching referenced link: %[1]v\x02bookmark\x02Popular Bookmarks\x02Thi" + - "s ain't a popularity contest or anything but this is weird that there ar" + - "e no links!\x02Most popular links on LinkTaco.com\x02popular, links, lin" + - "ktaco, feature, plans, pricing plans\x02Popular Links\x02Following\x02Un" + - "follow\x02No organizations\x02Feed\x02By\x02Search\x02Your feed is empty" + - " :( Go follow some people. Try the Popular or Recent feeds to find some " + - "interesting people to follow.\x02Advanced Search\x02Include Tags\x02Excl" + - "ude Tags\x02Clear\x02Followings\x02Saved Bookmarks\x02This feed has no l" + - "inks. Booo!\x02Recent bookmarks for URL %[1]s added on LinkTaco.com\x02r" + - "ecent, public, links, linktaco\x02saved\x02Note\x02Recent Bookmarks\x02A" + - "ll\x02All Types\x02Notes\x02Untagged\x02Mark as read\x02Mark as unread" + - "\x02Star\x02Unstar\x02Archive\x02Follow\x02newest\x02oldest\x02Recent pu" + - "blic links added to %[1]s on LinkTaco.com\x02Recent public links added t" + - "o LinkTaco.com\x02Recent Links\x02%[1]s Links\x02You have %[1]d restrict" + - "ed link(s) saved.\x02Upgrade the organization to activate them.\x02Link " + - "Detail\x02Public Post\x02Private Post\x02Bookmark '%[1]s' on LinkTaco.co" + - "m\x02bookmark, note, detail, popular, links, linktaco\x02Delete Bookmark" + - "\x02Something went wrong. This bookmark could not be deleted.\x02Bookmar" + - "k successfully deleted\x02Do you really whant to delete this bookmark?" + - "\x02Update Link\x02Do you want to delete\x02Link successfully updated." + - "\x02QR Codes powered by Link Taco!\x02You will be redirected in 10 secon" + - "ds.\x02QR Code Details\x02Download Image\x02Delete QR Code\x02Something " + - "went wrong. The QR Code could not be deleted.\x02QR Code successfully de" + - "leted\x02Do you really whant to delete this qr code\x02Export Data\x02Fi" + - "le format\x02This feature is not allowed for free user. Please upgrade." + - "\x02As system admin run this command in the channel you want to connect" + - "\x02Disconnect\x02Connect\x02Connected\x02Import Data\x02Source\x02Click" + - " on Manage Bookmarks from the Bookmarks menu\x02A new window called Libr" + - "ary will open\x02In the left sidebar select the folder you want to expor" + - "t. To export all bookmarks select All Bookmarks\x02Click on the icon tha" + - "t has two arrows (up and down) and choose 'Export Bookmarks to HTML'\x02" + - "Go to the File menu and chose Export\x02Select Export Bookmarks\x02Go to" + - " the Bookmarks menu and choose Bookmark Manager\x02In the left sidebar s" + - "elect the folder that you want to export\x02In the top bookmark bar clic" + - "k on the three points at the top right\x02Click on on Export Bookmarks" + - "\x02Go to https://pinboard.in/export/ and click on JSON\x02Your importin" + - "g into a free account / organization, any private pinboard bookmarks wil" + - "l be marked restricted.\x02Upgrade your account to support private bookm" + - "arks.\x02Instructions\x02Safari Bookmarks\x02Chrome Bookmarks\x02Firefox" + - " Bookmarks\x02Your bookmark import is being processed. We will notify yo" + - "u once it's complete.\x02Update Note\x02Note '%[1]s' on LinkTaco.com\x02" + - "note, detail, popular, links, linktaco\x02Create Note\x02An note was suc" + - "cessfully created.\x02Error fetching referenced note: %[1]v\x02Store Das" + - "hboard\x02Tour\x02Recent\x02Popular\x02Categories\x02About\x02Log in\x02" + - "Log out\x02GQL Playground\x02Save Link\x02Save Note\x02Personal Tokens" + - "\x02Client Applications\x02Lists\x02Short Links\x02Admin\x02Help\x02Blog" + - "\x02Update Links\x02URL\x02Order\x02Delete List\x02Something went wrong." + - " The link could not be deleted.\x02Link successfully deleted\x02Do you r" + - "eally whant to delete this link\x02Create Links\x02Previous\x02No Links" + - "\x02Update List\x02Domain\x02Is Default\x02Delete Picture\x02Other\x02Ot" + - "her Name\x02Social Links\x02Listing successfully updated.\x02Create List" + - "\x02A list was successfully created.\x02Manage Links\x02No Lists\x02Crea" + - "tion Date\x02QR Codes\x02Invalid domain value given\x02List successfully" + - " deleted\x02Do you really whant to delete this list\x02Create QR Code" + - "\x02Create\x02Download\x02Custom background image\x02QR Code succesfully" + - " created\x02QR Code Listing\x02View\x02No QR Codes\x02Disconnect Matterm" + - "ost\x02Mattermost successfully disconnected\x02Do you really want to dis" + - "connect this organization from mattermost\x02Connect Mattermost\x02This " + - "team is already tied to an organization\x02Do you want to connect this o" + - "rganization to mattermost?\x02This feature is restricted to free account" + - "s. Please upgrade.\x02Organization linked successfully with mattermost" + - "\x02Sorry, free accounts do not support Mattermost Integration. Please u" + - "pgrade to continue\x02Connect User\x02In order to interact with the matt" + - "ermost you have to connect your account with your link user\x02Do you wa" + - "nt to proceed?\x02User connected successfully\x02No slack connection fou" + - "nd\x02We sent you a private msg\x02The text to be searched is required" + - "\x02No links were found for %[1]s\x02No organization found\x02The title " + - "is required\x02The url is required\x02The code is required\x02The domain" + - " is required\x02Domain not found\x02A new short was created succesfully" + + "Username\x02Image\x02Back\x02Cancel\x02Delete picture\x02Email Posting" + + "\x02Enable email posting\x02Regenerate code\x02When enabled, you can add" + + " links by sending an email to a special address.\x02Spanish\x02English" + + "\x02Count\x02Count (reverse)\x02Name (reverse)\x02Date Created\x02Date C" + + "reated (reverse)\x02Profile updated successfully\x02Settings\x02Slug\x02" + + "Subscription\x02Is Active\x02Email\x02Default Language\x02Organizations" + + "\x02Current Organization\x02Edit\x02Members\x02Actions\x02Change passwor" + + "d\x02Update email\x02Edit profile\x02Manage Your Organizations\x02Upgrad" + + "e Org\x02View Audit Logs\x02Bookmarklet\x02Add to LinkTaco\x02This speci" + + "al link allows you to save to LinkTaco directly by using a bookmark in y" + + "our web browser.\x02Drag and drop this button to your web browser toolba" + + "r or your bookmarks.\x02Do not share this address. Anyone with this emai" + + "l can post links to your account.\x02Complete Registration\x02Full Name" + + "\x02Password\x02Registration Completed\x02Register\x02Email Address\x02C" + + "onfirm Password\x02Already have an account? Click here to login\x02Welco" + + "me to Links\x02Set up your account, so you can save links.\x02Registrati" + + "on is not enabled on this system. Contact the admin for an account.\x02W" + + "e sent you a confirmation email. Please click the link in that email to " + + "confirm your account.\x02You have successfully registered your account. " + + "You can now login.\x02Change Password\x02Current Password\x02New Passwor" + + "d\x02Confirm New Password\x02Enter New Password\x02Reset Password\x02Pas" + + "sword Changed\x02You can now\x02return to the login page\x02and login" + + "\x02Links - Reset your password\x02Forgot Password?\x02If the email addr" + + "ess given exists in our system then we just sent it a login link. Click " + + "this link to reset your password. The link expires in 1 hour.\x02Send Re" + + "set Link\x02Someone, possibly you, requested to reset your Links passwor" + + "d.\x02To complete your password reset, just click the link below:\x02Thi" + + "s link will expire in 1 hour. If you didn't request this link you can sa" + + "fely delete this email now.\x02Update Email\x02You've been sent a confir" + + "mation email. Please click the link in the email to confirm your email c" + + "hange. The confirmation email will expire in 2 hours.\x02Someone, possib" + + "ly you, requested to reset your Links email address. To complete this u" + + "pdate, just click the link below:\x02This link will expire in 2 hour. If" + + " you didn't request this link you can safely delete this email now.\x02C" + + "hange Email\x02Login\x02No accounts? Click here to create one\x02Login E" + + "mail\x02Someone, possibly you, requested this login via email link. To l" + + "ogin to your account, just click the link below:\x02Password changed suc" + + "cessfully\x02Email updated successfully\x02You've been logged out succes" + + "sfully.\x02You've successfully updated your password.\x02You've successf" + + "ully updated your email address.\x02You've successfully confirmed your e" + + "mail address.\x02You must verify your email address before logging in" + + "\x02This account is currently unable to access the system.\x02Successful" + + " login.\x02LinkTaco - Confirm account email\x02Please confirm your accou" + + "nt\x02To confirm your email address and complete your Links registration" + + ", please click the link below.\x02Confirm\x02If you didn't request this " + + "link you can safely delete this email now.\x02Confirm your email address" + + "\x02We sent you a new confirmation email. Please click the link in that " + + "email to confirm your account.\x02Analytics\x02Engagements over time\x02" + + "Country\x02City\x02Referrer\x02Devices\x02Apply\x02Weeks\x02Days\x02Only" + + " showing the last 60 days. Upgrade your organization to paid to view all" + + " historical data\x02Click here to upgrade\x02Only showing country data. " + + "Upgrade your organization to paid to view all stats\x02Upgrade your orga" + + "nization to paid to view the detail stats\x02QR Scans\x02Links\x02No Dat" + + "a\x02Name is required\x02Name may not exceed 150 characters\x02Org usern" + + "ame is required\x02Org username may not exceed 150 characters\x02You are" + + " not allowed to create more free organizations. Please upgrade to a paid" + + " org\x02This organization slug can not be used. Please chose another one" + + "\x02This organization slug is already registered\x02CurrentSlug is requi" + + "red\x02Slug is required\x02Slug may not exceed 150 characters\x02Organiz" + + "ation Not Found\x02This organization name is already registered\x02This " + + "slug can not be used. Please chose another one\x02You are not allowed to" + + " enable/disabled user type organization\x02You are not allowed to have m" + + "ore than two free organizations. Please upgrade\x02This organization has" + + " an active subscription. Please cancel it first\x02Free organizations ca" + + "n not use Private permission. Please upgrade to use Private permission" + + "\x02Invalid default permission value\x02Invalid Visibility value.\x02Inv" + + "alid URL.\x02URL may not exceed 2048 characters\x02Org slug is required." + + "\x02Title is required.\x02Title may not exceed 500 characters\x02Tags ma" + + "y not exceed 10\x02Only members with write perm are allowed to perform t" + + "his action\x02Free organizations are not allowed to create private links" + + ". Please upgrade\x02Link hash required\x02Element Not Found\x02You are n" + + "ot allowed to edit this field for notes\x02Link Not Found\x02This user i" + + "s not allowed to perform this action\x02Description is required.\x02Free" + + " organizations are not allowed to create private notes. Please upgrade" + + "\x02Error compiling url regex: %[1]s\x02Org slug is required\x02User ema" + + "il is required\x02Email may not exceed 255 characters\x02Invalid email f" + + "ormat\x02Invalid Permission\x02This email domain is not allowed\x02This " + + "function is only allowed for business users.\x02A new register invitatio" + + "n was sent to %[1]s\x02The User you try to invite is not verified\x02A n" + + "ew member invitation was sent to %[1]s\x02Link Taco: Invitation to join " + + "organization\x02User not found for given email\x02The user for given ema" + + "il is not a member of given organization\x02The member was removed succe" + + "ssfully\x02Confirmation key is required.\x02Confirmation Not Found\x02In" + + "valid Confirmation Type\x02Invalid Confirmation Target\x02Permission Not" + + " Found\x02User Not Found\x02The User is not verified\x02The user was add" + + "ed successfully\x02Email is required\x02Password is required\x02Password" + + " may not exceed 100 characters\x02Username is required\x02Username may n" + + "ot exceed 150 characters\x02Registration is not enabled\x02Invalid Key" + + "\x02Invalid Email\x02This email is already registered\x02This username c" + + "an not be used. Please chose another one\x02This username is already reg" + + "istered\x02Key is required\x02Confirmation User Not Found\x02DefaultLang" + + " is required\x02Timezone is required\x02DefaultTagOrder is required\x02T" + + "imezone is invalid\x02Lang is invalid\x02No personal organization found " + + "for this user\x02Invalid domain name.\x02Invalid service value.\x02Name " + + "may not exceed 255 characters\x02Name may not exceed 500 characters\x02I" + + "nvalid FQDN format\x02Organizaiton Slug is required.\x02Invalid permissi" + + "ons for Organization ID\x02This function is only allowed for paid users." + + "\x02The domain is already registered in the system\x02There is already a" + + " domain registered for given service\x02Error checking the DNS entry for" + + " domain. Please try again later\x02CNAME record for domain is incorrect" + + "\x02Invalid domain ID.\x02invalid domain ID\x02Only superusers can delet" + + "e system level domains\x02Unable to delete. Domain has active short link" + + "s or link listings\x02URL is required.\x02DomainID is required\x02Title " + + "may not exceed 150 characters\x02Short Code may not exceed 20 characters" + + "\x02This shortCode can not be used. Please chose another one\x02Org Not " + + "Found\x02You have reached your monthly short link limit. Please upgrade " + + "to remove this limitation.\x02short-service-domain is not configured\x02" + + "Domain Not Found\x02Duplicated short code\x02Id required\x02Slug is requ" + + "ired.\x02Org Slug is required\x02Free accounts are only allowed 1 link l" + + "isting.\x02list-service-domain is not configured\x02This Slug is already" + + " registered for this domain\x02There is already a default listing for th" + + "is domain\x02ListingSlug is required.\x02LinkOrder can't be lower than 0" + + ".\x02Listing Not Found\x02ID is required.\x02Title is required\x02ID can" + + "'t be lower than 0.\x02Listing Link Not Found\x02Title is too long.\x02C" + + "ode is invalid.\x02Element ID is invalid.\x02List Not Found\x02You can't" + + " create more than 5 qr codes per lists.\x02Short Not Found\x02You can't " + + "create more than 5 qr codes per shorts.\x02QR Code Not Found\x02User fol" + + "lows %[1]s\x02This user does not follow this org\x02User unfollows %[1]s" + + "\x02Organization not found.\x02Tag not found.\x02New tag is required." + + "\x02newTag value is not valid.\x02Tag renamed successfully\x02Invalid or" + + "gType\x02Invalid visibility\x02Invalid level value.\x02Invalid status va" + + "lue.\x02A valid Organizaiton Slug is required.\x02Organization Slug is r" + + "equired for user level domains\x04\x00\x01 \x0b\x02Invalid ID\x02Domain " + + "in use. Can not change service.\x02Name is required.\x02Email is require" + + "d.\x02Register Invitation\x02Linktaco: Invitation to Register\x02You hav" + + "e been invited by %[1]s to join Link Taco\x02Please click the link below" + + ":\x02You can not send both after and before cursors\x02Not Found\x02Base" + + "URL Not Found\x02Invalid tag cloud type without organization slug\x02Onl" + + "y members with read perm are allowed to perform this action\x02Unable to" + + " find suitable organization\x02Only superusers can fetch system level do" + + "mains\x02Link Short Not Found\x02Invalid code type\x02Org slug is requir" + + "ed for this kind of token\x02Access Restricted\x02Access denied.\x02Inva" + + "lid listing ID provided\x02Invalid listing for specified organization" + + "\x02GraphQL Playground\x02Submit Query\x02Back Home\x02Invalid origin so" + + "urce for importer.\x02The file is required\x02The file submitted for thi" + + "s source should be html\x02The file submitted for this source should be " + + "json\x02Personal Access Tokens\x02Comment\x02Issued\x02Expired\x02Revoke" + + "\x02You have not created any personal access tokens for your account." + + "\x02Authorized Clients\x02Client Name\x02Grants\x02You have not granted " + + "any third party clients access to your account.\x02Add Personal Access T" + + "oken\x02Note: Your access token <strong>will never be shown to you again" + + ".</strong> Keep this secret. It will expire a year from now.\x02Revoke P" + + "ersonal Access Token\x02Do you want to revoke this personal access token" + + "? This can not be undone.\x02Yes, do it\x02No, nevermind\x02Successfully" + + " added personal access\x02Successfully revoked authorization token.\x02C" + + "lients\x02Client ID\x02Manage\x02Add\x02No Clients\x02Add OAuth2 Client" + + "\x02Client Description\x02Redirect URL\x02Client URL\x02Client Secret" + + "\x02Note: Your client secret will never be shown to you again.\x02OAuth " + + "2.0 client management\x02Revoke tokens & client secret\x02If OAuth 2.0 b" + + "earer tokens issued for your OAuth client, or your client secret, have b" + + "een disclosed to a third-party, you must revoke all tokens and have repl" + + "acements issued.\x02Revoke client tokens\x02Unregister this OAuth client" + + "\x02This will permanently unregister your OAuth 2.0 client\x02revoke all" + + " tokens issued to it, and prohibit the issuance of new tokens.\x02Unregi" + + "ster\x02Description\x02Informative URL\x02OAuth 2.0 client registered" + + "\x02Successfully added client\x02Successfully revoked client.\x02Success" + + "fully reissued client.\x02Authorize\x02would like to access to your Link" + + " Taco account.\x02is a third-party application operated by\x02You may re" + + "voke this access at any time on the OAuth tab of your account profile." + + "\x02Scopes\x02Approve\x02Reject\x02LinkTaco - Your bookmark import is co" + + "mplete\x02Hi there,\x02Just wanted to let you know that your bookmark im" + + "port has completed successfully!\x02- LinkTaco Team\x02Inactive Domain" + + "\x02The %[1]s domain is currently inactive\x02Please upgrade your accoun" + + "t to reactivate it\x02Pricing\x02Every account can create unlimited orga" + + "nizations. Each organization has it's own bookmarks, listings, analytics" + + ", etc. All of the features below belong to each organization with their " + + "own unique URL's, groupings, and so on.\x02Feature\x02Free\x02Personal" + + "\x02Business\x02Price\x02per year\x02per month\x02months\x02Unlimited" + + "\x02Public only\x02Try It FREE\x02Bookmarks\x02Save public/private links" + + "\x02Save public/private notes\x02Follow other organizations (social)\x02" + + "Organize by tags\x02Advanced filtering/search\x02Full RSS feeds\x02Custo" + + "m domain + SSL\x02Link Listings\x02Create link listings (ie, social medi" + + "a bios, etc.)\x02Organize listings by tag\x02Filter/Search listings\x02U" + + "nlimited QR codes per listing\x02Full Analytics\x02Listing\x02Link Short" + + "ening\x02Unlimited short links\x02Organize shorts by tags\x02Filter/Sear" + + "ch shorts\x02Unlimited QR codes per short\x02Full analytics history\x02Q" + + "R Code specific analytics\x02Click analytics\x02Referer analyitcs\x02Cou" + + "ntry analytics\x02City analytics\x02Device analytics\x02Collaboration / " + + "Integrations\x02Add unlimited members to organization\x02Slack Integrati" + + "on\x02MatterMost Integration\x02Build Your Own Integration\x02Import / E" + + "xport\x02Import from Pinboard\x02Import from Firefox\x02Import from Chro" + + "me\x02Import from Safari\x02Export in JSON or HTML\x02API Powered\x02Ful" + + "l GraphQL API Access\x02OAuth2 Support\x02Self Hosting\x02Fully open sou" + + "rce\x02Host your own version of Link Taco\x02Documentation\x02Pricing an" + + "d feature details for LinkTaco.com\x02pricing, links, linktaco, feature," + + " plans, pricing plans\x02Welcome to LinkTaco!\x02Here you can mix all yo" + + "ur link saving and sharing needs in one tight little bundle. Much like a" + + " taco. A link taco if you will.\x02LinkTaco is an open source platform w" + + "here you can host all of your links. Custom domains, QR codes, Analytics" + + ", full API, multiple organizations w/unlimited members are just some of " + + "what's included.\x02Social bookmarking is not new, it's just been forgot" + + "ten. Link shortening with analytics has been around forever. Link listin" + + "gs became cool once social media started allowing us to post a link to o" + + "ur websites in our profiles.\x02Up until now, all of these things were h" + + "osted on different services.\x02Social bookmarking: Pinboard (Delicious)" + + "\x02Link shortening: Bitly et al\x02Link listings: Linktree et al\x02Pea" + + "ce Pinboard. Bye Bitly. Later Linktree. Hello LinkTaco!\x02Since we're a" + + "\x02100% open source project\x04\x01 \x00R\x02you can host your own inst" + + "ance if you'd like full control over your own platform.\x02See the insta" + + "llation documentation for more.\x02Ready to get started? It's free to ma" + + "ke an account and use it forever (with some limitations). To use all fea" + + "tures you have to pay just a few bucks a year, or a few per month if you" + + "'re a business, and that's it. Simple!\x02Explore Features\x02Organize B" + + "ookmarks\x02Link Lists\x02Collaboration\x02Integrations\x02Import Export" + + "\x02Unlimited link listings (for social media bios, etc.)\x02Members can" + + " add/edit/remove links (if allowed)\x02Members have access based on perm" + + "issions granted\x02Browser bookmark widget\x02Domain List\x02Delete\x02L" + + "ookup Name\x02Service\x02for\x02Link Shortner\x02No Domains\x02Create Do" + + "main\x02Migrate Short Links\x02Old links won't work. All code will be mo" + + "ved to the new domain.\x02Domain created successfully\x02Delete Domain" + + "\x02%[1]s\x02Domain successfully deleted\x02Yes\x02Do you really whant t" + + "o delete this domain\x02Your Organizations\x02Open Source\x02Sponsored" + + "\x02Paid\x02Enabled\x02Disabled\x02Manage Subscription\x02Domains\x02Man" + + "age Members\x02Export\x02Import\x02Payment History\x02Create Organizatio" + + "n\x02Org Username\x02Default Bookmark Visibility\x02Sorry, you have exce" + + "eded the amount of free accounts available. Please update your current f" + + "ree account to create one more\x02Public\x02Private\x02Organization crea" + + "ted successfully\x02Update Organization\x02Is Enabled\x02Organization up" + + "dated successfully\x02Add Member\x02Permission\x02Please upgrade to a Bu" + + "siness organization to add members\x02Read\x02Write\x02Admin Write\x02An" + + " invitation was sent to this user\x02Something went wrong, impossible to" + + " send invitation\x02Delete Org Member\x02Something went wrong. This memb" + + "er could not be deleted: %[1]s\x02Member successfully deleted\x02Delete " + + "member %[1]s (%[2]s) from Organization %[3]s?\x02Member added succesxful" + + "ly\x02Something went wrong. Impossible to get the member data\x02Member " + + "List\x02No members\x02Create Link\x02Title\x02Visibility\x02Unread\x02St" + + "arred\x02Tags\x02Use commas to separate your tags. Example: tag 1, tag 2" + + ", tag 3\x02Archive URL\x02bookmarklet\x02You can also submit via the\x02" + + "A link was successfully created.\x02Error fetching referenced url: Not f" + + "ound\x02Error fetching referenced link: %[1]v\x02bookmark\x02Popular Boo" + + "kmarks\x02This ain't a popularity contest or anything but this is weird " + + "that there are no links!\x02Most popular links on LinkTaco.com\x02popula" + + "r, links, linktaco, feature, plans, pricing plans\x02Popular Links\x02Fo" + + "llowing\x02Unfollow\x02No organizations\x02Feed\x02By\x02Search\x02Your " + + "feed is empty :( Go follow some people. Try the Popular or Recent feeds " + + "to find some interesting people to follow.\x02Advanced Search\x02Include" + + " Tags\x02Exclude Tags\x02Clear\x02Followings\x02Saved Bookmarks\x02This " + + "feed has no links. Booo!\x02Recent bookmarks for URL %[1]s added on Link" + + "Taco.com\x02recent, public, links, linktaco\x02saved\x02Note\x02Recent B" + + "ookmarks\x02All\x02All Types\x02Notes\x02Untagged\x02Mark as read\x02Mar" + + "k as unread\x02Star\x02Unstar\x02Archive\x02Follow\x02newest\x02oldest" + + "\x02Recent public links added to %[1]s on LinkTaco.com\x02Recent public " + + "links added to LinkTaco.com\x02Recent Links\x02%[1]s Links\x02You have %" + + "[1]d restricted link(s) saved.\x02Upgrade the organization to activate t" + + "hem.\x02Link Detail\x02Public Post\x02Private Post\x02Bookmark '%[1]s' o" + + "n LinkTaco.com\x02bookmark, note, detail, popular, links, linktaco\x02De" + + "lete Bookmark\x02Something went wrong. This bookmark could not be delete" + + "d.\x02Bookmark successfully deleted\x02Do you really whant to delete thi" + + "s bookmark?\x02Update Link\x02Do you want to delete\x02Link successfully" + + " updated.\x02QR Codes powered by Link Taco!\x02You will be redirected in" + + " 10 seconds.\x02QR Code Details\x02Download Image\x02Delete QR Code\x02S" + + "omething went wrong. The QR Code could not be deleted.\x02QR Code succes" + + "sfully deleted\x02Do you really whant to delete this qr code\x02Export D" + + "ata\x02File format\x02This feature is not allowed for free user. Please " + + "upgrade.\x02As system admin run this command in the channel you want to " + + "connect\x02Disconnect\x02Connect\x02Connected\x02Import Data\x02Source" + + "\x02Click on Manage Bookmarks from the Bookmarks menu\x02A new window ca" + + "lled Library will open\x02In the left sidebar select the folder you want" + + " to export. To export all bookmarks select All Bookmarks\x02Click on the" + + " icon that has two arrows (up and down) and choose 'Export Bookmarks to " + + "HTML'\x02Go to the File menu and chose Export\x02Select Export Bookmarks" + + "\x02Go to the Bookmarks menu and choose Bookmark Manager\x02In the left " + + "sidebar select the folder that you want to export\x02In the top bookmark" + + " bar click on the three points at the top right\x02Click on on Export Bo" + + "okmarks\x02Go to https://pinboard.in/export/ and click on JSON\x02Your i" + + "mporting into a free account / organization, any private pinboard bookma" + + "rks will be marked restricted.\x02Upgrade your account to support privat" + + "e bookmarks.\x02Instructions\x02Safari Bookmarks\x02Chrome Bookmarks\x02" + + "Firefox Bookmarks\x02Your bookmark import is being processed. We will no" + + "tify you once it's complete.\x02Update Note\x02Note '%[1]s' on LinkTaco." + + "com\x02note, detail, popular, links, linktaco\x02Create Note\x02An note " + + "was successfully created.\x02Error fetching referenced note: %[1]v\x02St" + + "ore Dashboard\x02Tour\x02Recent\x02Popular\x02Categories\x02About\x02Log" + + " in\x02Log out\x02GQL Playground\x02Save Link\x02Save Note\x02Personal T" + + "okens\x02Client Applications\x02Lists\x02Short Links\x02Admin\x02Help" + + "\x02Blog\x02Update Links\x02URL\x02Order\x02Delete List\x02Something wen" + + "t wrong. The link could not be deleted.\x02Link successfully deleted\x02" + + "Do you really whant to delete this link\x02Create Links\x02Previous\x02N" + + "o Links\x02Update List\x02Domain\x02Is Default\x02Delete Picture\x02Othe" + + "r\x02Other Name\x02Social Links\x02Listing successfully updated.\x02Crea" + + "te List\x02A list was successfully created.\x02Manage Links\x02No Lists" + + "\x02Creation Date\x02QR Codes\x02Invalid domain value given\x02List succ" + + "essfully deleted\x02Do you really whant to delete this list\x02Create QR" + + " Code\x02Create\x02Download\x02Custom background image\x02QR Code succes" + + "fully created\x02QR Code Listing\x02View\x02No QR Codes\x02Disconnect Ma" + + "ttermost\x02Mattermost successfully disconnected\x02Do you really want t" + + "o disconnect this organization from mattermost\x02Connect Mattermost\x02" + + "This team is already tied to an organization\x02Do you want to connect t" + + "his organization to mattermost?\x02This feature is restricted to free ac" + + "counts. Please upgrade.\x02Organization linked successfully with matterm" + + "ost\x02Sorry, free accounts do not support Mattermost Integration. Pleas" + + "e upgrade to continue\x02Connect User\x02In order to interact with the m" + + "attermost you have to connect your account with your link user\x02Do you" + + " want to proceed?\x02User connected successfully\x02No slack connection " + + "found\x02We sent you a private msg\x02The text to be searched is require" + + "d\x02No links were found for %[1]s\x02No organization found\x02The title" + + " is required\x02The url is required\x02The code is required\x02The domai" + + "n is required\x02Domain not found\x02A new short was created succesfully" + "\x02Url is required\x02A new link was created succesfully\x02Please clic" + "k in the following link to tie a org %[1]s\x02Installed successfully\x02" + "something went wrong: %[1]s\x02done\x02Invalid organization given\x02No " + @@ -1301,7 +1312,7 @@ const enData string = "" + // Size: 21402 bytes "\x02This field is required.\x02Please enter a valid email address.\x02Pl" + "ease enter a valid phone number.\x02Failed the '%[1]s' tag." -var esIndex = []uint32{ // 723 elements +var esIndex = []uint32{ // 729 elements // Entry 0 - 1F 0x00000000, 0x00000014, 0x0000006a, 0x00000089, 0x000000e0, 0x00000199, 0x00000233, 0x000002a4, @@ -1310,205 +1321,207 @@ var esIndex = []uint32{ // 723 elements 0x0000033d, 0x00000346, 0x00000372, 0x000003a4, 0x000003b2, 0x000003ba, 0x000003cd, 0x000003da, 0x000003fc, 0x00000403, 0x00000415, 0x0000041c, - 0x00000423, 0x0000042c, 0x00000435, 0x0000043d, + 0x00000423, 0x0000042c, 0x0000043c, 0x00000454, // Entry 20 - 3F - 0x00000446, 0x00000459, 0x0000046a, 0x0000047d, - 0x0000049a, 0x000004b8, 0x000004c0, 0x000004c5, - 0x000004d3, 0x000004dd, 0x000004f1, 0x00000504, - 0x00000513, 0x00000528, 0x0000052f, 0x00000538, - 0x00000541, 0x00000555, 0x00000574, 0x00000582, - 0x0000059f, 0x000005b8, 0x000005d4, 0x000005dd, - 0x000005f0, 0x00000659, 0x000006b8, 0x000006cb, - 0x000006db, 0x000006e7, 0x000006fb, 0x00000704, + 0x00000474, 0x00000486, 0x000004e2, 0x000004eb, + 0x000004f3, 0x000004fc, 0x0000050f, 0x00000520, + 0x00000533, 0x00000550, 0x0000056e, 0x00000576, + 0x0000057b, 0x00000589, 0x00000593, 0x000005a7, + 0x000005ba, 0x000005c9, 0x000005de, 0x000005e5, + 0x000005ee, 0x000005f7, 0x0000060b, 0x0000062a, + 0x00000638, 0x00000655, 0x0000066e, 0x0000068a, + 0x00000693, 0x000006a6, 0x0000070f, 0x0000076e, // Entry 40 - 5F - 0x00000726, 0x0000073c, 0x0000076e, 0x00000781, - 0x000007b0, 0x00000813, 0x0000087f, 0x000008ba, - 0x000008ce, 0x000008e1, 0x000008f3, 0x0000090f, - 0x0000092a, 0x00000942, 0x00000957, 0x00000964, - 0x00000991, 0x000009a3, 0x000009c6, 0x000009e2, - 0x00000aaa, 0x00000aca, 0x00000b13, 0x00000b68, - 0x00000bd2, 0x00000be3, 0x00000c83, 0x00000d19, - 0x00000d85, 0x00000d93, 0x00000da3, 0x00000dd1, + 0x000007d3, 0x000007e6, 0x000007f6, 0x00000802, + 0x00000816, 0x0000081f, 0x00000841, 0x00000857, + 0x00000889, 0x0000089c, 0x000008cb, 0x0000092e, + 0x0000099a, 0x000009d5, 0x000009e9, 0x000009fc, + 0x00000a0e, 0x00000a2a, 0x00000a45, 0x00000a5d, + 0x00000a72, 0x00000a7f, 0x00000aac, 0x00000abe, + 0x00000ae1, 0x00000afd, 0x00000bc5, 0x00000be5, + 0x00000c2e, 0x00000c83, 0x00000ced, 0x00000cfe, // Entry 60 - 7F - 0x00000dee, 0x00000e91, 0x00000eb4, 0x00000ed1, - 0x00000ef1, 0x00000f15, 0x00000f41, 0x00000f77, - 0x00000fbc, 0x00000ffc, 0x00001018, 0x00001041, - 0x0000105e, 0x000010d1, 0x000010db, 0x00001122, - 0x00001142, 0x000011bf, 0x000011cb, 0x000011eb, - 0x000011f1, 0x000011f8, 0x00001202, 0x0000120f, - 0x00001217, 0x0000121f, 0x00001225, 0x00001299, - 0x000012ba, 0x0000131f, 0x00001371, 0x00001380, + 0x00000d9e, 0x00000e34, 0x00000ea0, 0x00000eae, + 0x00000ebe, 0x00000eec, 0x00000f09, 0x00000fac, + 0x00000fcf, 0x00000fec, 0x0000100c, 0x00001030, + 0x0000105c, 0x00001092, 0x000010d7, 0x00001117, + 0x00001133, 0x0000115c, 0x00001179, 0x000011ec, + 0x000011f6, 0x0000123d, 0x0000125d, 0x000012da, + 0x000012e6, 0x00001306, 0x0000130c, 0x00001313, + 0x0000131d, 0x0000132a, 0x00001332, 0x0000133a, // Entry 80 - 9F - 0x00001386, 0x0000138e, 0x000013a2, 0x000013cb, - 0x000013f0, 0x00001427, 0x0000148f, 0x000014d8, - 0x00001505, 0x0000151e, 0x00001533, 0x0000155e, - 0x0000157a, 0x000015ae, 0x000015df, 0x00001626, - 0x0000167e, 0x000016cd, 0x0000173f, 0x00001769, - 0x00001788, 0x00001796, 0x000017c3, 0x000017e9, - 0x00001801, 0x0000182f, 0x0000185c, 0x000018aa, - 0x00001910, 0x0000192c, 0x00001943, 0x00001973, + 0x00001340, 0x000013b4, 0x000013d5, 0x0000143a, + 0x0000148c, 0x0000149b, 0x000014a1, 0x000014a9, + 0x000014bd, 0x000014e6, 0x0000150b, 0x00001542, + 0x000015aa, 0x000015f3, 0x00001620, 0x00001639, + 0x0000164e, 0x00001679, 0x00001695, 0x000016c9, + 0x000016fa, 0x00001741, 0x00001799, 0x000017e8, + 0x0000185a, 0x00001884, 0x000018a3, 0x000018b1, + 0x000018de, 0x00001904, 0x0000191c, 0x0000194a, // Entry A0 - BF - 0x00001986, 0x000019c2, 0x000019d9, 0x00001a43, - 0x00001a78, 0x00001a9b, 0x00001abc, 0x00001ae9, - 0x00001b04, 0x00001b16, 0x00001b35, 0x00001b7a, - 0x00001bb0, 0x00001be3, 0x00001c0d, 0x00001c3d, - 0x00001c70, 0x00001cbf, 0x00001ce3, 0x00001d0a, - 0x00001d26, 0x00001d46, 0x00001d6a, 0x00001d80, - 0x00001d96, 0x00001db5, 0x00001dd1, 0x00001de4, - 0x00001e00, 0x00001e32, 0x00001e48, 0x00001e80, + 0x00001977, 0x000019c5, 0x00001a2b, 0x00001a47, + 0x00001a5e, 0x00001a8e, 0x00001aa1, 0x00001add, + 0x00001af4, 0x00001b5e, 0x00001b93, 0x00001bb6, + 0x00001bd7, 0x00001c04, 0x00001c1f, 0x00001c31, + 0x00001c50, 0x00001c95, 0x00001ccb, 0x00001cfe, + 0x00001d28, 0x00001d58, 0x00001d8b, 0x00001dda, + 0x00001dfe, 0x00001e25, 0x00001e41, 0x00001e61, + 0x00001e85, 0x00001e9b, 0x00001eb1, 0x00001ed0, // Entry C0 - DF - 0x00001ea6, 0x00001eb6, 0x00001ec7, 0x00001ee7, - 0x00001f1b, 0x00001f47, 0x00001f58, 0x00001f7f, - 0x00001f98, 0x00001fae, 0x00001fe0, 0x00001ff6, - 0x0000200d, 0x00002048, 0x00002064, 0x00002080, - 0x000020b0, 0x000020e0, 0x000020f7, 0x0000211d, - 0x0000214e, 0x00002187, 0x000021b4, 0x000021e7, - 0x0000222e, 0x00002255, 0x0000226d, 0x00002286, - 0x000022c9, 0x00002313, 0x00002324, 0x0000233a, + 0x00001eec, 0x00001eff, 0x00001f1b, 0x00001f4d, + 0x00001f63, 0x00001f9b, 0x00001fc1, 0x00001fd1, + 0x00001fe2, 0x00002002, 0x00002036, 0x00002062, + 0x00002073, 0x0000209a, 0x000020b3, 0x000020c9, + 0x000020fb, 0x00002111, 0x00002128, 0x00002163, + 0x0000217f, 0x0000219b, 0x000021cb, 0x000021fb, + 0x00002212, 0x00002238, 0x00002269, 0x000022a2, + 0x000022cf, 0x00002302, 0x00002349, 0x00002370, // Entry E0 - FF - 0x00002368, 0x00002397, 0x000023cd, 0x000023e9, - 0x0000245a, 0x00002484, 0x0000249a, 0x000024b5, - 0x000024c5, 0x000024d7, 0x000024fa, 0x00002532, - 0x0000255b, 0x0000258b, 0x000025ba, 0x000025d8, - 0x000025fd, 0x00002611, 0x00002621, 0x00002639, - 0x00002653, 0x00002670, 0x00002685, 0x0000269e, - 0x000026b8, 0x000026cc, 0x000026fc, 0x00002715, - 0x00002746, 0x0000275f, 0x00002778, 0x000027a3, + 0x00002388, 0x000023a1, 0x000023e4, 0x0000242e, + 0x0000243f, 0x00002455, 0x00002483, 0x000024b2, + 0x000024e8, 0x00002504, 0x00002575, 0x0000259f, + 0x000025b5, 0x000025d0, 0x000025e0, 0x000025f2, + 0x00002615, 0x0000264d, 0x00002676, 0x000026a6, + 0x000026d5, 0x000026f3, 0x00002718, 0x0000272c, + 0x0000273c, 0x00002754, 0x0000276e, 0x0000278b, + 0x000027a0, 0x000027b9, 0x000027d3, 0x000027e7, // Entry 100 - 11F - 0x000027bf, 0x000027dc, 0x000027f4, 0x00002810, - 0x00002832, 0x00002853, 0x00002865, 0x0000287c, - 0x00002895, 0x000028af, 0x000028dd, 0x00002922, - 0x00002934, 0x0000296e, 0x00002982, 0x00002995, - 0x000029ad, 0x000029cf, 0x00002a03, 0x00002a2b, - 0x00002a5e, 0x00002a6c, 0x00002a82, 0x00002acf, - 0x00002b15, 0x00002b3f, 0x00002b82, 0x00002b9b, - 0x00002bb5, 0x00002bf3, 0x00002c06, 0x00002c17, + 0x00002817, 0x00002830, 0x00002861, 0x0000287a, + 0x00002893, 0x000028be, 0x000028da, 0x000028f7, + 0x0000290f, 0x0000292b, 0x0000294d, 0x0000296e, + 0x00002980, 0x00002997, 0x000029b0, 0x000029ca, + 0x000029f8, 0x00002a3d, 0x00002a4f, 0x00002a89, + 0x00002a9d, 0x00002ab0, 0x00002ac8, 0x00002aea, + 0x00002b1e, 0x00002b46, 0x00002b79, 0x00002b87, + 0x00002b9d, 0x00002bea, 0x00002c30, 0x00002c5a, // Entry 120 - 13F - 0x00002c3e, 0x00002c74, 0x00002c8f, 0x00002ca0, - 0x00002cb2, 0x00002ce1, 0x00002cf9, 0x00002d31, - 0x00002d65, 0x00002d7f, 0x00002d8a, 0x00002d91, - 0x00002d9a, 0x00002da2, 0x00002de0, 0x00002df5, - 0x00002e07, 0x00002e0f, 0x00002e56, 0x00002e77, - 0x00002ef4, 0x00002f15, 0x00002f67, 0x00002f71, - 0x00002f74, 0x00002f98, 0x00002fc3, 0x00002fcc, - 0x00002fda, 0x00002fe2, 0x00002fea, 0x00002ff7, + 0x00002c9d, 0x00002cb6, 0x00002cd0, 0x00002d0e, + 0x00002d21, 0x00002d32, 0x00002d59, 0x00002d8f, + 0x00002daa, 0x00002dbb, 0x00002dcd, 0x00002dfc, + 0x00002e14, 0x00002e4c, 0x00002e80, 0x00002e9a, + 0x00002ea5, 0x00002eac, 0x00002eb5, 0x00002ebd, + 0x00002efb, 0x00002f10, 0x00002f22, 0x00002f2a, + 0x00002f71, 0x00002f92, 0x0000300f, 0x00003030, + 0x00003082, 0x0000308c, 0x0000308f, 0x000030b3, // Entry 140 - 15F - 0x0000300e, 0x00003026, 0x00003040, 0x0000304f, - 0x0000305e, 0x00003096, 0x000030b4, 0x000030d5, - 0x00003196, 0x000031b0, 0x000031cf, 0x0000320c, - 0x00003258, 0x00003265, 0x00003272, 0x00003282, - 0x000032a2, 0x000032be, 0x000032da, 0x000032f6, - 0x00003300, 0x0000332b, 0x00003357, 0x000033a7, - 0x000033af, 0x000033b7, 0x000033c0, 0x000033fd, - 0x00003403, 0x00003461, 0x00003476, 0x00003487, + 0x000030de, 0x000030e7, 0x000030f5, 0x000030fd, + 0x00003105, 0x00003112, 0x00003129, 0x00003141, + 0x0000315b, 0x0000316a, 0x00003179, 0x000031b1, + 0x000031cf, 0x000031f0, 0x000032b1, 0x000032cb, + 0x000032ea, 0x00003327, 0x00003373, 0x00003380, + 0x0000338d, 0x0000339d, 0x000033bd, 0x000033d9, + 0x000033f5, 0x00003411, 0x0000341b, 0x00003446, + 0x00003472, 0x000034c2, 0x000034ca, 0x000034d2, // Entry 160 - 17F - 0x000034b6, 0x000034f9, 0x00003501, 0x000035fd, - 0x0000360b, 0x00003612, 0x0000361b, 0x00003623, - 0x0000362a, 0x00003633, 0x0000363b, 0x00003641, - 0x0000364b, 0x00003659, 0x0000366a, 0x00003675, - 0x00003698, 0x000036b9, 0x000036de, 0x000036f6, - 0x00003713, 0x00003729, 0x00003745, 0x00003759, - 0x000037a6, 0x000037c7, 0x000037df, 0x00003802, - 0x00003815, 0x0000381d, 0x00003835, 0x0000384f, + 0x000034db, 0x00003518, 0x0000351e, 0x0000357c, + 0x00003591, 0x000035a2, 0x000035d1, 0x00003614, + 0x0000361c, 0x00003718, 0x00003726, 0x0000372d, + 0x00003736, 0x0000373e, 0x00003745, 0x0000374e, + 0x00003756, 0x0000375c, 0x00003766, 0x00003774, + 0x00003785, 0x00003790, 0x000037b3, 0x000037d4, + 0x000037f9, 0x00003811, 0x0000382e, 0x00003844, + 0x00003860, 0x00003874, 0x000038c1, 0x000038e2, // Entry 180 - 19F - 0x00003876, 0x00003894, 0x000038bc, 0x000038dc, - 0x00003902, 0x00003915, 0x0000392c, 0x00003940, - 0x00003955, 0x0000396f, 0x0000398d, 0x000039bc, - 0x000039d3, 0x000039ef, 0x00003a10, 0x00003a24, - 0x00003a3c, 0x00003a53, 0x00003a69, 0x00003a7f, - 0x00003a97, 0x00003aa9, 0x00003aca, 0x00003ad9, - 0x00003aec, 0x00003b0a, 0x00003b32, 0x00003b41, - 0x00003b7a, 0x00003bc2, 0x00003bdb, 0x00003c77, + 0x000038fa, 0x0000391d, 0x00003930, 0x00003938, + 0x00003950, 0x0000396a, 0x00003991, 0x000039af, + 0x000039d7, 0x000039f7, 0x00003a1d, 0x00003a30, + 0x00003a47, 0x00003a5b, 0x00003a70, 0x00003a8a, + 0x00003aa8, 0x00003ad7, 0x00003aee, 0x00003b0a, + 0x00003b2b, 0x00003b3f, 0x00003b57, 0x00003b6e, + 0x00003b84, 0x00003b9a, 0x00003bb2, 0x00003bc4, + 0x00003be5, 0x00003bf4, 0x00003c07, 0x00003c25, // Entry 1A0 - 1BF - 0x00003d71, 0x00003e8d, 0x00003ed1, 0x00003efb, - 0x00003f22, 0x00003f48, 0x00003f89, 0x00003f97, - 0x00003fb8, 0x00004019, 0x0000405c, 0x00004154, - 0x00004168, 0x0000417d, 0x0000418c, 0x0000419a, - 0x000041a8, 0x000041ba, 0x00004204, 0x00004248, - 0x00004281, 0x000042a4, 0x000042b5, 0x000042be, - 0x000042d2, 0x000042db, 0x000042e0, 0x000042ec, - 0x000042f9, 0x00004307, 0x0000431b, 0x00004372, + 0x00003c4d, 0x00003c5c, 0x00003c95, 0x00003cdd, + 0x00003cf6, 0x00003d92, 0x00003e8c, 0x00003fa8, + 0x00003fec, 0x00004016, 0x0000403d, 0x00004063, + 0x000040a4, 0x000040b2, 0x000040d3, 0x00004134, + 0x00004177, 0x0000426f, 0x00004283, 0x00004298, + 0x000042a7, 0x000042b5, 0x000042c3, 0x000042d5, + 0x0000431f, 0x00004363, 0x0000439c, 0x000043bf, + 0x000043d0, 0x000043d9, 0x000043ed, 0x000043f6, // Entry 1C0 - 1DF - 0x0000438c, 0x0000439d, 0x000043a3, 0x000043bf, - 0x000043c2, 0x000043de, 0x000043f1, 0x00004401, - 0x0000440d, 0x00004414, 0x0000441d, 0x00004429, - 0x0000443f, 0x00004448, 0x00004459, 0x00004462, - 0x0000446b, 0x0000447e, 0x00004492, 0x000044b5, - 0x000044de, 0x0000455d, 0x00004566, 0x0000456e, - 0x0000458e, 0x000045a7, 0x000045b8, 0x000045dd, - 0x000045ed, 0x000045f5, 0x00004633, 0x00004638, + 0x000043fb, 0x00004407, 0x00004414, 0x00004422, + 0x00004436, 0x0000448d, 0x000044a7, 0x000044b8, + 0x000044be, 0x000044da, 0x000044dd, 0x000044f9, + 0x0000450c, 0x0000451c, 0x00004528, 0x0000452f, + 0x00004538, 0x00004544, 0x0000455a, 0x00004563, + 0x00004574, 0x0000457d, 0x00004586, 0x00004599, + 0x000045ad, 0x000045d0, 0x000045f9, 0x00004678, + 0x00004681, 0x00004689, 0x000046a9, 0x000046c2, // Entry 1E0 - 1FF - 0x00004641, 0x0000465c, 0x00004687, 0x000046b5, - 0x000046da, 0x00004715, 0x00004732, 0x00004771, - 0x0000478d, 0x000047c6, 0x000047d8, 0x000047e5, - 0x000047f2, 0x000047fa, 0x00004806, 0x0000480f, - 0x00004819, 0x00004823, 0x00004875, 0x00004884, - 0x0000488d, 0x000048b2, 0x000048d0, 0x00004900, - 0x00004927, 0x00004930, 0x00004945, 0x0000499d, - 0x000049c4, 0x00004a0e, 0x00004a1e, 0x00004a28, + 0x000046d3, 0x000046f8, 0x00004708, 0x00004710, + 0x0000474e, 0x00004753, 0x0000475c, 0x00004777, + 0x000047a2, 0x000047d0, 0x000047f5, 0x00004830, + 0x0000484d, 0x0000488c, 0x000048a8, 0x000048e1, + 0x000048f3, 0x00004900, 0x0000490d, 0x00004915, + 0x00004921, 0x0000492a, 0x00004934, 0x0000493e, + 0x00004990, 0x0000499f, 0x000049a8, 0x000049cd, + 0x000049eb, 0x00004a1b, 0x00004a42, 0x00004a4b, // Entry 200 - 21F - 0x00004a38, 0x00004a4b, 0x00004a50, 0x00004a54, - 0x00004a5b, 0x00004adf, 0x00004af2, 0x00004aff, - 0x00004b0c, 0x00004b14, 0x00004b1e, 0x00004b33, - 0x00004b57, 0x00004b98, 0x00004bc0, 0x00004bc9, - 0x00004bce, 0x00004be3, 0x00004be9, 0x00004bf9, - 0x00004bff, 0x00004c0d, 0x00004c20, 0x00004c36, - 0x00004c3f, 0x00004c4b, 0x00004c54, 0x00004c5b, - 0x00004c66, 0x00004c71, 0x00004caf, 0x00004ce4, + 0x00004a60, 0x00004ab8, 0x00004adf, 0x00004b29, + 0x00004b39, 0x00004b43, 0x00004b53, 0x00004b66, + 0x00004b6b, 0x00004b6f, 0x00004b76, 0x00004bfa, + 0x00004c0d, 0x00004c1a, 0x00004c27, 0x00004c2f, + 0x00004c39, 0x00004c4e, 0x00004c72, 0x00004cb3, + 0x00004cdb, 0x00004ce4, 0x00004ce9, 0x00004cfe, + 0x00004d04, 0x00004d14, 0x00004d1a, 0x00004d28, + 0x00004d3b, 0x00004d51, 0x00004d5a, 0x00004d66, // Entry 220 - 23F - 0x00004cf4, 0x00004d02, 0x00004d2e, 0x00004d5a, - 0x00004d6c, 0x00004d82, 0x00004d98, 0x00004db9, - 0x00004ded, 0x00004dfd, 0x00004e31, 0x00004e4f, - 0x00004e7a, 0x00004e8c, 0x00004e9b, 0x00004eb7, - 0x00004ed1, 0x00004ef7, 0x00004f0e, 0x00004f1c, - 0x00004f2f, 0x00004f65, 0x00004f84, 0x00004fa3, - 0x00004fb2, 0x00004fc5, 0x00005014, 0x0000506e, - 0x0000507a, 0x00005083, 0x0000508d, 0x0000509c, + 0x00004d6f, 0x00004d76, 0x00004d81, 0x00004d8c, + 0x00004dca, 0x00004dff, 0x00004e0f, 0x00004e1d, + 0x00004e49, 0x00004e75, 0x00004e87, 0x00004e9d, + 0x00004eb3, 0x00004ed4, 0x00004f08, 0x00004f18, + 0x00004f4c, 0x00004f6a, 0x00004f95, 0x00004fa7, + 0x00004fb6, 0x00004fd2, 0x00004fec, 0x00005012, + 0x00005029, 0x00005037, 0x0000504a, 0x00005080, + 0x0000509f, 0x000050be, 0x000050cd, 0x000050e0, // Entry 240 - 25F - 0x000050a3, 0x000050dc, 0x0000510c, 0x00005198, - 0x000051f0, 0x0000521c, 0x0000523a, 0x00005270, - 0x000052ba, 0x0000530b, 0x00005328, 0x0000535e, - 0x000053d9, 0x0000540f, 0x0000541d, 0x00005432, - 0x00005447, 0x0000545d, 0x000054b6, 0x000054c6, - 0x000054e3, 0x0000550d, 0x00005518, 0x00005537, - 0x00005561, 0x00005569, 0x0000556e, 0x00005577, - 0x0000557f, 0x0000558b, 0x00005591, 0x000055a1, + 0x0000512f, 0x00005189, 0x00005195, 0x0000519e, + 0x000051a8, 0x000051b7, 0x000051be, 0x000051f7, + 0x00005227, 0x000052b3, 0x0000530b, 0x00005337, + 0x00005355, 0x0000538b, 0x000053d5, 0x00005426, + 0x00005443, 0x00005479, 0x000054f4, 0x0000552a, + 0x00005538, 0x0000554d, 0x00005562, 0x00005578, + 0x000055d1, 0x000055e1, 0x000055fe, 0x00005628, + 0x00005633, 0x00005652, 0x0000567c, 0x00005684, // Entry 260 - 27F - 0x000055b0, 0x000055c7, 0x000055d6, 0x000055e2, - 0x000055f3, 0x00005609, 0x00005610, 0x0000561d, - 0x00005629, 0x0000562f, 0x00005634, 0x00005645, - 0x00005649, 0x0000564f, 0x0000565e, 0x0000568f, - 0x000056a8, 0x000056c1, 0x000056cd, 0x000056d6, - 0x000056e0, 0x000056f1, 0x000056f9, 0x00005708, - 0x00005716, 0x0000571b, 0x00005727, 0x00005736, - 0x0000574e, 0x0000575a, 0x0000577a, 0x00005788, + 0x00005689, 0x00005692, 0x0000569a, 0x000056a6, + 0x000056ac, 0x000056bc, 0x000056cb, 0x000056e2, + 0x000056f1, 0x000056fd, 0x0000570e, 0x00005724, + 0x0000572b, 0x00005738, 0x00005744, 0x0000574a, + 0x0000574f, 0x00005760, 0x00005764, 0x0000576a, + 0x00005779, 0x000057aa, 0x000057c3, 0x000057dc, + 0x000057e8, 0x000057f1, 0x000057fb, 0x0000580c, + 0x00005814, 0x00005823, 0x00005831, 0x00005836, // Entry 280 - 29F - 0x00005793, 0x000057a6, 0x000057b2, 0x000057cd, - 0x000057e8, 0x00005811, 0x00005822, 0x00005828, - 0x00005832, 0x00005852, 0x0000586f, 0x00005883, - 0x00005887, 0x0000589a, 0x000058b1, 0x000058d4, - 0x00005911, 0x0000592a, 0x00005964, 0x00005999, - 0x000059e2, 0x00005a0c, 0x00005a6f, 0x00005a80, - 0x00005ada, 0x00005aec, 0x00005b09, 0x00005b2c, - 0x00005b4b, 0x00005b6f, 0x00005b93, 0x00005baf, + 0x00005842, 0x00005851, 0x00005869, 0x00005875, + 0x00005895, 0x000058a3, 0x000058ae, 0x000058c1, + 0x000058cd, 0x000058e8, 0x00005903, 0x0000592c, + 0x0000593d, 0x00005943, 0x0000594d, 0x0000596d, + 0x0000598a, 0x0000599e, 0x000059a2, 0x000059b5, + 0x000059cc, 0x000059ef, 0x00005a2c, 0x00005a45, + 0x00005a7f, 0x00005ab4, 0x00005afd, 0x00005b27, + 0x00005b8a, 0x00005b9b, 0x00005bf5, 0x00005c07, // Entry 2A0 - 2BF - 0x00005bc7, 0x00005bdb, 0x00005bf3, 0x00005c0b, - 0x00005c21, 0x00005c45, 0x00005c56, 0x00005c7c, - 0x00005ccb, 0x00005ce1, 0x00005cf8, 0x00005cfe, - 0x00005d24, 0x00005d51, 0x00005d5c, 0x00005d6d, - 0x00005d7e, 0x00005d8c, 0x00005d98, 0x00005dbc, - 0x00005dd2, 0x00005df4, 0x00005e08, 0x00005e28, - 0x00005e44, 0x00005e6b, 0x00005e88, 0x00005eb5, - 0x00005eee, 0x00005efa, 0x00005f33, 0x00005f64, + 0x00005c24, 0x00005c47, 0x00005c66, 0x00005c8a, + 0x00005cae, 0x00005cca, 0x00005ce2, 0x00005cf6, + 0x00005d0e, 0x00005d26, 0x00005d3c, 0x00005d60, + 0x00005d71, 0x00005d97, 0x00005de6, 0x00005dfc, + 0x00005e13, 0x00005e19, 0x00005e3f, 0x00005e6c, + 0x00005e77, 0x00005e88, 0x00005e99, 0x00005ea7, + 0x00005eb3, 0x00005ed7, 0x00005eed, 0x00005f0f, + 0x00005f23, 0x00005f43, 0x00005f5f, 0x00005f86, // Entry 2C0 - 2DF - 0x00005f71, 0x00005f86, 0x00005fa8, 0x00005fd6, - 0x0000604d, 0x000060af, 0x000060e3, 0x000060fe, - 0x0000611b, 0x00006138, 0x00006165, 0x00006182, - 0x000061a7, 0x000061c7, 0x000061eb, 0x00006203, - 0x0000622a, 0x00006252, 0x00006265, -} // Size: 2916 bytes + 0x00005fa3, 0x00005fd0, 0x00006009, 0x00006015, + 0x0000604e, 0x0000607f, 0x0000608c, 0x000060a1, + 0x000060c3, 0x000060f1, 0x00006168, 0x000061ca, + 0x000061fe, 0x00006219, 0x00006236, 0x00006253, + 0x00006280, 0x0000629d, 0x000062c2, 0x000062e2, + 0x00006306, 0x0000631e, 0x00006345, 0x0000636d, + 0x00006380, +} // Size: 2940 bytes -const esData string = "" + // Size: 25189 bytes +const esData string = "" + // Size: 25472 bytes "\x02Página Restringida\x02Esta función solo está permitida para usuarios" + " de pago. Por favor actualice su plan\x02Continuar para actualizar plan" + "\x02Marcadores sociales más compartir enlaces, acortar y listar, todo en" + @@ -1524,18 +1537,22 @@ const esData string = "" + // Size: 25189 bytes "Anterior\x02Las contraseñas introducidas no coinciden.\x02El orden de et" + "iquetas que ingresó no es válido.\x02Editar Perfil\x02Guardar\x02Idioma " + "por defecto\x02Zona horaria\x02Orden de Etiquetas Predeterminado\x02Nomb" + - "re\x02Nombre de Usuario\x02Imagen\x02Atrás\x02Cancelar\x02Español\x02Ing" + - "lés\x02Cantidad\x02Cantidad (inverso)\x02Nombre (inverso)\x02Fecha de Cr" + - "eación\x02Fecha de Creación (inverso)\x02Perfil actualizado con éxito" + - "\x02Ajustes\x02Slug\x02Subscripción\x02Es Activo\x02Correo electrónico" + - "\x02Idioma por defecto\x02Organizaciones\x02Organización Actual\x02Edita" + - "r\x02Miembros\x02Acciones\x02Cambiar Contraseña\x02Actualizar correo ele" + - "ctrónico\x02Editar perfil\x02Gestionar tus Organizaciones\x02Actualizar " + - "Organización\x02Ver Registros de Auditoría\x02Marcador\x02Añadir a LinkT" + - "aco\x02Este enlace especial te permite guardar en LinkTaco directamente " + - "usando un marcador en tu navegador web.\x02Arrastra y suelta este botón " + - "en la barra de herramientas de tu navegador o en tus marcadores.\x02Comp" + - "letar Registro\x02Nombre Completo\x02Contraseña\x02Registro Completado" + + "re\x02Nombre de Usuario\x02Imagen\x02Atrás\x02Cancelar\x02Eliminar image" + + "n\x02Publicación por correo\x02Activar publicación por correo\x02Regener" + + "ar código\x02Cuando está activado, puedes agregar enlaces enviando un co" + + "rreo a una dirección especial.\x02Español\x02Inglés\x02Cantidad\x02Canti" + + "dad (inverso)\x02Nombre (inverso)\x02Fecha de Creación\x02Fecha de Creac" + + "ión (inverso)\x02Perfil actualizado con éxito\x02Ajustes\x02Slug\x02Subs" + + "cripción\x02Es Activo\x02Correo electrónico\x02Idioma por defecto\x02Org" + + "anizaciones\x02Organización Actual\x02Editar\x02Miembros\x02Acciones\x02" + + "Cambiar Contraseña\x02Actualizar correo electrónico\x02Editar perfil\x02" + + "Gestionar tus Organizaciones\x02Actualizar Organización\x02Ver Registros" + + " de Auditoría\x02Marcador\x02Añadir a LinkTaco\x02Este enlace especial t" + + "e permite guardar en LinkTaco directamente usando un marcador en tu nave" + + "gador web.\x02Arrastra y suelta este botón en la barra de herramientas d" + + "e tu navegador o en tus marcadores.\x02No compartas esta dirección. Cual" + + "quier persona con este correo puede publicar enlaces en tu cuenta.\x02Co" + + "mpletar Registro\x02Nombre Completo\x02Contraseña\x02Registro Completado" + "\x02Registro\x02Dirección de Correo Electrónico\x02Confirmar Contraseña" + "\x02¿Ya tienes una cuenta? Click aquí para ingresar\x02Bienvenido a Link" + "s\x02Configura tu cuenta para poder guardar enlaces\x02El registro no es" + @@ -1885,4 +1902,4 @@ const esData string = "" + // Size: 25189 bytes "equerido\x02Por favor introduzca un correo válido\x02Por favor introduzc" + "a un número válido\x02El '%[1]s' falló." - // Total table size 52423 bytes (51KiB); checksum: 580BD6A5 + // Total table size 52976 bytes (51KiB); checksum: 77638183 diff --git a/internal/translations/locales/en/out.gotext.json b/internal/translations/locales/en/out.gotext.json index 3f053c2..0563327 100644 --- a/internal/translations/locales/en/out.gotext.json +++ b/internal/translations/locales/en/out.gotext.json @@ -204,6 +204,41 @@ "translatorComment": "Copied from source.", "fuzzy": true }, + { + "id": "Delete picture", + "message": "Delete picture", + "translation": "Delete picture", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Email Posting", + "message": "Email Posting", + "translation": "Email Posting", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Enable email posting", + "message": "Enable email posting", + "translation": "Enable email posting", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "Regenerate code", + "message": "Regenerate code", + "translation": "Regenerate code", + "translatorComment": "Copied from source.", + "fuzzy": true + }, + { + "id": "When enabled, you can add links by sending an email to a special address.", + "message": "When enabled, you can add links by sending an email to a special address.", + "translation": "When enabled, you can add links by sending an email to a special address.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Spanish", "message": "Spanish", @@ -407,6 +442,13 @@ "translatorComment": "Copied from source.", "fuzzy": true }, + { + "id": "Do not share this address. Anyone with this email can post links to your account.", + "message": "Do not share this address. Anyone with this email can post links to your account.", + "translation": "Do not share this address. Anyone with this email can post links to your account.", + "translatorComment": "Copied from source.", + "fuzzy": true + }, { "id": "Complete Registration", "message": "Complete Registration", diff --git a/internal/translations/locales/es/messages.gotext.json b/internal/translations/locales/es/messages.gotext.json index d088f21..24afd19 100644 --- a/internal/translations/locales/es/messages.gotext.json +++ b/internal/translations/locales/es/messages.gotext.json @@ -146,6 +146,31 @@ "message": "Cancel", "translation": "Cancelar" }, + { + "id": "Delete picture", + "message": "Delete picture", + "translation": "Eliminar imagen" + }, + { + "id": "Email Posting", + "message": "Email Posting", + "translation": "Publicación por correo" + }, + { + "id": "Enable email posting", + "message": "Enable email posting", + "translation": "Activar publicación por correo" + }, + { + "id": "Regenerate code", + "message": "Regenerate code", + "translation": "Regenerar código" + }, + { + "id": "When enabled, you can add links by sending an email to a special address.", + "message": "When enabled, you can add links by sending an email to a special address.", + "translation": "Cuando está activado, puedes agregar enlaces enviando un correo a una dirección especial." + }, { "id": "Spanish", "message": "Spanish", @@ -291,6 +316,11 @@ "message": "Drag and drop this button to your web browser toolbar or your bookmarks.", "translation": "Arrastra y suelta este botón en la barra de herramientas de tu navegador o en tus marcadores." }, + { + "id": "Do not share this address. Anyone with this email can post links to your account.", + "message": "Do not share this address. Anyone with this email can post links to your account.", + "translation": "No compartas esta dirección. Cualquier persona con este correo puede publicar enlaces en tu cuenta." + }, { "id": "Complete Registration", "message": "Complete Registration", diff --git a/internal/translations/locales/es/out.gotext.json b/internal/translations/locales/es/out.gotext.json index d088f21..24afd19 100644 --- a/internal/translations/locales/es/out.gotext.json +++ b/internal/translations/locales/es/out.gotext.json @@ -146,6 +146,31 @@ "message": "Cancel", "translation": "Cancelar" }, + { + "id": "Delete picture", + "message": "Delete picture", + "translation": "Eliminar imagen" + }, + { + "id": "Email Posting", + "message": "Email Posting", + "translation": "Publicación por correo" + }, + { + "id": "Enable email posting", + "message": "Enable email posting", + "translation": "Activar publicación por correo" + }, + { + "id": "Regenerate code", + "message": "Regenerate code", + "translation": "Regenerar código" + }, + { + "id": "When enabled, you can add links by sending an email to a special address.", + "message": "When enabled, you can add links by sending an email to a special address.", + "translation": "Cuando está activado, puedes agregar enlaces enviando un correo a una dirección especial." + }, { "id": "Spanish", "message": "Spanish", @@ -291,6 +316,11 @@ "message": "Drag and drop this button to your web browser toolbar or your bookmarks.", "translation": "Arrastra y suelta este botón en la barra de herramientas de tu navegador o en tus marcadores." }, + { + "id": "Do not share this address. Anyone with this email can post links to your account.", + "message": "Do not share this address. Anyone with this email can post links to your account.", + "translation": "No compartas esta dirección. Cualquier persona con este correo puede publicar enlaces en tu cuenta." + }, { "id": "Complete Registration", "message": "Complete Registration", diff --git a/models/link_short.go b/models/link_short.go index 31a38b0..828b931 100644 --- a/models/link_short.go +++ b/models/link_short.go @@ -106,7 +106,7 @@ func (l *LinkShort) Store(ctx context.Context) error { err := database.WithTx(ctx, nil, func(tx *sql.Tx) error { var err error if l.ShortCode == "" { - code, err := getShortCode(ctx, tx, "link_shorts", "short_code", sq.Eq{"domain_id": l.DomainID}) + code, err := getShortCode(ctx, tx, "link_shorts", "short_code", sq.Eq{"domain_id": l.DomainID}, 0) if err != nil { return err } diff --git a/models/qr_codes.go b/models/qr_codes.go index b31b715..5eee785 100644 --- a/models/qr_codes.go +++ b/models/qr_codes.go @@ -105,7 +105,7 @@ func (q *QRCode) Store(ctx context.Context) error { var err error if q.ID == 0 { // When creating a new qr_code, generate an unique hash_id - code, err := getShortCode(ctx, tx, "qr_codes", "hash_id", nil) + code, err := getShortCode(ctx, tx, "qr_codes", "hash_id", nil, 0) if err != nil { return err } diff --git a/models/user.go b/models/user.go index 465cd1a..64f2c6f 100644 --- a/models/user.go +++ b/models/user.go @@ -19,9 +19,11 @@ import ( // AccountSettings ... type AccountSettings struct { - DefaultLang string `json:"default_lang"` - Timezone string `json:"timezone"` - DefaultTagOrder string `json:"default_tag_order"` + DefaultLang string `json:"default_lang"` + Timezone string `json:"timezone"` + DefaultTagOrder string `json:"default_tag_order"` + EmailPostEnabled bool `json:"email_post_enabled"` + EmailPostCode string `json:"email_post_code"` } // UserSettings ... diff --git a/models/utils.go b/models/utils.go index 2859806..63d80b9 100644 --- a/models/utils.go +++ b/models/utils.go @@ -13,11 +13,14 @@ import ( "netlandish.com/x/gobwebs/database" ) -func getShortCode(ctx context.Context, tx *sql.Tx, table, field string, filter sq.Sqlizer) (string, error) { +func getShortCode(ctx context.Context, tx *sql.Tx, table, field string, filter sq.Sqlizer, startLen int) (string, error) { chars := "abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ0123456789" r := rand.New(rand.NewSource(time.Now().UnixNano())) - codelen := 4 + codelen := startLen + if codelen == 0 { + codelen = 4 + } code := make([]byte, codelen) counter := 0 @@ -121,3 +124,23 @@ func BuildSliceFromJSONString[T any](jsonInput string) ([]T, error) { } return SliceNilRemover(dval), nil } + +// GenerateEmailPostCode generates a unique 10-char code and stores it in the user's settings. +func GenerateEmailPostCode(ctx context.Context, user *User, enable bool) (string, error) { + var code string + err := database.WithTx(ctx, nil, func(tx *sql.Tx) error { + var err error + code, err = getShortCode(ctx, tx, "users", + "settings->'account'->>'email_post_code'", nil, 10) + if err != nil { + return err + } + user.Settings.Account.EmailPostCode = code + user.Settings.Account.EmailPostEnabled = enable + return user.Store(ctx) + }) + if err != nil { + return "", err + } + return code, nil +} diff --git a/templates/profile_edit.html b/templates/profile_edit.html index be72b65..62a44cb 100644 --- a/templates/profile_edit.html +++ b/templates/profile_edit.html @@ -67,6 +67,20 @@ <p class="error">{{ . }}</p> {{ end }} </div> + <fieldset> + <legend>{{.pd.Data.email_posting}}</legend> + <p class="text-muted is-small">{{.pd.Data.email_posting_help}}</p> + <div> + <input type="checkbox" value="true" name="email_post_enabled" id="email-post-enabled"{{if .form.EmailPostEnabled}} checked{{end}}> + <label for="email-post-enabled">{{.pd.Data.enable_email_posting}}</label> + </div> + {{if .form.EmailPostEnabled}} + <div> + <input type="checkbox" value="true" name="regenerate_email_post_code" id="regenerate-code"> + <label for="regenerate-code">{{.pd.Data.regenerate_code}}</label> + </div> + {{end}} + </fieldset> </form> <footer class="is-right"> <button form="profile-edit-form" type="submit" class="button dark">{{.pd.Data.save}}</button> diff --git a/templates/settings.html b/templates/settings.html index 6762379..cc3f0cd 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -53,6 +53,15 @@ <th class="text-left">{{ .pd.Data.organizations }}</th> <td colspan="3"><a href="{{ reverse "core:org_list" }}" class="button primary is-small">{{ .pd.Data.manage }}</a></td> </tr> + {{if .user.Settings.Account.EmailPostEnabled}} + <tr> + <th class="text-left">{{ .pd.Data.email_posting }}</th> + <td colspan="3"> + <code style="font-size: 1.1em; padding: 0.3em 0.5em; cursor: pointer;" onclick="window.getSelection().selectAllChildren(this)" title="Click to select">post+{{.user.Settings.Account.EmailPostCode}}@{{.emailPostDomain}}</code> + <p class="text-muted is-small"><em>{{ .pd.Data.email_posting_warning }}</em></p> + </td> + </tr> + {{end}} </tbody> </table> -- 2.52.0
Applied. To git@git.code.netlandish.com:~netlandish/links 5362d40..c56f91e master -> master