menu

package
v0.0.0-...-c6647e5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 20, 2024 License: Apache-2.0 Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const (
	Menu_GetMenu_FullMethodName       = "/atreus.menu.Menu/GetMenu"
	Menu_ListSysMenu_FullMethodName   = "/atreus.menu.Menu/ListSysMenu"
	Menu_CreateSysMenu_FullMethodName = "/atreus.menu.Menu/CreateSysMenu"
	Menu_GrantList_FullMethodName     = "/atreus.menu.Menu/GrantList"
)
View Source
const OperationMenuCreateSysMenu = "/atreus.menu.Menu/CreateSysMenu"
View Source
const OperationMenuGetMenu = "/atreus.menu.Menu/GetMenu"
View Source
const OperationMenuGrantList = "/atreus.menu.Menu/GrantList"
View Source
const OperationMenuListSysMenu = "/atreus.menu.Menu/ListSysMenu"

Variables

View Source
var File_api_menu_menu_proto protoreflect.FileDescriptor
View Source
var Menu_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "atreus.menu.Menu",
	HandlerType: (*MenuServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetMenu",
			Handler:    _Menu_GetMenu_Handler,
		},
		{
			MethodName: "ListSysMenu",
			Handler:    _Menu_ListSysMenu_Handler,
		},
		{
			MethodName: "CreateSysMenu",
			Handler:    _Menu_CreateSysMenu_Handler,
		},
		{
			MethodName: "GrantList",
			Handler:    _Menu_GrantList_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/menu/menu.proto",
}

Menu_ServiceDesc is the grpc.ServiceDesc for Menu service. It's only intended for direct use with grpc.RegisterService, and not to be introspected or modified (even as a copy)

Functions

func DefaultDeleteSysMenu

func DefaultDeleteSysMenu(ctx context.Context, in *SysMenu, db *gorm.DB) error

func DefaultDeleteSysMenuSet

func DefaultDeleteSysMenuSet(ctx context.Context, in []*SysMenu, db *gorm.DB) error

func RegisterMenuHTTPServer

func RegisterMenuHTTPServer(s *http.Server, srv MenuHTTPServer)

func RegisterMenuServer

func RegisterMenuServer(s grpc.ServiceRegistrar, srv MenuServer)

Types

type GetMenuReq

type GetMenuReq struct {
	Secret     string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"`
	PlatformID int32  `protobuf:"varint,2,opt,name=platformID,proto3" json:"platformID,omitempty"`
	UserID     string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID,omitempty"`
	// contains filtered or unexported fields
}

func (*GetMenuReq) Descriptor deprecated

func (*GetMenuReq) Descriptor() ([]byte, []int)

Deprecated: Use GetMenuReq.ProtoReflect.Descriptor instead.

func (*GetMenuReq) GetPlatformID

func (x *GetMenuReq) GetPlatformID() int32

func (*GetMenuReq) GetSecret

func (x *GetMenuReq) GetSecret() string

func (*GetMenuReq) GetUserID

func (x *GetMenuReq) GetUserID() string

func (*GetMenuReq) ProtoMessage

func (*GetMenuReq) ProtoMessage()

func (*GetMenuReq) ProtoReflect

func (x *GetMenuReq) ProtoReflect() protoreflect.Message

func (*GetMenuReq) Reset

func (x *GetMenuReq) Reset()

func (*GetMenuReq) String

func (x *GetMenuReq) String() string

type GetMenuResp

type GetMenuResp struct {
	Routes            []*SysMenu `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"`
	ExpireTimeSeconds int64      `protobuf:"varint,3,opt,name=expireTimeSeconds,proto3" json:"expireTimeSeconds,omitempty"`
	// contains filtered or unexported fields
}

func (*GetMenuResp) Descriptor deprecated

func (*GetMenuResp) Descriptor() ([]byte, []int)

Deprecated: Use GetMenuResp.ProtoReflect.Descriptor instead.

func (*GetMenuResp) GetExpireTimeSeconds

func (x *GetMenuResp) GetExpireTimeSeconds() int64

func (*GetMenuResp) GetRoutes

func (x *GetMenuResp) GetRoutes() []*SysMenu

func (*GetMenuResp) ProtoMessage

func (*GetMenuResp) ProtoMessage()

func (*GetMenuResp) ProtoReflect

func (x *GetMenuResp) ProtoReflect() protoreflect.Message

func (*GetMenuResp) Reset

func (x *GetMenuResp) Reset()

func (*GetMenuResp) String

func (x *GetMenuResp) String() string

type ListSysMenuResp

type ListSysMenuResp struct {
	Results []*SysMenu `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	// contains filtered or unexported fields
}

func (*ListSysMenuResp) Descriptor deprecated

func (*ListSysMenuResp) Descriptor() ([]byte, []int)

Deprecated: Use ListSysMenuResp.ProtoReflect.Descriptor instead.

func (*ListSysMenuResp) GetResults

func (x *ListSysMenuResp) GetResults() []*SysMenu

func (*ListSysMenuResp) ProtoMessage

func (*ListSysMenuResp) ProtoMessage()

func (*ListSysMenuResp) ProtoReflect

func (x *ListSysMenuResp) ProtoReflect() protoreflect.Message

func (*ListSysMenuResp) Reset

func (x *ListSysMenuResp) Reset()

func (*ListSysMenuResp) String

func (x *ListSysMenuResp) String() string
type Menu struct {
	Name     string  `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Icon     string  `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"`
	Children []*Menu `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"`
	// contains filtered or unexported fields
}
func (*Menu) Descriptor() ([]byte, []int)

Deprecated: Use Menu.ProtoReflect.Descriptor instead.

func (x *Menu) GetChildren() []*Menu
func (x *Menu) GetIcon() string
func (x *Menu) GetName() string
func (*Menu) ProtoMessage()
func (x *Menu) ProtoReflect() protoreflect.Message
func (x *Menu) Reset()
func (x *Menu) String() string
type MenuClient interface {
	// 获取菜单树
	GetMenu(ctx context.Context, in *GetMenuReq, opts ...grpc.CallOption) (*GetMenuResp, error)
	// 分页获取基础menu列表
	ListSysMenu(ctx context.Context, in *GetMenuReq, opts ...grpc.CallOption) (*ListSysMenuResp, error)
	CreateSysMenu(ctx context.Context, in *SysMenu, opts ...grpc.CallOption) (*SysMenu, error)
	GrantList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListSysMenuResp, error)
}

MenuClient is the client API for Menu service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.

func NewMenuClient

func NewMenuClient(cc grpc.ClientConnInterface) MenuClient
type MenuDefaultServer struct {
	DB *gorm.DB
}
func (m *MenuDefaultServer) CreateSysMenu(ctx context.Context, in *SysMenu) (*SysMenu, error)

CreateSysMenu ...

func (m *MenuDefaultServer) ListSysMenu(ctx context.Context, in *GetMenuReq) (*ListSysMenuResp, error)

ListSysMenu ...

type MenuHTTPClient interface {
	CreateSysMenu(ctx context.Context, req *SysMenu, opts ...http.CallOption) (rsp *SysMenu, err error)
	GetMenu(ctx context.Context, req *GetMenuReq, opts ...http.CallOption) (rsp *GetMenuResp, err error)
	GrantList(ctx context.Context, req *emptypb.Empty, opts ...http.CallOption) (rsp *ListSysMenuResp, err error)
	ListSysMenu(ctx context.Context, req *GetMenuReq, opts ...http.CallOption) (rsp *ListSysMenuResp, err error)
}

func NewMenuHTTPClient

func NewMenuHTTPClient(client *http.Client) MenuHTTPClient
type MenuHTTPClientImpl struct {
	// contains filtered or unexported fields
}
func (c *MenuHTTPClientImpl) CreateSysMenu(ctx context.Context, in *SysMenu, opts ...http.CallOption) (*SysMenu, error)
func (c *MenuHTTPClientImpl) GetMenu(ctx context.Context, in *GetMenuReq, opts ...http.CallOption) (*GetMenuResp, error)
func (c *MenuHTTPClientImpl) GrantList(ctx context.Context, in *emptypb.Empty, opts ...http.CallOption) (*ListSysMenuResp, error)
func (c *MenuHTTPClientImpl) ListSysMenu(ctx context.Context, in *GetMenuReq, opts ...http.CallOption) (*ListSysMenuResp, error)
type MenuHTTPServer interface {
	CreateSysMenu(context.Context, *SysMenu) (*SysMenu, error)
	// GetMenu获取菜单树
	GetMenu(context.Context, *GetMenuReq) (*GetMenuResp, error)
	GrantList(context.Context, *emptypb.Empty) (*ListSysMenuResp, error)
	// ListSysMenu分页获取基础menu列表
	ListSysMenu(context.Context, *GetMenuReq) (*ListSysMenuResp, error)
}
type MenuImpl struct {
	// contains filtered or unexported fields
}

func NewMenuImpl

func NewMenuImpl(conn *grpc.ClientConn) *MenuImpl
func (c *MenuImpl) CreateSysMenu(ctx context.Context, in *SysMenu) (*SysMenu, error)
func (c *MenuImpl) GetMenu(ctx context.Context, in *GetMenuReq) (*GetMenuResp, error)
func (c *MenuImpl) GrantList(ctx context.Context, in *emptypb.Empty) (*ListSysMenuResp, error)
func (c *MenuImpl) ListSysMenu(ctx context.Context, in *GetMenuReq) (*ListSysMenuResp, error)
type MenuServer interface {
	// 获取菜单树
	GetMenu(context.Context, *GetMenuReq) (*GetMenuResp, error)
	// 分页获取基础menu列表
	ListSysMenu(context.Context, *GetMenuReq) (*ListSysMenuResp, error)
	CreateSysMenu(context.Context, *SysMenu) (*SysMenu, error)
	GrantList(context.Context, *emptypb.Empty) (*ListSysMenuResp, error)
}

MenuServer is the server API for Menu service. All implementations should embed UnimplementedMenuServer for forward compatibility

type MenuSysMenuWithAfterCreateSysMenu interface {
	AfterCreateSysMenu(context.Context, *SysMenu, *gorm.DB) error
}

MenuSysMenuWithAfterCreateSysMenu called before DefaultCreateSysMenuSysMenu in the default CreateSysMenu handler

type MenuSysMenuWithAfterListSysMenu interface {
	AfterListSysMenu(context.Context, *ListSysMenuResp, *gorm.DB) error
}

MenuSysMenuWithAfterListSysMenu called before DefaultListSysMenuSysMenu in the default ListSysMenu handler

type MenuSysMenuWithBeforeCreateSysMenu interface {
	BeforeCreateSysMenu(context.Context, *gorm.DB) (*gorm.DB, error)
}

MenuSysMenuWithBeforeCreateSysMenu called before DefaultCreateSysMenuSysMenu in the default CreateSysMenu handler

type MenuSysMenuWithBeforeListSysMenu interface {
	BeforeListSysMenu(context.Context, *gorm.DB) (*gorm.DB, error)
}

MenuSysMenuWithBeforeListSysMenu called before DefaultListSysMenuSysMenu in the default ListSysMenu handler

type SysMenu

type SysMenu struct {

	// 菜单ID
	Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	// 父级ID
	ParentId int32 `protobuf:"varint,2,opt,name=parentId,proto3" json:"parentId,omitempty"`
	// 菜单名称
	Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
	// 菜单名称
	I18NTitle string `protobuf:"bytes,4,opt,name=i18nTitle,proto3" json:"i18nTitle,omitempty"`
	// 菜单图标
	Icon string `protobuf:"bytes,5,opt,name=icon,proto3" json:"icon,omitempty"`
	// 授权标识
	Permission string `protobuf:"bytes,6,opt,name=permission,proto3" json:"permission,omitempty"`
	// 路由地址
	Path string `protobuf:"bytes,7,opt,name=path,proto3" json:"path,omitempty"`
	// 打开方式 (1组件 2内链 3外链)
	TargetType int32 `protobuf:"varint,8,opt,name=targetType,proto3" json:"targetType,omitempty"`
	// 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址)
	Uri string `protobuf:"bytes,9,opt,name=uri,proto3" json:"uri,omitempty"`
	// 显示排序
	Sort int32 `protobuf:"varint,10,opt,name=sort,proto3" json:"sort,omitempty"`
	// 组件缓存:0-开启,1-关闭
	KeepAlive int32 `protobuf:"varint,11,opt,name=keepAlive,proto3" json:"keepAlive,omitempty"`
	// 隐藏菜单: 0-否,1-是
	Hidden int32 `protobuf:"varint,12,opt,name=hidden,proto3" json:"hidden,omitempty"`
	// 菜单类型 (0目录,1菜单,2按钮)
	Type int32 `protobuf:"varint,13,opt,name=type,proto3" json:"type,omitempty"`
	// 备注信息
	Remarks string `protobuf:"bytes,14,opt,name=remarks,proto3" json:"remarks,omitempty"`
	// 创建时间
	CreateTime string `protobuf:"bytes,15,opt,name=createTime,proto3" json:"createTime,omitempty"`
	// 更新时间
	UpdateTime string `protobuf:"bytes,16,opt,name=updateTime,proto3" json:"updateTime,omitempty"`
	// 子级
	Children []*SysMenu `protobuf:"bytes,17,rep,name=children,proto3" json:"children,omitempty"`
	// contains filtered or unexported fields
}

func DefaultApplyFieldMaskSysMenu

func DefaultApplyFieldMaskSysMenu(ctx context.Context, patchee *SysMenu, patcher *SysMenu, updateMask *field_mask.FieldMask, prefix string, db *gorm.DB) (*SysMenu, error)

DefaultApplyFieldMaskSysMenu patches an pbObject with patcher according to a field mask.

func DefaultCreateSysMenu

func DefaultCreateSysMenu(ctx context.Context, in *SysMenu, db *gorm.DB) (*SysMenu, error)

DefaultCreateSysMenu executes a basic gorm create call

func DefaultListSysMenu

func DefaultListSysMenu(ctx context.Context, db *gorm.DB) ([]*SysMenu, error)

DefaultListSysMenu executes a gorm list call

func DefaultPatchSetSysMenu

func DefaultPatchSetSysMenu(ctx context.Context, objects []*SysMenu, updateMasks []*field_mask.FieldMask, db *gorm.DB) ([]*SysMenu, error)

DefaultPatchSetSysMenu executes a bulk gorm update call with patch behavior

func DefaultPatchSysMenu

func DefaultPatchSysMenu(ctx context.Context, in *SysMenu, updateMask *field_mask.FieldMask, db *gorm.DB) (*SysMenu, error)

DefaultPatchSysMenu executes a basic gorm update call with patch behavior

func DefaultReadSysMenu

func DefaultReadSysMenu(ctx context.Context, in *SysMenu, db *gorm.DB) (*SysMenu, error)

func DefaultStrictUpdateSysMenu

func DefaultStrictUpdateSysMenu(ctx context.Context, in *SysMenu, db *gorm.DB) (*SysMenu, error)

DefaultStrictUpdateSysMenu clears / replaces / appends first level 1:many children and then executes a gorm update call

func (*SysMenu) Descriptor deprecated

func (*SysMenu) Descriptor() ([]byte, []int)

Deprecated: Use SysMenu.ProtoReflect.Descriptor instead.

func (*SysMenu) GetChildren

func (x *SysMenu) GetChildren() []*SysMenu

func (*SysMenu) GetCreateTime

func (x *SysMenu) GetCreateTime() string

func (*SysMenu) GetHidden

func (x *SysMenu) GetHidden() int32

func (*SysMenu) GetI18NTitle

func (x *SysMenu) GetI18NTitle() string

func (*SysMenu) GetIcon

func (x *SysMenu) GetIcon() string

func (*SysMenu) GetId

func (x *SysMenu) GetId() int32

func (*SysMenu) GetKeepAlive

func (x *SysMenu) GetKeepAlive() int32

func (*SysMenu) GetParentId

func (x *SysMenu) GetParentId() int32

func (*SysMenu) GetPath

func (x *SysMenu) GetPath() string

func (*SysMenu) GetPermission

func (x *SysMenu) GetPermission() string

func (*SysMenu) GetRemarks

func (x *SysMenu) GetRemarks() string

func (*SysMenu) GetSort

func (x *SysMenu) GetSort() int32

func (*SysMenu) GetTargetType

func (x *SysMenu) GetTargetType() int32

func (*SysMenu) GetTitle

func (x *SysMenu) GetTitle() string

func (*SysMenu) GetType

func (x *SysMenu) GetType() int32

func (*SysMenu) GetUpdateTime

func (x *SysMenu) GetUpdateTime() string

func (*SysMenu) GetUri

func (x *SysMenu) GetUri() string

func (*SysMenu) ProtoMessage

func (*SysMenu) ProtoMessage()

func (*SysMenu) ProtoReflect

func (x *SysMenu) ProtoReflect() protoreflect.Message

func (*SysMenu) Reset

func (x *SysMenu) Reset()

func (*SysMenu) String

func (x *SysMenu) String() string

func (*SysMenu) ToORM

func (m *SysMenu) ToORM(ctx context.Context) (SysMenuORM, error)

ToORM runs the BeforeToORM hook if present, converts the fields of this object to ORM format, runs the AfterToORM hook, then returns the ORM object

type SysMenuORM

type SysMenuORM struct {
	Children   []*SysMenuORM `gorm:"foreignKey:SysMenuId;references:Id"`
	CreateTime string
	Hidden     int32
	I18NTitle  string
	Icon       string
	Id         int32 `gorm:"type:integer;primaryKey;autoIncrement"`
	KeepAlive  int32
	ParentId   int32
	Path       string
	Permission string
	Remarks    string
	Sort       int32
	SysMenuId  *int32
	TargetType int32
	Title      string
	Type       int32
	UpdateTime string
	Uri        string
}

func (SysMenuORM) TableName

func (SysMenuORM) TableName() string

TableName overrides the default tablename generated by GORM

func (*SysMenuORM) ToPB

func (m *SysMenuORM) ToPB(ctx context.Context) (SysMenu, error)

ToPB runs the BeforeToPB hook if present, converts the fields of this object to PB format, runs the AfterToPB hook, then returns the PB object

type SysMenuORMWithAfterCreate_

type SysMenuORMWithAfterCreate_ interface {
	AfterCreate_(context.Context, *gorm.DB) error
}

type SysMenuORMWithAfterDeleteSet

type SysMenuORMWithAfterDeleteSet interface {
	AfterDeleteSet(context.Context, []*SysMenu, *gorm.DB) error
}

type SysMenuORMWithAfterDelete_

type SysMenuORMWithAfterDelete_ interface {
	AfterDelete_(context.Context, *gorm.DB) error
}

type SysMenuORMWithAfterListFind

type SysMenuORMWithAfterListFind interface {
	AfterListFind(context.Context, *gorm.DB, *[]SysMenuORM) error
}

type SysMenuORMWithAfterReadFind

type SysMenuORMWithAfterReadFind interface {
	AfterReadFind(context.Context, *gorm.DB) error
}

type SysMenuORMWithAfterStrictUpdateSave

type SysMenuORMWithAfterStrictUpdateSave interface {
	AfterStrictUpdateSave(context.Context, *gorm.DB) error
}

type SysMenuORMWithBeforeCreate_

type SysMenuORMWithBeforeCreate_ interface {
	BeforeCreate_(context.Context, *gorm.DB, SysMenuORM) (SysMenuORM, *gorm.DB, error)
}

type SysMenuORMWithBeforeDeleteSet

type SysMenuORMWithBeforeDeleteSet interface {
	BeforeDeleteSet(context.Context, []*SysMenu, *gorm.DB) (*gorm.DB, error)
}

type SysMenuORMWithBeforeDelete_

type SysMenuORMWithBeforeDelete_ interface {
	BeforeDelete_(context.Context, *gorm.DB, SysMenuORM) (SysMenuORM, *gorm.DB, error)
}

type SysMenuORMWithBeforeListApplyQuery

type SysMenuORMWithBeforeListApplyQuery interface {
	BeforeListApplyQuery(context.Context, *gorm.DB) (*gorm.DB, error)
}

type SysMenuORMWithBeforeListFind

type SysMenuORMWithBeforeListFind interface {
	BeforeListFind(context.Context, *gorm.DB) (*gorm.DB, error)
}

type SysMenuORMWithBeforeReadApplyQuery

type SysMenuORMWithBeforeReadApplyQuery interface {
	BeforeReadApplyQuery(context.Context, *gorm.DB) (*gorm.DB, error)
}

type SysMenuORMWithBeforeReadFind

type SysMenuORMWithBeforeReadFind interface {
	BeforeReadFind(context.Context, *gorm.DB) (*gorm.DB, error)
}

type SysMenuORMWithBeforeStrictUpdateCleanup

type SysMenuORMWithBeforeStrictUpdateCleanup interface {
	BeforeStrictUpdateCleanup(context.Context, *gorm.DB, SysMenuORM) (SysMenuORM, *gorm.DB, error)
}

type SysMenuORMWithBeforeStrictUpdateSave

type SysMenuORMWithBeforeStrictUpdateSave interface {
	BeforeStrictUpdateSave(context.Context, *gorm.DB, SysMenuORM) (SysMenuORM, *gorm.DB, error)
}

type SysMenuWithAfterPatchSave

type SysMenuWithAfterPatchSave interface {
	AfterPatchSave(context.Context, *SysMenu, *field_mask.FieldMask, *gorm.DB) error
}

type SysMenuWithAfterToORM

type SysMenuWithAfterToORM interface {
	AfterToORM(context.Context, *SysMenuORM) error
}

SysMenuAfterToORM called after default ToORM code

type SysMenuWithAfterToPB

type SysMenuWithAfterToPB interface {
	AfterToPB(context.Context, *SysMenu) error
}

SysMenuAfterToPB called after default ToPB code

type SysMenuWithBeforePatchApplyFieldMask

type SysMenuWithBeforePatchApplyFieldMask interface {
	BeforePatchApplyFieldMask(context.Context, *SysMenu, *field_mask.FieldMask, *gorm.DB) (*gorm.DB, error)
}

type SysMenuWithBeforePatchRead

type SysMenuWithBeforePatchRead interface {
	BeforePatchRead(context.Context, *SysMenu, *field_mask.FieldMask, *gorm.DB) (*gorm.DB, error)
}

type SysMenuWithBeforePatchSave

type SysMenuWithBeforePatchSave interface {
	BeforePatchSave(context.Context, *SysMenu, *field_mask.FieldMask, *gorm.DB) (*gorm.DB, error)
}

type SysMenuWithBeforeToORM

type SysMenuWithBeforeToORM interface {
	BeforeToORM(context.Context, *SysMenuORM) error
}

SysMenuBeforeToORM called before default ToORM code

type SysMenuWithBeforeToPB

type SysMenuWithBeforeToPB interface {
	BeforeToPB(context.Context, *SysMenu) error
}

SysMenuBeforeToPB called before default ToPB code

type UnimplementedMenuServer

type UnimplementedMenuServer struct {
}

UnimplementedMenuServer should be embedded to have forward compatible implementations.

func (UnimplementedMenuServer) CreateSysMenu

func (UnimplementedMenuServer) GetMenu

func (UnimplementedMenuServer) GrantList

func (UnimplementedMenuServer) ListSysMenu

type UnsafeMenuServer

type UnsafeMenuServer interface {
	// contains filtered or unexported methods
}

UnsafeMenuServer may be embedded to opt out of forward compatibility for this service. Use of this interface is not recommended, as added methods to MenuServer will result in compilation errors.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL