]> source.dussan.org Git - gitea.git/commitdiff
Add single sign-on support via SSPI on Windows (#8463)
authorQuaSoft <info@quasoft.net>
Fri, 22 Nov 2019 23:33:31 +0000 (01:33 +0200)
committerLauris BH <lauris@nix.lv>
Fri, 22 Nov 2019 23:33:31 +0000 (01:33 +0200)
* Add single sign-on support via SSPI on Windows

* Ensure plugins implement interface

* Ensure plugins implement interface

* Move functions used only by the SSPI auth method to sspi_windows.go

* Field SSPISeparatorReplacement of AuthenticationForm should not be required via binding, as binding will insist the field is non-empty even if another login type is selected

* Fix breaking of oauth authentication on download links. Do not create new session with SSPI authentication on download links.

* Update documentation for the new 'SPNEGO with SSPI' login source

* Mention in documentation that ROOT_URL should contain the FQDN of the server

* Make sure that Contexter is not checking for active login sources when the ORM engine is not initialized (eg. when installing)

* Always initialize and free SSO methods, even if they are not enabled, as a method can be activated while the app is running (from Authentication sources)

* Add option in SSPIConfig for removing of domains from logon names

* Update helper text for StripDomainNames option

* Make sure handleSignIn() is called after a new user object is created by SSPI auth method

* Remove default value from text of form field helper

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Remove default value from text of form field helper

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Remove default value from text of form field helper

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Only make a query to the DB to check if SSPI is enabled on handlers that need that information for templates

* Remove code duplication

* Log errors in ActiveLoginSources

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Revert suffix of randomly generated E-mails for Reverse proxy authentication

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Revert unneeded white-space change in template

Co-Authored-By: Lauris BH <lauris@nix.lv>
* Add copyright comments at the top of new files

* Use loopback name for randomly generated emails

* Add locale tag for the SSPISeparatorReplacement field with proper casing

* Revert casing of SSPISeparatorReplacement field in locale file, moving it up, next to other form fields

* Update docs/content/doc/features/authentication.en-us.md

Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com>
* Remove Priority() method and define the order in which SSO auth methods should be executed in one place

* Log authenticated username only if it's not empty

* Rephrase helper text for automatic creation of users

* Return error if more than one active SSPI auth source is found

* Change newUser() function to return error, letting caller log/handle the error

* Move isPublicResource, isPublicPage and handleSignIn functions outside SSPI auth method to allow other SSO methods to reuse them if needed

* Refactor initialization of the list containing SSO auth methods

* Validate SSPI settings on POST

* Change SSPI to only perform authentication on its own login page, API paths and download links. Leave Toggle middleware to redirect non authenticated users to login page

* Make 'Default language' in SSPI config empty, unless changed by admin

* Show error if admin tries to add a second authentication source of type SSPI

* Simplify declaration of global variable

* Rebuild gitgraph.js on Linux

* Make sure config values containing only whitespace are not accepted

174 files changed:
docs/content/doc/features/authentication.en-us.md
go.mod
go.sum
models/login_source.go
modules/auth/auth.go
modules/auth/auth_form.go
modules/auth/sso/basic.go [new file with mode: 0644]
modules/auth/sso/interface.go [new file with mode: 0644]
modules/auth/sso/oauth2.go [new file with mode: 0644]
modules/auth/sso/reverseproxy.go [new file with mode: 0644]
modules/auth/sso/session.go [new file with mode: 0644]
modules/auth/sso/sso.go [new file with mode: 0644]
modules/auth/sso/sspi_windows.go [new file with mode: 0644]
options/locale/locale_en-US.ini
public/js/index.js
public/js/index.js.map
routers/admin/auths.go
routers/init.go
routers/repo/http.go
routers/user/auth.go
templates/admin/auth/edit.tmpl
templates/admin/auth/new.tmpl
templates/admin/auth/source/sspi.tmpl [new file with mode: 0644]
templates/user/auth/signin_navbar.tmpl
vendor/github.com/quasoft/websspi/.gitignore [new file with mode: 0644]
vendor/github.com/quasoft/websspi/.travis.yml [new file with mode: 0644]
vendor/github.com/quasoft/websspi/LICENSE [new file with mode: 0644]
vendor/github.com/quasoft/websspi/README.md [new file with mode: 0644]
vendor/github.com/quasoft/websspi/go.mod [new file with mode: 0644]
vendor/github.com/quasoft/websspi/go.sum [new file with mode: 0644]
vendor/github.com/quasoft/websspi/secctx/session.go [new file with mode: 0644]
vendor/github.com/quasoft/websspi/secctx/store.go [new file with mode: 0644]
vendor/github.com/quasoft/websspi/userinfo.go [new file with mode: 0644]
vendor/github.com/quasoft/websspi/utf16.go [new file with mode: 0644]
vendor/github.com/quasoft/websspi/websspi_windows.go [new file with mode: 0644]
vendor/github.com/quasoft/websspi/win32_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/cpu/byteorder.go
vendor/golang.org/x/sys/cpu/cpu.go
vendor/golang.org/x/sys/cpu/cpu_arm.go
vendor/golang.org/x/sys/cpu/cpu_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/mkall.sh
vendor/golang.org/x/sys/unix/mkerrors.sh
vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin.go
vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_386.go
vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go
vendor/golang.org/x/sys/unix/syscall_dragonfly.go
vendor/golang.org/x/sys/unix/syscall_freebsd.go
vendor/golang.org/x/sys/unix/syscall_linux.go
vendor/golang.org/x/sys/unix/syscall_netbsd.go
vendor/golang.org/x/sys/unix/syscall_openbsd.go
vendor/golang.org/x/sys/unix/syscall_solaris.go
vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go
vendor/golang.org/x/sys/unix/zerrors_linux_386.go
vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go
vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go
vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go
vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go
vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
vendor/golang.org/x/sys/unix/ztypes_linux_386.go
vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go
vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
vendor/golang.org/x/sys/windows/asm_windows_386.s [deleted file]
vendor/golang.org/x/sys/windows/asm_windows_amd64.s [deleted file]
vendor/golang.org/x/sys/windows/asm_windows_arm.s [deleted file]
vendor/golang.org/x/sys/windows/dll_windows.go
vendor/golang.org/x/sys/windows/mksyscall.go
vendor/golang.org/x/sys/windows/security_windows.go
vendor/golang.org/x/sys/windows/syscall_windows.go
vendor/golang.org/x/sys/windows/types_windows.go
vendor/golang.org/x/sys/windows/zsyscall_windows.go
vendor/modules.txt
web_src/js/index.js

index afa92196763c5cc6905c93efa70e53125d885474..be2e32db639a93921accd6be327171c8f42f075c 100644 (file)
@@ -216,3 +216,42 @@ configure this, set the fields below:
 
 - Log in to Gitea as an Administrator and click on "Authentication" under Admin Panel.
   Then click `Add New Source` and fill in the details, changing all where appropriate.
+
+## SPNEGO with SSPI (Kerberos/NTLM, for Windows only)
+
+Gitea supports SPNEGO single sign-on authentication (the scheme defined by RFC4559) for the web part of the server via the Security Support Provider Interface (SSPI) built in Windows. SSPI works only in Windows environments - when both the server and the clients are running Windows.
+
+Before activating SSPI single sign-on authentication (SSO) you have to prepare your environment:
+
+- Create a separate user account in active directory, under which the `gitea.exe` process will be running (eg. `user` under domain `domain.local`):
+
+- Create a service principal name for the host where `gitea.exe` is running with class `HTTP`:
+  - Start `Command Prompt` or `PowerShell` as a priviledged domain user (eg. Domain Administrator)
+  - Run the command below, replacing `host.domain.local` with the fully qualified domain name (FQDN) of the server where the web application will be running, and `domain\user` with the name of the account created in the previous step:
+  ```
+    setspn -A HTTP/host.domain.local domain\user
+  ```
+
+- Sign in (*sign out if you were already signed in*) with the user created
+
+- Make sure that `ROOT_URL` in the `[server]` section of `custom/conf/app.ini` is the fully qualified domain name of the server where the web application will be running - the same you used when creating the service principal name (eg. `host.domain.local`)
+
+- Start the web server (`gitea.exe web`)
+
+- Enable SSPI authentication by adding an `SPNEGO with SSPI` authentication source in `Site Administration -> Authentication Sources`
+
+- Sign in to a client computer in the same domain with any domain user (client computer, different from the server running `gitea.exe`)
+
+- If you are using Chrome, Edge or Internet Explorer, add the URL of the web app to the Local intranet sites (`Internet Options -> Security -> Local intranet -> Sites`)
+
+- Start Chrome, Edge or Internet Explorer and navigate to the FQDN URL of gitea (eg. `http://host.domain.local:3000`)
+
+- Click the `Sign In` button on the dashboard and choose SSPI to be automatically logged in with the same user that is currently logged on to the computer
+
+- If it does not work, make sure that:
+  - You are not running the web browser on the same server where gitea is running. You should be running the web browser on a domain joined computer (client) that is different from the server. If both the client and server are runnning on the same computer NTLM will be prefered over Kerberos.
+  - There is only one `HTTP/...` SPN for the host
+  - The SPN contains only the hostname, without the port
+  - You have added the URL of the web app to the `Local intranet zone`
+  - The clocks of the server and client should not differ with more than 5 minutes (depends on group policy)
+  - `Integrated Windows Authentication` should be enabled in Internet Explorer (under `Advanced settings`)
diff --git a/go.mod b/go.mod
index 3c99c64e93f4fc6f096cd8dea99ce1908c9ae2f9..621d93e91274b702a924b5ab73a93f80cb503320 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -78,6 +78,7 @@ require (
        github.com/pquerna/otp v0.0.0-20160912161815-54653902c20e
        github.com/prometheus/client_golang v1.1.0
        github.com/prometheus/procfs v0.0.4 // indirect
+       github.com/quasoft/websspi v1.0.0
        github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
        github.com/russross/blackfriday/v2 v2.0.1
        github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
@@ -101,7 +102,7 @@ require (
        golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f
        golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9
        golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
-       golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b
+       golang.org/x/sys v0.0.0-20191010194322-b09406accb47
        golang.org/x/text v0.3.2
        golang.org/x/tools v0.0.0-20190910221609-7f5965fd7709 // indirect
        gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
diff --git a/go.sum b/go.sum
index 34437116878909ed27837af42144043924b5f844..4bdeda9e771867b3f3bc6bc706e5974f0ce9bb39 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -459,6 +459,8 @@ github.com/prometheus/procfs v0.0.4 h1:w8DjqFMJDjuVwdZBQoOozr4MVWOnwF7RcL/7uxBjY
 github.com/prometheus/procfs v0.0.4/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4=
+github.com/quasoft/websspi v1.0.0 h1:5nDgdM5xSur9s+B5w2xQ5kxf5nUGqgFgU4W0aDLZ8Mw=
+github.com/quasoft/websspi v1.0.0/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 h1:YDeskXpkNDhPdWN3REluVa46HQOVuVkjkd2sWnrABNQ=
 github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@@ -656,8 +658,8 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b h1:3S2h5FadpNr0zUUCVZjlKIEYF+KaX/OBplTGo89CYHI=
-golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
index b8441adcc4c7141f41409e77b04bb7ffb4222650..0a8a92336e12094731aa24439c7a740cb86d8045 100644 (file)
@@ -39,6 +39,7 @@ const (
        LoginPAM              // 4
        LoginDLDAP            // 5
        LoginOAuth2           // 6
+       LoginSSPI             // 7
 )
 
 // LoginNames contains the name of LoginType values.
@@ -48,6 +49,7 @@ var LoginNames = map[LoginType]string{
        LoginSMTP:   "SMTP",
        LoginPAM:    "PAM",
        LoginOAuth2: "OAuth2",
+       LoginSSPI:   "SPNEGO with SSPI",
 }
 
 // SecurityProtocolNames contains the name of SecurityProtocol values.
@@ -63,6 +65,7 @@ var (
        _ core.Conversion = &SMTPConfig{}
        _ core.Conversion = &PAMConfig{}
        _ core.Conversion = &OAuth2Config{}
+       _ core.Conversion = &SSPIConfig{}
 )
 
 // LDAPConfig holds configuration for LDAP login source.
@@ -140,6 +143,25 @@ func (cfg *OAuth2Config) ToDB() ([]byte, error) {
        return json.Marshal(cfg)
 }
 
+// SSPIConfig holds configuration for SSPI single sign-on.
+type SSPIConfig struct {
+       AutoCreateUsers      bool
+       AutoActivateUsers    bool
+       StripDomainNames     bool
+       SeparatorReplacement string
+       DefaultLanguage      string
+}
+
+// FromDB fills up an SSPIConfig from serialized format.
+func (cfg *SSPIConfig) FromDB(bs []byte) error {
+       return json.Unmarshal(bs, cfg)
+}
+
+// ToDB exports an SSPIConfig to a serialized format.
+func (cfg *SSPIConfig) ToDB() ([]byte, error) {
+       return json.Marshal(cfg)
+}
+
 // LoginSource represents an external way for authorizing users.
 type LoginSource struct {
        ID            int64 `xorm:"pk autoincr"`
@@ -176,6 +198,8 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
                        source.Cfg = new(PAMConfig)
                case LoginOAuth2:
                        source.Cfg = new(OAuth2Config)
+               case LoginSSPI:
+                       source.Cfg = new(SSPIConfig)
                default:
                        panic("unrecognized login source type: " + com.ToStr(*val))
                }
@@ -212,6 +236,11 @@ func (source *LoginSource) IsOAuth2() bool {
        return source.Type == LoginOAuth2
 }
 
+// IsSSPI returns true of this source is of the SSPI type.
+func (source *LoginSource) IsSSPI() bool {
+       return source.Type == LoginSSPI
+}
+
 // HasTLS returns true of this source supports TLS.
 func (source *LoginSource) HasTLS() bool {
        return ((source.IsLDAP() || source.IsDLDAP()) &&
@@ -264,6 +293,11 @@ func (source *LoginSource) OAuth2() *OAuth2Config {
        return source.Cfg.(*OAuth2Config)
 }
 
+// SSPI returns SSPIConfig for this source, if of SSPI type.
+func (source *LoginSource) SSPI() *SSPIConfig {
+       return source.Cfg.(*SSPIConfig)
+}
+
 // CreateLoginSource inserts a LoginSource in the DB if not already
 // existing with the given name.
 func CreateLoginSource(source *LoginSource) error {
@@ -300,6 +334,38 @@ func LoginSources() ([]*LoginSource, error) {
        return auths, x.Find(&auths)
 }
 
+// LoginSourcesByType returns all sources of the specified type
+func LoginSourcesByType(loginType LoginType) ([]*LoginSource, error) {
+       sources := make([]*LoginSource, 0, 1)
+       if err := x.Where("type = ?", loginType).Find(&sources); err != nil {
+               return nil, err
+       }
+       return sources, nil
+}
+
+// ActiveLoginSources returns all active sources of the specified type
+func ActiveLoginSources(loginType LoginType) ([]*LoginSource, error) {
+       sources := make([]*LoginSource, 0, 1)
+       if err := x.Where("is_actived = ? and type = ?", true, loginType).Find(&sources); err != nil {
+               return nil, err
+       }
+       return sources, nil
+}
+
+// IsSSPIEnabled returns true if there is at least one activated login
+// source of type LoginSSPI
+func IsSSPIEnabled() bool {
+       if !HasEngine {
+               return false
+       }
+       sources, err := ActiveLoginSources(LoginSSPI)
+       if err != nil {
+               log.Error("ActiveLoginSources: %v", err)
+               return false
+       }
+       return len(sources) > 0
+}
+
 // GetLoginSourceByID returns login source by given ID.
 func GetLoginSourceByID(id int64) (*LoginSource, error) {
        source := new(LoginSource)
@@ -719,8 +785,8 @@ func UserSignIn(username, password string) (*User, error) {
        }
 
        for _, source := range sources {
-               if source.IsOAuth2() {
-                       // don't try to authenticate against OAuth2 sources
+               if source.IsOAuth2() || source.IsSSPI() {
+                       // don't try to authenticate against OAuth2 and SSPI sources here
                        continue
                }
                authUser, err := ExternalUserLogin(nil, username, password, source, true)
index 1ba149f0f875c257a9548b1478443d0ac1bb6f9a..16ea9f15e3cde786bf3118d86265508a594fc2c3 100644 (file)
@@ -8,19 +8,14 @@ package auth
 import (
        "reflect"
        "strings"
-       "time"
 
        "code.gitea.io/gitea/models"
-       "code.gitea.io/gitea/modules/base"
-       "code.gitea.io/gitea/modules/log"
-       "code.gitea.io/gitea/modules/setting"
-       "code.gitea.io/gitea/modules/timeutil"
+       "code.gitea.io/gitea/modules/auth/sso"
        "code.gitea.io/gitea/modules/validation"
 
        "gitea.com/macaron/binding"
        "gitea.com/macaron/macaron"
        "gitea.com/macaron/session"
-       gouuid "github.com/satori/go.uuid"
        "github.com/unknwon/com"
 )
 
@@ -29,92 +24,6 @@ func IsAPIPath(url string) bool {
        return strings.HasPrefix(url, "/api/")
 }
 
-// IsAttachmentDownload check if request is a file download (GET) with URL to an attachment
-func IsAttachmentDownload(ctx *macaron.Context) bool {
-       return strings.HasPrefix(ctx.Req.URL.Path, "/attachments/") && ctx.Req.Method == "GET"
-}
-
-// SignedInID returns the id of signed in user.
-func SignedInID(ctx *macaron.Context, sess session.Store) int64 {
-       if !models.HasEngine {
-               return 0
-       }
-
-       // Check access token.
-       if IsAPIPath(ctx.Req.URL.Path) || IsAttachmentDownload(ctx) {
-               tokenSHA := ctx.Query("token")
-               if len(tokenSHA) == 0 {
-                       tokenSHA = ctx.Query("access_token")
-               }
-               if len(tokenSHA) == 0 {
-                       // Well, check with header again.
-                       auHead := ctx.Req.Header.Get("Authorization")
-                       if len(auHead) > 0 {
-                               auths := strings.Fields(auHead)
-                               if len(auths) == 2 && (auths[0] == "token" || strings.ToLower(auths[0]) == "bearer") {
-                                       tokenSHA = auths[1]
-                               }
-                       }
-               }
-
-               // Let's see if token is valid.
-               if len(tokenSHA) > 0 {
-                       if strings.Contains(tokenSHA, ".") {
-                               uid := CheckOAuthAccessToken(tokenSHA)
-                               if uid != 0 {
-                                       ctx.Data["IsApiToken"] = true
-                               }
-                               return uid
-                       }
-                       t, err := models.GetAccessTokenBySHA(tokenSHA)
-                       if err != nil {
-                               if models.IsErrAccessTokenNotExist(err) || models.IsErrAccessTokenEmpty(err) {
-                                       log.Error("GetAccessTokenBySHA: %v", err)
-                               }
-                               return 0
-                       }
-                       t.UpdatedUnix = timeutil.TimeStampNow()
-                       if err = models.UpdateAccessToken(t); err != nil {
-                               log.Error("UpdateAccessToken: %v", err)
-                       }
-                       ctx.Data["IsApiToken"] = true
-                       return t.UID
-               }
-       }
-
-       uid := sess.Get("uid")
-       if uid == nil {
-               return 0
-       } else if id, ok := uid.(int64); ok {
-               return id
-       }
-       return 0
-}
-
-// CheckOAuthAccessToken returns uid of user from oauth token token
-func CheckOAuthAccessToken(accessToken string) int64 {
-       // JWT tokens require a "."
-       if !strings.Contains(accessToken, ".") {
-               return 0
-       }
-       token, err := models.ParseOAuth2Token(accessToken)
-       if err != nil {
-               log.Trace("ParseOAuth2Token: %v", err)
-               return 0
-       }
-       var grant *models.OAuth2Grant
-       if grant, err = models.GetOAuth2GrantByID(token.GrantID); err != nil || grant == nil {
-               return 0
-       }
-       if token.Type != models.TypeAccessToken {
-               return 0
-       }
-       if token.ExpiresAt < time.Now().Unix() || token.IssuedAt > time.Now().Unix() {
-               return 0
-       }
-       return grant.UserID
-}
-
 // SignedInUser returns the user object of signed user.
 // It returns a bool value to indicate whether user uses basic auth or not.
 func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool) {
@@ -122,125 +31,18 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
                return nil, false
        }
 
-       if uid := SignedInID(ctx, sess); uid > 0 {
-               user, err := models.GetUserByID(uid)
-               if err == nil {
-                       return user, false
-               } else if !models.IsErrUserNotExist(err) {
-                       log.Error("GetUserById: %v", err)
+       // Try to sign in with each of the enabled plugins
+       for _, ssoMethod := range sso.Methods() {
+               if !ssoMethod.IsEnabled() {
+                       continue
                }
-       }
-
-       if setting.Service.EnableReverseProxyAuth {
-               webAuthUser := ctx.Req.Header.Get(setting.ReverseProxyAuthUser)
-               if len(webAuthUser) > 0 {
-                       u, err := models.GetUserByName(webAuthUser)
-                       if err != nil {
-                               if !models.IsErrUserNotExist(err) {
-                                       log.Error("GetUserByName: %v", err)
-                                       return nil, false
-                               }
-
-                               // Check if enabled auto-registration.
-                               if setting.Service.EnableReverseProxyAutoRegister {
-                                       email := gouuid.NewV4().String() + "@localhost"
-                                       if setting.Service.EnableReverseProxyEmail {
-                                               webAuthEmail := ctx.Req.Header.Get(setting.ReverseProxyAuthEmail)
-                                               if len(webAuthEmail) > 0 {
-                                                       email = webAuthEmail
-                                               }
-                                       }
-                                       u := &models.User{
-                                               Name:     webAuthUser,
-                                               Email:    email,
-                                               Passwd:   webAuthUser,
-                                               IsActive: true,
-                                       }
-                                       if err = models.CreateUser(u); err != nil {
-                                               // FIXME: should I create a system notice?
-                                               log.Error("CreateUser: %v", err)
-                                               return nil, false
-                                       }
-                                       return u, false
-                               }
-                       }
-                       return u, false
+               user := ssoMethod.VerifyAuthData(ctx, sess)
+               if user != nil {
+                       _, isBasic := ssoMethod.(*sso.Basic)
+                       return user, isBasic
                }
        }
 
-       // Check with basic auth.
-       baHead := ctx.Req.Header.Get("Authorization")
-       if len(baHead) > 0 {
-               auths := strings.Fields(baHead)
-               if len(auths) == 2 && auths[0] == "Basic" {
-                       var u *models.User
-
-                       uname, passwd, _ := base.BasicAuthDecode(auths[1])
-
-                       // Check if username or password is a token
-                       isUsernameToken := len(passwd) == 0 || passwd == "x-oauth-basic"
-                       // Assume username is token
-                       authToken := uname
-                       if !isUsernameToken {
-                               // Assume password is token
-                               authToken = passwd
-                       }
-
-                       uid := CheckOAuthAccessToken(authToken)
-                       if uid != 0 {
-                               var err error
-                               ctx.Data["IsApiToken"] = true
-
-                               u, err = models.GetUserByID(uid)
-                               if err != nil {
-                                       log.Error("GetUserByID:  %v", err)
-                                       return nil, false
-                               }
-                       }
-                       token, err := models.GetAccessTokenBySHA(authToken)
-                       if err == nil {
-                               if isUsernameToken {
-                                       u, err = models.GetUserByID(token.UID)
-                                       if err != nil {
-                                               log.Error("GetUserByID:  %v", err)
-                                               return nil, false
-                                       }
-                               } else {
-                                       u, err = models.GetUserByName(uname)
-                                       if err != nil {
-                                               log.Error("GetUserByID:  %v", err)
-                                               return nil, false
-                                       }
-                                       if u.ID != token.UID {
-                                               return nil, false
-                                       }
-                               }
-                               token.UpdatedUnix = timeutil.TimeStampNow()
-                               if err = models.UpdateAccessToken(token); err != nil {
-                                       log.Error("UpdateAccessToken:  %v", err)
-                               }
-                       } else if !models.IsErrAccessTokenNotExist(err) && !models.IsErrAccessTokenEmpty(err) {
-                               log.Error("GetAccessTokenBySha: %v", err)
-                       }
-
-                       if u == nil {
-                               if !setting.Service.EnableBasicAuth {
-                                       return nil, false
-                               }
-                               u, err = models.UserSignIn(uname, passwd)
-                               if err != nil {
-                                       if !models.IsErrUserNotExist(err) {
-                                               log.Error("UserSignIn: %v", err)
-                                       }
-                                       return nil, false
-                               }
-                       } else {
-                               ctx.Data["IsApiToken"] = true
-                       }
-
-                       return u, true
-               }
-       }
        return nil, false
 }
 
index 358472a3855b40e2071e60fc8f7be2425be08183..c838590c1fde6c7569482c22b52b11f1d5108964 100644 (file)
@@ -12,7 +12,7 @@ import (
 // AuthenticationForm form for authentication
 type AuthenticationForm struct {
        ID                            int64
-       Type                          int    `binding:"Range(2,6)"`
+       Type                          int    `binding:"Range(2,7)"`
        Name                          string `binding:"Required;MaxSize(30)"`
        Host                          string
        Port                          int
@@ -49,6 +49,11 @@ type AuthenticationForm struct {
        Oauth2AuthURL                 string
        Oauth2ProfileURL              string
        Oauth2EmailURL                string
+       SSPIAutoCreateUsers           bool
+       SSPIAutoActivateUsers         bool
+       SSPIStripDomainNames          bool
+       SSPISeparatorReplacement      string `binding:"AlphaDashDot;MaxSize(5)"`
+       SSPIDefaultLanguage           string
 }
 
 // Validate validates fields
diff --git a/modules/auth/sso/basic.go b/modules/auth/sso/basic.go
new file mode 100644 (file)
index 0000000..7f1841d
--- /dev/null
@@ -0,0 +1,125 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "strings"
+
+       "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/base"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/timeutil"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+)
+
+// Ensure the struct implements the interface.
+var (
+       _ SingleSignOn = &Basic{}
+)
+
+// Basic implements the SingleSignOn interface and authenticates requests (API requests
+// only) by looking for Basic authentication data or "x-oauth-basic" token in the "Authorization"
+// header.
+type Basic struct {
+}
+
+// Init does nothing as the Basic implementation does not need to allocate any resources
+func (b *Basic) Init() error {
+       return nil
+}
+
+// Free does nothing as the Basic implementation does not have to release any resources
+func (b *Basic) Free() error {
+       return nil
+}
+
+// IsEnabled returns true as this plugin is enabled by default and its not possible to disable
+// it from settings.
+func (b *Basic) IsEnabled() bool {
+       return setting.Service.EnableBasicAuth
+}
+
+// VerifyAuthData extracts and validates Basic data (username and password/token) from the
+// "Authorization" header of the request and returns the corresponding user object for that
+// name/token on successful validation.
+// Returns nil if header is empty or validation fails.
+func (b *Basic) VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User {
+       baHead := ctx.Req.Header.Get("Authorization")
+       if len(baHead) == 0 {
+               return nil
+       }
+
+       auths := strings.Fields(baHead)
+       if len(auths) != 2 || auths[0] != "Basic" {
+               return nil
+       }
+
+       var u *models.User
+       uname, passwd, _ := base.BasicAuthDecode(auths[1])
+
+       // Check if username or password is a token
+       isUsernameToken := len(passwd) == 0 || passwd == "x-oauth-basic"
+       // Assume username is token
+       authToken := uname
+       if !isUsernameToken {
+               // Assume password is token
+               authToken = passwd
+       }
+
+       uid := CheckOAuthAccessToken(authToken)
+       if uid != 0 {
+               var err error
+               ctx.Data["IsApiToken"] = true
+
+               u, err = models.GetUserByID(uid)
+               if err != nil {
+                       log.Error("GetUserByID:  %v", err)
+                       return nil
+               }
+       }
+       token, err := models.GetAccessTokenBySHA(authToken)
+       if err == nil {
+               if isUsernameToken {
+                       u, err = models.GetUserByID(token.UID)
+                       if err != nil {
+                               log.Error("GetUserByID:  %v", err)
+                               return nil
+                       }
+               } else {
+                       u, err = models.GetUserByName(uname)
+                       if err != nil {
+                               log.Error("GetUserByID:  %v", err)
+                               return nil
+                       }
+                       if u.ID != token.UID {
+                               return nil
+                       }
+               }
+               token.UpdatedUnix = timeutil.TimeStampNow()
+               if err = models.UpdateAccessToken(token); err != nil {
+                       log.Error("UpdateAccessToken:  %v", err)
+               }
+       } else if !models.IsErrAccessTokenNotExist(err) && !models.IsErrAccessTokenEmpty(err) {
+               log.Error("GetAccessTokenBySha: %v", err)
+       }
+
+       if u == nil {
+               u, err = models.UserSignIn(uname, passwd)
+               if err != nil {
+                       if !models.IsErrUserNotExist(err) {
+                               log.Error("UserSignIn: %v", err)
+                       }
+                       return nil
+               }
+       } else {
+               ctx.Data["IsApiToken"] = true
+       }
+
+       return u
+}
diff --git a/modules/auth/sso/interface.go b/modules/auth/sso/interface.go
new file mode 100644 (file)
index 0000000..89cc227
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "code.gitea.io/gitea/models"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+)
+
+// SingleSignOn represents a SSO authentication method (plugin) for HTTP requests.
+type SingleSignOn interface {
+       // Init should be called exactly once before using any of the other methods,
+       // in order to allow the plugin to allocate necessary resources
+       Init() error
+
+       // Free should be called exactly once before application closes, in order to
+       // give chance to the plugin to free any allocated resources
+       Free() error
+
+       // IsEnabled checks if the current SSO method has been enabled in settings.
+       IsEnabled() bool
+
+       // VerifyAuthData tries to verify the SSO authentication data contained in the request.
+       // If verification is successful returns either an existing user object (with id > 0)
+       // or a new user object (with id = 0) populated with the information that was found
+       // in the authentication data (username or email).
+       // Returns nil if verification fails.
+       VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User
+}
diff --git a/modules/auth/sso/oauth2.go b/modules/auth/sso/oauth2.go
new file mode 100644 (file)
index 0000000..e677490
--- /dev/null
@@ -0,0 +1,142 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "strings"
+       "time"
+
+       "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/timeutil"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+)
+
+// Ensure the struct implements the interface.
+var (
+       _ SingleSignOn = &OAuth2{}
+)
+
+// CheckOAuthAccessToken returns uid of user from oauth token
+func CheckOAuthAccessToken(accessToken string) int64 {
+       // JWT tokens require a "."
+       if !strings.Contains(accessToken, ".") {
+               return 0
+       }
+       token, err := models.ParseOAuth2Token(accessToken)
+       if err != nil {
+               log.Trace("ParseOAuth2Token: %v", err)
+               return 0
+       }
+       var grant *models.OAuth2Grant
+       if grant, err = models.GetOAuth2GrantByID(token.GrantID); err != nil || grant == nil {
+               return 0
+       }
+       if token.Type != models.TypeAccessToken {
+               return 0
+       }
+       if token.ExpiresAt < time.Now().Unix() || token.IssuedAt > time.Now().Unix() {
+               return 0
+       }
+       return grant.UserID
+}
+
+// OAuth2 implements the SingleSignOn interface and authenticates requests
+// (API requests only) by looking for an OAuth token in query parameters or the
+// "Authorization" header.
+type OAuth2 struct {
+}
+
+// Init does nothing as the OAuth2 implementation does not need to allocate any resources
+func (o *OAuth2) Init() error {
+       return nil
+}
+
+// Free does nothing as the OAuth2 implementation does not have to release any resources
+func (o *OAuth2) Free() error {
+       return nil
+}
+
+// userIDFromToken returns the user id corresponding to the OAuth token.
+func (o *OAuth2) userIDFromToken(ctx *macaron.Context) int64 {
+       // Check access token.
+       tokenSHA := ctx.Query("token")
+       if len(tokenSHA) == 0 {
+               tokenSHA = ctx.Query("access_token")
+       }
+       if len(tokenSHA) == 0 {
+               // Well, check with header again.
+               auHead := ctx.Req.Header.Get("Authorization")
+               if len(auHead) > 0 {
+                       auths := strings.Fields(auHead)
+                       if len(auths) == 2 && (auths[0] == "token" || strings.ToLower(auths[0]) == "bearer") {
+                               tokenSHA = auths[1]
+                       }
+               }
+       }
+       if len(tokenSHA) == 0 {
+               return 0
+       }
+
+       // Let's see if token is valid.
+       if strings.Contains(tokenSHA, ".") {
+               uid := CheckOAuthAccessToken(tokenSHA)
+               if uid != 0 {
+                       ctx.Data["IsApiToken"] = true
+               }
+               return uid
+       }
+       t, err := models.GetAccessTokenBySHA(tokenSHA)
+       if err != nil {
+               if models.IsErrAccessTokenNotExist(err) || models.IsErrAccessTokenEmpty(err) {
+                       log.Error("GetAccessTokenBySHA: %v", err)
+               }
+               return 0
+       }
+       t.UpdatedUnix = timeutil.TimeStampNow()
+       if err = models.UpdateAccessToken(t); err != nil {
+               log.Error("UpdateAccessToken: %v", err)
+       }
+       ctx.Data["IsApiToken"] = true
+       return t.UID
+}
+
+// IsEnabled returns true as this plugin is enabled by default and its not possible
+// to disable it from settings.
+func (o *OAuth2) IsEnabled() bool {
+       return true
+}
+
+// VerifyAuthData extracts the user ID from the OAuth token in the query parameters
+// or the "Authorization" header and returns the corresponding user object for that ID.
+// If verification is successful returns an existing user object.
+// Returns nil if verification fails.
+func (o *OAuth2) VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User {
+       if !models.HasEngine {
+               return nil
+       }
+
+       if !isAPIPath(ctx) && !isAttachmentDownload(ctx) {
+               return nil
+       }
+
+       id := o.userIDFromToken(ctx)
+       if id <= 0 {
+               return nil
+       }
+
+       user, err := models.GetUserByID(id)
+       if err != nil {
+               if !models.IsErrUserNotExist(err) {
+                       log.Error("GetUserByName: %v", err)
+               }
+               return nil
+       }
+
+       return user
+}
diff --git a/modules/auth/sso/reverseproxy.go b/modules/auth/sso/reverseproxy.go
new file mode 100644 (file)
index 0000000..feb5364
--- /dev/null
@@ -0,0 +1,115 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "strings"
+
+       "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+       gouuid "github.com/satori/go.uuid"
+)
+
+// Ensure the struct implements the interface.
+var (
+       _ SingleSignOn = &ReverseProxy{}
+)
+
+// ReverseProxy implements the SingleSignOn interface, but actually relies on
+// a reverse proxy for authentication of users.
+// On successful authentication the proxy is expected to populate the username in the
+// "setting.ReverseProxyAuthUser" header. Optionally it can also populate the email of the
+// user in the "setting.ReverseProxyAuthEmail" header.
+type ReverseProxy struct {
+}
+
+// getUserName extracts the username from the "setting.ReverseProxyAuthUser" header
+func (r *ReverseProxy) getUserName(ctx *macaron.Context) string {
+       webAuthUser := strings.TrimSpace(ctx.Req.Header.Get(setting.ReverseProxyAuthUser))
+       if len(webAuthUser) == 0 {
+               return ""
+       }
+       return webAuthUser
+}
+
+// Init does nothing as the ReverseProxy implementation does not need initialization
+func (r *ReverseProxy) Init() error {
+       return nil
+}
+
+// Free does nothing as the ReverseProxy implementation does not have to release resources
+func (r *ReverseProxy) Free() error {
+       return nil
+}
+
+// IsEnabled checks if EnableReverseProxyAuth setting is true
+func (r *ReverseProxy) IsEnabled() bool {
+       return setting.Service.EnableReverseProxyAuth
+}
+
+// VerifyAuthData extracts the username from the "setting.ReverseProxyAuthUser" header
+// of the request and returns the corresponding user object for that name.
+// Verification of header data is not performed as it should have already been done by
+// the revese proxy.
+// If a username is available in the "setting.ReverseProxyAuthUser" header an existing
+// user object is returned (populated with username or email found in header).
+// Returns nil if header is empty.
+func (r *ReverseProxy) VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User {
+       username := r.getUserName(ctx)
+       if len(username) == 0 {
+               return nil
+       }
+
+       user, err := models.GetUserByName(username)
+       if err != nil {
+               if models.IsErrUserNotExist(err) && r.isAutoRegisterAllowed() {
+                       return r.newUser(ctx)
+               }
+               log.Error("GetUserByName: %v", err)
+               return nil
+       }
+
+       return user
+}
+
+// isAutoRegisterAllowed checks if EnableReverseProxyAutoRegister setting is true
+func (r *ReverseProxy) isAutoRegisterAllowed() bool {
+       return setting.Service.EnableReverseProxyAutoRegister
+}
+
+// newUser creates a new user object for the purpose of automatic registration
+// and populates its name and email with the information present in request headers.
+func (r *ReverseProxy) newUser(ctx *macaron.Context) *models.User {
+       username := r.getUserName(ctx)
+       if len(username) == 0 {
+               return nil
+       }
+
+       email := gouuid.NewV4().String() + "@localhost"
+       if setting.Service.EnableReverseProxyEmail {
+               webAuthEmail := ctx.Req.Header.Get(setting.ReverseProxyAuthEmail)
+               if len(webAuthEmail) > 0 {
+                       email = webAuthEmail
+               }
+       }
+
+       user := &models.User{
+               Name:     username,
+               Email:    email,
+               Passwd:   username,
+               IsActive: true,
+       }
+       if err := models.CreateUser(user); err != nil {
+               // FIXME: should I create a system notice?
+               log.Error("CreateUser: %v", err)
+               return nil
+       }
+       return user
+}
diff --git a/modules/auth/sso/session.go b/modules/auth/sso/session.go
new file mode 100644 (file)
index 0000000..c9176b9
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "code.gitea.io/gitea/models"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+)
+
+// Ensure the struct implements the interface.
+var (
+       _ SingleSignOn = &Session{}
+)
+
+// Session checks if there is a user uid stored in the session and returns the user
+// object for that uid.
+type Session struct {
+}
+
+// Init does nothing as the Session implementation does not need to allocate any resources
+func (s *Session) Init() error {
+       return nil
+}
+
+// Free does nothing as the Session implementation does not have to release any resources
+func (s *Session) Free() error {
+       return nil
+}
+
+// IsEnabled returns true as this plugin is enabled by default and its not possible to disable
+// it from settings.
+func (s *Session) IsEnabled() bool {
+       return true
+}
+
+// VerifyAuthData checks if there is a user uid stored in the session and returns the user
+// object for that uid.
+// Returns nil if there is no user uid stored in the session.
+func (s *Session) VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User {
+       user := SessionUser(sess)
+       if user != nil {
+               return user
+       }
+       return nil
+}
diff --git a/modules/auth/sso/sso.go b/modules/auth/sso/sso.go
new file mode 100644 (file)
index 0000000..cf8148d
--- /dev/null
@@ -0,0 +1,141 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "fmt"
+       "reflect"
+       "strings"
+
+       "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+)
+
+// ssoMethods contains the list of SSO authentication plugins in the order they are expected to be
+// executed.
+//
+// The OAuth2 plugin is expected to be executed first, as it must ignore the user id stored
+// in the session (if there is a user id stored in session other plugins might return the user
+// object for that id).
+//
+// The Session plugin is expected to be executed second, in order to skip authentication
+// for users that have already signed in.
+var ssoMethods = []SingleSignOn{
+       &OAuth2{},
+       &Session{},
+       &ReverseProxy{},
+       &Basic{},
+}
+
+// The purpose of the following three function variables is to let the linter know that
+// those functions are not dead code and are actually being used
+var (
+       _ = handleSignIn
+)
+
+// Methods returns the instances of all registered SSO methods
+func Methods() []SingleSignOn {
+       return ssoMethods
+}
+
+// Register adds the specified instance to the list of available SSO methods
+func Register(method SingleSignOn) {
+       ssoMethods = append(ssoMethods, method)
+}
+
+// Init should be called exactly once when the application starts to allow SSO plugins
+// to allocate necessary resources
+func Init() {
+       for _, method := range Methods() {
+               err := method.Init()
+               if err != nil {
+                       log.Error("Could not initialize '%s' SSO method, error: %s", reflect.TypeOf(method).String(), err)
+               }
+       }
+}
+
+// Free should be called exactly once when the application is terminating to allow SSO plugins
+// to release necessary resources
+func Free() {
+       for _, method := range Methods() {
+               err := method.Free()
+               if err != nil {
+                       log.Error("Could not free '%s' SSO method, error: %s", reflect.TypeOf(method).String(), err)
+               }
+       }
+}
+
+// SessionUser returns the user object corresponding to the "uid" session variable.
+func SessionUser(sess session.Store) *models.User {
+       // Get user ID
+       uid := sess.Get("uid")
+       if uid == nil {
+               return nil
+       }
+       id, ok := uid.(int64)
+       if !ok {
+               return nil
+       }
+
+       // Get user object
+       user, err := models.GetUserByID(id)
+       if err != nil {
+               if !models.IsErrUserNotExist(err) {
+                       log.Error("GetUserById: %v", err)
+               }
+               return nil
+       }
+       return user
+}
+
+// isAPIPath returns true if the specified URL is an API path
+func isAPIPath(ctx *macaron.Context) bool {
+       return strings.HasPrefix(ctx.Req.URL.Path, "/api/")
+}
+
+// isAttachmentDownload check if request is a file download (GET) with URL to an attachment
+func isAttachmentDownload(ctx *macaron.Context) bool {
+       return strings.HasPrefix(ctx.Req.URL.Path, "/attachments/") && ctx.Req.Method == "GET"
+}
+
+// handleSignIn clears existing session variables and stores new ones for the specified user object
+func handleSignIn(ctx *macaron.Context, sess session.Store, user *models.User) {
+       _ = sess.Delete("openid_verified_uri")
+       _ = sess.Delete("openid_signin_remember")
+       _ = sess.Delete("openid_determined_email")
+       _ = sess.Delete("openid_determined_username")
+       _ = sess.Delete("twofaUid")
+       _ = sess.Delete("twofaRemember")
+       _ = sess.Delete("u2fChallenge")
+       _ = sess.Delete("linkAccount")
+       err := sess.Set("uid", user.ID)
+       if err != nil {
+               log.Error(fmt.Sprintf("Error setting session: %v", err))
+       }
+       err = sess.Set("uname", user.Name)
+       if err != nil {
+               log.Error(fmt.Sprintf("Error setting session: %v", err))
+       }
+
+       // Language setting of the user overwrites the one previously set
+       // If the user does not have a locale set, we save the current one.
+       if len(user.Language) == 0 {
+               user.Language = ctx.Locale.Language()
+               if err := models.UpdateUserCols(user, "language"); err != nil {
+                       log.Error(fmt.Sprintf("Error updating user language [user: %d, locale: %s]", user.ID, user.Language))
+                       return
+               }
+       }
+
+       ctx.SetCookie("lang", user.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+
+       // Clear whatever CSRF has right now, force to generate a new one
+       ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+}
diff --git a/modules/auth/sso/sspi_windows.go b/modules/auth/sso/sspi_windows.go
new file mode 100644 (file)
index 0000000..3153fc6
--- /dev/null
@@ -0,0 +1,237 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sso
+
+import (
+       "errors"
+       "reflect"
+       "strings"
+
+       "code.gitea.io/gitea/models"
+       "code.gitea.io/gitea/modules/base"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/setting"
+
+       "gitea.com/macaron/macaron"
+       "gitea.com/macaron/session"
+
+       "github.com/quasoft/websspi"
+       gouuid "github.com/satori/go.uuid"
+)
+
+const (
+       tplSignIn base.TplName = "user/auth/signin"
+)
+
+var (
+       // sspiAuth is a global instance of the websspi authentication package,
+       // which is used to avoid acquiring the server credential handle on
+       // every request
+       sspiAuth *websspi.Authenticator
+
+       // Ensure the struct implements the interface.
+       _ SingleSignOn = &SSPI{}
+)
+
+// SSPI implements the SingleSignOn interface and authenticates requests
+// via the built-in SSPI module in Windows for SPNEGO authentication.
+// On successful authentication returns a valid user object.
+// Returns nil if authentication fails.
+type SSPI struct {
+}
+
+// Init creates a new global websspi.Authenticator object
+func (s *SSPI) Init() error {
+       config := websspi.NewConfig()
+       var err error
+       sspiAuth, err = websspi.New(config)
+       return err
+}
+
+// Free releases resources used by the global websspi.Authenticator object
+func (s *SSPI) Free() error {
+       return sspiAuth.Free()
+}
+
+// IsEnabled checks if there is an active SSPI authentication source
+func (s *SSPI) IsEnabled() bool {
+       return models.IsSSPIEnabled()
+}
+
+// VerifyAuthData uses SSPI (Windows implementation of SPNEGO) to authenticate the request.
+// If authentication is successful, returs the corresponding user object.
+// If negotiation should continue or authentication fails, immediately returns a 401 HTTP
+// response code, as required by the SPNEGO protocol.
+func (s *SSPI) VerifyAuthData(ctx *macaron.Context, sess session.Store) *models.User {
+       if !s.shouldAuthenticate(ctx) {
+               return nil
+       }
+
+       cfg, err := s.getConfig()
+       if err != nil {
+               log.Error("could not get SSPI config: %v", err)
+               return nil
+       }
+
+       userInfo, outToken, err := sspiAuth.Authenticate(ctx.Req.Request, ctx.Resp)
+       if err != nil {
+               log.Warn("Authentication failed with error: %v\n", err)
+               sspiAuth.AppendAuthenticateHeader(ctx.Resp, outToken)
+
+               // Include the user login page in the 401 response to allow the user
+               // to login with another authentication method if SSPI authentication
+               // fails
+               addFlashErr(ctx, ctx.Tr("auth.sspi_auth_failed"))
+               ctx.Data["EnableOpenIDSignIn"] = setting.Service.EnableOpenIDSignIn
+               ctx.Data["EnableSSPI"] = true
+               ctx.HTML(401, string(tplSignIn))
+               return nil
+       }
+       if outToken != "" {
+               sspiAuth.AppendAuthenticateHeader(ctx.Resp, outToken)
+       }
+
+       username := sanitizeUsername(userInfo.Username, cfg)
+       if len(username) == 0 {
+               return nil
+       }
+       log.Info("Authenticated as %s\n", username)
+
+       user, err := models.GetUserByName(username)
+       if err != nil {
+               if !models.IsErrUserNotExist(err) {
+                       log.Error("GetUserByName: %v", err)
+                       return nil
+               }
+               if !cfg.AutoCreateUsers {
+                       log.Error("User '%s' not found", username)
+                       return nil
+               }
+               user, err = s.newUser(ctx, username, cfg)
+               if err != nil {
+                       log.Error("CreateUser: %v", err)
+                       return nil
+               }
+       }
+
+       // Make sure requests to API paths and PWA resources do not create a new session
+       if !isAPIPath(ctx) && !isAttachmentDownload(ctx) {
+               handleSignIn(ctx, sess, user)
+       }
+
+       return user
+}
+
+// getConfig retrieves the SSPI configuration from login sources
+func (s *SSPI) getConfig() (*models.SSPIConfig, error) {
+       sources, err := models.ActiveLoginSources(models.LoginSSPI)
+       if err != nil {
+               return nil, err
+       }
+       if len(sources) == 0 {
+               return nil, errors.New("no active login sources of type SSPI found")
+       }
+       if len(sources) > 1 {
+               return nil, errors.New("more than one active login source of type SSPI found")
+       }
+       return sources[0].SSPI(), nil
+}
+
+func (s *SSPI) shouldAuthenticate(ctx *macaron.Context) (shouldAuth bool) {
+       shouldAuth = false
+       path := strings.TrimSuffix(ctx.Req.URL.Path, "/")
+       if path == "/user/login" {
+               if ctx.Req.FormValue("user_name") != "" && ctx.Req.FormValue("password") != "" {
+                       shouldAuth = false
+               } else if ctx.Req.FormValue("auth_with_sspi") == "1" {
+                       shouldAuth = true
+               }
+       } else if isAPIPath(ctx) || isAttachmentDownload(ctx) {
+               shouldAuth = true
+       }
+       return
+}
+
+// newUser creates a new user object for the purpose of automatic registration
+// and populates its name and email with the information present in request headers.
+func (s *SSPI) newUser(ctx *macaron.Context, username string, cfg *models.SSPIConfig) (*models.User, error) {
+       email := gouuid.NewV4().String() + "@localhost.localdomain"
+       user := &models.User{
+               Name:                         username,
+               Email:                        email,
+               KeepEmailPrivate:             true,
+               Passwd:                       gouuid.NewV4().String(),
+               IsActive:                     cfg.AutoActivateUsers,
+               Language:                     cfg.DefaultLanguage,
+               UseCustomAvatar:              true,
+               Avatar:                       base.DefaultAvatarLink(),
+               EmailNotificationsPreference: models.EmailNotificationsDisabled,
+       }
+       if err := models.CreateUser(user); err != nil {
+               return nil, err
+       }
+       return user, nil
+}
+
+// stripDomainNames removes NETBIOS domain name and separator from down-level logon names
+// (eg. "DOMAIN\user" becomes "user"), and removes the UPN suffix (domain name) and separator
+// from UPNs (eg. "user@domain.local" becomes "user")
+func stripDomainNames(username string) string {
+       if strings.Contains(username, "\\") {
+               parts := strings.SplitN(username, "\\", 2)
+               if len(parts) > 1 {
+                       username = parts[1]
+               }
+       } else if strings.Contains(username, "@") {
+               parts := strings.Split(username, "@")
+               if len(parts) > 1 {
+                       username = parts[0]
+               }
+       }
+       return username
+}
+
+func replaceSeparators(username string, cfg *models.SSPIConfig) string {
+       newSep := cfg.SeparatorReplacement
+       username = strings.ReplaceAll(username, "\\", newSep)
+       username = strings.ReplaceAll(username, "/", newSep)
+       username = strings.ReplaceAll(username, "@", newSep)
+       return username
+}
+
+func sanitizeUsername(username string, cfg *models.SSPIConfig) string {
+       if len(username) == 0 {
+               return ""
+       }
+       if cfg.StripDomainNames {
+               username = stripDomainNames(username)
+       }
+       // Replace separators even if we have already stripped the domain name part,
+       // as the username can contain several separators: eg. "MICROSOFT\useremail@live.com"
+       username = replaceSeparators(username, cfg)
+       return username
+}
+
+// addFlashErr adds an error message to the Flash object mapped to a macaron.Context
+func addFlashErr(ctx *macaron.Context, err string) {
+       fv := ctx.GetVal(reflect.TypeOf(&session.Flash{}))
+       if !fv.IsValid() {
+               return
+       }
+       flash, ok := fv.Interface().(*session.Flash)
+       if !ok {
+               return
+       }
+       flash.Error(err)
+       ctx.Data["Flash"] = flash
+}
+
+// init registers the SSPI auth method as the last method in the list.
+// The SSPI plugin is expected to be executed last, as it returns 401 status code if negotiation
+// fails (or if negotiation should continue), which would prevent other authentication methods
+// to execute at all.
+func init() {
+       Register(&SSPI{})
+}
index b38e909e48881847f5a3078f45919b414f268874..60d0cfcd7ee4aed64972cf62b18da66491330820 100644 (file)
@@ -270,6 +270,7 @@ authorize_title = Authorize "%s" to access your account?
 authorization_failed = Authorization failed
 authorization_failed_desc = The authorization failed because we detected an invalid request. Please contact the maintainer of the app you've tried to authorize.
 disable_forgot_password_mail = Account recovery is disabled. Please contact your site administrator.
+sspi_auth_failed = SSPI authentication failed
 
 [mail]
 activate_account = Please activate your account
@@ -303,6 +304,9 @@ CommitChoice = Commit choice
 TreeName = File path
 Content = Content
 
+SSPISeparatorReplacement = Separator
+SSPIDefaultLanguage = Default Language
+
 require_error = ` cannot be empty.`
 alpha_dash_error = ` should contain only alphanumeric, dash ('-') and underscore ('_') characters.`
 alpha_dash_dot_error = ` should contain only alphanumeric, dash ('-'), underscore ('_') and dot ('.') characters.`
@@ -317,6 +321,7 @@ glob_pattern_error = ` glob pattern is invalid: %s.`
 unknown_error = Unknown error:
 captcha_incorrect = The CAPTCHA code is incorrect.
 password_not_match = The passwords do not match.
+lang_select_error = Select a language from the list.
 
 username_been_taken = The username is already taken.
 repo_name_been_taken = The repository name is already used.
@@ -1809,6 +1814,16 @@ auths.oauth2_authURL = Authorize URL
 auths.oauth2_profileURL = Profile URL
 auths.oauth2_emailURL = Email URL
 auths.enable_auto_register = Enable Auto Registration
+auths.sspi_auto_create_users = Automatically create users
+auths.sspi_auto_create_users_helper = Allow SSPI auth method to automatically create new accounts for users that login for the first time
+auths.sspi_auto_activate_users = Automatically activate users
+auths.sspi_auto_activate_users_helper = Allow SSPI auth method to automatically activate new users
+auths.sspi_strip_domain_names = Remove domain names from usernames
+auths.sspi_strip_domain_names_helper = If checked, domain names will be removed from logon names (eg. "DOMAIN\user" and "user@example.org" both will become just "user").
+auths.sspi_separator_replacement = Separator to use instead of \, / and @
+auths.sspi_separator_replacement_helper = The character to use to replace the separators of down-level logon names (eg. the \ in "DOMAIN\user") and user principal names (eg. the @ in "user@example.org").
+auths.sspi_default_language = Default user language
+auths.sspi_default_language_helper = Default language for users automatically created by SSPI auth method. Leave empty if you prefer language to be automatically detected.
 auths.tips = Tips
 auths.tips.oauth2.general = OAuth2 Authentication
 auths.tips.oauth2.general.tip = When registering a new OAuth2 authentication, the callback/redirect URL should be: <host>/user/oauth2/<Authentication Name>/callback
@@ -1834,6 +1849,7 @@ auths.delete_auth_desc = Deleting an authentication source prevents users from u
 auths.still_in_used = The authentication source is still in use. Convert or delete any users using this authentication source first.
 auths.deletion_success = The authentication source has been deleted.
 auths.login_source_exist = The authentication source '%s' already exists.
+auths.login_source_of_type_exist = An authentication source of this type already exists.
 
 config.server_config = Server Configuration
 config.app_name = Site Title
index ae0723c87d3f5b0ed242200ba898a5434acf79ca..9ddedff2416f478e867b75ba7aa6d21dd042ecf6 100644 (file)
@@ -1,2 +1,2 @@
-!function(e){function t(t){for(var n,a,o=t[0],r=t[1],s=0,l=[];s<o.length;s++)a=o[s],Object.prototype.hasOwnProperty.call(i,a)&&i[a]&&l.push(i[a][0]),i[a]=0;for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);for(c&&c(t);l.length;)l.shift()()}var n={},i={1:0};function a(t){if(n[t])return n[t].exports;var i=n[t]={i:t,l:!1,exports:{}};return e[t].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.e=function(e){var t=[],n=i[e];if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((function(t,a){n=i[e]=[t,a]}));t.push(n[2]=o);var r,s=document.createElement("script");s.charset="utf-8",s.timeout=120,a.nc&&s.setAttribute("nonce",a.nc),s.src=function(e){return a.p+""+({0:"gitgraph"}[e]||e)+".js"}(e);var c=new Error;r=function(t){s.onerror=s.onload=null,clearTimeout(l);var n=i[e];if(0!==n){if(n){var a=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;c.message="Loading chunk "+e+" failed.\n("+a+": "+o+")",c.name="ChunkLoadError",c.type=a,c.request=o,n[1](c)}i[e]=void 0}};var l=setTimeout((function(){r({type:"timeout",target:s})}),12e4);s.onerror=s.onload=r,document.head.appendChild(s)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a.oe=function(e){throw console.error(e),e};var o=window.webpackJsonp=window.webpackJsonp||[],r=o.push.bind(o);o.push=t,o=o.slice();for(var s=0;s<o.length;s++)t(o[s]);var c=r;a(a.s=2)}([function(e,t,n){e.exports=n(4)},function(e,t,n){var i=n(5),a=n(6),o=n(7);e.exports=function(e,t){return i(e)||a(e,t)||o()}},function(e,t,n){e.exports=n(9)},function(e,t,n){if(document.currentScript&&document.currentScript.src){var i=new URL(document.currentScript.src);n.p="".concat(i.pathname.replace(/\/[^/]*$/,""),"/")}else{var a=document.querySelector('script[src*="/index.js"]');n.p="".concat(a.getAttribute("src").replace(/\/[^/]*$/,""),"/")}},function(e,t,n){var i=function(e){"use strict";var t,n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",r=a.asyncIterator||"@@asyncIterator",s=a.toStringTag||"@@toStringTag";function c(e,t,n,i){var a=t&&t.prototype instanceof v?t:v,o=Object.create(a.prototype),r=new T(i||[]);return o._invoke=function(e,t,n){var i=d;return function(a,o){if(i===h)throw new Error("Generator is already running");if(i===f){if("throw"===a)throw o;return L()}for(n.method=a,n.arg=o;;){var r=n.delegate;if(r){var s=k(r,n);if(s){if(s===m)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===d)throw i=f,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var c=l(e,t,n);if("normal"===c.type){if(i=n.done?f:u,c.arg===m)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(i=f,n.method="throw",n.arg=c.arg)}}}(e,n,r),o}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var d="suspendedStart",u="suspendedYield",h="executing",f="completed",m={};function v(){}function p(){}function g(){}var b={};b[o]=function(){return this};var $=Object.getPrototypeOf,w=$&&$($(A([])));w&&w!==n&&i.call(w,o)&&(b=w);var y=g.prototype=v.prototype=Object.create(b);function x(e){["next","throw","return"].forEach((function(t){e[t]=function(e){return this._invoke(t,e)}}))}function C(e){var t;this._invoke=function(n,a){function o(){return new Promise((function(t,o){!function t(n,a,o,r){var s=l(e[n],e,a);if("throw"!==s.type){var c=s.arg,d=c.value;return d&&"object"==typeof d&&i.call(d,"__await")?Promise.resolve(d.__await).then((function(e){t("next",e,o,r)}),(function(e){t("throw",e,o,r)})):Promise.resolve(d).then((function(e){c.value=e,o(c)}),(function(e){return t("throw",e,o,r)}))}r(s.arg)}(n,a,t,o)}))}return t=t?t.then(o,o):o()}}function k(e,n){var i=e.iterator[n.method];if(i===t){if(n.delegate=null,"throw"===n.method){if(e.iterator.return&&(n.method="return",n.arg=t,k(e,n),"throw"===n.method))return m;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return m}var a=l(i,e.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,m;var o=a.arg;return o?o.done?(n[e.resultName]=o.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,m):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,m)}function S(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function T(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(S,this),this.reset(!0)}function A(e){if(e){var n=e[o];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var a=-1,r=function n(){for(;++a<e.length;)if(i.call(e,a))return n.value=e[a],n.done=!1,n;return n.value=t,n.done=!0,n};return r.next=r}}return{next:L}}function L(){return{value:t,done:!0}}return p.prototype=y.constructor=g,g.constructor=p,g[s]=p.displayName="GeneratorFunction",e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,g):(e.__proto__=g,s in e||(e[s]="GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},x(C.prototype),C.prototype[r]=function(){return this},e.AsyncIterator=C,e.async=function(t,n,i,a){var o=new C(c(t,n,i,a));return e.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},x(y),y[s]="Generator",y[o]=function(){return this},y.toString=function(){return"[object Generator]"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},e.values=A,T.prototype={constructor:T,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(_),!e)for(var n in this)"t"===n.charAt(0)&&i.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function a(i,a){return s.type="throw",s.arg=e,n.next=i,a&&(n.method="next",n.arg=t),!!a}for(var o=this.tryEntries.length-1;o>=0;--o){var r=this.tryEntries[o],s=r.completion;if("root"===r.tryLoc)return a("end");if(r.tryLoc<=this.prev){var c=i.call(r,"catchLoc"),l=i.call(r,"finallyLoc");if(c&&l){if(this.prev<r.catchLoc)return a(r.catchLoc,!0);if(this.prev<r.finallyLoc)return a(r.finallyLoc)}else if(c){if(this.prev<r.catchLoc)return a(r.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<r.finallyLoc)return a(r.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&i.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var o=a;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var r=o?o.completion:{};return r.type=e,r.arg=t,o?(this.method="next",this.next=o.finallyLoc,m):this.complete(r)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var a=i.arg;_(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,i){return this.delegate={iterator:A(e),resultName:n,nextLoc:i},"next"===this.method&&(this.arg=t),m}},e}(e.exports);try{regeneratorRuntime=i}catch(e){Function("r","regeneratorRuntime = r")(i)}},function(e,t){e.exports=function(e){if(Array.isArray(e))return e}},function(e,t){e.exports=function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var n=[],i=!0,a=!1,o=void 0;try{for(var r,s=e[Symbol.iterator]();!(i=(r=s.next()).done)&&(n.push(r.value),!t||n.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==s.return||s.return()}finally{if(a)throw o}}return n}}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}},function(e,t){!function(e,t,n,i){"use strict";t=void 0!==t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.dropdown=function(i){var a,o=e(this),r=e(n),s=o.selector||"",c="ontouchstart"in n.documentElement,l=(new Date).getTime(),d=[],u=arguments[0],h="string"==typeof u,f=[].slice.call(arguments,1),m=1;return o.each((function(v){var p,g,b,$,w,y,x,C,k=e.isPlainObject(i)?e.extend(!0,{},e.fn.dropdown.settings,i):e.extend({},e.fn.dropdown.settings),S=k.className,_=k.message,T=k.fields,A=k.keys,L=k.metadata,q=k.namespace,D=k.regExp,O=k.selector,I=k.error,R=k.templates,E="."+q,F="module-"+q,j=e(this),M=e(k.context),N=j.find(O.text),z=j.find(O.search),P=j.find(O.sizer),V=j.find(O.input),B=j.find(O.icon),H=j.prev().find(O.text).length>0?j.prev().find(O.text):j.prev(),U=j.children(O.menu),K=U.find(O.item),W=!1,J=!1,Q=!1,X=this,G=j.data(F);C={initialize:function(){C.debug("Initializing dropdown",k),C.is.alreadySetup()?C.setup.reference():(C.setup.layout(),k.values&&C.change.values(k.values),C.refreshData(),C.save.defaults(),C.restore.selected(),C.create.id(),C.bind.events(),C.observeChanges(),C.instantiate(),C.aria.setup())},instantiate:function(){C.verbose("Storing instance of dropdown",C),G=C,j.data(F,C)},destroy:function(){C.verbose("Destroying previous dropdown",j),C.remove.tabbable(),j.off(E).removeData(F),U.off(E),r.off($),C.disconnect.menuObserver(),C.disconnect.selectObserver()},observeChanges:function(){"MutationObserver"in t&&(y=new MutationObserver(C.event.select.mutation),x=new MutationObserver(C.event.menu.mutation),C.debug("Setting up mutation observer",y,x),C.observe.select(),C.observe.menu())},disconnect:{menuObserver:function(){x&&x.disconnect()},selectObserver:function(){y&&y.disconnect()}},observe:{select:function(){C.has.input()&&y.observe(j[0],{childList:!0,subtree:!0})},menu:function(){C.has.menu()&&x.observe(U[0],{childList:!0,subtree:!0})}},create:{id:function(){w=(Math.random().toString(16)+"000000000").substr(2,8),$="."+w,C.verbose("Creating unique id for element",w)},userChoice:function(t){var n,i,a;return!!(t=t||C.get.userValues())&&(t=e.isArray(t)?t:[t],e.each(t,(function(t,o){!1===C.get.item(o)&&(a=k.templates.addition(C.add.variables(_.addResult,o)),i=e("<div />").html(a).attr("data-"+L.value,o).attr("data-"+L.text,o).addClass(S.addition).addClass(S.item),k.hideAdditions&&i.addClass(S.hidden),n=void 0===n?i:n.add(i),C.verbose("Creating user choices for value",o,i))})),n)},userLabels:function(t){var n=C.get.userValues();n&&(C.debug("Adding user labels",n),e.each(n,(function(e,t){C.verbose("Adding custom user value"),C.add.label(t,t)})))},menu:function(){U=e("<div />").addClass(S.menu).appendTo(j)},sizer:function(){P=e("<span />").addClass(S.sizer).insertAfter(z)}},search:function(e){e=void 0!==e?e:C.get.query(),C.verbose("Searching for query",e),C.has.minCharacters(e)?C.filter(e):C.hide()},select:{firstUnfiltered:function(){C.verbose("Selecting first non-filtered element"),C.remove.selectedItem(),K.not(O.unselectable).not(O.addition+O.hidden).eq(0).addClass(S.selected)},nextAvailable:function(e){var t=(e=e.eq(0)).nextAll(O.item).not(O.unselectable).eq(0),n=e.prevAll(O.item).not(O.unselectable).eq(0);t.length>0?(C.verbose("Moving selection to",t),t.addClass(S.selected)):(C.verbose("Moving selection to",n),n.addClass(S.selected))}},aria:{setup:function(){"menu"===C.aria.guessRole()&&(j.attr("aria-busy","true"),j.attr("role","menu"),j.attr("aria-haspopup","menu"),j.attr("aria-expanded","false"),U.find(".divider").attr("role","separator"),K.attr("role","menuitem"),K.each((function(e,t){t.id||(t.id=C.aria.nextID("menuitem"))})),N=j.find("> .text").eq(0),j.data("content")?(N.attr("aria-hidden"),j.attr("aria-label",j.data("content"))):(N.attr("id",C.aria.nextID("menutext")),j.attr("aria-labelledby",N.attr("id"))),j.attr("aria-busy","false"))},nextID:function(e){var t;do{t=e+"_"+m++}while(n.getElementById(t));return t},setExpanded:function(e){j.attr("aria-haspopup")&&j.attr("aria-expanded",e)},refreshDescendant:function(){if("menu"===j.attr("aria-haspopup")){var e=K.not(O.unselectable).filter("."+S.selected).eq(0),t=U.children("."+S.active).eq(0),n=e.length>0?e:t;n?j.attr("aria-activedescendant",n.attr("id")):C.aria.removeDescendant()}},removeDescendant:function(){"menu"==j.attr("aria-haspopup")&&j.removeAttr("aria-activedescendant")},guessRole:function(){var e=j.hasClass("icon"),t=C.has.search(),n=V.length>0,i=C.is.multiple();return e||t||n||i?"unknown":"menu"}},setup:{api:function(){var e={debug:k.debug,urlData:{value:C.get.value(),query:C.get.query()},on:!1};C.verbose("First request, initializing API"),j.api(e)},layout:function(){j.is("select")&&(C.setup.select(),C.setup.returnedObject()),C.has.menu()||C.create.menu(),C.is.search()&&!C.has.search()&&(C.verbose("Adding search input"),z=e("<input />").addClass(S.search).prop("autocomplete","off").insertBefore(N)),C.is.multiple()&&C.is.searchSelection()&&!C.has.sizer()&&C.create.sizer(),k.allowTab&&C.set.tabbable(),K.attr("tabindex","-1")},select:function(){var t=C.get.selectValues();C.debug("Dropdown initialized on a select",t),j.is("select")&&(V=j),V.parent(O.dropdown).length>0?(C.debug("UI dropdown already exists. Creating dropdown menu only"),j=V.closest(O.dropdown),C.has.menu()||C.create.menu(),U=j.children(O.menu),C.setup.menu(t)):(C.debug("Creating entire dropdown from select"),j=e("<div />").attr("class",V.attr("class")).addClass(S.selection).addClass(S.dropdown).html(R.dropdown(t)).insertBefore(V),V.hasClass(S.multiple)&&!1===V.prop("multiple")&&(C.error(I.missingMultiple),V.prop("multiple",!0)),V.is("[multiple]")&&C.set.multiple(),V.prop("disabled")&&(C.debug("Disabling dropdown"),j.addClass(S.disabled)),V.removeAttr("class").detach().prependTo(j)),C.refresh()},menu:function(e){U.html(R.menu(e,T)),K=U.find(O.item)},reference:function(){C.debug("Dropdown behavior was called on select, replacing with closest dropdown"),j=j.parent(O.dropdown),G=j.data(F),X=j.get(0),C.refresh(),C.setup.returnedObject()},returnedObject:function(){var e=o.slice(0,v),t=o.slice(v+1);o=e.add(j).add(t)}},refresh:function(){C.refreshSelectors(),C.refreshData()},refreshItems:function(){K=U.find(O.item)},refreshSelectors:function(){C.verbose("Refreshing selector cache"),N=j.find(O.text),z=j.find(O.search),V=j.find(O.input),B=j.find(O.icon),H=j.prev().find(O.text).length>0?j.prev().find(O.text):j.prev(),U=j.children(O.menu),K=U.find(O.item)},refreshData:function(){C.verbose("Refreshing cached metadata"),K.removeData(L.text).removeData(L.value)},clearData:function(){C.verbose("Clearing metadata"),K.removeData(L.text).removeData(L.value),j.removeData(L.defaultText).removeData(L.defaultValue).removeData(L.placeholderText)},toggle:function(){C.verbose("Toggling menu visibility"),C.is.active()?C.hide():C.show()},show:function(t){if(t=e.isFunction(t)?t:function(){},!C.can.show()&&C.is.remote()&&(C.debug("No API results retrieved, searching before show"),C.queryRemote(C.get.query(),C.show)),C.can.show()&&!C.is.active()){if(C.debug("Showing dropdown"),!C.has.message()||C.has.maxSelections()||C.has.allResultsFiltered()||C.remove.message(),C.is.allFiltered())return!0;!1!==k.onShow.call(X)&&(C.aria.setExpanded(!0),C.aria.refreshDescendant(),C.animate.show((function(){C.can.click()&&C.bind.intent(),C.has.menuSearch()&&C.focusSearch(),C.set.visible(),t.call(X)})))}},hide:function(t){t=e.isFunction(t)?t:function(){},C.is.active()&&!C.is.animatingOutward()&&(C.debug("Hiding dropdown"),!1!==k.onHide.call(X)&&(C.aria.setExpanded(!1),C.aria.removeDescendant(),C.animate.hide((function(){C.remove.visible(),t.call(X)}))))},hideOthers:function(){C.verbose("Finding other dropdowns to hide"),o.not(j).has(O.menu+"."+S.visible).dropdown("hide")},hideMenu:function(){C.verbose("Hiding menu  instantaneously"),C.remove.active(),C.remove.visible(),U.transition("hide")},hideSubMenus:function(){var e=U.children(O.item).find(O.menu);C.verbose("Hiding sub menus",e),e.transition("hide")},bind:{events:function(){c&&C.bind.touchEvents(),C.bind.keyboardEvents(),C.bind.inputEvents(),C.bind.mouseEvents()},touchEvents:function(){C.debug("Touch device detected binding additional touch events"),C.is.searchSelection()||C.is.single()&&j.on("touchstart"+E,C.event.test.toggle),U.on("touchstart"+E,O.item,C.event.item.mouseenter)},keyboardEvents:function(){C.verbose("Binding keyboard events"),j.on("keydown"+E,C.event.keydown),C.has.search()&&j.on(C.get.inputEvent()+E,O.search,C.event.input),C.is.multiple()&&r.on("keydown"+$,C.event.document.keydown)},inputEvents:function(){C.verbose("Binding input change events"),j.on("change"+E,O.input,C.event.change)},mouseEvents:function(){C.verbose("Binding mouse events"),C.is.multiple()&&j.on("click"+E,O.label,C.event.label.click).on("click"+E,O.remove,C.event.remove.click),C.is.searchSelection()?(j.on("mousedown"+E,C.event.mousedown).on("mouseup"+E,C.event.mouseup).on("mousedown"+E,O.menu,C.event.menu.mousedown).on("mouseup"+E,O.menu,C.event.menu.mouseup).on("click"+E,O.icon,C.event.icon.click).on("focus"+E,O.search,C.event.search.focus).on("click"+E,O.search,C.event.search.focus).on("blur"+E,O.search,C.event.search.blur).on("click"+E,O.text,C.event.text.focus),C.is.multiple()&&j.on("click"+E,C.event.click)):("click"==k.on?j.on("click"+E,O.icon,C.event.icon.click).on("click"+E,C.event.test.toggle):"hover"==k.on?j.on("mouseenter"+E,C.delay.show).on("mouseleave"+E,C.delay.hide):j.on(k.on+E,C.toggle),j.on("mousedown"+E,C.event.mousedown).on("mouseup"+E,C.event.mouseup).on("focus"+E,C.event.focus),C.has.menuSearch()?j.on("blur"+E,O.search,C.event.search.blur):j.on("blur"+E,C.event.blur)),U.on("mouseenter"+E,O.item,C.event.item.mouseenter).on("mouseleave"+E,O.item,C.event.item.mouseleave).on("click"+E,O.item,C.event.item.click)},intent:function(){C.verbose("Binding hide intent event to document"),c&&r.on("touchstart"+$,C.event.test.touch).on("touchmove"+$,C.event.test.touch),r.on("click"+$,C.event.test.hide)}},unbind:{intent:function(){C.verbose("Removing hide intent event from document"),c&&r.off("touchstart"+$).off("touchmove"+$),r.off("click"+$)}},filter:function(e){var t=void 0!==e?e:C.get.query(),n=function(){C.is.multiple()&&C.filterActive(),(e||!e&&0==C.get.activeItem().length)&&C.select.firstUnfiltered(),C.has.allResultsFiltered()?k.onNoResults.call(X,t)?k.allowAdditions?k.hideAdditions&&(C.verbose("User addition with no menu, setting empty style"),C.set.empty(),C.hideMenu()):(C.verbose("All items filtered, showing message",t),C.add.message(_.noResults)):(C.verbose("All items filtered, hiding dropdown",t),C.hideMenu()):(C.remove.empty(),C.remove.message()),k.allowAdditions&&C.add.userSuggestion(e),C.is.searchSelection()&&C.can.show()&&C.is.focusedOnSearch()&&C.show()};k.useLabels&&C.has.maxSelections()||(k.apiSettings?C.can.useAPI()?C.queryRemote(t,(function(){k.filterRemoteData&&C.filterItems(t),n()})):C.error(I.noAPI):(C.filterItems(t),n()))},queryRemote:function(t,n){var i={errorDuration:!1,cache:"local",throttle:k.throttle,urlData:{query:t},onError:function(){C.add.message(_.serverError),n()},onFailure:function(){C.add.message(_.serverError),n()},onSuccess:function(e){C.remove.message(),C.setup.menu({values:e[T.remoteValues]}),n()}};j.api("get request")||C.setup.api(),i=e.extend(!0,{},i,k.apiSettings),j.api("setting",i).api("query")},filterItems:function(t){var n=void 0!==t?t:C.get.query(),i=null,a=C.escape.string(n),o=new RegExp("^"+a,"igm");C.has.query()&&(i=[],C.verbose("Searching for matching values",n),K.each((function(){var t,a,r=e(this);if("both"==k.match||"text"==k.match){if(-1!==(t=String(C.get.choiceText(r,!1))).search(o))return i.push(this),!0;if("exact"===k.fullTextSearch&&C.exactSearch(n,t))return i.push(this),!0;if(!0===k.fullTextSearch&&C.fuzzySearch(n,t))return i.push(this),!0}if("both"==k.match||"value"==k.match){if(-1!==(a=String(C.get.choiceValue(r,t))).search(o))return i.push(this),!0;if("exact"===k.fullTextSearch&&C.exactSearch(n,a))return i.push(this),!0;if(!0===k.fullTextSearch&&C.fuzzySearch(n,a))return i.push(this),!0}}))),C.debug("Showing only matched items",n),C.remove.filteredItem(),i&&K.not(i).addClass(S.filtered)},fuzzySearch:function(e,t){var n=t.length,i=e.length;if(e=e.toLowerCase(),t=t.toLowerCase(),i>n)return!1;if(i===n)return e===t;e:for(var a=0,o=0;a<i;a++){for(var r=e.charCodeAt(a);o<n;)if(t.charCodeAt(o++)===r)continue e;return!1}return!0},exactSearch:function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase()).indexOf(e)>-1},filterActive:function(){k.useLabels&&K.filter("."+S.active).addClass(S.filtered)},focusSearch:function(e){C.has.search()&&!C.is.focusedOnSearch()&&(e?(j.off("focus"+E,O.search),z.focus(),j.on("focus"+E,O.search,C.event.search.focus)):z.focus())},forceSelection:function(){var e=K.not(S.filtered).filter("."+S.selected).eq(0),t=K.not(S.filtered).filter("."+S.active).eq(0),n=e.length>0?e:t;if(n.length>0&&!C.is.multiple())return C.debug("Forcing partial selection to selected item",n),void C.event.item.click.call(n,{},!0);k.allowAdditions?(C.set.selected(C.get.query()),C.remove.searchTerm()):C.remove.searchTerm()},change:{values:function(t){k.allowAdditions||C.clear(),C.debug("Creating dropdown with specified values",t),C.setup.menu({values:t}),e.each(t,(function(e,t){if(1==t.selected)return C.debug("Setting initial selection to",t.value),C.set.selected(t.value),!0}))}},event:{change:function(){Q||(C.debug("Input changed, updating selection"),C.set.selected())},focus:function(){k.showOnFocus&&!W&&C.is.hidden()&&!g&&C.show()},blur:function(e){g=n.activeElement===this,W||g||(C.remove.activeLabel(),C.hide())},mousedown:function(){C.is.searchSelection()?b=!0:W=!0},mouseup:function(){C.is.searchSelection()?b=!1:W=!1},click:function(t){e(t.target).is(j)&&(C.is.focusedOnSearch()?C.show():C.focusSearch())},search:{focus:function(){W=!0,C.is.multiple()&&C.remove.activeLabel(),k.showOnFocus&&C.search()},blur:function(e){g=n.activeElement===this,C.is.searchSelection()&&!b&&(J||g||(k.forceSelection&&C.forceSelection(),C.hide())),b=!1}},icon:{click:function(e){C.toggle()}},text:{focus:function(e){W=!0,C.focusSearch()}},input:function(e){(C.is.multiple()||C.is.searchSelection())&&C.set.filtered(),clearTimeout(C.timer),C.timer=setTimeout(C.search,k.delay.search)},label:{click:function(t){var n=e(this),i=j.find(O.label),a=i.filter("."+S.active),o=n.nextAll("."+S.active),r=n.prevAll("."+S.active),s=o.length>0?n.nextUntil(o).add(a).add(n):n.prevUntil(r).add(a).add(n);t.shiftKey?(a.removeClass(S.active),s.addClass(S.active)):t.ctrlKey?n.toggleClass(S.active):(a.removeClass(S.active),n.addClass(S.active)),k.onLabelSelect.apply(this,i.filter("."+S.active))}},remove:{click:function(){var t=e(this).parent();t.hasClass(S.active)?C.remove.activeLabels():C.remove.activeLabels(t)}},test:{toggle:function(e){var t=C.is.multiple()?C.show:C.toggle;C.is.bubbledLabelClick(e)||C.is.bubbledIconClick(e)||C.determine.eventOnElement(e,t)&&e.preventDefault()},touch:function(e){C.determine.eventOnElement(e,(function(){"touchstart"==e.type?C.timer=setTimeout((function(){C.hide()}),k.delay.touch):"touchmove"==e.type&&clearTimeout(C.timer)})),e.stopPropagation()},hide:function(e){C.determine.eventInModule(e,C.hide)}},select:{mutation:function(t){C.debug("<select> modified, recreating menu");var n=!1;e.each(t,(function(t,i){if(e(i.target).is("select")||e(i.addedNodes).is("select"))return n=!0,!0})),n&&(C.disconnect.selectObserver(),C.refresh(),C.setup.select(),C.set.selected(),C.observe.select())}},menu:{mutation:function(t){var n=t[0],i=n.addedNodes?e(n.addedNodes[0]):e(!1),a=n.removedNodes?e(n.removedNodes[0]):e(!1),o=i.add(a),r=o.is(O.addition)||o.closest(O.addition).length>0,s=o.is(O.message)||o.closest(O.message).length>0;r||s?(C.debug("Updating item selector cache"),C.refreshItems()):(C.debug("Menu modified, updating selector cache"),C.refresh())},mousedown:function(){J=!0},mouseup:function(){J=!1}},item:{mouseenter:function(t){var n=e(t.target),i=e(this),a=i.children(O.menu),o=i.siblings(O.item).children(O.menu),r=a.length>0;!(a.find(n).length>0)&&r&&(clearTimeout(C.itemTimer),C.itemTimer=setTimeout((function(){C.verbose("Showing sub-menu",a),e.each(o,(function(){C.animate.hide(!1,e(this))})),C.animate.show(!1,a)}),k.delay.show),t.preventDefault())},mouseleave:function(t){var n=e(this).children(O.menu);n.length>0&&(clearTimeout(C.itemTimer),C.itemTimer=setTimeout((function(){C.verbose("Hiding sub-menu",n),C.animate.hide(!1,n)}),k.delay.hide))},click:function(t,i){var a=e(this),o=e(t?t.target:""),r=a.find(O.menu),s=C.get.choiceText(a),c=C.get.choiceValue(a,s),l=r.length>0,d=r.find(o).length>0;C.has.menuSearch()&&e(n.activeElement).blur(),d||l&&!k.allowCategorySelection||(C.is.searchSelection()&&(k.allowAdditions&&C.remove.userAddition(),C.remove.searchTerm(),C.is.focusedOnSearch()||1==i||C.focusSearch(!0)),k.useLabels||(C.remove.filteredItem(),C.set.scrollPosition(a)),C.determine.selectAction.call(this,s,c))}},document:{keydown:function(e){var t=e.which;if(C.is.inObject(t,A)){var n=j.find(O.label),i=n.filter("."+S.active),a=(i.data(L.value),n.index(i)),o=n.length,r=i.length>0,s=i.length>1,c=0===a,l=a+1==o,d=C.is.searchSelection(),u=C.is.focusedOnSearch(),h=C.is.focused(),f=u&&0===C.get.caretPosition();if(d&&!r&&!u)return;t==A.leftArrow?!h&&!f||r?r&&(e.shiftKey?C.verbose("Adding previous label to selection"):(C.verbose("Selecting previous label"),n.removeClass(S.active)),c&&!s?i.addClass(S.active):i.prev(O.siblingLabel).addClass(S.active).end(),e.preventDefault()):(C.verbose("Selecting previous label"),n.last().addClass(S.active)):t==A.rightArrow?(h&&!r&&n.first().addClass(S.active),r&&(e.shiftKey?C.verbose("Adding next label to selection"):(C.verbose("Selecting next label"),n.removeClass(S.active)),l?d?u?n.removeClass(S.active):C.focusSearch():s?i.next(O.siblingLabel).addClass(S.active):i.addClass(S.active):i.next(O.siblingLabel).addClass(S.active),e.preventDefault())):t==A.deleteKey||t==A.backspace?r?(C.verbose("Removing active labels"),l&&d&&!u&&C.focusSearch(),i.last().next(O.siblingLabel).addClass(S.active),C.remove.activeLabels(i),e.preventDefault()):f&&!r&&t==A.backspace&&(C.verbose("Removing last label on input backspace"),i=n.last().addClass(S.active),C.remove.activeLabels(i)):i.removeClass(S.active)}}},keydown:function(e){var t=e.which;if(C.is.inObject(t,A)){var n,i=K.not(O.unselectable).filter("."+S.selected).eq(0),a=U.children("."+S.active).eq(0),o=i.length>0?i:a,r=o.length>0?o.siblings(":not(."+S.filtered+")").addBack():U.children(":not(."+S.filtered+")"),s=o.children(O.menu),c=o.closest(O.menu),l=c.hasClass(S.visible)||c.hasClass(S.animating)||c.parent(O.menu).length>0,d=s.length>0,u=o.length>0,h=o.not(O.unselectable).length>0,f=t==A.delimiter&&k.allowAdditions&&C.is.multiple();if(k.allowAdditions&&k.hideAdditions&&(t==A.enter||f)&&h&&(C.verbose("Selecting item from keyboard shortcut",o),o[0].click(),C.is.searchSelection()&&C.remove.searchTerm()),C.is.visible()){if((t==A.enter||f)&&(t==A.enter&&u&&d&&!k.allowCategorySelection?(C.verbose("Pressed enter on unselectable category, opening sub menu"),t=A.rightArrow):h&&(C.verbose("Selecting item from keyboard shortcut",o),o[0].click(),C.is.searchSelection()&&C.remove.searchTerm()),e.preventDefault()),u&&(t==A.leftArrow&&c[0]!==U[0]&&(C.verbose("Left key pressed, closing sub-menu"),C.animate.hide(!1,c),o.removeClass(S.selected),c.closest(O.item).addClass(S.selected),C.aria.refreshDescendant(),e.preventDefault()),t==A.rightArrow&&d&&(C.verbose("Right key pressed, opening sub-menu"),C.animate.show(!1,s),o.removeClass(S.selected),s.find(O.item).eq(0).addClass(S.selected),C.aria.refreshDescendant(),e.preventDefault())),t==A.upArrow){if(n=u&&l?o.prevAll(O.item+":not("+O.unselectable+")").eq(0):K.eq(0),r.index(n)<0)return C.verbose("Up key pressed but reached top of current menu"),void e.preventDefault();C.verbose("Up key pressed, changing active item"),o.removeClass(S.selected),n.addClass(S.selected),C.aria.refreshDescendant(),C.set.scrollPosition(n),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),e.preventDefault()}if(t==A.downArrow){if(0===(n=u&&l?n=o.nextAll(O.item+":not("+O.unselectable+")").eq(0):K.eq(0)).length)return C.verbose("Down key pressed but reached bottom of current menu"),void e.preventDefault();C.verbose("Down key pressed, changing active item"),K.removeClass(S.selected),n.addClass(S.selected),C.aria.refreshDescendant(),C.set.scrollPosition(n),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),e.preventDefault()}t==A.pageUp&&(C.scrollPage("up"),e.preventDefault()),t==A.pageDown&&(C.scrollPage("down"),e.preventDefault()),t==A.escape&&(C.verbose("Escape key pressed, closing dropdown"),C.hide())}else f&&e.preventDefault(),t!=A.downArrow||C.is.visible()||(C.verbose("Down key pressed, showing dropdown"),C.show(),e.preventDefault())}else C.has.search()||C.set.selectedLetter(String.fromCharCode(t))}},trigger:{change:function(){var e=n.createEvent("HTMLEvents"),t=V[0];t&&(C.verbose("Triggering native change event"),e.initEvent("change",!0,!1),t.dispatchEvent(e))}},determine:{selectAction:function(t,n){C.verbose("Determining action",k.action),e.isFunction(C.action[k.action])?(C.verbose("Triggering preset action",k.action,t,n),C.action[k.action].call(X,t,n,this)):e.isFunction(k.action)?(C.verbose("Triggering user action",k.action,t,n),k.action.call(X,t,n,this)):C.error(I.action,k.action)},eventInModule:function(t,i){var a=e(t.target),o=a.closest(n.documentElement).length>0,r=a.closest(j).length>0;return i=e.isFunction(i)?i:function(){},o&&!r?(C.verbose("Triggering event",i),i(),!0):(C.verbose("Event occurred in dropdown, canceling callback"),!1)},eventOnElement:function(t,i){var a=e(t.target),o=a.closest(O.siblingLabel),r=n.body.contains(t.target),s=0===j.find(o).length,c=0===a.closest(U).length;return i=e.isFunction(i)?i:function(){},r&&s&&c?(C.verbose("Triggering event",i),i(),!0):(C.verbose("Event occurred in dropdown menu, canceling callback"),!1)}},action:{nothing:function(){},activate:function(t,n,i){if(n=void 0!==n?n:t,C.can.activate(e(i))){if(C.set.selected(n,e(i)),C.is.multiple()&&!C.is.allFiltered())return;C.hideAndClear()}},select:function(t,n,i){if(n=void 0!==n?n:t,C.can.activate(e(i))){if(C.set.value(n,t,e(i)),C.is.multiple()&&!C.is.allFiltered())return;C.hideAndClear()}},combo:function(t,n,i){n=void 0!==n?n:t,C.set.selected(n,e(i)),C.hideAndClear()},hide:function(e,t,n){C.set.value(t,e),C.hideAndClear()}},get:{id:function(){return w},defaultText:function(){return j.data(L.defaultText)},defaultValue:function(){return j.data(L.defaultValue)},placeholderText:function(){return"auto"!=k.placeholder&&"string"==typeof k.placeholder?k.placeholder:j.data(L.placeholderText)||""},text:function(){return N.text()},query:function(){return e.trim(z.val())},searchWidth:function(e){return e=void 0!==e?e:z.val(),P.text(e),Math.ceil(P.width()+1)},selectionCount:function(){var t=C.get.values();return C.is.multiple()?e.isArray(t)?t.length:0:""!==C.get.value()?1:0},transition:function(e){return"auto"==k.transition?C.is.upward(e)?"slide up":"slide down":k.transition},userValues:function(){var t=C.get.values();return!!t&&(t=e.isArray(t)?t:[t],e.grep(t,(function(e){return!1===C.get.item(e)})))},uniqueArray:function(t){return e.grep(t,(function(n,i){return e.inArray(n,t)===i}))},caretPosition:function(){var e,t,i=z.get(0);return"selectionStart"in i?i.selectionStart:n.selection?(i.focus(),t=(e=n.selection.createRange()).text.length,e.moveStart("character",-i.value.length),e.text.length-t):void 0},value:function(){var t=V.length>0?V.val():j.data(L.value),n=e.isArray(t)&&1===t.length&&""===t[0];return void 0===t||n?"":t},values:function(){var e=C.get.value();return""===e?"":!C.has.selectInput()&&C.is.multiple()?"string"==typeof e?e.split(k.delimiter):"":e},remoteValues:function(){var t=C.get.values(),n=!1;return t&&("string"==typeof t&&(t=[t]),e.each(t,(function(e,t){var i=C.read.remoteData(t);C.verbose("Restoring value from session data",i,t),i&&(n||(n={}),n[t]=i)}))),n},choiceText:function(t,n){if(n=void 0!==n?n:k.preserveHTML,t)return t.find(O.menu).length>0&&(C.verbose("Retrieving text of element with sub-menu"),(t=t.clone()).find(O.menu).remove(),t.find(O.menuIcon).remove()),void 0!==t.data(L.text)?t.data(L.text):n?e.trim(t.html()):e.trim(t.text())},choiceValue:function(t,n){return n=n||C.get.choiceText(t),!!t&&(void 0!==t.data(L.value)?String(t.data(L.value)):"string"==typeof n?e.trim(n.toLowerCase()):String(n))},inputEvent:function(){var e=z[0];return!!e&&(void 0!==e.oninput?"input":void 0!==e.onpropertychange?"propertychange":"keyup")},selectValues:function(){var t={values:[]};return j.find("option").each((function(){var n=e(this),i=n.html(),a=n.attr("disabled"),o=void 0!==n.attr("value")?n.attr("value"):i;"auto"===k.placeholder&&""===o?t.placeholder=i:t.values.push({name:i,value:o,disabled:a})})),k.placeholder&&"auto"!==k.placeholder&&(C.debug("Setting placeholder value to",k.placeholder),t.placeholder=k.placeholder),k.sortSelect?(t.values.sort((function(e,t){return e.name>t.name?1:-1})),C.debug("Retrieved and sorted values from select",t)):C.debug("Retrieved values from select",t),t},activeItem:function(){return K.filter("."+S.active)},selectedItem:function(){var e=K.not(O.unselectable).filter("."+S.selected);return e.length>0?e:K.eq(0)},itemWithAdditions:function(e){var t=C.get.item(e),n=C.create.userChoice(e);return n&&n.length>0&&(t=t.length>0?t.add(n):n),t},item:function(t,n){var i,a,o=!1;return t=void 0!==t?t:void 0!==C.get.values()?C.get.values():C.get.text(),i=a?t.length>0:null!=t,a=C.is.multiple()&&e.isArray(t),n=""===t||0===t||(n||!1),i&&K.each((function(){var i=e(this),r=C.get.choiceText(i),s=C.get.choiceValue(i,r);if(null!=s)if(a)-1===e.inArray(String(s),t)&&-1===e.inArray(r,t)||(o=o?o.add(i):i);else if(n){if(C.verbose("Ambiguous dropdown value using strict type check",i,t),s===t||r===t)return o=i,!0}else if(String(s)==String(t)||r==t)return C.verbose("Found select item by value",s,t),o=i,!0})),o}},check:{maxSelections:function(e){return!k.maxSelections||((e=void 0!==e?e:C.get.selectionCount())>=k.maxSelections?(C.debug("Maximum selection count reached"),k.useLabels&&(K.addClass(S.filtered),C.add.message(_.maxSelections)),!0):(C.verbose("No longer at maximum selection count"),C.remove.message(),C.remove.filteredItem(),C.is.searchSelection()&&C.filterItems(),!1))}},restore:{defaults:function(){C.clear(),C.restore.defaultText(),C.restore.defaultValue()},defaultText:function(){var e=C.get.defaultText();e===C.get.placeholderText?(C.debug("Restoring default placeholder text",e),C.set.placeholderText(e)):(C.debug("Restoring default text",e),C.set.text(e))},placeholderText:function(){C.set.placeholderText()},defaultValue:function(){var e=C.get.defaultValue();void 0!==e&&(C.debug("Restoring default value",e),""!==e?(C.set.value(e),C.set.selected()):(C.remove.activeItem(),C.remove.selectedItem()))},labels:function(){k.allowAdditions&&(k.useLabels||(C.error(I.labels),k.useLabels=!0),C.debug("Restoring selected values"),C.create.userLabels()),C.check.maxSelections()},selected:function(){C.restore.values(),C.is.multiple()?(C.debug("Restoring previously selected values and labels"),C.restore.labels()):C.debug("Restoring previously selected values")},values:function(){C.set.initialLoad(),k.apiSettings&&k.saveRemoteData&&C.get.remoteValues()?C.restore.remoteValues():C.set.selected(),C.remove.initialLoad()},remoteValues:function(){var t=C.get.remoteValues();C.debug("Recreating selected from session data",t),t&&(C.is.single()?e.each(t,(function(e,t){C.set.text(t)})):e.each(t,(function(e,t){C.add.label(e,t)})))}},read:{remoteData:function(e){var n;if(void 0!==t.Storage)return void 0!==(n=sessionStorage.getItem(e))&&n;C.error(I.noStorage)}},save:{defaults:function(){C.save.defaultText(),C.save.placeholderText(),C.save.defaultValue()},defaultValue:function(){var e=C.get.value();C.verbose("Saving default value as",e),j.data(L.defaultValue,e)},defaultText:function(){var e=C.get.text();C.verbose("Saving default text as",e),j.data(L.defaultText,e)},placeholderText:function(){var e;!1!==k.placeholder&&N.hasClass(S.placeholder)&&(e=C.get.text(),C.verbose("Saving placeholder text as",e),j.data(L.placeholderText,e))},remoteData:function(e,n){void 0!==t.Storage?(C.verbose("Saving remote data to session storage",n,e),sessionStorage.setItem(n,e)):C.error(I.noStorage)}},clear:function(){C.is.multiple()&&k.useLabels?C.remove.labels():(C.remove.activeItem(),C.remove.selectedItem()),C.set.placeholderText(),C.clearValue()},clearValue:function(){C.set.value("")},scrollPage:function(e,t){var n,i,a=t||C.get.selectedItem(),o=a.closest(O.menu),r=o.outerHeight(),s=o.scrollTop(),c=K.eq(0).outerHeight(),l=Math.floor(r/c),d=(o.prop("scrollHeight"),"up"==e?s-c*l:s+c*l),u=K.not(O.unselectable);i="up"==e?u.index(a)-l:u.index(a)+l,(n=("up"==e?i>=0:i<u.length)?u.eq(i):"up"==e?u.first():u.last()).length>0&&(C.debug("Scrolling page",e,n),a.removeClass(S.selected),n.addClass(S.selected),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),o.scrollTop(d))},set:{filtered:function(){var e=C.is.multiple(),t=C.is.searchSelection(),n=e&&t,i=t?C.get.query():"",a="string"==typeof i&&i.length>0,o=C.get.searchWidth(),r=""!==i;e&&a&&(C.verbose("Adjusting input width",o,k.glyphWidth),z.css("width",o)),a||n&&r?(C.verbose("Hiding placeholder text"),N.addClass(S.filtered)):(!e||n&&!r)&&(C.verbose("Showing placeholder text"),N.removeClass(S.filtered))},empty:function(){j.addClass(S.empty)},loading:function(){j.addClass(S.loading)},placeholderText:function(e){e=e||C.get.placeholderText(),C.debug("Setting placeholder text",e),C.set.text(e),N.addClass(S.placeholder)},tabbable:function(){C.is.searchSelection()?(C.debug("Added tabindex to searchable dropdown"),z.val("").attr("tabindex",0),U.attr("tabindex",-1)):(C.debug("Added tabindex to dropdown"),void 0===j.attr("tabindex")&&(j.attr("tabindex",0),U.attr("tabindex",-1)))},initialLoad:function(){C.verbose("Setting initial load"),p=!0},activeItem:function(e){k.allowAdditions&&e.filter(O.addition).length>0?e.addClass(S.filtered):e.addClass(S.active)},partialSearch:function(e){var t=C.get.query().length;z.val(e.substr(0,t))},scrollPosition:function(e,t){var n,i,a,o,r,s;n=(e=e||C.get.selectedItem()).closest(O.menu),i=e&&e.length>0,t=void 0!==t&&t,e&&n.length>0&&i&&(e.position().top,n.addClass(S.loading),a=(o=n.scrollTop())-n.offset().top+e.offset().top,t||(s=o+n.height()<a+5,r=a-5<o),C.debug("Scrolling to active item",a),(t||r||s)&&n.scrollTop(a),n.removeClass(S.loading))},text:function(e){"select"!==k.action&&("combo"==k.action?(C.debug("Changing combo button text",e,H),k.preserveHTML?H.html(e):H.text(e)):(e!==C.get.placeholderText()&&N.removeClass(S.placeholder),C.debug("Changing text",e,N),N.removeClass(S.filtered),k.preserveHTML?N.html(e):N.text(e)))},selectedItem:function(e){var t=C.get.choiceValue(e),n=C.get.choiceText(e,!1),i=C.get.choiceText(e,!0);C.debug("Setting user selection to item",e),C.remove.activeItem(),C.set.partialSearch(n),C.set.activeItem(e),C.set.selected(t,e),C.set.text(i)},selectedLetter:function(t){var n,i=K.filter("."+S.selected),a=i.length>0&&C.has.firstLetter(i,t),o=!1;a&&(n=i.nextAll(K).eq(0),C.has.firstLetter(n,t)&&(o=n)),o||K.each((function(){if(C.has.firstLetter(e(this),t))return o=e(this),!1})),o&&(C.verbose("Scrolling to next value with letter",t),C.set.scrollPosition(o),i.removeClass(S.selected),o.addClass(S.selected),C.aria.refreshDescendant(),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(o))},direction:function(e){"auto"==k.direction?(C.remove.upward(),C.can.openDownward(e)?C.remove.upward(e):C.set.upward(e),C.is.leftward(e)||C.can.openRightward(e)||C.set.leftward(e)):"upward"==k.direction&&C.set.upward(e)},upward:function(e){(e||j).addClass(S.upward)},leftward:function(e){(e||U).addClass(S.leftward)},value:function(e,t,n){var i=C.escape.value(e),a=V.length>0,o=C.get.values(),r=void 0!==e?String(e):e;if(a){if(!k.allowReselection&&r==o&&(C.verbose("Skipping value update already same value",e,o),!C.is.initialLoad()))return;C.is.single()&&C.has.selectInput()&&C.can.extendSelect()&&(C.debug("Adding user option",e),C.add.optionValue(e)),C.debug("Updating input value",i,o),Q=!0,V.val(i),!1===k.fireOnInit&&C.is.initialLoad()?C.debug("Input native change event ignored on initial load"):C.trigger.change(),Q=!1}else C.verbose("Storing value in metadata",i,V),i!==o&&j.data(L.value,r);!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("No callback on initial load",k.onChange):k.onChange.call(X,e,t,n)},active:function(){j.addClass(S.active)},multiple:function(){j.addClass(S.multiple)},visible:function(){j.addClass(S.visible)},exactly:function(e,t){C.debug("Setting selected to exact values"),C.clear(),C.set.selected(e,t)},selected:function(t,n){var i=C.is.multiple();(n=k.allowAdditions?n||C.get.itemWithAdditions(t):n||C.get.item(t))&&(C.debug("Setting selected menu item to",n),C.is.multiple()&&C.remove.searchWidth(),C.is.single()?(C.remove.activeItem(),C.remove.selectedItem()):k.useLabels&&C.remove.selectedItem(),n.each((function(){var t=e(this),a=C.get.choiceText(t),o=C.get.choiceValue(t,a),r=t.hasClass(S.filtered),s=t.hasClass(S.active),c=t.hasClass(S.addition),l=i&&1==n.length;i?!s||c?(k.apiSettings&&k.saveRemoteData&&C.save.remoteData(a,o),k.useLabels?(C.add.label(o,a,l),C.add.value(o,a,t),C.set.activeItem(t),C.filterActive(),C.select.nextAvailable(n)):(C.add.value(o,a,t),C.set.text(C.add.variables(_.count)),C.set.activeItem(t))):r||(C.debug("Selected active value, removing label"),C.remove.selected(o)):(k.apiSettings&&k.saveRemoteData&&C.save.remoteData(a,o),C.set.text(a),C.set.value(o,a,t),t.addClass(S.active).addClass(S.selected))})))}},add:{label:function(t,n,i){var a,o=C.is.searchSelection()?z:N,r=C.escape.value(t);k.ignoreCase&&(r=r.toLowerCase()),a=e("<a />").addClass(S.label).attr("data-"+L.value,r).html(R.label(r,n)),a=k.onLabelCreate.call(a,r,n),C.has.label(t)?C.debug("User selection already exists, skipping",r):(k.label.variation&&a.addClass(k.label.variation),!0===i?(C.debug("Animating in label",a),a.addClass(S.hidden).insertBefore(o).transition(k.label.transition,k.label.duration)):(C.debug("Adding selection label",a),a.insertBefore(o)))},message:function(t){var n=U.children(O.message),i=k.templates.message(C.add.variables(t));n.length>0?n.html(i):n=e("<div/>").html(i).addClass(S.message).appendTo(U)},optionValue:function(t){var n=C.escape.value(t);V.find('option[value="'+C.escape.string(n)+'"]').length>0||(C.disconnect.selectObserver(),C.is.single()&&(C.verbose("Removing previous user addition"),V.find("option."+S.addition).remove()),e("<option/>").prop("value",n).addClass(S.addition).html(t).appendTo(V),C.verbose("Adding user addition as an <option>",t),C.observe.select())},userSuggestion:function(e){var t,n=U.children(O.addition),i=C.get.item(e),a=i&&i.not(O.addition).length,o=n.length>0;k.useLabels&&C.has.maxSelections()||(""===e||a?n.remove():(o?(n.data(L.value,e).data(L.text,e).attr("data-"+L.value,e).attr("data-"+L.text,e).removeClass(S.filtered),k.hideAdditions||(t=k.templates.addition(C.add.variables(_.addResult,e)),n.html(t)),C.verbose("Replacing user suggestion with new value",n)):((n=C.create.userChoice(e)).prependTo(U),C.verbose("Adding item choice to menu corresponding with user choice addition",n)),k.hideAdditions&&!C.is.allFiltered()||n.addClass(S.selected).siblings().removeClass(S.selected),C.refreshItems()))},variables:function(e,t){var n,i,a=-1!==e.search("{count}"),o=-1!==e.search("{maxCount}"),r=-1!==e.search("{term}");return C.verbose("Adding templated variables to message",e),a&&(n=C.get.selectionCount(),e=e.replace("{count}",n)),o&&(n=C.get.selectionCount(),e=e.replace("{maxCount}",k.maxSelections)),r&&(i=t||C.get.query(),e=e.replace("{term}",i)),e},value:function(t,n,i){var a,o=C.get.values();C.has.value(t)?C.debug("Value already selected"):""!==t?(e.isArray(o)?(a=o.concat([t]),a=C.get.uniqueArray(a)):a=[t],C.has.selectInput()?C.can.extendSelect()&&(C.debug("Adding value to select",t,a,V),C.add.optionValue(t)):(a=a.join(k.delimiter),C.debug("Setting hidden input to delimited value",a,V)),!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("Skipping onadd callback on initial load",k.onAdd):k.onAdd.call(X,t,n,i),C.set.value(a,t,n,i),C.check.maxSelections()):C.debug("Cannot select blank values from multiselect")}},remove:{active:function(){j.removeClass(S.active)},activeLabel:function(){j.find(O.label).removeClass(S.active)},empty:function(){j.removeClass(S.empty)},loading:function(){j.removeClass(S.loading)},initialLoad:function(){p=!1},upward:function(e){(e||j).removeClass(S.upward)},leftward:function(e){(e||U).removeClass(S.leftward)},visible:function(){j.removeClass(S.visible)},activeItem:function(){K.removeClass(S.active)},filteredItem:function(){k.useLabels&&C.has.maxSelections()||(k.useLabels&&C.is.multiple()?K.not("."+S.active).removeClass(S.filtered):K.removeClass(S.filtered),C.remove.empty())},optionValue:function(e){var t=C.escape.value(e),n=V.find('option[value="'+C.escape.string(t)+'"]');n.length>0&&n.hasClass(S.addition)&&(y&&(y.disconnect(),C.verbose("Temporarily disconnecting mutation observer")),n.remove(),C.verbose("Removing user addition as an <option>",t),y&&y.observe(V[0],{childList:!0,subtree:!0}))},message:function(){U.children(O.message).remove()},searchWidth:function(){z.css("width","")},searchTerm:function(){C.verbose("Cleared search term"),z.val(""),C.set.filtered()},userAddition:function(){K.filter(O.addition).remove()},selected:function(t,n){if(!(n=k.allowAdditions?n||C.get.itemWithAdditions(t):n||C.get.item(t)))return!1;n.each((function(){var t=e(this),n=C.get.choiceText(t),i=C.get.choiceValue(t,n);C.is.multiple()?k.useLabels?(C.remove.value(i,n,t),C.remove.label(i)):(C.remove.value(i,n,t),0===C.get.selectionCount()?C.set.placeholderText():C.set.text(C.add.variables(_.count))):C.remove.value(i,n,t),t.removeClass(S.filtered).removeClass(S.active),k.useLabels&&t.removeClass(S.selected)}))},selectedItem:function(){K.removeClass(S.selected)},value:function(e,t,n){var i,a=C.get.values();C.has.selectInput()?(C.verbose("Input is <select> removing selected option",e),i=C.remove.arrayValue(e,a),C.remove.optionValue(e)):(C.verbose("Removing from delimited values",e),i=(i=C.remove.arrayValue(e,a)).join(k.delimiter)),!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("No callback on initial load",k.onRemove):k.onRemove.call(X,e,t,n),C.set.value(i,t,n),C.check.maxSelections()},arrayValue:function(t,n){return e.isArray(n)||(n=[n]),n=e.grep(n,(function(e){return t!=e})),C.verbose("Removed value from delimited string",t,n),n},label:function(e,t){var n=j.find(O.label).filter("[data-"+L.value+'="'+C.escape.string(e)+'"]');C.verbose("Removing label",n),n.remove()},activeLabels:function(e){e=e||j.find(O.label).filter("."+S.active),C.verbose("Removing active label selections",e),C.remove.labels(e)},labels:function(t){t=t||j.find(O.label),C.verbose("Removing labels",t),t.each((function(){var t=e(this),n=t.data(L.value),i=void 0!==n?String(n):n,a=C.is.userValue(i);!1!==k.onLabelRemove.call(t,n)?(C.remove.message(),a?(C.remove.value(i),C.remove.label(i)):C.remove.selected(i)):C.debug("Label remove callback cancelled removal")}))},tabbable:function(){C.is.searchSelection()?(C.debug("Searchable dropdown initialized"),z.removeAttr("tabindex"),U.removeAttr("tabindex")):(C.debug("Simple selection dropdown initialized"),j.removeAttr("tabindex"),U.removeAttr("tabindex"))}},has:{menuSearch:function(){return C.has.search()&&z.closest(U).length>0},search:function(){return z.length>0},sizer:function(){return P.length>0},selectInput:function(){return V.is("select")},minCharacters:function(e){return!k.minCharacters||(e=String(void 0!==e?e:C.get.query())).length>=k.minCharacters},firstLetter:function(e,t){var n,i;return!(!e||0===e.length||"string"!=typeof t)&&(n=C.get.choiceText(e,!1),t=t.toLowerCase(),i=String(n).charAt(0).toLowerCase(),t==i)},input:function(){return V.length>0},items:function(){return K.length>0},menu:function(){return U.length>0},message:function(){return 0!==U.children(O.message).length},label:function(e){var t=C.escape.value(e),n=j.find(O.label);return k.ignoreCase&&(t=t.toLowerCase()),n.filter("[data-"+L.value+'="'+C.escape.string(t)+'"]').length>0},maxSelections:function(){return k.maxSelections&&C.get.selectionCount()>=k.maxSelections},allResultsFiltered:function(){var e=K.not(O.addition);return e.filter(O.unselectable).length===e.length},userSuggestion:function(){return U.children(O.addition).length>0},query:function(){return""!==C.get.query()},value:function(e){return k.ignoreCase?C.has.valueIgnoringCase(e):C.has.valueMatchingCase(e)},valueMatchingCase:function(t){var n=C.get.values();return!!(e.isArray(n)?n&&-1!==e.inArray(t,n):n==t)},valueIgnoringCase:function(t){var n=C.get.values(),i=!1;return e.isArray(n)||(n=[n]),e.each(n,(function(e,n){if(String(t).toLowerCase()==String(n).toLowerCase())return i=!0,!1})),i}},is:{active:function(){return j.hasClass(S.active)},animatingInward:function(){return U.transition("is inward")},animatingOutward:function(){return U.transition("is outward")},bubbledLabelClick:function(t){return e(t.target).is("select, input")&&j.closest("label").length>0},bubbledIconClick:function(t){return e(t.target).closest(B).length>0},alreadySetup:function(){return j.is("select")&&void 0!==j.parent(O.dropdown).data(F)&&0===j.prev().length},animating:function(e){return e?e.transition&&e.transition("is animating"):U.transition&&U.transition("is animating")},leftward:function(e){return(e||U).hasClass(S.leftward)},disabled:function(){return j.hasClass(S.disabled)},focused:function(){return n.activeElement===j[0]},focusedOnSearch:function(){return n.activeElement===z[0]},allFiltered:function(){return(C.is.multiple()||C.has.search())&&!(0==k.hideAdditions&&C.has.userSuggestion())&&!C.has.message()&&C.has.allResultsFiltered()},hidden:function(e){return!C.is.visible(e)},initialLoad:function(){return p},inObject:function(t,n){var i=!1;return e.each(n,(function(e,n){if(n==t)return i=!0,!0})),i},multiple:function(){return j.hasClass(S.multiple)},remote:function(){return k.apiSettings&&C.can.useAPI()},single:function(){return!C.is.multiple()},selectMutation:function(t){var n=!1;return e.each(t,(function(t,i){if(i.target&&e(i.target).is("select"))return n=!0,!0})),n},search:function(){return j.hasClass(S.search)},searchSelection:function(){return C.has.search()&&1===z.parent(O.dropdown).length},selection:function(){return j.hasClass(S.selection)},userValue:function(t){return-1!==e.inArray(t,C.get.userValues())},upward:function(e){return(e||j).hasClass(S.upward)},visible:function(e){return e?e.hasClass(S.visible):U.hasClass(S.visible)},verticallyScrollableContext:function(){var e=M.get(0)!==t&&M.css("overflow-y");return"auto"==e||"scroll"==e},horizontallyScrollableContext:function(){var e=M.get(0)!==t&&M.css("overflow-X");return"auto"==e||"scroll"==e}},can:{activate:function(e){return!!k.useLabels||(!C.has.maxSelections()||!(!C.has.maxSelections()||!e.hasClass(S.active)))},openDownward:function(e){var n,i,a=e||U,o=!0;return a.addClass(S.loading),i={context:{offset:M.get(0)===t?{top:0,left:0}:M.offset(),scrollTop:M.scrollTop(),height:M.outerHeight()},menu:{offset:a.offset(),height:a.outerHeight()}},C.is.verticallyScrollableContext()&&(i.menu.offset.top+=i.context.scrollTop),(n={above:i.context.scrollTop<=i.menu.offset.top-i.context.offset.top-i.menu.height,below:i.context.scrollTop+i.context.height>=i.menu.offset.top-i.context.offset.top+i.menu.height}).below?(C.verbose("Dropdown can fit in context downward",n),o=!0):n.below||n.above?(C.verbose("Dropdown cannot fit below, opening upward",n),o=!1):(C.verbose("Dropdown cannot fit in either direction, favoring downward",n),o=!0),a.removeClass(S.loading),o},openRightward:function(e){var n,i,a=e||U,o=!0;return a.addClass(S.loading),i={context:{offset:M.get(0)===t?{top:0,left:0}:M.offset(),scrollLeft:M.scrollLeft(),width:M.outerWidth()},menu:{offset:a.offset(),width:a.outerWidth()}},C.is.horizontallyScrollableContext()&&(i.menu.offset.left+=i.context.scrollLeft),(n=i.menu.offset.left-i.context.offset.left+i.menu.width>=i.context.scrollLeft+i.context.width)&&(C.verbose("Dropdown cannot fit in context rightward",n),o=!1),a.removeClass(S.loading),o},click:function(){return c||"click"==k.on},extendSelect:function(){return k.allowAdditions||k.apiSettings},show:function(){return!C.is.disabled()&&(C.has.items()||C.has.message())},useAPI:function(){return void 0!==e.fn.api}},animate:{show:function(t,n){var i,a=n||U,o=n?function(){}:function(){C.hideSubMenus(),C.hideOthers(),C.set.active()};t=e.isFunction(t)?t:function(){},C.verbose("Doing menu show animation",a),C.set.direction(n),i=C.get.transition(n),C.is.selection()&&C.set.scrollPosition(C.get.selectedItem(),!0),(C.is.hidden(a)||C.is.animating(a))&&("none"==i?(o(),a.transition("show"),t.call(X)):void 0!==e.fn.transition&&j.transition("is supported")?a.transition({animation:i+" in",debug:k.debug,verbose:k.verbose,duration:k.duration,queue:!0,onStart:o,onComplete:function(){t.call(X)}}):C.error(I.noTransition,i))},hide:function(t,n){var i=n||U,a=(n?k.duration:k.duration,n?function(){}:function(){C.can.click()&&C.unbind.intent(),C.remove.active()}),o=C.get.transition(n);t=e.isFunction(t)?t:function(){},(C.is.visible(i)||C.is.animating(i))&&(C.verbose("Doing menu hide animation",i),"none"==o?(a(),i.transition("hide"),t.call(X)):void 0!==e.fn.transition&&j.transition("is supported")?i.transition({animation:o+" out",duration:k.duration,debug:k.debug,verbose:k.verbose,queue:!1,onStart:a,onComplete:function(){t.call(X)}}):C.error(I.transition))}},hideAndClear:function(){C.remove.searchTerm(),C.has.maxSelections()||(C.has.search()?C.hide((function(){C.remove.filteredItem()})):C.hide())},delay:{show:function(){C.verbose("Delaying show event to ensure user intent"),clearTimeout(C.timer),C.timer=setTimeout(C.show,k.delay.show)},hide:function(){C.verbose("Delaying hide event to ensure user intent"),clearTimeout(C.timer),C.timer=setTimeout(C.hide,k.delay.hide)}},escape:{value:function(t){var n=e.isArray(t),i="string"==typeof t,a=!i&&!n,o=i&&-1!==t.search(D.quote),r=[];return a||!o?t:(C.debug("Encoding quote values for use in select",t),n?(e.each(t,(function(e,t){r.push(t.replace(D.quote,"&quot;"))})),r):t.replace(D.quote,"&quot;"))},string:function(e){return(e=String(e)).replace(D.escape,"\\$&")}},setting:function(t,n){if(C.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,k,t);else{if(void 0===n)return k[t];e.isPlainObject(k[t])?e.extend(!0,k[t],n):k[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,C,t);else{if(void 0===n)return C[t];C[t]=n}},debug:function(){!k.silent&&k.debug&&(k.performance?C.performance.log(arguments):(C.debug=Function.prototype.bind.call(console.info,console,k.name+":"),C.debug.apply(console,arguments)))},verbose:function(){!k.silent&&k.verbose&&k.debug&&(k.performance?C.performance.log(arguments):(C.verbose=Function.prototype.bind.call(console.info,console,k.name+":"),C.verbose.apply(console,arguments)))},error:function(){k.silent||(C.error=Function.prototype.bind.call(console.error,console,k.name+":"),C.error.apply(console,arguments))},performance:{log:function(e){var t,n;k.performance&&(n=(t=(new Date).getTime())-(l||t),l=t,d.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:X,"Execution Time":n})),clearTimeout(C.performance.timer),C.performance.timer=setTimeout(C.performance.display,500)},display:function(){var t=k.name+":",n=0;l=!1,clearTimeout(C.performance.timer),e.each(d,(function(e,t){n+=t["Execution Time"]})),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),(void 0!==console.group||void 0!==console.table)&&d.length>0&&(console.groupCollapsed(t),console.table?console.table(d):e.each(d,(function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")})),console.groupEnd()),d=[]}},invoke:function(t,n,i){var o,r,s,c=G;return n=n||f,i=X||i,"string"==typeof t&&void 0!==c&&(t=t.split(/[\. ]/),o=t.length-1,e.each(t,(function(n,i){var a=n!=o?i+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=o)c=c[a];else{if(void 0!==c[a])return r=c[a],!1;if(!e.isPlainObject(c[i])||n==o)return void 0!==c[i]?(r=c[i],!1):(C.error(I.method,t),!1);c=c[i]}}))),e.isFunction(r)?s=r.apply(i,n):void 0!==r&&(s=r),e.isArray(a)?a.push(s):void 0!==a?a=[a,s]:void 0!==s&&(a=s),r}},h?(void 0===G&&C.initialize(),C.invoke(u)):(void 0!==G&&G.invoke("destroy"),C.initialize())})),void 0!==a?a:o},e.fn.dropdown.settings={silent:!1,debug:!1,verbose:!1,performance:!0,on:"click",action:"activate",values:!1,apiSettings:!1,selectOnKeydown:!0,minCharacters:0,filterRemoteData:!1,saveRemoteData:!0,throttle:200,context:t,direction:"auto",keepOnScreen:!0,match:"both",fullTextSearch:!1,placeholder:"auto",preserveHTML:!0,sortSelect:!1,forceSelection:!0,allowAdditions:!1,ignoreCase:!1,hideAdditions:!0,maxSelections:!1,useLabels:!0,delimiter:",",showOnFocus:!0,allowReselection:!1,allowTab:!0,allowCategorySelection:!1,fireOnInit:!1,transition:"auto",duration:200,glyphWidth:1.037,label:{transition:"scale",duration:200,variation:!1},delay:{hide:300,show:200,search:20,touch:50},onChange:function(e,t,n){},onAdd:function(e,t,n){},onRemove:function(e,t,n){},onLabelSelect:function(e){},onLabelCreate:function(t,n){return e(this)},onLabelRemove:function(e){return!0},onNoResults:function(e){return!0},onShow:function(){},onHide:function(){},name:"Dropdown",namespace:"dropdown",message:{addResult:"Add <b>{term}</b>",count:"{count} selected",maxSelections:"Max {maxCount} selections",noResults:"No results found.",serverError:"There was an error contacting the server"},error:{action:"You called a dropdown action that was not defined",alreadySetup:"Once a select has been initialized behaviors must be called on the created ui dropdown",labels:"Allowing user additions currently requires the use of labels.",missingMultiple:"<select> requires multiple property to be set to correctly preserve multiple values",method:"The method you called is not defined.",noAPI:"The API module is required to load resources remotely",noStorage:"Saving remote data requires session storage",noTransition:"This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>"},regExp:{escape:/[-[\]{}()*+?.,\\^$|#\s]/g,quote:/"/g},metadata:{defaultText:"defaultText",defaultValue:"defaultValue",placeholderText:"placeholder",text:"text",value:"value"},fields:{remoteValues:"results",values:"values",disabled:"disabled",name:"name",value:"value",text:"text"},keys:{backspace:8,delimiter:188,deleteKey:46,enter:13,escape:27,pageUp:33,pageDown:34,leftArrow:37,upArrow:38,rightArrow:39,downArrow:40},selector:{addition:".addition",dropdown:".ui.dropdown",hidden:".hidden",icon:"> .dropdown.icon",input:'> input[type="hidden"], > select',item:".item",label:"> .label",remove:"> .label > .delete.icon",siblingLabel:".label",menu:".menu",message:".message",menuIcon:".dropdown.icon",search:"input.search, .menu > .search > input, .menu input.search",sizer:"> input.sizer",text:"> .text:not(.icon)",unselectable:".disabled, .filtered"},className:{active:"active",addition:"addition",animating:"animating",disabled:"disabled",empty:"empty",dropdown:"ui dropdown",filtered:"filtered",hidden:"hidden transition",item:"item",label:"ui label",loading:"loading",menu:"menu",message:"message",multiple:"multiple",placeholder:"default",sizer:"sizer",search:"search",selected:"selected",selection:"selection",upward:"upward",leftward:"left",visible:"visible"}},e.fn.dropdown.settings.templates={dropdown:function(t){var n=t.placeholder||!1,i=(t.values,"");return i+='<i class="dropdown icon"></i>',t.placeholder?i+='<div class="default text">'+n+"</div>":i+='<div class="text"></div>',i+='<div class="menu">',e.each(t.values,(function(e,t){i+=t.disabled?'<div class="disabled item" data-value="'+t.value+'">'+t.name+"</div>":'<div class="item" data-value="'+t.value+'">'+t.name+"</div>"})),i+="</div>"},menu:function(t,n){var i=t[n.values]||{},a="";return e.each(i,(function(e,t){var i=t[n.text]?'data-text="'+t[n.text]+'"':"",o=t[n.disabled]?"disabled ":"";a+='<div class="'+o+'item" data-value="'+t[n.value]+'"'+i+">",a+=t[n.name],a+="</div>"})),a},label:function(e,t){return t+'<i class="delete icon"></i>'},message:function(e){return e},addition:function(e){return e}}}(jQuery,window,document)},function(e,t,n){"use strict";n.r(t);n(3);var i=n(0),a=n.n(i),o=n(1),r=n.n(o);$((function(){var e,t,i,o,s;return a.a.async((function(c){for(;;)switch(c.prev=c.next){case 0:if(e=document.getElementById("graph-canvas")){c.next=3;break}return c.abrupt("return");case 3:return c.next=5,a.a.awrap(Promise.all([n.e(0).then(n.bind(null,13)),n.e(0).then(n.t.bind(null,14,7))]));case 5:t=c.sent,i=r()(t,1),o=i[0].default,s=[],$("#graph-raw-list li span.node-relation").each((function(){s.push($(this).text())})),o(e,s);case 11:case"end":return c.stop()}}))}));var s,c,l,d,u;n(8);function h(e){return jQuery("<div />").text(e).html()}function f(e){var t=e.find(".tabular.menu");t.find(".item").tab(),t.find('.item[data-tab="'.concat(t.data("preview"),'"]')).click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,mode:"gfm",context:n.data("context"),text:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("preview"),'"]'));i.html(n),emojify.run(i[0]),$("pre code",i[0]).each((function(){hljs.highlightBlock(this)}))}))})),S()}function m(){var e,t;0!==$(".edit.form").length&&(!function(e){var t=e.find(".tabular.menu");t.find(".item").tab();var n=t.find('.item[data-tab="'.concat(t.data("preview"),'"]'));n.length&&(l=n.data("preview-file-modes").split(","),n.click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,mode:"gfm",context:n.data("context"),text:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("preview"),'"]'));i.html(n),emojify.run(i[0]),$("pre code",i[0]).each((function(){hljs.highlightBlock(this)}))}))})))}($(".edit.form")),e=$(".edit.form"),(t=e.find(".tabular.menu")).find(".item").tab(),t.find('.item[data-tab="'.concat(t.data("diff"),'"]')).click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,context:n.data("context"),content:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("diff"),'"]'));i.html(n),emojify.run(i[0])}))})))}function v(e,t,n,i){return new Promise((function(a){$.ajax({type:"POST",url:e,data:{_csrf:s,action:t,issue_ids:n,id:i},success:a})}))}function p(){window.location.reload()}function g(e){e.each((function(){var e=this;e.addEventListener("paste",(function(t){!function(e,t){if(e.clipboardData){var n=e.clipboardData.items;if(void 0!==n)for(var i=0;i<n.length;i++)if(-1!==n[i].type.indexOf("image")){var a=n[i].getAsFile();"function"==typeof t&&(e.preventDefault(),e.stopPropagation(),t(a))}}}(t,(function(t){var n=t.name.substr(0,t.name.lastIndexOf("."));!function(e,t){if(e.selectionStart||0===e.selectionStart){var n=e.selectionStart,i=e.selectionEnd;e.value=e.value.substring(0,n)+t+e.value.substring(i,e.value.length),e.selectionStart=n+t.length,e.selectionEnd=n+t.length}else e.value+=t}(e,"![".concat(n,"]()")),function(e,t){var n=new XMLHttpRequest;n.onload=function(){200===n.status&&t(n.responseText)},n.open("post","".concat(c,"/attachments"),!0),n.setRequestHeader("X-Csrf-Token",s);var i=new FormData;i.append("file",e,e.name),n.send(i)}(t,(function(t){var i=JSON.parse(t);!function(e,t,n){if(e.selectionStart||0===e.selectionStart){var i=e.selectionStart,a=e.selectionEnd;e.value=e.value.replace(t,n),e.selectionStart=i+n.length-t.length,e.selectionEnd=a+n.length-t.length}else e.value=e.value.replace(t,n)}(e,"![".concat(n,"]()"),"![".concat(n,"](").concat(c,"/attachments/").concat(i.uuid,")"));var a=$('<input id="'.concat(i.uuid,'" name="files" type="hidden">')).val(i.uuid);$(".files").append(a)}))}))}),!1)}))}function b(){var e;0!==$(".comment.form").length&&((e=$(".ui.select-branch")).find(".reference-list-menu").find(".item:not(.no-select)").click((function(){var t=$(this).data("id");$($(this).data("id-selector")).val(t),e.find(".ui .branch-name").text(t)})),e.find(".reference.column").click((function(){return e.find(".scrolling.reference-list-menu").css("display","none"),e.find(".reference .text").removeClass("black"),$($(this).data("target")).css("display","block"),$(this).find(".text").addClass("black"),!1})),f($(".comment.form")),g($(".comment.form textarea")),t("select-label","labels"),t("select-assignees","assignees"),t("select-assignees-modify","assignees"),n(".select-milestone","#milestone_id"),n(".select-assignee","#assignee_id"));function t(e,t){var n=$(".ui.".concat(t,".list")),i=n.find(".no-select"),a=$(".".concat(e," .menu")),o="update"===a.data("action"),r={};$(".".concat(e)).dropdown("setting","onHide",(function(){if(o="update"===a.data("action")){var e=[];Object.keys(r).forEach((function(t){var n=r[t],i=v(n["update-url"],n.action,n["issue-id"],t);e.push(i)})),Promise.all(e).then(p)}})),a.find(".item:not(.no-select)").click((function(){if("select-assignees-modify"===e)return $(this).hasClass("checked")?($(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check")):($(this).addClass("checked"),$(this).find(".octicon").addClass("octicon-check")),v(a.data("update-url"),"",a.data("issue-id"),$(this).data("id")),a.data("action","update"),!1;$(this).hasClass("checked")?($(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check"),o&&($(this).data("id")in r?delete r[$(this).data("id")]:r[$(this).data("id")]={"update-url":a.data("update-url"),action:"detach","issue-id":a.data("issue-id")})):($(this).addClass("checked"),$(this).find(".octicon").addClass("octicon-check"),o&&($(this).data("id")in r?delete r[$(this).data("id")]:r[$(this).data("id")]={"update-url":a.data("update-url"),action:"attach","issue-id":a.data("issue-id")}));var t=[];return $(this).parent().find(".item").each((function(){$(this).hasClass("checked")?(t.push($(this).data("id")),$($(this).data("id-selector")).removeClass("hide")):$($(this).data("id-selector")).addClass("hide")})),0===t.length?i.removeClass("hide"):i.addClass("hide"),$($(this).parent().data("id")).val(t.join(",")),!1})),a.find(".no-select.item").click((function(){(o||"select-assignees-modify"===e)&&v(a.data("update-url"),"clear",a.data("issue-id"),"").then(p),$(this).parent().find(".item").each((function(){$(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check")})),n.find(".item").each((function(){$(this).addClass("hide")})),i.removeClass("hide"),$($(this).parent().data("id")).val("")}))}function n(e,t){var n=$("".concat(e," .menu")),i=$(".ui".concat(e,".list")),a="update"===n.data("action");n.find(".item:not(.no-select)").click((function(){switch($(this).parent().find(".item").each((function(){$(this).removeClass("selected active")})),$(this).addClass("selected active"),a&&v(n.data("update-url"),"",n.data("issue-id"),$(this).data("id")).then(p),t){case"#milestone_id":i.find(".selected").html('<a class="item" href='.concat($(this).data("href"),">").concat(h($(this).text()),"</a>"));break;case"#assignee_id":i.find(".selected").html('<a class="item" href='.concat($(this).data("href"),">")+'<img class="ui avatar image" src='.concat($(this).data("avatar"),">").concat(h($(this).text()),"</a>"))}$(".ui".concat(e,".list .no-select")).addClass("hide"),$(t).val($(this).data("id"))})),n.find(".no-select.item").click((function(){$(this).parent().find(".item:not(.no-select)").each((function(){$(this).removeClass("selected active")})),a&&v(n.data("update-url"),"",n.data("issue-id"),$(this).data("id")).then(p),i.find(".selected").html(""),i.find(".no-select").removeClass("hide"),$(t).val("")}))}}function w(){if(0!==$(".repository").length){if(($(".repository.file.list").length>0||".repository.commits".length>0)&&$(".choose.reference .dropdown").each((function(){var e=$(this).find(".data"),t={items:[],mode:e.data("mode"),searchTerm:"",noResults:"",canCreateBranch:!1,menuVisible:!1,active:0};e.find(".item").each((function(){t.items.push({name:$(this).text(),url:$(this).data("url"),branch:$(this).hasClass("branch"),tag:$(this).hasClass("tag"),selected:$(this).hasClass("selected")})})),e.remove(),new Vue({delimiters:["${","}"],el:this,data:t,beforeMount:function(){var e=this;this.noResults=e.$el.getAttribute("data-no-results"),this.canCreateBranch="true"===e.$el.getAttribute("data-can-create-branch"),document.body.addEventListener("click",(function(t){e.$el.contains(t.target)||e.menuVisible&&Vue.set(e,"menuVisible",!1)}))},watch:{menuVisible:function(e){e&&this.focusSearchField()}},computed:{filteredItems:function(){var e=this,t=e.items.filter((function(t){return("branches"===e.mode&&t.branch||"tags"===e.mode&&t.tag)&&(!e.searchTerm||t.name.toLowerCase().indexOf(e.searchTerm.toLowerCase())>=0)}));return e.active=0===t.length&&e.showCreateNewBranch?0:-1,t},showNoResults:function(){return 0===this.filteredItems.length&&!this.showCreateNewBranch},showCreateNewBranch:function(){var e=this;return!(!this.canCreateBranch||!e.searchTerm||"tags"===e.mode)&&0===e.items.filter((function(t){return t.name.toLowerCase()===e.searchTerm.toLowerCase()})).length}},methods:{selectItem:function(e){var t=this.getSelected();null!==t&&(t.selected=!1),e.selected=!0,window.location.href=e.url},createNewBranch:function(){this.showCreateNewBranch&&this.$refs.newBranchForm.submit()},focusSearchField:function(){var e=this;Vue.nextTick((function(){e.$refs.searchField.focus()}))},getSelected:function(){for(var e=0,t=this.items.length;e<t;++e)if(this.items[e].selected)return this.items[e];return null},getSelectedIndexInFiltered:function(){for(var e=0,t=this.filteredItems.length;e<t;++e)if(this.filteredItems[e].selected)return e;return-1},scrollToActive:function(){var e=this.$refs["listItem".concat(this.active)];if(e&&0!==e.length){Array.isArray(e)&&(e=e[0]);var t=this.$refs.scrollContainer;e.offsetTop<t.scrollTop?t.scrollTop=e.offsetTop:e.offsetTop+e.clientHeight>t.scrollTop+t.clientHeight&&(t.scrollTop=e.offsetTop+e.clientHeight-t.clientHeight)}},keydown:function(e){var t=this;if(40===e.keyCode){if(e.preventDefault(),-1===t.active&&(t.active=t.getSelectedIndexInFiltered()),t.active+(t.showCreateNewBranch?0:1)>=t.filteredItems.length)return;t.active++,t.scrollToActive()}if(38===e.keyCode){if(e.preventDefault(),-1===t.active&&(t.active=t.getSelectedIndexInFiltered()),t.active<=0)return;t.active--,t.scrollToActive()}13===e.keyCode&&(e.preventDefault(),t.active>=t.filteredItems.length?t.createNewBranch():t.active>=0&&t.selectItem(t.filteredItems[t.active])),27===e.keyCode&&(e.preventDefault(),t.menuVisible=!1)}}})})),$(".repository.wiki.view").length>0&&l(".choose.page .dropdown"),$(".repository.settings.options").length>0&&($("#repo_name").keyup((function(){var e=$("#repo-name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("name").toString().toLowerCase()?e.show():e.hide()})),$(".enable-system").change((function(){this.checked?($($(this).data("target")).removeClass("disabled"),$(this).data("context")||$($(this).data("context")).addClass("disabled")):($($(this).data("target")).addClass("disabled"),$(this).data("context")||$($(this).data("context")).removeClass("disabled"))})),$(".enable-system-radio").change((function(){"false"===this.value?($($(this).data("target")).addClass("disabled"),void 0!==$(this).data("context")&&$($(this).data("context")).removeClass("disabled")):"true"===this.value&&($($(this).data("target")).removeClass("disabled"),void 0!==$(this).data("context")&&$($(this).data("context")).addClass("disabled"))}))),$(".repository.labels").length>0){var e=$(".new-label.segment");$(".new-label.button").click((function(){e.show()})),$(".new-label.segment .cancel").click((function(){e.hide()})),$(".color-picker").each((function(){$(this).minicolors()})),$(".precolors .color").click((function(){var e=$(this).data("color-hex");$(".color-picker").val(e),$(".minicolors-swatch-color").css("background-color",e)})),$(".edit-label-button").click((function(){return $("#label-modal-id").val($(this).data("id")),$(".edit-label .new-label-input").val($(this).data("title")),$(".edit-label .new-label-desc-input").val($(this).data("description")),$(".edit-label .color-picker").val($(this).data("color")),$(".minicolors-swatch-color").css("background-color",$(this).data("color")),$(".edit-label.modal").modal({onApprove:function(){$(".edit-label.form").submit()}}).modal("show"),!1}))}if($(".repository.new.milestone").length>0){var t=$(".milestone.datepicker");t.datetimepicker({lang:t.data("lang"),inline:!0,timepicker:!1,startDate:t.data("start-date"),formatDate:"Y-m-d",onSelectDate:function(e){$("#deadline").val(e.dateFormat("Y-m-d"))}}),$("#clear-date").click((function(){return $("#deadline").val(""),!1}))}if($(".repository.view.issue").length>0){var n=$("#issue-title"),i=$("#edit-title-input input"),a=function(){return n.toggle(),$(".not-in-edit").toggle(),$("#edit-title-input").toggle(),$(".in-edit").toggle(),i.focus(),!1};$("#edit-title").click(a),$("#cancel-edit-title").click(a),$("#save-edit-title").click(a).click((function(){return 0===i.val().length||i.val()===n.text()?(i.val(n.text()),!1):($.post($(this).data("update-url"),{_csrf:s,title:i.val()},(function(e){i.val(e.title),n.text(e.title),p()})),!1)})),$(".context-dropdown").dropdown({action:"hide"}),$(".quote-reply").click((function(e){$(this).closest(".dropdown").find(".menu").toggle("visible");var t,n=$(this).data("target");if($(this).hasClass("quote-reply-diff")){var i=$(this).closest(".comment-code-cloud");i.find("button.comment-form-reply").click(),t=i.find('[name="content"]')}else t=$("#content");var a=$("#comment-".concat(n)).text().replace(/\n/g,"\n> "),o="> ".concat(a,"\n\n");""!==t.val()?t.val("".concat(t.val(),"\n\n").concat(o)):t.val("".concat(o)),t.focus(),e.preventDefault()})),$(".edit-content").click((function(e){$(this).closest(".dropdown").find(".menu").toggle("visible");var t,n=$(this).closest(".header").next(),i=n.find(".edit-content-zone"),a=n.find(".render-content"),o=n.find(".raw-content");if(0===i.html().length){i.html($("#edit-content-form").html()),t=i.find("textarea"),issuesTribute.attach(t.get()),emojiTribute.attach(t.get());var r=i.find(".dropzone");r.data("saved",!1);var c=i.find(".comment-files");if(r.length>0){var l={};r.dropzone({url:r.data("upload-url"),headers:{"X-Csrf-Token":s},maxFiles:r.data("max-file"),maxFilesize:r.data("max-size"),acceptedFiles:"*/*"===r.data("accepts")?null:r.data("accepts"),addRemoveLinks:!0,dictDefaultMessage:r.data("default-message"),dictInvalidFileType:r.data("invalid-input-type"),dictFileTooBig:r.data("file-too-big"),dictRemoveFile:r.data("remove-file"),init:function(){this.on("success",(function(e,t){l[e.name]={uuid:t.uuid,submitted:!1};var n=$('<input id="'.concat(t.uuid,'" name="files" type="hidden">')).val(t.uuid);c.append(n)})),this.on("removedfile",(function(e){e.name in l&&($("#".concat(l[e.name].uuid)).remove(),r.data("remove-url")&&r.data("csrf")&&!l[e.name].submitted&&$.post(r.data("remove-url"),{file:l[e.name].uuid,_csrf:r.data("csrf")}))})),this.on("submit",(function(){$.each(l,(function(e){l[e].submitted=!0}))})),this.on("reload",(function(){$.getJSON(i.data("attachment-url"),(function(e){var t=r.get(0).dropzone;t.removeAllFiles(!0),c.empty(),$.each(e,(function(){var e="".concat(r.data("upload-url"),"/").concat(this.uuid);t.emit("addedfile",this),t.emit("thumbnail",this,e),t.emit("complete",this),t.files.push(this),l[this.name]={submitted:!0,uuid:this.uuid},r.find("img[src='".concat(e,"']")).css("max-width","100%");var n=$('<input id="'.concat(this.uuid,'" name="files" type="hidden">')).val(this.uuid);c.append(n)}))}))}))}}),r.get(0).dropzone.emit("reload")}var d=i.find(".ui.comment.form"),u=d.find(".tabular.menu");u.attr("data-write",i.data("write")),u.attr("data-preview",i.data("preview")),u.find(".write.item").attr("data-tab",i.data("write")),u.find(".preview.item").attr("data-tab",i.data("preview")),d.find(".write.segment").attr("data-tab",i.data("write")),d.find(".preview.segment").attr("data-tab",i.data("preview")),f(d),i.find(".cancel.button").click((function(){a.show(),i.hide(),r.get(0).dropzone.emit("reload")})),i.find(".save.button").click((function(){a.show(),i.hide();var e=c.find("[name=files]").map((function(){return $(this).val()})).get();$.post(i.data("update-url"),{_csrf:s,content:t.val(),context:i.data("context"),files:e},(function(e){0===e.length?a.html($("#no-content").html()):(a.html(e.content),emojify.run(a[0]),$("pre code",a[0]).each((function(){hljs.highlightBlock(this)})));var t=n.parent();t.find(".ui.small.images").length?""===e.attachments?t.find(".ui.small.images").parent().remove():t.find(".ui.small.images").html(e.attachments):""!==e.attachments&&(t.append('<div class="ui bottom attached segment"><div class="ui small images"></div></div>'),t.find(".ui.small.images").html(e.attachments)),r.get(0).dropzone.emit("submit"),r.get(0).dropzone.emit("reload")}))}))}else t=n.find("textarea");i.show(),a.hide(),0===t.val().length&&t.val(o.text()),t.focus(),e.preventDefault()})),$(".delete-comment").click((function(){var e=$(this);return window.confirm(e.data("locale"))&&$.post(e.data("url"),{_csrf:s}).success((function(){$("#".concat(e.data("comment-id"))).remove()})),!1}));var o=$("#status-button");$("#comment-form .edit_area").keyup((function(){0===$(this).val().length?o.text(o.data("status")):o.text(o.data("status-and-comment"))})),o.click((function(){$("#status").val(o.data("status-val")),$("#comment-form").submit()}));var r=$(".merge-button > button");r.on("click",(function(e){e.preventDefault(),$(".".concat($(this).data("do"),"-fields")).show(),$(this).parent().hide()})),$(".merge-button > .dropdown").dropdown({onChange:function(e,t,n){n.data("do")&&(r.find(".button-text").text(n.text()),r.data("do",n.data("do")))}}),$(".merge-cancel").on("click",(function(e){e.preventDefault(),$(this).closest(".form").hide(),r.parent().show()})),function e(t){var n="";t||(t=$(document),n=".reactions > "),t.find("".concat(n,"a.label")).popup({position:"bottom left",metadata:{content:"title",title:"none"}}),t.find(".select-reaction > .menu > .item, ".concat(n,"a.label")).on("click",(function(t){var n=this;if(t.preventDefault(),!$(this).hasClass("disabled")){var i=$(this).hasClass("item")?$(this).closest(".select-reaction").data("action-url"):$(this).data("action-url"),a="".concat(i,"/").concat($(this).hasClass("blue")?"unreact":"react");$.ajax({type:"POST",url:a,data:{_csrf:s,content:$(this).data("content")}}).done((function(t){if(t&&(t.html||t.empty)){var i=$(n).closest(".content"),a=i.find(".segment.reactions");if(!t.empty&&a.length>0&&a.remove(),!t.empty){a=$('<div class="ui attached segment reactions"></div>');var o=i.find(".segment.bottom:first");o.length>0?a.insertBefore(o):a.appendTo(i),a.html(t.html);for(var r=a.find(".has-emoji"),s=0;s<r.length;s++)emojify.run(r.get(s));a.find(".dropdown").dropdown(),e(a)}}}))}}))}()}$(".repository.diff").length>0&&$(".diff-counter").each((function(){var e=$(this),t=e.find("span[data-line].add").data("line"),n=e.find("span[data-line].del").data("line"),i=parseFloat(t)/(parseFloat(t)+parseFloat(n))*100;e.find(".bar .add").css("width","".concat(i,"%"))})),$("#repo-clone-ssh").click((function(){$(".clone-url").text($(this).data("link")),$("#repo-clone-url").val($(this).data("link")),$(this).addClass("blue"),$("#repo-clone-https").removeClass("blue"),localStorage.setItem("repo-clone-protocol","ssh")})),$("#repo-clone-https").click((function(){$(".clone-url").text($(this).data("link")),$("#repo-clone-url").val($(this).data("link")),$(this).addClass("blue"),$("#repo-clone-ssh").removeClass("blue"),localStorage.setItem("repo-clone-protocol","https")})),$("#repo-clone-url").click((function(){$(this).select()}));var c=$(".repository.compare.pull");c.length>0&&(l(".choose.branch .dropdown"),c.find("button.show-form").on("click",(function(e){e.preventDefault(),c.find(".pullrequest-form").show(),$(this).parent().hide()}))),$(".repository.settings.branches").length>0&&(l(".protected-branches .dropdown"),$(".enable-protection, .enable-whitelist").change((function(){this.checked?$($(this).data("target")).removeClass("disabled"):$($(this).data("target")).addClass("disabled")})))}function l(e){var t=$(e);t.dropdown({fullTextSearch:!0,selectOnKeydown:!1,onChange:function(e,t,n){n.data("url")&&(window.location.href=n.data("url"))},message:{noResults:t.data("no-results")}})}}function y(e){var t=Math.floor(Math.random()*Math.floor(1e6));return e.attr("data-write",e.attr("data-write")+t),e.attr("data-preview",e.attr("data-preview")+t),e.find(".item").each((function(){var e=$(this).attr("data-tab")+t;$(this).attr("data-tab",e)})),e.parent().find("*[data-tab='write']").attr("data-tab","write".concat(t)),e.parent().find("*[data-tab='preview']").attr("data-tab","preview".concat(t)),f(e.parent(".form")),t}function x(){$(".access-mode.menu .item").click((function(){var e=$(this).parent();$.post(e.data("url"),{_csrf:s,uid:e.data("uid"),mode:$(this).data("value")})}))}function C(){$(".js-quick-pull-choice-option").change((function(){"commit-to-new-branch"===$(this).val()?($(".quick-pull-branch-name").show(),$(".quick-pull-branch-name input").prop("required",!0)):($(".quick-pull-branch-name").hide(),$(".quick-pull-branch-name input").prop("required",!1)),$("#commit-button").text($(this).attr("button_text"))}));var e=$("#file-name");e.keyup((function(e){var t,n,i=$(".breadcrumb span.section"),a=$(".breadcrumb div.divider");if(8===e.keyCode&&0===$(this).getCursorPosition()&&i.length>0&&(t=i.last().find("a").text(),$(this).val(t+$(this).val()),$(this)[0].setSelectionRange(t.length,t.length),i.last().remove(),a.last().remove()),191===e.keyCode){n=$(this).val().split("/");for(var o=0;o<n.length;++o)t=n[o],o<n.length-1?t.length&&($('<span class="section"><a href="#">'.concat(t,"</a></span>")).insertBefore($(this)),$('<div class="divider"> / </div>').insertBefore($(this))):$(this).val(t),$(this)[0].setSelectionRange(0,0)}n=[],$(".breadcrumb span.section").each((function(){var e=$(this);e.find("a").length?n.push(e.find("a").text()):n.push(e.text())})),$(this).val()&&n.push($(this).val()),$("#tree_path").val(n.join("/"))})).trigger("keyup");var t=$(".repository.editor textarea#edit_area");if(t.length){var n=t.data("markdown-file-exts").split(","),i=t.data("line-wrap-extensions").split(",");e.on("keyup",(function(){var a,o,r,c,h,f,m=e.val();r=c="";var v=/.+\.([^.]+)$/.exec(m);v&&(r=v[1],c=".".concat(r));var p=CodeMirror.findModeByExtension(r),g=$("a[data-tab=preview]");if(p?(a=p.mode,o=p.mime,f=a):f=r,g.length&&f&&l&&l.length&&l.indexOf(f)>=0?(h=g.data("url"),g.data("url",h.replace(/(.*)\/.*/i,"$1/".concat(a))),g.show()):g.hide(),!(n.indexOf(c)>=0&&function(e){return u&&(u.toTextArea(),u=null),!!d||(d=new SimpleMDE({autoDownloadFontAwesome:!1,element:e[0],forceSync:!0,renderingConfig:{singleLineBreaks:!1},indentWithTabs:!1,tabSize:4,spellChecker:!1,previewRender:function(t,n){return setTimeout((function(){$.post(e.data("url"),{_csrf:s,mode:"gfm",context:e.data("context"),text:t},(function(e){n.innerHTML='<div class="markdown ui segment">'.concat(e,"</div>"),emojify.run($(".editor-preview")[0])}))}),0),"Loading..."},toolbar:["bold","italic","strikethrough","|","heading-1","heading-2","heading-3","heading-bigger","heading-smaller","|","code","quote","|","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","clean-block","preview","fullscreen","side-by-side"]}),!0)}(t))&&(u||function(e){return d&&(d.toTextArea(),d=null),!!u||((u=CodeMirror.fromTextArea(e[0],{lineNumbers:!0})).on("change",(function(t,n){e.val(t.getValue())})),!0)}(t))){a&&(u.setOption("mode",o),CodeMirror.autoLoadMode(u,a)),i.indexOf(c)>=0?u.setOption("lineWrapping",!0):u.setOption("lineWrapping",!1);var b=e.val();0!==b.length&&(b=(b=b.split("/"))[b.length-1],$.getJSON(e.data("ec-url-prefix")+b,(function(e){"tab"===e.indent_style?(u.setOption("indentWithTabs",!0),u.setOption("extraKeys",{})):(u.setOption("indentWithTabs",!1),u.setOption("extraKeys",{Tab:function(e){var t=Array(parseInt(e.getOption("indentUnit"))+1).join(" ");e.replaceSelection(t)}})),u.setOption("indentUnit",e.indent_size||4),u.setOption("tabSize",e.tab_width||4)})))}})).trigger("keyup");var a=$("#commit-button"),o=$(".ui.edit.form");a.prop("disabled",!0),o.areYouSure({silent:!0,dirtyClass:"dirty-file",fieldSelector:":input:not(.commit-form-wrapper :input)",change:function(){var e=$(this).hasClass("dirty-file");a.prop("disabled",!e)}}),a.click((function(e){0===t.val().length&&($("#edit-empty-content-modal").modal({onApprove:function(){$(".edit.form").submit()}}).modal("show"),e.preventDefault())}))}}function k(){$(".user.settings.profile").length>0&&$("#username").keyup((function(){var e=$("#name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("name").toString().toLowerCase()?e.show():e.hide()}))}function S(){$(".ui.button").keypress((function(e){13!==e.keyCode&&32!==e.keyCode||$(this).click()}))}function _(){$(".code-view .linenums").length>0&&($(document).on("click",".lines-num span",(function(e){var t=$(this),n=t.parent().siblings(".lines-code").find("ol.linenums > li");O(n,n.filter("[rel=".concat(t.attr("id"),"]")),e.shiftKey?n.filter(".active").eq(0):null),window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()})),$(window).on("hashchange",(function(){var e,t=window.location.hash.match(/^#(L\d+)-(L\d+)$/),n=$(".code-view ol.linenums > li");if(t)return e=n.filter(".".concat(t[1])),O(n,e,n.filter(".".concat(t[2]))),void $("html, body").scrollTop(e.offset().top-200);(t=window.location.hash.match(/^#(L|n)(\d+)$/))&&(e=n.filter(".L".concat(t[2])),O(n,e),$("html, body").scrollTop(e.offset().top-200))})).trigger("hashchange")),$(".ui.fold-code").on("click",(function(e){var t=$(e.target);t.hasClass("fa-chevron-down")?$(e.target).parent().next().slideUp("fast",(function(){t.removeClass("fa-chevron-down").addClass("fa-chevron-right")})):$(e.target).parent().next().slideDown("fast",(function(){t.removeClass("fa-chevron-right").addClass("fa-chevron-down")}))})),$(".ui.blob-excerpt").on("click",(function(e){!function e(t){var n=$(t.target),i=n.parent().parent();$.get("".concat(n.data("url"),"?").concat(n.data("query"),"&anchor=").concat(n.data("anchor")),(function(t){i.replaceWith(t),$('[data-anchor="'.concat(n.data("anchor"),'"]')).on("click",(function(t){e(t)}))}))}(e)}))}function T(e){$.ajax({url:"".concat(c,"/user/u2f/sign"),type:"POST",headers:{"X-Csrf-Token":s},data:JSON.stringify(e),contentType:"application/json; charset=utf-8"}).done((function(e){window.location.replace(e)})).fail((function(){L(1)}))}function A(e){(function(e){if(!("errorCode"in e))return!1;if(0===e.errorCode)return!1;return L(e.errorCode),!0})(e)||$.ajax({url:"".concat(c,"/user/settings/security/u2f/register"),type:"POST",headers:{"X-Csrf-Token":s},data:JSON.stringify(e),contentType:"application/json; charset=utf-8",success:function(){p()},fail:function(){L(1)}})}function L(e){var t={browser:$("#unsupported-browser"),1:$("#u2f-error-1"),2:$("#u2f-error-2"),3:$("#u2f-error-3"),4:$("#u2f-error-4"),5:$(".u2f-error-5")};t[e].removeClass("hide"),Object.keys(t).forEach((function(n){n!==e&&t[n].addClass("hide")})),$("#u2f-error").modal("show")}function q(){$.post("".concat(c,"/user/settings/security/u2f/request_register"),{_csrf:s,name:$("#nickname").val()}).success((function(e){$("#nickname").closest("div.field").removeClass("error"),$("#register-device").modal("show"),null===e.registeredKeys&&(e.registeredKeys=[]),u2fApi.register(e.appId,e.registerRequests,e.registeredKeys,30).then(A).catch((function(e){L(void 0!==e?e.metaData.code:1)}))})).fail((function(e){409===e.status&&$("#nickname").closest("div.field").addClass("error")}))}function D(e){window.history.pushState?window.history.pushState(null,null,e):window.location.hash=e}function O(e,t,n){if(e.removeClass("active"),n){var i,a=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1));if(a!==o){a>o&&(i=a,a=o,o=i);for(var r=[],s=a;s<=o;s++)r.push(".L".concat(s));return e.filter(r.join(",")).addClass("active"),void D("#L".concat(a,"-L").concat(o))}}t.addClass("active"),D("#".concat(t.attr("rel")))}function I(){var e=$(this),t="";e.attr("id")&&(t+="#".concat(e.attr("id")));var n=$(".delete.modal".concat(t));return n.find(".name").text(e.data("name")),n.modal({closable:!1,onApprove:function(){"form"!==e.data("type")?$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect})):$(e.data("form")).submit()}}).modal("show"),!1}function R(){var e=$(this),t="";e.attr("id")&&(t+="#".concat(e.attr("id")));var n=$(".addall.modal".concat(t));return n.find(".name").text(e.data("name")),n.modal({closable:!1,onApprove:function(){"form"!==e.data("type")?$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect})):$(e.data("form")).submit()}}).modal("show"),!1}"undefined"!=typeof Dropzone&&(Dropzone.autoDiscover=!1),$.fn.getCursorPosition=function(){var e=$(this).get(0),t=0;if("selectionStart"in e)t=e.selectionStart;else if("selection"in document){e.focus();var n=document.selection.createRange(),i=document.selection.createRange().text.length;n.moveStart("character",-e.value.length),t=n.text.length-i}return t},$(document).ready((function(){if(s=$("meta[name=_csrf]").attr("content"),c=$("meta[name=_suburl]").attr("content"),$(".time-since").each((function(){$(this).addClass("poping up").attr("data-content",$(this).attr("title")).attr("data-variation","inverted tiny").attr("title","")})),$(".dropdown:not(.custom)").dropdown(),$(".jump.dropdown").dropdown({action:"hide",onShow:function(){$(".poping.up").popup("hide")}}),$(".slide.up.dropdown").dropdown({transition:"slide up"}),$(".upward.dropdown").dropdown({direction:"upward"}),$(".ui.accordion").accordion(),$(".ui.checkbox").checkbox(),$(".ui.progress").progress({showActivity:!1}),$(".poping.up").popup(),$(".top.menu .poping.up").popup({onShow:function(){if($(".top.menu .menu.transition").hasClass("visible"))return!1}}),$(".tabular.menu .item").tab(),$(".tabable.menu .item").tab(),$(".toggle.button").click((function(){$($(this).data("target")).slideToggle(100)})),$("tr[data-href]").click((function(){window.location=$(this).data("href")})),"undefined"!=typeof hljs)for(var e=[].slice.call(document.querySelectorAll("pre code")||[]),t=0;t<e.length;t++)hljs.highlightBlock(e[t]);var n=$("#dropzone");if(n.length>0){var i={};new Dropzone("#dropzone",{url:n.data("upload-url"),headers:{"X-Csrf-Token":s},maxFiles:n.data("max-file"),maxFilesize:n.data("max-size"),acceptedFiles:"*/*"===n.data("accepts")?null:n.data("accepts"),addRemoveLinks:!0,dictDefaultMessage:n.data("default-message"),dictInvalidFileType:n.data("invalid-input-type"),dictFileTooBig:n.data("file-too-big"),dictRemoveFile:n.data("remove-file"),init:function(){this.on("success",(function(e,t){i[e.name]=t.uuid;var n=$('<input id="'.concat(t.uuid,'" name="files" type="hidden">')).val(t.uuid);$(".files").append(n)})),this.on("removedfile",(function(e){e.name in i&&$("#".concat(i[e.name])).remove(),n.data("remove-url")&&n.data("csrf")&&$.post(n.data("remove-url"),{file:i[e.name],_csrf:n.data("csrf")})}))}})}emojify.setConfig({img_dir:"".concat(c,"/vendor/plugins/emojify/images"),ignore_emoticons:!0});for(var a=document.getElementsByClassName("has-emoji"),o=0;o<a.length;o++){emojify.run(a[o]);for(var r=0;r<a[o].childNodes.length;r++)"A"===a[o].childNodes[r].nodeName&&emojify.run(a[o].childNodes[r])}var l,d,u,f,g,A,D,O,E,F,j,M,N,z,P,V=new Clipboard(".clipboard");if(V.on("success",(function(e){e.clearSelection(),$("#".concat(e.trigger.getAttribute("id"))).popup("destroy"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-success")),$("#".concat(e.trigger.getAttribute("id"))).popup("show"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-original"))})),V.on("error",(function(e){$("#".concat(e.trigger.getAttribute("id"))).popup("destroy"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-error")),$("#".concat(e.trigger.getAttribute("id"))).popup("show"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-original"))})),$(".delete-button").click(I),$(".add-all-button").click(R),$(".delete-branch-button").click(I),$(".undo-button").click((function(){var e=$(this);$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect}))})),$(".show-panel.button").click((function(){$($(this).data("panel")).show()})),$(".show-modal.button").click((function(){$($(this).data("modal")).modal("show")})),$(".delete-post.button").click((function(){var e=$(this);$.post(e.data("request-url"),{_csrf:s}).done((function(){window.location.href=e.data("done-url")}))})),$(".markdown").each((function(){var e={};$(this).find("h1, h2, h3, h4, h5, h6").each((function(){var t=$(this),n=encodeURIComponent(t.text().toLowerCase().replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g,"").replace(/[ ]/g,"-")),i=n;e[n]>0&&(i="".concat(n,"-").concat(e[n])),void 0===e[n]?e[n]=1:e[n]+=1,(t=t.wrap('<div id="'.concat(i,'" class="anchor-wrap" ></div>'))).append('<a class="anchor" href="#'.concat(i,'"><span class="octicon octicon-link"></span></a>'))}))})),$(".issue-checkbox").click((function(){$(".issue-checkbox").children("input:checked").length>0?($("#issue-filters").addClass("hide"),$("#issue-actions").removeClass("hide")):($("#issue-filters").removeClass("hide"),$("#issue-actions").addClass("hide"))})),$(".issue-action").click((function(){var e=this.dataset.action,t=this.dataset.elementId,n=$(".issue-checkbox").children("input:checked").map((function(){return this.dataset.issueId})).get().join(),i=this.dataset.url;"0"===t&&"/assignee"===i.substr(-9)&&(t="",e="clear"),v(i,e,n,t).then((function(){"close"!==e&&"open"!==e||$('.issue-checkbox input[type="checkbox"]').each((function(e,t){t.checked=!1})),p()}))})),$('.issue-checkbox input[type="checkbox"]:checked').first().each((function(e,t){t.checked=!1,$(t).click()})),S(),$("#search-user-box").search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/users/search?q={query}"),onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){var i=n.login;n.full_name&&n.full_name.length>0&&(i+=" (".concat(h(n.full_name),")")),t.push({title:i,image:n.avatar_url})})),{results:t}}},searchFields:["login","full_name"],showNoResults:!1}),(l=$("#search-team-box")).search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/orgs/").concat(l.data("org"),"/teams/search?q={query}"),headers:{"X-Csrf-Token":s},onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){var i="".concat(n.name," (").concat(n.permission," access)");t.push({title:i})})),{results:t}}},searchFields:["name","description"],showNoResults:!1}),(d=$("#search-repo-box")).search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/repos/search?q={query}&uid=").concat(d.data("uid")),onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){t.push({title:n.full_name.split("/")[1],description:n.full_name})})),{results:t}}},searchFields:["full_name"],showNoResults:!1}),b(),0!==$(".install").length&&(""===$("#db_host").val()&&($("#db_host").val("127.0.0.1:3306"),$("#db_user").val("gitea"),$("#db_name").val("gitea")),$("#db_type").change((function(){var e=$(this).val();if("SQLite3"===e)return $("#sql_settings").hide(),$("#pgsql_settings").hide(),$("#mysql_settings").hide(),$("#sqlite_settings").show(),void("SQLite3"===e&&"data/gitea_tidb"===$("#db_path").val()&&$("#db_path").val("data/gitea.db"));var t={MySQL:"127.0.0.1:3306",PostgreSQL:"127.0.0.1:5432",MSSQL:"127.0.0.1:1433"};$("#sqlite_settings").hide(),$("#sql_settings").show(),$("#pgsql_settings").toggle("PostgreSQL"===e),$("#mysql_settings").toggle("MySQL"===e),$.each(t,(function(n,i){if($("#db_host").val()===i)return $("#db_host").val(t[e]),!1}))})),$("#offline-mode input").change((function(){$(this).is(":checked")&&($("#disable-gravatar").checkbox("check"),$("#federated-avatar-lookup").checkbox("uncheck"))})),$("#disable-gravatar input").change((function(){$(this).is(":checked")?$("#federated-avatar-lookup").checkbox("uncheck"):$("#offline-mode").checkbox("uncheck")})),$("#federated-avatar-lookup input").change((function(){$(this).is(":checked")&&($("#disable-gravatar").checkbox("uncheck"),$("#offline-mode").checkbox("uncheck"))})),$("#enable-openid-signin input").change((function(){$(this).is(":checked")?$("#disable-registration input").is(":checked")||$("#enable-openid-signup").checkbox("check"):$("#enable-openid-signup").checkbox("uncheck")})),$("#disable-registration input").change((function(){$(this).is(":checked")?($("#enable-captcha").checkbox("uncheck"),$("#enable-openid-signup").checkbox("uncheck")):$("#enable-openid-signup").checkbox("check")})),$("#enable-captcha input").change((function(){$(this).is(":checked")&&$("#disable-registration").checkbox("uncheck")}))),w(),(u=function(){var e=$("#auth_username").val(),t=$("#clone_addr").val();!$("#mirror").is(":checked")&&e&&e.length>0&&void 0!==t&&(t.startsWith("https://github.com")||t.startsWith("http://github.com"))?$("#migrate_items").show():$("#migrate_items").hide()})(),$("#clone_addr").on("input",u),$("#auth_username").on("input",u),$("#mirror").on("change",u),function(){var e=$(".repository.wiki textarea#edit_area"),t=0,n=null;if(e.length>0){var i=new SimpleMDE({autoDownloadFontAwesome:!1,element:e[0],forceSync:!0,previewRender:function(a,o){return setTimeout((function(){var r=function(){t=0,null!=n&&(clearTimeout(n),n=null),$.post(e.data("url"),{_csrf:s,mode:"gfm",context:e.data("context"),text:a},(function(e){o.innerHTML='<div class="markdown ui segment">'.concat(e,"</div>"),emojify.run($(".editor-preview")[0]),$(o).find("pre code").each((function(e,t){hljs.highlightBlock(t)}))}))};i.isSideBySideActive()?(++t>10&&r(),null!=n&&(clearTimeout(n),n=null),n=setTimeout(r,600)):r()}),0),i.isSideBySideActive()?o.innerHTML:"Loading..."},renderingConfig:{singleLineBreaks:!1},indentWithTabs:!1,tabSize:4,spellChecker:!1,toolbar:["bold","italic","strikethrough","|","heading-1","heading-2","heading-3","heading-bigger","heading-smaller","|",{name:"code-inline",action:function(e){var t=e.codemirror,n=t.getSelection();if(t.replaceSelection("`".concat(n,"`")),!n){var i=t.getCursor();t.setCursor(i.line,i.ch-1)}t.focus()},className:"fa fa-angle-right",title:"Add Inline Code"},"code","quote","|",{name:"checkbox-empty",action:function(e){var t=e.codemirror;t.replaceSelection("\n- [ ] ".concat(t.getSelection())),t.focus()},className:"fa fa-square-o",title:"Add Checkbox (empty)"},{name:"checkbox-checked",action:function(e){var t=e.codemirror;t.replaceSelection("\n- [x] ".concat(t.getSelection())),t.focus()},className:"fa fa-check-square-o",title:"Add Checkbox (checked)"},"|","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","clean-block","preview","fullscreen","side-by-side"]});$(i.codemirror.getInputField()).addClass("js-quick-submit"),setTimeout((function(){var e=$('.repository.wiki.new .previewtabs a[data-tab="write"]'),n=$('.repository.wiki.new .previewtabs a[data-tab="preview"]'),i=$(".editor-toolbar"),a=$(".editor-toolbar a.fa-eye"),o=$(".editor-toolbar a.fa-columns");e.on("click",(function(){i.hasClass("disabled-for-preview")&&a.click()})),n.on("click",(function(){i.hasClass("disabled-for-preview")||a.click()})),a.on("click",(function(){setTimeout((function(){i.hasClass("disabled-for-preview")?(e.hasClass("active")&&e.removeClass("active"),n.hasClass("active")||n.addClass("active")):(e.hasClass("active")||e.addClass("active"),n.hasClass("active")&&n.removeClass("active"))}),0)})),o.on("click",(function(){t=10}))}),0)}}(),m(),C(),0!==$(".organization").length&&$(".organization.settings.options").length>0&&$("#org_name").keyup((function(){var e=$("#org-name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("org-name").toString().toLowerCase()?e.show():e.hide()})),0!==$(".edit.githook").length&&CodeMirror.autoLoadMode(CodeMirror.fromTextArea($("#content")[0],{lineNumbers:!0,mode:"shell"}),"shell"),function(){if(0!==$(".new.webhook").length){$(".events.checkbox input").change((function(){$(this).is(":checked")&&$(".events.fields").show()})),$(".non-events.checkbox input").change((function(){$(this).is(":checked")&&$(".events.fields").hide()}));var e=function(){var e="POST"===$("#http_method").val();$("#content_type").parent().parent()[e?"show":"hide"]()};e(),$("#http_method").change((function(){e()})),$("#test-delivery").click((function(){var e=$(this);e.addClass("loading disabled"),$.post(e.data("link"),{_csrf:s}).done(setTimeout((function(){window.location.href=e.data("redirect")}),5e3))}))}}(),function(){if(0!==$(".admin").length){if(($(".admin.new.user").length>0||$(".admin.edit.user").length>0)&&$("#login_type").change((function(){"0"===$(this).val().substring(0,1)?($("#login_name").removeAttr("required"),$(".non-local").hide(),$(".local").show(),$("#user_name").focus(),"required"===$(this).data("password")&&$("#password").attr("required","required")):($("#login_name").attr("required","required"),$(".non-local").show(),$(".local").hide(),$("#login_name").focus(),$("#password").removeAttr("required"))})),$(".admin.new.authentication").length>0&&($("#auth_type").change((function(){$(".ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size").hide(),$(".ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]").removeAttr("required"),$(".binddnrequired").removeClass("required");var e=$(this).val();switch(e){case"2":$(".ldap").show(),$(".binddnrequired input, .ldap div.required:not(.dldap) input").attr("required","required"),$(".binddnrequired").addClass("required");break;case"3":$(".smtp").show(),$(".has-tls").show(),$(".smtp div.required input, .has-tls").attr("required","required");break;case"4":$(".pam").show(),$(".pam input").attr("required","required");break;case"5":$(".dldap").show(),$(".dldap div.required:not(.ldap) input").attr("required","required");break;case"6":$(".oauth2").show(),$(".oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input").attr("required","required"),o()}"2"!==e&&"5"!==e||i(),"2"===e&&a()})),$("#auth_type").change(),$("#security_protocol").change(i),$("#use_paged_search").change(a),$("#oauth2_provider").change(o),$("#oauth2_use_custom_url").change(r)),$(".admin.edit.authentication").length>0){var e=$("#auth_type").val();"2"===e||"5"===e?($("#security_protocol").change(i),"2"===e&&$("#use_paged_search").change(a)):"6"===e&&($("#oauth2_provider").change(o),$("#oauth2_use_custom_url").change(r),o())}if($(".admin.notice")){var t=$("#detail-modal");$(".view-detail").click((function(){return t.find(".content p").text($(this).data("content")),t.modal("show"),!1}));var n=$(".select.table .ui.checkbox");$(".select.action").click((function(){switch($(this).data("action")){case"select-all":n.checkbox("check");break;case"deselect-all":n.checkbox("uncheck");break;case"inverse":n.checkbox("toggle")}})),$("#delete-selection").click((function(){var e=$(this);e.addClass("loading disabled");var t=[];n.each((function(){$(this).checkbox("is checked")&&t.push($(this).data("id"))})),$.post(e.data("link"),{_csrf:s,ids:t}).done((function(){window.location.href=e.data("redirect")}))}))}}function i(){$("#security_protocol").val()>0?$(".has-tls").show():$(".has-tls").hide()}function a(){$("#use_paged_search").prop("checked")?$(".search-page-size").show().find("input").attr("required","required"):$(".search-page-size").hide().find("input").removeAttr("required")}function o(){switch($(".open_id_connect_auto_discovery_url, .oauth2_use_custom_url").hide(),$(".open_id_connect_auto_discovery_url input[required]").removeAttr("required"),$("#oauth2_provider").val()){case"github":case"gitlab":case"gitea":$(".oauth2_use_custom_url").show();break;case"openidConnect":$(".open_id_connect_auto_discovery_url input").attr("required","required"),$(".open_id_connect_auto_discovery_url").show()}r()}function r(){var e=$("#oauth2_provider").val();if($(".oauth2_use_custom_url_field").hide(),$(".oauth2_use_custom_url_field input[required]").removeAttr("required"),$("#oauth2_use_custom_url").is(":checked"))switch($("#oauth2_token_url").val()||$("#oauth2_token_url").val($("#".concat(e,"_token_url")).val()),$("#oauth2_auth_url").val()||$("#oauth2_auth_url").val($("#".concat(e,"_auth_url")).val()),$("#oauth2_profile_url").val()||$("#oauth2_profile_url").val($("#".concat(e,"_profile_url")).val()),$("#oauth2_email_url").val()||$("#oauth2_email_url").val($("#".concat(e,"_email_url")).val()),e){case"github":$(".oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input").attr("required","required"),$(".oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url").show();break;case"gitea":case"gitlab":$(".oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input").attr("required","required"),$(".oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url").show(),$("#oauth2_email_url").val("")}}}(),_(),function(){var e=document.getElementById("app");if(!e)return;Vue.component("repo-search",{delimiters:["${","}"],props:{searchLimit:{type:Number,default:10},suburl:{type:String,required:!0},uid:{type:Number,required:!0},organizations:{type:Array,default:[]},isOrganization:{type:Boolean,default:!0},canCreateOrganization:{type:Boolean,default:!1},organizationsTotalCount:{type:Number,default:0},moreReposLink:{type:String,default:""}},data:function(){return{tab:"repos",repos:[],reposTotalCount:0,reposFilter:"all",searchQuery:"",isLoading:!1,repoTypes:{all:{count:0,searchMode:""},forks:{count:0,searchMode:"fork"},mirrors:{count:0,searchMode:"mirror"},sources:{count:0,searchMode:"source"},collaborative:{count:0,searchMode:"collaborative"}}}},computed:{showMoreReposLink:function(){return this.repos.length>0&&this.repos.length<this.repoTypes[this.reposFilter].count},searchURL:function(){return"".concat(this.suburl,"/api/v1/repos/search?sort=updated&order=desc&uid=").concat(this.uid,"&q=").concat(this.searchQuery,"&limit=").concat(this.searchLimit,"&mode=").concat(this.repoTypes[this.reposFilter].searchMode).concat("all"!==this.reposFilter?"&exclusive=1":"")},repoTypeCount:function(){return this.repoTypes[this.reposFilter].count}},mounted:function(){this.searchRepos(this.reposFilter);var e=this;Vue.nextTick((function(){e.$refs.search.focus()}))},methods:{changeTab:function(e){this.tab=e},changeReposFilter:function(e){this.reposFilter=e,this.repos=[],this.repoTypes[e].count=0,this.searchRepos(e)},showRepo:function(e,t){switch(t){case"sources":return e.owner.id===this.uid&&!e.mirror&&!e.fork;case"forks":return e.owner.id===this.uid&&!e.mirror&&e.fork;case"mirrors":return e.mirror;case"collaborative":return e.owner.id!==this.uid&&!e.mirror;default:return!0}},searchRepos:function(e){var t=this;this.isLoading=!0;var n=this.repoTypes[e].searchMode,i=this.searchURL,a=this.searchQuery;$.getJSON(i,(function(o,r,s){if(i===t.searchURL){t.repos=o.data;var c=s.getResponseHeader("X-Total-Count");""===a&&""===n&&(t.reposTotalCount=c),t.repoTypes[e].count=c}})).always((function(){i===t.searchURL&&(t.isLoading=!1)}))},repoClass:function(e){return e.fork?"octicon octicon-repo-forked":e.mirror?"octicon octicon-repo-clone":e.private?"octicon octicon-lock":"octicon octicon-repo"}}}),new Vue({delimiters:["${","}"],el:e,data:{searchLimit:document.querySelector("meta[name=_search_limit]").content,suburl:document.querySelector("meta[name=_suburl]").content,uid:document.querySelector("meta[name=_context_uid]").content}})}(),$(".organization.new.team input[name=permission]").change((function(){"admin"===$("input[name=permission]:checked",".organization.new.team").val()?$(".organization.new.team .team-units").hide():$(".organization.new.team .team-units").show()})),$(".js-quick-submit").keydown((function(e){!(e.ctrlKey&&!e.altKey||e.metaKey)||13!==e.keyCode&&10!==e.keyCode||$(this).closest("form").submit()})),f=$("#navbar"),g=$("#navbar-expand-toggle"),A=!1,g.click((function(){(A=!A)?(f.addClass("shown"),g.addClass("active")):(f.removeClass("shown"),g.removeClass("active"))})),D=$("#manage_topic"),O=$("#topic_edit"),E=$("#repo-topics"),F=$("#save_topic"),j=$("#topic_edit .dropdown"),M=$("#topic_edit.ui.form"),z=$("div.hide#validate_prompt"),P={countPrompt:z.children("#count_prompt").text(),formatPrompt:z.children("#format_prompt").text()},z.remove(),N=P,D.click((function(){E.hide(),O.css("display","")})),F.click((function(){var e=$("input[name=topics]").val();$.post(F.data("link"),{_csrf:s,topics:e},(function(t,n,i){if("ok"===i.responseJSON.status){if(E.children(".topic").remove(),e.length)for(var a=e.split(","),o=E.children("a").last(),r=0;r<a.length;r++)$('<div class="ui small label topic" style="cursor:pointer;">'.concat(a[r],"</div>")).insertBefore(o);O.css("display","none"),E.show()}})).fail((function(t){if(422===t.status)if(t.responseJSON.invalidTopics.length>0){N.formatPrompt=t.responseJSON.message;var n=t.responseJSON.invalidTopics,i=j.children("a.ui.label");e.split(",").forEach((function(e,t){for(var a=0;a<n.length;a++)n[a]===e&&i.eq(t).removeClass("green").addClass("red")}))}else N.countPrompt=t.responseJSON.message})).always((function(){M.form("validate form")}))})),j.dropdown({allowAdditions:!0,forceSelection:!1,fields:{name:"description",value:"data-value"},saveRemoteData:!1,label:{transition:"horizontal flip",duration:200,variation:!1,blue:!0,basic:!0},className:{label:"ui small label"},apiSettings:{url:"".concat(c,"/api/v1/topics/search?q={query}"),throttle:500,cache:!1,onResponse:function(e){var t={success:!1,results:[]},n=this.urlData.query.trim().replace(/<[^>]*>?/gm,""),i=!1,a=[];if(j.find("div.label.visible.topic,a.label.visible").each((function(e,t){a.push(t.dataset.value)})),e.topics){for(var o=!1,r=0;r<e.topics.length;r++)-1===a.indexOf(e.topics[r].topic_name)&&(e.topics[r].topic_name.toLowerCase()===n.toLowerCase()&&(i=!0),t.results.push({description:e.topics[r].topic_name,"data-value":e.topics[r].topic_name}),o=!0);t.success=o}return n.length>0&&!i?(t.success=!0,t.results.unshift({description:n,"data-value":n})):n.length>0&&i&&t.results.sort((function(e,t){return e.description.toLowerCase()===n.toLowerCase()?-1:t.description.toLowerCase()===n.toLowerCase()?1:e.description>t.description?-1:e.description<t.description?1:0})),t}},onLabelCreate:function(e){return e=e.toLowerCase().trim(),this.attr("data-value",e).contents().first().replaceWith(e),$(this)},onAdd:function(e,t,n){e=e.toLowerCase().trim(),$(n).attr("data-value",e),$(n).attr("data-text",e)}}),$.fn.form.settings.rules.validateTopic=function(e,t){var n=j.children("a.ui.label"),i=0===n.length||n.last().attr("data-value").match(t);return i||n.last().removeClass("green").addClass("red"),i&&0===j.children("a.ui.label.red").length},M.form({on:"change",inline:!0,fields:{topics:{identifier:"topics",rules:[{type:"validateTopic",value:/^[a-z0-9][a-z0-9-]{1,35}$/,prompt:N.formatPrompt},{type:"maxCount[25]",prompt:N.countPrompt}]}}}),0!==$("#wait-for-key").length&&u2fApi.ensureSupport().then((function(){$.getJSON("".concat(c,"/user/u2f/challenge")).success((function(e){u2fApi.sign(e.appId,e.challenge,e.registeredKeys,30).then(T).catch((function(e){L(void 0!==e?e.metaData.code:1)}))}))})).catch((function(){window.location.href="".concat(c,"/user/two_factor")})),$("#register-device").modal({allowMultiple:!1}),$("#u2f-error").modal({allowMultiple:!1}),$("#register-security-key").on("click",(function(e){e.preventDefault(),u2fApi.ensureSupport().then(q).catch((function(){L("browser")}))})),function(){var e=$("#repolink").val(),t=$("#repoId").val(),n=$("#crossRepoSearch").val(),i="".concat(c,"/api/v1/repos/").concat(e,"/issues?q={query}");"true"===n&&(i="".concat(c,"/api/v1/repos/issues/search?q={query}&priority_repo_id=").concat(t));$("#new-dependency-drop-list").dropdown({apiSettings:{url:i,onResponse:function(e){var t={success:!0,results:[]},n=$("#new-dependency-drop-list").data("issue-id");return $.each(e,(function(e,i){i.id!==n&&t.results.push({name:"#".concat(i.number," ").concat(h(i.title),'<div class="text small dont-break-out">').concat(h(i.repository.full_name),"</div>"),value:i.id})})),t},cache:!1},fullTextSearch:!0}),$(".menu a.label-filter-item").each((function(){$(this).click((function(e){if(e.altKey){e.preventDefault();var t=$(this).attr("href"),n=$(this).data("label-id"),i="labels=(-?[0-9]+%2c)*(".concat(n,")(%2c-?[0-9]+)*&");window.location=t.replace(new RegExp(i),"labels=$1-$2$3&")}}))})),$(".menu .ui.dropdown.label-filter").keydown((function(e){if(e.altKey&&13===e.keyCode){var t=$(".menu .ui.dropdown.label-filter .menu .item.selected");if(t.length>0){var n=$(t[0]),i=n.attr("href"),a=n.data("label-id"),o="labels=(-?[0-9]+%2c)*(".concat(a,")(%2c-?[0-9]+)*&");window.location=i.replace(new RegExp(o),"labels=$1-$2$3&")}}}))}(),$(".title_wip_desc > a").click((function(e){e.preventDefault();var t=$("#issue_title");t.focus();var n=t.val().trim().toUpperCase();for(var i in wipPrefixes)if(n.startsWith(wipPrefixes[i].toUpperCase()))return;t.val("".concat(wipPrefixes[0]," ").concat(t.val()))})),$(".show-outdated").on("click",(function(e){e.preventDefault();var t=$(this).data("comment");$(this).addClass("hide"),$("#code-comments-".concat(t)).removeClass("hide"),$("#code-preview-".concat(t)).removeClass("hide"),$("#hide-outdated-".concat(t)).removeClass("hide")})),$(".hide-outdated").on("click",(function(e){e.preventDefault();var t=$(this).data("comment");$(this).addClass("hide"),$("#code-comments-".concat(t)).addClass("hide"),$("#code-preview-".concat(t)).addClass("hide"),$("#show-outdated-".concat(t)).removeClass("hide")})),$("button.comment-form-reply").on("click",(function(e){e.preventDefault(),$(this).hide();var t=$(this).parent().find(".comment-form");t.removeClass("hide"),y(t.find(".menu"))})),0!==$(".repository.pull.diff").length&&($(".diff-detail-box.ui.sticky").sticky(),$(".btn-review").on("click",(function(e){e.preventDefault(),$(this).closest(".dropdown").find(".menu").toggle("visible")})).closest(".dropdown").find(".link.close").on("click",(function(e){e.preventDefault(),$(this).closest(".menu").toggle("visible")})),$(".code-view .lines-code,.code-view .lines-num").on("mouseenter",(function(){var e=$(this).closest("td");$(this).closest("tr").addClass(e.hasClass("lines-num-old")||e.hasClass("lines-code-old")?"focus-lines-old":"focus-lines-new")})).on("mouseleave",(function(){$(this).closest("tr").removeClass("focus-lines-new focus-lines-old")})),$(".add-code-comment").on("click",(function(e){if(!$(e.target).hasClass("btn-add-single")){e.preventDefault();var t=$(this).closest(".code-diff").hasClass("code-diff-split"),n=$(this).data("side"),i=$(this).data("idx"),a=$(this).data("path"),o=$("#pull_review_add_comment").html(),r=$(this).closest("tr"),s=r.next();s.hasClass("add-comment")||(s=$('<tr class="add-comment">'.concat(t?'<td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-right"></td>':'<td class="lines-num"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left add-comment-right"></td>',"</tr>")),r.after(s));var c=s.find(".add-comment-".concat(n)),l=c.find(".comment-code-cloud");0===l.length&&(c.html(o),y((l=c.find(".comment-code-cloud")).find(".menu")),c.find("input[name='line']").val(i),c.find("input[name='side']").val("left"===n?"previous":"proposed"),c.find("input[name='path']").val(a)),l.find("textarea").focus()}}))),function e(){var t=$("#repo_migrating");if($("#repo_migrating_failed").hide(),t){var n=t.attr("repo");if(void 0===n)return;$.ajax({type:"GET",url:"".concat(c,"/").concat(n,"/status"),data:{_csrf:s},complete:function(t){if(200===t.status&&t.responseJSON)return 0===t.responseJSON.status?void window.location.reload():void setTimeout((function(){e()}),2e3);$("#repo_migrating_progress").hide(),$("#repo_migrating_failed").show()}})}}(),function(){var e=$("#repo_template"),t=function(){var t=$("#template_units"),n=$("#non_template");""!==e.val()?(t.show(),n.hide()):(t.hide(),n.show())};e.change(t),t();var n=function(){$("#repo_template_search").dropdown({apiSettings:{url:"".concat(c,"/api/v1/repos/search?q={query}&template=true&priority_owner_id=").concat($("#uid").val()),onResponse:function(e){var t={success:!0,results:[]};return t.results.push({name:"",value:""}),$.each(e.data,(function(e,n){t.results.push({name:h(n.full_name),value:n.id})})),t},cache:!1},fullTextSearch:!0})};$("#uid").change(n),n()}(),$("#repo-clone-url").length>0)switch(localStorage.getItem("repo-clone-protocol")){case"ssh":0===$("#repo-clone-ssh").click().length&&$("#repo-clone-https").click();break;default:$("#repo-clone-https").click()}var B,H={"div.user.settings":k,"div.repository.settings.collaboration":x};for(B in H)if($(B).length>0){H[B]();break}var U=$("#clone_addr");U.change((function(){var e=$("#repo_name");U.val().length>0&&0===e.val().length&&e.val(U.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3])}))})),$((function(){0===$(".user.signin").length&&$("form:not(.ignore-dirty)").areYouSure(),$("#ssh-key-content").on("change paste keyup",(function(){var e=$(this).val().split(" "),t=$("#ssh-key-title");""===t.val()&&3===e.length&&""!==e[2]&&t.val(e[2])}))})),window.timeAddManual=function(){$(".mini.modal").modal({duration:200,onApprove:function(){$("#add_time_manual_form").submit()}}).modal("show")},window.toggleStopwatch=function(){$("#toggle_stopwatch_form").submit()},window.cancelStopwatch=function(){$("#cancel_stopwatch_form").submit()},window.initHeatmap=function(e,t,n){var i=document.getElementById(e);if(i){(n=n||{}).contributions=n.contributions||"contributions",n.no_contributions=n.no_contributions||"No contributions";var a=["${","}"];Vue.component("activity-heatmap",{delimiters:a,props:{user:{type:String,required:!0},suburl:{type:String,required:!0},locale:{type:Object,required:!0}},data:function(){return{isLoading:!0,colorRange:[],endDate:null,values:[],totalContributions:0}},mounted:function(){this.colorRange=[this.getColor(0),this.getColor(1),this.getColor(2),this.getColor(3),this.getColor(4),this.getColor(5)],this.endDate=new Date,this.loadHeatmap(this.user)},methods:{loadHeatmap:function(e){var t=this;$.get("".concat(this.suburl,"/api/v1/users/").concat(e,"/heatmap"),(function(e){for(var n=[],i=0;i<e.length;i++)t.totalContributions+=e[i].contributions,n[i]={date:new Date(1e3*e[i].timestamp),count:e[i].contributions};t.values=n,t.isLoading=!1}))},getColor:function(e){var t=document.createElement("div");t.className="heatmap-color-".concat(e),document.body.appendChild(t);var n=getComputedStyle(t).backgroundColor;return document.body.removeChild(t),n}},template:'<div><div v-show="isLoading"><slot name="loading"></slot></div><h4 class="total-contributions" v-if="!isLoading"><span v-html="totalContributions"></span> total contributions in the last 12 months</h4><calendar-heatmap v-show="!isLoading" :locale="locale" :no-data-text="locale.no_contributions" :tooltip-unit="locale.contributions" :end-date="endDate" :values="values" :range-color="colorRange" />'}),new Vue({delimiters:a,el:i,data:{suburl:document.querySelector("meta[name=_suburl]").content,heatmapUser:t,locale:n}})}},$(".commit-button").click((function(e){e.preventDefault(),$(this).parent().find(".commit-body").toggle()})),window.toggleDeadlineForm=function(){$("#deadlineForm").fadeToggle(150)},window.setDeadline=function(){var e=$("#deadlineDate").val();window.updateDeadline(e)},window.updateDeadline=function(e){$("#deadline-err-invalid-date").hide(),$("#deadline-loader").addClass("loading");var t=null;if(""!==e){var n=Date.parse(e);if(Number.isNaN(n))return $("#deadline-loader").removeClass("loading"),$("#deadline-err-invalid-date").show(),!1;t=new Date(n)}$.ajax("".concat($("#update-issue-deadline-form").attr("action"),"/deadline"),{data:JSON.stringify({due_date:t}),headers:{"X-Csrf-Token":s,"X-Remote":!0},contentType:"application/json",type:"POST",success:function(){p()},error:function(){$("#deadline-loader").removeClass("loading"),$("#deadline-err-invalid-date").show()}})},window.deleteDependencyModal=function(e,t){$(".remove-dependency").modal({closable:!1,duration:200,onApprove:function(){$("#removeDependencyID").val(e),$("#dependencyType").val(t),$("#removeDependencyForm").submit()}}).modal("show")},window.cancelCodeComment=function(e){var t=$(e).closest("form");t.length>0&&t.hasClass("comment-form")?(t.addClass("hide"),t.parent().find("button.comment-form-reply").show()):t.closest(".comment-code-cloud").remove()},window.onOAuthLoginClick=function(){var e=$("#oauth2-login-loader"),t=$("#oauth2-login-navigator");t.hide(),e.removeClass("disabled"),setTimeout((function(){e.addClass("disabled"),t.show()}),5e3)}}]);
+!function(e){function t(t){for(var n,a,o=t[0],r=t[1],s=0,l=[];s<o.length;s++)a=o[s],Object.prototype.hasOwnProperty.call(i,a)&&i[a]&&l.push(i[a][0]),i[a]=0;for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);for(c&&c(t);l.length;)l.shift()()}var n={},i={1:0};function a(t){if(n[t])return n[t].exports;var i=n[t]={i:t,l:!1,exports:{}};return e[t].call(i.exports,i,i.exports,a),i.l=!0,i.exports}a.e=function(e){var t=[],n=i[e];if(0!==n)if(n)t.push(n[2]);else{var o=new Promise((function(t,a){n=i[e]=[t,a]}));t.push(n[2]=o);var r,s=document.createElement("script");s.charset="utf-8",s.timeout=120,a.nc&&s.setAttribute("nonce",a.nc),s.src=function(e){return a.p+""+({0:"gitgraph"}[e]||e)+".js"}(e);var c=new Error;r=function(t){s.onerror=s.onload=null,clearTimeout(l);var n=i[e];if(0!==n){if(n){var a=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;c.message="Loading chunk "+e+" failed.\n("+a+": "+o+")",c.name="ChunkLoadError",c.type=a,c.request=o,n[1](c)}i[e]=void 0}};var l=setTimeout((function(){r({type:"timeout",target:s})}),12e4);s.onerror=s.onload=r,document.head.appendChild(s)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)a.d(n,i,function(t){return e[t]}.bind(null,i));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a.oe=function(e){throw console.error(e),e};var o=window.webpackJsonp=window.webpackJsonp||[],r=o.push.bind(o);o.push=t,o=o.slice();for(var s=0;s<o.length;s++)t(o[s]);var c=r;a(a.s=2)}([function(e,t,n){e.exports=n(4)},function(e,t,n){var i=n(5),a=n(6),o=n(7);e.exports=function(e,t){return i(e)||a(e,t)||o()}},function(e,t,n){e.exports=n(9)},function(e,t,n){if(document.currentScript&&document.currentScript.src){var i=new URL(document.currentScript.src);n.p="".concat(i.pathname.replace(/\/[^/]*$/,""),"/")}else{var a=document.querySelector('script[src*="/index.js"]');n.p="".concat(a.getAttribute("src").replace(/\/[^/]*$/,""),"/")}},function(e,t,n){var i=function(e){"use strict";var t,n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",r=a.asyncIterator||"@@asyncIterator",s=a.toStringTag||"@@toStringTag";function c(e,t,n,i){var a=t&&t.prototype instanceof v?t:v,o=Object.create(a.prototype),r=new T(i||[]);return o._invoke=function(e,t,n){var i=d;return function(a,o){if(i===h)throw new Error("Generator is already running");if(i===f){if("throw"===a)throw o;return L()}for(n.method=a,n.arg=o;;){var r=n.delegate;if(r){var s=k(r,n);if(s){if(s===m)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===d)throw i=f,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var c=l(e,t,n);if("normal"===c.type){if(i=n.done?f:u,c.arg===m)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(i=f,n.method="throw",n.arg=c.arg)}}}(e,n,r),o}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var d="suspendedStart",u="suspendedYield",h="executing",f="completed",m={};function v(){}function p(){}function g(){}var b={};b[o]=function(){return this};var $=Object.getPrototypeOf,w=$&&$($(A([])));w&&w!==n&&i.call(w,o)&&(b=w);var y=g.prototype=v.prototype=Object.create(b);function x(e){["next","throw","return"].forEach((function(t){e[t]=function(e){return this._invoke(t,e)}}))}function C(e){var t;this._invoke=function(n,a){function o(){return new Promise((function(t,o){!function t(n,a,o,r){var s=l(e[n],e,a);if("throw"!==s.type){var c=s.arg,d=c.value;return d&&"object"==typeof d&&i.call(d,"__await")?Promise.resolve(d.__await).then((function(e){t("next",e,o,r)}),(function(e){t("throw",e,o,r)})):Promise.resolve(d).then((function(e){c.value=e,o(c)}),(function(e){return t("throw",e,o,r)}))}r(s.arg)}(n,a,t,o)}))}return t=t?t.then(o,o):o()}}function k(e,n){var i=e.iterator[n.method];if(i===t){if(n.delegate=null,"throw"===n.method){if(e.iterator.return&&(n.method="return",n.arg=t,k(e,n),"throw"===n.method))return m;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return m}var a=l(i,e.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,m;var o=a.arg;return o?o.done?(n[e.resultName]=o.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,m):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,m)}function S(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function T(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(S,this),this.reset(!0)}function A(e){if(e){var n=e[o];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var a=-1,r=function n(){for(;++a<e.length;)if(i.call(e,a))return n.value=e[a],n.done=!1,n;return n.value=t,n.done=!0,n};return r.next=r}}return{next:L}}function L(){return{value:t,done:!0}}return p.prototype=y.constructor=g,g.constructor=p,g[s]=p.displayName="GeneratorFunction",e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,g):(e.__proto__=g,s in e||(e[s]="GeneratorFunction")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},x(C.prototype),C.prototype[r]=function(){return this},e.AsyncIterator=C,e.async=function(t,n,i,a){var o=new C(c(t,n,i,a));return e.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},x(y),y[s]="Generator",y[o]=function(){return this},y.toString=function(){return"[object Generator]"},e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},e.values=A,T.prototype={constructor:T,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(_),!e)for(var n in this)"t"===n.charAt(0)&&i.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function a(i,a){return s.type="throw",s.arg=e,n.next=i,a&&(n.method="next",n.arg=t),!!a}for(var o=this.tryEntries.length-1;o>=0;--o){var r=this.tryEntries[o],s=r.completion;if("root"===r.tryLoc)return a("end");if(r.tryLoc<=this.prev){var c=i.call(r,"catchLoc"),l=i.call(r,"finallyLoc");if(c&&l){if(this.prev<r.catchLoc)return a(r.catchLoc,!0);if(this.prev<r.finallyLoc)return a(r.finallyLoc)}else if(c){if(this.prev<r.catchLoc)return a(r.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<r.finallyLoc)return a(r.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&i.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var o=a;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var r=o?o.completion:{};return r.type=e,r.arg=t,o?(this.method="next",this.next=o.finallyLoc,m):this.complete(r)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var a=i.arg;_(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,i){return this.delegate={iterator:A(e),resultName:n,nextLoc:i},"next"===this.method&&(this.arg=t),m}},e}(e.exports);try{regeneratorRuntime=i}catch(e){Function("r","regeneratorRuntime = r")(i)}},function(e,t){e.exports=function(e){if(Array.isArray(e))return e}},function(e,t){e.exports=function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var n=[],i=!0,a=!1,o=void 0;try{for(var r,s=e[Symbol.iterator]();!(i=(r=s.next()).done)&&(n.push(r.value),!t||n.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==s.return||s.return()}finally{if(a)throw o}}return n}}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}},function(e,t){!function(e,t,n,i){"use strict";t=void 0!==t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.dropdown=function(i){var a,o=e(this),r=e(n),s=o.selector||"",c="ontouchstart"in n.documentElement,l=(new Date).getTime(),d=[],u=arguments[0],h="string"==typeof u,f=[].slice.call(arguments,1),m=1;return o.each((function(v){var p,g,b,$,w,y,x,C,k=e.isPlainObject(i)?e.extend(!0,{},e.fn.dropdown.settings,i):e.extend({},e.fn.dropdown.settings),S=k.className,_=k.message,T=k.fields,A=k.keys,L=k.metadata,q=k.namespace,D=k.regExp,O=k.selector,I=k.error,R=k.templates,E="."+q,F="module-"+q,j=e(this),M=e(k.context),N=j.find(O.text),z=j.find(O.search),P=j.find(O.sizer),V=j.find(O.input),B=j.find(O.icon),H=j.prev().find(O.text).length>0?j.prev().find(O.text):j.prev(),U=j.children(O.menu),K=U.find(O.item),W=!1,J=!1,Q=!1,X=this,G=j.data(F);C={initialize:function(){C.debug("Initializing dropdown",k),C.is.alreadySetup()?C.setup.reference():(C.setup.layout(),k.values&&C.change.values(k.values),C.refreshData(),C.save.defaults(),C.restore.selected(),C.create.id(),C.bind.events(),C.observeChanges(),C.instantiate(),C.aria.setup())},instantiate:function(){C.verbose("Storing instance of dropdown",C),G=C,j.data(F,C)},destroy:function(){C.verbose("Destroying previous dropdown",j),C.remove.tabbable(),j.off(E).removeData(F),U.off(E),r.off($),C.disconnect.menuObserver(),C.disconnect.selectObserver()},observeChanges:function(){"MutationObserver"in t&&(y=new MutationObserver(C.event.select.mutation),x=new MutationObserver(C.event.menu.mutation),C.debug("Setting up mutation observer",y,x),C.observe.select(),C.observe.menu())},disconnect:{menuObserver:function(){x&&x.disconnect()},selectObserver:function(){y&&y.disconnect()}},observe:{select:function(){C.has.input()&&y.observe(j[0],{childList:!0,subtree:!0})},menu:function(){C.has.menu()&&x.observe(U[0],{childList:!0,subtree:!0})}},create:{id:function(){w=(Math.random().toString(16)+"000000000").substr(2,8),$="."+w,C.verbose("Creating unique id for element",w)},userChoice:function(t){var n,i,a;return!!(t=t||C.get.userValues())&&(t=e.isArray(t)?t:[t],e.each(t,(function(t,o){!1===C.get.item(o)&&(a=k.templates.addition(C.add.variables(_.addResult,o)),i=e("<div />").html(a).attr("data-"+L.value,o).attr("data-"+L.text,o).addClass(S.addition).addClass(S.item),k.hideAdditions&&i.addClass(S.hidden),n=void 0===n?i:n.add(i),C.verbose("Creating user choices for value",o,i))})),n)},userLabels:function(t){var n=C.get.userValues();n&&(C.debug("Adding user labels",n),e.each(n,(function(e,t){C.verbose("Adding custom user value"),C.add.label(t,t)})))},menu:function(){U=e("<div />").addClass(S.menu).appendTo(j)},sizer:function(){P=e("<span />").addClass(S.sizer).insertAfter(z)}},search:function(e){e=void 0!==e?e:C.get.query(),C.verbose("Searching for query",e),C.has.minCharacters(e)?C.filter(e):C.hide()},select:{firstUnfiltered:function(){C.verbose("Selecting first non-filtered element"),C.remove.selectedItem(),K.not(O.unselectable).not(O.addition+O.hidden).eq(0).addClass(S.selected)},nextAvailable:function(e){var t=(e=e.eq(0)).nextAll(O.item).not(O.unselectable).eq(0),n=e.prevAll(O.item).not(O.unselectable).eq(0);t.length>0?(C.verbose("Moving selection to",t),t.addClass(S.selected)):(C.verbose("Moving selection to",n),n.addClass(S.selected))}},aria:{setup:function(){"menu"===C.aria.guessRole()&&(j.attr("aria-busy","true"),j.attr("role","menu"),j.attr("aria-haspopup","menu"),j.attr("aria-expanded","false"),U.find(".divider").attr("role","separator"),K.attr("role","menuitem"),K.each((function(e,t){t.id||(t.id=C.aria.nextID("menuitem"))})),N=j.find("> .text").eq(0),j.data("content")?(N.attr("aria-hidden"),j.attr("aria-label",j.data("content"))):(N.attr("id",C.aria.nextID("menutext")),j.attr("aria-labelledby",N.attr("id"))),j.attr("aria-busy","false"))},nextID:function(e){var t;do{t=e+"_"+m++}while(n.getElementById(t));return t},setExpanded:function(e){j.attr("aria-haspopup")&&j.attr("aria-expanded",e)},refreshDescendant:function(){if("menu"===j.attr("aria-haspopup")){var e=K.not(O.unselectable).filter("."+S.selected).eq(0),t=U.children("."+S.active).eq(0),n=e.length>0?e:t;n?j.attr("aria-activedescendant",n.attr("id")):C.aria.removeDescendant()}},removeDescendant:function(){"menu"==j.attr("aria-haspopup")&&j.removeAttr("aria-activedescendant")},guessRole:function(){var e=j.hasClass("icon"),t=C.has.search(),n=V.length>0,i=C.is.multiple();return e||t||n||i?"unknown":"menu"}},setup:{api:function(){var e={debug:k.debug,urlData:{value:C.get.value(),query:C.get.query()},on:!1};C.verbose("First request, initializing API"),j.api(e)},layout:function(){j.is("select")&&(C.setup.select(),C.setup.returnedObject()),C.has.menu()||C.create.menu(),C.is.search()&&!C.has.search()&&(C.verbose("Adding search input"),z=e("<input />").addClass(S.search).prop("autocomplete","off").insertBefore(N)),C.is.multiple()&&C.is.searchSelection()&&!C.has.sizer()&&C.create.sizer(),k.allowTab&&C.set.tabbable(),K.attr("tabindex","-1")},select:function(){var t=C.get.selectValues();C.debug("Dropdown initialized on a select",t),j.is("select")&&(V=j),V.parent(O.dropdown).length>0?(C.debug("UI dropdown already exists. Creating dropdown menu only"),j=V.closest(O.dropdown),C.has.menu()||C.create.menu(),U=j.children(O.menu),C.setup.menu(t)):(C.debug("Creating entire dropdown from select"),j=e("<div />").attr("class",V.attr("class")).addClass(S.selection).addClass(S.dropdown).html(R.dropdown(t)).insertBefore(V),V.hasClass(S.multiple)&&!1===V.prop("multiple")&&(C.error(I.missingMultiple),V.prop("multiple",!0)),V.is("[multiple]")&&C.set.multiple(),V.prop("disabled")&&(C.debug("Disabling dropdown"),j.addClass(S.disabled)),V.removeAttr("class").detach().prependTo(j)),C.refresh()},menu:function(e){U.html(R.menu(e,T)),K=U.find(O.item)},reference:function(){C.debug("Dropdown behavior was called on select, replacing with closest dropdown"),j=j.parent(O.dropdown),G=j.data(F),X=j.get(0),C.refresh(),C.setup.returnedObject()},returnedObject:function(){var e=o.slice(0,v),t=o.slice(v+1);o=e.add(j).add(t)}},refresh:function(){C.refreshSelectors(),C.refreshData()},refreshItems:function(){K=U.find(O.item)},refreshSelectors:function(){C.verbose("Refreshing selector cache"),N=j.find(O.text),z=j.find(O.search),V=j.find(O.input),B=j.find(O.icon),H=j.prev().find(O.text).length>0?j.prev().find(O.text):j.prev(),U=j.children(O.menu),K=U.find(O.item)},refreshData:function(){C.verbose("Refreshing cached metadata"),K.removeData(L.text).removeData(L.value)},clearData:function(){C.verbose("Clearing metadata"),K.removeData(L.text).removeData(L.value),j.removeData(L.defaultText).removeData(L.defaultValue).removeData(L.placeholderText)},toggle:function(){C.verbose("Toggling menu visibility"),C.is.active()?C.hide():C.show()},show:function(t){if(t=e.isFunction(t)?t:function(){},!C.can.show()&&C.is.remote()&&(C.debug("No API results retrieved, searching before show"),C.queryRemote(C.get.query(),C.show)),C.can.show()&&!C.is.active()){if(C.debug("Showing dropdown"),!C.has.message()||C.has.maxSelections()||C.has.allResultsFiltered()||C.remove.message(),C.is.allFiltered())return!0;!1!==k.onShow.call(X)&&(C.aria.setExpanded(!0),C.aria.refreshDescendant(),C.animate.show((function(){C.can.click()&&C.bind.intent(),C.has.menuSearch()&&C.focusSearch(),C.set.visible(),t.call(X)})))}},hide:function(t){t=e.isFunction(t)?t:function(){},C.is.active()&&!C.is.animatingOutward()&&(C.debug("Hiding dropdown"),!1!==k.onHide.call(X)&&(C.aria.setExpanded(!1),C.aria.removeDescendant(),C.animate.hide((function(){C.remove.visible(),t.call(X)}))))},hideOthers:function(){C.verbose("Finding other dropdowns to hide"),o.not(j).has(O.menu+"."+S.visible).dropdown("hide")},hideMenu:function(){C.verbose("Hiding menu  instantaneously"),C.remove.active(),C.remove.visible(),U.transition("hide")},hideSubMenus:function(){var e=U.children(O.item).find(O.menu);C.verbose("Hiding sub menus",e),e.transition("hide")},bind:{events:function(){c&&C.bind.touchEvents(),C.bind.keyboardEvents(),C.bind.inputEvents(),C.bind.mouseEvents()},touchEvents:function(){C.debug("Touch device detected binding additional touch events"),C.is.searchSelection()||C.is.single()&&j.on("touchstart"+E,C.event.test.toggle),U.on("touchstart"+E,O.item,C.event.item.mouseenter)},keyboardEvents:function(){C.verbose("Binding keyboard events"),j.on("keydown"+E,C.event.keydown),C.has.search()&&j.on(C.get.inputEvent()+E,O.search,C.event.input),C.is.multiple()&&r.on("keydown"+$,C.event.document.keydown)},inputEvents:function(){C.verbose("Binding input change events"),j.on("change"+E,O.input,C.event.change)},mouseEvents:function(){C.verbose("Binding mouse events"),C.is.multiple()&&j.on("click"+E,O.label,C.event.label.click).on("click"+E,O.remove,C.event.remove.click),C.is.searchSelection()?(j.on("mousedown"+E,C.event.mousedown).on("mouseup"+E,C.event.mouseup).on("mousedown"+E,O.menu,C.event.menu.mousedown).on("mouseup"+E,O.menu,C.event.menu.mouseup).on("click"+E,O.icon,C.event.icon.click).on("focus"+E,O.search,C.event.search.focus).on("click"+E,O.search,C.event.search.focus).on("blur"+E,O.search,C.event.search.blur).on("click"+E,O.text,C.event.text.focus),C.is.multiple()&&j.on("click"+E,C.event.click)):("click"==k.on?j.on("click"+E,O.icon,C.event.icon.click).on("click"+E,C.event.test.toggle):"hover"==k.on?j.on("mouseenter"+E,C.delay.show).on("mouseleave"+E,C.delay.hide):j.on(k.on+E,C.toggle),j.on("mousedown"+E,C.event.mousedown).on("mouseup"+E,C.event.mouseup).on("focus"+E,C.event.focus),C.has.menuSearch()?j.on("blur"+E,O.search,C.event.search.blur):j.on("blur"+E,C.event.blur)),U.on("mouseenter"+E,O.item,C.event.item.mouseenter).on("mouseleave"+E,O.item,C.event.item.mouseleave).on("click"+E,O.item,C.event.item.click)},intent:function(){C.verbose("Binding hide intent event to document"),c&&r.on("touchstart"+$,C.event.test.touch).on("touchmove"+$,C.event.test.touch),r.on("click"+$,C.event.test.hide)}},unbind:{intent:function(){C.verbose("Removing hide intent event from document"),c&&r.off("touchstart"+$).off("touchmove"+$),r.off("click"+$)}},filter:function(e){var t=void 0!==e?e:C.get.query(),n=function(){C.is.multiple()&&C.filterActive(),(e||!e&&0==C.get.activeItem().length)&&C.select.firstUnfiltered(),C.has.allResultsFiltered()?k.onNoResults.call(X,t)?k.allowAdditions?k.hideAdditions&&(C.verbose("User addition with no menu, setting empty style"),C.set.empty(),C.hideMenu()):(C.verbose("All items filtered, showing message",t),C.add.message(_.noResults)):(C.verbose("All items filtered, hiding dropdown",t),C.hideMenu()):(C.remove.empty(),C.remove.message()),k.allowAdditions&&C.add.userSuggestion(e),C.is.searchSelection()&&C.can.show()&&C.is.focusedOnSearch()&&C.show()};k.useLabels&&C.has.maxSelections()||(k.apiSettings?C.can.useAPI()?C.queryRemote(t,(function(){k.filterRemoteData&&C.filterItems(t),n()})):C.error(I.noAPI):(C.filterItems(t),n()))},queryRemote:function(t,n){var i={errorDuration:!1,cache:"local",throttle:k.throttle,urlData:{query:t},onError:function(){C.add.message(_.serverError),n()},onFailure:function(){C.add.message(_.serverError),n()},onSuccess:function(e){C.remove.message(),C.setup.menu({values:e[T.remoteValues]}),n()}};j.api("get request")||C.setup.api(),i=e.extend(!0,{},i,k.apiSettings),j.api("setting",i).api("query")},filterItems:function(t){var n=void 0!==t?t:C.get.query(),i=null,a=C.escape.string(n),o=new RegExp("^"+a,"igm");C.has.query()&&(i=[],C.verbose("Searching for matching values",n),K.each((function(){var t,a,r=e(this);if("both"==k.match||"text"==k.match){if(-1!==(t=String(C.get.choiceText(r,!1))).search(o))return i.push(this),!0;if("exact"===k.fullTextSearch&&C.exactSearch(n,t))return i.push(this),!0;if(!0===k.fullTextSearch&&C.fuzzySearch(n,t))return i.push(this),!0}if("both"==k.match||"value"==k.match){if(-1!==(a=String(C.get.choiceValue(r,t))).search(o))return i.push(this),!0;if("exact"===k.fullTextSearch&&C.exactSearch(n,a))return i.push(this),!0;if(!0===k.fullTextSearch&&C.fuzzySearch(n,a))return i.push(this),!0}}))),C.debug("Showing only matched items",n),C.remove.filteredItem(),i&&K.not(i).addClass(S.filtered)},fuzzySearch:function(e,t){var n=t.length,i=e.length;if(e=e.toLowerCase(),t=t.toLowerCase(),i>n)return!1;if(i===n)return e===t;e:for(var a=0,o=0;a<i;a++){for(var r=e.charCodeAt(a);o<n;)if(t.charCodeAt(o++)===r)continue e;return!1}return!0},exactSearch:function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase()).indexOf(e)>-1},filterActive:function(){k.useLabels&&K.filter("."+S.active).addClass(S.filtered)},focusSearch:function(e){C.has.search()&&!C.is.focusedOnSearch()&&(e?(j.off("focus"+E,O.search),z.focus(),j.on("focus"+E,O.search,C.event.search.focus)):z.focus())},forceSelection:function(){var e=K.not(S.filtered).filter("."+S.selected).eq(0),t=K.not(S.filtered).filter("."+S.active).eq(0),n=e.length>0?e:t;if(n.length>0&&!C.is.multiple())return C.debug("Forcing partial selection to selected item",n),void C.event.item.click.call(n,{},!0);k.allowAdditions?(C.set.selected(C.get.query()),C.remove.searchTerm()):C.remove.searchTerm()},change:{values:function(t){k.allowAdditions||C.clear(),C.debug("Creating dropdown with specified values",t),C.setup.menu({values:t}),e.each(t,(function(e,t){if(1==t.selected)return C.debug("Setting initial selection to",t.value),C.set.selected(t.value),!0}))}},event:{change:function(){Q||(C.debug("Input changed, updating selection"),C.set.selected())},focus:function(){k.showOnFocus&&!W&&C.is.hidden()&&!g&&C.show()},blur:function(e){g=n.activeElement===this,W||g||(C.remove.activeLabel(),C.hide())},mousedown:function(){C.is.searchSelection()?b=!0:W=!0},mouseup:function(){C.is.searchSelection()?b=!1:W=!1},click:function(t){e(t.target).is(j)&&(C.is.focusedOnSearch()?C.show():C.focusSearch())},search:{focus:function(){W=!0,C.is.multiple()&&C.remove.activeLabel(),k.showOnFocus&&C.search()},blur:function(e){g=n.activeElement===this,C.is.searchSelection()&&!b&&(J||g||(k.forceSelection&&C.forceSelection(),C.hide())),b=!1}},icon:{click:function(e){C.toggle()}},text:{focus:function(e){W=!0,C.focusSearch()}},input:function(e){(C.is.multiple()||C.is.searchSelection())&&C.set.filtered(),clearTimeout(C.timer),C.timer=setTimeout(C.search,k.delay.search)},label:{click:function(t){var n=e(this),i=j.find(O.label),a=i.filter("."+S.active),o=n.nextAll("."+S.active),r=n.prevAll("."+S.active),s=o.length>0?n.nextUntil(o).add(a).add(n):n.prevUntil(r).add(a).add(n);t.shiftKey?(a.removeClass(S.active),s.addClass(S.active)):t.ctrlKey?n.toggleClass(S.active):(a.removeClass(S.active),n.addClass(S.active)),k.onLabelSelect.apply(this,i.filter("."+S.active))}},remove:{click:function(){var t=e(this).parent();t.hasClass(S.active)?C.remove.activeLabels():C.remove.activeLabels(t)}},test:{toggle:function(e){var t=C.is.multiple()?C.show:C.toggle;C.is.bubbledLabelClick(e)||C.is.bubbledIconClick(e)||C.determine.eventOnElement(e,t)&&e.preventDefault()},touch:function(e){C.determine.eventOnElement(e,(function(){"touchstart"==e.type?C.timer=setTimeout((function(){C.hide()}),k.delay.touch):"touchmove"==e.type&&clearTimeout(C.timer)})),e.stopPropagation()},hide:function(e){C.determine.eventInModule(e,C.hide)}},select:{mutation:function(t){C.debug("<select> modified, recreating menu");var n=!1;e.each(t,(function(t,i){if(e(i.target).is("select")||e(i.addedNodes).is("select"))return n=!0,!0})),n&&(C.disconnect.selectObserver(),C.refresh(),C.setup.select(),C.set.selected(),C.observe.select())}},menu:{mutation:function(t){var n=t[0],i=n.addedNodes?e(n.addedNodes[0]):e(!1),a=n.removedNodes?e(n.removedNodes[0]):e(!1),o=i.add(a),r=o.is(O.addition)||o.closest(O.addition).length>0,s=o.is(O.message)||o.closest(O.message).length>0;r||s?(C.debug("Updating item selector cache"),C.refreshItems()):(C.debug("Menu modified, updating selector cache"),C.refresh())},mousedown:function(){J=!0},mouseup:function(){J=!1}},item:{mouseenter:function(t){var n=e(t.target),i=e(this),a=i.children(O.menu),o=i.siblings(O.item).children(O.menu),r=a.length>0;!(a.find(n).length>0)&&r&&(clearTimeout(C.itemTimer),C.itemTimer=setTimeout((function(){C.verbose("Showing sub-menu",a),e.each(o,(function(){C.animate.hide(!1,e(this))})),C.animate.show(!1,a)}),k.delay.show),t.preventDefault())},mouseleave:function(t){var n=e(this).children(O.menu);n.length>0&&(clearTimeout(C.itemTimer),C.itemTimer=setTimeout((function(){C.verbose("Hiding sub-menu",n),C.animate.hide(!1,n)}),k.delay.hide))},click:function(t,i){var a=e(this),o=e(t?t.target:""),r=a.find(O.menu),s=C.get.choiceText(a),c=C.get.choiceValue(a,s),l=r.length>0,d=r.find(o).length>0;C.has.menuSearch()&&e(n.activeElement).blur(),d||l&&!k.allowCategorySelection||(C.is.searchSelection()&&(k.allowAdditions&&C.remove.userAddition(),C.remove.searchTerm(),C.is.focusedOnSearch()||1==i||C.focusSearch(!0)),k.useLabels||(C.remove.filteredItem(),C.set.scrollPosition(a)),C.determine.selectAction.call(this,s,c))}},document:{keydown:function(e){var t=e.which;if(C.is.inObject(t,A)){var n=j.find(O.label),i=n.filter("."+S.active),a=(i.data(L.value),n.index(i)),o=n.length,r=i.length>0,s=i.length>1,c=0===a,l=a+1==o,d=C.is.searchSelection(),u=C.is.focusedOnSearch(),h=C.is.focused(),f=u&&0===C.get.caretPosition();if(d&&!r&&!u)return;t==A.leftArrow?!h&&!f||r?r&&(e.shiftKey?C.verbose("Adding previous label to selection"):(C.verbose("Selecting previous label"),n.removeClass(S.active)),c&&!s?i.addClass(S.active):i.prev(O.siblingLabel).addClass(S.active).end(),e.preventDefault()):(C.verbose("Selecting previous label"),n.last().addClass(S.active)):t==A.rightArrow?(h&&!r&&n.first().addClass(S.active),r&&(e.shiftKey?C.verbose("Adding next label to selection"):(C.verbose("Selecting next label"),n.removeClass(S.active)),l?d?u?n.removeClass(S.active):C.focusSearch():s?i.next(O.siblingLabel).addClass(S.active):i.addClass(S.active):i.next(O.siblingLabel).addClass(S.active),e.preventDefault())):t==A.deleteKey||t==A.backspace?r?(C.verbose("Removing active labels"),l&&d&&!u&&C.focusSearch(),i.last().next(O.siblingLabel).addClass(S.active),C.remove.activeLabels(i),e.preventDefault()):f&&!r&&t==A.backspace&&(C.verbose("Removing last label on input backspace"),i=n.last().addClass(S.active),C.remove.activeLabels(i)):i.removeClass(S.active)}}},keydown:function(e){var t=e.which;if(C.is.inObject(t,A)){var n,i=K.not(O.unselectable).filter("."+S.selected).eq(0),a=U.children("."+S.active).eq(0),o=i.length>0?i:a,r=o.length>0?o.siblings(":not(."+S.filtered+")").addBack():U.children(":not(."+S.filtered+")"),s=o.children(O.menu),c=o.closest(O.menu),l=c.hasClass(S.visible)||c.hasClass(S.animating)||c.parent(O.menu).length>0,d=s.length>0,u=o.length>0,h=o.not(O.unselectable).length>0,f=t==A.delimiter&&k.allowAdditions&&C.is.multiple();if(k.allowAdditions&&k.hideAdditions&&(t==A.enter||f)&&h&&(C.verbose("Selecting item from keyboard shortcut",o),o[0].click(),C.is.searchSelection()&&C.remove.searchTerm()),C.is.visible()){if((t==A.enter||f)&&(t==A.enter&&u&&d&&!k.allowCategorySelection?(C.verbose("Pressed enter on unselectable category, opening sub menu"),t=A.rightArrow):h&&(C.verbose("Selecting item from keyboard shortcut",o),o[0].click(),C.is.searchSelection()&&C.remove.searchTerm()),e.preventDefault()),u&&(t==A.leftArrow&&c[0]!==U[0]&&(C.verbose("Left key pressed, closing sub-menu"),C.animate.hide(!1,c),o.removeClass(S.selected),c.closest(O.item).addClass(S.selected),C.aria.refreshDescendant(),e.preventDefault()),t==A.rightArrow&&d&&(C.verbose("Right key pressed, opening sub-menu"),C.animate.show(!1,s),o.removeClass(S.selected),s.find(O.item).eq(0).addClass(S.selected),C.aria.refreshDescendant(),e.preventDefault())),t==A.upArrow){if(n=u&&l?o.prevAll(O.item+":not("+O.unselectable+")").eq(0):K.eq(0),r.index(n)<0)return C.verbose("Up key pressed but reached top of current menu"),void e.preventDefault();C.verbose("Up key pressed, changing active item"),o.removeClass(S.selected),n.addClass(S.selected),C.aria.refreshDescendant(),C.set.scrollPosition(n),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),e.preventDefault()}if(t==A.downArrow){if(0===(n=u&&l?n=o.nextAll(O.item+":not("+O.unselectable+")").eq(0):K.eq(0)).length)return C.verbose("Down key pressed but reached bottom of current menu"),void e.preventDefault();C.verbose("Down key pressed, changing active item"),K.removeClass(S.selected),n.addClass(S.selected),C.aria.refreshDescendant(),C.set.scrollPosition(n),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),e.preventDefault()}t==A.pageUp&&(C.scrollPage("up"),e.preventDefault()),t==A.pageDown&&(C.scrollPage("down"),e.preventDefault()),t==A.escape&&(C.verbose("Escape key pressed, closing dropdown"),C.hide())}else f&&e.preventDefault(),t!=A.downArrow||C.is.visible()||(C.verbose("Down key pressed, showing dropdown"),C.show(),e.preventDefault())}else C.has.search()||C.set.selectedLetter(String.fromCharCode(t))}},trigger:{change:function(){var e=n.createEvent("HTMLEvents"),t=V[0];t&&(C.verbose("Triggering native change event"),e.initEvent("change",!0,!1),t.dispatchEvent(e))}},determine:{selectAction:function(t,n){C.verbose("Determining action",k.action),e.isFunction(C.action[k.action])?(C.verbose("Triggering preset action",k.action,t,n),C.action[k.action].call(X,t,n,this)):e.isFunction(k.action)?(C.verbose("Triggering user action",k.action,t,n),k.action.call(X,t,n,this)):C.error(I.action,k.action)},eventInModule:function(t,i){var a=e(t.target),o=a.closest(n.documentElement).length>0,r=a.closest(j).length>0;return i=e.isFunction(i)?i:function(){},o&&!r?(C.verbose("Triggering event",i),i(),!0):(C.verbose("Event occurred in dropdown, canceling callback"),!1)},eventOnElement:function(t,i){var a=e(t.target),o=a.closest(O.siblingLabel),r=n.body.contains(t.target),s=0===j.find(o).length,c=0===a.closest(U).length;return i=e.isFunction(i)?i:function(){},r&&s&&c?(C.verbose("Triggering event",i),i(),!0):(C.verbose("Event occurred in dropdown menu, canceling callback"),!1)}},action:{nothing:function(){},activate:function(t,n,i){if(n=void 0!==n?n:t,C.can.activate(e(i))){if(C.set.selected(n,e(i)),C.is.multiple()&&!C.is.allFiltered())return;C.hideAndClear()}},select:function(t,n,i){if(n=void 0!==n?n:t,C.can.activate(e(i))){if(C.set.value(n,t,e(i)),C.is.multiple()&&!C.is.allFiltered())return;C.hideAndClear()}},combo:function(t,n,i){n=void 0!==n?n:t,C.set.selected(n,e(i)),C.hideAndClear()},hide:function(e,t,n){C.set.value(t,e),C.hideAndClear()}},get:{id:function(){return w},defaultText:function(){return j.data(L.defaultText)},defaultValue:function(){return j.data(L.defaultValue)},placeholderText:function(){return"auto"!=k.placeholder&&"string"==typeof k.placeholder?k.placeholder:j.data(L.placeholderText)||""},text:function(){return N.text()},query:function(){return e.trim(z.val())},searchWidth:function(e){return e=void 0!==e?e:z.val(),P.text(e),Math.ceil(P.width()+1)},selectionCount:function(){var t=C.get.values();return C.is.multiple()?e.isArray(t)?t.length:0:""!==C.get.value()?1:0},transition:function(e){return"auto"==k.transition?C.is.upward(e)?"slide up":"slide down":k.transition},userValues:function(){var t=C.get.values();return!!t&&(t=e.isArray(t)?t:[t],e.grep(t,(function(e){return!1===C.get.item(e)})))},uniqueArray:function(t){return e.grep(t,(function(n,i){return e.inArray(n,t)===i}))},caretPosition:function(){var e,t,i=z.get(0);return"selectionStart"in i?i.selectionStart:n.selection?(i.focus(),t=(e=n.selection.createRange()).text.length,e.moveStart("character",-i.value.length),e.text.length-t):void 0},value:function(){var t=V.length>0?V.val():j.data(L.value),n=e.isArray(t)&&1===t.length&&""===t[0];return void 0===t||n?"":t},values:function(){var e=C.get.value();return""===e?"":!C.has.selectInput()&&C.is.multiple()?"string"==typeof e?e.split(k.delimiter):"":e},remoteValues:function(){var t=C.get.values(),n=!1;return t&&("string"==typeof t&&(t=[t]),e.each(t,(function(e,t){var i=C.read.remoteData(t);C.verbose("Restoring value from session data",i,t),i&&(n||(n={}),n[t]=i)}))),n},choiceText:function(t,n){if(n=void 0!==n?n:k.preserveHTML,t)return t.find(O.menu).length>0&&(C.verbose("Retrieving text of element with sub-menu"),(t=t.clone()).find(O.menu).remove(),t.find(O.menuIcon).remove()),void 0!==t.data(L.text)?t.data(L.text):n?e.trim(t.html()):e.trim(t.text())},choiceValue:function(t,n){return n=n||C.get.choiceText(t),!!t&&(void 0!==t.data(L.value)?String(t.data(L.value)):"string"==typeof n?e.trim(n.toLowerCase()):String(n))},inputEvent:function(){var e=z[0];return!!e&&(void 0!==e.oninput?"input":void 0!==e.onpropertychange?"propertychange":"keyup")},selectValues:function(){var t={values:[]};return j.find("option").each((function(){var n=e(this),i=n.html(),a=n.attr("disabled"),o=void 0!==n.attr("value")?n.attr("value"):i;"auto"===k.placeholder&&""===o?t.placeholder=i:t.values.push({name:i,value:o,disabled:a})})),k.placeholder&&"auto"!==k.placeholder&&(C.debug("Setting placeholder value to",k.placeholder),t.placeholder=k.placeholder),k.sortSelect?(t.values.sort((function(e,t){return e.name>t.name?1:-1})),C.debug("Retrieved and sorted values from select",t)):C.debug("Retrieved values from select",t),t},activeItem:function(){return K.filter("."+S.active)},selectedItem:function(){var e=K.not(O.unselectable).filter("."+S.selected);return e.length>0?e:K.eq(0)},itemWithAdditions:function(e){var t=C.get.item(e),n=C.create.userChoice(e);return n&&n.length>0&&(t=t.length>0?t.add(n):n),t},item:function(t,n){var i,a,o=!1;return t=void 0!==t?t:void 0!==C.get.values()?C.get.values():C.get.text(),i=a?t.length>0:null!=t,a=C.is.multiple()&&e.isArray(t),n=""===t||0===t||(n||!1),i&&K.each((function(){var i=e(this),r=C.get.choiceText(i),s=C.get.choiceValue(i,r);if(null!=s)if(a)-1===e.inArray(String(s),t)&&-1===e.inArray(r,t)||(o=o?o.add(i):i);else if(n){if(C.verbose("Ambiguous dropdown value using strict type check",i,t),s===t||r===t)return o=i,!0}else if(String(s)==String(t)||r==t)return C.verbose("Found select item by value",s,t),o=i,!0})),o}},check:{maxSelections:function(e){return!k.maxSelections||((e=void 0!==e?e:C.get.selectionCount())>=k.maxSelections?(C.debug("Maximum selection count reached"),k.useLabels&&(K.addClass(S.filtered),C.add.message(_.maxSelections)),!0):(C.verbose("No longer at maximum selection count"),C.remove.message(),C.remove.filteredItem(),C.is.searchSelection()&&C.filterItems(),!1))}},restore:{defaults:function(){C.clear(),C.restore.defaultText(),C.restore.defaultValue()},defaultText:function(){var e=C.get.defaultText();e===C.get.placeholderText?(C.debug("Restoring default placeholder text",e),C.set.placeholderText(e)):(C.debug("Restoring default text",e),C.set.text(e))},placeholderText:function(){C.set.placeholderText()},defaultValue:function(){var e=C.get.defaultValue();void 0!==e&&(C.debug("Restoring default value",e),""!==e?(C.set.value(e),C.set.selected()):(C.remove.activeItem(),C.remove.selectedItem()))},labels:function(){k.allowAdditions&&(k.useLabels||(C.error(I.labels),k.useLabels=!0),C.debug("Restoring selected values"),C.create.userLabels()),C.check.maxSelections()},selected:function(){C.restore.values(),C.is.multiple()?(C.debug("Restoring previously selected values and labels"),C.restore.labels()):C.debug("Restoring previously selected values")},values:function(){C.set.initialLoad(),k.apiSettings&&k.saveRemoteData&&C.get.remoteValues()?C.restore.remoteValues():C.set.selected(),C.remove.initialLoad()},remoteValues:function(){var t=C.get.remoteValues();C.debug("Recreating selected from session data",t),t&&(C.is.single()?e.each(t,(function(e,t){C.set.text(t)})):e.each(t,(function(e,t){C.add.label(e,t)})))}},read:{remoteData:function(e){var n;if(void 0!==t.Storage)return void 0!==(n=sessionStorage.getItem(e))&&n;C.error(I.noStorage)}},save:{defaults:function(){C.save.defaultText(),C.save.placeholderText(),C.save.defaultValue()},defaultValue:function(){var e=C.get.value();C.verbose("Saving default value as",e),j.data(L.defaultValue,e)},defaultText:function(){var e=C.get.text();C.verbose("Saving default text as",e),j.data(L.defaultText,e)},placeholderText:function(){var e;!1!==k.placeholder&&N.hasClass(S.placeholder)&&(e=C.get.text(),C.verbose("Saving placeholder text as",e),j.data(L.placeholderText,e))},remoteData:function(e,n){void 0!==t.Storage?(C.verbose("Saving remote data to session storage",n,e),sessionStorage.setItem(n,e)):C.error(I.noStorage)}},clear:function(){C.is.multiple()&&k.useLabels?C.remove.labels():(C.remove.activeItem(),C.remove.selectedItem()),C.set.placeholderText(),C.clearValue()},clearValue:function(){C.set.value("")},scrollPage:function(e,t){var n,i,a=t||C.get.selectedItem(),o=a.closest(O.menu),r=o.outerHeight(),s=o.scrollTop(),c=K.eq(0).outerHeight(),l=Math.floor(r/c),d=(o.prop("scrollHeight"),"up"==e?s-c*l:s+c*l),u=K.not(O.unselectable);i="up"==e?u.index(a)-l:u.index(a)+l,(n=("up"==e?i>=0:i<u.length)?u.eq(i):"up"==e?u.first():u.last()).length>0&&(C.debug("Scrolling page",e,n),a.removeClass(S.selected),n.addClass(S.selected),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(n),o.scrollTop(d))},set:{filtered:function(){var e=C.is.multiple(),t=C.is.searchSelection(),n=e&&t,i=t?C.get.query():"",a="string"==typeof i&&i.length>0,o=C.get.searchWidth(),r=""!==i;e&&a&&(C.verbose("Adjusting input width",o,k.glyphWidth),z.css("width",o)),a||n&&r?(C.verbose("Hiding placeholder text"),N.addClass(S.filtered)):(!e||n&&!r)&&(C.verbose("Showing placeholder text"),N.removeClass(S.filtered))},empty:function(){j.addClass(S.empty)},loading:function(){j.addClass(S.loading)},placeholderText:function(e){e=e||C.get.placeholderText(),C.debug("Setting placeholder text",e),C.set.text(e),N.addClass(S.placeholder)},tabbable:function(){C.is.searchSelection()?(C.debug("Added tabindex to searchable dropdown"),z.val("").attr("tabindex",0),U.attr("tabindex",-1)):(C.debug("Added tabindex to dropdown"),void 0===j.attr("tabindex")&&(j.attr("tabindex",0),U.attr("tabindex",-1)))},initialLoad:function(){C.verbose("Setting initial load"),p=!0},activeItem:function(e){k.allowAdditions&&e.filter(O.addition).length>0?e.addClass(S.filtered):e.addClass(S.active)},partialSearch:function(e){var t=C.get.query().length;z.val(e.substr(0,t))},scrollPosition:function(e,t){var n,i,a,o,r,s;n=(e=e||C.get.selectedItem()).closest(O.menu),i=e&&e.length>0,t=void 0!==t&&t,e&&n.length>0&&i&&(e.position().top,n.addClass(S.loading),a=(o=n.scrollTop())-n.offset().top+e.offset().top,t||(s=o+n.height()<a+5,r=a-5<o),C.debug("Scrolling to active item",a),(t||r||s)&&n.scrollTop(a),n.removeClass(S.loading))},text:function(e){"select"!==k.action&&("combo"==k.action?(C.debug("Changing combo button text",e,H),k.preserveHTML?H.html(e):H.text(e)):(e!==C.get.placeholderText()&&N.removeClass(S.placeholder),C.debug("Changing text",e,N),N.removeClass(S.filtered),k.preserveHTML?N.html(e):N.text(e)))},selectedItem:function(e){var t=C.get.choiceValue(e),n=C.get.choiceText(e,!1),i=C.get.choiceText(e,!0);C.debug("Setting user selection to item",e),C.remove.activeItem(),C.set.partialSearch(n),C.set.activeItem(e),C.set.selected(t,e),C.set.text(i)},selectedLetter:function(t){var n,i=K.filter("."+S.selected),a=i.length>0&&C.has.firstLetter(i,t),o=!1;a&&(n=i.nextAll(K).eq(0),C.has.firstLetter(n,t)&&(o=n)),o||K.each((function(){if(C.has.firstLetter(e(this),t))return o=e(this),!1})),o&&(C.verbose("Scrolling to next value with letter",t),C.set.scrollPosition(o),i.removeClass(S.selected),o.addClass(S.selected),C.aria.refreshDescendant(),k.selectOnKeydown&&C.is.single()&&C.set.selectedItem(o))},direction:function(e){"auto"==k.direction?(C.remove.upward(),C.can.openDownward(e)?C.remove.upward(e):C.set.upward(e),C.is.leftward(e)||C.can.openRightward(e)||C.set.leftward(e)):"upward"==k.direction&&C.set.upward(e)},upward:function(e){(e||j).addClass(S.upward)},leftward:function(e){(e||U).addClass(S.leftward)},value:function(e,t,n){var i=C.escape.value(e),a=V.length>0,o=C.get.values(),r=void 0!==e?String(e):e;if(a){if(!k.allowReselection&&r==o&&(C.verbose("Skipping value update already same value",e,o),!C.is.initialLoad()))return;C.is.single()&&C.has.selectInput()&&C.can.extendSelect()&&(C.debug("Adding user option",e),C.add.optionValue(e)),C.debug("Updating input value",i,o),Q=!0,V.val(i),!1===k.fireOnInit&&C.is.initialLoad()?C.debug("Input native change event ignored on initial load"):C.trigger.change(),Q=!1}else C.verbose("Storing value in metadata",i,V),i!==o&&j.data(L.value,r);!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("No callback on initial load",k.onChange):k.onChange.call(X,e,t,n)},active:function(){j.addClass(S.active)},multiple:function(){j.addClass(S.multiple)},visible:function(){j.addClass(S.visible)},exactly:function(e,t){C.debug("Setting selected to exact values"),C.clear(),C.set.selected(e,t)},selected:function(t,n){var i=C.is.multiple();(n=k.allowAdditions?n||C.get.itemWithAdditions(t):n||C.get.item(t))&&(C.debug("Setting selected menu item to",n),C.is.multiple()&&C.remove.searchWidth(),C.is.single()?(C.remove.activeItem(),C.remove.selectedItem()):k.useLabels&&C.remove.selectedItem(),n.each((function(){var t=e(this),a=C.get.choiceText(t),o=C.get.choiceValue(t,a),r=t.hasClass(S.filtered),s=t.hasClass(S.active),c=t.hasClass(S.addition),l=i&&1==n.length;i?!s||c?(k.apiSettings&&k.saveRemoteData&&C.save.remoteData(a,o),k.useLabels?(C.add.label(o,a,l),C.add.value(o,a,t),C.set.activeItem(t),C.filterActive(),C.select.nextAvailable(n)):(C.add.value(o,a,t),C.set.text(C.add.variables(_.count)),C.set.activeItem(t))):r||(C.debug("Selected active value, removing label"),C.remove.selected(o)):(k.apiSettings&&k.saveRemoteData&&C.save.remoteData(a,o),C.set.text(a),C.set.value(o,a,t),t.addClass(S.active).addClass(S.selected))})))}},add:{label:function(t,n,i){var a,o=C.is.searchSelection()?z:N,r=C.escape.value(t);k.ignoreCase&&(r=r.toLowerCase()),a=e("<a />").addClass(S.label).attr("data-"+L.value,r).html(R.label(r,n)),a=k.onLabelCreate.call(a,r,n),C.has.label(t)?C.debug("User selection already exists, skipping",r):(k.label.variation&&a.addClass(k.label.variation),!0===i?(C.debug("Animating in label",a),a.addClass(S.hidden).insertBefore(o).transition(k.label.transition,k.label.duration)):(C.debug("Adding selection label",a),a.insertBefore(o)))},message:function(t){var n=U.children(O.message),i=k.templates.message(C.add.variables(t));n.length>0?n.html(i):n=e("<div/>").html(i).addClass(S.message).appendTo(U)},optionValue:function(t){var n=C.escape.value(t);V.find('option[value="'+C.escape.string(n)+'"]').length>0||(C.disconnect.selectObserver(),C.is.single()&&(C.verbose("Removing previous user addition"),V.find("option."+S.addition).remove()),e("<option/>").prop("value",n).addClass(S.addition).html(t).appendTo(V),C.verbose("Adding user addition as an <option>",t),C.observe.select())},userSuggestion:function(e){var t,n=U.children(O.addition),i=C.get.item(e),a=i&&i.not(O.addition).length,o=n.length>0;k.useLabels&&C.has.maxSelections()||(""===e||a?n.remove():(o?(n.data(L.value,e).data(L.text,e).attr("data-"+L.value,e).attr("data-"+L.text,e).removeClass(S.filtered),k.hideAdditions||(t=k.templates.addition(C.add.variables(_.addResult,e)),n.html(t)),C.verbose("Replacing user suggestion with new value",n)):((n=C.create.userChoice(e)).prependTo(U),C.verbose("Adding item choice to menu corresponding with user choice addition",n)),k.hideAdditions&&!C.is.allFiltered()||n.addClass(S.selected).siblings().removeClass(S.selected),C.refreshItems()))},variables:function(e,t){var n,i,a=-1!==e.search("{count}"),o=-1!==e.search("{maxCount}"),r=-1!==e.search("{term}");return C.verbose("Adding templated variables to message",e),a&&(n=C.get.selectionCount(),e=e.replace("{count}",n)),o&&(n=C.get.selectionCount(),e=e.replace("{maxCount}",k.maxSelections)),r&&(i=t||C.get.query(),e=e.replace("{term}",i)),e},value:function(t,n,i){var a,o=C.get.values();C.has.value(t)?C.debug("Value already selected"):""!==t?(e.isArray(o)?(a=o.concat([t]),a=C.get.uniqueArray(a)):a=[t],C.has.selectInput()?C.can.extendSelect()&&(C.debug("Adding value to select",t,a,V),C.add.optionValue(t)):(a=a.join(k.delimiter),C.debug("Setting hidden input to delimited value",a,V)),!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("Skipping onadd callback on initial load",k.onAdd):k.onAdd.call(X,t,n,i),C.set.value(a,t,n,i),C.check.maxSelections()):C.debug("Cannot select blank values from multiselect")}},remove:{active:function(){j.removeClass(S.active)},activeLabel:function(){j.find(O.label).removeClass(S.active)},empty:function(){j.removeClass(S.empty)},loading:function(){j.removeClass(S.loading)},initialLoad:function(){p=!1},upward:function(e){(e||j).removeClass(S.upward)},leftward:function(e){(e||U).removeClass(S.leftward)},visible:function(){j.removeClass(S.visible)},activeItem:function(){K.removeClass(S.active)},filteredItem:function(){k.useLabels&&C.has.maxSelections()||(k.useLabels&&C.is.multiple()?K.not("."+S.active).removeClass(S.filtered):K.removeClass(S.filtered),C.remove.empty())},optionValue:function(e){var t=C.escape.value(e),n=V.find('option[value="'+C.escape.string(t)+'"]');n.length>0&&n.hasClass(S.addition)&&(y&&(y.disconnect(),C.verbose("Temporarily disconnecting mutation observer")),n.remove(),C.verbose("Removing user addition as an <option>",t),y&&y.observe(V[0],{childList:!0,subtree:!0}))},message:function(){U.children(O.message).remove()},searchWidth:function(){z.css("width","")},searchTerm:function(){C.verbose("Cleared search term"),z.val(""),C.set.filtered()},userAddition:function(){K.filter(O.addition).remove()},selected:function(t,n){if(!(n=k.allowAdditions?n||C.get.itemWithAdditions(t):n||C.get.item(t)))return!1;n.each((function(){var t=e(this),n=C.get.choiceText(t),i=C.get.choiceValue(t,n);C.is.multiple()?k.useLabels?(C.remove.value(i,n,t),C.remove.label(i)):(C.remove.value(i,n,t),0===C.get.selectionCount()?C.set.placeholderText():C.set.text(C.add.variables(_.count))):C.remove.value(i,n,t),t.removeClass(S.filtered).removeClass(S.active),k.useLabels&&t.removeClass(S.selected)}))},selectedItem:function(){K.removeClass(S.selected)},value:function(e,t,n){var i,a=C.get.values();C.has.selectInput()?(C.verbose("Input is <select> removing selected option",e),i=C.remove.arrayValue(e,a),C.remove.optionValue(e)):(C.verbose("Removing from delimited values",e),i=(i=C.remove.arrayValue(e,a)).join(k.delimiter)),!1===k.fireOnInit&&C.is.initialLoad()?C.verbose("No callback on initial load",k.onRemove):k.onRemove.call(X,e,t,n),C.set.value(i,t,n),C.check.maxSelections()},arrayValue:function(t,n){return e.isArray(n)||(n=[n]),n=e.grep(n,(function(e){return t!=e})),C.verbose("Removed value from delimited string",t,n),n},label:function(e,t){var n=j.find(O.label).filter("[data-"+L.value+'="'+C.escape.string(e)+'"]');C.verbose("Removing label",n),n.remove()},activeLabels:function(e){e=e||j.find(O.label).filter("."+S.active),C.verbose("Removing active label selections",e),C.remove.labels(e)},labels:function(t){t=t||j.find(O.label),C.verbose("Removing labels",t),t.each((function(){var t=e(this),n=t.data(L.value),i=void 0!==n?String(n):n,a=C.is.userValue(i);!1!==k.onLabelRemove.call(t,n)?(C.remove.message(),a?(C.remove.value(i),C.remove.label(i)):C.remove.selected(i)):C.debug("Label remove callback cancelled removal")}))},tabbable:function(){C.is.searchSelection()?(C.debug("Searchable dropdown initialized"),z.removeAttr("tabindex"),U.removeAttr("tabindex")):(C.debug("Simple selection dropdown initialized"),j.removeAttr("tabindex"),U.removeAttr("tabindex"))}},has:{menuSearch:function(){return C.has.search()&&z.closest(U).length>0},search:function(){return z.length>0},sizer:function(){return P.length>0},selectInput:function(){return V.is("select")},minCharacters:function(e){return!k.minCharacters||(e=String(void 0!==e?e:C.get.query())).length>=k.minCharacters},firstLetter:function(e,t){var n,i;return!(!e||0===e.length||"string"!=typeof t)&&(n=C.get.choiceText(e,!1),t=t.toLowerCase(),i=String(n).charAt(0).toLowerCase(),t==i)},input:function(){return V.length>0},items:function(){return K.length>0},menu:function(){return U.length>0},message:function(){return 0!==U.children(O.message).length},label:function(e){var t=C.escape.value(e),n=j.find(O.label);return k.ignoreCase&&(t=t.toLowerCase()),n.filter("[data-"+L.value+'="'+C.escape.string(t)+'"]').length>0},maxSelections:function(){return k.maxSelections&&C.get.selectionCount()>=k.maxSelections},allResultsFiltered:function(){var e=K.not(O.addition);return e.filter(O.unselectable).length===e.length},userSuggestion:function(){return U.children(O.addition).length>0},query:function(){return""!==C.get.query()},value:function(e){return k.ignoreCase?C.has.valueIgnoringCase(e):C.has.valueMatchingCase(e)},valueMatchingCase:function(t){var n=C.get.values();return!!(e.isArray(n)?n&&-1!==e.inArray(t,n):n==t)},valueIgnoringCase:function(t){var n=C.get.values(),i=!1;return e.isArray(n)||(n=[n]),e.each(n,(function(e,n){if(String(t).toLowerCase()==String(n).toLowerCase())return i=!0,!1})),i}},is:{active:function(){return j.hasClass(S.active)},animatingInward:function(){return U.transition("is inward")},animatingOutward:function(){return U.transition("is outward")},bubbledLabelClick:function(t){return e(t.target).is("select, input")&&j.closest("label").length>0},bubbledIconClick:function(t){return e(t.target).closest(B).length>0},alreadySetup:function(){return j.is("select")&&void 0!==j.parent(O.dropdown).data(F)&&0===j.prev().length},animating:function(e){return e?e.transition&&e.transition("is animating"):U.transition&&U.transition("is animating")},leftward:function(e){return(e||U).hasClass(S.leftward)},disabled:function(){return j.hasClass(S.disabled)},focused:function(){return n.activeElement===j[0]},focusedOnSearch:function(){return n.activeElement===z[0]},allFiltered:function(){return(C.is.multiple()||C.has.search())&&!(0==k.hideAdditions&&C.has.userSuggestion())&&!C.has.message()&&C.has.allResultsFiltered()},hidden:function(e){return!C.is.visible(e)},initialLoad:function(){return p},inObject:function(t,n){var i=!1;return e.each(n,(function(e,n){if(n==t)return i=!0,!0})),i},multiple:function(){return j.hasClass(S.multiple)},remote:function(){return k.apiSettings&&C.can.useAPI()},single:function(){return!C.is.multiple()},selectMutation:function(t){var n=!1;return e.each(t,(function(t,i){if(i.target&&e(i.target).is("select"))return n=!0,!0})),n},search:function(){return j.hasClass(S.search)},searchSelection:function(){return C.has.search()&&1===z.parent(O.dropdown).length},selection:function(){return j.hasClass(S.selection)},userValue:function(t){return-1!==e.inArray(t,C.get.userValues())},upward:function(e){return(e||j).hasClass(S.upward)},visible:function(e){return e?e.hasClass(S.visible):U.hasClass(S.visible)},verticallyScrollableContext:function(){var e=M.get(0)!==t&&M.css("overflow-y");return"auto"==e||"scroll"==e},horizontallyScrollableContext:function(){var e=M.get(0)!==t&&M.css("overflow-X");return"auto"==e||"scroll"==e}},can:{activate:function(e){return!!k.useLabels||(!C.has.maxSelections()||!(!C.has.maxSelections()||!e.hasClass(S.active)))},openDownward:function(e){var n,i,a=e||U,o=!0;return a.addClass(S.loading),i={context:{offset:M.get(0)===t?{top:0,left:0}:M.offset(),scrollTop:M.scrollTop(),height:M.outerHeight()},menu:{offset:a.offset(),height:a.outerHeight()}},C.is.verticallyScrollableContext()&&(i.menu.offset.top+=i.context.scrollTop),(n={above:i.context.scrollTop<=i.menu.offset.top-i.context.offset.top-i.menu.height,below:i.context.scrollTop+i.context.height>=i.menu.offset.top-i.context.offset.top+i.menu.height}).below?(C.verbose("Dropdown can fit in context downward",n),o=!0):n.below||n.above?(C.verbose("Dropdown cannot fit below, opening upward",n),o=!1):(C.verbose("Dropdown cannot fit in either direction, favoring downward",n),o=!0),a.removeClass(S.loading),o},openRightward:function(e){var n,i,a=e||U,o=!0;return a.addClass(S.loading),i={context:{offset:M.get(0)===t?{top:0,left:0}:M.offset(),scrollLeft:M.scrollLeft(),width:M.outerWidth()},menu:{offset:a.offset(),width:a.outerWidth()}},C.is.horizontallyScrollableContext()&&(i.menu.offset.left+=i.context.scrollLeft),(n=i.menu.offset.left-i.context.offset.left+i.menu.width>=i.context.scrollLeft+i.context.width)&&(C.verbose("Dropdown cannot fit in context rightward",n),o=!1),a.removeClass(S.loading),o},click:function(){return c||"click"==k.on},extendSelect:function(){return k.allowAdditions||k.apiSettings},show:function(){return!C.is.disabled()&&(C.has.items()||C.has.message())},useAPI:function(){return void 0!==e.fn.api}},animate:{show:function(t,n){var i,a=n||U,o=n?function(){}:function(){C.hideSubMenus(),C.hideOthers(),C.set.active()};t=e.isFunction(t)?t:function(){},C.verbose("Doing menu show animation",a),C.set.direction(n),i=C.get.transition(n),C.is.selection()&&C.set.scrollPosition(C.get.selectedItem(),!0),(C.is.hidden(a)||C.is.animating(a))&&("none"==i?(o(),a.transition("show"),t.call(X)):void 0!==e.fn.transition&&j.transition("is supported")?a.transition({animation:i+" in",debug:k.debug,verbose:k.verbose,duration:k.duration,queue:!0,onStart:o,onComplete:function(){t.call(X)}}):C.error(I.noTransition,i))},hide:function(t,n){var i=n||U,a=(n?k.duration:k.duration,n?function(){}:function(){C.can.click()&&C.unbind.intent(),C.remove.active()}),o=C.get.transition(n);t=e.isFunction(t)?t:function(){},(C.is.visible(i)||C.is.animating(i))&&(C.verbose("Doing menu hide animation",i),"none"==o?(a(),i.transition("hide"),t.call(X)):void 0!==e.fn.transition&&j.transition("is supported")?i.transition({animation:o+" out",duration:k.duration,debug:k.debug,verbose:k.verbose,queue:!1,onStart:a,onComplete:function(){t.call(X)}}):C.error(I.transition))}},hideAndClear:function(){C.remove.searchTerm(),C.has.maxSelections()||(C.has.search()?C.hide((function(){C.remove.filteredItem()})):C.hide())},delay:{show:function(){C.verbose("Delaying show event to ensure user intent"),clearTimeout(C.timer),C.timer=setTimeout(C.show,k.delay.show)},hide:function(){C.verbose("Delaying hide event to ensure user intent"),clearTimeout(C.timer),C.timer=setTimeout(C.hide,k.delay.hide)}},escape:{value:function(t){var n=e.isArray(t),i="string"==typeof t,a=!i&&!n,o=i&&-1!==t.search(D.quote),r=[];return a||!o?t:(C.debug("Encoding quote values for use in select",t),n?(e.each(t,(function(e,t){r.push(t.replace(D.quote,"&quot;"))})),r):t.replace(D.quote,"&quot;"))},string:function(e){return(e=String(e)).replace(D.escape,"\\$&")}},setting:function(t,n){if(C.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,k,t);else{if(void 0===n)return k[t];e.isPlainObject(k[t])?e.extend(!0,k[t],n):k[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,C,t);else{if(void 0===n)return C[t];C[t]=n}},debug:function(){!k.silent&&k.debug&&(k.performance?C.performance.log(arguments):(C.debug=Function.prototype.bind.call(console.info,console,k.name+":"),C.debug.apply(console,arguments)))},verbose:function(){!k.silent&&k.verbose&&k.debug&&(k.performance?C.performance.log(arguments):(C.verbose=Function.prototype.bind.call(console.info,console,k.name+":"),C.verbose.apply(console,arguments)))},error:function(){k.silent||(C.error=Function.prototype.bind.call(console.error,console,k.name+":"),C.error.apply(console,arguments))},performance:{log:function(e){var t,n;k.performance&&(n=(t=(new Date).getTime())-(l||t),l=t,d.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:X,"Execution Time":n})),clearTimeout(C.performance.timer),C.performance.timer=setTimeout(C.performance.display,500)},display:function(){var t=k.name+":",n=0;l=!1,clearTimeout(C.performance.timer),e.each(d,(function(e,t){n+=t["Execution Time"]})),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),(void 0!==console.group||void 0!==console.table)&&d.length>0&&(console.groupCollapsed(t),console.table?console.table(d):e.each(d,(function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")})),console.groupEnd()),d=[]}},invoke:function(t,n,i){var o,r,s,c=G;return n=n||f,i=X||i,"string"==typeof t&&void 0!==c&&(t=t.split(/[\. ]/),o=t.length-1,e.each(t,(function(n,i){var a=n!=o?i+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=o)c=c[a];else{if(void 0!==c[a])return r=c[a],!1;if(!e.isPlainObject(c[i])||n==o)return void 0!==c[i]?(r=c[i],!1):(C.error(I.method,t),!1);c=c[i]}}))),e.isFunction(r)?s=r.apply(i,n):void 0!==r&&(s=r),e.isArray(a)?a.push(s):void 0!==a?a=[a,s]:void 0!==s&&(a=s),r}},h?(void 0===G&&C.initialize(),C.invoke(u)):(void 0!==G&&G.invoke("destroy"),C.initialize())})),void 0!==a?a:o},e.fn.dropdown.settings={silent:!1,debug:!1,verbose:!1,performance:!0,on:"click",action:"activate",values:!1,apiSettings:!1,selectOnKeydown:!0,minCharacters:0,filterRemoteData:!1,saveRemoteData:!0,throttle:200,context:t,direction:"auto",keepOnScreen:!0,match:"both",fullTextSearch:!1,placeholder:"auto",preserveHTML:!0,sortSelect:!1,forceSelection:!0,allowAdditions:!1,ignoreCase:!1,hideAdditions:!0,maxSelections:!1,useLabels:!0,delimiter:",",showOnFocus:!0,allowReselection:!1,allowTab:!0,allowCategorySelection:!1,fireOnInit:!1,transition:"auto",duration:200,glyphWidth:1.037,label:{transition:"scale",duration:200,variation:!1},delay:{hide:300,show:200,search:20,touch:50},onChange:function(e,t,n){},onAdd:function(e,t,n){},onRemove:function(e,t,n){},onLabelSelect:function(e){},onLabelCreate:function(t,n){return e(this)},onLabelRemove:function(e){return!0},onNoResults:function(e){return!0},onShow:function(){},onHide:function(){},name:"Dropdown",namespace:"dropdown",message:{addResult:"Add <b>{term}</b>",count:"{count} selected",maxSelections:"Max {maxCount} selections",noResults:"No results found.",serverError:"There was an error contacting the server"},error:{action:"You called a dropdown action that was not defined",alreadySetup:"Once a select has been initialized behaviors must be called on the created ui dropdown",labels:"Allowing user additions currently requires the use of labels.",missingMultiple:"<select> requires multiple property to be set to correctly preserve multiple values",method:"The method you called is not defined.",noAPI:"The API module is required to load resources remotely",noStorage:"Saving remote data requires session storage",noTransition:"This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>"},regExp:{escape:/[-[\]{}()*+?.,\\^$|#\s]/g,quote:/"/g},metadata:{defaultText:"defaultText",defaultValue:"defaultValue",placeholderText:"placeholder",text:"text",value:"value"},fields:{remoteValues:"results",values:"values",disabled:"disabled",name:"name",value:"value",text:"text"},keys:{backspace:8,delimiter:188,deleteKey:46,enter:13,escape:27,pageUp:33,pageDown:34,leftArrow:37,upArrow:38,rightArrow:39,downArrow:40},selector:{addition:".addition",dropdown:".ui.dropdown",hidden:".hidden",icon:"> .dropdown.icon",input:'> input[type="hidden"], > select',item:".item",label:"> .label",remove:"> .label > .delete.icon",siblingLabel:".label",menu:".menu",message:".message",menuIcon:".dropdown.icon",search:"input.search, .menu > .search > input, .menu input.search",sizer:"> input.sizer",text:"> .text:not(.icon)",unselectable:".disabled, .filtered"},className:{active:"active",addition:"addition",animating:"animating",disabled:"disabled",empty:"empty",dropdown:"ui dropdown",filtered:"filtered",hidden:"hidden transition",item:"item",label:"ui label",loading:"loading",menu:"menu",message:"message",multiple:"multiple",placeholder:"default",sizer:"sizer",search:"search",selected:"selected",selection:"selection",upward:"upward",leftward:"left",visible:"visible"}},e.fn.dropdown.settings.templates={dropdown:function(t){var n=t.placeholder||!1,i=(t.values,"");return i+='<i class="dropdown icon"></i>',t.placeholder?i+='<div class="default text">'+n+"</div>":i+='<div class="text"></div>',i+='<div class="menu">',e.each(t.values,(function(e,t){i+=t.disabled?'<div class="disabled item" data-value="'+t.value+'">'+t.name+"</div>":'<div class="item" data-value="'+t.value+'">'+t.name+"</div>"})),i+="</div>"},menu:function(t,n){var i=t[n.values]||{},a="";return e.each(i,(function(e,t){var i=t[n.text]?'data-text="'+t[n.text]+'"':"",o=t[n.disabled]?"disabled ":"";a+='<div class="'+o+'item" data-value="'+t[n.value]+'"'+i+">",a+=t[n.name],a+="</div>"})),a},label:function(e,t){return t+'<i class="delete icon"></i>'},message:function(e){return e},addition:function(e){return e}}}(jQuery,window,document)},function(e,t,n){"use strict";n.r(t);n(3);var i=n(0),a=n.n(i),o=n(1),r=n.n(o);$((function(){var e,t,i,o,s;return a.a.async((function(c){for(;;)switch(c.prev=c.next){case 0:if(e=document.getElementById("graph-canvas")){c.next=3;break}return c.abrupt("return");case 3:return c.next=5,a.a.awrap(Promise.all([n.e(0).then(n.bind(null,13)),n.e(0).then(n.t.bind(null,14,7))]));case 5:t=c.sent,i=r()(t,1),o=i[0].default,s=[],$("#graph-raw-list li span.node-relation").each((function(){s.push($(this).text())})),o(e,s);case 11:case"end":return c.stop()}}))}));var s,c,l,d,u;n(8);function h(e){return jQuery("<div />").text(e).html()}function f(e){var t=e.find(".tabular.menu");t.find(".item").tab(),t.find('.item[data-tab="'.concat(t.data("preview"),'"]')).click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,mode:"gfm",context:n.data("context"),text:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("preview"),'"]'));i.html(n),emojify.run(i[0]),$("pre code",i[0]).each((function(){hljs.highlightBlock(this)}))}))})),S()}function m(){var e,t;0!==$(".edit.form").length&&(!function(e){var t=e.find(".tabular.menu");t.find(".item").tab();var n=t.find('.item[data-tab="'.concat(t.data("preview"),'"]'));n.length&&(l=n.data("preview-file-modes").split(","),n.click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,mode:"gfm",context:n.data("context"),text:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("preview"),'"]'));i.html(n),emojify.run(i[0]),$("pre code",i[0]).each((function(){hljs.highlightBlock(this)}))}))})))}($(".edit.form")),e=$(".edit.form"),(t=e.find(".tabular.menu")).find(".item").tab(),t.find('.item[data-tab="'.concat(t.data("diff"),'"]')).click((function(){var n=$(this);$.post(n.data("url"),{_csrf:s,context:n.data("context"),content:e.find('.tab.segment[data-tab="'.concat(t.data("write"),'"] textarea')).val()},(function(n){var i=e.find('.tab.segment[data-tab="'.concat(t.data("diff"),'"]'));i.html(n),emojify.run(i[0])}))})))}function v(e,t,n,i){return new Promise((function(a){$.ajax({type:"POST",url:e,data:{_csrf:s,action:t,issue_ids:n,id:i},success:a})}))}function p(){window.location.reload()}function g(e){e.each((function(){var e=this;e.addEventListener("paste",(function(t){!function(e,t){if(e.clipboardData){var n=e.clipboardData.items;if(void 0!==n)for(var i=0;i<n.length;i++)if(-1!==n[i].type.indexOf("image")){var a=n[i].getAsFile();"function"==typeof t&&(e.preventDefault(),e.stopPropagation(),t(a))}}}(t,(function(t){var n=t.name.substr(0,t.name.lastIndexOf("."));!function(e,t){if(e.selectionStart||0===e.selectionStart){var n=e.selectionStart,i=e.selectionEnd;e.value=e.value.substring(0,n)+t+e.value.substring(i,e.value.length),e.selectionStart=n+t.length,e.selectionEnd=n+t.length}else e.value+=t}(e,"![".concat(n,"]()")),function(e,t){var n=new XMLHttpRequest;n.onload=function(){200===n.status&&t(n.responseText)},n.open("post","".concat(c,"/attachments"),!0),n.setRequestHeader("X-Csrf-Token",s);var i=new FormData;i.append("file",e,e.name),n.send(i)}(t,(function(t){var i=JSON.parse(t);!function(e,t,n){if(e.selectionStart||0===e.selectionStart){var i=e.selectionStart,a=e.selectionEnd;e.value=e.value.replace(t,n),e.selectionStart=i+n.length-t.length,e.selectionEnd=a+n.length-t.length}else e.value=e.value.replace(t,n)}(e,"![".concat(n,"]()"),"![".concat(n,"](").concat(c,"/attachments/").concat(i.uuid,")"));var a=$('<input id="'.concat(i.uuid,'" name="files" type="hidden">')).val(i.uuid);$(".files").append(a)}))}))}),!1)}))}function b(){var e;0!==$(".comment.form").length&&((e=$(".ui.select-branch")).find(".reference-list-menu").find(".item:not(.no-select)").click((function(){var t=$(this).data("id");$($(this).data("id-selector")).val(t),e.find(".ui .branch-name").text(t)})),e.find(".reference.column").click((function(){return e.find(".scrolling.reference-list-menu").css("display","none"),e.find(".reference .text").removeClass("black"),$($(this).data("target")).css("display","block"),$(this).find(".text").addClass("black"),!1})),f($(".comment.form")),g($(".comment.form textarea")),t("select-label","labels"),t("select-assignees","assignees"),t("select-assignees-modify","assignees"),n(".select-milestone","#milestone_id"),n(".select-assignee","#assignee_id"));function t(e,t){var n=$(".ui.".concat(t,".list")),i=n.find(".no-select"),a=$(".".concat(e," .menu")),o="update"===a.data("action"),r={};$(".".concat(e)).dropdown("setting","onHide",(function(){if(o="update"===a.data("action")){var e=[];Object.keys(r).forEach((function(t){var n=r[t],i=v(n["update-url"],n.action,n["issue-id"],t);e.push(i)})),Promise.all(e).then(p)}})),a.find(".item:not(.no-select)").click((function(){if("select-assignees-modify"===e)return $(this).hasClass("checked")?($(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check")):($(this).addClass("checked"),$(this).find(".octicon").addClass("octicon-check")),v(a.data("update-url"),"",a.data("issue-id"),$(this).data("id")),a.data("action","update"),!1;$(this).hasClass("checked")?($(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check"),o&&($(this).data("id")in r?delete r[$(this).data("id")]:r[$(this).data("id")]={"update-url":a.data("update-url"),action:"detach","issue-id":a.data("issue-id")})):($(this).addClass("checked"),$(this).find(".octicon").addClass("octicon-check"),o&&($(this).data("id")in r?delete r[$(this).data("id")]:r[$(this).data("id")]={"update-url":a.data("update-url"),action:"attach","issue-id":a.data("issue-id")}));var t=[];return $(this).parent().find(".item").each((function(){$(this).hasClass("checked")?(t.push($(this).data("id")),$($(this).data("id-selector")).removeClass("hide")):$($(this).data("id-selector")).addClass("hide")})),0===t.length?i.removeClass("hide"):i.addClass("hide"),$($(this).parent().data("id")).val(t.join(",")),!1})),a.find(".no-select.item").click((function(){(o||"select-assignees-modify"===e)&&v(a.data("update-url"),"clear",a.data("issue-id"),"").then(p),$(this).parent().find(".item").each((function(){$(this).removeClass("checked"),$(this).find(".octicon").removeClass("octicon-check")})),n.find(".item").each((function(){$(this).addClass("hide")})),i.removeClass("hide"),$($(this).parent().data("id")).val("")}))}function n(e,t){var n=$("".concat(e," .menu")),i=$(".ui".concat(e,".list")),a="update"===n.data("action");n.find(".item:not(.no-select)").click((function(){switch($(this).parent().find(".item").each((function(){$(this).removeClass("selected active")})),$(this).addClass("selected active"),a&&v(n.data("update-url"),"",n.data("issue-id"),$(this).data("id")).then(p),t){case"#milestone_id":i.find(".selected").html('<a class="item" href='.concat($(this).data("href"),">").concat(h($(this).text()),"</a>"));break;case"#assignee_id":i.find(".selected").html('<a class="item" href='.concat($(this).data("href"),">")+'<img class="ui avatar image" src='.concat($(this).data("avatar"),">").concat(h($(this).text()),"</a>"))}$(".ui".concat(e,".list .no-select")).addClass("hide"),$(t).val($(this).data("id"))})),n.find(".no-select.item").click((function(){$(this).parent().find(".item:not(.no-select)").each((function(){$(this).removeClass("selected active")})),a&&v(n.data("update-url"),"",n.data("issue-id"),$(this).data("id")).then(p),i.find(".selected").html(""),i.find(".no-select").removeClass("hide"),$(t).val("")}))}}function w(){if(0!==$(".repository").length){if(($(".repository.file.list").length>0||".repository.commits".length>0)&&$(".choose.reference .dropdown").each((function(){var e=$(this).find(".data"),t={items:[],mode:e.data("mode"),searchTerm:"",noResults:"",canCreateBranch:!1,menuVisible:!1,active:0};e.find(".item").each((function(){t.items.push({name:$(this).text(),url:$(this).data("url"),branch:$(this).hasClass("branch"),tag:$(this).hasClass("tag"),selected:$(this).hasClass("selected")})})),e.remove(),new Vue({delimiters:["${","}"],el:this,data:t,beforeMount:function(){var e=this;this.noResults=e.$el.getAttribute("data-no-results"),this.canCreateBranch="true"===e.$el.getAttribute("data-can-create-branch"),document.body.addEventListener("click",(function(t){e.$el.contains(t.target)||e.menuVisible&&Vue.set(e,"menuVisible",!1)}))},watch:{menuVisible:function(e){e&&this.focusSearchField()}},computed:{filteredItems:function(){var e=this,t=e.items.filter((function(t){return("branches"===e.mode&&t.branch||"tags"===e.mode&&t.tag)&&(!e.searchTerm||t.name.toLowerCase().indexOf(e.searchTerm.toLowerCase())>=0)}));return e.active=0===t.length&&e.showCreateNewBranch?0:-1,t},showNoResults:function(){return 0===this.filteredItems.length&&!this.showCreateNewBranch},showCreateNewBranch:function(){var e=this;return!(!this.canCreateBranch||!e.searchTerm||"tags"===e.mode)&&0===e.items.filter((function(t){return t.name.toLowerCase()===e.searchTerm.toLowerCase()})).length}},methods:{selectItem:function(e){var t=this.getSelected();null!==t&&(t.selected=!1),e.selected=!0,window.location.href=e.url},createNewBranch:function(){this.showCreateNewBranch&&this.$refs.newBranchForm.submit()},focusSearchField:function(){var e=this;Vue.nextTick((function(){e.$refs.searchField.focus()}))},getSelected:function(){for(var e=0,t=this.items.length;e<t;++e)if(this.items[e].selected)return this.items[e];return null},getSelectedIndexInFiltered:function(){for(var e=0,t=this.filteredItems.length;e<t;++e)if(this.filteredItems[e].selected)return e;return-1},scrollToActive:function(){var e=this.$refs["listItem".concat(this.active)];if(e&&0!==e.length){Array.isArray(e)&&(e=e[0]);var t=this.$refs.scrollContainer;e.offsetTop<t.scrollTop?t.scrollTop=e.offsetTop:e.offsetTop+e.clientHeight>t.scrollTop+t.clientHeight&&(t.scrollTop=e.offsetTop+e.clientHeight-t.clientHeight)}},keydown:function(e){var t=this;if(40===e.keyCode){if(e.preventDefault(),-1===t.active&&(t.active=t.getSelectedIndexInFiltered()),t.active+(t.showCreateNewBranch?0:1)>=t.filteredItems.length)return;t.active++,t.scrollToActive()}if(38===e.keyCode){if(e.preventDefault(),-1===t.active&&(t.active=t.getSelectedIndexInFiltered()),t.active<=0)return;t.active--,t.scrollToActive()}13===e.keyCode&&(e.preventDefault(),t.active>=t.filteredItems.length?t.createNewBranch():t.active>=0&&t.selectItem(t.filteredItems[t.active])),27===e.keyCode&&(e.preventDefault(),t.menuVisible=!1)}}})})),$(".repository.wiki.view").length>0&&l(".choose.page .dropdown"),$(".repository.settings.options").length>0&&($("#repo_name").keyup((function(){var e=$("#repo-name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("name").toString().toLowerCase()?e.show():e.hide()})),$(".enable-system").change((function(){this.checked?($($(this).data("target")).removeClass("disabled"),$(this).data("context")||$($(this).data("context")).addClass("disabled")):($($(this).data("target")).addClass("disabled"),$(this).data("context")||$($(this).data("context")).removeClass("disabled"))})),$(".enable-system-radio").change((function(){"false"===this.value?($($(this).data("target")).addClass("disabled"),void 0!==$(this).data("context")&&$($(this).data("context")).removeClass("disabled")):"true"===this.value&&($($(this).data("target")).removeClass("disabled"),void 0!==$(this).data("context")&&$($(this).data("context")).addClass("disabled"))}))),$(".repository.labels").length>0){var e=$(".new-label.segment");$(".new-label.button").click((function(){e.show()})),$(".new-label.segment .cancel").click((function(){e.hide()})),$(".color-picker").each((function(){$(this).minicolors()})),$(".precolors .color").click((function(){var e=$(this).data("color-hex");$(".color-picker").val(e),$(".minicolors-swatch-color").css("background-color",e)})),$(".edit-label-button").click((function(){return $("#label-modal-id").val($(this).data("id")),$(".edit-label .new-label-input").val($(this).data("title")),$(".edit-label .new-label-desc-input").val($(this).data("description")),$(".edit-label .color-picker").val($(this).data("color")),$(".minicolors-swatch-color").css("background-color",$(this).data("color")),$(".edit-label.modal").modal({onApprove:function(){$(".edit-label.form").submit()}}).modal("show"),!1}))}if($(".repository.new.milestone").length>0){var t=$(".milestone.datepicker");t.datetimepicker({lang:t.data("lang"),inline:!0,timepicker:!1,startDate:t.data("start-date"),formatDate:"Y-m-d",onSelectDate:function(e){$("#deadline").val(e.dateFormat("Y-m-d"))}}),$("#clear-date").click((function(){return $("#deadline").val(""),!1}))}if($(".repository.view.issue").length>0){var n=$("#issue-title"),i=$("#edit-title-input input"),a=function(){return n.toggle(),$(".not-in-edit").toggle(),$("#edit-title-input").toggle(),$(".in-edit").toggle(),i.focus(),!1};$("#edit-title").click(a),$("#cancel-edit-title").click(a),$("#save-edit-title").click(a).click((function(){return 0===i.val().length||i.val()===n.text()?(i.val(n.text()),!1):($.post($(this).data("update-url"),{_csrf:s,title:i.val()},(function(e){i.val(e.title),n.text(e.title),p()})),!1)})),$(".context-dropdown").dropdown({action:"hide"}),$(".quote-reply").click((function(e){$(this).closest(".dropdown").find(".menu").toggle("visible");var t,n=$(this).data("target");if($(this).hasClass("quote-reply-diff")){var i=$(this).closest(".comment-code-cloud");i.find("button.comment-form-reply").click(),t=i.find('[name="content"]')}else t=$("#content");var a=$("#comment-".concat(n)).text().replace(/\n/g,"\n> "),o="> ".concat(a,"\n\n");""!==t.val()?t.val("".concat(t.val(),"\n\n").concat(o)):t.val("".concat(o)),t.focus(),e.preventDefault()})),$(".edit-content").click((function(e){$(this).closest(".dropdown").find(".menu").toggle("visible");var t,n=$(this).closest(".header").next(),i=n.find(".edit-content-zone"),a=n.find(".render-content"),o=n.find(".raw-content");if(0===i.html().length){i.html($("#edit-content-form").html()),t=i.find("textarea"),issuesTribute.attach(t.get()),emojiTribute.attach(t.get());var r=i.find(".dropzone");r.data("saved",!1);var c=i.find(".comment-files");if(r.length>0){var l={};r.dropzone({url:r.data("upload-url"),headers:{"X-Csrf-Token":s},maxFiles:r.data("max-file"),maxFilesize:r.data("max-size"),acceptedFiles:"*/*"===r.data("accepts")?null:r.data("accepts"),addRemoveLinks:!0,dictDefaultMessage:r.data("default-message"),dictInvalidFileType:r.data("invalid-input-type"),dictFileTooBig:r.data("file-too-big"),dictRemoveFile:r.data("remove-file"),init:function(){this.on("success",(function(e,t){l[e.name]={uuid:t.uuid,submitted:!1};var n=$('<input id="'.concat(t.uuid,'" name="files" type="hidden">')).val(t.uuid);c.append(n)})),this.on("removedfile",(function(e){e.name in l&&($("#".concat(l[e.name].uuid)).remove(),r.data("remove-url")&&r.data("csrf")&&!l[e.name].submitted&&$.post(r.data("remove-url"),{file:l[e.name].uuid,_csrf:r.data("csrf")}))})),this.on("submit",(function(){$.each(l,(function(e){l[e].submitted=!0}))})),this.on("reload",(function(){$.getJSON(i.data("attachment-url"),(function(e){var t=r.get(0).dropzone;t.removeAllFiles(!0),c.empty(),$.each(e,(function(){var e="".concat(r.data("upload-url"),"/").concat(this.uuid);t.emit("addedfile",this),t.emit("thumbnail",this,e),t.emit("complete",this),t.files.push(this),l[this.name]={submitted:!0,uuid:this.uuid},r.find("img[src='".concat(e,"']")).css("max-width","100%");var n=$('<input id="'.concat(this.uuid,'" name="files" type="hidden">')).val(this.uuid);c.append(n)}))}))}))}}),r.get(0).dropzone.emit("reload")}var d=i.find(".ui.comment.form"),u=d.find(".tabular.menu");u.attr("data-write",i.data("write")),u.attr("data-preview",i.data("preview")),u.find(".write.item").attr("data-tab",i.data("write")),u.find(".preview.item").attr("data-tab",i.data("preview")),d.find(".write.segment").attr("data-tab",i.data("write")),d.find(".preview.segment").attr("data-tab",i.data("preview")),f(d),i.find(".cancel.button").click((function(){a.show(),i.hide(),r.get(0).dropzone.emit("reload")})),i.find(".save.button").click((function(){a.show(),i.hide();var e=c.find("[name=files]").map((function(){return $(this).val()})).get();$.post(i.data("update-url"),{_csrf:s,content:t.val(),context:i.data("context"),files:e},(function(e){0===e.length?a.html($("#no-content").html()):(a.html(e.content),emojify.run(a[0]),$("pre code",a[0]).each((function(){hljs.highlightBlock(this)})));var t=n.parent();t.find(".ui.small.images").length?""===e.attachments?t.find(".ui.small.images").parent().remove():t.find(".ui.small.images").html(e.attachments):""!==e.attachments&&(t.append('<div class="ui bottom attached segment"><div class="ui small images"></div></div>'),t.find(".ui.small.images").html(e.attachments)),r.get(0).dropzone.emit("submit"),r.get(0).dropzone.emit("reload")}))}))}else t=n.find("textarea");i.show(),a.hide(),0===t.val().length&&t.val(o.text()),t.focus(),e.preventDefault()})),$(".delete-comment").click((function(){var e=$(this);return window.confirm(e.data("locale"))&&$.post(e.data("url"),{_csrf:s}).success((function(){$("#".concat(e.data("comment-id"))).remove()})),!1}));var o=$("#status-button");$("#comment-form .edit_area").keyup((function(){0===$(this).val().length?o.text(o.data("status")):o.text(o.data("status-and-comment"))})),o.click((function(){$("#status").val(o.data("status-val")),$("#comment-form").submit()}));var r=$(".merge-button > button");r.on("click",(function(e){e.preventDefault(),$(".".concat($(this).data("do"),"-fields")).show(),$(this).parent().hide()})),$(".merge-button > .dropdown").dropdown({onChange:function(e,t,n){n.data("do")&&(r.find(".button-text").text(n.text()),r.data("do",n.data("do")))}}),$(".merge-cancel").on("click",(function(e){e.preventDefault(),$(this).closest(".form").hide(),r.parent().show()})),function e(t){var n="";t||(t=$(document),n=".reactions > "),t.find("".concat(n,"a.label")).popup({position:"bottom left",metadata:{content:"title",title:"none"}}),t.find(".select-reaction > .menu > .item, ".concat(n,"a.label")).on("click",(function(t){var n=this;if(t.preventDefault(),!$(this).hasClass("disabled")){var i=$(this).hasClass("item")?$(this).closest(".select-reaction").data("action-url"):$(this).data("action-url"),a="".concat(i,"/").concat($(this).hasClass("blue")?"unreact":"react");$.ajax({type:"POST",url:a,data:{_csrf:s,content:$(this).data("content")}}).done((function(t){if(t&&(t.html||t.empty)){var i=$(n).closest(".content"),a=i.find(".segment.reactions");if(!t.empty&&a.length>0&&a.remove(),!t.empty){a=$('<div class="ui attached segment reactions"></div>');var o=i.find(".segment.bottom:first");o.length>0?a.insertBefore(o):a.appendTo(i),a.html(t.html);for(var r=a.find(".has-emoji"),s=0;s<r.length;s++)emojify.run(r.get(s));a.find(".dropdown").dropdown(),e(a)}}}))}}))}()}$(".repository.diff").length>0&&$(".diff-counter").each((function(){var e=$(this),t=e.find("span[data-line].add").data("line"),n=e.find("span[data-line].del").data("line"),i=parseFloat(t)/(parseFloat(t)+parseFloat(n))*100;e.find(".bar .add").css("width","".concat(i,"%"))})),$("#repo-clone-ssh").click((function(){$(".clone-url").text($(this).data("link")),$("#repo-clone-url").val($(this).data("link")),$(this).addClass("blue"),$("#repo-clone-https").removeClass("blue"),localStorage.setItem("repo-clone-protocol","ssh")})),$("#repo-clone-https").click((function(){$(".clone-url").text($(this).data("link")),$("#repo-clone-url").val($(this).data("link")),$(this).addClass("blue"),$("#repo-clone-ssh").removeClass("blue"),localStorage.setItem("repo-clone-protocol","https")})),$("#repo-clone-url").click((function(){$(this).select()}));var c=$(".repository.compare.pull");c.length>0&&(l(".choose.branch .dropdown"),c.find("button.show-form").on("click",(function(e){e.preventDefault(),c.find(".pullrequest-form").show(),$(this).parent().hide()}))),$(".repository.settings.branches").length>0&&(l(".protected-branches .dropdown"),$(".enable-protection, .enable-whitelist").change((function(){this.checked?$($(this).data("target")).removeClass("disabled"):$($(this).data("target")).addClass("disabled")})))}function l(e){var t=$(e);t.dropdown({fullTextSearch:!0,selectOnKeydown:!1,onChange:function(e,t,n){n.data("url")&&(window.location.href=n.data("url"))},message:{noResults:t.data("no-results")}})}}function y(e){var t=Math.floor(Math.random()*Math.floor(1e6));return e.attr("data-write",e.attr("data-write")+t),e.attr("data-preview",e.attr("data-preview")+t),e.find(".item").each((function(){var e=$(this).attr("data-tab")+t;$(this).attr("data-tab",e)})),e.parent().find("*[data-tab='write']").attr("data-tab","write".concat(t)),e.parent().find("*[data-tab='preview']").attr("data-tab","preview".concat(t)),f(e.parent(".form")),t}function x(){$(".access-mode.menu .item").click((function(){var e=$(this).parent();$.post(e.data("url"),{_csrf:s,uid:e.data("uid"),mode:$(this).data("value")})}))}function C(){$(".js-quick-pull-choice-option").change((function(){"commit-to-new-branch"===$(this).val()?($(".quick-pull-branch-name").show(),$(".quick-pull-branch-name input").prop("required",!0)):($(".quick-pull-branch-name").hide(),$(".quick-pull-branch-name input").prop("required",!1)),$("#commit-button").text($(this).attr("button_text"))}));var e=$("#file-name");e.keyup((function(e){var t,n,i=$(".breadcrumb span.section"),a=$(".breadcrumb div.divider");if(8===e.keyCode&&0===$(this).getCursorPosition()&&i.length>0&&(t=i.last().find("a").text(),$(this).val(t+$(this).val()),$(this)[0].setSelectionRange(t.length,t.length),i.last().remove(),a.last().remove()),191===e.keyCode){n=$(this).val().split("/");for(var o=0;o<n.length;++o)t=n[o],o<n.length-1?t.length&&($('<span class="section"><a href="#">'.concat(t,"</a></span>")).insertBefore($(this)),$('<div class="divider"> / </div>').insertBefore($(this))):$(this).val(t),$(this)[0].setSelectionRange(0,0)}n=[],$(".breadcrumb span.section").each((function(){var e=$(this);e.find("a").length?n.push(e.find("a").text()):n.push(e.text())})),$(this).val()&&n.push($(this).val()),$("#tree_path").val(n.join("/"))})).trigger("keyup");var t=$(".repository.editor textarea#edit_area");if(t.length){var n=t.data("markdown-file-exts").split(","),i=t.data("line-wrap-extensions").split(",");e.on("keyup",(function(){var a,o,r,c,h,f,m=e.val();r=c="";var v=/.+\.([^.]+)$/.exec(m);v&&(r=v[1],c=".".concat(r));var p=CodeMirror.findModeByExtension(r),g=$("a[data-tab=preview]");if(p?(a=p.mode,o=p.mime,f=a):f=r,g.length&&f&&l&&l.length&&l.indexOf(f)>=0?(h=g.data("url"),g.data("url",h.replace(/(.*)\/.*/i,"$1/".concat(a))),g.show()):g.hide(),!(n.indexOf(c)>=0&&function(e){return u&&(u.toTextArea(),u=null),!!d||(d=new SimpleMDE({autoDownloadFontAwesome:!1,element:e[0],forceSync:!0,renderingConfig:{singleLineBreaks:!1},indentWithTabs:!1,tabSize:4,spellChecker:!1,previewRender:function(t,n){return setTimeout((function(){$.post(e.data("url"),{_csrf:s,mode:"gfm",context:e.data("context"),text:t},(function(e){n.innerHTML='<div class="markdown ui segment">'.concat(e,"</div>"),emojify.run($(".editor-preview")[0])}))}),0),"Loading..."},toolbar:["bold","italic","strikethrough","|","heading-1","heading-2","heading-3","heading-bigger","heading-smaller","|","code","quote","|","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","clean-block","preview","fullscreen","side-by-side"]}),!0)}(t))&&(u||function(e){return d&&(d.toTextArea(),d=null),!!u||((u=CodeMirror.fromTextArea(e[0],{lineNumbers:!0})).on("change",(function(t,n){e.val(t.getValue())})),!0)}(t))){a&&(u.setOption("mode",o),CodeMirror.autoLoadMode(u,a)),i.indexOf(c)>=0?u.setOption("lineWrapping",!0):u.setOption("lineWrapping",!1);var b=e.val();0!==b.length&&(b=(b=b.split("/"))[b.length-1],$.getJSON(e.data("ec-url-prefix")+b,(function(e){"tab"===e.indent_style?(u.setOption("indentWithTabs",!0),u.setOption("extraKeys",{})):(u.setOption("indentWithTabs",!1),u.setOption("extraKeys",{Tab:function(e){var t=Array(parseInt(e.getOption("indentUnit"))+1).join(" ");e.replaceSelection(t)}})),u.setOption("indentUnit",e.indent_size||4),u.setOption("tabSize",e.tab_width||4)})))}})).trigger("keyup");var a=$("#commit-button"),o=$(".ui.edit.form");a.prop("disabled",!0),o.areYouSure({silent:!0,dirtyClass:"dirty-file",fieldSelector:":input:not(.commit-form-wrapper :input)",change:function(){var e=$(this).hasClass("dirty-file");a.prop("disabled",!e)}}),a.click((function(e){0===t.val().length&&($("#edit-empty-content-modal").modal({onApprove:function(){$(".edit.form").submit()}}).modal("show"),e.preventDefault())}))}}function k(){$(".user.settings.profile").length>0&&$("#username").keyup((function(){var e=$("#name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("name").toString().toLowerCase()?e.show():e.hide()}))}function S(){$(".ui.button").keypress((function(e){13!==e.keyCode&&32!==e.keyCode||$(this).click()}))}function _(){$(".code-view .linenums").length>0&&($(document).on("click",".lines-num span",(function(e){var t=$(this),n=t.parent().siblings(".lines-code").find("ol.linenums > li");O(n,n.filter("[rel=".concat(t.attr("id"),"]")),e.shiftKey?n.filter(".active").eq(0):null),window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()})),$(window).on("hashchange",(function(){var e,t=window.location.hash.match(/^#(L\d+)-(L\d+)$/),n=$(".code-view ol.linenums > li");if(t)return e=n.filter(".".concat(t[1])),O(n,e,n.filter(".".concat(t[2]))),void $("html, body").scrollTop(e.offset().top-200);(t=window.location.hash.match(/^#(L|n)(\d+)$/))&&(e=n.filter(".L".concat(t[2])),O(n,e),$("html, body").scrollTop(e.offset().top-200))})).trigger("hashchange")),$(".ui.fold-code").on("click",(function(e){var t=$(e.target);t.hasClass("fa-chevron-down")?$(e.target).parent().next().slideUp("fast",(function(){t.removeClass("fa-chevron-down").addClass("fa-chevron-right")})):$(e.target).parent().next().slideDown("fast",(function(){t.removeClass("fa-chevron-right").addClass("fa-chevron-down")}))})),$(".ui.blob-excerpt").on("click",(function(e){!function e(t){var n=$(t.target),i=n.parent().parent();$.get("".concat(n.data("url"),"?").concat(n.data("query"),"&anchor=").concat(n.data("anchor")),(function(t){i.replaceWith(t),$('[data-anchor="'.concat(n.data("anchor"),'"]')).on("click",(function(t){e(t)}))}))}(e)}))}function T(e){$.ajax({url:"".concat(c,"/user/u2f/sign"),type:"POST",headers:{"X-Csrf-Token":s},data:JSON.stringify(e),contentType:"application/json; charset=utf-8"}).done((function(e){window.location.replace(e)})).fail((function(){L(1)}))}function A(e){(function(e){if(!("errorCode"in e))return!1;if(0===e.errorCode)return!1;return L(e.errorCode),!0})(e)||$.ajax({url:"".concat(c,"/user/settings/security/u2f/register"),type:"POST",headers:{"X-Csrf-Token":s},data:JSON.stringify(e),contentType:"application/json; charset=utf-8",success:function(){p()},fail:function(){L(1)}})}function L(e){var t={browser:$("#unsupported-browser"),1:$("#u2f-error-1"),2:$("#u2f-error-2"),3:$("#u2f-error-3"),4:$("#u2f-error-4"),5:$(".u2f-error-5")};t[e].removeClass("hide"),Object.keys(t).forEach((function(n){n!==e&&t[n].addClass("hide")})),$("#u2f-error").modal("show")}function q(){$.post("".concat(c,"/user/settings/security/u2f/request_register"),{_csrf:s,name:$("#nickname").val()}).success((function(e){$("#nickname").closest("div.field").removeClass("error"),$("#register-device").modal("show"),null===e.registeredKeys&&(e.registeredKeys=[]),u2fApi.register(e.appId,e.registerRequests,e.registeredKeys,30).then(A).catch((function(e){L(void 0!==e?e.metaData.code:1)}))})).fail((function(e){409===e.status&&$("#nickname").closest("div.field").addClass("error")}))}function D(e){window.history.pushState?window.history.pushState(null,null,e):window.location.hash=e}function O(e,t,n){if(e.removeClass("active"),n){var i,a=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1));if(a!==o){a>o&&(i=a,a=o,o=i);for(var r=[],s=a;s<=o;s++)r.push(".L".concat(s));return e.filter(r.join(",")).addClass("active"),void D("#L".concat(a,"-L").concat(o))}}t.addClass("active"),D("#".concat(t.attr("rel")))}function I(){var e=$(this),t="";e.attr("id")&&(t+="#".concat(e.attr("id")));var n=$(".delete.modal".concat(t));return n.find(".name").text(e.data("name")),n.modal({closable:!1,onApprove:function(){"form"!==e.data("type")?$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect})):$(e.data("form")).submit()}}).modal("show"),!1}function R(){var e=$(this),t="";e.attr("id")&&(t+="#".concat(e.attr("id")));var n=$(".addall.modal".concat(t));return n.find(".name").text(e.data("name")),n.modal({closable:!1,onApprove:function(){"form"!==e.data("type")?$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect})):$(e.data("form")).submit()}}).modal("show"),!1}"undefined"!=typeof Dropzone&&(Dropzone.autoDiscover=!1),$.fn.getCursorPosition=function(){var e=$(this).get(0),t=0;if("selectionStart"in e)t=e.selectionStart;else if("selection"in document){e.focus();var n=document.selection.createRange(),i=document.selection.createRange().text.length;n.moveStart("character",-e.value.length),t=n.text.length-i}return t},$(document).ready((function(){if(s=$("meta[name=_csrf]").attr("content"),c=$("meta[name=_suburl]").attr("content"),$(".time-since").each((function(){$(this).addClass("poping up").attr("data-content",$(this).attr("title")).attr("data-variation","inverted tiny").attr("title","")})),$(".dropdown:not(.custom)").dropdown(),$(".jump.dropdown").dropdown({action:"hide",onShow:function(){$(".poping.up").popup("hide")}}),$(".slide.up.dropdown").dropdown({transition:"slide up"}),$(".upward.dropdown").dropdown({direction:"upward"}),$(".ui.accordion").accordion(),$(".ui.checkbox").checkbox(),$(".ui.progress").progress({showActivity:!1}),$(".poping.up").popup(),$(".top.menu .poping.up").popup({onShow:function(){if($(".top.menu .menu.transition").hasClass("visible"))return!1}}),$(".tabular.menu .item").tab(),$(".tabable.menu .item").tab(),$(".toggle.button").click((function(){$($(this).data("target")).slideToggle(100)})),$("tr[data-href]").click((function(){window.location=$(this).data("href")})),"undefined"!=typeof hljs)for(var e=[].slice.call(document.querySelectorAll("pre code")||[]),t=0;t<e.length;t++)hljs.highlightBlock(e[t]);var n=$("#dropzone");if(n.length>0){var i={};new Dropzone("#dropzone",{url:n.data("upload-url"),headers:{"X-Csrf-Token":s},maxFiles:n.data("max-file"),maxFilesize:n.data("max-size"),acceptedFiles:"*/*"===n.data("accepts")?null:n.data("accepts"),addRemoveLinks:!0,dictDefaultMessage:n.data("default-message"),dictInvalidFileType:n.data("invalid-input-type"),dictFileTooBig:n.data("file-too-big"),dictRemoveFile:n.data("remove-file"),init:function(){this.on("success",(function(e,t){i[e.name]=t.uuid;var n=$('<input id="'.concat(t.uuid,'" name="files" type="hidden">')).val(t.uuid);$(".files").append(n)})),this.on("removedfile",(function(e){e.name in i&&$("#".concat(i[e.name])).remove(),n.data("remove-url")&&n.data("csrf")&&$.post(n.data("remove-url"),{file:i[e.name],_csrf:n.data("csrf")})}))}})}emojify.setConfig({img_dir:"".concat(c,"/vendor/plugins/emojify/images"),ignore_emoticons:!0});for(var a=document.getElementsByClassName("has-emoji"),o=0;o<a.length;o++){emojify.run(a[o]);for(var r=0;r<a[o].childNodes.length;r++)"A"===a[o].childNodes[r].nodeName&&emojify.run(a[o].childNodes[r])}var l,d,u,f,g,A,D,O,E,F,j,M,N,z,P,V=new Clipboard(".clipboard");if(V.on("success",(function(e){e.clearSelection(),$("#".concat(e.trigger.getAttribute("id"))).popup("destroy"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-success")),$("#".concat(e.trigger.getAttribute("id"))).popup("show"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-original"))})),V.on("error",(function(e){$("#".concat(e.trigger.getAttribute("id"))).popup("destroy"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-error")),$("#".concat(e.trigger.getAttribute("id"))).popup("show"),e.trigger.setAttribute("data-content",e.trigger.getAttribute("data-original"))})),$(".delete-button").click(I),$(".add-all-button").click(R),$(".delete-branch-button").click(I),$(".undo-button").click((function(){var e=$(this);$.post(e.data("url"),{_csrf:s,id:e.data("id")}).done((function(e){window.location.href=e.redirect}))})),$(".show-panel.button").click((function(){$($(this).data("panel")).show()})),$(".show-modal.button").click((function(){$($(this).data("modal")).modal("show")})),$(".delete-post.button").click((function(){var e=$(this);$.post(e.data("request-url"),{_csrf:s}).done((function(){window.location.href=e.data("done-url")}))})),$(".markdown").each((function(){var e={};$(this).find("h1, h2, h3, h4, h5, h6").each((function(){var t=$(this),n=encodeURIComponent(t.text().toLowerCase().replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g,"").replace(/[ ]/g,"-")),i=n;e[n]>0&&(i="".concat(n,"-").concat(e[n])),void 0===e[n]?e[n]=1:e[n]+=1,(t=t.wrap('<div id="'.concat(i,'" class="anchor-wrap" ></div>'))).append('<a class="anchor" href="#'.concat(i,'"><span class="octicon octicon-link"></span></a>'))}))})),$(".issue-checkbox").click((function(){$(".issue-checkbox").children("input:checked").length>0?($("#issue-filters").addClass("hide"),$("#issue-actions").removeClass("hide")):($("#issue-filters").removeClass("hide"),$("#issue-actions").addClass("hide"))})),$(".issue-action").click((function(){var e=this.dataset.action,t=this.dataset.elementId,n=$(".issue-checkbox").children("input:checked").map((function(){return this.dataset.issueId})).get().join(),i=this.dataset.url;"0"===t&&"/assignee"===i.substr(-9)&&(t="",e="clear"),v(i,e,n,t).then((function(){"close"!==e&&"open"!==e||$('.issue-checkbox input[type="checkbox"]').each((function(e,t){t.checked=!1})),p()}))})),$('.issue-checkbox input[type="checkbox"]:checked').first().each((function(e,t){t.checked=!1,$(t).click()})),S(),$("#search-user-box").search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/users/search?q={query}"),onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){var i=n.login;n.full_name&&n.full_name.length>0&&(i+=" (".concat(h(n.full_name),")")),t.push({title:i,image:n.avatar_url})})),{results:t}}},searchFields:["login","full_name"],showNoResults:!1}),(l=$("#search-team-box")).search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/orgs/").concat(l.data("org"),"/teams/search?q={query}"),headers:{"X-Csrf-Token":s},onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){var i="".concat(n.name," (").concat(n.permission," access)");t.push({title:i})})),{results:t}}},searchFields:["name","description"],showNoResults:!1}),(d=$("#search-repo-box")).search({minCharacters:2,apiSettings:{url:"".concat(c,"/api/v1/repos/search?q={query}&uid=").concat(d.data("uid")),onResponse:function(e){var t=[];return $.each(e.data,(function(e,n){t.push({title:n.full_name.split("/")[1],description:n.full_name})})),{results:t}}},searchFields:["full_name"],showNoResults:!1}),b(),0!==$(".install").length&&(""===$("#db_host").val()&&($("#db_host").val("127.0.0.1:3306"),$("#db_user").val("gitea"),$("#db_name").val("gitea")),$("#db_type").change((function(){var e=$(this).val();if("SQLite3"===e)return $("#sql_settings").hide(),$("#pgsql_settings").hide(),$("#mysql_settings").hide(),$("#sqlite_settings").show(),void("SQLite3"===e&&"data/gitea_tidb"===$("#db_path").val()&&$("#db_path").val("data/gitea.db"));var t={MySQL:"127.0.0.1:3306",PostgreSQL:"127.0.0.1:5432",MSSQL:"127.0.0.1:1433"};$("#sqlite_settings").hide(),$("#sql_settings").show(),$("#pgsql_settings").toggle("PostgreSQL"===e),$("#mysql_settings").toggle("MySQL"===e),$.each(t,(function(n,i){if($("#db_host").val()===i)return $("#db_host").val(t[e]),!1}))})),$("#offline-mode input").change((function(){$(this).is(":checked")&&($("#disable-gravatar").checkbox("check"),$("#federated-avatar-lookup").checkbox("uncheck"))})),$("#disable-gravatar input").change((function(){$(this).is(":checked")?$("#federated-avatar-lookup").checkbox("uncheck"):$("#offline-mode").checkbox("uncheck")})),$("#federated-avatar-lookup input").change((function(){$(this).is(":checked")&&($("#disable-gravatar").checkbox("uncheck"),$("#offline-mode").checkbox("uncheck"))})),$("#enable-openid-signin input").change((function(){$(this).is(":checked")?$("#disable-registration input").is(":checked")||$("#enable-openid-signup").checkbox("check"):$("#enable-openid-signup").checkbox("uncheck")})),$("#disable-registration input").change((function(){$(this).is(":checked")?($("#enable-captcha").checkbox("uncheck"),$("#enable-openid-signup").checkbox("uncheck")):$("#enable-openid-signup").checkbox("check")})),$("#enable-captcha input").change((function(){$(this).is(":checked")&&$("#disable-registration").checkbox("uncheck")}))),w(),(u=function(){var e=$("#auth_username").val(),t=$("#clone_addr").val();!$("#mirror").is(":checked")&&e&&e.length>0&&void 0!==t&&(t.startsWith("https://github.com")||t.startsWith("http://github.com"))?$("#migrate_items").show():$("#migrate_items").hide()})(),$("#clone_addr").on("input",u),$("#auth_username").on("input",u),$("#mirror").on("change",u),function(){var e=$(".repository.wiki textarea#edit_area"),t=0,n=null;if(e.length>0){var i=new SimpleMDE({autoDownloadFontAwesome:!1,element:e[0],forceSync:!0,previewRender:function(a,o){return setTimeout((function(){var r=function(){t=0,null!=n&&(clearTimeout(n),n=null),$.post(e.data("url"),{_csrf:s,mode:"gfm",context:e.data("context"),text:a},(function(e){o.innerHTML='<div class="markdown ui segment">'.concat(e,"</div>"),emojify.run($(".editor-preview")[0]),$(o).find("pre code").each((function(e,t){hljs.highlightBlock(t)}))}))};i.isSideBySideActive()?(++t>10&&r(),null!=n&&(clearTimeout(n),n=null),n=setTimeout(r,600)):r()}),0),i.isSideBySideActive()?o.innerHTML:"Loading..."},renderingConfig:{singleLineBreaks:!1},indentWithTabs:!1,tabSize:4,spellChecker:!1,toolbar:["bold","italic","strikethrough","|","heading-1","heading-2","heading-3","heading-bigger","heading-smaller","|",{name:"code-inline",action:function(e){var t=e.codemirror,n=t.getSelection();if(t.replaceSelection("`".concat(n,"`")),!n){var i=t.getCursor();t.setCursor(i.line,i.ch-1)}t.focus()},className:"fa fa-angle-right",title:"Add Inline Code"},"code","quote","|",{name:"checkbox-empty",action:function(e){var t=e.codemirror;t.replaceSelection("\n- [ ] ".concat(t.getSelection())),t.focus()},className:"fa fa-square-o",title:"Add Checkbox (empty)"},{name:"checkbox-checked",action:function(e){var t=e.codemirror;t.replaceSelection("\n- [x] ".concat(t.getSelection())),t.focus()},className:"fa fa-check-square-o",title:"Add Checkbox (checked)"},"|","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","clean-block","preview","fullscreen","side-by-side"]});$(i.codemirror.getInputField()).addClass("js-quick-submit"),setTimeout((function(){var e=$('.repository.wiki.new .previewtabs a[data-tab="write"]'),n=$('.repository.wiki.new .previewtabs a[data-tab="preview"]'),i=$(".editor-toolbar"),a=$(".editor-toolbar a.fa-eye"),o=$(".editor-toolbar a.fa-columns");e.on("click",(function(){i.hasClass("disabled-for-preview")&&a.click()})),n.on("click",(function(){i.hasClass("disabled-for-preview")||a.click()})),a.on("click",(function(){setTimeout((function(){i.hasClass("disabled-for-preview")?(e.hasClass("active")&&e.removeClass("active"),n.hasClass("active")||n.addClass("active")):(e.hasClass("active")||e.addClass("active"),n.hasClass("active")&&n.removeClass("active"))}),0)})),o.on("click",(function(){t=10}))}),0)}}(),m(),C(),0!==$(".organization").length&&$(".organization.settings.options").length>0&&$("#org_name").keyup((function(){var e=$("#org-name-change-prompt");$(this).val().toString().toLowerCase()!==$(this).data("org-name").toString().toLowerCase()?e.show():e.hide()})),0!==$(".edit.githook").length&&CodeMirror.autoLoadMode(CodeMirror.fromTextArea($("#content")[0],{lineNumbers:!0,mode:"shell"}),"shell"),function(){if(0!==$(".new.webhook").length){$(".events.checkbox input").change((function(){$(this).is(":checked")&&$(".events.fields").show()})),$(".non-events.checkbox input").change((function(){$(this).is(":checked")&&$(".events.fields").hide()}));var e=function(){var e="POST"===$("#http_method").val();$("#content_type").parent().parent()[e?"show":"hide"]()};e(),$("#http_method").change((function(){e()})),$("#test-delivery").click((function(){var e=$(this);e.addClass("loading disabled"),$.post(e.data("link"),{_csrf:s}).done(setTimeout((function(){window.location.href=e.data("redirect")}),5e3))}))}}(),function(){if(0!==$(".admin").length){if(($(".admin.new.user").length>0||$(".admin.edit.user").length>0)&&$("#login_type").change((function(){"0"===$(this).val().substring(0,1)?($("#login_name").removeAttr("required"),$(".non-local").hide(),$(".local").show(),$("#user_name").focus(),"required"===$(this).data("password")&&$("#password").attr("required","required")):($("#login_name").attr("required","required"),$(".non-local").show(),$(".local").hide(),$("#login_name").focus(),$("#password").removeAttr("required"))})),$(".admin.new.authentication").length>0&&($("#auth_type").change((function(){$(".ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size .sspi").hide(),$(".ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required], .sspi input[required]").removeAttr("required"),$(".binddnrequired").removeClass("required");var e=$(this).val();switch(e){case"2":$(".ldap").show(),$(".binddnrequired input, .ldap div.required:not(.dldap) input").attr("required","required"),$(".binddnrequired").addClass("required");break;case"3":$(".smtp").show(),$(".has-tls").show(),$(".smtp div.required input, .has-tls").attr("required","required");break;case"4":$(".pam").show(),$(".pam input").attr("required","required");break;case"5":$(".dldap").show(),$(".dldap div.required:not(.ldap) input").attr("required","required");break;case"6":$(".oauth2").show(),$(".oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input").attr("required","required"),o();break;case"7":$(".sspi").show(),$(".sspi div.required input").attr("required","required")}"2"!==e&&"5"!==e||i(),"2"===e&&a()})),$("#auth_type").change(),$("#security_protocol").change(i),$("#use_paged_search").change(a),$("#oauth2_provider").change(o),$("#oauth2_use_custom_url").change(r)),$(".admin.edit.authentication").length>0){var e=$("#auth_type").val();"2"===e||"5"===e?($("#security_protocol").change(i),"2"===e&&$("#use_paged_search").change(a)):"6"===e&&($("#oauth2_provider").change(o),$("#oauth2_use_custom_url").change(r),o())}if($(".admin.notice")){var t=$("#detail-modal");$(".view-detail").click((function(){return t.find(".content p").text($(this).data("content")),t.modal("show"),!1}));var n=$(".select.table .ui.checkbox");$(".select.action").click((function(){switch($(this).data("action")){case"select-all":n.checkbox("check");break;case"deselect-all":n.checkbox("uncheck");break;case"inverse":n.checkbox("toggle")}})),$("#delete-selection").click((function(){var e=$(this);e.addClass("loading disabled");var t=[];n.each((function(){$(this).checkbox("is checked")&&t.push($(this).data("id"))})),$.post(e.data("link"),{_csrf:s,ids:t}).done((function(){window.location.href=e.data("redirect")}))}))}}function i(){$("#security_protocol").val()>0?$(".has-tls").show():$(".has-tls").hide()}function a(){$("#use_paged_search").prop("checked")?$(".search-page-size").show().find("input").attr("required","required"):$(".search-page-size").hide().find("input").removeAttr("required")}function o(){switch($(".open_id_connect_auto_discovery_url, .oauth2_use_custom_url").hide(),$(".open_id_connect_auto_discovery_url input[required]").removeAttr("required"),$("#oauth2_provider").val()){case"github":case"gitlab":case"gitea":$(".oauth2_use_custom_url").show();break;case"openidConnect":$(".open_id_connect_auto_discovery_url input").attr("required","required"),$(".open_id_connect_auto_discovery_url").show()}r()}function r(){var e=$("#oauth2_provider").val();if($(".oauth2_use_custom_url_field").hide(),$(".oauth2_use_custom_url_field input[required]").removeAttr("required"),$("#oauth2_use_custom_url").is(":checked"))switch($("#oauth2_token_url").val()||$("#oauth2_token_url").val($("#".concat(e,"_token_url")).val()),$("#oauth2_auth_url").val()||$("#oauth2_auth_url").val($("#".concat(e,"_auth_url")).val()),$("#oauth2_profile_url").val()||$("#oauth2_profile_url").val($("#".concat(e,"_profile_url")).val()),$("#oauth2_email_url").val()||$("#oauth2_email_url").val($("#".concat(e,"_email_url")).val()),e){case"github":$(".oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input").attr("required","required"),$(".oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url").show();break;case"gitea":case"gitlab":$(".oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input").attr("required","required"),$(".oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url").show(),$("#oauth2_email_url").val("")}}}(),_(),function(){var e=document.getElementById("app");if(!e)return;Vue.component("repo-search",{delimiters:["${","}"],props:{searchLimit:{type:Number,default:10},suburl:{type:String,required:!0},uid:{type:Number,required:!0},organizations:{type:Array,default:[]},isOrganization:{type:Boolean,default:!0},canCreateOrganization:{type:Boolean,default:!1},organizationsTotalCount:{type:Number,default:0},moreReposLink:{type:String,default:""}},data:function(){return{tab:"repos",repos:[],reposTotalCount:0,reposFilter:"all",searchQuery:"",isLoading:!1,repoTypes:{all:{count:0,searchMode:""},forks:{count:0,searchMode:"fork"},mirrors:{count:0,searchMode:"mirror"},sources:{count:0,searchMode:"source"},collaborative:{count:0,searchMode:"collaborative"}}}},computed:{showMoreReposLink:function(){return this.repos.length>0&&this.repos.length<this.repoTypes[this.reposFilter].count},searchURL:function(){return"".concat(this.suburl,"/api/v1/repos/search?sort=updated&order=desc&uid=").concat(this.uid,"&q=").concat(this.searchQuery,"&limit=").concat(this.searchLimit,"&mode=").concat(this.repoTypes[this.reposFilter].searchMode).concat("all"!==this.reposFilter?"&exclusive=1":"")},repoTypeCount:function(){return this.repoTypes[this.reposFilter].count}},mounted:function(){this.searchRepos(this.reposFilter);var e=this;Vue.nextTick((function(){e.$refs.search.focus()}))},methods:{changeTab:function(e){this.tab=e},changeReposFilter:function(e){this.reposFilter=e,this.repos=[],this.repoTypes[e].count=0,this.searchRepos(e)},showRepo:function(e,t){switch(t){case"sources":return e.owner.id===this.uid&&!e.mirror&&!e.fork;case"forks":return e.owner.id===this.uid&&!e.mirror&&e.fork;case"mirrors":return e.mirror;case"collaborative":return e.owner.id!==this.uid&&!e.mirror;default:return!0}},searchRepos:function(e){var t=this;this.isLoading=!0;var n=this.repoTypes[e].searchMode,i=this.searchURL,a=this.searchQuery;$.getJSON(i,(function(o,r,s){if(i===t.searchURL){t.repos=o.data;var c=s.getResponseHeader("X-Total-Count");""===a&&""===n&&(t.reposTotalCount=c),t.repoTypes[e].count=c}})).always((function(){i===t.searchURL&&(t.isLoading=!1)}))},repoClass:function(e){return e.fork?"octicon octicon-repo-forked":e.mirror?"octicon octicon-repo-clone":e.private?"octicon octicon-lock":"octicon octicon-repo"}}}),new Vue({delimiters:["${","}"],el:e,data:{searchLimit:document.querySelector("meta[name=_search_limit]").content,suburl:document.querySelector("meta[name=_suburl]").content,uid:document.querySelector("meta[name=_context_uid]").content}})}(),$(".organization.new.team input[name=permission]").change((function(){"admin"===$("input[name=permission]:checked",".organization.new.team").val()?$(".organization.new.team .team-units").hide():$(".organization.new.team .team-units").show()})),$(".js-quick-submit").keydown((function(e){!(e.ctrlKey&&!e.altKey||e.metaKey)||13!==e.keyCode&&10!==e.keyCode||$(this).closest("form").submit()})),f=$("#navbar"),g=$("#navbar-expand-toggle"),A=!1,g.click((function(){(A=!A)?(f.addClass("shown"),g.addClass("active")):(f.removeClass("shown"),g.removeClass("active"))})),D=$("#manage_topic"),O=$("#topic_edit"),E=$("#repo-topics"),F=$("#save_topic"),j=$("#topic_edit .dropdown"),M=$("#topic_edit.ui.form"),z=$("div.hide#validate_prompt"),P={countPrompt:z.children("#count_prompt").text(),formatPrompt:z.children("#format_prompt").text()},z.remove(),N=P,D.click((function(){E.hide(),O.css("display","")})),F.click((function(){var e=$("input[name=topics]").val();$.post(F.data("link"),{_csrf:s,topics:e},(function(t,n,i){if("ok"===i.responseJSON.status){if(E.children(".topic").remove(),e.length)for(var a=e.split(","),o=E.children("a").last(),r=0;r<a.length;r++)$('<div class="ui small label topic" style="cursor:pointer;">'.concat(a[r],"</div>")).insertBefore(o);O.css("display","none"),E.show()}})).fail((function(t){if(422===t.status)if(t.responseJSON.invalidTopics.length>0){N.formatPrompt=t.responseJSON.message;var n=t.responseJSON.invalidTopics,i=j.children("a.ui.label");e.split(",").forEach((function(e,t){for(var a=0;a<n.length;a++)n[a]===e&&i.eq(t).removeClass("green").addClass("red")}))}else N.countPrompt=t.responseJSON.message})).always((function(){M.form("validate form")}))})),j.dropdown({allowAdditions:!0,forceSelection:!1,fields:{name:"description",value:"data-value"},saveRemoteData:!1,label:{transition:"horizontal flip",duration:200,variation:!1,blue:!0,basic:!0},className:{label:"ui small label"},apiSettings:{url:"".concat(c,"/api/v1/topics/search?q={query}"),throttle:500,cache:!1,onResponse:function(e){var t={success:!1,results:[]},n=this.urlData.query.trim().replace(/<[^>]*>?/gm,""),i=!1,a=[];if(j.find("div.label.visible.topic,a.label.visible").each((function(e,t){a.push(t.dataset.value)})),e.topics){for(var o=!1,r=0;r<e.topics.length;r++)-1===a.indexOf(e.topics[r].topic_name)&&(e.topics[r].topic_name.toLowerCase()===n.toLowerCase()&&(i=!0),t.results.push({description:e.topics[r].topic_name,"data-value":e.topics[r].topic_name}),o=!0);t.success=o}return n.length>0&&!i?(t.success=!0,t.results.unshift({description:n,"data-value":n})):n.length>0&&i&&t.results.sort((function(e,t){return e.description.toLowerCase()===n.toLowerCase()?-1:t.description.toLowerCase()===n.toLowerCase()?1:e.description>t.description?-1:e.description<t.description?1:0})),t}},onLabelCreate:function(e){return e=e.toLowerCase().trim(),this.attr("data-value",e).contents().first().replaceWith(e),$(this)},onAdd:function(e,t,n){e=e.toLowerCase().trim(),$(n).attr("data-value",e),$(n).attr("data-text",e)}}),$.fn.form.settings.rules.validateTopic=function(e,t){var n=j.children("a.ui.label"),i=0===n.length||n.last().attr("data-value").match(t);return i||n.last().removeClass("green").addClass("red"),i&&0===j.children("a.ui.label.red").length},M.form({on:"change",inline:!0,fields:{topics:{identifier:"topics",rules:[{type:"validateTopic",value:/^[a-z0-9][a-z0-9-]{1,35}$/,prompt:N.formatPrompt},{type:"maxCount[25]",prompt:N.countPrompt}]}}}),0!==$("#wait-for-key").length&&u2fApi.ensureSupport().then((function(){$.getJSON("".concat(c,"/user/u2f/challenge")).success((function(e){u2fApi.sign(e.appId,e.challenge,e.registeredKeys,30).then(T).catch((function(e){L(void 0!==e?e.metaData.code:1)}))}))})).catch((function(){window.location.href="".concat(c,"/user/two_factor")})),$("#register-device").modal({allowMultiple:!1}),$("#u2f-error").modal({allowMultiple:!1}),$("#register-security-key").on("click",(function(e){e.preventDefault(),u2fApi.ensureSupport().then(q).catch((function(){L("browser")}))})),function(){var e=$("#repolink").val(),t=$("#repoId").val(),n=$("#crossRepoSearch").val(),i="".concat(c,"/api/v1/repos/").concat(e,"/issues?q={query}");"true"===n&&(i="".concat(c,"/api/v1/repos/issues/search?q={query}&priority_repo_id=").concat(t));$("#new-dependency-drop-list").dropdown({apiSettings:{url:i,onResponse:function(e){var t={success:!0,results:[]},n=$("#new-dependency-drop-list").data("issue-id");return $.each(e,(function(e,i){i.id!==n&&t.results.push({name:"#".concat(i.number," ").concat(h(i.title),'<div class="text small dont-break-out">').concat(h(i.repository.full_name),"</div>"),value:i.id})})),t},cache:!1},fullTextSearch:!0}),$(".menu a.label-filter-item").each((function(){$(this).click((function(e){if(e.altKey){e.preventDefault();var t=$(this).attr("href"),n=$(this).data("label-id"),i="labels=(-?[0-9]+%2c)*(".concat(n,")(%2c-?[0-9]+)*&");window.location=t.replace(new RegExp(i),"labels=$1-$2$3&")}}))})),$(".menu .ui.dropdown.label-filter").keydown((function(e){if(e.altKey&&13===e.keyCode){var t=$(".menu .ui.dropdown.label-filter .menu .item.selected");if(t.length>0){var n=$(t[0]),i=n.attr("href"),a=n.data("label-id"),o="labels=(-?[0-9]+%2c)*(".concat(a,")(%2c-?[0-9]+)*&");window.location=i.replace(new RegExp(o),"labels=$1-$2$3&")}}}))}(),$(".title_wip_desc > a").click((function(e){e.preventDefault();var t=$("#issue_title");t.focus();var n=t.val().trim().toUpperCase();for(var i in wipPrefixes)if(n.startsWith(wipPrefixes[i].toUpperCase()))return;t.val("".concat(wipPrefixes[0]," ").concat(t.val()))})),$(".show-outdated").on("click",(function(e){e.preventDefault();var t=$(this).data("comment");$(this).addClass("hide"),$("#code-comments-".concat(t)).removeClass("hide"),$("#code-preview-".concat(t)).removeClass("hide"),$("#hide-outdated-".concat(t)).removeClass("hide")})),$(".hide-outdated").on("click",(function(e){e.preventDefault();var t=$(this).data("comment");$(this).addClass("hide"),$("#code-comments-".concat(t)).addClass("hide"),$("#code-preview-".concat(t)).addClass("hide"),$("#show-outdated-".concat(t)).removeClass("hide")})),$("button.comment-form-reply").on("click",(function(e){e.preventDefault(),$(this).hide();var t=$(this).parent().find(".comment-form");t.removeClass("hide"),y(t.find(".menu"))})),0!==$(".repository.pull.diff").length&&($(".diff-detail-box.ui.sticky").sticky(),$(".btn-review").on("click",(function(e){e.preventDefault(),$(this).closest(".dropdown").find(".menu").toggle("visible")})).closest(".dropdown").find(".link.close").on("click",(function(e){e.preventDefault(),$(this).closest(".menu").toggle("visible")})),$(".code-view .lines-code,.code-view .lines-num").on("mouseenter",(function(){var e=$(this).closest("td");$(this).closest("tr").addClass(e.hasClass("lines-num-old")||e.hasClass("lines-code-old")?"focus-lines-old":"focus-lines-new")})).on("mouseleave",(function(){$(this).closest("tr").removeClass("focus-lines-new focus-lines-old")})),$(".add-code-comment").on("click",(function(e){if(!$(e.target).hasClass("btn-add-single")){e.preventDefault();var t=$(this).closest(".code-diff").hasClass("code-diff-split"),n=$(this).data("side"),i=$(this).data("idx"),a=$(this).data("path"),o=$("#pull_review_add_comment").html(),r=$(this).closest("tr"),s=r.next();s.hasClass("add-comment")||(s=$('<tr class="add-comment">'.concat(t?'<td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-right"></td>':'<td class="lines-num"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left add-comment-right"></td>',"</tr>")),r.after(s));var c=s.find(".add-comment-".concat(n)),l=c.find(".comment-code-cloud");0===l.length&&(c.html(o),y((l=c.find(".comment-code-cloud")).find(".menu")),c.find("input[name='line']").val(i),c.find("input[name='side']").val("left"===n?"previous":"proposed"),c.find("input[name='path']").val(a)),l.find("textarea").focus()}}))),function e(){var t=$("#repo_migrating");if($("#repo_migrating_failed").hide(),t){var n=t.attr("repo");if(void 0===n)return;$.ajax({type:"GET",url:"".concat(c,"/").concat(n,"/status"),data:{_csrf:s},complete:function(t){if(200===t.status&&t.responseJSON)return 0===t.responseJSON.status?void window.location.reload():void setTimeout((function(){e()}),2e3);$("#repo_migrating_progress").hide(),$("#repo_migrating_failed").show()}})}}(),function(){var e=$("#repo_template"),t=function(){var t=$("#template_units"),n=$("#non_template");""!==e.val()?(t.show(),n.hide()):(t.hide(),n.show())};e.change(t),t();var n=function(){$("#repo_template_search").dropdown({apiSettings:{url:"".concat(c,"/api/v1/repos/search?q={query}&template=true&priority_owner_id=").concat($("#uid").val()),onResponse:function(e){var t={success:!0,results:[]};return t.results.push({name:"",value:""}),$.each(e.data,(function(e,n){t.results.push({name:h(n.full_name),value:n.id})})),t},cache:!1},fullTextSearch:!0})};$("#uid").change(n),n()}(),$("#repo-clone-url").length>0)switch(localStorage.getItem("repo-clone-protocol")){case"ssh":0===$("#repo-clone-ssh").click().length&&$("#repo-clone-https").click();break;default:$("#repo-clone-https").click()}var B,H={"div.user.settings":k,"div.repository.settings.collaboration":x};for(B in H)if($(B).length>0){H[B]();break}var U=$("#clone_addr");U.change((function(){var e=$("#repo_name");U.val().length>0&&0===e.val().length&&e.val(U.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3])}))})),$((function(){0===$(".user.signin").length&&$("form:not(.ignore-dirty)").areYouSure(),$("#ssh-key-content").on("change paste keyup",(function(){var e=$(this).val().split(" "),t=$("#ssh-key-title");""===t.val()&&3===e.length&&""!==e[2]&&t.val(e[2])}))})),window.timeAddManual=function(){$(".mini.modal").modal({duration:200,onApprove:function(){$("#add_time_manual_form").submit()}}).modal("show")},window.toggleStopwatch=function(){$("#toggle_stopwatch_form").submit()},window.cancelStopwatch=function(){$("#cancel_stopwatch_form").submit()},window.initHeatmap=function(e,t,n){var i=document.getElementById(e);if(i){(n=n||{}).contributions=n.contributions||"contributions",n.no_contributions=n.no_contributions||"No contributions";var a=["${","}"];Vue.component("activity-heatmap",{delimiters:a,props:{user:{type:String,required:!0},suburl:{type:String,required:!0},locale:{type:Object,required:!0}},data:function(){return{isLoading:!0,colorRange:[],endDate:null,values:[],totalContributions:0}},mounted:function(){this.colorRange=[this.getColor(0),this.getColor(1),this.getColor(2),this.getColor(3),this.getColor(4),this.getColor(5)],this.endDate=new Date,this.loadHeatmap(this.user)},methods:{loadHeatmap:function(e){var t=this;$.get("".concat(this.suburl,"/api/v1/users/").concat(e,"/heatmap"),(function(e){for(var n=[],i=0;i<e.length;i++)t.totalContributions+=e[i].contributions,n[i]={date:new Date(1e3*e[i].timestamp),count:e[i].contributions};t.values=n,t.isLoading=!1}))},getColor:function(e){var t=document.createElement("div");t.className="heatmap-color-".concat(e),document.body.appendChild(t);var n=getComputedStyle(t).backgroundColor;return document.body.removeChild(t),n}},template:'<div><div v-show="isLoading"><slot name="loading"></slot></div><h4 class="total-contributions" v-if="!isLoading"><span v-html="totalContributions"></span> total contributions in the last 12 months</h4><calendar-heatmap v-show="!isLoading" :locale="locale" :no-data-text="locale.no_contributions" :tooltip-unit="locale.contributions" :end-date="endDate" :values="values" :range-color="colorRange" />'}),new Vue({delimiters:a,el:i,data:{suburl:document.querySelector("meta[name=_suburl]").content,heatmapUser:t,locale:n}})}},$(".commit-button").click((function(e){e.preventDefault(),$(this).parent().find(".commit-body").toggle()})),window.toggleDeadlineForm=function(){$("#deadlineForm").fadeToggle(150)},window.setDeadline=function(){var e=$("#deadlineDate").val();window.updateDeadline(e)},window.updateDeadline=function(e){$("#deadline-err-invalid-date").hide(),$("#deadline-loader").addClass("loading");var t=null;if(""!==e){var n=Date.parse(e);if(Number.isNaN(n))return $("#deadline-loader").removeClass("loading"),$("#deadline-err-invalid-date").show(),!1;t=new Date(n)}$.ajax("".concat($("#update-issue-deadline-form").attr("action"),"/deadline"),{data:JSON.stringify({due_date:t}),headers:{"X-Csrf-Token":s,"X-Remote":!0},contentType:"application/json",type:"POST",success:function(){p()},error:function(){$("#deadline-loader").removeClass("loading"),$("#deadline-err-invalid-date").show()}})},window.deleteDependencyModal=function(e,t){$(".remove-dependency").modal({closable:!1,duration:200,onApprove:function(){$("#removeDependencyID").val(e),$("#dependencyType").val(t),$("#removeDependencyForm").submit()}}).modal("show")},window.cancelCodeComment=function(e){var t=$(e).closest("form");t.length>0&&t.hasClass("comment-form")?(t.addClass("hide"),t.parent().find("button.comment-form-reply").show()):t.closest(".comment-code-cloud").remove()},window.onOAuthLoginClick=function(){var e=$("#oauth2-login-loader"),t=$("#oauth2-login-navigator");t.hide(),e.removeClass("disabled"),setTimeout((function(){e.addClass("disabled"),t.show()}),5e3)}}]);
 //# sourceMappingURL=index.js.map
\ No newline at end of file
index 1dce4a7a3d218e673cdc0e77c3ce0c00058eb7aa..2ea5bdea940eacaec27c8620ada82f553312868f 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:///./web_src/js/publicPath.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack:///./web_src/js/semanticDropdown.js","webpack:///./web_src/js/gitGraphLoader.js","webpack:///./web_src/js/index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","1","__webpack_require__","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","s","arrayWithHoles","iterableToArrayLimit","nonIterableRest","arr","currentScript","url","URL","__webpack_public_path__","pathname","replace","querySelector","getAttribute","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","done","GenStateSuspendedYield","makeInvokeMethod","fn","obj","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","then","unwrapped","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","constructor","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","toString","keys","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","Array","isArray","_arr","_n","_d","_e","_s","_i","$","Math","dropdown","parameters","returnedValue","$allModules","$document","moduleSelector","selector","hasTouch","documentElement","time","Date","getTime","performance","query","arguments","methodInvoked","queryArguments","lastAriaID","each","elementIndex","initialLoad","pageLostFocus","willRefocus","elementNamespace","id","selectObserver","menuObserver","settings","isPlainObject","extend","className","fields","metadata","namespace","regExp","templates","eventNamespace","moduleNamespace","$module","$context","$text","find","text","$search","search","$sizer","sizer","$input","input","$icon","icon","$combo","$menu","children","menu","$item","item","activated","itemActivated","internalChange","element","instance","initialize","debug","is","alreadySetup","setup","reference","layout","change","refreshData","save","defaults","restore","selected","events","observeChanges","instantiate","aria","verbose","destroy","remove","tabbable","off","removeData","disconnect","MutationObserver","select","mutation","observe","has","childList","subtree","random","substr","userChoice","$userChoices","$userChoice","html","userValues","index","addition","add","variables","addResult","attr","addClass","hideAdditions","hidden","userLabels","label","appendTo","insertAfter","minCharacters","filter","hide","firstUnfiltered","selectedItem","not","unselectable","eq","nextAvailable","$selected","$nextAvailable","nextAll","$prevAvailable","prevAll","guessRole","nextID","prefix","getElementById","setExpanded","expanded","refreshDescendant","$currentlySelected","$activeItem","active","$selectedItem","removeDescendant","removeAttr","isIcon","hasClass","hasSearch","hasInput","isMultiple","multiple","api","apiSettings","urlData","on","returnedObject","prop","insertBefore","searchSelection","allowTab","set","selectValues","parent","closest","selection","missingMultiple","disabled","detach","prependTo","refresh","$firstModules","$lastModules","refreshSelectors","refreshItems","clearData","defaultText","defaultValue","placeholderText","toggle","show","callback","isFunction","can","remote","queryRemote","maxSelections","allResultsFiltered","allFiltered","onShow","animate","click","intent","menuSearch","focusSearch","visible","animatingOutward","onHide","hideOthers","hideMenu","transition","hideSubMenus","$subMenus","touchEvents","keyboardEvents","inputEvents","mouseEvents","single","test","mouseenter","keydown","inputEvent","mousedown","mouseup","focus","blur","delay","mouseleave","touch","unbind","searchTerm","afterFiltered","filterActive","activeItem","onNoResults","allowAdditions","empty","noResults","userSuggestion","focusedOnSearch","useLabels","useAPI","filterRemoteData","filterItems","noAPI","errorDuration","cache","throttle","onError","serverError","onFailure","onSuccess","response","remoteValues","results","escapedTerm","escape","string","beginsWithRegExp","RegExp","$choice","match","String","choiceText","fullTextSearch","exactSearch","fuzzySearch","choiceValue","filteredItem","filtered","term","termLength","queryLength","toLowerCase","characterIndex","nextCharacterIndex","queryCharacter","charCodeAt","indexOf","skipHandler","forceSelection","clear","showOnFocus","activeElement","activeLabel","timer","$label","$labels","$activeLabels","$nextActive","$prevActive","$range","nextUntil","prevUntil","shiftKey","removeClass","ctrlKey","toggleClass","onLabelSelect","apply","activeLabels","toggleBehavior","bubbledLabelClick","bubbledIconClick","determine","eventOnElement","preventDefault","stopPropagation","eventInModule","mutations","isSelectMutation","addedNodes","$addedNode","$removedNode","removedNodes","$changedNodes","isUserAddition","isMessage","$target","$subMenu","$otherMenus","siblings","hasSubMenu","itemTimer","skipRefocus","isBubbledEvent","allowCategorySelection","userAddition","scrollPosition","selectAction","pressedKey","which","inObject","$activeLabel","labelIndex","labelCount","hasActiveLabel","hasMultipleActive","isFirstLabel","isLastLabel","isSearch","isFocusedOnSearch","isFocused","focused","caretAtStart","caretPosition","leftArrow","siblingLabel","end","last","rightArrow","first","deleteKey","backspace","$nextItem","$visibleItems","addBack","$parentMenu","inVisibleMenu","animating","hasSelectedItem","selectedIsSelectable","delimiterPressed","delimiter","enter","upArrow","selectOnKeydown","downArrow","pageUp","scrollPage","pageDown","selectedLetter","fromCharCode","trigger","createEvent","inputElement","initEvent","dispatchEvent","action","inDocument","inModule","inVisibleDOM","body","contains","notOnLabel","notInMenu","nothing","activate","hideAndClear","combo","placeholder","trim","val","searchWidth","ceil","width","selectionCount","upward","grep","uniqueArray","array","inArray","range","rangeLength","selectionStart","createRange","moveStart","isEmptyMultiselect","selectInput","split","read","remoteData","preserveHTML","clone","menuIcon","oninput","onpropertychange","$option","sortSelect","sort","a","b","itemWithAdditions","$items","$userItems","strict","shouldSearch","optionText","optionValue","check","labels","saveRemoteData","Storage","sessionStorage","getItem","noStorage","setItem","clearValue","direction","$nextSelectedItem","$currentItem","menuHeight","outerHeight","currentScroll","scrollTop","itemHeight","itemsPerPage","floor","newScroll","$selectableItem","isSearchMultiple","searchValue","hasSearchValue","valueIsSet","glyphWidth","css","loading","partialSearch","forceScroll","hasActive","offset","menuScroll","abovePage","belowPage","position","top","height","searchText","letter","alreadySelectedLetter","firstLetter","$nextValue","openDownward","leftward","openRightward","$currentMenu","escapedValue","currentValue","stringValue","allowReselection","extendSelect","fireOnInit","onChange","exactly","selectedText","selectedValue","isFiltered","isActive","isUserValue","shouldAnimate","count","$next","ignoreCase","onLabelCreate","variation","duration","$message","$addition","$existingItem","alreadyHasValue","hasUserSuggestion","hasCount","hasMaxCount","hasTerm","addedValue","addedText","newValue","concat","join","onAdd","removedValue","removedText","$removedItem","arrayValue","onRemove","$removedLabel","userValue","onLabelRemove","items","$normalResults","valueIgnoringCase","valueMatchingCase","hasValue","existingValue","animatingInward","needle","found","selectMutation","selectChanged","verticallyScrollableContext","overflowY","horizontallyScrollableContext","overflowX","onScreen","calculations","canOpenDownward","left","above","below","isOffscreenRight","canOpenRightward","scrollLeft","outerWidth","start","animation","queue","onStart","onComplete","noTransition","multipleValues","isUnparsable","hasQuotes","quote","setting","internal","silent","log","currentTime","executionTime","display","title","totalTime","group","table","groupCollapsed","groupEnd","passedArguments","maxDepth","depth","camelCaseValue","toUpperCase","keepOnScreen","$selectedLabels","option","maybeText","maybeDisabled","choice","jQuery","graphCanvas","gitGraph","default","graphList","csrf","suburl","previewFileModes","simpleMDEditor","codeMirrorEditor","htmlEncode","initCommentPreviewTab","$form","$tabMenu","tab","$this","post","_csrf","$previewPanel","emojify","run","hljs","highlightBlock","buttonsClickOnEnter","initEditForm","$previewTab","initEditPreviewTab","content","$diffPreviewPanel","updateIssuesMeta","issueIds","elementId","ajax","issue_ids","success","reload","location","initImagePaste","field","addEventListener","pasteEvent","clipboardData","blob","getAsFile","retrieveImageFromClipboardAsBlob","img","lastIndexOf","startPos","endPos","selectionEnd","substring","insertAtCursor","file","xhr","XMLHttpRequest","status","responseText","open","setRequestHeader","formData","FormData","append","send","uploadFile","res","JSON","parse","oldval","newval","replaceAndKeepCursor","uuid","initCommentForm","$selectBranch","initListSubmits","selectItem","outerSelector","$list","$noSelect","$listMenu","hasLabelUpdateAction","listIds","select_id","input_id","hasUpdateAction","initRepository","$data","canCreateBranch","menuVisible","branch","tag","Vue","delimiters","el","beforeMount","vm","$el","watch","focusSearchField","computed","filteredItems","showCreateNewBranch","showNoResults","methods","getSelected","href","createNewBranch","$refs","newBranchForm","submit","nextTick","searchField","j","getSelectedIndexInFiltered","scrollToActive","cont","scrollContainer","offsetTop","clientHeight","keyCode","initFilterSearchDropdown","keyup","$prompt","checked","$newLabelPanel","minicolors","color_hex","modal","onApprove","$datepicker","datetimepicker","lang","inline","timepicker","startDate","formatDate","onSelectDate","ct","dateFormat","$issueTitle","$editInput","editTitleToggle","$content","$parent","$textarea","$segment","$editContentZone","$renderContent","$rawContent","issuesTribute","attach","emojiTribute","$dropzone","$files","filenameDict","dropzone","headers","maxFiles","maxFilesize","acceptedFiles","addRemoveLinks","dictDefaultMessage","dictInvalidFileType","dictFileTooBig","dictRemoveFile","init","submitted","getJSON","drop","removeAllFiles","imgSrc","emit","files","$editContentForm","$attachments","map","attachments","confirm","$statusButton","$mergeButton","_text","_value","initReactionSelector","reactions","popup","actionURL","resp","react","hasEmoji","addLine","delLine","addPercent","parseFloat","localStorage","$repoComparePull","$dropdown","assingMenuAttributes","initRepositoryCollaboration","uid","initEditor","$editFilename","parts","$section","$divider","getCursorPosition","setSelectionRange","$editArea","markdownFileExts","lineWrapExtensions","spec","extension","extWithDot","dataUrl","apiCall","exec","CodeMirror","findModeByExtension","previewLink","mime","toTextArea","SimpleMDE","autoDownloadFontAwesome","forceSync","renderingConfig","singleLineBreaks","indentWithTabs","tabSize","spellChecker","previewRender","plainText","preview","innerHTML","toolbar","setSimpleMDE","fromTextArea","lineNumbers","cm","_change","getValue","setCodeMirror","setOption","autoLoadMode","editorconfig","indent_style","Tab","spaces","parseInt","getOption","replaceSelection","indent_size","tab_width","$commitButton","$editForm","areYouSure","dirtyClass","fieldSelector","dirty","initUserSettings","keypress","initCodeView","$select","selectRange","getSelection","removeAllRanges","$first","hash","$foldButton","slideUp","slideDown","insertBlobExcerpt","$blob","$row","replaceWith","u2fSigned","stringify","contentType","fail","u2fError","u2fRegistered","errorCode","checkError","u2fErrors","browser","2","3","4","5","u2fRegisterRequest","req","registeredKeys","u2fApi","register","appId","registerRequests","catch","reason","metaData","code","changeHash","history","pushState","$from","classes","showDeletePopup","dialog","closable","redirect","showAddAllPopup","Dropzone","autoDiscover","pos","Sel","SelLength","ready","accordion","checkbox","progress","showActivity","slideToggle","nodes","querySelectorAll","setConfig","img_dir","ignore_emoticons","getElementsByClassName","childNodes","nodeName","$searchTeamBox","$searchRepoBox","toggleMigrations","isExpanded","mgrBtn","editDiv","viewDiv","saveBtn","topicDropdown","topicForm","topicPrompts","hidePrompt","prompts","clipboard","Clipboard","clearSelection","node","encodeURIComponent","dataset","issueIDs","issueId","_","onResponse","login","full_name","image","avatar_url","searchFields","permission","description","dbType","dbDefaults","MySQL","PostgreSQL","MSSQL","_type","defaultHost","authUserName","cloneAddr","startsWith","sideBySideChanges","sideBySideTimeout","simplemde","render","isSideBySideActive","codemirror","cursorPos","getCursor","setCursor","line","ch","getInputField","$bEdit","$bPrev","$toolbar","$bPreview","$bSideBySide","initWikiForm","updateContentType","initWebhook","authType","onOAuth2Change","onSecurityProtocolChange","onUsePagedSearchChange","onOAuth2UseCustomURLChange","$detailModal","$checkboxes","ids","provider","initAdmin","component","props","searchLimit","Number","required","organizations","isOrganization","Boolean","canCreateOrganization","organizationsTotalCount","moreReposLink","repos","reposTotalCount","reposFilter","searchQuery","isLoading","repoTypes","searchMode","forks","mirrors","sources","collaborative","showMoreReposLink","searchURL","repoTypeCount","mounted","searchRepos","changeTab","changeReposFilter","showRepo","repo","owner","mirror","fork","searchedMode","searchedURL","searchedQuery","_textStatus","getResponseHeader","always","repoClass","private","initVueApp","altKey","metaKey","countPrompt","formatPrompt","topics","_data","responseJSON","topicArray","invalidTopics","topicLables","form","blue","basic","formattedResponse","found_query","current_topics","topic_name","unshift","contents","_addedText","$addedChoice","rules","validateTopic","_values","identifier","prompt","ensureSupport","sign","challenge","allowMultiple","repolink","repoId","crossRepoSearch","issueSearchUrl","filteredResponse","currIssueId","issue","number","repository","regStr","selectedItems","initIssueList","wipPrefixes","sticky","isSplit","side","idx","path","tr","ntr","after","td","commentCloud","initRepoStatusChecker","migrating","repo_name","$repoTemplate","checkTemplate","$templateUnits","$nonTemplate","changeOwner","_r","initTemplateSearch","routes","$cloneAddr","$repoName","arrays","$title","timeAddManual","toggleStopwatch","cancelStopwatch","initHeatmap","appElementId","heatmapUser","locale","contributions","no_contributions","vueDelimeters","user","colorRange","endDate","totalContributions","getColor","loadHeatmap","userName","chartRawData","chartData","date","timestamp","color","getComputedStyle","backgroundColor","removeChild","template","toggleDeadlineForm","fadeToggle","setDeadline","deadline","updateDeadline","deadlineString","realDeadline","newDate","due_date","deleteDependencyModal","cancelCodeComment","btn","onOAuthLoginClick","oauthLoader","oauthNav"],"mappings":"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","file":"index.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"0\":\"gitgraph\"}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","module.exports = require(\"regenerator-runtime\");\n","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","/* This sets up webpack's chunk loading to load resources from the same\n  directory where it loaded index.js from. This file must be imported\n  before any lazy-loading is being attempted. */\n\nif (document.currentScript && document.currentScript.src) {\n  const url = new URL(document.currentScript.src);\n  __webpack_public_path__ = `${url.pathname.replace(/\\/[^/]*$/, '')}/`;\n} else {\n  // compat: IE11\n  const script = document.querySelector('script[src*=\"/index.js\"]');\n  __webpack_public_path__ = `${script.getAttribute('src').replace(/\\/[^/]*$/, '')}/`;\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n    return;\n  }\n\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","/* This is a patched version of semantic.dropdown which includes a11y changes, see\n   https://github.com/go-gitea/gitea/pull/8638#issuecomment-549175290 */\n\n/*!\n * # Semantic UI 2.3.1 - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*\n * Copyright 2019 The Gitea Authors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n * This version has been modified by Gitea to improve accessibility.\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.dropdown = function(parameters) {\n  var\n    $allModules    = $(this),\n    $document      = $(document),\n\n    moduleSelector = $allModules.selector || '',\n\n    hasTouch       = ('ontouchstart' in document.documentElement),\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    lastAriaID = 1,\n    returnedValue\n  ;\n\n  $allModules\n    .each(function(elementIndex) {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.dropdown.settings, parameters)\n          : $.extend({}, $.fn.dropdown.settings),\n\n        className       = settings.className,\n        message         = settings.message,\n        fields          = settings.fields,\n        keys            = settings.keys,\n        metadata        = settings.metadata,\n        namespace       = settings.namespace,\n        regExp          = settings.regExp,\n        selector        = settings.selector,\n        error           = settings.error,\n        templates       = settings.templates,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $context        = $(settings.context),\n        $text           = $module.find(selector.text),\n        $search         = $module.find(selector.search),\n        $sizer          = $module.find(selector.sizer),\n        $input          = $module.find(selector.input),\n        $icon           = $module.find(selector.icon),\n\n        $combo = ($module.prev().find(selector.text).length > 0)\n          ? $module.prev().find(selector.text)\n          : $module.prev(),\n\n        $menu           = $module.children(selector.menu),\n        $item           = $menu.find(selector.item),\n\n        activated       = false,\n        itemActivated   = false,\n        internalChange  = false,\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        initialLoad,\n        pageLostFocus,\n        willRefocus,\n        elementNamespace,\n        id,\n        selectObserver,\n        menuObserver,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing dropdown', settings);\n\n          if( module.is.alreadySetup() ) {\n            module.setup.reference();\n          }\n          else {\n\n            module.setup.layout();\n\n            if(settings.values) {\n              module.change.values(settings.values);\n            }\n\n            module.refreshData();\n\n            module.save.defaults();\n            module.restore.selected();\n\n            module.create.id();\n            module.bind.events();\n\n            module.observeChanges();\n            module.instantiate();\n\n            module.aria.setup();\n          }\n\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of dropdown', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous dropdown', $module);\n          module.remove.tabbable();\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n          $menu\n            .off(eventNamespace)\n          ;\n          $document\n            .off(elementNamespace)\n          ;\n          module.disconnect.menuObserver();\n          module.disconnect.selectObserver();\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            selectObserver = new MutationObserver(module.event.select.mutation);\n            menuObserver   = new MutationObserver(module.event.menu.mutation);\n            module.debug('Setting up mutation observer', selectObserver, menuObserver);\n            module.observe.select();\n            module.observe.menu();\n          }\n        },\n\n        disconnect: {\n          menuObserver: function() {\n            if(menuObserver) {\n              menuObserver.disconnect();\n            }\n          },\n          selectObserver: function() {\n            if(selectObserver) {\n              selectObserver.disconnect();\n            }\n          }\n        },\n        observe: {\n          select: function() {\n            if(module.has.input()) {\n              selectObserver.observe($module[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          menu: function() {\n            if(module.has.menu()) {\n              menuObserver.observe($menu[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          }\n        },\n\n        create: {\n          id: function() {\n            id = (Math.random().toString(16) + '000000000').substr(2, 8);\n            elementNamespace = '.' + id;\n            module.verbose('Creating unique id for element', id);\n          },\n          userChoice: function(values) {\n            var\n              $userChoices,\n              $userChoice,\n              isUserValue,\n              html\n            ;\n            values = values || module.get.userValues();\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            $.each(values, function(index, value) {\n              if(module.get.item(value) === false) {\n                html         = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $userChoice  = $('<div />')\n                  .html(html)\n                  .attr('data-' + metadata.value, value)\n                  .attr('data-' + metadata.text, value)\n                  .addClass(className.addition)\n                  .addClass(className.item)\n                ;\n                if(settings.hideAdditions) {\n                  $userChoice.addClass(className.hidden);\n                }\n                $userChoices = ($userChoices === undefined)\n                  ? $userChoice\n                  : $userChoices.add($userChoice)\n                ;\n                module.verbose('Creating user choices for value', value, $userChoice);\n              }\n            });\n            return $userChoices;\n          },\n          userLabels: function(value) {\n            var\n              userValues = module.get.userValues()\n            ;\n            if(userValues) {\n              module.debug('Adding user labels', userValues);\n              $.each(userValues, function(index, value) {\n                module.verbose('Adding custom user value');\n                module.add.label(value, value);\n              });\n            }\n          },\n          menu: function() {\n            $menu = $('<div />')\n              .addClass(className.menu)\n              .appendTo($module)\n            ;\n          },\n          sizer: function() {\n            $sizer = $('<span />')\n              .addClass(className.sizer)\n              .insertAfter($search)\n            ;\n          }\n        },\n\n        search: function(query) {\n          query = (query !== undefined)\n            ? query\n            : module.get.query()\n          ;\n          module.verbose('Searching for query', query);\n          if(module.has.minCharacters(query)) {\n            module.filter(query);\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        select: {\n          firstUnfiltered: function() {\n            module.verbose('Selecting first non-filtered element');\n            module.remove.selectedItem();\n            $item\n              .not(selector.unselectable)\n              .not(selector.addition + selector.hidden)\n                .eq(0)\n                .addClass(className.selected)\n            ;\n          },\n          nextAvailable: function($selected) {\n            $selected = $selected.eq(0);\n            var\n              $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),\n              $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),\n              hasNext        = ($nextAvailable.length > 0)\n            ;\n            if(hasNext) {\n              module.verbose('Moving selection to', $nextAvailable);\n              $nextAvailable.addClass(className.selected);\n            }\n            else {\n              module.verbose('Moving selection to', $prevAvailable);\n              $prevAvailable.addClass(className.selected);\n            }\n          }\n        },\n\n        aria: {\n          setup: function() {\n            var role = module.aria.guessRole();\n            if( role !== 'menu' ) {\n              return;\n            }\n            $module.attr('aria-busy', 'true');\n            $module.attr('role', 'menu');\n            $module.attr('aria-haspopup', 'menu');\n            $module.attr('aria-expanded', 'false');\n            $menu.find('.divider').attr('role', 'separator');\n            $item.attr('role', 'menuitem');\n            $item.each(function (index, item) {\n              if( !item.id ) {\n                item.id = module.aria.nextID('menuitem');\n              }\n            });\n            $text = $module\n              .find('> .text')\n              .eq(0)\n            ;\n            if( $module.data('content') ) {\n              $text.attr('aria-hidden');\n              $module.attr('aria-label', $module.data('content'));\n            }\n            else {\n              $text.attr('id', module.aria.nextID('menutext'));\n              $module.attr('aria-labelledby', $text.attr('id'));\n            }\n            $module.attr('aria-busy', 'false');\n          },\n          nextID: function(prefix) {\n            var nextID;\n            do {\n              nextID = prefix + '_' + lastAriaID++;\n            } while( document.getElementById(nextID) );\n            return nextID;\n          },\n          setExpanded: function(expanded) {\n            if( $module.attr('aria-haspopup') ) {\n              $module.attr('aria-expanded', expanded);\n            }\n          },\n          refreshDescendant: function() {\n            if( $module.attr('aria-haspopup') !== 'menu' ) {\n              return;\n            }\n            var\n              $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n              $activeItem        = $menu.children('.' + className.active).eq(0),\n              $selectedItem      = ($currentlySelected.length > 0)\n                ? $currentlySelected\n                : $activeItem\n            ;\n            if( $selectedItem ) {\n              $module.attr('aria-activedescendant', $selectedItem.attr('id'));\n            }\n            else {\n              module.aria.removeDescendant();\n            }\n          },\n          removeDescendant: function() {\n            if( $module.attr('aria-haspopup') == 'menu' ) {\n              $module.removeAttr('aria-activedescendant');\n            }\n          },\n          guessRole: function() {\n            var\n              isIcon = $module.hasClass('icon'),\n              hasSearch = module.has.search(),\n              hasInput = ($input.length > 0),\n              isMultiple = module.is.multiple()\n            ;\n            if ( !isIcon && !hasSearch && !hasInput && !isMultiple ) {\n              return 'menu';\n            }\n            return 'unknown';\n          }\n        },\n\n        setup: {\n          api: function() {\n            var\n              apiSettings = {\n                debug   : settings.debug,\n                urlData : {\n                  value : module.get.value(),\n                  query : module.get.query()\n                },\n                on    : false\n              }\n            ;\n            module.verbose('First request, initializing API');\n            $module\n              .api(apiSettings)\n            ;\n          },\n          layout: function() {\n            if( $module.is('select') ) {\n              module.setup.select();\n              module.setup.returnedObject();\n            }\n            if( !module.has.menu() ) {\n              module.create.menu();\n            }\n            if( module.is.search() && !module.has.search() ) {\n              module.verbose('Adding search input');\n              $search = $('<input />')\n                .addClass(className.search)\n                .prop('autocomplete', 'off')\n                .insertBefore($text)\n              ;\n            }\n            if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {\n              module.create.sizer();\n            }\n            if(settings.allowTab) {\n              module.set.tabbable();\n            }\n            $item.attr('tabindex', '-1');\n          },\n          select: function() {\n            var\n              selectValues  = module.get.selectValues()\n            ;\n            module.debug('Dropdown initialized on a select', selectValues);\n            if( $module.is('select') ) {\n              $input = $module;\n            }\n            // see if select is placed correctly already\n            if($input.parent(selector.dropdown).length > 0) {\n              module.debug('UI dropdown already exists. Creating dropdown menu only');\n              $module = $input.closest(selector.dropdown);\n              if( !module.has.menu() ) {\n                module.create.menu();\n              }\n              $menu = $module.children(selector.menu);\n              module.setup.menu(selectValues);\n            }\n            else {\n              module.debug('Creating entire dropdown from select');\n              $module = $('<div />')\n                .attr('class', $input.attr('class') )\n                .addClass(className.selection)\n                .addClass(className.dropdown)\n                .html( templates.dropdown(selectValues) )\n                .insertBefore($input)\n              ;\n              if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {\n                module.error(error.missingMultiple);\n                $input.prop('multiple', true);\n              }\n              if($input.is('[multiple]')) {\n                module.set.multiple();\n              }\n              if ($input.prop('disabled')) {\n                module.debug('Disabling dropdown');\n                $module.addClass(className.disabled);\n              }\n              $input\n                .removeAttr('class')\n                .detach()\n                .prependTo($module)\n              ;\n            }\n            module.refresh();\n          },\n          menu: function(values) {\n            $menu.html( templates.menu(values, fields));\n            $item = $menu.find(selector.item);\n          },\n          reference: function() {\n            module.debug('Dropdown behavior was called on select, replacing with closest dropdown');\n            // replace module reference\n            $module  = $module.parent(selector.dropdown);\n            instance = $module.data(moduleNamespace);\n            element  = $module.get(0);\n            module.refresh();\n            module.setup.returnedObject();\n          },\n          returnedObject: function() {\n            var\n              $firstModules = $allModules.slice(0, elementIndex),\n              $lastModules  = $allModules.slice(elementIndex + 1)\n            ;\n            // adjust all modules to use correct reference\n            $allModules = $firstModules.add($module).add($lastModules);\n          }\n        },\n\n        refresh: function() {\n          module.refreshSelectors();\n          module.refreshData();\n        },\n\n        refreshItems: function() {\n          $item = $menu.find(selector.item);\n        },\n\n        refreshSelectors: function() {\n          module.verbose('Refreshing selector cache');\n          $text   = $module.find(selector.text);\n          $search = $module.find(selector.search);\n          $input  = $module.find(selector.input);\n          $icon   = $module.find(selector.icon);\n          $combo  = ($module.prev().find(selector.text).length > 0)\n            ? $module.prev().find(selector.text)\n            : $module.prev()\n          ;\n          $menu    = $module.children(selector.menu);\n          $item    = $menu.find(selector.item);\n        },\n\n        refreshData: function() {\n          module.verbose('Refreshing cached metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n        },\n\n        clearData: function() {\n          module.verbose('Clearing metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n          $module\n            .removeData(metadata.defaultText)\n            .removeData(metadata.defaultValue)\n            .removeData(metadata.placeholderText)\n          ;\n        },\n\n        toggle: function() {\n          module.verbose('Toggling menu visibility');\n          if( !module.is.active() ) {\n            module.show();\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(!module.can.show() && module.is.remote()) {\n            module.debug('No API results retrieved, searching before show');\n            module.queryRemote(module.get.query(), module.show);\n          }\n          if( module.can.show() && !module.is.active() ) {\n            module.debug('Showing dropdown');\n            if(module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered()) ) {\n              module.remove.message();\n            }\n            if(module.is.allFiltered()) {\n              return true;\n            }\n            if(settings.onShow.call(element) !== false) {\n              module.aria.setExpanded(true);\n              module.aria.refreshDescendant();\n              module.animate.show(function() {\n                if( module.can.click() ) {\n                  module.bind.intent();\n                }\n                if(module.has.menuSearch()) {\n                  module.focusSearch();\n                }\n                module.set.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.active() && !module.is.animatingOutward() ) {\n            module.debug('Hiding dropdown');\n            if(settings.onHide.call(element) !== false) {\n              module.aria.setExpanded(false);\n              module.aria.removeDescendant();\n              module.animate.hide(function() {\n                module.remove.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hideOthers: function() {\n          module.verbose('Finding other dropdowns to hide');\n          $allModules\n            .not($module)\n              .has(selector.menu + '.' + className.visible)\n                .dropdown('hide')\n          ;\n        },\n\n        hideMenu: function() {\n          module.verbose('Hiding menu  instantaneously');\n          module.remove.active();\n          module.remove.visible();\n          $menu.transition('hide');\n        },\n\n        hideSubMenus: function() {\n          var\n            $subMenus = $menu.children(selector.item).find(selector.menu)\n          ;\n          module.verbose('Hiding sub menus', $subMenus);\n          $subMenus.transition('hide');\n        },\n\n        bind: {\n          events: function() {\n            if(hasTouch) {\n              module.bind.touchEvents();\n            }\n            module.bind.keyboardEvents();\n            module.bind.inputEvents();\n            module.bind.mouseEvents();\n          },\n          touchEvents: function() {\n            module.debug('Touch device detected binding additional touch events');\n            if( module.is.searchSelection() ) {\n              // do nothing special yet\n            }\n            else if( module.is.single() ) {\n              $module\n                .on('touchstart' + eventNamespace, module.event.test.toggle)\n              ;\n            }\n            $menu\n              .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)\n            ;\n          },\n          keyboardEvents: function() {\n            module.verbose('Binding keyboard events');\n            $module\n              .on('keydown' + eventNamespace, module.event.keydown)\n            ;\n            if( module.has.search() ) {\n              $module\n                .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)\n              ;\n            }\n            if( module.is.multiple() ) {\n              $document\n                .on('keydown' + elementNamespace, module.event.document.keydown)\n              ;\n            }\n          },\n          inputEvents: function() {\n            module.verbose('Binding input change events');\n            $module\n              .on('change' + eventNamespace, selector.input, module.event.change)\n            ;\n          },\n          mouseEvents: function() {\n            module.verbose('Binding mouse events');\n            if(module.is.multiple()) {\n              $module\n                .on('click'   + eventNamespace, selector.label,  module.event.label.click)\n                .on('click'   + eventNamespace, selector.remove, module.event.remove.click)\n              ;\n            }\n            if( module.is.searchSelection() ) {\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('mousedown' + eventNamespace, selector.menu,   module.event.menu.mousedown)\n                .on('mouseup'   + eventNamespace, selector.menu,   module.event.menu.mouseup)\n                .on('click'     + eventNamespace, selector.icon,   module.event.icon.click)\n                .on('focus'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('click'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('blur'      + eventNamespace, selector.search, module.event.search.blur)\n                .on('click'     + eventNamespace, selector.text,   module.event.text.focus)\n              ;\n              if(module.is.multiple()) {\n                $module\n                  .on('click' + eventNamespace, module.event.click)\n                ;\n              }\n            }\n            else {\n              if(settings.on == 'click') {\n                $module\n                  .on('click' + eventNamespace, selector.icon, module.event.icon.click)\n                  .on('click' + eventNamespace, module.event.test.toggle)\n                ;\n              }\n              else if(settings.on == 'hover') {\n                $module\n                  .on('mouseenter' + eventNamespace, module.delay.show)\n                  .on('mouseleave' + eventNamespace, module.delay.hide)\n                ;\n              }\n              else {\n                $module\n                  .on(settings.on + eventNamespace, module.toggle)\n                ;\n              }\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('focus'     + eventNamespace, module.event.focus)\n              ;\n              if(module.has.menuSearch() ) {\n                $module\n                  .on('blur' + eventNamespace, selector.search, module.event.search.blur)\n                ;\n              }\n              else {\n                $module\n                  .on('blur' + eventNamespace, module.event.blur)\n                ;\n              }\n            }\n            $menu\n              .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)\n              .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)\n              .on('click'      + eventNamespace, selector.item, module.event.item.click)\n            ;\n          },\n          intent: function() {\n            module.verbose('Binding hide intent event to document');\n            if(hasTouch) {\n              $document\n                .on('touchstart' + elementNamespace, module.event.test.touch)\n                .on('touchmove'  + elementNamespace, module.event.test.touch)\n              ;\n            }\n            $document\n              .on('click' + elementNamespace, module.event.test.hide)\n            ;\n          }\n        },\n\n        unbind: {\n          intent: function() {\n            module.verbose('Removing hide intent event from document');\n            if(hasTouch) {\n              $document\n                .off('touchstart' + elementNamespace)\n                .off('touchmove' + elementNamespace)\n              ;\n            }\n            $document\n              .off('click' + elementNamespace)\n            ;\n          }\n        },\n\n        filter: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            afterFiltered = function() {\n              if(module.is.multiple()) {\n                module.filterActive();\n              }\n              if(query || (!query && module.get.activeItem().length == 0)) {\n                module.select.firstUnfiltered();\n              }\n              if( module.has.allResultsFiltered() ) {\n                if( settings.onNoResults.call(element, searchTerm) ) {\n                  if(settings.allowAdditions) {\n                    if(settings.hideAdditions) {\n                      module.verbose('User addition with no menu, setting empty style');\n                      module.set.empty();\n                      module.hideMenu();\n                    }\n                  }\n                  else {\n                    module.verbose('All items filtered, showing message', searchTerm);\n                    module.add.message(message.noResults);\n                  }\n                }\n                else {\n                  module.verbose('All items filtered, hiding dropdown', searchTerm);\n                  module.hideMenu();\n                }\n              }\n              else {\n                module.remove.empty();\n                module.remove.message();\n              }\n              if(settings.allowAdditions) {\n                module.add.userSuggestion(query);\n              }\n              if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {\n                module.show();\n              }\n            }\n          ;\n          if(settings.useLabels && module.has.maxSelections()) {\n            return;\n          }\n          if(settings.apiSettings) {\n            if( module.can.useAPI() ) {\n              module.queryRemote(searchTerm, function() {\n                if(settings.filterRemoteData) {\n                  module.filterItems(searchTerm);\n                }\n                afterFiltered();\n              });\n            }\n            else {\n              module.error(error.noAPI);\n            }\n          }\n          else {\n            module.filterItems(searchTerm);\n            afterFiltered();\n          }\n        },\n\n        queryRemote: function(query, callback) {\n          var\n            apiSettings = {\n              errorDuration : false,\n              cache         : 'local',\n              throttle      : settings.throttle,\n              urlData       : {\n                query: query\n              },\n              onError: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onFailure: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onSuccess : function(response) {\n                module.remove.message();\n                module.setup.menu({\n                  values: response[fields.remoteValues]\n                });\n                callback();\n              }\n            }\n          ;\n          if( !$module.api('get request') ) {\n            module.setup.api();\n          }\n          apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);\n          $module\n            .api('setting', apiSettings)\n            .api('query')\n          ;\n        },\n\n        filterItems: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            results          =  null,\n            escapedTerm      = module.escape.string(searchTerm),\n            beginsWithRegExp = new RegExp('^' + escapedTerm, 'igm')\n          ;\n          // avoid loop if we're matching nothing\n          if( module.has.query() ) {\n            results = [];\n\n            module.verbose('Searching for matching values', searchTerm);\n            $item\n              .each(function(){\n                var\n                  $choice = $(this),\n                  text,\n                  value\n                ;\n                if(settings.match == 'both' || settings.match == 'text') {\n                  text = String(module.get.choiceText($choice, false));\n                  if(text.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n                if(settings.match == 'both' || settings.match == 'value') {\n                  value = String(module.get.choiceValue($choice, text));\n                  if(value.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n              })\n            ;\n          }\n          module.debug('Showing only matched items', searchTerm);\n          module.remove.filteredItem();\n          if(results) {\n            $item\n              .not(results)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        fuzzySearch: function(query, term) {\n          var\n            termLength  = term.length,\n            queryLength = query.length\n          ;\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(queryLength > termLength) {\n            return false;\n          }\n          if(queryLength === termLength) {\n            return (query === term);\n          }\n          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n            var\n              queryCharacter = query.charCodeAt(characterIndex)\n            ;\n            while(nextCharacterIndex < termLength) {\n              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                continue search;\n              }\n            }\n            return false;\n          }\n          return true;\n        },\n        exactSearch: function (query, term) {\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(term.indexOf(query) > -1) {\n             return true;\n          }\n          return false;\n        },\n        filterActive: function() {\n          if(settings.useLabels) {\n            $item.filter('.' + className.active)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        focusSearch: function(skipHandler) {\n          if( module.has.search() && !module.is.focusedOnSearch() ) {\n            if(skipHandler) {\n              $module.off('focus' + eventNamespace, selector.search);\n              $search.focus();\n              $module.on('focus'  + eventNamespace, selector.search, module.event.search.focus);\n            }\n            else {\n              $search.focus();\n            }\n          }\n        },\n\n        forceSelection: function() {\n          var\n            $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),\n            $activeItem        = $item.not(className.filtered).filter('.' + className.active).eq(0),\n            $selectedItem      = ($currentlySelected.length > 0)\n              ? $currentlySelected\n              : $activeItem,\n            hasSelected = ($selectedItem.length > 0)\n          ;\n          if(hasSelected && !module.is.multiple()) {\n            module.debug('Forcing partial selection to selected item', $selectedItem);\n            module.event.item.click.call($selectedItem, {}, true);\n            return;\n          }\n          else {\n            if(settings.allowAdditions) {\n              module.set.selected(module.get.query());\n              module.remove.searchTerm();\n            }\n            else {\n              module.remove.searchTerm();\n            }\n          }\n        },\n\n        change: {\n          values: function(values) {\n            if(!settings.allowAdditions) {\n              module.clear();\n            }\n            module.debug('Creating dropdown with specified values', values);\n            module.setup.menu({values: values});\n            $.each(values, function(index, item) {\n              if(item.selected == true) {\n                module.debug('Setting initial selection to', item.value);\n                module.set.selected(item.value);\n                return true;\n              }\n            });\n          }\n        },\n\n        event: {\n          change: function() {\n            if(!internalChange) {\n              module.debug('Input changed, updating selection');\n              module.set.selected();\n            }\n          },\n          focus: function() {\n            if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {\n              module.show();\n            }\n          },\n          blur: function(event) {\n            pageLostFocus = (document.activeElement === this);\n            if(!activated && !pageLostFocus) {\n              module.remove.activeLabel();\n              module.hide();\n            }\n          },\n          mousedown: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = true;\n            }\n            else {\n              // prevents focus callback from occurring on mousedown\n              activated = true;\n            }\n          },\n          mouseup: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = false;\n            }\n            else {\n              activated = false;\n            }\n          },\n          click: function(event) {\n            var\n              $target = $(event.target)\n            ;\n            // focus search\n            if($target.is($module)) {\n              if(!module.is.focusedOnSearch()) {\n                module.focusSearch();\n              }\n              else {\n                module.show();\n              }\n            }\n          },\n          search: {\n            focus: function() {\n              activated = true;\n              if(module.is.multiple()) {\n                module.remove.activeLabel();\n              }\n              if(settings.showOnFocus) {\n                module.search();\n              }\n            },\n            blur: function(event) {\n              pageLostFocus = (document.activeElement === this);\n              if(module.is.searchSelection() && !willRefocus) {\n                if(!itemActivated && !pageLostFocus) {\n                  if(settings.forceSelection) {\n                    module.forceSelection();\n                  }\n                  module.hide();\n                }\n              }\n              willRefocus = false;\n            }\n          },\n          icon: {\n            click: function(event) {\n              module.toggle();\n            }\n          },\n          text: {\n            focus: function(event) {\n              activated = true;\n              module.focusSearch();\n            }\n          },\n          input: function(event) {\n            if(module.is.multiple() || module.is.searchSelection()) {\n              module.set.filtered();\n            }\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.search, settings.delay.search);\n          },\n          label: {\n            click: function(event) {\n              var\n                $label        = $(this),\n                $labels       = $module.find(selector.label),\n                $activeLabels = $labels.filter('.' + className.active),\n                $nextActive   = $label.nextAll('.' + className.active),\n                $prevActive   = $label.prevAll('.' + className.active),\n                $range = ($nextActive.length > 0)\n                  ? $label.nextUntil($nextActive).add($activeLabels).add($label)\n                  : $label.prevUntil($prevActive).add($activeLabels).add($label)\n              ;\n              if(event.shiftKey) {\n                $activeLabels.removeClass(className.active);\n                $range.addClass(className.active);\n              }\n              else if(event.ctrlKey) {\n                $label.toggleClass(className.active);\n              }\n              else {\n                $activeLabels.removeClass(className.active);\n                $label.addClass(className.active);\n              }\n              settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));\n            }\n          },\n          remove: {\n            click: function() {\n              var\n                $label = $(this).parent()\n              ;\n              if( $label.hasClass(className.active) ) {\n                // remove all selected labels\n                module.remove.activeLabels();\n              }\n              else {\n                // remove this label only\n                module.remove.activeLabels( $label );\n              }\n            }\n          },\n          test: {\n            toggle: function(event) {\n              var\n                toggleBehavior = (module.is.multiple())\n                  ? module.show\n                  : module.toggle\n              ;\n              if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {\n                return;\n              }\n              if( module.determine.eventOnElement(event, toggleBehavior) ) {\n                event.preventDefault();\n              }\n            },\n            touch: function(event) {\n              module.determine.eventOnElement(event, function() {\n                if(event.type == 'touchstart') {\n                  module.timer = setTimeout(function() {\n                    module.hide();\n                  }, settings.delay.touch);\n                }\n                else if(event.type == 'touchmove') {\n                  clearTimeout(module.timer);\n                }\n              });\n              event.stopPropagation();\n            },\n            hide: function(event) {\n              module.determine.eventInModule(event, module.hide);\n            }\n          },\n          select: {\n            mutation: function(mutations) {\n              module.debug('<select> modified, recreating menu');\n              var\n                isSelectMutation = false\n              ;\n              $.each(mutations, function(index, mutation) {\n                if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {\n                  isSelectMutation = true;\n                  return true;\n                }\n              });\n              if(isSelectMutation) {\n                module.disconnect.selectObserver();\n                module.refresh();\n                module.setup.select();\n                module.set.selected();\n                module.observe.select();\n              }\n            }\n          },\n          menu: {\n            mutation: function(mutations) {\n              var\n                mutation   = mutations[0],\n                $addedNode = mutation.addedNodes\n                  ? $(mutation.addedNodes[0])\n                  : $(false),\n                $removedNode = mutation.removedNodes\n                  ? $(mutation.removedNodes[0])\n                  : $(false),\n                $changedNodes  = $addedNode.add($removedNode),\n                isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,\n                isMessage      = $changedNodes.is(selector.message)  || $changedNodes.closest(selector.message).length > 0\n              ;\n              if(isUserAddition || isMessage) {\n                module.debug('Updating item selector cache');\n                module.refreshItems();\n              }\n              else {\n                module.debug('Menu modified, updating selector cache');\n                module.refresh();\n              }\n            },\n            mousedown: function() {\n              itemActivated = true;\n            },\n            mouseup: function() {\n              itemActivated = false;\n            }\n          },\n          item: {\n            mouseenter: function(event) {\n              var\n                $target        = $(event.target),\n                $item          = $(this),\n                $subMenu       = $item.children(selector.menu),\n                $otherMenus    = $item.siblings(selector.item).children(selector.menu),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              if( !isBubbledEvent && hasSubMenu ) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Showing sub-menu', $subMenu);\n                  $.each($otherMenus, function() {\n                    module.animate.hide(false, $(this));\n                  });\n                  module.animate.show(false, $subMenu);\n                }, settings.delay.show);\n                event.preventDefault();\n              }\n            },\n            mouseleave: function(event) {\n              var\n                $subMenu = $(this).children(selector.menu)\n              ;\n              if($subMenu.length > 0) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Hiding sub-menu', $subMenu);\n                  module.animate.hide(false, $subMenu);\n                }, settings.delay.hide);\n              }\n            },\n            click: function (event, skipRefocus) {\n              var\n                $choice        = $(this),\n                $target        = (event)\n                  ? $(event.target)\n                  : $(''),\n                $subMenu       = $choice.find(selector.menu),\n                text           = module.get.choiceText($choice),\n                value          = module.get.choiceValue($choice, text),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              // prevents IE11 bug where menu receives focus even though `tabindex=-1`\n              if(module.has.menuSearch()) {\n                $(document.activeElement).blur();\n              }\n              if(!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {\n                if(module.is.searchSelection()) {\n                  if(settings.allowAdditions) {\n                    module.remove.userAddition();\n                  }\n                  module.remove.searchTerm();\n                  if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {\n                    module.focusSearch(true);\n                  }\n                }\n                if(!settings.useLabels) {\n                  module.remove.filteredItem();\n                  module.set.scrollPosition($choice);\n                }\n                module.determine.selectAction.call(this, text, value);\n              }\n            }\n          },\n\n          document: {\n            // label selection should occur even when element has no focus\n            keydown: function(event) {\n              var\n                pressedKey    = event.which,\n                isShortcutKey = module.is.inObject(pressedKey, keys)\n              ;\n              if(isShortcutKey) {\n                var\n                  $label            = $module.find(selector.label),\n                  $activeLabel      = $label.filter('.' + className.active),\n                  activeValue       = $activeLabel.data(metadata.value),\n                  labelIndex        = $label.index($activeLabel),\n                  labelCount        = $label.length,\n                  hasActiveLabel    = ($activeLabel.length > 0),\n                  hasMultipleActive = ($activeLabel.length > 1),\n                  isFirstLabel      = (labelIndex === 0),\n                  isLastLabel       = (labelIndex + 1 == labelCount),\n                  isSearch          = module.is.searchSelection(),\n                  isFocusedOnSearch = module.is.focusedOnSearch(),\n                  isFocused         = module.is.focused(),\n                  caretAtStart      = (isFocusedOnSearch && module.get.caretPosition() === 0),\n                  $nextLabel\n                ;\n                if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {\n                  return;\n                }\n\n                if(pressedKey == keys.leftArrow) {\n                  // activate previous label\n                  if((isFocused || caretAtStart) && !hasActiveLabel) {\n                    module.verbose('Selecting previous label');\n                    $label.last().addClass(className.active);\n                  }\n                  else if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting previous label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding previous label to selection');\n                    }\n                    if(isFirstLabel && !hasMultipleActive) {\n                      $activeLabel.addClass(className.active);\n                    }\n                    else {\n                      $activeLabel.prev(selector.siblingLabel)\n                        .addClass(className.active)\n                        .end()\n                      ;\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.rightArrow) {\n                  // activate first label\n                  if(isFocused && !hasActiveLabel) {\n                    $label.first().addClass(className.active);\n                  }\n                  // activate next label\n                  if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting next label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding next label to selection');\n                    }\n                    if(isLastLabel) {\n                      if(isSearch) {\n                        if(!isFocusedOnSearch) {\n                          module.focusSearch();\n                        }\n                        else {\n                          $label.removeClass(className.active);\n                        }\n                      }\n                      else if(hasMultipleActive) {\n                        $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                      }\n                      else {\n                        $activeLabel.addClass(className.active);\n                      }\n                    }\n                    else {\n                      $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.deleteKey || pressedKey == keys.backspace) {\n                  if(hasActiveLabel) {\n                    module.verbose('Removing active labels');\n                    if(isLastLabel) {\n                      if(isSearch && !isFocusedOnSearch) {\n                        module.focusSearch();\n                      }\n                    }\n                    $activeLabel.last().next(selector.siblingLabel).addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                    event.preventDefault();\n                  }\n                  else if(caretAtStart && !hasActiveLabel && pressedKey == keys.backspace) {\n                    module.verbose('Removing last label on input backspace');\n                    $activeLabel = $label.last().addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                  }\n                }\n                else {\n                  $activeLabel.removeClass(className.active);\n                }\n              }\n            }\n          },\n\n          keydown: function(event) {\n            var\n              pressedKey    = event.which,\n              isShortcutKey = module.is.inObject(pressedKey, keys)\n            ;\n            if(isShortcutKey) {\n              var\n                $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n                $activeItem        = $menu.children('.' + className.active).eq(0),\n                $selectedItem      = ($currentlySelected.length > 0)\n                  ? $currentlySelected\n                  : $activeItem,\n                $visibleItems = ($selectedItem.length > 0)\n                  ? $selectedItem.siblings(':not(.' + className.filtered +')').addBack()\n                  : $menu.children(':not(.' + className.filtered +')'),\n                $subMenu              = $selectedItem.children(selector.menu),\n                $parentMenu           = $selectedItem.closest(selector.menu),\n                inVisibleMenu         = ($parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0),\n                hasSubMenu            = ($subMenu.length> 0),\n                hasSelectedItem       = ($selectedItem.length > 0),\n                selectedIsSelectable  = ($selectedItem.not(selector.unselectable).length > 0),\n                delimiterPressed      = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),\n                isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),\n                $nextItem,\n                isSubMenuItem,\n                newIndex\n              ;\n              // allow selection with menu closed\n              if(isAdditionWithoutMenu) {\n                module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                $selectedItem[0].click();\n                if(module.is.searchSelection()) {\n                  module.remove.searchTerm();\n                }\n              }\n\n              // visible menu keyboard shortcuts\n              if( module.is.visible() ) {\n\n                // enter (select or open sub-menu)\n                if(pressedKey == keys.enter || delimiterPressed) {\n                  if(pressedKey == keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {\n                    module.verbose('Pressed enter on unselectable category, opening sub menu');\n                    pressedKey = keys.rightArrow;\n                  }\n                  else if(selectedIsSelectable) {\n                    module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                    $selectedItem[0].click();\n                    if(module.is.searchSelection()) {\n                      module.remove.searchTerm();\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // sub-menu actions\n                if(hasSelectedItem) {\n\n                  if(pressedKey == keys.leftArrow) {\n\n                    isSubMenuItem = ($parentMenu[0] !== $menu[0]);\n\n                    if(isSubMenuItem) {\n                      module.verbose('Left key pressed, closing sub-menu');\n                      module.animate.hide(false, $parentMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $parentMenu\n                        .closest(selector.item)\n                          .addClass(className.selected)\n                      ;\n                      module.aria.refreshDescendant();\n                      event.preventDefault();\n                    }\n                  }\n\n                  // right arrow (show sub-menu)\n                  if(pressedKey == keys.rightArrow) {\n                    if(hasSubMenu) {\n                      module.verbose('Right key pressed, opening sub-menu');\n                      module.animate.show(false, $subMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $subMenu\n                        .find(selector.item).eq(0)\n                          .addClass(className.selected)\n                      ;\n                      module.aria.refreshDescendant();\n                      event.preventDefault();\n                    }\n                  }\n                }\n\n                // up arrow (traverse menu up)\n                if(pressedKey == keys.upArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($visibleItems.index( $nextItem ) < 0) {\n                    module.verbose('Up key pressed but reached top of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Up key pressed, changing active item');\n                    $selectedItem\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.aria.refreshDescendant();\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // down arrow (traverse menu down)\n                if(pressedKey == keys.downArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($nextItem.length === 0) {\n                    module.verbose('Down key pressed but reached bottom of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Down key pressed, changing active item');\n                    $item\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.aria.refreshDescendant();\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // page down (show next page)\n                if(pressedKey == keys.pageUp) {\n                  module.scrollPage('up');\n                  event.preventDefault();\n                }\n                if(pressedKey == keys.pageDown) {\n                  module.scrollPage('down');\n                  event.preventDefault();\n                }\n\n                // escape (close menu)\n                if(pressedKey == keys.escape) {\n                  module.verbose('Escape key pressed, closing dropdown');\n                  module.hide();\n                }\n\n              }\n              else {\n                // delimiter key\n                if(delimiterPressed) {\n                  event.preventDefault();\n                }\n                // down arrow (open menu)\n                if(pressedKey == keys.downArrow && !module.is.visible()) {\n                  module.verbose('Down key pressed, showing dropdown');\n                  module.show();\n                  event.preventDefault();\n                }\n              }\n            }\n            else {\n              if( !module.has.search() ) {\n                module.set.selectedLetter( String.fromCharCode(pressedKey) );\n              }\n            }\n          }\n        },\n\n        trigger: {\n          change: function() {\n            var\n              events       = document.createEvent('HTMLEvents'),\n              inputElement = $input[0]\n            ;\n            if(inputElement) {\n              module.verbose('Triggering native change event');\n              events.initEvent('change', true, false);\n              inputElement.dispatchEvent(events);\n            }\n          }\n        },\n\n        determine: {\n          selectAction: function(text, value) {\n            module.verbose('Determining action', settings.action);\n            if( $.isFunction( module.action[settings.action] ) ) {\n              module.verbose('Triggering preset action', settings.action, text, value);\n              module.action[ settings.action ].call(element, text, value, this);\n            }\n            else if( $.isFunction(settings.action) ) {\n              module.verbose('Triggering user action', settings.action, text, value);\n              settings.action.call(element, text, value, this);\n            }\n            else {\n              module.error(error.action, settings.action);\n            }\n          },\n          eventInModule: function(event, callback) {\n            var\n              $target    = $(event.target),\n              inDocument = ($target.closest(document.documentElement).length > 0),\n              inModule   = ($target.closest($module).length > 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inDocument && !inModule) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown, canceling callback');\n              return false;\n            }\n          },\n          eventOnElement: function(event, callback) {\n            var\n              $target      = $(event.target),\n              $label       = $target.closest(selector.siblingLabel),\n              inVisibleDOM = document.body.contains(event.target),\n              notOnLabel   = ($module.find($label).length === 0),\n              notInMenu    = ($target.closest($menu).length === 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inVisibleDOM && notOnLabel && notInMenu) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown menu, canceling callback');\n              return false;\n            }\n          }\n        },\n\n        action: {\n\n          nothing: function() {},\n\n          activate: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.selected(value, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          select: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.value(value, text, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          combo: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            module.set.selected(value, $(element));\n            module.hideAndClear();\n          },\n\n          hide: function(text, value, element) {\n            module.set.value(value, text);\n            module.hideAndClear();\n          }\n\n        },\n\n        get: {\n          id: function() {\n            return id;\n          },\n          defaultText: function() {\n            return $module.data(metadata.defaultText);\n          },\n          defaultValue: function() {\n            return $module.data(metadata.defaultValue);\n          },\n          placeholderText: function() {\n            if(settings.placeholder != 'auto' && typeof settings.placeholder == 'string') {\n              return settings.placeholder;\n            }\n            return $module.data(metadata.placeholderText) || '';\n          },\n          text: function() {\n            return $text.text();\n          },\n          query: function() {\n            return $.trim($search.val());\n          },\n          searchWidth: function(value) {\n            value = (value !== undefined)\n              ? value\n              : $search.val()\n            ;\n            $sizer.text(value);\n            // prevent rounding issues\n            return Math.ceil( $sizer.width() + 1);\n          },\n          selectionCount: function() {\n            var\n              values = module.get.values(),\n              count\n            ;\n            count = ( module.is.multiple() )\n              ? $.isArray(values)\n                ? values.length\n                : 0\n              : (module.get.value() !== '')\n                ? 1\n                : 0\n            ;\n            return count;\n          },\n          transition: function($subMenu) {\n            return (settings.transition == 'auto')\n              ? module.is.upward($subMenu)\n                ? 'slide up'\n                : 'slide down'\n              : settings.transition\n            ;\n          },\n          userValues: function() {\n            var\n              values = module.get.values()\n            ;\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            return $.grep(values, function(value) {\n              return (module.get.item(value) === false);\n            });\n          },\n          uniqueArray: function(array) {\n            return $.grep(array, function (value, index) {\n                return $.inArray(value, array) === index;\n            });\n          },\n          caretPosition: function() {\n            var\n              input = $search.get(0),\n              range,\n              rangeLength\n            ;\n            if('selectionStart' in input) {\n              return input.selectionStart;\n            }\n            else if (document.selection) {\n              input.focus();\n              range       = document.selection.createRange();\n              rangeLength = range.text.length;\n              range.moveStart('character', -input.value.length);\n              return range.text.length - rangeLength;\n            }\n          },\n          value: function() {\n            var\n              value = ($input.length > 0)\n                ? $input.val()\n                : $module.data(metadata.value),\n              isEmptyMultiselect = ($.isArray(value) && value.length === 1 && value[0] === '')\n            ;\n            // prevents placeholder element from being selected when multiple\n            return (value === undefined || isEmptyMultiselect)\n              ? ''\n              : value\n            ;\n          },\n          values: function() {\n            var\n              value = module.get.value()\n            ;\n            if(value === '') {\n              return '';\n            }\n            return ( !module.has.selectInput() && module.is.multiple() )\n              ? (typeof value == 'string') // delimited string\n                ? value.split(settings.delimiter)\n                : ''\n              : value\n            ;\n          },\n          remoteValues: function() {\n            var\n              values = module.get.values(),\n              remoteValues = false\n            ;\n            if(values) {\n              if(typeof values == 'string') {\n                values = [values];\n              }\n              $.each(values, function(index, value) {\n                var\n                  name = module.read.remoteData(value)\n                ;\n                module.verbose('Restoring value from session data', name, value);\n                if(name) {\n                  if(!remoteValues) {\n                    remoteValues = {};\n                  }\n                  remoteValues[value] = name;\n                }\n              });\n            }\n            return remoteValues;\n          },\n          choiceText: function($choice, preserveHTML) {\n            preserveHTML = (preserveHTML !== undefined)\n              ? preserveHTML\n              : settings.preserveHTML\n            ;\n            if($choice) {\n              if($choice.find(selector.menu).length > 0) {\n                module.verbose('Retrieving text of element with sub-menu');\n                $choice = $choice.clone();\n                $choice.find(selector.menu).remove();\n                $choice.find(selector.menuIcon).remove();\n              }\n              return ($choice.data(metadata.text) !== undefined)\n                ? $choice.data(metadata.text)\n                : (preserveHTML)\n                  ? $.trim($choice.html())\n                  : $.trim($choice.text())\n              ;\n            }\n          },\n          choiceValue: function($choice, choiceText) {\n            choiceText = choiceText || module.get.choiceText($choice);\n            if(!$choice) {\n              return false;\n            }\n            return ($choice.data(metadata.value) !== undefined)\n              ? String( $choice.data(metadata.value) )\n              : (typeof choiceText === 'string')\n                ? $.trim(choiceText.toLowerCase())\n                : String(choiceText)\n            ;\n          },\n          inputEvent: function() {\n            var\n              input = $search[0]\n            ;\n            if(input) {\n              return (input.oninput !== undefined)\n                ? 'input'\n                : (input.onpropertychange !== undefined)\n                  ? 'propertychange'\n                  : 'keyup'\n              ;\n            }\n            return false;\n          },\n          selectValues: function() {\n            var\n              select = {}\n            ;\n            select.values = [];\n            $module\n              .find('option')\n                .each(function() {\n                  var\n                    $option  = $(this),\n                    name     = $option.html(),\n                    disabled = $option.attr('disabled'),\n                    value    = ( $option.attr('value') !== undefined )\n                      ? $option.attr('value')\n                      : name\n                  ;\n                  if(settings.placeholder === 'auto' && value === '') {\n                    select.placeholder = name;\n                  }\n                  else {\n                    select.values.push({\n                      name     : name,\n                      value    : value,\n                      disabled : disabled\n                    });\n                  }\n                })\n            ;\n            if(settings.placeholder && settings.placeholder !== 'auto') {\n              module.debug('Setting placeholder value to', settings.placeholder);\n              select.placeholder = settings.placeholder;\n            }\n            if(settings.sortSelect) {\n              select.values.sort(function(a, b) {\n                return (a.name > b.name)\n                  ? 1\n                  : -1\n                ;\n              });\n              module.debug('Retrieved and sorted values from select', select);\n            }\n            else {\n              module.debug('Retrieved values from select', select);\n            }\n            return select;\n          },\n          activeItem: function() {\n            return $item.filter('.'  + className.active);\n          },\n          selectedItem: function() {\n            var\n              $selectedItem = $item.not(selector.unselectable).filter('.'  + className.selected)\n            ;\n            return ($selectedItem.length > 0)\n              ? $selectedItem\n              : $item.eq(0)\n            ;\n          },\n          itemWithAdditions: function(value) {\n            var\n              $items       = module.get.item(value),\n              $userItems   = module.create.userChoice(value),\n              hasUserItems = ($userItems && $userItems.length > 0)\n            ;\n            if(hasUserItems) {\n              $items = ($items.length > 0)\n                ? $items.add($userItems)\n                : $userItems\n              ;\n            }\n            return $items;\n          },\n          item: function(value, strict) {\n            var\n              $selectedItem = false,\n              shouldSearch,\n              isMultiple\n            ;\n            value = (value !== undefined)\n              ? value\n              : ( module.get.values() !== undefined)\n                ? module.get.values()\n                : module.get.text()\n            ;\n            shouldSearch = (isMultiple)\n              ? (value.length > 0)\n              : (value !== undefined && value !== null)\n            ;\n            isMultiple = (module.is.multiple() && $.isArray(value));\n            strict     = (value === '' || value === 0)\n              ? true\n              : strict || false\n            ;\n            if(shouldSearch) {\n              $item\n                .each(function() {\n                  var\n                    $choice       = $(this),\n                    optionText    = module.get.choiceText($choice),\n                    optionValue   = module.get.choiceValue($choice, optionText)\n                  ;\n                  // safe early exit\n                  if(optionValue === null || optionValue === undefined) {\n                    return;\n                  }\n                  if(isMultiple) {\n                    if($.inArray( String(optionValue), value) !== -1 || $.inArray(optionText, value) !== -1) {\n                      $selectedItem = ($selectedItem)\n                        ? $selectedItem.add($choice)\n                        : $choice\n                      ;\n                    }\n                  }\n                  else if(strict) {\n                    module.verbose('Ambiguous dropdown value using strict type check', $choice, value);\n                    if( optionValue === value || optionText === value) {\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                  else {\n                    if( String(optionValue) == String(value) || optionText == value) {\n                      module.verbose('Found select item by value', optionValue, value);\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                })\n              ;\n            }\n            return $selectedItem;\n          }\n        },\n\n        check: {\n          maxSelections: function(selectionCount) {\n            if(settings.maxSelections) {\n              selectionCount = (selectionCount !== undefined)\n                ? selectionCount\n                : module.get.selectionCount()\n              ;\n              if(selectionCount >= settings.maxSelections) {\n                module.debug('Maximum selection count reached');\n                if(settings.useLabels) {\n                  $item.addClass(className.filtered);\n                  module.add.message(message.maxSelections);\n                }\n                return true;\n              }\n              else {\n                module.verbose('No longer at maximum selection count');\n                module.remove.message();\n                module.remove.filteredItem();\n                if(module.is.searchSelection()) {\n                  module.filterItems();\n                }\n                return false;\n              }\n            }\n            return true;\n          }\n        },\n\n        restore: {\n          defaults: function() {\n            module.clear();\n            module.restore.defaultText();\n            module.restore.defaultValue();\n          },\n          defaultText: function() {\n            var\n              defaultText     = module.get.defaultText(),\n              placeholderText = module.get.placeholderText\n            ;\n            if(defaultText === placeholderText) {\n              module.debug('Restoring default placeholder text', defaultText);\n              module.set.placeholderText(defaultText);\n            }\n            else {\n              module.debug('Restoring default text', defaultText);\n              module.set.text(defaultText);\n            }\n          },\n          placeholderText: function() {\n            module.set.placeholderText();\n          },\n          defaultValue: function() {\n            var\n              defaultValue = module.get.defaultValue()\n            ;\n            if(defaultValue !== undefined) {\n              module.debug('Restoring default value', defaultValue);\n              if(defaultValue !== '') {\n                module.set.value(defaultValue);\n                module.set.selected();\n              }\n              else {\n                module.remove.activeItem();\n                module.remove.selectedItem();\n              }\n            }\n          },\n          labels: function() {\n            if(settings.allowAdditions) {\n              if(!settings.useLabels) {\n                module.error(error.labels);\n                settings.useLabels = true;\n              }\n              module.debug('Restoring selected values');\n              module.create.userLabels();\n            }\n            module.check.maxSelections();\n          },\n          selected: function() {\n            module.restore.values();\n            if(module.is.multiple()) {\n              module.debug('Restoring previously selected values and labels');\n              module.restore.labels();\n            }\n            else {\n              module.debug('Restoring previously selected values');\n            }\n          },\n          values: function() {\n            // prevents callbacks from occurring on initial load\n            module.set.initialLoad();\n            if(settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {\n              module.restore.remoteValues();\n            }\n            else {\n              module.set.selected();\n            }\n            module.remove.initialLoad();\n          },\n          remoteValues: function() {\n            var\n              values = module.get.remoteValues()\n            ;\n            module.debug('Recreating selected from session data', values);\n            if(values) {\n              if( module.is.single() ) {\n                $.each(values, function(value, name) {\n                  module.set.text(name);\n                });\n              }\n              else {\n                $.each(values, function(value, name) {\n                  module.add.label(value, name);\n                });\n              }\n            }\n          }\n        },\n\n        read: {\n          remoteData: function(value) {\n            var\n              name\n            ;\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            name = sessionStorage.getItem(value);\n            return (name !== undefined)\n              ? name\n              : false\n            ;\n          }\n        },\n\n        save: {\n          defaults: function() {\n            module.save.defaultText();\n            module.save.placeholderText();\n            module.save.defaultValue();\n          },\n          defaultValue: function() {\n            var\n              value = module.get.value()\n            ;\n            module.verbose('Saving default value as', value);\n            $module.data(metadata.defaultValue, value);\n          },\n          defaultText: function() {\n            var\n              text = module.get.text()\n            ;\n            module.verbose('Saving default text as', text);\n            $module.data(metadata.defaultText, text);\n          },\n          placeholderText: function() {\n            var\n              text\n            ;\n            if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {\n              text = module.get.text();\n              module.verbose('Saving placeholder text as', text);\n              $module.data(metadata.placeholderText, text);\n            }\n          },\n          remoteData: function(name, value) {\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            module.verbose('Saving remote data to session storage', value, name);\n            sessionStorage.setItem(value, name);\n          }\n        },\n\n        clear: function() {\n          if(module.is.multiple() && settings.useLabels) {\n            module.remove.labels();\n          }\n          else {\n            module.remove.activeItem();\n            module.remove.selectedItem();\n          }\n          module.set.placeholderText();\n          module.clearValue();\n        },\n\n        clearValue: function() {\n          module.set.value('');\n        },\n\n        scrollPage: function(direction, $selectedItem) {\n          var\n            $currentItem  = $selectedItem || module.get.selectedItem(),\n            $menu         = $currentItem.closest(selector.menu),\n            menuHeight    = $menu.outerHeight(),\n            currentScroll = $menu.scrollTop(),\n            itemHeight    = $item.eq(0).outerHeight(),\n            itemsPerPage  = Math.floor(menuHeight / itemHeight),\n            maxScroll     = $menu.prop('scrollHeight'),\n            newScroll     = (direction == 'up')\n              ? currentScroll - (itemHeight * itemsPerPage)\n              : currentScroll + (itemHeight * itemsPerPage),\n            $selectableItem = $item.not(selector.unselectable),\n            isWithinRange,\n            $nextSelectedItem,\n            elementIndex\n          ;\n          elementIndex      = (direction == 'up')\n            ? $selectableItem.index($currentItem) - itemsPerPage\n            : $selectableItem.index($currentItem) + itemsPerPage\n          ;\n          isWithinRange = (direction == 'up')\n            ? (elementIndex >= 0)\n            : (elementIndex < $selectableItem.length)\n          ;\n          $nextSelectedItem = (isWithinRange)\n            ? $selectableItem.eq(elementIndex)\n            : (direction == 'up')\n              ? $selectableItem.first()\n              : $selectableItem.last()\n          ;\n          if($nextSelectedItem.length > 0) {\n            module.debug('Scrolling page', direction, $nextSelectedItem);\n            $currentItem\n              .removeClass(className.selected)\n            ;\n            $nextSelectedItem\n              .addClass(className.selected)\n            ;\n            if(settings.selectOnKeydown && module.is.single()) {\n              module.set.selectedItem($nextSelectedItem);\n            }\n            $menu\n              .scrollTop(newScroll)\n            ;\n          }\n        },\n\n        set: {\n          filtered: function() {\n            var\n              isMultiple       = module.is.multiple(),\n              isSearch         = module.is.searchSelection(),\n              isSearchMultiple = (isMultiple && isSearch),\n              searchValue      = (isSearch)\n                ? module.get.query()\n                : '',\n              hasSearchValue   = (typeof searchValue === 'string' && searchValue.length > 0),\n              searchWidth      = module.get.searchWidth(),\n              valueIsSet       = searchValue !== ''\n            ;\n            if(isMultiple && hasSearchValue) {\n              module.verbose('Adjusting input width', searchWidth, settings.glyphWidth);\n              $search.css('width', searchWidth);\n            }\n            if(hasSearchValue || (isSearchMultiple && valueIsSet)) {\n              module.verbose('Hiding placeholder text');\n              $text.addClass(className.filtered);\n            }\n            else if(!isMultiple || (isSearchMultiple && !valueIsSet)) {\n              module.verbose('Showing placeholder text');\n              $text.removeClass(className.filtered);\n            }\n          },\n          empty: function() {\n            $module.addClass(className.empty);\n          },\n          loading: function() {\n            $module.addClass(className.loading);\n          },\n          placeholderText: function(text) {\n            text = text || module.get.placeholderText();\n            module.debug('Setting placeholder text', text);\n            module.set.text(text);\n            $text.addClass(className.placeholder);\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Added tabindex to searchable dropdown');\n              $search\n                .val('')\n                .attr('tabindex', 0)\n              ;\n              $menu\n                .attr('tabindex', -1)\n              ;\n            }\n            else {\n              module.debug('Added tabindex to dropdown');\n              if( $module.attr('tabindex') === undefined) {\n                $module\n                  .attr('tabindex', 0)\n                ;\n                $menu\n                  .attr('tabindex', -1)\n                ;\n              }\n            }\n          },\n          initialLoad: function() {\n            module.verbose('Setting initial load');\n            initialLoad = true;\n          },\n          activeItem: function($item) {\n            if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {\n              $item.addClass(className.filtered);\n            }\n            else {\n              $item.addClass(className.active);\n            }\n          },\n          partialSearch: function(text) {\n            var\n              length = module.get.query().length\n            ;\n            $search.val( text.substr(0, length));\n          },\n          scrollPosition: function($item, forceScroll) {\n            var\n              edgeTolerance = 5,\n              $menu,\n              hasActive,\n              offset,\n              itemHeight,\n              itemOffset,\n              menuOffset,\n              menuScroll,\n              menuHeight,\n              abovePage,\n              belowPage\n            ;\n\n            $item       = $item || module.get.selectedItem();\n            $menu       = $item.closest(selector.menu);\n            hasActive   = ($item && $item.length > 0);\n            forceScroll = (forceScroll !== undefined)\n              ? forceScroll\n              : false\n            ;\n            if($item && $menu.length > 0 && hasActive) {\n              itemOffset = $item.position().top;\n\n              $menu.addClass(className.loading);\n              menuScroll = $menu.scrollTop();\n              menuOffset = $menu.offset().top;\n              itemOffset = $item.offset().top;\n              offset     = menuScroll - menuOffset + itemOffset;\n              if(!forceScroll) {\n                menuHeight = $menu.height();\n                belowPage  = menuScroll + menuHeight < (offset + edgeTolerance);\n                abovePage  = ((offset - edgeTolerance) < menuScroll);\n              }\n              module.debug('Scrolling to active item', offset);\n              if(forceScroll || abovePage || belowPage) {\n                $menu.scrollTop(offset);\n              }\n              $menu.removeClass(className.loading);\n            }\n          },\n          text: function(text) {\n            if(settings.action !== 'select') {\n              if(settings.action == 'combo') {\n                module.debug('Changing combo button text', text, $combo);\n                if(settings.preserveHTML) {\n                  $combo.html(text);\n                }\n                else {\n                  $combo.text(text);\n                }\n              }\n              else {\n                if(text !== module.get.placeholderText()) {\n                  $text.removeClass(className.placeholder);\n                }\n                module.debug('Changing text', text, $text);\n                $text\n                  .removeClass(className.filtered)\n                ;\n                if(settings.preserveHTML) {\n                  $text.html(text);\n                }\n                else {\n                  $text.text(text);\n                }\n              }\n            }\n          },\n          selectedItem: function($item) {\n            var\n              value      = module.get.choiceValue($item),\n              searchText = module.get.choiceText($item, false),\n              text       = module.get.choiceText($item, true)\n            ;\n            module.debug('Setting user selection to item', $item);\n            module.remove.activeItem();\n            module.set.partialSearch(searchText);\n            module.set.activeItem($item);\n            module.set.selected(value, $item);\n            module.set.text(text);\n          },\n          selectedLetter: function(letter) {\n            var\n              $selectedItem         = $item.filter('.' + className.selected),\n              alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),\n              $nextValue            = false,\n              $nextItem\n            ;\n            // check next of same letter\n            if(alreadySelectedLetter) {\n              $nextItem = $selectedItem.nextAll($item).eq(0);\n              if( module.has.firstLetter($nextItem, letter) ) {\n                $nextValue  = $nextItem;\n              }\n            }\n            // check all values\n            if(!$nextValue) {\n              $item\n                .each(function(){\n                  if(module.has.firstLetter($(this), letter)) {\n                    $nextValue = $(this);\n                    return false;\n                  }\n                })\n              ;\n            }\n            // set next value\n            if($nextValue) {\n              module.verbose('Scrolling to next value with letter', letter);\n              module.set.scrollPosition($nextValue);\n              $selectedItem.removeClass(className.selected);\n              $nextValue.addClass(className.selected);\n              module.aria.refreshDescendant();\n              if(settings.selectOnKeydown && module.is.single()) {\n                module.set.selectedItem($nextValue);\n              }\n            }\n          },\n          direction: function($menu) {\n            if(settings.direction == 'auto') {\n              // reset position\n              module.remove.upward();\n\n              if(module.can.openDownward($menu)) {\n                module.remove.upward($menu);\n              }\n              else {\n                module.set.upward($menu);\n              }\n              if(!module.is.leftward($menu) && !module.can.openRightward($menu)) {\n                module.set.leftward($menu);\n              }\n            }\n            else if(settings.direction == 'upward') {\n              module.set.upward($menu);\n            }\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.addClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.addClass(className.leftward);\n          },\n          value: function(value, text, $selected) {\n            var\n              escapedValue = module.escape.value(value),\n              hasInput     = ($input.length > 0),\n              currentValue = module.get.values(),\n              stringValue  = (value !== undefined)\n                ? String(value)\n                : value,\n              newValue\n            ;\n            if(hasInput) {\n              if(!settings.allowReselection && stringValue == currentValue) {\n                module.verbose('Skipping value update already same value', value, currentValue);\n                if(!module.is.initialLoad()) {\n                  return;\n                }\n              }\n\n              if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {\n                module.debug('Adding user option', value);\n                module.add.optionValue(value);\n              }\n              module.debug('Updating input value', escapedValue, currentValue);\n              internalChange = true;\n              $input\n                .val(escapedValue)\n              ;\n              if(settings.fireOnInit === false && module.is.initialLoad()) {\n                module.debug('Input native change event ignored on initial load');\n              }\n              else {\n                module.trigger.change();\n              }\n              internalChange = false;\n            }\n            else {\n              module.verbose('Storing value in metadata', escapedValue, $input);\n              if(escapedValue !== currentValue) {\n                $module.data(metadata.value, stringValue);\n              }\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onChange);\n            }\n            else {\n              settings.onChange.call(element, value, text, $selected);\n            }\n          },\n          active: function() {\n            $module\n              .addClass(className.active)\n            ;\n          },\n          multiple: function() {\n            $module.addClass(className.multiple);\n          },\n          visible: function() {\n            $module.addClass(className.visible);\n          },\n          exactly: function(value, $selectedItem) {\n            module.debug('Setting selected to exact values');\n            module.clear();\n            module.set.selected(value, $selectedItem);\n          },\n          selected: function(value, $selectedItem) {\n            var\n              isMultiple = module.is.multiple(),\n              $userSelectedItem\n            ;\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n            if(!$selectedItem) {\n              return;\n            }\n            module.debug('Setting selected menu item to', $selectedItem);\n            if(module.is.multiple()) {\n              module.remove.searchWidth();\n            }\n            if(module.is.single()) {\n              module.remove.activeItem();\n              module.remove.selectedItem();\n            }\n            else if(settings.useLabels) {\n              module.remove.selectedItem();\n            }\n            // select each item\n            $selectedItem\n              .each(function() {\n                var\n                  $selected      = $(this),\n                  selectedText   = module.get.choiceText($selected),\n                  selectedValue  = module.get.choiceValue($selected, selectedText),\n\n                  isFiltered     = $selected.hasClass(className.filtered),\n                  isActive       = $selected.hasClass(className.active),\n                  isUserValue    = $selected.hasClass(className.addition),\n                  shouldAnimate  = (isMultiple && $selectedItem.length == 1)\n                ;\n                if(isMultiple) {\n                  if(!isActive || isUserValue) {\n                    if(settings.apiSettings && settings.saveRemoteData) {\n                      module.save.remoteData(selectedText, selectedValue);\n                    }\n                    if(settings.useLabels) {\n                      module.add.label(selectedValue, selectedText, shouldAnimate);\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.activeItem($selected);\n                      module.filterActive();\n                      module.select.nextAvailable($selectedItem);\n                    }\n                    else {\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.text(module.add.variables(message.count));\n                      module.set.activeItem($selected);\n                    }\n                  }\n                  else if(!isFiltered) {\n                    module.debug('Selected active value, removing label');\n                    module.remove.selected(selectedValue);\n                  }\n                }\n                else {\n                  if(settings.apiSettings && settings.saveRemoteData) {\n                    module.save.remoteData(selectedText, selectedValue);\n                  }\n                  module.set.text(selectedText);\n                  module.set.value(selectedValue, selectedText, $selected);\n                  $selected\n                    .addClass(className.active)\n                    .addClass(className.selected)\n                  ;\n                }\n              })\n            ;\n          }\n        },\n\n        add: {\n          label: function(value, text, shouldAnimate) {\n            var\n              $next  = module.is.searchSelection()\n                ? $search\n                : $text,\n              escapedValue = module.escape.value(value),\n              $label\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            $label =  $('<a />')\n              .addClass(className.label)\n              .attr('data-' + metadata.value, escapedValue)\n              .html(templates.label(escapedValue, text))\n            ;\n            $label = settings.onLabelCreate.call($label, escapedValue, text);\n\n            if(module.has.label(value)) {\n              module.debug('User selection already exists, skipping', escapedValue);\n              return;\n            }\n            if(settings.label.variation) {\n              $label.addClass(settings.label.variation);\n            }\n            if(shouldAnimate === true) {\n              module.debug('Animating in label', $label);\n              $label\n                .addClass(className.hidden)\n                .insertBefore($next)\n                .transition(settings.label.transition, settings.label.duration)\n              ;\n            }\n            else {\n              module.debug('Adding selection label', $label);\n              $label\n                .insertBefore($next)\n              ;\n            }\n          },\n          message: function(message) {\n            var\n              $message = $menu.children(selector.message),\n              html     = settings.templates.message(module.add.variables(message))\n            ;\n            if($message.length > 0) {\n              $message\n                .html(html)\n              ;\n            }\n            else {\n              $message = $('<div/>')\n                .html(html)\n                .addClass(className.message)\n                .appendTo($menu)\n              ;\n            }\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(hasOption) {\n              return;\n            }\n            // temporarily disconnect observer\n            module.disconnect.selectObserver();\n            if( module.is.single() ) {\n              module.verbose('Removing previous user addition');\n              $input.find('option.' + className.addition).remove();\n            }\n            $('<option/>')\n              .prop('value', escapedValue)\n              .addClass(className.addition)\n              .html(value)\n              .appendTo($input)\n            ;\n            module.verbose('Adding user addition as an <option>', value);\n            module.observe.select();\n          },\n          userSuggestion: function(value) {\n            var\n              $addition         = $menu.children(selector.addition),\n              $existingItem     = module.get.item(value),\n              alreadyHasValue   = $existingItem && $existingItem.not(selector.addition).length,\n              hasUserSuggestion = $addition.length > 0,\n              html\n            ;\n            if(settings.useLabels && module.has.maxSelections()) {\n              return;\n            }\n            if(value === '' || alreadyHasValue) {\n              $addition.remove();\n              return;\n            }\n            if(hasUserSuggestion) {\n              $addition\n                .data(metadata.value, value)\n                .data(metadata.text, value)\n                .attr('data-' + metadata.value, value)\n                .attr('data-' + metadata.text, value)\n                .removeClass(className.filtered)\n              ;\n              if(!settings.hideAdditions) {\n                html = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $addition\n                  .html(html)\n                ;\n              }\n              module.verbose('Replacing user suggestion with new value', $addition);\n            }\n            else {\n              $addition = module.create.userChoice(value);\n              $addition\n                .prependTo($menu)\n              ;\n              module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);\n            }\n            if(!settings.hideAdditions || module.is.allFiltered()) {\n              $addition\n                .addClass(className.selected)\n                .siblings()\n                .removeClass(className.selected)\n              ;\n            }\n            module.refreshItems();\n          },\n          variables: function(message, term) {\n            var\n              hasCount    = (message.search('{count}') !== -1),\n              hasMaxCount = (message.search('{maxCount}') !== -1),\n              hasTerm     = (message.search('{term}') !== -1),\n              values,\n              count,\n              query\n            ;\n            module.verbose('Adding templated variables to message', message);\n            if(hasCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{count}', count);\n            }\n            if(hasMaxCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{maxCount}', settings.maxSelections);\n            }\n            if(hasTerm) {\n              query   = term || module.get.query();\n              message = message.replace('{term}', query);\n            }\n            return message;\n          },\n          value: function(addedValue, addedText, $selectedItem) {\n            var\n              currentValue = module.get.values(),\n              newValue\n            ;\n            if(module.has.value(addedValue)) {\n              module.debug('Value already selected');\n              return;\n            }\n            if(addedValue === '') {\n              module.debug('Cannot select blank values from multiselect');\n              return;\n            }\n            // extend current array\n            if($.isArray(currentValue)) {\n              newValue = currentValue.concat([addedValue]);\n              newValue = module.get.uniqueArray(newValue);\n            }\n            else {\n              newValue = [addedValue];\n            }\n            // add values\n            if( module.has.selectInput() ) {\n              if(module.can.extendSelect()) {\n                module.debug('Adding value to select', addedValue, newValue, $input);\n                module.add.optionValue(addedValue);\n              }\n            }\n            else {\n              newValue = newValue.join(settings.delimiter);\n              module.debug('Setting hidden input to delimited value', newValue, $input);\n            }\n\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('Skipping onadd callback on initial load', settings.onAdd);\n            }\n            else {\n              settings.onAdd.call(element, addedValue, addedText, $selectedItem);\n            }\n            module.set.value(newValue, addedValue, addedText, $selectedItem);\n            module.check.maxSelections();\n          }\n        },\n\n        remove: {\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          activeLabel: function() {\n            $module.find(selector.label).removeClass(className.active);\n          },\n          empty: function() {\n            $module.removeClass(className.empty);\n          },\n          loading: function() {\n            $module.removeClass(className.loading);\n          },\n          initialLoad: function() {\n            initialLoad = false;\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.removeClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.removeClass(className.leftward);\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          activeItem: function() {\n            $item.removeClass(className.active);\n          },\n          filteredItem: function() {\n            if(settings.useLabels && module.has.maxSelections() ) {\n              return;\n            }\n            if(settings.useLabels && module.is.multiple()) {\n              $item.not('.' + className.active).removeClass(className.filtered);\n            }\n            else {\n              $item.removeClass(className.filtered);\n            }\n            module.remove.empty();\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(!hasOption || !$option.hasClass(className.addition)) {\n              return;\n            }\n            // temporarily disconnect observer\n            if(selectObserver) {\n              selectObserver.disconnect();\n              module.verbose('Temporarily disconnecting mutation observer');\n            }\n            $option.remove();\n            module.verbose('Removing user addition as an <option>', escapedValue);\n            if(selectObserver) {\n              selectObserver.observe($input[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          message: function() {\n            $menu.children(selector.message).remove();\n          },\n          searchWidth: function() {\n            $search.css('width', '');\n          },\n          searchTerm: function() {\n            module.verbose('Cleared search term');\n            $search.val('');\n            module.set.filtered();\n          },\n          userAddition: function() {\n            $item.filter(selector.addition).remove();\n          },\n          selected: function(value, $selectedItem) {\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n\n            if(!$selectedItem) {\n              return false;\n            }\n\n            $selectedItem\n              .each(function() {\n                var\n                  $selected     = $(this),\n                  selectedText  = module.get.choiceText($selected),\n                  selectedValue = module.get.choiceValue($selected, selectedText)\n                ;\n                if(module.is.multiple()) {\n                  if(settings.useLabels) {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    module.remove.label(selectedValue);\n                  }\n                  else {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    if(module.get.selectionCount() === 0) {\n                      module.set.placeholderText();\n                    }\n                    else {\n                      module.set.text(module.add.variables(message.count));\n                    }\n                  }\n                }\n                else {\n                  module.remove.value(selectedValue, selectedText, $selected);\n                }\n                $selected\n                  .removeClass(className.filtered)\n                  .removeClass(className.active)\n                ;\n                if(settings.useLabels) {\n                  $selected.removeClass(className.selected);\n                }\n              })\n            ;\n          },\n          selectedItem: function() {\n            $item.removeClass(className.selected);\n          },\n          value: function(removedValue, removedText, $removedItem) {\n            var\n              values = module.get.values(),\n              newValue\n            ;\n            if( module.has.selectInput() ) {\n              module.verbose('Input is <select> removing selected option', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              module.remove.optionValue(removedValue);\n            }\n            else {\n              module.verbose('Removing from delimited values', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              newValue = newValue.join(settings.delimiter);\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onRemove);\n            }\n            else {\n              settings.onRemove.call(element, removedValue, removedText, $removedItem);\n            }\n            module.set.value(newValue, removedText, $removedItem);\n            module.check.maxSelections();\n          },\n          arrayValue: function(removedValue, values) {\n            if( !$.isArray(values) ) {\n              values = [values];\n            }\n            values = $.grep(values, function(value){\n              return (removedValue != value);\n            });\n            module.verbose('Removed value from delimited string', removedValue, values);\n            return values;\n          },\n          label: function(value, shouldAnimate) {\n            var\n              $labels       = $module.find(selector.label),\n              $removedLabel = $labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(value) +'\"]')\n            ;\n            module.verbose('Removing label', $removedLabel);\n            $removedLabel.remove();\n          },\n          activeLabels: function($activeLabels) {\n            $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);\n            module.verbose('Removing active label selections', $activeLabels);\n            module.remove.labels($activeLabels);\n          },\n          labels: function($labels) {\n            $labels = $labels || $module.find(selector.label);\n            module.verbose('Removing labels', $labels);\n            $labels\n              .each(function(){\n                var\n                  $label      = $(this),\n                  value       = $label.data(metadata.value),\n                  stringValue = (value !== undefined)\n                    ? String(value)\n                    : value,\n                  isUserValue = module.is.userValue(stringValue)\n                ;\n                if(settings.onLabelRemove.call($label, value) === false) {\n                  module.debug('Label remove callback cancelled removal');\n                  return;\n                }\n                module.remove.message();\n                if(isUserValue) {\n                  module.remove.value(stringValue);\n                  module.remove.label(stringValue);\n                }\n                else {\n                  // selected will also remove label\n                  module.remove.selected(stringValue);\n                }\n              })\n            ;\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Searchable dropdown initialized');\n              $search\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n            else {\n              module.debug('Simple selection dropdown initialized');\n              $module\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n          }\n        },\n\n        has: {\n          menuSearch: function() {\n            return (module.has.search() && $search.closest($menu).length > 0);\n          },\n          search: function() {\n            return ($search.length > 0);\n          },\n          sizer: function() {\n            return ($sizer.length > 0);\n          },\n          selectInput: function() {\n            return ( $input.is('select') );\n          },\n          minCharacters: function(searchTerm) {\n            if(settings.minCharacters) {\n              searchTerm = (searchTerm !== undefined)\n                ? String(searchTerm)\n                : String(module.get.query())\n              ;\n              return (searchTerm.length >= settings.minCharacters);\n            }\n            return true;\n          },\n          firstLetter: function($item, letter) {\n            var\n              text,\n              firstLetter\n            ;\n            if(!$item || $item.length === 0 || typeof letter !== 'string') {\n              return false;\n            }\n            text        = module.get.choiceText($item, false);\n            letter      = letter.toLowerCase();\n            firstLetter = String(text).charAt(0).toLowerCase();\n            return (letter == firstLetter);\n          },\n          input: function() {\n            return ($input.length > 0);\n          },\n          items: function() {\n            return ($item.length > 0);\n          },\n          menu: function() {\n            return ($menu.length > 0);\n          },\n          message: function() {\n            return ($menu.children(selector.message).length !== 0);\n          },\n          label: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $labels      = $module.find(selector.label)\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            return ($labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(escapedValue) +'\"]').length > 0);\n          },\n          maxSelections: function() {\n            return (settings.maxSelections && module.get.selectionCount() >= settings.maxSelections);\n          },\n          allResultsFiltered: function() {\n            var\n              $normalResults = $item.not(selector.addition)\n            ;\n            return ($normalResults.filter(selector.unselectable).length === $normalResults.length);\n          },\n          userSuggestion: function() {\n            return ($menu.children(selector.addition).length > 0);\n          },\n          query: function() {\n            return (module.get.query() !== '');\n          },\n          value: function(value) {\n            return (settings.ignoreCase)\n              ? module.has.valueIgnoringCase(value)\n              : module.has.valueMatchingCase(value)\n            ;\n          },\n          valueMatchingCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = $.isArray(values)\n               ? values && ($.inArray(value, values) !== -1)\n               : (values == value)\n            ;\n            return (hasValue)\n              ? true\n              : false\n            ;\n          },\n          valueIgnoringCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = false\n            ;\n            if(!$.isArray(values)) {\n              values = [values];\n            }\n            $.each(values, function(index, existingValue) {\n              if(String(value).toLowerCase() == String(existingValue).toLowerCase()) {\n                hasValue = true;\n                return false;\n              }\n            });\n            return hasValue;\n          }\n        },\n\n        is: {\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          animatingInward: function() {\n            return $menu.transition('is inward');\n          },\n          animatingOutward: function() {\n            return $menu.transition('is outward');\n          },\n          bubbledLabelClick: function(event) {\n            return $(event.target).is('select, input') && $module.closest('label').length > 0;\n          },\n          bubbledIconClick: function(event) {\n            return $(event.target).closest($icon).length > 0;\n          },\n          alreadySetup: function() {\n            return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);\n          },\n          animating: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.transition && $subMenu.transition('is animating')\n              : $menu.transition    && $menu.transition('is animating')\n            ;\n          },\n          leftward: function($subMenu) {\n            var $selectedMenu = $subMenu || $menu;\n            return $selectedMenu.hasClass(className.leftward);\n          },\n          disabled: function() {\n            return $module.hasClass(className.disabled);\n          },\n          focused: function() {\n            return (document.activeElement === $module[0]);\n          },\n          focusedOnSearch: function() {\n            return (document.activeElement === $search[0]);\n          },\n          allFiltered: function() {\n            return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );\n          },\n          hidden: function($subMenu) {\n            return !module.is.visible($subMenu);\n          },\n          initialLoad: function() {\n            return initialLoad;\n          },\n          inObject: function(needle, object) {\n            var\n              found = false\n            ;\n            $.each(object, function(index, property) {\n              if(property == needle) {\n                found = true;\n                return true;\n              }\n            });\n            return found;\n          },\n          multiple: function() {\n            return $module.hasClass(className.multiple);\n          },\n          remote: function() {\n            return settings.apiSettings && module.can.useAPI();\n          },\n          single: function() {\n            return !module.is.multiple();\n          },\n          selectMutation: function(mutations) {\n            var\n              selectChanged = false\n            ;\n            $.each(mutations, function(index, mutation) {\n              if(mutation.target && $(mutation.target).is('select')) {\n                selectChanged = true;\n                return true;\n              }\n            });\n            return selectChanged;\n          },\n          search: function() {\n            return $module.hasClass(className.search);\n          },\n          searchSelection: function() {\n            return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );\n          },\n          selection: function() {\n            return $module.hasClass(className.selection);\n          },\n          userValue: function(value) {\n            return ($.inArray(value, module.get.userValues()) !== -1);\n          },\n          upward: function($menu) {\n            var $element = $menu || $module;\n            return $element.hasClass(className.upward);\n          },\n          visible: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.hasClass(className.visible)\n              : $menu.hasClass(className.visible)\n            ;\n          },\n          verticallyScrollableContext: function() {\n            var\n              overflowY = ($context.get(0) !== window)\n                ? $context.css('overflow-y')\n                : false\n            ;\n            return (overflowY == 'auto' || overflowY == 'scroll');\n          },\n          horizontallyScrollableContext: function() {\n            var\n              overflowX = ($context.get(0) !== window)\n                ? $context.css('overflow-X')\n                : false\n            ;\n            return (overflowX == 'auto' || overflowX == 'scroll');\n          }\n        },\n\n        can: {\n          activate: function($item) {\n            if(settings.useLabels) {\n              return true;\n            }\n            if(!module.has.maxSelections()) {\n              return true;\n            }\n            if(module.has.maxSelections() && $item.hasClass(className.active)) {\n              return true;\n            }\n            return false;\n          },\n          openDownward: function($subMenu) {\n            var\n              $currentMenu    = $subMenu || $menu,\n              canOpenDownward = true,\n              onScreen        = {},\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset    : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollTop : $context.scrollTop(),\n                height    : $context.outerHeight()\n              },\n              menu : {\n                offset: $currentMenu.offset(),\n                height: $currentMenu.outerHeight()\n              }\n            };\n            if(module.is.verticallyScrollableContext()) {\n              calculations.menu.offset.top += calculations.context.scrollTop;\n            }\n            onScreen = {\n              above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,\n              below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height\n            };\n            if(onScreen.below) {\n              module.verbose('Dropdown can fit in context downward', onScreen);\n              canOpenDownward = true;\n            }\n            else if(!onScreen.below && !onScreen.above) {\n              module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);\n              canOpenDownward = true;\n            }\n            else {\n              module.verbose('Dropdown cannot fit below, opening upward', onScreen);\n              canOpenDownward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenDownward;\n          },\n          openRightward: function($subMenu) {\n            var\n              $currentMenu     = $subMenu || $menu,\n              canOpenRightward = true,\n              isOffscreenRight = false,\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset     : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollLeft : $context.scrollLeft(),\n                width      : $context.outerWidth()\n              },\n              menu: {\n                offset : $currentMenu.offset(),\n                width  : $currentMenu.outerWidth()\n              }\n            };\n            if(module.is.horizontallyScrollableContext()) {\n              calculations.menu.offset.left += calculations.context.scrollLeft;\n            }\n            isOffscreenRight = (calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);\n            if(isOffscreenRight) {\n              module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);\n              canOpenRightward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenRightward;\n          },\n          click: function() {\n            return (hasTouch || settings.on == 'click');\n          },\n          extendSelect: function() {\n            return settings.allowAdditions || settings.apiSettings;\n          },\n          show: function() {\n            return !module.is.disabled() && (module.has.items() || module.has.message());\n          },\n          useAPI: function() {\n            return $.fn.api !== undefined;\n          }\n        },\n\n        animate: {\n          show: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  module.hideSubMenus();\n                  module.hideOthers();\n                  module.set.active();\n                },\n              transition\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            module.verbose('Doing menu show animation', $currentMenu);\n            module.set.direction($subMenu);\n            transition = module.get.transition($subMenu);\n            if( module.is.selection() ) {\n              module.set.scrollPosition(module.get.selectedItem(), true);\n            }\n            if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('show');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' in',\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    duration   : settings.duration,\n                    queue      : true,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.noTransition, transition);\n              }\n            }\n          },\n          hide: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              duration = ($subMenu)\n                ? (settings.duration * 0.9)\n                : settings.duration,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  if( module.can.click() ) {\n                    module.unbind.intent();\n                  }\n                  module.remove.active();\n                },\n              transition = module.get.transition($subMenu)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {\n              module.verbose('Doing menu hide animation', $currentMenu);\n\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('hide');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' out',\n                    duration   : settings.duration,\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    queue      : false,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.transition);\n              }\n            }\n          }\n        },\n\n        hideAndClear: function() {\n          module.remove.searchTerm();\n          if( module.has.maxSelections() ) {\n            return;\n          }\n          if(module.has.search()) {\n            module.hide(function() {\n              module.remove.filteredItem();\n            });\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        delay: {\n          show: function() {\n            module.verbose('Delaying show event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.show, settings.delay.show);\n          },\n          hide: function() {\n            module.verbose('Delaying hide event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.hide, settings.delay.hide);\n          }\n        },\n\n        escape: {\n          value: function(value) {\n            var\n              multipleValues = $.isArray(value),\n              stringValue    = (typeof value === 'string'),\n              isUnparsable   = (!stringValue && !multipleValues),\n              hasQuotes      = (stringValue && value.search(regExp.quote) !== -1),\n              values         = []\n            ;\n            if(isUnparsable || !hasQuotes) {\n              return value;\n            }\n            module.debug('Encoding quote values for use in select', value);\n            if(multipleValues) {\n              $.each(value, function(index, value){\n                values.push(value.replace(regExp.quote, '&quot;'));\n              });\n              return values;\n            }\n            return value.replace(regExp.quote, '&quot;');\n          },\n          string: function(text) {\n            text =  String(text);\n            return text.replace(regExp.escape, '\\\\$&');\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : $allModules\n  ;\n};\n\n$.fn.dropdown.settings = {\n\n  silent                 : false,\n  debug                  : false,\n  verbose                : false,\n  performance            : true,\n\n  on                     : 'click',    // what event should show menu action on item selection\n  action                 : 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})\n\n  values                 : false,      // specify values to use for dropdown\n\n  apiSettings            : false,\n  selectOnKeydown        : true,       // Whether selection should occur automatically when keyboard shortcuts used\n  minCharacters          : 0,          // Minimum characters required to trigger API call\n\n  filterRemoteData       : false,      // Whether API results should be filtered after being returned for query term\n  saveRemoteData         : true,       // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh\n\n  throttle               : 200,        // How long to wait after last user input to search remotely\n\n  context                : window,     // Context to use when determining if on screen\n  direction              : 'auto',     // Whether dropdown should always open in one direction\n  keepOnScreen           : true,       // Whether dropdown should check whether it is on screen before showing\n\n  match                  : 'both',     // what to match against with search selection (both, text, or label)\n  fullTextSearch         : false,      // search anywhere in value (set to 'exact' to require exact matches)\n\n  placeholder            : 'auto',     // whether to convert blank <select> values to placeholder text\n  preserveHTML           : true,       // preserve html when selecting value\n  sortSelect             : false,      // sort selection on init\n\n  forceSelection         : true,       // force a choice on blur with search selection\n\n  allowAdditions         : false,      // whether multiple select should allow user added values\n  ignoreCase             : false,       // whether to consider values not matching in case to be the same\n  hideAdditions          : true,       // whether or not to hide special message prompting a user they can enter a value\n\n  maxSelections          : false,      // When set to a number limits the number of selections to this count\n  useLabels              : true,       // whether multiple select should filter currently active selections from choices\n  delimiter              : ',',        // when multiselect uses normal <input> the values will be delimited with this character\n\n  showOnFocus            : true,       // show menu on focus\n  allowReselection       : false,      // whether current value should trigger callbacks when reselected\n  allowTab               : true,       // add tabindex to element\n  allowCategorySelection : false,      // allow elements with sub-menus to be selected\n\n  fireOnInit             : false,      // Whether callbacks should fire when initializing dropdown values\n\n  transition             : 'auto',     // auto transition will slide down or up based on direction\n  duration               : 200,        // duration of transition\n\n  glyphWidth             : 1.037,      // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width\n\n  // label settings on multi-select\n  label: {\n    transition : 'scale',\n    duration   : 200,\n    variation  : false\n  },\n\n  // delay before event\n  delay : {\n    hide   : 300,\n    show   : 200,\n    search : 20,\n    touch  : 50\n  },\n\n  /* Callbacks */\n  onChange      : function(value, text, $selected){},\n  onAdd         : function(value, text, $selected){},\n  onRemove      : function(value, text, $selected){},\n\n  onLabelSelect : function($selectedLabels){},\n  onLabelCreate : function(value, text) { return $(this); },\n  onLabelRemove : function(value) { return true; },\n  onNoResults   : function(searchTerm) { return true; },\n  onShow        : function(){},\n  onHide        : function(){},\n\n  /* Component */\n  name           : 'Dropdown',\n  namespace      : 'dropdown',\n\n  message: {\n    addResult     : 'Add <b>{term}</b>',\n    count         : '{count} selected',\n    maxSelections : 'Max {maxCount} selections',\n    noResults     : 'No results found.',\n    serverError   : 'There was an error contacting the server'\n  },\n\n  error : {\n    action          : 'You called a dropdown action that was not defined',\n    alreadySetup    : 'Once a select has been initialized behaviors must be called on the created ui dropdown',\n    labels          : 'Allowing user additions currently requires the use of labels.',\n    missingMultiple : '<select> requires multiple property to be set to correctly preserve multiple values',\n    method          : 'The method you called is not defined.',\n    noAPI           : 'The API module is required to load resources remotely',\n    noStorage       : 'Saving remote data requires session storage',\n    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'\n  },\n\n  regExp : {\n    escape   : /[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\n    quote    : /\"/g\n  },\n\n  metadata : {\n    defaultText     : 'defaultText',\n    defaultValue    : 'defaultValue',\n    placeholderText : 'placeholder',\n    text            : 'text',\n    value           : 'value'\n  },\n\n  // property names for remote query\n  fields: {\n    remoteValues : 'results',  // grouping for api results\n    values       : 'values',   // grouping for all dropdown values\n    disabled     : 'disabled', // whether value should be disabled\n    name         : 'name',     // displayed dropdown text\n    value        : 'value',    // actual dropdown value\n    text         : 'text'      // displayed text when selected\n  },\n\n  keys : {\n    backspace  : 8,\n    delimiter  : 188, // comma\n    deleteKey  : 46,\n    enter      : 13,\n    escape     : 27,\n    pageUp     : 33,\n    pageDown   : 34,\n    leftArrow  : 37,\n    upArrow    : 38,\n    rightArrow : 39,\n    downArrow  : 40\n  },\n\n  selector : {\n    addition     : '.addition',\n    dropdown     : '.ui.dropdown',\n    hidden       : '.hidden',\n    icon         : '> .dropdown.icon',\n    input        : '> input[type=\"hidden\"], > select',\n    item         : '.item',\n    label        : '> .label',\n    remove       : '> .label > .delete.icon',\n    siblingLabel : '.label',\n    menu         : '.menu',\n    message      : '.message',\n    menuIcon     : '.dropdown.icon',\n    search       : 'input.search, .menu > .search > input, .menu input.search',\n    sizer        : '> input.sizer',\n    text         : '> .text:not(.icon)',\n    unselectable : '.disabled, .filtered'\n  },\n\n  className : {\n    active      : 'active',\n    addition    : 'addition',\n    animating   : 'animating',\n    disabled    : 'disabled',\n    empty       : 'empty',\n    dropdown    : 'ui dropdown',\n    filtered    : 'filtered',\n    hidden      : 'hidden transition',\n    item        : 'item',\n    label       : 'ui label',\n    loading     : 'loading',\n    menu        : 'menu',\n    message     : 'message',\n    multiple    : 'multiple',\n    placeholder : 'default',\n    sizer       : 'sizer',\n    search      : 'search',\n    selected    : 'selected',\n    selection   : 'selection',\n    upward      : 'upward',\n    leftward    : 'left',\n    visible     : 'visible'\n  }\n\n};\n\n/* Templates */\n$.fn.dropdown.settings.templates = {\n\n  // generates dropdown from select values\n  dropdown: function(select) {\n    var\n      placeholder = select.placeholder || false,\n      values      = select.values || {},\n      html        = ''\n    ;\n    html +=  '<i class=\"dropdown icon\"></i>';\n    if(select.placeholder) {\n      html += '<div class=\"default text\">' + placeholder + '</div>';\n    }\n    else {\n      html += '<div class=\"text\"></div>';\n    }\n    html += '<div class=\"menu\">';\n    $.each(select.values, function(index, option) {\n      html += (option.disabled)\n        ? '<div class=\"disabled item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n        : '<div class=\"item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n      ;\n    });\n    html += '</div>';\n    return html;\n  },\n\n  // generates just menu from select\n  menu: function(response, fields) {\n    var\n      values = response[fields.values] || {},\n      html   = ''\n    ;\n    $.each(values, function(index, option) {\n      var\n        maybeText = (option[fields.text])\n          ? 'data-text=\"' + option[fields.text] + '\"'\n          : '',\n        maybeDisabled = (option[fields.disabled])\n          ? 'disabled '\n          : ''\n      ;\n      html += '<div class=\"'+ maybeDisabled +'item\" data-value=\"' + option[fields.value] + '\"' + maybeText + '>';\n      html +=   option[fields.name];\n      html += '</div>';\n    });\n    return html;\n  },\n\n  // generates label for multiselect\n  label: function(value, text) {\n    return text + '<i class=\"delete icon\"></i>';\n  },\n\n\n  // generates messages like \"No results\"\n  message: function(message) {\n    return message;\n  },\n\n  // generates user addition to selection menu\n  addition: function(choice) {\n    return choice;\n  }\n\n};\n\n})( jQuery, window, document );\n","$(async () => {\n  const graphCanvas = document.getElementById('graph-canvas');\n  if (!graphCanvas) return;\n\n  const [{ default: gitGraph }] = await Promise.all([\n    import(/* webpackChunkName: \"gitgraph\" */'./gitGraph.js'),\n    import(/* webpackChunkName: \"gitgraph\" */'../css/gitGraph.css'),\n  ]);\n\n  const graphList = [];\n  $('#graph-raw-list li span.node-relation').each(function () {\n    graphList.push($(this).text());\n  });\n\n  gitGraph(graphCanvas, graphList);\n});\n","/* globals wipPrefixes, issuesTribute, emojiTribute */\n/* exported timeAddManual, toggleStopwatch, cancelStopwatch, initHeatmap */\n/* exported toggleDeadlineForm, setDeadline, updateDeadline, deleteDependencyModal, cancelCodeComment, onOAuthLoginClick */\n\nimport './publicPath.js';\nimport './gitGraphLoader.js';\nimport './semanticDropdown.js';\n\nfunction htmlEncode(text) {\n  return jQuery('<div />').text(text).html();\n}\n\nlet csrf;\nlet suburl;\nlet previewFileModes;\nlet simpleMDEditor;\nlet codeMirrorEditor;\n\n// Disable Dropzone auto-discover because it's manually initialized\nif (typeof (Dropzone) !== 'undefined') {\n  Dropzone.autoDiscover = false;\n}\n\nfunction initCommentPreviewTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('preview')}\"]`).click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      mode: 'gfm',\n      context: $this.data('context'),\n      text: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n    }, (data) => {\n      const $previewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('preview')}\"]`);\n      $previewPanel.html(data);\n      emojify.run($previewPanel[0]);\n      $('pre code', $previewPanel[0]).each(function () {\n        hljs.highlightBlock(this);\n      });\n    });\n  });\n\n  buttonsClickOnEnter();\n}\n\nfunction initEditPreviewTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  const $previewTab = $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('preview')}\"]`);\n  if ($previewTab.length) {\n    previewFileModes = $previewTab.data('preview-file-modes').split(',');\n    $previewTab.click(function () {\n      const $this = $(this);\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        mode: 'gfm',\n        context: $this.data('context'),\n        text: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n      }, (data) => {\n        const $previewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('preview')}\"]`);\n        $previewPanel.html(data);\n        emojify.run($previewPanel[0]);\n        $('pre code', $previewPanel[0]).each(function () {\n          hljs.highlightBlock(this);\n        });\n      });\n    });\n  }\n}\n\nfunction initEditDiffTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('diff')}\"]`).click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      context: $this.data('context'),\n      content: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n    }, (data) => {\n      const $diffPreviewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('diff')}\"]`);\n      $diffPreviewPanel.html(data);\n      emojify.run($diffPreviewPanel[0]);\n    });\n  });\n}\n\n\nfunction initEditForm() {\n  if ($('.edit.form').length === 0) {\n    return;\n  }\n\n  initEditPreviewTab($('.edit.form'));\n  initEditDiffTab($('.edit.form'));\n}\n\nfunction initBranchSelector() {\n  const $selectBranch = $('.ui.select-branch');\n  const $branchMenu = $selectBranch.find('.reference-list-menu');\n  $branchMenu.find('.item:not(.no-select)').click(function () {\n    const selectedValue = $(this).data('id');\n    $($(this).data('id-selector')).val(selectedValue);\n    $selectBranch.find('.ui .branch-name').text(selectedValue);\n  });\n  $selectBranch.find('.reference.column').click(function () {\n    $selectBranch.find('.scrolling.reference-list-menu').css('display', 'none');\n    $selectBranch.find('.reference .text').removeClass('black');\n    $($(this).data('target')).css('display', 'block');\n    $(this).find('.text').addClass('black');\n    return false;\n  });\n}\n\nfunction updateIssuesMeta(url, action, issueIds, elementId) {\n  return new Promise(((resolve) => {\n    $.ajax({\n      type: 'POST',\n      url,\n      data: {\n        _csrf: csrf,\n        action,\n        issue_ids: issueIds,\n        id: elementId\n      },\n      success: resolve\n    });\n  }));\n}\n\nfunction initRepoStatusChecker() {\n  const migrating = $('#repo_migrating');\n  $('#repo_migrating_failed').hide();\n  if (migrating) {\n    const repo_name = migrating.attr('repo');\n    if (typeof repo_name === 'undefined') {\n      return;\n    }\n    $.ajax({\n      type: 'GET',\n      url: `${suburl}/${repo_name}/status`,\n      data: {\n        _csrf: csrf,\n      },\n      complete(xhr) {\n        if (xhr.status === 200) {\n          if (xhr.responseJSON) {\n            if (xhr.responseJSON.status === 0) {\n              window.location.reload();\n              return;\n            }\n\n            setTimeout(() => {\n              initRepoStatusChecker();\n            }, 2000);\n            return;\n          }\n        }\n        $('#repo_migrating_progress').hide();\n        $('#repo_migrating_failed').show();\n      }\n    });\n  }\n}\n\nfunction initReactionSelector(parent) {\n  let reactions = '';\n  if (!parent) {\n    parent = $(document);\n    reactions = '.reactions > ';\n  }\n\n  parent.find(`${reactions}a.label`).popup({ position: 'bottom left', metadata: { content: 'title', title: 'none' } });\n\n  parent.find(`.select-reaction > .menu > .item, ${reactions}a.label`).on('click', function (e) {\n    const vm = this;\n    e.preventDefault();\n\n    if ($(this).hasClass('disabled')) return;\n\n    const actionURL = $(this).hasClass('item')\n      ? $(this).closest('.select-reaction').data('action-url')\n      : $(this).data('action-url');\n    const url = `${actionURL}/${$(this).hasClass('blue') ? 'unreact' : 'react'}`;\n    $.ajax({\n      type: 'POST',\n      url,\n      data: {\n        _csrf: csrf,\n        content: $(this).data('content')\n      }\n    }).done((resp) => {\n      if (resp && (resp.html || resp.empty)) {\n        const content = $(vm).closest('.content');\n        let react = content.find('.segment.reactions');\n        if (!resp.empty && react.length > 0) {\n          react.remove();\n        }\n        if (!resp.empty) {\n          react = $('<div class=\"ui attached segment reactions\"></div>');\n          const attachments = content.find('.segment.bottom:first');\n          if (attachments.length > 0) {\n            react.insertBefore(attachments);\n          } else {\n            react.appendTo(content);\n          }\n          react.html(resp.html);\n          const hasEmoji = react.find('.has-emoji');\n          for (let i = 0; i < hasEmoji.length; i++) {\n            emojify.run(hasEmoji.get(i));\n          }\n          react.find('.dropdown').dropdown();\n          initReactionSelector(react);\n        }\n      }\n    });\n  });\n}\n\nfunction insertAtCursor(field, value) {\n  if (field.selectionStart || field.selectionStart === 0) {\n    const startPos = field.selectionStart;\n    const endPos = field.selectionEnd;\n    field.value = field.value.substring(0, startPos)\n            + value\n            + field.value.substring(endPos, field.value.length);\n    field.selectionStart = startPos + value.length;\n    field.selectionEnd = startPos + value.length;\n  } else {\n    field.value += value;\n  }\n}\n\nfunction replaceAndKeepCursor(field, oldval, newval) {\n  if (field.selectionStart || field.selectionStart === 0) {\n    const startPos = field.selectionStart;\n    const endPos = field.selectionEnd;\n    field.value = field.value.replace(oldval, newval);\n    field.selectionStart = startPos + newval.length - oldval.length;\n    field.selectionEnd = endPos + newval.length - oldval.length;\n  } else {\n    field.value = field.value.replace(oldval, newval);\n  }\n}\n\nfunction retrieveImageFromClipboardAsBlob(pasteEvent, callback) {\n  if (!pasteEvent.clipboardData) {\n    return;\n  }\n\n  const { items } = pasteEvent.clipboardData;\n  if (typeof items === 'undefined') {\n    return;\n  }\n\n  for (let i = 0; i < items.length; i++) {\n    if (items[i].type.indexOf('image') === -1) continue;\n    const blob = items[i].getAsFile();\n\n    if (typeof (callback) === 'function') {\n      pasteEvent.preventDefault();\n      pasteEvent.stopPropagation();\n      callback(blob);\n    }\n  }\n}\n\nfunction uploadFile(file, callback) {\n  const xhr = new XMLHttpRequest();\n\n  xhr.onload = function () {\n    if (xhr.status === 200) {\n      callback(xhr.responseText);\n    }\n  };\n\n  xhr.open('post', `${suburl}/attachments`, true);\n  xhr.setRequestHeader('X-Csrf-Token', csrf);\n  const formData = new FormData();\n  formData.append('file', file, file.name);\n  xhr.send(formData);\n}\n\nfunction reload() {\n  window.location.reload();\n}\n\nfunction initImagePaste(target) {\n  target.each(function () {\n    const field = this;\n    field.addEventListener('paste', (event) => {\n      retrieveImageFromClipboardAsBlob(event, (img) => {\n        const name = img.name.substr(0, img.name.lastIndexOf('.'));\n        insertAtCursor(field, `![${name}]()`);\n        uploadFile(img, (res) => {\n          const data = JSON.parse(res);\n          replaceAndKeepCursor(field, `![${name}]()`, `![${name}](${suburl}/attachments/${data.uuid})`);\n          const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n          $('.files').append(input);\n        });\n      });\n    }, false);\n  });\n}\n\nfunction initCommentForm() {\n  if ($('.comment.form').length === 0) {\n    return;\n  }\n\n  initBranchSelector();\n  initCommentPreviewTab($('.comment.form'));\n  initImagePaste($('.comment.form textarea'));\n\n  // Listsubmit\n  function initListSubmits(selector, outerSelector) {\n    const $list = $(`.ui.${outerSelector}.list`);\n    const $noSelect = $list.find('.no-select');\n    const $listMenu = $(`.${selector} .menu`);\n    let hasLabelUpdateAction = $listMenu.data('action') === 'update';\n    const labels = {};\n\n    $(`.${selector}`).dropdown('setting', 'onHide', () => {\n      hasLabelUpdateAction = $listMenu.data('action') === 'update'; // Update the var\n      if (hasLabelUpdateAction) {\n        const promises = [];\n        Object.keys(labels).forEach((elementId) => {\n          const label = labels[elementId];\n          const promise = updateIssuesMeta(\n            label['update-url'],\n            label.action,\n            label['issue-id'],\n            elementId\n          );\n          promises.push(promise);\n        });\n        Promise.all(promises).then(reload);\n      }\n    });\n\n    $listMenu.find('.item:not(.no-select)').click(function () {\n      // we don't need the action attribute when updating assignees\n      if (selector === 'select-assignees-modify') {\n        // UI magic. We need to do this here, otherwise it would destroy the functionality of\n        // adding/removing labels\n        if ($(this).hasClass('checked')) {\n          $(this).removeClass('checked');\n          $(this).find('.octicon').removeClass('octicon-check');\n        } else {\n          $(this).addClass('checked');\n          $(this).find('.octicon').addClass('octicon-check');\n        }\n\n        updateIssuesMeta(\n          $listMenu.data('update-url'),\n          '',\n          $listMenu.data('issue-id'),\n          $(this).data('id')\n        );\n        $listMenu.data('action', 'update'); // Update to reload the page when we updated items\n        return false;\n      }\n\n      if ($(this).hasClass('checked')) {\n        $(this).removeClass('checked');\n        $(this).find('.octicon').removeClass('octicon-check');\n        if (hasLabelUpdateAction) {\n          if (!($(this).data('id') in labels)) {\n            labels[$(this).data('id')] = {\n              'update-url': $listMenu.data('update-url'),\n              action: 'detach',\n              'issue-id': $listMenu.data('issue-id'),\n            };\n          } else {\n            delete labels[$(this).data('id')];\n          }\n        }\n      } else {\n        $(this).addClass('checked');\n        $(this).find('.octicon').addClass('octicon-check');\n        if (hasLabelUpdateAction) {\n          if (!($(this).data('id') in labels)) {\n            labels[$(this).data('id')] = {\n              'update-url': $listMenu.data('update-url'),\n              action: 'attach',\n              'issue-id': $listMenu.data('issue-id'),\n            };\n          } else {\n            delete labels[$(this).data('id')];\n          }\n        }\n      }\n\n      const listIds = [];\n      $(this).parent().find('.item').each(function () {\n        if ($(this).hasClass('checked')) {\n          listIds.push($(this).data('id'));\n          $($(this).data('id-selector')).removeClass('hide');\n        } else {\n          $($(this).data('id-selector')).addClass('hide');\n        }\n      });\n      if (listIds.length === 0) {\n        $noSelect.removeClass('hide');\n      } else {\n        $noSelect.addClass('hide');\n      }\n      $($(this).parent().data('id')).val(listIds.join(','));\n      return false;\n    });\n    $listMenu.find('.no-select.item').click(function () {\n      if (hasLabelUpdateAction || selector === 'select-assignees-modify') {\n        updateIssuesMeta(\n          $listMenu.data('update-url'),\n          'clear',\n          $listMenu.data('issue-id'),\n          ''\n        ).then(reload);\n      }\n\n      $(this).parent().find('.item').each(function () {\n        $(this).removeClass('checked');\n        $(this).find('.octicon').removeClass('octicon-check');\n      });\n\n      $list.find('.item').each(function () {\n        $(this).addClass('hide');\n      });\n      $noSelect.removeClass('hide');\n      $($(this).parent().data('id')).val('');\n    });\n  }\n\n  // Init labels and assignees\n  initListSubmits('select-label', 'labels');\n  initListSubmits('select-assignees', 'assignees');\n  initListSubmits('select-assignees-modify', 'assignees');\n\n  function selectItem(select_id, input_id) {\n    const $menu = $(`${select_id} .menu`);\n    const $list = $(`.ui${select_id}.list`);\n    const hasUpdateAction = $menu.data('action') === 'update';\n\n    $menu.find('.item:not(.no-select)').click(function () {\n      $(this).parent().find('.item').each(function () {\n        $(this).removeClass('selected active');\n      });\n\n      $(this).addClass('selected active');\n      if (hasUpdateAction) {\n        updateIssuesMeta(\n          $menu.data('update-url'),\n          '',\n          $menu.data('issue-id'),\n          $(this).data('id')\n        ).then(reload);\n      }\n      switch (input_id) {\n        case '#milestone_id':\n          $list.find('.selected').html(`<a class=\"item\" href=${$(this).data('href')}>${\n            htmlEncode($(this).text())}</a>`);\n          break;\n        case '#assignee_id':\n          $list.find('.selected').html(`<a class=\"item\" href=${$(this).data('href')}>`\n                        + `<img class=\"ui avatar image\" src=${$(this).data('avatar')}>${\n                          htmlEncode($(this).text())}</a>`);\n      }\n      $(`.ui${select_id}.list .no-select`).addClass('hide');\n      $(input_id).val($(this).data('id'));\n    });\n    $menu.find('.no-select.item').click(function () {\n      $(this).parent().find('.item:not(.no-select)').each(function () {\n        $(this).removeClass('selected active');\n      });\n\n      if (hasUpdateAction) {\n        updateIssuesMeta(\n          $menu.data('update-url'),\n          '',\n          $menu.data('issue-id'),\n          $(this).data('id')\n        ).then(reload);\n      }\n\n      $list.find('.selected').html('');\n      $list.find('.no-select').removeClass('hide');\n      $(input_id).val('');\n    });\n  }\n\n  // Milestone and assignee\n  selectItem('.select-milestone', '#milestone_id');\n  selectItem('.select-assignee', '#assignee_id');\n}\n\nfunction initInstall() {\n  if ($('.install').length === 0) {\n    return;\n  }\n\n  if ($('#db_host').val() === '') {\n    $('#db_host').val('127.0.0.1:3306');\n    $('#db_user').val('gitea');\n    $('#db_name').val('gitea');\n  }\n\n  // Database type change detection.\n  $('#db_type').change(function () {\n    const sqliteDefault = 'data/gitea.db';\n    const tidbDefault = 'data/gitea_tidb';\n\n    const dbType = $(this).val();\n    if (dbType === 'SQLite3') {\n      $('#sql_settings').hide();\n      $('#pgsql_settings').hide();\n      $('#mysql_settings').hide();\n      $('#sqlite_settings').show();\n\n      if (dbType === 'SQLite3' && $('#db_path').val() === tidbDefault) {\n        $('#db_path').val(sqliteDefault);\n      }\n      return;\n    }\n\n    const dbDefaults = {\n      MySQL: '127.0.0.1:3306',\n      PostgreSQL: '127.0.0.1:5432',\n      MSSQL: '127.0.0.1:1433'\n    };\n\n    $('#sqlite_settings').hide();\n    $('#sql_settings').show();\n\n    $('#pgsql_settings').toggle(dbType === 'PostgreSQL');\n    $('#mysql_settings').toggle(dbType === 'MySQL');\n    $.each(dbDefaults, (_type, defaultHost) => {\n      if ($('#db_host').val() === defaultHost) {\n        $('#db_host').val(dbDefaults[dbType]);\n        return false;\n      }\n    });\n  });\n\n  // TODO: better handling of exclusive relations.\n  $('#offline-mode input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-gravatar').checkbox('check');\n      $('#federated-avatar-lookup').checkbox('uncheck');\n    }\n  });\n  $('#disable-gravatar input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#federated-avatar-lookup').checkbox('uncheck');\n    } else {\n      $('#offline-mode').checkbox('uncheck');\n    }\n  });\n  $('#federated-avatar-lookup input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-gravatar').checkbox('uncheck');\n      $('#offline-mode').checkbox('uncheck');\n    }\n  });\n  $('#enable-openid-signin input').change(function () {\n    if ($(this).is(':checked')) {\n      if (!$('#disable-registration input').is(':checked')) {\n        $('#enable-openid-signup').checkbox('check');\n      }\n    } else {\n      $('#enable-openid-signup').checkbox('uncheck');\n    }\n  });\n  $('#disable-registration input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#enable-captcha').checkbox('uncheck');\n      $('#enable-openid-signup').checkbox('uncheck');\n    } else {\n      $('#enable-openid-signup').checkbox('check');\n    }\n  });\n  $('#enable-captcha input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-registration').checkbox('uncheck');\n    }\n  });\n}\n\nfunction initRepository() {\n  if ($('.repository').length === 0) {\n    return;\n  }\n\n  function initFilterSearchDropdown(selector) {\n    const $dropdown = $(selector);\n    $dropdown.dropdown({\n      fullTextSearch: true,\n      selectOnKeydown: false,\n      onChange(_text, _value, $choice) {\n        if ($choice.data('url')) {\n          window.location.href = $choice.data('url');\n        }\n      },\n      message: { noResults: $dropdown.data('no-results') }\n    });\n  }\n\n  // File list and commits\n  if ($('.repository.file.list').length > 0 || ('.repository.commits').length > 0) {\n    initFilterBranchTagDropdown('.choose.reference .dropdown');\n  }\n\n  // Wiki\n  if ($('.repository.wiki.view').length > 0) {\n    initFilterSearchDropdown('.choose.page .dropdown');\n  }\n\n  // Options\n  if ($('.repository.settings.options').length > 0) {\n    $('#repo_name').keyup(function () {\n      const $prompt = $('#repo-name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n\n    // Enable or select internal/external wiki system and issue tracker.\n    $('.enable-system').change(function () {\n      if (this.checked) {\n        $($(this).data('target')).removeClass('disabled');\n        if (!$(this).data('context')) $($(this).data('context')).addClass('disabled');\n      } else {\n        $($(this).data('target')).addClass('disabled');\n        if (!$(this).data('context')) $($(this).data('context')).removeClass('disabled');\n      }\n    });\n    $('.enable-system-radio').change(function () {\n      if (this.value === 'false') {\n        $($(this).data('target')).addClass('disabled');\n        if (typeof $(this).data('context') !== 'undefined') $($(this).data('context')).removeClass('disabled');\n      } else if (this.value === 'true') {\n        $($(this).data('target')).removeClass('disabled');\n        if (typeof $(this).data('context') !== 'undefined') $($(this).data('context')).addClass('disabled');\n      }\n    });\n  }\n\n  // Labels\n  if ($('.repository.labels').length > 0) {\n    // Create label\n    const $newLabelPanel = $('.new-label.segment');\n    $('.new-label.button').click(() => {\n      $newLabelPanel.show();\n    });\n    $('.new-label.segment .cancel').click(() => {\n      $newLabelPanel.hide();\n    });\n\n    $('.color-picker').each(function () {\n      $(this).minicolors();\n    });\n    $('.precolors .color').click(function () {\n      const color_hex = $(this).data('color-hex');\n      $('.color-picker').val(color_hex);\n      $('.minicolors-swatch-color').css('background-color', color_hex);\n    });\n    $('.edit-label-button').click(function () {\n      $('#label-modal-id').val($(this).data('id'));\n      $('.edit-label .new-label-input').val($(this).data('title'));\n      $('.edit-label .new-label-desc-input').val($(this).data('description'));\n      $('.edit-label .color-picker').val($(this).data('color'));\n      $('.minicolors-swatch-color').css('background-color', $(this).data('color'));\n      $('.edit-label.modal').modal({\n        onApprove() {\n          $('.edit-label.form').submit();\n        }\n      }).modal('show');\n      return false;\n    });\n  }\n\n  // Milestones\n  if ($('.repository.new.milestone').length > 0) {\n    const $datepicker = $('.milestone.datepicker');\n    $datepicker.datetimepicker({\n      lang: $datepicker.data('lang'),\n      inline: true,\n      timepicker: false,\n      startDate: $datepicker.data('start-date'),\n      formatDate: 'Y-m-d',\n      onSelectDate(ct) {\n        $('#deadline').val(ct.dateFormat('Y-m-d'));\n      }\n    });\n    $('#clear-date').click(() => {\n      $('#deadline').val('');\n      return false;\n    });\n  }\n\n  // Issues\n  if ($('.repository.view.issue').length > 0) {\n    // Edit issue title\n    const $issueTitle = $('#issue-title');\n    const $editInput = $('#edit-title-input input');\n    const editTitleToggle = function () {\n      $issueTitle.toggle();\n      $('.not-in-edit').toggle();\n      $('#edit-title-input').toggle();\n      $('.in-edit').toggle();\n      $editInput.focus();\n      return false;\n    };\n    $('#edit-title').click(editTitleToggle);\n    $('#cancel-edit-title').click(editTitleToggle);\n    $('#save-edit-title').click(editTitleToggle).click(function () {\n      if ($editInput.val().length === 0 || $editInput.val() === $issueTitle.text()) {\n        $editInput.val($issueTitle.text());\n        return false;\n      }\n\n      $.post($(this).data('update-url'), {\n        _csrf: csrf,\n        title: $editInput.val()\n      },\n      (data) => {\n        $editInput.val(data.title);\n        $issueTitle.text(data.title);\n        reload();\n      });\n      return false;\n    });\n\n    // Issue/PR Context Menus\n    $('.context-dropdown').dropdown({\n      action: 'hide'\n    });\n\n    // Quote reply\n    $('.quote-reply').click(function (event) {\n      $(this).closest('.dropdown').find('.menu').toggle('visible');\n      const target = $(this).data('target');\n\n      let $content;\n      if ($(this).hasClass('quote-reply-diff')) {\n        const $parent = $(this).closest('.comment-code-cloud');\n        $parent.find('button.comment-form-reply').click();\n        $content = $parent.find('[name=\"content\"]');\n      } else {\n        $content = $('#content');\n      }\n\n      const quote = $(`#comment-${target}`).text().replace(/\\n/g, '\\n> ');\n      const content = `> ${quote}\\n\\n`;\n\n      if ($content.val() !== '') {\n        $content.val(`${$content.val()}\\n\\n${content}`);\n      } else {\n        $content.val(`${content}`);\n      }\n      $content.focus();\n      event.preventDefault();\n    });\n\n    // Edit issue or comment content\n    $('.edit-content').click(function (event) {\n      $(this).closest('.dropdown').find('.menu').toggle('visible');\n      const $segment = $(this).closest('.header').next();\n      const $editContentZone = $segment.find('.edit-content-zone');\n      const $renderContent = $segment.find('.render-content');\n      const $rawContent = $segment.find('.raw-content');\n      let $textarea;\n\n      // Setup new form\n      if ($editContentZone.html().length === 0) {\n        $editContentZone.html($('#edit-content-form').html());\n        $textarea = $editContentZone.find('textarea');\n        issuesTribute.attach($textarea.get());\n        emojiTribute.attach($textarea.get());\n\n        const $dropzone = $editContentZone.find('.dropzone');\n        $dropzone.data('saved', false);\n        const $files = $editContentZone.find('.comment-files');\n        if ($dropzone.length > 0) {\n          const filenameDict = {};\n          $dropzone.dropzone({\n            url: $dropzone.data('upload-url'),\n            headers: { 'X-Csrf-Token': csrf },\n            maxFiles: $dropzone.data('max-file'),\n            maxFilesize: $dropzone.data('max-size'),\n            acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),\n            addRemoveLinks: true,\n            dictDefaultMessage: $dropzone.data('default-message'),\n            dictInvalidFileType: $dropzone.data('invalid-input-type'),\n            dictFileTooBig: $dropzone.data('file-too-big'),\n            dictRemoveFile: $dropzone.data('remove-file'),\n            init() {\n              this.on('success', (file, data) => {\n                filenameDict[file.name] = {\n                  uuid: data.uuid,\n                  submitted: false\n                };\n                const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n                $files.append(input);\n              });\n              this.on('removedfile', (file) => {\n                if (!(file.name in filenameDict)) {\n                  return;\n                }\n                $(`#${filenameDict[file.name].uuid}`).remove();\n                if ($dropzone.data('remove-url') && $dropzone.data('csrf') && !filenameDict[file.name].submitted) {\n                  $.post($dropzone.data('remove-url'), {\n                    file: filenameDict[file.name].uuid,\n                    _csrf: $dropzone.data('csrf')\n                  });\n                }\n              });\n              this.on('submit', () => {\n                $.each(filenameDict, (name) => {\n                  filenameDict[name].submitted = true;\n                });\n              });\n              this.on('reload', () => {\n                $.getJSON($editContentZone.data('attachment-url'), (data) => {\n                  const drop = $dropzone.get(0).dropzone;\n                  drop.removeAllFiles(true);\n                  $files.empty();\n                  $.each(data, function () {\n                    const imgSrc = `${$dropzone.data('upload-url')}/${this.uuid}`;\n                    drop.emit('addedfile', this);\n                    drop.emit('thumbnail', this, imgSrc);\n                    drop.emit('complete', this);\n                    drop.files.push(this);\n                    filenameDict[this.name] = {\n                      submitted: true,\n                      uuid: this.uuid\n                    };\n                    $dropzone.find(`img[src='${imgSrc}']`).css('max-width', '100%');\n                    const input = $(`<input id=\"${this.uuid}\" name=\"files\" type=\"hidden\">`).val(this.uuid);\n                    $files.append(input);\n                  });\n                });\n              });\n            }\n          });\n          $dropzone.get(0).dropzone.emit('reload');\n        }\n        // Give new write/preview data-tab name to distinguish from others\n        const $editContentForm = $editContentZone.find('.ui.comment.form');\n        const $tabMenu = $editContentForm.find('.tabular.menu');\n        $tabMenu.attr('data-write', $editContentZone.data('write'));\n        $tabMenu.attr('data-preview', $editContentZone.data('preview'));\n        $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write'));\n        $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview'));\n        $editContentForm.find('.write.segment').attr('data-tab', $editContentZone.data('write'));\n        $editContentForm.find('.preview.segment').attr('data-tab', $editContentZone.data('preview'));\n\n        initCommentPreviewTab($editContentForm);\n\n        $editContentZone.find('.cancel.button').click(() => {\n          $renderContent.show();\n          $editContentZone.hide();\n          $dropzone.get(0).dropzone.emit('reload');\n        });\n        $editContentZone.find('.save.button').click(() => {\n          $renderContent.show();\n          $editContentZone.hide();\n          const $attachments = $files.find('[name=files]').map(function () {\n            return $(this).val();\n          }).get();\n          $.post($editContentZone.data('update-url'), {\n            _csrf: csrf,\n            content: $textarea.val(),\n            context: $editContentZone.data('context'),\n            files: $attachments\n          }, (data) => {\n            if (data.length === 0) {\n              $renderContent.html($('#no-content').html());\n            } else {\n              $renderContent.html(data.content);\n              emojify.run($renderContent[0]);\n              $('pre code', $renderContent[0]).each(function () {\n                hljs.highlightBlock(this);\n              });\n            }\n            const $content = $segment.parent();\n            if (!$content.find('.ui.small.images').length) {\n              if (data.attachments !== '') {\n                $content.append(\n                  '<div class=\"ui bottom attached segment\"><div class=\"ui small images\"></div></div>'\n                );\n                $content.find('.ui.small.images').html(data.attachments);\n              }\n            } else if (data.attachments === '') {\n              $content.find('.ui.small.images').parent().remove();\n            } else {\n              $content.find('.ui.small.images').html(data.attachments);\n            }\n            $dropzone.get(0).dropzone.emit('submit');\n            $dropzone.get(0).dropzone.emit('reload');\n          });\n        });\n      } else {\n        $textarea = $segment.find('textarea');\n      }\n\n      // Show write/preview tab and copy raw content as needed\n      $editContentZone.show();\n      $renderContent.hide();\n      if ($textarea.val().length === 0) {\n        $textarea.val($rawContent.text());\n      }\n      $textarea.focus();\n      event.preventDefault();\n    });\n\n    // Delete comment\n    $('.delete-comment').click(function () {\n      const $this = $(this);\n      if (window.confirm($this.data('locale'))) {\n        $.post($this.data('url'), {\n          _csrf: csrf\n        }).success(() => {\n          $(`#${$this.data('comment-id')}`).remove();\n        });\n      }\n      return false;\n    });\n\n    // Change status\n    const $statusButton = $('#status-button');\n    $('#comment-form .edit_area').keyup(function () {\n      if ($(this).val().length === 0) {\n        $statusButton.text($statusButton.data('status'));\n      } else {\n        $statusButton.text($statusButton.data('status-and-comment'));\n      }\n    });\n    $statusButton.click(() => {\n      $('#status').val($statusButton.data('status-val'));\n      $('#comment-form').submit();\n    });\n\n    // Pull Request merge button\n    const $mergeButton = $('.merge-button > button');\n    $mergeButton.on('click', function (e) {\n      e.preventDefault();\n      $(`.${$(this).data('do')}-fields`).show();\n      $(this).parent().hide();\n    });\n    $('.merge-button > .dropdown').dropdown({\n      onChange(_text, _value, $choice) {\n        if ($choice.data('do')) {\n          $mergeButton.find('.button-text').text($choice.text());\n          $mergeButton.data('do', $choice.data('do'));\n        }\n      }\n    });\n    $('.merge-cancel').on('click', function (e) {\n      e.preventDefault();\n      $(this).closest('.form').hide();\n      $mergeButton.parent().show();\n    });\n    initReactionSelector();\n  }\n\n  // Diff\n  if ($('.repository.diff').length > 0) {\n    $('.diff-counter').each(function () {\n      const $item = $(this);\n      const addLine = $item.find('span[data-line].add').data('line');\n      const delLine = $item.find('span[data-line].del').data('line');\n      const addPercent = parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine)) * 100;\n      $item.find('.bar .add').css('width', `${addPercent}%`);\n    });\n  }\n\n  // Quick start and repository home\n  $('#repo-clone-ssh').click(function () {\n    $('.clone-url').text($(this).data('link'));\n    $('#repo-clone-url').val($(this).data('link'));\n    $(this).addClass('blue');\n    $('#repo-clone-https').removeClass('blue');\n    localStorage.setItem('repo-clone-protocol', 'ssh');\n  });\n  $('#repo-clone-https').click(function () {\n    $('.clone-url').text($(this).data('link'));\n    $('#repo-clone-url').val($(this).data('link'));\n    $(this).addClass('blue');\n    $('#repo-clone-ssh').removeClass('blue');\n    localStorage.setItem('repo-clone-protocol', 'https');\n  });\n  $('#repo-clone-url').click(function () {\n    $(this).select();\n  });\n\n  // Pull request\n  const $repoComparePull = $('.repository.compare.pull');\n  if ($repoComparePull.length > 0) {\n    initFilterSearchDropdown('.choose.branch .dropdown');\n    // show pull request form\n    $repoComparePull.find('button.show-form').on('click', function (e) {\n      e.preventDefault();\n      $repoComparePull.find('.pullrequest-form').show();\n      $(this).parent().hide();\n    });\n  }\n\n  // Branches\n  if ($('.repository.settings.branches').length > 0) {\n    initFilterSearchDropdown('.protected-branches .dropdown');\n    $('.enable-protection, .enable-whitelist').change(function () {\n      if (this.checked) {\n        $($(this).data('target')).removeClass('disabled');\n      } else {\n        $($(this).data('target')).addClass('disabled');\n      }\n    });\n  }\n}\n\nfunction initMigration() {\n  const toggleMigrations = function () {\n    const authUserName = $('#auth_username').val();\n    const cloneAddr = $('#clone_addr').val();\n    if (!$('#mirror').is(':checked') && (authUserName && authUserName.length > 0)\n        && (cloneAddr !== undefined && (cloneAddr.startsWith('https://github.com') || cloneAddr.startsWith('http://github.com')))) {\n      $('#migrate_items').show();\n    } else {\n      $('#migrate_items').hide();\n    }\n  };\n\n  toggleMigrations();\n\n  $('#clone_addr').on('input', toggleMigrations);\n  $('#auth_username').on('input', toggleMigrations);\n  $('#mirror').on('change', toggleMigrations);\n}\n\nfunction initPullRequestReview() {\n  $('.show-outdated').on('click', function (e) {\n    e.preventDefault();\n    const id = $(this).data('comment');\n    $(this).addClass('hide');\n    $(`#code-comments-${id}`).removeClass('hide');\n    $(`#code-preview-${id}`).removeClass('hide');\n    $(`#hide-outdated-${id}`).removeClass('hide');\n  });\n\n  $('.hide-outdated').on('click', function (e) {\n    e.preventDefault();\n    const id = $(this).data('comment');\n    $(this).addClass('hide');\n    $(`#code-comments-${id}`).addClass('hide');\n    $(`#code-preview-${id}`).addClass('hide');\n    $(`#show-outdated-${id}`).removeClass('hide');\n  });\n\n  $('button.comment-form-reply').on('click', function (e) {\n    e.preventDefault();\n    $(this).hide();\n    const form = $(this).parent().find('.comment-form');\n    form.removeClass('hide');\n    assingMenuAttributes(form.find('.menu'));\n  });\n  // The following part is only for diff views\n  if ($('.repository.pull.diff').length === 0) {\n    return;\n  }\n\n  $('.diff-detail-box.ui.sticky').sticky();\n\n  $('.btn-review').on('click', function (e) {\n    e.preventDefault();\n    $(this).closest('.dropdown').find('.menu').toggle('visible');\n  }).closest('.dropdown').find('.link.close')\n    .on('click', function (e) {\n      e.preventDefault();\n      $(this).closest('.menu').toggle('visible');\n    });\n\n  $('.code-view .lines-code,.code-view .lines-num')\n    .on('mouseenter', function () {\n      const parent = $(this).closest('td');\n      $(this).closest('tr').addClass(\n        parent.hasClass('lines-num-old') || parent.hasClass('lines-code-old')\n          ? 'focus-lines-old' : 'focus-lines-new'\n      );\n    })\n    .on('mouseleave', function () {\n      $(this).closest('tr').removeClass('focus-lines-new focus-lines-old');\n    });\n  $('.add-code-comment').on('click', function (e) {\n    // https://github.com/go-gitea/gitea/issues/4745\n    if ($(e.target).hasClass('btn-add-single')) {\n      return;\n    }\n    e.preventDefault();\n    const isSplit = $(this).closest('.code-diff').hasClass('code-diff-split');\n    const side = $(this).data('side');\n    const idx = $(this).data('idx');\n    const path = $(this).data('path');\n    const form = $('#pull_review_add_comment').html();\n    const tr = $(this).closest('tr');\n    let ntr = tr.next();\n    if (!ntr.hasClass('add-comment')) {\n      ntr = $(`<tr class=\"add-comment\">${\n        isSplit ? '<td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-left\"></td><td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-right\"></td>'\n          : '<td class=\"lines-num\"></td><td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-left add-comment-right\"></td>'\n      }</tr>`);\n      tr.after(ntr);\n    }\n    const td = ntr.find(`.add-comment-${side}`);\n    let commentCloud = td.find('.comment-code-cloud');\n    if (commentCloud.length === 0) {\n      td.html(form);\n      commentCloud = td.find('.comment-code-cloud');\n      assingMenuAttributes(commentCloud.find('.menu'));\n\n      td.find(\"input[name='line']\").val(idx);\n      td.find(\"input[name='side']\").val(side === 'left' ? 'previous' : 'proposed');\n      td.find(\"input[name='path']\").val(path);\n    }\n    commentCloud.find('textarea').focus();\n  });\n}\n\nfunction assingMenuAttributes(menu) {\n  const id = Math.floor(Math.random() * Math.floor(1000000));\n  menu.attr('data-write', menu.attr('data-write') + id);\n  menu.attr('data-preview', menu.attr('data-preview') + id);\n  menu.find('.item').each(function () {\n    const tab = $(this).attr('data-tab') + id;\n    $(this).attr('data-tab', tab);\n  });\n  menu.parent().find(\"*[data-tab='write']\").attr('data-tab', `write${id}`);\n  menu.parent().find(\"*[data-tab='preview']\").attr('data-tab', `preview${id}`);\n  initCommentPreviewTab(menu.parent('.form'));\n  return id;\n}\n\nfunction initRepositoryCollaboration() {\n  // Change collaborator access mode\n  $('.access-mode.menu .item').click(function () {\n    const $menu = $(this).parent();\n    $.post($menu.data('url'), {\n      _csrf: csrf,\n      uid: $menu.data('uid'),\n      mode: $(this).data('value')\n    });\n  });\n}\n\nfunction initTeamSettings() {\n  // Change team access mode\n  $('.organization.new.team input[name=permission]').change(() => {\n    const val = $('input[name=permission]:checked', '.organization.new.team').val();\n    if (val === 'admin') {\n      $('.organization.new.team .team-units').hide();\n    } else {\n      $('.organization.new.team .team-units').show();\n    }\n  });\n}\n\nfunction initWikiForm() {\n  const $editArea = $('.repository.wiki textarea#edit_area');\n  let sideBySideChanges = 0;\n  let sideBySideTimeout = null;\n  if ($editArea.length > 0) {\n    const simplemde = new SimpleMDE({\n      autoDownloadFontAwesome: false,\n      element: $editArea[0],\n      forceSync: true,\n      previewRender(plainText, preview) { // Async method\n        setTimeout(() => {\n          // FIXME: still send render request when return back to edit mode\n          const render = function () {\n            sideBySideChanges = 0;\n            if (sideBySideTimeout != null) {\n              clearTimeout(sideBySideTimeout);\n              sideBySideTimeout = null;\n            }\n            $.post($editArea.data('url'), {\n              _csrf: csrf,\n              mode: 'gfm',\n              context: $editArea.data('context'),\n              text: plainText\n            },\n            (data) => {\n              preview.innerHTML = `<div class=\"markdown ui segment\">${data}</div>`;\n              emojify.run($('.editor-preview')[0]);\n              $(preview).find('pre code').each((_, e) => {\n                hljs.highlightBlock(e);\n              });\n            });\n          };\n          if (!simplemde.isSideBySideActive()) {\n            render();\n          } else {\n            // delay preview by keystroke counting\n            sideBySideChanges++;\n            if (sideBySideChanges > 10) {\n              render();\n            }\n            // or delay preview by timeout\n            if (sideBySideTimeout != null) {\n              clearTimeout(sideBySideTimeout);\n              sideBySideTimeout = null;\n            }\n            sideBySideTimeout = setTimeout(render, 600);\n          }\n        }, 0);\n        if (!simplemde.isSideBySideActive()) {\n          return 'Loading...';\n        }\n        return preview.innerHTML;\n      },\n      renderingConfig: {\n        singleLineBreaks: false\n      },\n      indentWithTabs: false,\n      tabSize: 4,\n      spellChecker: false,\n      toolbar: ['bold', 'italic', 'strikethrough', '|',\n        'heading-1', 'heading-2', 'heading-3', 'heading-bigger', 'heading-smaller', '|',\n        {\n          name: 'code-inline',\n          action(e) {\n            const cm = e.codemirror;\n            const selection = cm.getSelection();\n            cm.replaceSelection(`\\`${selection}\\``);\n            if (!selection) {\n              const cursorPos = cm.getCursor();\n              cm.setCursor(cursorPos.line, cursorPos.ch - 1);\n            }\n            cm.focus();\n          },\n          className: 'fa fa-angle-right',\n          title: 'Add Inline Code',\n        }, 'code', 'quote', '|', {\n          name: 'checkbox-empty',\n          action(e) {\n            const cm = e.codemirror;\n            cm.replaceSelection(`\\n- [ ] ${cm.getSelection()}`);\n            cm.focus();\n          },\n          className: 'fa fa-square-o',\n          title: 'Add Checkbox (empty)',\n        },\n        {\n          name: 'checkbox-checked',\n          action(e) {\n            const cm = e.codemirror;\n            cm.replaceSelection(`\\n- [x] ${cm.getSelection()}`);\n            cm.focus();\n          },\n          className: 'fa fa-check-square-o',\n          title: 'Add Checkbox (checked)',\n        }, '|',\n        'unordered-list', 'ordered-list', '|',\n        'link', 'image', 'table', 'horizontal-rule', '|',\n        'clean-block', 'preview', 'fullscreen', 'side-by-side']\n    });\n    $(simplemde.codemirror.getInputField()).addClass('js-quick-submit');\n\n    setTimeout(() => {\n      const $bEdit = $('.repository.wiki.new .previewtabs a[data-tab=\"write\"]');\n      const $bPrev = $('.repository.wiki.new .previewtabs a[data-tab=\"preview\"]');\n      const $toolbar = $('.editor-toolbar');\n      const $bPreview = $('.editor-toolbar a.fa-eye');\n      const $bSideBySide = $('.editor-toolbar a.fa-columns');\n      $bEdit.on('click', () => {\n        if ($toolbar.hasClass('disabled-for-preview')) {\n          $bPreview.click();\n        }\n      });\n      $bPrev.on('click', () => {\n        if (!$toolbar.hasClass('disabled-for-preview')) {\n          $bPreview.click();\n        }\n      });\n      $bPreview.on('click', () => {\n        setTimeout(() => {\n          if ($toolbar.hasClass('disabled-for-preview')) {\n            if ($bEdit.hasClass('active')) {\n              $bEdit.removeClass('active');\n            }\n            if (!$bPrev.hasClass('active')) {\n              $bPrev.addClass('active');\n            }\n          } else {\n            if (!$bEdit.hasClass('active')) {\n              $bEdit.addClass('active');\n            }\n            if ($bPrev.hasClass('active')) {\n              $bPrev.removeClass('active');\n            }\n          }\n        }, 0);\n      });\n      $bSideBySide.on('click', () => {\n        sideBySideChanges = 10;\n      });\n    }, 0);\n  }\n}\n\n// Adding function to get the cursor position in a text field to jQuery object.\n$.fn.getCursorPosition = function () {\n  const el = $(this).get(0);\n  let pos = 0;\n  if ('selectionStart' in el) {\n    pos = el.selectionStart;\n  } else if ('selection' in document) {\n    el.focus();\n    const Sel = document.selection.createRange();\n    const SelLength = document.selection.createRange().text.length;\n    Sel.moveStart('character', -el.value.length);\n    pos = Sel.text.length - SelLength;\n  }\n  return pos;\n};\n\nfunction setSimpleMDE($editArea) {\n  if (codeMirrorEditor) {\n    codeMirrorEditor.toTextArea();\n    codeMirrorEditor = null;\n  }\n\n  if (simpleMDEditor) {\n    return true;\n  }\n\n  simpleMDEditor = new SimpleMDE({\n    autoDownloadFontAwesome: false,\n    element: $editArea[0],\n    forceSync: true,\n    renderingConfig: {\n      singleLineBreaks: false\n    },\n    indentWithTabs: false,\n    tabSize: 4,\n    spellChecker: false,\n    previewRender(plainText, preview) { // Async method\n      setTimeout(() => {\n        // FIXME: still send render request when return back to edit mode\n        $.post($editArea.data('url'), {\n          _csrf: csrf,\n          mode: 'gfm',\n          context: $editArea.data('context'),\n          text: plainText\n        },\n        (data) => {\n          preview.innerHTML = `<div class=\"markdown ui segment\">${data}</div>`;\n          emojify.run($('.editor-preview')[0]);\n        });\n      }, 0);\n\n      return 'Loading...';\n    },\n    toolbar: ['bold', 'italic', 'strikethrough', '|',\n      'heading-1', 'heading-2', 'heading-3', 'heading-bigger', 'heading-smaller', '|',\n      'code', 'quote', '|',\n      'unordered-list', 'ordered-list', '|',\n      'link', 'image', 'table', 'horizontal-rule', '|',\n      'clean-block', 'preview', 'fullscreen', 'side-by-side']\n  });\n\n  return true;\n}\n\nfunction setCodeMirror($editArea) {\n  if (simpleMDEditor) {\n    simpleMDEditor.toTextArea();\n    simpleMDEditor = null;\n  }\n\n  if (codeMirrorEditor) {\n    return true;\n  }\n\n  codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], {\n    lineNumbers: true\n  });\n  codeMirrorEditor.on('change', (cm, _change) => {\n    $editArea.val(cm.getValue());\n  });\n\n  return true;\n}\n\nfunction initEditor() {\n  $('.js-quick-pull-choice-option').change(function () {\n    if ($(this).val() === 'commit-to-new-branch') {\n      $('.quick-pull-branch-name').show();\n      $('.quick-pull-branch-name input').prop('required', true);\n    } else {\n      $('.quick-pull-branch-name').hide();\n      $('.quick-pull-branch-name input').prop('required', false);\n    }\n    $('#commit-button').text($(this).attr('button_text'));\n  });\n\n  const $editFilename = $('#file-name');\n  $editFilename.keyup(function (e) {\n    const $section = $('.breadcrumb span.section');\n    const $divider = $('.breadcrumb div.divider');\n    let value;\n    let parts;\n\n    if (e.keyCode === 8) {\n      if ($(this).getCursorPosition() === 0) {\n        if ($section.length > 0) {\n          value = $section.last().find('a').text();\n          $(this).val(value + $(this).val());\n          $(this)[0].setSelectionRange(value.length, value.length);\n          $section.last().remove();\n          $divider.last().remove();\n        }\n      }\n    }\n    if (e.keyCode === 191) {\n      parts = $(this).val().split('/');\n      for (let i = 0; i < parts.length; ++i) {\n        value = parts[i];\n        if (i < parts.length - 1) {\n          if (value.length) {\n            $(`<span class=\"section\"><a href=\"#\">${value}</a></span>`).insertBefore($(this));\n            $('<div class=\"divider\"> / </div>').insertBefore($(this));\n          }\n        } else {\n          $(this).val(value);\n        }\n        $(this)[0].setSelectionRange(0, 0);\n      }\n    }\n    parts = [];\n    $('.breadcrumb span.section').each(function () {\n      const element = $(this);\n      if (element.find('a').length) {\n        parts.push(element.find('a').text());\n      } else {\n        parts.push(element.text());\n      }\n    });\n    if ($(this).val()) parts.push($(this).val());\n    $('#tree_path').val(parts.join('/'));\n  }).trigger('keyup');\n\n  const $editArea = $('.repository.editor textarea#edit_area');\n  if (!$editArea.length) return;\n\n  const markdownFileExts = $editArea.data('markdown-file-exts').split(',');\n  const lineWrapExtensions = $editArea.data('line-wrap-extensions').split(',');\n\n  $editFilename.on('keyup', () => {\n    const val = $editFilename.val();\n    let mode, spec, extension, extWithDot, dataUrl, apiCall;\n\n    extension = extWithDot = '';\n    const m = /.+\\.([^.]+)$/.exec(val);\n    if (m) {\n      extension = m[1];\n      extWithDot = `.${extension}`;\n    }\n\n    const info = CodeMirror.findModeByExtension(extension);\n    const previewLink = $('a[data-tab=preview]');\n    if (info) {\n      mode = info.mode;\n      spec = info.mime;\n      apiCall = mode;\n    } else {\n      apiCall = extension;\n    }\n\n    if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.indexOf(apiCall) >= 0) {\n      dataUrl = previewLink.data('url');\n      previewLink.data('url', dataUrl.replace(/(.*)\\/.*/i, `$1/${mode}`));\n      previewLink.show();\n    } else {\n      previewLink.hide();\n    }\n\n    // If this file is a Markdown extensions, we will load that editor and return\n    if (markdownFileExts.indexOf(extWithDot) >= 0) {\n      if (setSimpleMDE($editArea)) {\n        return;\n      }\n    }\n\n    // Else we are going to use CodeMirror\n    if (!codeMirrorEditor && !setCodeMirror($editArea)) {\n      return;\n    }\n\n    if (mode) {\n      codeMirrorEditor.setOption('mode', spec);\n      CodeMirror.autoLoadMode(codeMirrorEditor, mode);\n    }\n\n    if (lineWrapExtensions.indexOf(extWithDot) >= 0) {\n      codeMirrorEditor.setOption('lineWrapping', true);\n    } else {\n      codeMirrorEditor.setOption('lineWrapping', false);\n    }\n\n    // get the filename without any folder\n    let value = $editFilename.val();\n    if (value.length === 0) {\n      return;\n    }\n    value = value.split('/');\n    value = value[value.length - 1];\n\n    $.getJSON($editFilename.data('ec-url-prefix') + value, (editorconfig) => {\n      if (editorconfig.indent_style === 'tab') {\n        codeMirrorEditor.setOption('indentWithTabs', true);\n        codeMirrorEditor.setOption('extraKeys', {});\n      } else {\n        codeMirrorEditor.setOption('indentWithTabs', false);\n        // required because CodeMirror doesn't seems to use spaces correctly for {\"indentWithTabs\": false}:\n        // - https://github.com/codemirror/CodeMirror/issues/988\n        // - https://codemirror.net/doc/manual.html#keymaps\n        codeMirrorEditor.setOption('extraKeys', {\n          Tab(cm) {\n            const spaces = Array(parseInt(cm.getOption('indentUnit')) + 1).join(' ');\n            cm.replaceSelection(spaces);\n          }\n        });\n      }\n      codeMirrorEditor.setOption('indentUnit', editorconfig.indent_size || 4);\n      codeMirrorEditor.setOption('tabSize', editorconfig.tab_width || 4);\n    });\n  }).trigger('keyup');\n\n  // Using events from https://github.com/codedance/jquery.AreYouSure#advanced-usage\n  // to enable or disable the commit button\n  const $commitButton = $('#commit-button');\n  const $editForm = $('.ui.edit.form');\n  const dirtyFileClass = 'dirty-file';\n\n  // Disabling the button at the start\n  $commitButton.prop('disabled', true);\n\n  // Registering a custom listener for the file path and the file content\n  $editForm.areYouSure({\n    silent: true,\n    dirtyClass: dirtyFileClass,\n    fieldSelector: ':input:not(.commit-form-wrapper :input)',\n    change() {\n      const dirty = $(this).hasClass(dirtyFileClass);\n      $commitButton.prop('disabled', !dirty);\n    }\n  });\n\n  $commitButton.click((event) => {\n    // A modal which asks if an empty file should be committed\n    if ($editArea.val().length === 0) {\n      $('#edit-empty-content-modal').modal({\n        onApprove() {\n          $('.edit.form').submit();\n        }\n      }).modal('show');\n      event.preventDefault();\n    }\n  });\n}\n\nfunction initOrganization() {\n  if ($('.organization').length === 0) {\n    return;\n  }\n\n  // Options\n  if ($('.organization.settings.options').length > 0) {\n    $('#org_name').keyup(function () {\n      const $prompt = $('#org-name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('org-name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n  }\n}\n\nfunction initUserSettings() {\n  // Options\n  if ($('.user.settings.profile').length > 0) {\n    $('#username').keyup(function () {\n      const $prompt = $('#name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n  }\n}\n\nfunction initGithook() {\n  if ($('.edit.githook').length === 0) {\n    return;\n  }\n\n  CodeMirror.autoLoadMode(CodeMirror.fromTextArea($('#content')[0], {\n    lineNumbers: true,\n    mode: 'shell'\n  }), 'shell');\n}\n\nfunction initWebhook() {\n  if ($('.new.webhook').length === 0) {\n    return;\n  }\n\n  $('.events.checkbox input').change(function () {\n    if ($(this).is(':checked')) {\n      $('.events.fields').show();\n    }\n  });\n  $('.non-events.checkbox input').change(function () {\n    if ($(this).is(':checked')) {\n      $('.events.fields').hide();\n    }\n  });\n\n  const updateContentType = function () {\n    const visible = $('#http_method').val() === 'POST';\n    $('#content_type').parent().parent()[visible ? 'show' : 'hide']();\n  };\n  updateContentType();\n  $('#http_method').change(() => {\n    updateContentType();\n  });\n\n  // Test delivery\n  $('#test-delivery').click(function () {\n    const $this = $(this);\n    $this.addClass('loading disabled');\n    $.post($this.data('link'), {\n      _csrf: csrf\n    }).done(\n      setTimeout(() => {\n        window.location.href = $this.data('redirect');\n      }, 5000)\n    );\n  });\n}\n\nfunction initAdmin() {\n  if ($('.admin').length === 0) {\n    return;\n  }\n\n  // New user\n  if ($('.admin.new.user').length > 0 || $('.admin.edit.user').length > 0) {\n    $('#login_type').change(function () {\n      if ($(this).val().substring(0, 1) === '0') {\n        $('#login_name').removeAttr('required');\n        $('.non-local').hide();\n        $('.local').show();\n        $('#user_name').focus();\n\n        if ($(this).data('password') === 'required') {\n          $('#password').attr('required', 'required');\n        }\n      } else {\n        $('#login_name').attr('required', 'required');\n        $('.non-local').show();\n        $('.local').hide();\n        $('#login_name').focus();\n\n        $('#password').removeAttr('required');\n      }\n    });\n  }\n\n  function onSecurityProtocolChange() {\n    if ($('#security_protocol').val() > 0) {\n      $('.has-tls').show();\n    } else {\n      $('.has-tls').hide();\n    }\n  }\n\n  function onUsePagedSearchChange() {\n    if ($('#use_paged_search').prop('checked')) {\n      $('.search-page-size').show()\n        .find('input').attr('required', 'required');\n    } else {\n      $('.search-page-size').hide()\n        .find('input').removeAttr('required');\n    }\n  }\n\n  function onOAuth2Change() {\n    $('.open_id_connect_auto_discovery_url, .oauth2_use_custom_url').hide();\n    $('.open_id_connect_auto_discovery_url input[required]').removeAttr('required');\n\n    const provider = $('#oauth2_provider').val();\n    switch (provider) {\n      case 'github':\n      case 'gitlab':\n      case 'gitea':\n        $('.oauth2_use_custom_url').show();\n        break;\n      case 'openidConnect':\n        $('.open_id_connect_auto_discovery_url input').attr('required', 'required');\n        $('.open_id_connect_auto_discovery_url').show();\n        break;\n    }\n    onOAuth2UseCustomURLChange();\n  }\n\n  function onOAuth2UseCustomURLChange() {\n    const provider = $('#oauth2_provider').val();\n    $('.oauth2_use_custom_url_field').hide();\n    $('.oauth2_use_custom_url_field input[required]').removeAttr('required');\n\n    if ($('#oauth2_use_custom_url').is(':checked')) {\n      if (!$('#oauth2_token_url').val()) {\n        $('#oauth2_token_url').val($(`#${provider}_token_url`).val());\n      }\n      if (!$('#oauth2_auth_url').val()) {\n        $('#oauth2_auth_url').val($(`#${provider}_auth_url`).val());\n      }\n      if (!$('#oauth2_profile_url').val()) {\n        $('#oauth2_profile_url').val($(`#${provider}_profile_url`).val());\n      }\n      if (!$('#oauth2_email_url').val()) {\n        $('#oauth2_email_url').val($(`#${provider}_email_url`).val());\n      }\n      switch (provider) {\n        case 'github':\n          $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input').attr('required', 'required');\n          $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url').show();\n          break;\n        case 'gitea':\n        case 'gitlab':\n          $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input').attr('required', 'required');\n          $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url').show();\n          $('#oauth2_email_url').val('');\n          break;\n      }\n    }\n  }\n\n  // New authentication\n  if ($('.admin.new.authentication').length > 0) {\n    $('#auth_type').change(function () {\n      $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size').hide();\n\n      $('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]').removeAttr('required');\n      $('.binddnrequired').removeClass('required');\n\n      const authType = $(this).val();\n      switch (authType) {\n        case '2': // LDAP\n          $('.ldap').show();\n          $('.binddnrequired input, .ldap div.required:not(.dldap) input').attr('required', 'required');\n          $('.binddnrequired').addClass('required');\n          break;\n        case '3': // SMTP\n          $('.smtp').show();\n          $('.has-tls').show();\n          $('.smtp div.required input, .has-tls').attr('required', 'required');\n          break;\n        case '4': // PAM\n          $('.pam').show();\n          $('.pam input').attr('required', 'required');\n          break;\n        case '5': // LDAP\n          $('.dldap').show();\n          $('.dldap div.required:not(.ldap) input').attr('required', 'required');\n          break;\n        case '6': // OAuth2\n          $('.oauth2').show();\n          $('.oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input').attr('required', 'required');\n          onOAuth2Change();\n          break;\n      }\n      if (authType === '2' || authType === '5') {\n        onSecurityProtocolChange();\n      }\n      if (authType === '2') {\n        onUsePagedSearchChange();\n      }\n    });\n    $('#auth_type').change();\n    $('#security_protocol').change(onSecurityProtocolChange);\n    $('#use_paged_search').change(onUsePagedSearchChange);\n    $('#oauth2_provider').change(onOAuth2Change);\n    $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange);\n  }\n  // Edit authentication\n  if ($('.admin.edit.authentication').length > 0) {\n    const authType = $('#auth_type').val();\n    if (authType === '2' || authType === '5') {\n      $('#security_protocol').change(onSecurityProtocolChange);\n      if (authType === '2') {\n        $('#use_paged_search').change(onUsePagedSearchChange);\n      }\n    } else if (authType === '6') {\n      $('#oauth2_provider').change(onOAuth2Change);\n      $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange);\n      onOAuth2Change();\n    }\n  }\n\n  // Notice\n  if ($('.admin.notice')) {\n    const $detailModal = $('#detail-modal');\n\n    // Attach view detail modals\n    $('.view-detail').click(function () {\n      $detailModal.find('.content p').text($(this).data('content'));\n      $detailModal.modal('show');\n      return false;\n    });\n\n    // Select actions\n    const $checkboxes = $('.select.table .ui.checkbox');\n    $('.select.action').click(function () {\n      switch ($(this).data('action')) {\n        case 'select-all':\n          $checkboxes.checkbox('check');\n          break;\n        case 'deselect-all':\n          $checkboxes.checkbox('uncheck');\n          break;\n        case 'inverse':\n          $checkboxes.checkbox('toggle');\n          break;\n      }\n    });\n    $('#delete-selection').click(function () {\n      const $this = $(this);\n      $this.addClass('loading disabled');\n      const ids = [];\n      $checkboxes.each(function () {\n        if ($(this).checkbox('is checked')) {\n          ids.push($(this).data('id'));\n        }\n      });\n      $.post($this.data('link'), {\n        _csrf: csrf,\n        ids\n      }).done(() => {\n        window.location.href = $this.data('redirect');\n      });\n    });\n  }\n}\n\nfunction buttonsClickOnEnter() {\n  $('.ui.button').keypress(function (e) {\n    if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar\n      $(this).click();\n    }\n  });\n}\n\nfunction searchUsers() {\n  const $searchUserBox = $('#search-user-box');\n  $searchUserBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/users/search?q={query}`,\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          let title = item.login;\n          if (item.full_name && item.full_name.length > 0) {\n            title += ` (${htmlEncode(item.full_name)})`;\n          }\n          items.push({\n            title,\n            image: item.avatar_url\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['login', 'full_name'],\n    showNoResults: false\n  });\n}\n\nfunction searchTeams() {\n  const $searchTeamBox = $('#search-team-box');\n  $searchTeamBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,\n      headers: { 'X-Csrf-Token': csrf },\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          const title = `${item.name} (${item.permission} access)`;\n          items.push({\n            title,\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['name', 'description'],\n    showNoResults: false\n  });\n}\n\nfunction searchRepositories() {\n  const $searchRepoBox = $('#search-repo-box');\n  $searchRepoBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          items.push({\n            title: item.full_name.split('/')[1],\n            description: item.full_name\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['full_name'],\n    showNoResults: false\n  });\n}\n\nfunction initCodeView() {\n  if ($('.code-view .linenums').length > 0) {\n    $(document).on('click', '.lines-num span', function (e) {\n      const $select = $(this);\n      const $list = $select.parent().siblings('.lines-code').find('ol.linenums > li');\n      selectRange($list, $list.filter(`[rel=${$select.attr('id')}]`), (e.shiftKey ? $list.filter('.active').eq(0) : null));\n      deSelect();\n    });\n\n    $(window).on('hashchange', () => {\n      let m = window.location.hash.match(/^#(L\\d+)-(L\\d+)$/);\n      const $list = $('.code-view ol.linenums > li');\n      let $first;\n      if (m) {\n        $first = $list.filter(`.${m[1]}`);\n        selectRange($list, $first, $list.filter(`.${m[2]}`));\n        $('html, body').scrollTop($first.offset().top - 200);\n        return;\n      }\n      m = window.location.hash.match(/^#(L|n)(\\d+)$/);\n      if (m) {\n        $first = $list.filter(`.L${m[2]}`);\n        selectRange($list, $first);\n        $('html, body').scrollTop($first.offset().top - 200);\n      }\n    }).trigger('hashchange');\n  }\n  $('.ui.fold-code').on('click', (e) => {\n    const $foldButton = $(e.target);\n    if ($foldButton.hasClass('fa-chevron-down')) {\n      $(e.target).parent().next().slideUp('fast', () => {\n        $foldButton.removeClass('fa-chevron-down').addClass('fa-chevron-right');\n      });\n    } else {\n      $(e.target).parent().next().slideDown('fast', () => {\n        $foldButton.removeClass('fa-chevron-right').addClass('fa-chevron-down');\n      });\n    }\n  });\n  function insertBlobExcerpt(e) {\n    const $blob = $(e.target);\n    const $row = $blob.parent().parent();\n    $.get(`${$blob.data('url')}?${$blob.data('query')}&anchor=${$blob.data('anchor')}`, (blob) => {\n      $row.replaceWith(blob);\n      $(`[data-anchor=\"${$blob.data('anchor')}\"]`).on('click', (e) => { insertBlobExcerpt(e); });\n    });\n  }\n  $('.ui.blob-excerpt').on('click', (e) => { insertBlobExcerpt(e); });\n}\n\nfunction initU2FAuth() {\n  if ($('#wait-for-key').length === 0) {\n    return;\n  }\n  u2fApi.ensureSupport()\n    .then(() => {\n      $.getJSON(`${suburl}/user/u2f/challenge`).success((req) => {\n        u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30)\n          .then(u2fSigned)\n          .catch((err) => {\n            if (err === undefined) {\n              u2fError(1);\n              return;\n            }\n            u2fError(err.metaData.code);\n          });\n      });\n    }).catch(() => {\n      // Fallback in case browser do not support U2F\n      window.location.href = `${suburl}/user/two_factor`;\n    });\n}\nfunction u2fSigned(resp) {\n  $.ajax({\n    url: `${suburl}/user/u2f/sign`,\n    type: 'POST',\n    headers: { 'X-Csrf-Token': csrf },\n    data: JSON.stringify(resp),\n    contentType: 'application/json; charset=utf-8',\n  }).done((res) => {\n    window.location.replace(res);\n  }).fail(() => {\n    u2fError(1);\n  });\n}\n\nfunction u2fRegistered(resp) {\n  if (checkError(resp)) {\n    return;\n  }\n  $.ajax({\n    url: `${suburl}/user/settings/security/u2f/register`,\n    type: 'POST',\n    headers: { 'X-Csrf-Token': csrf },\n    data: JSON.stringify(resp),\n    contentType: 'application/json; charset=utf-8',\n    success() {\n      reload();\n    },\n    fail() {\n      u2fError(1);\n    }\n  });\n}\n\nfunction checkError(resp) {\n  if (!('errorCode' in resp)) {\n    return false;\n  }\n  if (resp.errorCode === 0) {\n    return false;\n  }\n  u2fError(resp.errorCode);\n  return true;\n}\n\n\nfunction u2fError(errorType) {\n  const u2fErrors = {\n    browser: $('#unsupported-browser'),\n    1: $('#u2f-error-1'),\n    2: $('#u2f-error-2'),\n    3: $('#u2f-error-3'),\n    4: $('#u2f-error-4'),\n    5: $('.u2f-error-5')\n  };\n  u2fErrors[errorType].removeClass('hide');\n\n  Object.keys(u2fErrors).forEach((type) => {\n    if (type !== errorType) {\n      u2fErrors[type].addClass('hide');\n    }\n  });\n  $('#u2f-error').modal('show');\n}\n\nfunction initU2FRegister() {\n  $('#register-device').modal({ allowMultiple: false });\n  $('#u2f-error').modal({ allowMultiple: false });\n  $('#register-security-key').on('click', (e) => {\n    e.preventDefault();\n    u2fApi.ensureSupport()\n      .then(u2fRegisterRequest)\n      .catch(() => {\n        u2fError('browser');\n      });\n  });\n}\n\nfunction u2fRegisterRequest() {\n  $.post(`${suburl}/user/settings/security/u2f/request_register`, {\n    _csrf: csrf,\n    name: $('#nickname').val()\n  }).success((req) => {\n    $('#nickname').closest('div.field').removeClass('error');\n    $('#register-device').modal('show');\n    if (req.registeredKeys === null) {\n      req.registeredKeys = [];\n    }\n    u2fApi.register(req.appId, req.registerRequests, req.registeredKeys, 30)\n      .then(u2fRegistered)\n      .catch((reason) => {\n        if (reason === undefined) {\n          u2fError(1);\n          return;\n        }\n        u2fError(reason.metaData.code);\n      });\n  }).fail((xhr) => {\n    if (xhr.status === 409) {\n      $('#nickname').closest('div.field').addClass('error');\n    }\n  });\n}\n\nfunction initWipTitle() {\n  $('.title_wip_desc > a').click((e) => {\n    e.preventDefault();\n\n    const $issueTitle = $('#issue_title');\n    $issueTitle.focus();\n    const value = $issueTitle.val().trim().toUpperCase();\n\n    for (const i in wipPrefixes) {\n      if (value.startsWith(wipPrefixes[i].toUpperCase())) {\n        return;\n      }\n    }\n\n    $issueTitle.val(`${wipPrefixes[0]} ${$issueTitle.val()}`);\n  });\n}\n\nfunction initTemplateSearch() {\n  const $repoTemplate = $('#repo_template');\n  const checkTemplate = function () {\n    const $templateUnits = $('#template_units');\n    const $nonTemplate = $('#non_template');\n    if ($repoTemplate.val() !== '') {\n      $templateUnits.show();\n      $nonTemplate.hide();\n    } else {\n      $templateUnits.hide();\n      $nonTemplate.show();\n    }\n  };\n  $repoTemplate.change(checkTemplate);\n  checkTemplate();\n\n  const changeOwner = function () {\n    $('#repo_template_search')\n      .dropdown({\n        apiSettings: {\n          url: `${suburl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,\n          onResponse(response) {\n            const filteredResponse = { success: true, results: [] };\n            filteredResponse.results.push({\n              name: '',\n              value: ''\n            });\n            // Parse the response from the api to work with our dropdown\n            $.each(response.data, (_r, repo) => {\n              filteredResponse.results.push({\n                name: htmlEncode(repo.full_name),\n                value: repo.id\n              });\n            });\n            return filteredResponse;\n          },\n          cache: false,\n        },\n\n        fullTextSearch: true\n      });\n  };\n  $('#uid').change(changeOwner);\n  changeOwner();\n}\n\n$(document).ready(() => {\n  csrf = $('meta[name=_csrf]').attr('content');\n  suburl = $('meta[name=_suburl]').attr('content');\n\n  // Show exact time\n  $('.time-since').each(function () {\n    $(this)\n      .addClass('poping up')\n      .attr('data-content', $(this).attr('title'))\n      .attr('data-variation', 'inverted tiny')\n      .attr('title', '');\n  });\n\n  // Semantic UI modules.\n  $('.dropdown:not(.custom)').dropdown();\n  $('.jump.dropdown').dropdown({\n    action: 'hide',\n    onShow() {\n      $('.poping.up').popup('hide');\n    }\n  });\n  $('.slide.up.dropdown').dropdown({\n    transition: 'slide up'\n  });\n  $('.upward.dropdown').dropdown({\n    direction: 'upward'\n  });\n  $('.ui.accordion').accordion();\n  $('.ui.checkbox').checkbox();\n  $('.ui.progress').progress({\n    showActivity: false\n  });\n  $('.poping.up').popup();\n  $('.top.menu .poping.up').popup({\n    onShow() {\n      if ($('.top.menu .menu.transition').hasClass('visible')) {\n        return false;\n      }\n    }\n  });\n  $('.tabular.menu .item').tab();\n  $('.tabable.menu .item').tab();\n\n  $('.toggle.button').click(function () {\n    $($(this).data('target')).slideToggle(100);\n  });\n\n  // make table <tr> element clickable like a link\n  $('tr[data-href]').click(function () {\n    window.location = $(this).data('href');\n  });\n\n  // Highlight JS\n  if (typeof hljs !== 'undefined') {\n    const nodes = [].slice.call(document.querySelectorAll('pre code') || []);\n    for (let i = 0; i < nodes.length; i++) {\n      hljs.highlightBlock(nodes[i]);\n    }\n  }\n\n  // Dropzone\n  const $dropzone = $('#dropzone');\n  if ($dropzone.length > 0) {\n    const filenameDict = {};\n\n    new Dropzone('#dropzone', {\n      url: $dropzone.data('upload-url'),\n      headers: { 'X-Csrf-Token': csrf },\n      maxFiles: $dropzone.data('max-file'),\n      maxFilesize: $dropzone.data('max-size'),\n      acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),\n      addRemoveLinks: true,\n      dictDefaultMessage: $dropzone.data('default-message'),\n      dictInvalidFileType: $dropzone.data('invalid-input-type'),\n      dictFileTooBig: $dropzone.data('file-too-big'),\n      dictRemoveFile: $dropzone.data('remove-file'),\n      init() {\n        this.on('success', (file, data) => {\n          filenameDict[file.name] = data.uuid;\n          const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n          $('.files').append(input);\n        });\n        this.on('removedfile', (file) => {\n          if (file.name in filenameDict) {\n            $(`#${filenameDict[file.name]}`).remove();\n          }\n          if ($dropzone.data('remove-url') && $dropzone.data('csrf')) {\n            $.post($dropzone.data('remove-url'), {\n              file: filenameDict[file.name],\n              _csrf: $dropzone.data('csrf')\n            });\n          }\n        });\n      },\n    });\n  }\n\n  // Emojify\n  emojify.setConfig({\n    img_dir: `${suburl}/vendor/plugins/emojify/images`,\n    ignore_emoticons: true\n  });\n  const hasEmoji = document.getElementsByClassName('has-emoji');\n  for (let i = 0; i < hasEmoji.length; i++) {\n    emojify.run(hasEmoji[i]);\n    for (let j = 0; j < hasEmoji[i].childNodes.length; j++) {\n      if (hasEmoji[i].childNodes[j].nodeName === 'A') {\n        emojify.run(hasEmoji[i].childNodes[j]);\n      }\n    }\n  }\n\n  // Clipboard JS\n  const clipboard = new Clipboard('.clipboard');\n  clipboard.on('success', (e) => {\n    e.clearSelection();\n\n    $(`#${e.trigger.getAttribute('id')}`).popup('destroy');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-success'));\n    $(`#${e.trigger.getAttribute('id')}`).popup('show');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'));\n  });\n\n  clipboard.on('error', (e) => {\n    $(`#${e.trigger.getAttribute('id')}`).popup('destroy');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-error'));\n    $(`#${e.trigger.getAttribute('id')}`).popup('show');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'));\n  });\n\n  // Helpers.\n  $('.delete-button').click(showDeletePopup);\n  $('.add-all-button').click(showAddAllPopup);\n\n  $('.delete-branch-button').click(showDeletePopup);\n\n  $('.undo-button').click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      id: $this.data('id')\n    }).done((data) => {\n      window.location.href = data.redirect;\n    });\n  });\n  $('.show-panel.button').click(function () {\n    $($(this).data('panel')).show();\n  });\n  $('.show-modal.button').click(function () {\n    $($(this).data('modal')).modal('show');\n  });\n  $('.delete-post.button').click(function () {\n    const $this = $(this);\n    $.post($this.data('request-url'), {\n      _csrf: csrf\n    }).done(() => {\n      window.location.href = $this.data('done-url');\n    });\n  });\n\n  // Set anchor.\n  $('.markdown').each(function () {\n    const headers = {};\n    $(this).find('h1, h2, h3, h4, h5, h6').each(function () {\n      let node = $(this);\n      const val = encodeURIComponent(node.text().toLowerCase().replace(/[^\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w\\- ]/g, '').replace(/[ ]/g, '-'));\n      let name = val;\n      if (headers[val] > 0) {\n        name = `${val}-${headers[val]}`;\n      }\n      if (headers[val] === undefined) {\n        headers[val] = 1;\n      } else {\n        headers[val] += 1;\n      }\n      node = node.wrap(`<div id=\"${name}\" class=\"anchor-wrap\" ></div>`);\n      node.append(`<a class=\"anchor\" href=\"#${name}\"><span class=\"octicon octicon-link\"></span></a>`);\n    });\n  });\n\n  $('.issue-checkbox').click(() => {\n    const numChecked = $('.issue-checkbox').children('input:checked').length;\n    if (numChecked > 0) {\n      $('#issue-filters').addClass('hide');\n      $('#issue-actions').removeClass('hide');\n    } else {\n      $('#issue-filters').removeClass('hide');\n      $('#issue-actions').addClass('hide');\n    }\n  });\n\n  $('.issue-action').click(function () {\n    let { action } = this.dataset;\n    let { elementId } = this.dataset;\n    const issueIDs = $('.issue-checkbox').children('input:checked').map(function () {\n      return this.dataset.issueId;\n    }).get().join();\n    const { url } = this.dataset;\n    if (elementId === '0' && url.substr(-9) === '/assignee') {\n      elementId = '';\n      action = 'clear';\n    }\n    updateIssuesMeta(url, action, issueIDs, elementId).then(() => {\n      // NOTICE: This reset of checkbox state targets Firefox caching behaviour, as the checkboxes stay checked after reload\n      if (action === 'close' || action === 'open') {\n        // uncheck all checkboxes\n        $('.issue-checkbox input[type=\"checkbox\"]').each((_, e) => { e.checked = false; });\n      }\n      reload();\n    });\n  });\n\n  // NOTICE: This event trigger targets Firefox caching behaviour, as the checkboxes stay checked after reload\n  // trigger ckecked event, if checkboxes are checked on load\n  $('.issue-checkbox input[type=\"checkbox\"]:checked').first().each((_, e) => {\n    e.checked = false;\n    $(e).click();\n  });\n\n  buttonsClickOnEnter();\n  searchUsers();\n  searchTeams();\n  searchRepositories();\n\n  initCommentForm();\n  initInstall();\n  initRepository();\n  initMigration();\n  initWikiForm();\n  initEditForm();\n  initEditor();\n  initOrganization();\n  initGithook();\n  initWebhook();\n  initAdmin();\n  initCodeView();\n  initVueApp();\n  initTeamSettings();\n  initCtrlEnterSubmit();\n  initNavbarContentToggle();\n  initTopicbar();\n  initU2FAuth();\n  initU2FRegister();\n  initIssueList();\n  initWipTitle();\n  initPullRequestReview();\n  initRepoStatusChecker();\n  initTemplateSearch();\n\n  // Repo clone url.\n  if ($('#repo-clone-url').length > 0) {\n    switch (localStorage.getItem('repo-clone-protocol')) {\n      case 'ssh':\n        if ($('#repo-clone-ssh').click().length === 0) {\n          $('#repo-clone-https').click();\n        }\n        break;\n      default:\n        $('#repo-clone-https').click();\n        break;\n    }\n  }\n\n  const routes = {\n    'div.user.settings': initUserSettings,\n    'div.repository.settings.collaboration': initRepositoryCollaboration\n  };\n\n  let selector;\n  for (selector in routes) {\n    if ($(selector).length > 0) {\n      routes[selector]();\n      break;\n    }\n  }\n\n  const $cloneAddr = $('#clone_addr');\n  $cloneAddr.change(() => {\n    const $repoName = $('#repo_name');\n    if ($cloneAddr.val().length > 0 && $repoName.val().length === 0) { // Only modify if repo_name input is blank\n      $repoName.val($cloneAddr.val().match(/^(.*\\/)?((.+?)(\\.git)?)$/)[3]);\n    }\n  });\n});\n\nfunction changeHash(hash) {\n  if (window.history.pushState) {\n    window.history.pushState(null, null, hash);\n  } else {\n    window.location.hash = hash;\n  }\n}\n\nfunction deSelect() {\n  if (window.getSelection) {\n    window.getSelection().removeAllRanges();\n  } else {\n    document.selection.empty();\n  }\n}\n\nfunction selectRange($list, $select, $from) {\n  $list.removeClass('active');\n  if ($from) {\n    let a = parseInt($select.attr('rel').substr(1));\n    let b = parseInt($from.attr('rel').substr(1));\n    let c;\n    if (a !== b) {\n      if (a > b) {\n        c = a;\n        a = b;\n        b = c;\n      }\n      const classes = [];\n      for (let i = a; i <= b; i++) {\n        classes.push(`.L${i}`);\n      }\n      $list.filter(classes.join(',')).addClass('active');\n      changeHash(`#L${a}-L${b}`);\n      return;\n    }\n  }\n  $select.addClass('active');\n  changeHash(`#${$select.attr('rel')}`);\n}\n\n$(() => {\n  // Warn users that try to leave a page after entering data into a form.\n  // Except on sign-in pages, and for forms marked as 'ignore-dirty'.\n  if ($('.user.signin').length === 0) {\n    $('form:not(.ignore-dirty)').areYouSure();\n  }\n\n  // Parse SSH Key\n  $('#ssh-key-content').on('change paste keyup', function () {\n    const arrays = $(this).val().split(' ');\n    const $title = $('#ssh-key-title');\n    if ($title.val() === '' && arrays.length === 3 && arrays[2] !== '') {\n      $title.val(arrays[2]);\n    }\n  });\n});\n\nfunction showDeletePopup() {\n  const $this = $(this);\n  let filter = '';\n  if ($this.attr('id')) {\n    filter += `#${$this.attr('id')}`;\n  }\n\n  const dialog = $(`.delete.modal${filter}`);\n  dialog.find('.name').text($this.data('name'));\n\n  dialog.modal({\n    closable: false,\n    onApprove() {\n      if ($this.data('type') === 'form') {\n        $($this.data('form')).submit();\n        return;\n      }\n\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        id: $this.data('id')\n      }).done((data) => {\n        window.location.href = data.redirect;\n      });\n    }\n  }).modal('show');\n  return false;\n}\n\nfunction showAddAllPopup() {\n  const $this = $(this);\n  let filter = '';\n  if ($this.attr('id')) {\n    filter += `#${$this.attr('id')}`;\n  }\n\n  const dialog = $(`.addall.modal${filter}`);\n  dialog.find('.name').text($this.data('name'));\n\n  dialog.modal({\n    closable: false,\n    onApprove() {\n      if ($this.data('type') === 'form') {\n        $($this.data('form')).submit();\n        return;\n      }\n\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        id: $this.data('id')\n      }).done((data) => {\n        window.location.href = data.redirect;\n      });\n    }\n  }).modal('show');\n  return false;\n}\n\nfunction initVueComponents() {\n  const vueDelimeters = ['${', '}'];\n\n  Vue.component('repo-search', {\n    delimiters: vueDelimeters,\n\n    props: {\n      searchLimit: {\n        type: Number,\n        default: 10\n      },\n      suburl: {\n        type: String,\n        required: true\n      },\n      uid: {\n        type: Number,\n        required: true\n      },\n      organizations: {\n        type: Array,\n        default: []\n      },\n      isOrganization: {\n        type: Boolean,\n        default: true\n      },\n      canCreateOrganization: {\n        type: Boolean,\n        default: false\n      },\n      organizationsTotalCount: {\n        type: Number,\n        default: 0\n      },\n      moreReposLink: {\n        type: String,\n        default: ''\n      }\n    },\n\n    data() {\n      return {\n        tab: 'repos',\n        repos: [],\n        reposTotalCount: 0,\n        reposFilter: 'all',\n        searchQuery: '',\n        isLoading: false,\n        repoTypes: {\n          all: {\n            count: 0,\n            searchMode: '',\n          },\n          forks: {\n            count: 0,\n            searchMode: 'fork',\n          },\n          mirrors: {\n            count: 0,\n            searchMode: 'mirror',\n          },\n          sources: {\n            count: 0,\n            searchMode: 'source',\n          },\n          collaborative: {\n            count: 0,\n            searchMode: 'collaborative',\n          },\n        }\n      };\n    },\n\n    computed: {\n      showMoreReposLink() {\n        return this.repos.length > 0 && this.repos.length < this.repoTypes[this.reposFilter].count;\n      },\n      searchURL() {\n        return `${this.suburl}/api/v1/repos/search?sort=updated&order=desc&uid=${this.uid}&q=${this.searchQuery\n        }&limit=${this.searchLimit}&mode=${this.repoTypes[this.reposFilter].searchMode\n        }${this.reposFilter !== 'all' ? '&exclusive=1' : ''}`;\n      },\n      repoTypeCount() {\n        return this.repoTypes[this.reposFilter].count;\n      }\n    },\n\n    mounted() {\n      this.searchRepos(this.reposFilter);\n\n      const self = this;\n      Vue.nextTick(() => {\n        self.$refs.search.focus();\n      });\n    },\n\n    methods: {\n      changeTab(t) {\n        this.tab = t;\n      },\n\n      changeReposFilter(filter) {\n        this.reposFilter = filter;\n        this.repos = [];\n        this.repoTypes[filter].count = 0;\n        this.searchRepos(filter);\n      },\n\n      showRepo(repo, filter) {\n        switch (filter) {\n          case 'sources':\n            return repo.owner.id === this.uid && !repo.mirror && !repo.fork;\n          case 'forks':\n            return repo.owner.id === this.uid && !repo.mirror && repo.fork;\n          case 'mirrors':\n            return repo.mirror;\n          case 'collaborative':\n            return repo.owner.id !== this.uid && !repo.mirror;\n          default:\n            return true;\n        }\n      },\n\n      searchRepos(reposFilter) {\n        const self = this;\n\n        this.isLoading = true;\n\n        const searchedMode = this.repoTypes[reposFilter].searchMode;\n        const searchedURL = this.searchURL;\n        const searchedQuery = this.searchQuery;\n\n        $.getJSON(searchedURL, (result, _textStatus, request) => {\n          if (searchedURL === self.searchURL) {\n            self.repos = result.data;\n            const count = request.getResponseHeader('X-Total-Count');\n            if (searchedQuery === '' && searchedMode === '') {\n              self.reposTotalCount = count;\n            }\n            self.repoTypes[reposFilter].count = count;\n          }\n        }).always(() => {\n          if (searchedURL === self.searchURL) {\n            self.isLoading = false;\n          }\n        });\n      },\n\n      repoClass(repo) {\n        if (repo.fork) {\n          return 'octicon octicon-repo-forked';\n        } if (repo.mirror) {\n          return 'octicon octicon-repo-clone';\n        } if (repo.private) {\n          return 'octicon octicon-lock';\n        }\n        return 'octicon octicon-repo';\n      }\n    }\n  });\n}\n\nfunction initCtrlEnterSubmit() {\n  $('.js-quick-submit').keydown(function (e) {\n    if (((e.ctrlKey && !e.altKey) || e.metaKey) && (e.keyCode === 13 || e.keyCode === 10)) {\n      $(this).closest('form').submit();\n    }\n  });\n}\n\nfunction initVueApp() {\n  const el = document.getElementById('app');\n  if (!el) {\n    return;\n  }\n\n  initVueComponents();\n\n  new Vue({\n    delimiters: ['${', '}'],\n    el,\n    data: {\n      searchLimit: document.querySelector('meta[name=_search_limit]').content,\n      suburl: document.querySelector('meta[name=_suburl]').content,\n      uid: document.querySelector('meta[name=_context_uid]').content,\n    },\n  });\n}\n\nwindow.timeAddManual = function () {\n  $('.mini.modal')\n    .modal({\n      duration: 200,\n      onApprove() {\n        $('#add_time_manual_form').submit();\n      }\n    }).modal('show');\n};\n\nwindow.toggleStopwatch = function () {\n  $('#toggle_stopwatch_form').submit();\n};\nwindow.cancelStopwatch = function () {\n  $('#cancel_stopwatch_form').submit();\n};\n\nwindow.initHeatmap = function (appElementId, heatmapUser, locale) {\n  const el = document.getElementById(appElementId);\n  if (!el) {\n    return;\n  }\n\n  locale = locale || {};\n\n  locale.contributions = locale.contributions || 'contributions';\n  locale.no_contributions = locale.no_contributions || 'No contributions';\n\n  const vueDelimeters = ['${', '}'];\n\n  Vue.component('activity-heatmap', {\n    delimiters: vueDelimeters,\n\n    props: {\n      user: {\n        type: String,\n        required: true\n      },\n      suburl: {\n        type: String,\n        required: true\n      },\n      locale: {\n        type: Object,\n        required: true\n      }\n    },\n\n    data() {\n      return {\n        isLoading: true,\n        colorRange: [],\n        endDate: null,\n        values: [],\n        totalContributions: 0,\n      };\n    },\n\n    mounted() {\n      this.colorRange = [\n        this.getColor(0),\n        this.getColor(1),\n        this.getColor(2),\n        this.getColor(3),\n        this.getColor(4),\n        this.getColor(5)\n      ];\n      this.endDate = new Date();\n      this.loadHeatmap(this.user);\n    },\n\n    methods: {\n      loadHeatmap(userName) {\n        const self = this;\n        $.get(`${this.suburl}/api/v1/users/${userName}/heatmap`, (chartRawData) => {\n          const chartData = [];\n          for (let i = 0; i < chartRawData.length; i++) {\n            self.totalContributions += chartRawData[i].contributions;\n            chartData[i] = { date: new Date(chartRawData[i].timestamp * 1000), count: chartRawData[i].contributions };\n          }\n          self.values = chartData;\n          self.isLoading = false;\n        });\n      },\n\n      getColor(idx) {\n        const el = document.createElement('div');\n        el.className = `heatmap-color-${idx}`;\n        document.body.appendChild(el);\n\n        const color = getComputedStyle(el).backgroundColor;\n\n        document.body.removeChild(el);\n\n        return color;\n      }\n    },\n\n    template: '<div><div v-show=\"isLoading\"><slot name=\"loading\"></slot></div><h4 class=\"total-contributions\" v-if=\"!isLoading\"><span v-html=\"totalContributions\"></span> total contributions in the last 12 months</h4><calendar-heatmap v-show=\"!isLoading\" :locale=\"locale\" :no-data-text=\"locale.no_contributions\" :tooltip-unit=\"locale.contributions\" :end-date=\"endDate\" :values=\"values\" :range-color=\"colorRange\" />'\n  });\n\n  new Vue({\n    delimiters: vueDelimeters,\n    el,\n\n    data: {\n      suburl: document.querySelector('meta[name=_suburl]').content,\n      heatmapUser,\n      locale\n    },\n  });\n};\n\nfunction initFilterBranchTagDropdown(selector) {\n  $(selector).each(function () {\n    const $dropdown = $(this);\n    const $data = $dropdown.find('.data');\n    const data = {\n      items: [],\n      mode: $data.data('mode'),\n      searchTerm: '',\n      noResults: '',\n      canCreateBranch: false,\n      menuVisible: false,\n      active: 0\n    };\n    $data.find('.item').each(function () {\n      data.items.push({\n        name: $(this).text(),\n        url: $(this).data('url'),\n        branch: $(this).hasClass('branch'),\n        tag: $(this).hasClass('tag'),\n        selected: $(this).hasClass('selected')\n      });\n    });\n    $data.remove();\n    new Vue({\n      delimiters: ['${', '}'],\n      el: this,\n      data,\n\n      beforeMount() {\n        const vm = this;\n\n        this.noResults = vm.$el.getAttribute('data-no-results');\n        this.canCreateBranch = vm.$el.getAttribute('data-can-create-branch') === 'true';\n\n        document.body.addEventListener('click', (event) => {\n          if (vm.$el.contains(event.target)) {\n            return;\n          }\n          if (vm.menuVisible) {\n            Vue.set(vm, 'menuVisible', false);\n          }\n        });\n      },\n\n      watch: {\n        menuVisible(visible) {\n          if (visible) {\n            this.focusSearchField();\n          }\n        }\n      },\n\n      computed: {\n        filteredItems() {\n          const vm = this;\n\n          const items = vm.items.filter((item) => {\n            return ((vm.mode === 'branches' && item.branch) || (vm.mode === 'tags' && item.tag))\n              && (!vm.searchTerm || item.name.toLowerCase().indexOf(vm.searchTerm.toLowerCase()) >= 0);\n          });\n\n          vm.active = (items.length === 0 && vm.showCreateNewBranch ? 0 : -1);\n\n          return items;\n        },\n        showNoResults() {\n          return this.filteredItems.length === 0 && !this.showCreateNewBranch;\n        },\n        showCreateNewBranch() {\n          const vm = this;\n          if (!this.canCreateBranch || !vm.searchTerm || vm.mode === 'tags') {\n            return false;\n          }\n\n          return vm.items.filter((item) => item.name.toLowerCase() === vm.searchTerm.toLowerCase()).length === 0;\n        }\n      },\n\n      methods: {\n        selectItem(item) {\n          const prev = this.getSelected();\n          if (prev !== null) {\n            prev.selected = false;\n          }\n          item.selected = true;\n          window.location.href = item.url;\n        },\n        createNewBranch() {\n          if (!this.showCreateNewBranch) {\n            return;\n          }\n          this.$refs.newBranchForm.submit();\n        },\n        focusSearchField() {\n          const vm = this;\n          Vue.nextTick(() => {\n            vm.$refs.searchField.focus();\n          });\n        },\n        getSelected() {\n          for (let i = 0, j = this.items.length; i < j; ++i) {\n            if (this.items[i].selected) return this.items[i];\n          }\n          return null;\n        },\n        getSelectedIndexInFiltered() {\n          for (let i = 0, j = this.filteredItems.length; i < j; ++i) {\n            if (this.filteredItems[i].selected) return i;\n          }\n          return -1;\n        },\n        scrollToActive() {\n          let el = this.$refs[`listItem${this.active}`];\n          if (!el || el.length === 0) {\n            return;\n          }\n          if (Array.isArray(el)) {\n            el = el[0];\n          }\n\n          const cont = this.$refs.scrollContainer;\n\n          if (el.offsetTop < cont.scrollTop) {\n            cont.scrollTop = el.offsetTop;\n          } else if (el.offsetTop + el.clientHeight > cont.scrollTop + cont.clientHeight) {\n            cont.scrollTop = el.offsetTop + el.clientHeight - cont.clientHeight;\n          }\n        },\n        keydown(event) {\n          const vm = this;\n          if (event.keyCode === 40) {\n            // arrow down\n            event.preventDefault();\n\n            if (vm.active === -1) {\n              vm.active = vm.getSelectedIndexInFiltered();\n            }\n\n            if (vm.active + (vm.showCreateNewBranch ? 0 : 1) >= vm.filteredItems.length) {\n              return;\n            }\n            vm.active++;\n            vm.scrollToActive();\n          }\n          if (event.keyCode === 38) {\n            // arrow up\n            event.preventDefault();\n\n            if (vm.active === -1) {\n              vm.active = vm.getSelectedIndexInFiltered();\n            }\n\n            if (vm.active <= 0) {\n              return;\n            }\n            vm.active--;\n            vm.scrollToActive();\n          }\n          if (event.keyCode === 13) {\n            // enter\n            event.preventDefault();\n\n            if (vm.active >= vm.filteredItems.length) {\n              vm.createNewBranch();\n            } else if (vm.active >= 0) {\n              vm.selectItem(vm.filteredItems[vm.active]);\n            }\n          }\n          if (event.keyCode === 27) {\n            // escape\n            event.preventDefault();\n            vm.menuVisible = false;\n          }\n        }\n      }\n    });\n  });\n}\n\n$('.commit-button').click(function (e) {\n  e.preventDefault();\n  $(this).parent().find('.commit-body').toggle();\n});\n\nfunction initNavbarContentToggle() {\n  const content = $('#navbar');\n  const toggle = $('#navbar-expand-toggle');\n  let isExpanded = false;\n  toggle.click(() => {\n    isExpanded = !isExpanded;\n    if (isExpanded) {\n      content.addClass('shown');\n      toggle.addClass('active');\n    } else {\n      content.removeClass('shown');\n      toggle.removeClass('active');\n    }\n  });\n}\n\nfunction initTopicbar() {\n  const mgrBtn = $('#manage_topic');\n  const editDiv = $('#topic_edit');\n  const viewDiv = $('#repo-topics');\n  const saveBtn = $('#save_topic');\n  const topicDropdown = $('#topic_edit .dropdown');\n  const topicForm = $('#topic_edit.ui.form');\n  const topicPrompts = getPrompts();\n\n  mgrBtn.click(() => {\n    viewDiv.hide();\n    editDiv.css('display', ''); // show Semantic UI Grid\n  });\n\n  function getPrompts() {\n    const hidePrompt = $('div.hide#validate_prompt');\n    const prompts = {\n      countPrompt: hidePrompt.children('#count_prompt').text(),\n      formatPrompt: hidePrompt.children('#format_prompt').text()\n    };\n    hidePrompt.remove();\n    return prompts;\n  }\n\n  saveBtn.click(() => {\n    const topics = $('input[name=topics]').val();\n\n    $.post(saveBtn.data('link'), {\n      _csrf: csrf,\n      topics\n    }, (_data, _textStatus, xhr) => {\n      if (xhr.responseJSON.status === 'ok') {\n        viewDiv.children('.topic').remove();\n        if (topics.length) {\n          const topicArray = topics.split(',');\n\n          const last = viewDiv.children('a').last();\n          for (let i = 0; i < topicArray.length; i++) {\n            $(`<div class=\"ui small label topic\" style=\"cursor:pointer;\">${topicArray[i]}</div>`).insertBefore(last);\n          }\n        }\n        editDiv.css('display', 'none');\n        viewDiv.show();\n      }\n    }).fail((xhr) => {\n      if (xhr.status === 422) {\n        if (xhr.responseJSON.invalidTopics.length > 0) {\n          topicPrompts.formatPrompt = xhr.responseJSON.message;\n\n          const { invalidTopics } = xhr.responseJSON;\n          const topicLables = topicDropdown.children('a.ui.label');\n\n          topics.split(',').forEach((value, index) => {\n            for (let i = 0; i < invalidTopics.length; i++) {\n              if (invalidTopics[i] === value) {\n                topicLables.eq(index).removeClass('green').addClass('red');\n              }\n            }\n          });\n        } else {\n          topicPrompts.countPrompt = xhr.responseJSON.message;\n        }\n      }\n    }).always(() => {\n      topicForm.form('validate form');\n    });\n  });\n\n  topicDropdown.dropdown({\n    allowAdditions: true,\n    forceSelection: false,\n    fields: { name: 'description', value: 'data-value' },\n    saveRemoteData: false,\n    label: {\n      transition: 'horizontal flip',\n      duration: 200,\n      variation: false,\n      blue: true,\n      basic: true,\n    },\n    className: {\n      label: 'ui small label'\n    },\n    apiSettings: {\n      url: `${suburl}/api/v1/topics/search?q={query}`,\n      throttle: 500,\n      cache: false,\n      onResponse(res) {\n        const formattedResponse = {\n          success: false,\n          results: [],\n        };\n        const stripTags = function (text) {\n          return text.replace(/<[^>]*>?/gm, '');\n        };\n\n        const query = stripTags(this.urlData.query.trim());\n        let found_query = false;\n        const current_topics = [];\n        topicDropdown.find('div.label.visible.topic,a.label.visible').each((_, e) => { current_topics.push(e.dataset.value); });\n\n        if (res.topics) {\n          let found = false;\n          for (let i = 0; i < res.topics.length; i++) {\n            // skip currently added tags\n            if (current_topics.indexOf(res.topics[i].topic_name) !== -1) {\n              continue;\n            }\n\n            if (res.topics[i].topic_name.toLowerCase() === query.toLowerCase()) {\n              found_query = true;\n            }\n            formattedResponse.results.push({ description: res.topics[i].topic_name, 'data-value': res.topics[i].topic_name });\n            found = true;\n          }\n          formattedResponse.success = found;\n        }\n\n        if (query.length > 0 && !found_query) {\n          formattedResponse.success = true;\n          formattedResponse.results.unshift({ description: query, 'data-value': query });\n        } else if (query.length > 0 && found_query) {\n          formattedResponse.results.sort((a, b) => {\n            if (a.description.toLowerCase() === query.toLowerCase()) return -1;\n            if (b.description.toLowerCase() === query.toLowerCase()) return 1;\n            if (a.description > b.description) return -1;\n            if (a.description < b.description) return 1;\n            return 0;\n          });\n        }\n\n\n        return formattedResponse;\n      },\n    },\n    onLabelCreate(value) {\n      value = value.toLowerCase().trim();\n      this.attr('data-value', value).contents().first().replaceWith(value);\n      return $(this);\n    },\n    onAdd(addedValue, _addedText, $addedChoice) {\n      addedValue = addedValue.toLowerCase().trim();\n      $($addedChoice).attr('data-value', addedValue);\n      $($addedChoice).attr('data-text', addedValue);\n    }\n  });\n\n  $.fn.form.settings.rules.validateTopic = function (_values, regExp) {\n    const topics = topicDropdown.children('a.ui.label');\n    const status = topics.length === 0 || topics.last().attr('data-value').match(regExp);\n    if (!status) {\n      topics.last().removeClass('green').addClass('red');\n    }\n    return status && topicDropdown.children('a.ui.label.red').length === 0;\n  };\n\n  topicForm.form({\n    on: 'change',\n    inline: true,\n    fields: {\n      topics: {\n        identifier: 'topics',\n        rules: [\n          {\n            type: 'validateTopic',\n            value: /^[a-z0-9][a-z0-9-]{1,35}$/,\n            prompt: topicPrompts.formatPrompt\n          },\n          {\n            type: 'maxCount[25]',\n            prompt: topicPrompts.countPrompt\n          }\n        ]\n      },\n    }\n  });\n}\n\nwindow.toggleDeadlineForm = function () {\n  $('#deadlineForm').fadeToggle(150);\n};\n\nwindow.setDeadline = function () {\n  const deadline = $('#deadlineDate').val();\n  window.updateDeadline(deadline);\n};\n\nwindow.updateDeadline = function (deadlineString) {\n  $('#deadline-err-invalid-date').hide();\n  $('#deadline-loader').addClass('loading');\n\n  let realDeadline = null;\n  if (deadlineString !== '') {\n    const newDate = Date.parse(deadlineString);\n\n    if (Number.isNaN(newDate)) {\n      $('#deadline-loader').removeClass('loading');\n      $('#deadline-err-invalid-date').show();\n      return false;\n    }\n    realDeadline = new Date(newDate);\n  }\n\n  $.ajax(`${$('#update-issue-deadline-form').attr('action')}/deadline`, {\n    data: JSON.stringify({\n      due_date: realDeadline,\n    }),\n    headers: {\n      'X-Csrf-Token': csrf,\n      'X-Remote': true,\n    },\n    contentType: 'application/json',\n    type: 'POST',\n    success() {\n      reload();\n    },\n    error() {\n      $('#deadline-loader').removeClass('loading');\n      $('#deadline-err-invalid-date').show();\n    }\n  });\n};\n\nwindow.deleteDependencyModal = function (id, type) {\n  $('.remove-dependency')\n    .modal({\n      closable: false,\n      duration: 200,\n      onApprove() {\n        $('#removeDependencyID').val(id);\n        $('#dependencyType').val(type);\n        $('#removeDependencyForm').submit();\n      }\n    }).modal('show');\n};\n\nfunction initIssueList() {\n  const repolink = $('#repolink').val();\n  const repoId = $('#repoId').val();\n  const crossRepoSearch = $('#crossRepoSearch').val();\n  let issueSearchUrl = `${suburl}/api/v1/repos/${repolink}/issues?q={query}`;\n  if (crossRepoSearch === 'true') {\n    issueSearchUrl = `${suburl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}`;\n  }\n  $('#new-dependency-drop-list')\n    .dropdown({\n      apiSettings: {\n        url: issueSearchUrl,\n        onResponse(response) {\n          const filteredResponse = { success: true, results: [] };\n          const currIssueId = $('#new-dependency-drop-list').data('issue-id');\n          // Parse the response from the api to work with our dropdown\n          $.each(response, (_i, issue) => {\n            // Don't list current issue in the dependency list.\n            if (issue.id === currIssueId) {\n              return;\n            }\n            filteredResponse.results.push({\n              name: `#${issue.number} ${htmlEncode(issue.title)\n              }<div class=\"text small dont-break-out\">${htmlEncode(issue.repository.full_name)}</div>`,\n              value: issue.id\n            });\n          });\n          return filteredResponse;\n        },\n        cache: false,\n      },\n\n      fullTextSearch: true\n    });\n\n  $('.menu a.label-filter-item').each(function () {\n    $(this).click(function (e) {\n      if (e.altKey) {\n        e.preventDefault();\n\n        const href = $(this).attr('href');\n        const id = $(this).data('label-id');\n\n        const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;\n        const newStr = 'labels=$1-$2$3&';\n\n        window.location = href.replace(new RegExp(regStr), newStr);\n      }\n    });\n  });\n\n  $('.menu .ui.dropdown.label-filter').keydown((e) => {\n    if (e.altKey && e.keyCode === 13) {\n      const selectedItems = $('.menu .ui.dropdown.label-filter .menu .item.selected');\n\n      if (selectedItems.length > 0) {\n        const item = $(selectedItems[0]);\n\n        const href = item.attr('href');\n        const id = item.data('label-id');\n\n        const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;\n        const newStr = 'labels=$1-$2$3&';\n\n        window.location = href.replace(new RegExp(regStr), newStr);\n      }\n    }\n  });\n}\nwindow.cancelCodeComment = function (btn) {\n  const form = $(btn).closest('form');\n  if (form.length > 0 && form.hasClass('comment-form')) {\n    form.addClass('hide');\n    form.parent().find('button.comment-form-reply').show();\n  } else {\n    form.closest('.comment-code-cloud').remove();\n  }\n};\nwindow.onOAuthLoginClick = function () {\n  const oauthLoader = $('#oauth2-login-loader');\n  const oauthNav = $('#oauth2-login-navigator');\n\n  oauthNav.hide();\n  oauthLoader.removeClass('disabled');\n\n  setTimeout(() => {\n    // recover previous content to let user try again\n    // usually redirection will be performed before this action\n    oauthLoader.addClass('disabled');\n    oauthNav.show();\n  }, 5000);\n};\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:///./web_src/js/publicPath.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack:///./web_src/js/semanticDropdown.js","webpack:///./web_src/js/gitGraphLoader.js","webpack:///./web_src/js/index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","1","__webpack_require__","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","s","arrayWithHoles","iterableToArrayLimit","nonIterableRest","arr","currentScript","url","URL","__webpack_public_path__","pathname","replace","querySelector","getAttribute","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","done","GenStateSuspendedYield","makeInvokeMethod","fn","obj","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","then","unwrapped","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","constructor","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","toString","keys","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","Array","isArray","_arr","_n","_d","_e","_s","_i","$","Math","dropdown","parameters","returnedValue","$allModules","$document","moduleSelector","selector","hasTouch","documentElement","time","Date","getTime","performance","query","arguments","methodInvoked","queryArguments","lastAriaID","each","elementIndex","initialLoad","pageLostFocus","willRefocus","elementNamespace","id","selectObserver","menuObserver","settings","isPlainObject","extend","className","fields","metadata","namespace","regExp","templates","eventNamespace","moduleNamespace","$module","$context","$text","find","text","$search","search","$sizer","sizer","$input","input","$icon","icon","$combo","$menu","children","menu","$item","item","activated","itemActivated","internalChange","element","instance","initialize","debug","is","alreadySetup","setup","reference","layout","change","refreshData","save","defaults","restore","selected","events","observeChanges","instantiate","aria","verbose","destroy","remove","tabbable","off","removeData","disconnect","MutationObserver","select","mutation","observe","has","childList","subtree","random","substr","userChoice","$userChoices","$userChoice","html","userValues","index","addition","add","variables","addResult","attr","addClass","hideAdditions","hidden","userLabels","label","appendTo","insertAfter","minCharacters","filter","hide","firstUnfiltered","selectedItem","not","unselectable","eq","nextAvailable","$selected","$nextAvailable","nextAll","$prevAvailable","prevAll","guessRole","nextID","prefix","getElementById","setExpanded","expanded","refreshDescendant","$currentlySelected","$activeItem","active","$selectedItem","removeDescendant","removeAttr","isIcon","hasClass","hasSearch","hasInput","isMultiple","multiple","api","apiSettings","urlData","on","returnedObject","prop","insertBefore","searchSelection","allowTab","set","selectValues","parent","closest","selection","missingMultiple","disabled","detach","prependTo","refresh","$firstModules","$lastModules","refreshSelectors","refreshItems","clearData","defaultText","defaultValue","placeholderText","toggle","show","callback","isFunction","can","remote","queryRemote","maxSelections","allResultsFiltered","allFiltered","onShow","animate","click","intent","menuSearch","focusSearch","visible","animatingOutward","onHide","hideOthers","hideMenu","transition","hideSubMenus","$subMenus","touchEvents","keyboardEvents","inputEvents","mouseEvents","single","test","mouseenter","keydown","inputEvent","mousedown","mouseup","focus","blur","delay","mouseleave","touch","unbind","searchTerm","afterFiltered","filterActive","activeItem","onNoResults","allowAdditions","empty","noResults","userSuggestion","focusedOnSearch","useLabels","useAPI","filterRemoteData","filterItems","noAPI","errorDuration","cache","throttle","onError","serverError","onFailure","onSuccess","response","remoteValues","results","escapedTerm","escape","string","beginsWithRegExp","RegExp","$choice","match","String","choiceText","fullTextSearch","exactSearch","fuzzySearch","choiceValue","filteredItem","filtered","term","termLength","queryLength","toLowerCase","characterIndex","nextCharacterIndex","queryCharacter","charCodeAt","indexOf","skipHandler","forceSelection","clear","showOnFocus","activeElement","activeLabel","timer","$label","$labels","$activeLabels","$nextActive","$prevActive","$range","nextUntil","prevUntil","shiftKey","removeClass","ctrlKey","toggleClass","onLabelSelect","apply","activeLabels","toggleBehavior","bubbledLabelClick","bubbledIconClick","determine","eventOnElement","preventDefault","stopPropagation","eventInModule","mutations","isSelectMutation","addedNodes","$addedNode","$removedNode","removedNodes","$changedNodes","isUserAddition","isMessage","$target","$subMenu","$otherMenus","siblings","hasSubMenu","itemTimer","skipRefocus","isBubbledEvent","allowCategorySelection","userAddition","scrollPosition","selectAction","pressedKey","which","inObject","$activeLabel","labelIndex","labelCount","hasActiveLabel","hasMultipleActive","isFirstLabel","isLastLabel","isSearch","isFocusedOnSearch","isFocused","focused","caretAtStart","caretPosition","leftArrow","siblingLabel","end","last","rightArrow","first","deleteKey","backspace","$nextItem","$visibleItems","addBack","$parentMenu","inVisibleMenu","animating","hasSelectedItem","selectedIsSelectable","delimiterPressed","delimiter","enter","upArrow","selectOnKeydown","downArrow","pageUp","scrollPage","pageDown","selectedLetter","fromCharCode","trigger","createEvent","inputElement","initEvent","dispatchEvent","action","inDocument","inModule","inVisibleDOM","body","contains","notOnLabel","notInMenu","nothing","activate","hideAndClear","combo","placeholder","trim","val","searchWidth","ceil","width","selectionCount","upward","grep","uniqueArray","array","inArray","range","rangeLength","selectionStart","createRange","moveStart","isEmptyMultiselect","selectInput","split","read","remoteData","preserveHTML","clone","menuIcon","oninput","onpropertychange","$option","sortSelect","sort","a","b","itemWithAdditions","$items","$userItems","strict","shouldSearch","optionText","optionValue","check","labels","saveRemoteData","Storage","sessionStorage","getItem","noStorage","setItem","clearValue","direction","$nextSelectedItem","$currentItem","menuHeight","outerHeight","currentScroll","scrollTop","itemHeight","itemsPerPage","floor","newScroll","$selectableItem","isSearchMultiple","searchValue","hasSearchValue","valueIsSet","glyphWidth","css","loading","partialSearch","forceScroll","hasActive","offset","menuScroll","abovePage","belowPage","position","top","height","searchText","letter","alreadySelectedLetter","firstLetter","$nextValue","openDownward","leftward","openRightward","$currentMenu","escapedValue","currentValue","stringValue","allowReselection","extendSelect","fireOnInit","onChange","exactly","selectedText","selectedValue","isFiltered","isActive","isUserValue","shouldAnimate","count","$next","ignoreCase","onLabelCreate","variation","duration","$message","$addition","$existingItem","alreadyHasValue","hasUserSuggestion","hasCount","hasMaxCount","hasTerm","addedValue","addedText","newValue","concat","join","onAdd","removedValue","removedText","$removedItem","arrayValue","onRemove","$removedLabel","userValue","onLabelRemove","items","$normalResults","valueIgnoringCase","valueMatchingCase","hasValue","existingValue","animatingInward","needle","found","selectMutation","selectChanged","verticallyScrollableContext","overflowY","horizontallyScrollableContext","overflowX","onScreen","calculations","canOpenDownward","left","above","below","isOffscreenRight","canOpenRightward","scrollLeft","outerWidth","start","animation","queue","onStart","onComplete","noTransition","multipleValues","isUnparsable","hasQuotes","quote","setting","internal","silent","log","currentTime","executionTime","display","title","totalTime","group","table","groupCollapsed","groupEnd","passedArguments","maxDepth","depth","camelCaseValue","toUpperCase","keepOnScreen","$selectedLabels","option","maybeText","maybeDisabled","choice","jQuery","graphCanvas","gitGraph","default","graphList","csrf","suburl","previewFileModes","simpleMDEditor","codeMirrorEditor","htmlEncode","initCommentPreviewTab","$form","$tabMenu","tab","$this","post","_csrf","$previewPanel","emojify","run","hljs","highlightBlock","buttonsClickOnEnter","initEditForm","$previewTab","initEditPreviewTab","content","$diffPreviewPanel","updateIssuesMeta","issueIds","elementId","ajax","issue_ids","success","reload","location","initImagePaste","field","addEventListener","pasteEvent","clipboardData","blob","getAsFile","retrieveImageFromClipboardAsBlob","img","lastIndexOf","startPos","endPos","selectionEnd","substring","insertAtCursor","file","xhr","XMLHttpRequest","status","responseText","open","setRequestHeader","formData","FormData","append","send","uploadFile","res","JSON","parse","oldval","newval","replaceAndKeepCursor","uuid","initCommentForm","$selectBranch","initListSubmits","selectItem","outerSelector","$list","$noSelect","$listMenu","hasLabelUpdateAction","listIds","select_id","input_id","hasUpdateAction","initRepository","$data","canCreateBranch","menuVisible","branch","tag","Vue","delimiters","el","beforeMount","vm","$el","watch","focusSearchField","computed","filteredItems","showCreateNewBranch","showNoResults","methods","getSelected","href","createNewBranch","$refs","newBranchForm","submit","nextTick","searchField","j","getSelectedIndexInFiltered","scrollToActive","cont","scrollContainer","offsetTop","clientHeight","keyCode","initFilterSearchDropdown","keyup","$prompt","checked","$newLabelPanel","minicolors","color_hex","modal","onApprove","$datepicker","datetimepicker","lang","inline","timepicker","startDate","formatDate","onSelectDate","ct","dateFormat","$issueTitle","$editInput","editTitleToggle","$content","$parent","$textarea","$segment","$editContentZone","$renderContent","$rawContent","issuesTribute","attach","emojiTribute","$dropzone","$files","filenameDict","dropzone","headers","maxFiles","maxFilesize","acceptedFiles","addRemoveLinks","dictDefaultMessage","dictInvalidFileType","dictFileTooBig","dictRemoveFile","init","submitted","getJSON","drop","removeAllFiles","imgSrc","emit","files","$editContentForm","$attachments","map","attachments","confirm","$statusButton","$mergeButton","_text","_value","initReactionSelector","reactions","popup","actionURL","resp","react","hasEmoji","addLine","delLine","addPercent","parseFloat","localStorage","$repoComparePull","$dropdown","assingMenuAttributes","initRepositoryCollaboration","uid","initEditor","$editFilename","parts","$section","$divider","getCursorPosition","setSelectionRange","$editArea","markdownFileExts","lineWrapExtensions","spec","extension","extWithDot","dataUrl","apiCall","exec","CodeMirror","findModeByExtension","previewLink","mime","toTextArea","SimpleMDE","autoDownloadFontAwesome","forceSync","renderingConfig","singleLineBreaks","indentWithTabs","tabSize","spellChecker","previewRender","plainText","preview","innerHTML","toolbar","setSimpleMDE","fromTextArea","lineNumbers","cm","_change","getValue","setCodeMirror","setOption","autoLoadMode","editorconfig","indent_style","Tab","spaces","parseInt","getOption","replaceSelection","indent_size","tab_width","$commitButton","$editForm","areYouSure","dirtyClass","fieldSelector","dirty","initUserSettings","keypress","initCodeView","$select","selectRange","getSelection","removeAllRanges","$first","hash","$foldButton","slideUp","slideDown","insertBlobExcerpt","$blob","$row","replaceWith","u2fSigned","stringify","contentType","fail","u2fError","u2fRegistered","errorCode","checkError","u2fErrors","browser","2","3","4","5","u2fRegisterRequest","req","registeredKeys","u2fApi","register","appId","registerRequests","catch","reason","metaData","code","changeHash","history","pushState","$from","classes","showDeletePopup","dialog","closable","redirect","showAddAllPopup","Dropzone","autoDiscover","pos","Sel","SelLength","ready","accordion","checkbox","progress","showActivity","slideToggle","nodes","querySelectorAll","setConfig","img_dir","ignore_emoticons","getElementsByClassName","childNodes","nodeName","$searchTeamBox","$searchRepoBox","toggleMigrations","isExpanded","mgrBtn","editDiv","viewDiv","saveBtn","topicDropdown","topicForm","topicPrompts","hidePrompt","prompts","clipboard","Clipboard","clearSelection","node","encodeURIComponent","dataset","issueIDs","issueId","_","onResponse","login","full_name","image","avatar_url","searchFields","permission","description","dbType","dbDefaults","MySQL","PostgreSQL","MSSQL","_type","defaultHost","authUserName","cloneAddr","startsWith","sideBySideChanges","sideBySideTimeout","simplemde","render","isSideBySideActive","codemirror","cursorPos","getCursor","setCursor","line","ch","getInputField","$bEdit","$bPrev","$toolbar","$bPreview","$bSideBySide","initWikiForm","updateContentType","initWebhook","authType","onOAuth2Change","onSecurityProtocolChange","onUsePagedSearchChange","onOAuth2UseCustomURLChange","$detailModal","$checkboxes","ids","provider","initAdmin","component","props","searchLimit","Number","required","organizations","isOrganization","Boolean","canCreateOrganization","organizationsTotalCount","moreReposLink","repos","reposTotalCount","reposFilter","searchQuery","isLoading","repoTypes","searchMode","forks","mirrors","sources","collaborative","showMoreReposLink","searchURL","repoTypeCount","mounted","searchRepos","changeTab","changeReposFilter","showRepo","repo","owner","mirror","fork","searchedMode","searchedURL","searchedQuery","_textStatus","getResponseHeader","always","repoClass","private","initVueApp","altKey","metaKey","countPrompt","formatPrompt","topics","_data","responseJSON","topicArray","invalidTopics","topicLables","form","blue","basic","formattedResponse","found_query","current_topics","topic_name","unshift","contents","_addedText","$addedChoice","rules","validateTopic","_values","identifier","prompt","ensureSupport","sign","challenge","allowMultiple","repolink","repoId","crossRepoSearch","issueSearchUrl","filteredResponse","currIssueId","issue","number","repository","regStr","selectedItems","initIssueList","wipPrefixes","sticky","isSplit","side","idx","path","tr","ntr","after","td","commentCloud","initRepoStatusChecker","migrating","repo_name","$repoTemplate","checkTemplate","$templateUnits","$nonTemplate","changeOwner","_r","initTemplateSearch","routes","$cloneAddr","$repoName","arrays","$title","timeAddManual","toggleStopwatch","cancelStopwatch","initHeatmap","appElementId","heatmapUser","locale","contributions","no_contributions","vueDelimeters","user","colorRange","endDate","totalContributions","getColor","loadHeatmap","userName","chartRawData","chartData","date","timestamp","color","getComputedStyle","backgroundColor","removeChild","template","toggleDeadlineForm","fadeToggle","setDeadline","deadline","updateDeadline","deadlineString","realDeadline","newDate","due_date","deleteDependencyModal","cancelCodeComment","btn","onOAuthLoginClick","oauthLoader","oauthNav"],"mappings":"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","file":"index.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"0\":\"gitgraph\"}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","module.exports = require(\"regenerator-runtime\");\n","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","/* This sets up webpack's chunk loading to load resources from the same\n  directory where it loaded index.js from. This file must be imported\n  before any lazy-loading is being attempted. */\n\nif (document.currentScript && document.currentScript.src) {\n  const url = new URL(document.currentScript.src);\n  __webpack_public_path__ = `${url.pathname.replace(/\\/[^/]*$/, '')}/`;\n} else {\n  // compat: IE11\n  const script = document.querySelector('script[src*=\"/index.js\"]');\n  __webpack_public_path__ = `${script.getAttribute('src').replace(/\\/[^/]*$/, '')}/`;\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n    return;\n  }\n\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","/* This is a patched version of semantic.dropdown which includes a11y changes, see\n   https://github.com/go-gitea/gitea/pull/8638#issuecomment-549175290 */\n\n/*!\n * # Semantic UI 2.3.1 - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n\n/*\n * Copyright 2019 The Gitea Authors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n * This version has been modified by Gitea to improve accessibility.\n */\n\n;(function ($, window, document, undefined) {\n\n'use strict';\n\nwindow = (typeof window != 'undefined' && window.Math == Math)\n  ? window\n  : (typeof self != 'undefined' && self.Math == Math)\n    ? self\n    : Function('return this')()\n;\n\n$.fn.dropdown = function(parameters) {\n  var\n    $allModules    = $(this),\n    $document      = $(document),\n\n    moduleSelector = $allModules.selector || '',\n\n    hasTouch       = ('ontouchstart' in document.documentElement),\n    time           = new Date().getTime(),\n    performance    = [],\n\n    query          = arguments[0],\n    methodInvoked  = (typeof query == 'string'),\n    queryArguments = [].slice.call(arguments, 1),\n    lastAriaID = 1,\n    returnedValue\n  ;\n\n  $allModules\n    .each(function(elementIndex) {\n      var\n        settings          = ( $.isPlainObject(parameters) )\n          ? $.extend(true, {}, $.fn.dropdown.settings, parameters)\n          : $.extend({}, $.fn.dropdown.settings),\n\n        className       = settings.className,\n        message         = settings.message,\n        fields          = settings.fields,\n        keys            = settings.keys,\n        metadata        = settings.metadata,\n        namespace       = settings.namespace,\n        regExp          = settings.regExp,\n        selector        = settings.selector,\n        error           = settings.error,\n        templates       = settings.templates,\n\n        eventNamespace  = '.' + namespace,\n        moduleNamespace = 'module-' + namespace,\n\n        $module         = $(this),\n        $context        = $(settings.context),\n        $text           = $module.find(selector.text),\n        $search         = $module.find(selector.search),\n        $sizer          = $module.find(selector.sizer),\n        $input          = $module.find(selector.input),\n        $icon           = $module.find(selector.icon),\n\n        $combo = ($module.prev().find(selector.text).length > 0)\n          ? $module.prev().find(selector.text)\n          : $module.prev(),\n\n        $menu           = $module.children(selector.menu),\n        $item           = $menu.find(selector.item),\n\n        activated       = false,\n        itemActivated   = false,\n        internalChange  = false,\n        element         = this,\n        instance        = $module.data(moduleNamespace),\n\n        initialLoad,\n        pageLostFocus,\n        willRefocus,\n        elementNamespace,\n        id,\n        selectObserver,\n        menuObserver,\n        module\n      ;\n\n      module = {\n\n        initialize: function() {\n          module.debug('Initializing dropdown', settings);\n\n          if( module.is.alreadySetup() ) {\n            module.setup.reference();\n          }\n          else {\n\n            module.setup.layout();\n\n            if(settings.values) {\n              module.change.values(settings.values);\n            }\n\n            module.refreshData();\n\n            module.save.defaults();\n            module.restore.selected();\n\n            module.create.id();\n            module.bind.events();\n\n            module.observeChanges();\n            module.instantiate();\n\n            module.aria.setup();\n          }\n\n        },\n\n        instantiate: function() {\n          module.verbose('Storing instance of dropdown', module);\n          instance = module;\n          $module\n            .data(moduleNamespace, module)\n          ;\n        },\n\n        destroy: function() {\n          module.verbose('Destroying previous dropdown', $module);\n          module.remove.tabbable();\n          $module\n            .off(eventNamespace)\n            .removeData(moduleNamespace)\n          ;\n          $menu\n            .off(eventNamespace)\n          ;\n          $document\n            .off(elementNamespace)\n          ;\n          module.disconnect.menuObserver();\n          module.disconnect.selectObserver();\n        },\n\n        observeChanges: function() {\n          if('MutationObserver' in window) {\n            selectObserver = new MutationObserver(module.event.select.mutation);\n            menuObserver   = new MutationObserver(module.event.menu.mutation);\n            module.debug('Setting up mutation observer', selectObserver, menuObserver);\n            module.observe.select();\n            module.observe.menu();\n          }\n        },\n\n        disconnect: {\n          menuObserver: function() {\n            if(menuObserver) {\n              menuObserver.disconnect();\n            }\n          },\n          selectObserver: function() {\n            if(selectObserver) {\n              selectObserver.disconnect();\n            }\n          }\n        },\n        observe: {\n          select: function() {\n            if(module.has.input()) {\n              selectObserver.observe($module[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          menu: function() {\n            if(module.has.menu()) {\n              menuObserver.observe($menu[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          }\n        },\n\n        create: {\n          id: function() {\n            id = (Math.random().toString(16) + '000000000').substr(2, 8);\n            elementNamespace = '.' + id;\n            module.verbose('Creating unique id for element', id);\n          },\n          userChoice: function(values) {\n            var\n              $userChoices,\n              $userChoice,\n              isUserValue,\n              html\n            ;\n            values = values || module.get.userValues();\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            $.each(values, function(index, value) {\n              if(module.get.item(value) === false) {\n                html         = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $userChoice  = $('<div />')\n                  .html(html)\n                  .attr('data-' + metadata.value, value)\n                  .attr('data-' + metadata.text, value)\n                  .addClass(className.addition)\n                  .addClass(className.item)\n                ;\n                if(settings.hideAdditions) {\n                  $userChoice.addClass(className.hidden);\n                }\n                $userChoices = ($userChoices === undefined)\n                  ? $userChoice\n                  : $userChoices.add($userChoice)\n                ;\n                module.verbose('Creating user choices for value', value, $userChoice);\n              }\n            });\n            return $userChoices;\n          },\n          userLabels: function(value) {\n            var\n              userValues = module.get.userValues()\n            ;\n            if(userValues) {\n              module.debug('Adding user labels', userValues);\n              $.each(userValues, function(index, value) {\n                module.verbose('Adding custom user value');\n                module.add.label(value, value);\n              });\n            }\n          },\n          menu: function() {\n            $menu = $('<div />')\n              .addClass(className.menu)\n              .appendTo($module)\n            ;\n          },\n          sizer: function() {\n            $sizer = $('<span />')\n              .addClass(className.sizer)\n              .insertAfter($search)\n            ;\n          }\n        },\n\n        search: function(query) {\n          query = (query !== undefined)\n            ? query\n            : module.get.query()\n          ;\n          module.verbose('Searching for query', query);\n          if(module.has.minCharacters(query)) {\n            module.filter(query);\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        select: {\n          firstUnfiltered: function() {\n            module.verbose('Selecting first non-filtered element');\n            module.remove.selectedItem();\n            $item\n              .not(selector.unselectable)\n              .not(selector.addition + selector.hidden)\n                .eq(0)\n                .addClass(className.selected)\n            ;\n          },\n          nextAvailable: function($selected) {\n            $selected = $selected.eq(0);\n            var\n              $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),\n              $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),\n              hasNext        = ($nextAvailable.length > 0)\n            ;\n            if(hasNext) {\n              module.verbose('Moving selection to', $nextAvailable);\n              $nextAvailable.addClass(className.selected);\n            }\n            else {\n              module.verbose('Moving selection to', $prevAvailable);\n              $prevAvailable.addClass(className.selected);\n            }\n          }\n        },\n\n        aria: {\n          setup: function() {\n            var role = module.aria.guessRole();\n            if( role !== 'menu' ) {\n              return;\n            }\n            $module.attr('aria-busy', 'true');\n            $module.attr('role', 'menu');\n            $module.attr('aria-haspopup', 'menu');\n            $module.attr('aria-expanded', 'false');\n            $menu.find('.divider').attr('role', 'separator');\n            $item.attr('role', 'menuitem');\n            $item.each(function (index, item) {\n              if( !item.id ) {\n                item.id = module.aria.nextID('menuitem');\n              }\n            });\n            $text = $module\n              .find('> .text')\n              .eq(0)\n            ;\n            if( $module.data('content') ) {\n              $text.attr('aria-hidden');\n              $module.attr('aria-label', $module.data('content'));\n            }\n            else {\n              $text.attr('id', module.aria.nextID('menutext'));\n              $module.attr('aria-labelledby', $text.attr('id'));\n            }\n            $module.attr('aria-busy', 'false');\n          },\n          nextID: function(prefix) {\n            var nextID;\n            do {\n              nextID = prefix + '_' + lastAriaID++;\n            } while( document.getElementById(nextID) );\n            return nextID;\n          },\n          setExpanded: function(expanded) {\n            if( $module.attr('aria-haspopup') ) {\n              $module.attr('aria-expanded', expanded);\n            }\n          },\n          refreshDescendant: function() {\n            if( $module.attr('aria-haspopup') !== 'menu' ) {\n              return;\n            }\n            var\n              $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n              $activeItem        = $menu.children('.' + className.active).eq(0),\n              $selectedItem      = ($currentlySelected.length > 0)\n                ? $currentlySelected\n                : $activeItem\n            ;\n            if( $selectedItem ) {\n              $module.attr('aria-activedescendant', $selectedItem.attr('id'));\n            }\n            else {\n              module.aria.removeDescendant();\n            }\n          },\n          removeDescendant: function() {\n            if( $module.attr('aria-haspopup') == 'menu' ) {\n              $module.removeAttr('aria-activedescendant');\n            }\n          },\n          guessRole: function() {\n            var\n              isIcon = $module.hasClass('icon'),\n              hasSearch = module.has.search(),\n              hasInput = ($input.length > 0),\n              isMultiple = module.is.multiple()\n            ;\n            if ( !isIcon && !hasSearch && !hasInput && !isMultiple ) {\n              return 'menu';\n            }\n            return 'unknown';\n          }\n        },\n\n        setup: {\n          api: function() {\n            var\n              apiSettings = {\n                debug   : settings.debug,\n                urlData : {\n                  value : module.get.value(),\n                  query : module.get.query()\n                },\n                on    : false\n              }\n            ;\n            module.verbose('First request, initializing API');\n            $module\n              .api(apiSettings)\n            ;\n          },\n          layout: function() {\n            if( $module.is('select') ) {\n              module.setup.select();\n              module.setup.returnedObject();\n            }\n            if( !module.has.menu() ) {\n              module.create.menu();\n            }\n            if( module.is.search() && !module.has.search() ) {\n              module.verbose('Adding search input');\n              $search = $('<input />')\n                .addClass(className.search)\n                .prop('autocomplete', 'off')\n                .insertBefore($text)\n              ;\n            }\n            if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {\n              module.create.sizer();\n            }\n            if(settings.allowTab) {\n              module.set.tabbable();\n            }\n            $item.attr('tabindex', '-1');\n          },\n          select: function() {\n            var\n              selectValues  = module.get.selectValues()\n            ;\n            module.debug('Dropdown initialized on a select', selectValues);\n            if( $module.is('select') ) {\n              $input = $module;\n            }\n            // see if select is placed correctly already\n            if($input.parent(selector.dropdown).length > 0) {\n              module.debug('UI dropdown already exists. Creating dropdown menu only');\n              $module = $input.closest(selector.dropdown);\n              if( !module.has.menu() ) {\n                module.create.menu();\n              }\n              $menu = $module.children(selector.menu);\n              module.setup.menu(selectValues);\n            }\n            else {\n              module.debug('Creating entire dropdown from select');\n              $module = $('<div />')\n                .attr('class', $input.attr('class') )\n                .addClass(className.selection)\n                .addClass(className.dropdown)\n                .html( templates.dropdown(selectValues) )\n                .insertBefore($input)\n              ;\n              if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {\n                module.error(error.missingMultiple);\n                $input.prop('multiple', true);\n              }\n              if($input.is('[multiple]')) {\n                module.set.multiple();\n              }\n              if ($input.prop('disabled')) {\n                module.debug('Disabling dropdown');\n                $module.addClass(className.disabled);\n              }\n              $input\n                .removeAttr('class')\n                .detach()\n                .prependTo($module)\n              ;\n            }\n            module.refresh();\n          },\n          menu: function(values) {\n            $menu.html( templates.menu(values, fields));\n            $item = $menu.find(selector.item);\n          },\n          reference: function() {\n            module.debug('Dropdown behavior was called on select, replacing with closest dropdown');\n            // replace module reference\n            $module  = $module.parent(selector.dropdown);\n            instance = $module.data(moduleNamespace);\n            element  = $module.get(0);\n            module.refresh();\n            module.setup.returnedObject();\n          },\n          returnedObject: function() {\n            var\n              $firstModules = $allModules.slice(0, elementIndex),\n              $lastModules  = $allModules.slice(elementIndex + 1)\n            ;\n            // adjust all modules to use correct reference\n            $allModules = $firstModules.add($module).add($lastModules);\n          }\n        },\n\n        refresh: function() {\n          module.refreshSelectors();\n          module.refreshData();\n        },\n\n        refreshItems: function() {\n          $item = $menu.find(selector.item);\n        },\n\n        refreshSelectors: function() {\n          module.verbose('Refreshing selector cache');\n          $text   = $module.find(selector.text);\n          $search = $module.find(selector.search);\n          $input  = $module.find(selector.input);\n          $icon   = $module.find(selector.icon);\n          $combo  = ($module.prev().find(selector.text).length > 0)\n            ? $module.prev().find(selector.text)\n            : $module.prev()\n          ;\n          $menu    = $module.children(selector.menu);\n          $item    = $menu.find(selector.item);\n        },\n\n        refreshData: function() {\n          module.verbose('Refreshing cached metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n        },\n\n        clearData: function() {\n          module.verbose('Clearing metadata');\n          $item\n            .removeData(metadata.text)\n            .removeData(metadata.value)\n          ;\n          $module\n            .removeData(metadata.defaultText)\n            .removeData(metadata.defaultValue)\n            .removeData(metadata.placeholderText)\n          ;\n        },\n\n        toggle: function() {\n          module.verbose('Toggling menu visibility');\n          if( !module.is.active() ) {\n            module.show();\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        show: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if(!module.can.show() && module.is.remote()) {\n            module.debug('No API results retrieved, searching before show');\n            module.queryRemote(module.get.query(), module.show);\n          }\n          if( module.can.show() && !module.is.active() ) {\n            module.debug('Showing dropdown');\n            if(module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered()) ) {\n              module.remove.message();\n            }\n            if(module.is.allFiltered()) {\n              return true;\n            }\n            if(settings.onShow.call(element) !== false) {\n              module.aria.setExpanded(true);\n              module.aria.refreshDescendant();\n              module.animate.show(function() {\n                if( module.can.click() ) {\n                  module.bind.intent();\n                }\n                if(module.has.menuSearch()) {\n                  module.focusSearch();\n                }\n                module.set.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hide: function(callback) {\n          callback = $.isFunction(callback)\n            ? callback\n            : function(){}\n          ;\n          if( module.is.active() && !module.is.animatingOutward() ) {\n            module.debug('Hiding dropdown');\n            if(settings.onHide.call(element) !== false) {\n              module.aria.setExpanded(false);\n              module.aria.removeDescendant();\n              module.animate.hide(function() {\n                module.remove.visible();\n                callback.call(element);\n              });\n            }\n          }\n        },\n\n        hideOthers: function() {\n          module.verbose('Finding other dropdowns to hide');\n          $allModules\n            .not($module)\n              .has(selector.menu + '.' + className.visible)\n                .dropdown('hide')\n          ;\n        },\n\n        hideMenu: function() {\n          module.verbose('Hiding menu  instantaneously');\n          module.remove.active();\n          module.remove.visible();\n          $menu.transition('hide');\n        },\n\n        hideSubMenus: function() {\n          var\n            $subMenus = $menu.children(selector.item).find(selector.menu)\n          ;\n          module.verbose('Hiding sub menus', $subMenus);\n          $subMenus.transition('hide');\n        },\n\n        bind: {\n          events: function() {\n            if(hasTouch) {\n              module.bind.touchEvents();\n            }\n            module.bind.keyboardEvents();\n            module.bind.inputEvents();\n            module.bind.mouseEvents();\n          },\n          touchEvents: function() {\n            module.debug('Touch device detected binding additional touch events');\n            if( module.is.searchSelection() ) {\n              // do nothing special yet\n            }\n            else if( module.is.single() ) {\n              $module\n                .on('touchstart' + eventNamespace, module.event.test.toggle)\n              ;\n            }\n            $menu\n              .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)\n            ;\n          },\n          keyboardEvents: function() {\n            module.verbose('Binding keyboard events');\n            $module\n              .on('keydown' + eventNamespace, module.event.keydown)\n            ;\n            if( module.has.search() ) {\n              $module\n                .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)\n              ;\n            }\n            if( module.is.multiple() ) {\n              $document\n                .on('keydown' + elementNamespace, module.event.document.keydown)\n              ;\n            }\n          },\n          inputEvents: function() {\n            module.verbose('Binding input change events');\n            $module\n              .on('change' + eventNamespace, selector.input, module.event.change)\n            ;\n          },\n          mouseEvents: function() {\n            module.verbose('Binding mouse events');\n            if(module.is.multiple()) {\n              $module\n                .on('click'   + eventNamespace, selector.label,  module.event.label.click)\n                .on('click'   + eventNamespace, selector.remove, module.event.remove.click)\n              ;\n            }\n            if( module.is.searchSelection() ) {\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('mousedown' + eventNamespace, selector.menu,   module.event.menu.mousedown)\n                .on('mouseup'   + eventNamespace, selector.menu,   module.event.menu.mouseup)\n                .on('click'     + eventNamespace, selector.icon,   module.event.icon.click)\n                .on('focus'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('click'     + eventNamespace, selector.search, module.event.search.focus)\n                .on('blur'      + eventNamespace, selector.search, module.event.search.blur)\n                .on('click'     + eventNamespace, selector.text,   module.event.text.focus)\n              ;\n              if(module.is.multiple()) {\n                $module\n                  .on('click' + eventNamespace, module.event.click)\n                ;\n              }\n            }\n            else {\n              if(settings.on == 'click') {\n                $module\n                  .on('click' + eventNamespace, selector.icon, module.event.icon.click)\n                  .on('click' + eventNamespace, module.event.test.toggle)\n                ;\n              }\n              else if(settings.on == 'hover') {\n                $module\n                  .on('mouseenter' + eventNamespace, module.delay.show)\n                  .on('mouseleave' + eventNamespace, module.delay.hide)\n                ;\n              }\n              else {\n                $module\n                  .on(settings.on + eventNamespace, module.toggle)\n                ;\n              }\n              $module\n                .on('mousedown' + eventNamespace, module.event.mousedown)\n                .on('mouseup'   + eventNamespace, module.event.mouseup)\n                .on('focus'     + eventNamespace, module.event.focus)\n              ;\n              if(module.has.menuSearch() ) {\n                $module\n                  .on('blur' + eventNamespace, selector.search, module.event.search.blur)\n                ;\n              }\n              else {\n                $module\n                  .on('blur' + eventNamespace, module.event.blur)\n                ;\n              }\n            }\n            $menu\n              .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)\n              .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)\n              .on('click'      + eventNamespace, selector.item, module.event.item.click)\n            ;\n          },\n          intent: function() {\n            module.verbose('Binding hide intent event to document');\n            if(hasTouch) {\n              $document\n                .on('touchstart' + elementNamespace, module.event.test.touch)\n                .on('touchmove'  + elementNamespace, module.event.test.touch)\n              ;\n            }\n            $document\n              .on('click' + elementNamespace, module.event.test.hide)\n            ;\n          }\n        },\n\n        unbind: {\n          intent: function() {\n            module.verbose('Removing hide intent event from document');\n            if(hasTouch) {\n              $document\n                .off('touchstart' + elementNamespace)\n                .off('touchmove' + elementNamespace)\n              ;\n            }\n            $document\n              .off('click' + elementNamespace)\n            ;\n          }\n        },\n\n        filter: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            afterFiltered = function() {\n              if(module.is.multiple()) {\n                module.filterActive();\n              }\n              if(query || (!query && module.get.activeItem().length == 0)) {\n                module.select.firstUnfiltered();\n              }\n              if( module.has.allResultsFiltered() ) {\n                if( settings.onNoResults.call(element, searchTerm) ) {\n                  if(settings.allowAdditions) {\n                    if(settings.hideAdditions) {\n                      module.verbose('User addition with no menu, setting empty style');\n                      module.set.empty();\n                      module.hideMenu();\n                    }\n                  }\n                  else {\n                    module.verbose('All items filtered, showing message', searchTerm);\n                    module.add.message(message.noResults);\n                  }\n                }\n                else {\n                  module.verbose('All items filtered, hiding dropdown', searchTerm);\n                  module.hideMenu();\n                }\n              }\n              else {\n                module.remove.empty();\n                module.remove.message();\n              }\n              if(settings.allowAdditions) {\n                module.add.userSuggestion(query);\n              }\n              if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {\n                module.show();\n              }\n            }\n          ;\n          if(settings.useLabels && module.has.maxSelections()) {\n            return;\n          }\n          if(settings.apiSettings) {\n            if( module.can.useAPI() ) {\n              module.queryRemote(searchTerm, function() {\n                if(settings.filterRemoteData) {\n                  module.filterItems(searchTerm);\n                }\n                afterFiltered();\n              });\n            }\n            else {\n              module.error(error.noAPI);\n            }\n          }\n          else {\n            module.filterItems(searchTerm);\n            afterFiltered();\n          }\n        },\n\n        queryRemote: function(query, callback) {\n          var\n            apiSettings = {\n              errorDuration : false,\n              cache         : 'local',\n              throttle      : settings.throttle,\n              urlData       : {\n                query: query\n              },\n              onError: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onFailure: function() {\n                module.add.message(message.serverError);\n                callback();\n              },\n              onSuccess : function(response) {\n                module.remove.message();\n                module.setup.menu({\n                  values: response[fields.remoteValues]\n                });\n                callback();\n              }\n            }\n          ;\n          if( !$module.api('get request') ) {\n            module.setup.api();\n          }\n          apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);\n          $module\n            .api('setting', apiSettings)\n            .api('query')\n          ;\n        },\n\n        filterItems: function(query) {\n          var\n            searchTerm = (query !== undefined)\n              ? query\n              : module.get.query(),\n            results          =  null,\n            escapedTerm      = module.escape.string(searchTerm),\n            beginsWithRegExp = new RegExp('^' + escapedTerm, 'igm')\n          ;\n          // avoid loop if we're matching nothing\n          if( module.has.query() ) {\n            results = [];\n\n            module.verbose('Searching for matching values', searchTerm);\n            $item\n              .each(function(){\n                var\n                  $choice = $(this),\n                  text,\n                  value\n                ;\n                if(settings.match == 'both' || settings.match == 'text') {\n                  text = String(module.get.choiceText($choice, false));\n                  if(text.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n                if(settings.match == 'both' || settings.match == 'value') {\n                  value = String(module.get.choiceValue($choice, text));\n                  if(value.search(beginsWithRegExp) !== -1) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                  else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {\n                    results.push(this);\n                    return true;\n                  }\n                }\n              })\n            ;\n          }\n          module.debug('Showing only matched items', searchTerm);\n          module.remove.filteredItem();\n          if(results) {\n            $item\n              .not(results)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        fuzzySearch: function(query, term) {\n          var\n            termLength  = term.length,\n            queryLength = query.length\n          ;\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(queryLength > termLength) {\n            return false;\n          }\n          if(queryLength === termLength) {\n            return (query === term);\n          }\n          search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {\n            var\n              queryCharacter = query.charCodeAt(characterIndex)\n            ;\n            while(nextCharacterIndex < termLength) {\n              if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {\n                continue search;\n              }\n            }\n            return false;\n          }\n          return true;\n        },\n        exactSearch: function (query, term) {\n          query = query.toLowerCase();\n          term  = term.toLowerCase();\n          if(term.indexOf(query) > -1) {\n             return true;\n          }\n          return false;\n        },\n        filterActive: function() {\n          if(settings.useLabels) {\n            $item.filter('.' + className.active)\n              .addClass(className.filtered)\n            ;\n          }\n        },\n\n        focusSearch: function(skipHandler) {\n          if( module.has.search() && !module.is.focusedOnSearch() ) {\n            if(skipHandler) {\n              $module.off('focus' + eventNamespace, selector.search);\n              $search.focus();\n              $module.on('focus'  + eventNamespace, selector.search, module.event.search.focus);\n            }\n            else {\n              $search.focus();\n            }\n          }\n        },\n\n        forceSelection: function() {\n          var\n            $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),\n            $activeItem        = $item.not(className.filtered).filter('.' + className.active).eq(0),\n            $selectedItem      = ($currentlySelected.length > 0)\n              ? $currentlySelected\n              : $activeItem,\n            hasSelected = ($selectedItem.length > 0)\n          ;\n          if(hasSelected && !module.is.multiple()) {\n            module.debug('Forcing partial selection to selected item', $selectedItem);\n            module.event.item.click.call($selectedItem, {}, true);\n            return;\n          }\n          else {\n            if(settings.allowAdditions) {\n              module.set.selected(module.get.query());\n              module.remove.searchTerm();\n            }\n            else {\n              module.remove.searchTerm();\n            }\n          }\n        },\n\n        change: {\n          values: function(values) {\n            if(!settings.allowAdditions) {\n              module.clear();\n            }\n            module.debug('Creating dropdown with specified values', values);\n            module.setup.menu({values: values});\n            $.each(values, function(index, item) {\n              if(item.selected == true) {\n                module.debug('Setting initial selection to', item.value);\n                module.set.selected(item.value);\n                return true;\n              }\n            });\n          }\n        },\n\n        event: {\n          change: function() {\n            if(!internalChange) {\n              module.debug('Input changed, updating selection');\n              module.set.selected();\n            }\n          },\n          focus: function() {\n            if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {\n              module.show();\n            }\n          },\n          blur: function(event) {\n            pageLostFocus = (document.activeElement === this);\n            if(!activated && !pageLostFocus) {\n              module.remove.activeLabel();\n              module.hide();\n            }\n          },\n          mousedown: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = true;\n            }\n            else {\n              // prevents focus callback from occurring on mousedown\n              activated = true;\n            }\n          },\n          mouseup: function() {\n            if(module.is.searchSelection()) {\n              // prevent menu hiding on immediate re-focus\n              willRefocus = false;\n            }\n            else {\n              activated = false;\n            }\n          },\n          click: function(event) {\n            var\n              $target = $(event.target)\n            ;\n            // focus search\n            if($target.is($module)) {\n              if(!module.is.focusedOnSearch()) {\n                module.focusSearch();\n              }\n              else {\n                module.show();\n              }\n            }\n          },\n          search: {\n            focus: function() {\n              activated = true;\n              if(module.is.multiple()) {\n                module.remove.activeLabel();\n              }\n              if(settings.showOnFocus) {\n                module.search();\n              }\n            },\n            blur: function(event) {\n              pageLostFocus = (document.activeElement === this);\n              if(module.is.searchSelection() && !willRefocus) {\n                if(!itemActivated && !pageLostFocus) {\n                  if(settings.forceSelection) {\n                    module.forceSelection();\n                  }\n                  module.hide();\n                }\n              }\n              willRefocus = false;\n            }\n          },\n          icon: {\n            click: function(event) {\n              module.toggle();\n            }\n          },\n          text: {\n            focus: function(event) {\n              activated = true;\n              module.focusSearch();\n            }\n          },\n          input: function(event) {\n            if(module.is.multiple() || module.is.searchSelection()) {\n              module.set.filtered();\n            }\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.search, settings.delay.search);\n          },\n          label: {\n            click: function(event) {\n              var\n                $label        = $(this),\n                $labels       = $module.find(selector.label),\n                $activeLabels = $labels.filter('.' + className.active),\n                $nextActive   = $label.nextAll('.' + className.active),\n                $prevActive   = $label.prevAll('.' + className.active),\n                $range = ($nextActive.length > 0)\n                  ? $label.nextUntil($nextActive).add($activeLabels).add($label)\n                  : $label.prevUntil($prevActive).add($activeLabels).add($label)\n              ;\n              if(event.shiftKey) {\n                $activeLabels.removeClass(className.active);\n                $range.addClass(className.active);\n              }\n              else if(event.ctrlKey) {\n                $label.toggleClass(className.active);\n              }\n              else {\n                $activeLabels.removeClass(className.active);\n                $label.addClass(className.active);\n              }\n              settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));\n            }\n          },\n          remove: {\n            click: function() {\n              var\n                $label = $(this).parent()\n              ;\n              if( $label.hasClass(className.active) ) {\n                // remove all selected labels\n                module.remove.activeLabels();\n              }\n              else {\n                // remove this label only\n                module.remove.activeLabels( $label );\n              }\n            }\n          },\n          test: {\n            toggle: function(event) {\n              var\n                toggleBehavior = (module.is.multiple())\n                  ? module.show\n                  : module.toggle\n              ;\n              if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {\n                return;\n              }\n              if( module.determine.eventOnElement(event, toggleBehavior) ) {\n                event.preventDefault();\n              }\n            },\n            touch: function(event) {\n              module.determine.eventOnElement(event, function() {\n                if(event.type == 'touchstart') {\n                  module.timer = setTimeout(function() {\n                    module.hide();\n                  }, settings.delay.touch);\n                }\n                else if(event.type == 'touchmove') {\n                  clearTimeout(module.timer);\n                }\n              });\n              event.stopPropagation();\n            },\n            hide: function(event) {\n              module.determine.eventInModule(event, module.hide);\n            }\n          },\n          select: {\n            mutation: function(mutations) {\n              module.debug('<select> modified, recreating menu');\n              var\n                isSelectMutation = false\n              ;\n              $.each(mutations, function(index, mutation) {\n                if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {\n                  isSelectMutation = true;\n                  return true;\n                }\n              });\n              if(isSelectMutation) {\n                module.disconnect.selectObserver();\n                module.refresh();\n                module.setup.select();\n                module.set.selected();\n                module.observe.select();\n              }\n            }\n          },\n          menu: {\n            mutation: function(mutations) {\n              var\n                mutation   = mutations[0],\n                $addedNode = mutation.addedNodes\n                  ? $(mutation.addedNodes[0])\n                  : $(false),\n                $removedNode = mutation.removedNodes\n                  ? $(mutation.removedNodes[0])\n                  : $(false),\n                $changedNodes  = $addedNode.add($removedNode),\n                isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,\n                isMessage      = $changedNodes.is(selector.message)  || $changedNodes.closest(selector.message).length > 0\n              ;\n              if(isUserAddition || isMessage) {\n                module.debug('Updating item selector cache');\n                module.refreshItems();\n              }\n              else {\n                module.debug('Menu modified, updating selector cache');\n                module.refresh();\n              }\n            },\n            mousedown: function() {\n              itemActivated = true;\n            },\n            mouseup: function() {\n              itemActivated = false;\n            }\n          },\n          item: {\n            mouseenter: function(event) {\n              var\n                $target        = $(event.target),\n                $item          = $(this),\n                $subMenu       = $item.children(selector.menu),\n                $otherMenus    = $item.siblings(selector.item).children(selector.menu),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              if( !isBubbledEvent && hasSubMenu ) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Showing sub-menu', $subMenu);\n                  $.each($otherMenus, function() {\n                    module.animate.hide(false, $(this));\n                  });\n                  module.animate.show(false, $subMenu);\n                }, settings.delay.show);\n                event.preventDefault();\n              }\n            },\n            mouseleave: function(event) {\n              var\n                $subMenu = $(this).children(selector.menu)\n              ;\n              if($subMenu.length > 0) {\n                clearTimeout(module.itemTimer);\n                module.itemTimer = setTimeout(function() {\n                  module.verbose('Hiding sub-menu', $subMenu);\n                  module.animate.hide(false, $subMenu);\n                }, settings.delay.hide);\n              }\n            },\n            click: function (event, skipRefocus) {\n              var\n                $choice        = $(this),\n                $target        = (event)\n                  ? $(event.target)\n                  : $(''),\n                $subMenu       = $choice.find(selector.menu),\n                text           = module.get.choiceText($choice),\n                value          = module.get.choiceValue($choice, text),\n                hasSubMenu     = ($subMenu.length > 0),\n                isBubbledEvent = ($subMenu.find($target).length > 0)\n              ;\n              // prevents IE11 bug where menu receives focus even though `tabindex=-1`\n              if(module.has.menuSearch()) {\n                $(document.activeElement).blur();\n              }\n              if(!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {\n                if(module.is.searchSelection()) {\n                  if(settings.allowAdditions) {\n                    module.remove.userAddition();\n                  }\n                  module.remove.searchTerm();\n                  if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {\n                    module.focusSearch(true);\n                  }\n                }\n                if(!settings.useLabels) {\n                  module.remove.filteredItem();\n                  module.set.scrollPosition($choice);\n                }\n                module.determine.selectAction.call(this, text, value);\n              }\n            }\n          },\n\n          document: {\n            // label selection should occur even when element has no focus\n            keydown: function(event) {\n              var\n                pressedKey    = event.which,\n                isShortcutKey = module.is.inObject(pressedKey, keys)\n              ;\n              if(isShortcutKey) {\n                var\n                  $label            = $module.find(selector.label),\n                  $activeLabel      = $label.filter('.' + className.active),\n                  activeValue       = $activeLabel.data(metadata.value),\n                  labelIndex        = $label.index($activeLabel),\n                  labelCount        = $label.length,\n                  hasActiveLabel    = ($activeLabel.length > 0),\n                  hasMultipleActive = ($activeLabel.length > 1),\n                  isFirstLabel      = (labelIndex === 0),\n                  isLastLabel       = (labelIndex + 1 == labelCount),\n                  isSearch          = module.is.searchSelection(),\n                  isFocusedOnSearch = module.is.focusedOnSearch(),\n                  isFocused         = module.is.focused(),\n                  caretAtStart      = (isFocusedOnSearch && module.get.caretPosition() === 0),\n                  $nextLabel\n                ;\n                if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {\n                  return;\n                }\n\n                if(pressedKey == keys.leftArrow) {\n                  // activate previous label\n                  if((isFocused || caretAtStart) && !hasActiveLabel) {\n                    module.verbose('Selecting previous label');\n                    $label.last().addClass(className.active);\n                  }\n                  else if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting previous label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding previous label to selection');\n                    }\n                    if(isFirstLabel && !hasMultipleActive) {\n                      $activeLabel.addClass(className.active);\n                    }\n                    else {\n                      $activeLabel.prev(selector.siblingLabel)\n                        .addClass(className.active)\n                        .end()\n                      ;\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.rightArrow) {\n                  // activate first label\n                  if(isFocused && !hasActiveLabel) {\n                    $label.first().addClass(className.active);\n                  }\n                  // activate next label\n                  if(hasActiveLabel) {\n                    if(!event.shiftKey) {\n                      module.verbose('Selecting next label');\n                      $label.removeClass(className.active);\n                    }\n                    else {\n                      module.verbose('Adding next label to selection');\n                    }\n                    if(isLastLabel) {\n                      if(isSearch) {\n                        if(!isFocusedOnSearch) {\n                          module.focusSearch();\n                        }\n                        else {\n                          $label.removeClass(className.active);\n                        }\n                      }\n                      else if(hasMultipleActive) {\n                        $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                      }\n                      else {\n                        $activeLabel.addClass(className.active);\n                      }\n                    }\n                    else {\n                      $activeLabel.next(selector.siblingLabel).addClass(className.active);\n                    }\n                    event.preventDefault();\n                  }\n                }\n                else if(pressedKey == keys.deleteKey || pressedKey == keys.backspace) {\n                  if(hasActiveLabel) {\n                    module.verbose('Removing active labels');\n                    if(isLastLabel) {\n                      if(isSearch && !isFocusedOnSearch) {\n                        module.focusSearch();\n                      }\n                    }\n                    $activeLabel.last().next(selector.siblingLabel).addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                    event.preventDefault();\n                  }\n                  else if(caretAtStart && !hasActiveLabel && pressedKey == keys.backspace) {\n                    module.verbose('Removing last label on input backspace');\n                    $activeLabel = $label.last().addClass(className.active);\n                    module.remove.activeLabels($activeLabel);\n                  }\n                }\n                else {\n                  $activeLabel.removeClass(className.active);\n                }\n              }\n            }\n          },\n\n          keydown: function(event) {\n            var\n              pressedKey    = event.which,\n              isShortcutKey = module.is.inObject(pressedKey, keys)\n            ;\n            if(isShortcutKey) {\n              var\n                $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),\n                $activeItem        = $menu.children('.' + className.active).eq(0),\n                $selectedItem      = ($currentlySelected.length > 0)\n                  ? $currentlySelected\n                  : $activeItem,\n                $visibleItems = ($selectedItem.length > 0)\n                  ? $selectedItem.siblings(':not(.' + className.filtered +')').addBack()\n                  : $menu.children(':not(.' + className.filtered +')'),\n                $subMenu              = $selectedItem.children(selector.menu),\n                $parentMenu           = $selectedItem.closest(selector.menu),\n                inVisibleMenu         = ($parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0),\n                hasSubMenu            = ($subMenu.length> 0),\n                hasSelectedItem       = ($selectedItem.length > 0),\n                selectedIsSelectable  = ($selectedItem.not(selector.unselectable).length > 0),\n                delimiterPressed      = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),\n                isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),\n                $nextItem,\n                isSubMenuItem,\n                newIndex\n              ;\n              // allow selection with menu closed\n              if(isAdditionWithoutMenu) {\n                module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                $selectedItem[0].click();\n                if(module.is.searchSelection()) {\n                  module.remove.searchTerm();\n                }\n              }\n\n              // visible menu keyboard shortcuts\n              if( module.is.visible() ) {\n\n                // enter (select or open sub-menu)\n                if(pressedKey == keys.enter || delimiterPressed) {\n                  if(pressedKey == keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {\n                    module.verbose('Pressed enter on unselectable category, opening sub menu');\n                    pressedKey = keys.rightArrow;\n                  }\n                  else if(selectedIsSelectable) {\n                    module.verbose('Selecting item from keyboard shortcut', $selectedItem);\n                    $selectedItem[0].click();\n                    if(module.is.searchSelection()) {\n                      module.remove.searchTerm();\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // sub-menu actions\n                if(hasSelectedItem) {\n\n                  if(pressedKey == keys.leftArrow) {\n\n                    isSubMenuItem = ($parentMenu[0] !== $menu[0]);\n\n                    if(isSubMenuItem) {\n                      module.verbose('Left key pressed, closing sub-menu');\n                      module.animate.hide(false, $parentMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $parentMenu\n                        .closest(selector.item)\n                          .addClass(className.selected)\n                      ;\n                      module.aria.refreshDescendant();\n                      event.preventDefault();\n                    }\n                  }\n\n                  // right arrow (show sub-menu)\n                  if(pressedKey == keys.rightArrow) {\n                    if(hasSubMenu) {\n                      module.verbose('Right key pressed, opening sub-menu');\n                      module.animate.show(false, $subMenu);\n                      $selectedItem\n                        .removeClass(className.selected)\n                      ;\n                      $subMenu\n                        .find(selector.item).eq(0)\n                          .addClass(className.selected)\n                      ;\n                      module.aria.refreshDescendant();\n                      event.preventDefault();\n                    }\n                  }\n                }\n\n                // up arrow (traverse menu up)\n                if(pressedKey == keys.upArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($visibleItems.index( $nextItem ) < 0) {\n                    module.verbose('Up key pressed but reached top of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Up key pressed, changing active item');\n                    $selectedItem\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.aria.refreshDescendant();\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // down arrow (traverse menu down)\n                if(pressedKey == keys.downArrow) {\n                  $nextItem = (hasSelectedItem && inVisibleMenu)\n                    ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)\n                    : $item.eq(0)\n                  ;\n                  if($nextItem.length === 0) {\n                    module.verbose('Down key pressed but reached bottom of current menu');\n                    event.preventDefault();\n                    return;\n                  }\n                  else {\n                    module.verbose('Down key pressed, changing active item');\n                    $item\n                      .removeClass(className.selected)\n                    ;\n                    $nextItem\n                      .addClass(className.selected)\n                    ;\n                    module.aria.refreshDescendant();\n                    module.set.scrollPosition($nextItem);\n                    if(settings.selectOnKeydown && module.is.single()) {\n                      module.set.selectedItem($nextItem);\n                    }\n                  }\n                  event.preventDefault();\n                }\n\n                // page down (show next page)\n                if(pressedKey == keys.pageUp) {\n                  module.scrollPage('up');\n                  event.preventDefault();\n                }\n                if(pressedKey == keys.pageDown) {\n                  module.scrollPage('down');\n                  event.preventDefault();\n                }\n\n                // escape (close menu)\n                if(pressedKey == keys.escape) {\n                  module.verbose('Escape key pressed, closing dropdown');\n                  module.hide();\n                }\n\n              }\n              else {\n                // delimiter key\n                if(delimiterPressed) {\n                  event.preventDefault();\n                }\n                // down arrow (open menu)\n                if(pressedKey == keys.downArrow && !module.is.visible()) {\n                  module.verbose('Down key pressed, showing dropdown');\n                  module.show();\n                  event.preventDefault();\n                }\n              }\n            }\n            else {\n              if( !module.has.search() ) {\n                module.set.selectedLetter( String.fromCharCode(pressedKey) );\n              }\n            }\n          }\n        },\n\n        trigger: {\n          change: function() {\n            var\n              events       = document.createEvent('HTMLEvents'),\n              inputElement = $input[0]\n            ;\n            if(inputElement) {\n              module.verbose('Triggering native change event');\n              events.initEvent('change', true, false);\n              inputElement.dispatchEvent(events);\n            }\n          }\n        },\n\n        determine: {\n          selectAction: function(text, value) {\n            module.verbose('Determining action', settings.action);\n            if( $.isFunction( module.action[settings.action] ) ) {\n              module.verbose('Triggering preset action', settings.action, text, value);\n              module.action[ settings.action ].call(element, text, value, this);\n            }\n            else if( $.isFunction(settings.action) ) {\n              module.verbose('Triggering user action', settings.action, text, value);\n              settings.action.call(element, text, value, this);\n            }\n            else {\n              module.error(error.action, settings.action);\n            }\n          },\n          eventInModule: function(event, callback) {\n            var\n              $target    = $(event.target),\n              inDocument = ($target.closest(document.documentElement).length > 0),\n              inModule   = ($target.closest($module).length > 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inDocument && !inModule) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown, canceling callback');\n              return false;\n            }\n          },\n          eventOnElement: function(event, callback) {\n            var\n              $target      = $(event.target),\n              $label       = $target.closest(selector.siblingLabel),\n              inVisibleDOM = document.body.contains(event.target),\n              notOnLabel   = ($module.find($label).length === 0),\n              notInMenu    = ($target.closest($menu).length === 0)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if(inVisibleDOM && notOnLabel && notInMenu) {\n              module.verbose('Triggering event', callback);\n              callback();\n              return true;\n            }\n            else {\n              module.verbose('Event occurred in dropdown menu, canceling callback');\n              return false;\n            }\n          }\n        },\n\n        action: {\n\n          nothing: function() {},\n\n          activate: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.selected(value, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          select: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            if( module.can.activate( $(element) ) ) {\n              module.set.value(value, text, $(element));\n              if(module.is.multiple() && !module.is.allFiltered()) {\n                return;\n              }\n              else {\n                module.hideAndClear();\n              }\n            }\n          },\n\n          combo: function(text, value, element) {\n            value = (value !== undefined)\n              ? value\n              : text\n            ;\n            module.set.selected(value, $(element));\n            module.hideAndClear();\n          },\n\n          hide: function(text, value, element) {\n            module.set.value(value, text);\n            module.hideAndClear();\n          }\n\n        },\n\n        get: {\n          id: function() {\n            return id;\n          },\n          defaultText: function() {\n            return $module.data(metadata.defaultText);\n          },\n          defaultValue: function() {\n            return $module.data(metadata.defaultValue);\n          },\n          placeholderText: function() {\n            if(settings.placeholder != 'auto' && typeof settings.placeholder == 'string') {\n              return settings.placeholder;\n            }\n            return $module.data(metadata.placeholderText) || '';\n          },\n          text: function() {\n            return $text.text();\n          },\n          query: function() {\n            return $.trim($search.val());\n          },\n          searchWidth: function(value) {\n            value = (value !== undefined)\n              ? value\n              : $search.val()\n            ;\n            $sizer.text(value);\n            // prevent rounding issues\n            return Math.ceil( $sizer.width() + 1);\n          },\n          selectionCount: function() {\n            var\n              values = module.get.values(),\n              count\n            ;\n            count = ( module.is.multiple() )\n              ? $.isArray(values)\n                ? values.length\n                : 0\n              : (module.get.value() !== '')\n                ? 1\n                : 0\n            ;\n            return count;\n          },\n          transition: function($subMenu) {\n            return (settings.transition == 'auto')\n              ? module.is.upward($subMenu)\n                ? 'slide up'\n                : 'slide down'\n              : settings.transition\n            ;\n          },\n          userValues: function() {\n            var\n              values = module.get.values()\n            ;\n            if(!values) {\n              return false;\n            }\n            values = $.isArray(values)\n              ? values\n              : [values]\n            ;\n            return $.grep(values, function(value) {\n              return (module.get.item(value) === false);\n            });\n          },\n          uniqueArray: function(array) {\n            return $.grep(array, function (value, index) {\n                return $.inArray(value, array) === index;\n            });\n          },\n          caretPosition: function() {\n            var\n              input = $search.get(0),\n              range,\n              rangeLength\n            ;\n            if('selectionStart' in input) {\n              return input.selectionStart;\n            }\n            else if (document.selection) {\n              input.focus();\n              range       = document.selection.createRange();\n              rangeLength = range.text.length;\n              range.moveStart('character', -input.value.length);\n              return range.text.length - rangeLength;\n            }\n          },\n          value: function() {\n            var\n              value = ($input.length > 0)\n                ? $input.val()\n                : $module.data(metadata.value),\n              isEmptyMultiselect = ($.isArray(value) && value.length === 1 && value[0] === '')\n            ;\n            // prevents placeholder element from being selected when multiple\n            return (value === undefined || isEmptyMultiselect)\n              ? ''\n              : value\n            ;\n          },\n          values: function() {\n            var\n              value = module.get.value()\n            ;\n            if(value === '') {\n              return '';\n            }\n            return ( !module.has.selectInput() && module.is.multiple() )\n              ? (typeof value == 'string') // delimited string\n                ? value.split(settings.delimiter)\n                : ''\n              : value\n            ;\n          },\n          remoteValues: function() {\n            var\n              values = module.get.values(),\n              remoteValues = false\n            ;\n            if(values) {\n              if(typeof values == 'string') {\n                values = [values];\n              }\n              $.each(values, function(index, value) {\n                var\n                  name = module.read.remoteData(value)\n                ;\n                module.verbose('Restoring value from session data', name, value);\n                if(name) {\n                  if(!remoteValues) {\n                    remoteValues = {};\n                  }\n                  remoteValues[value] = name;\n                }\n              });\n            }\n            return remoteValues;\n          },\n          choiceText: function($choice, preserveHTML) {\n            preserveHTML = (preserveHTML !== undefined)\n              ? preserveHTML\n              : settings.preserveHTML\n            ;\n            if($choice) {\n              if($choice.find(selector.menu).length > 0) {\n                module.verbose('Retrieving text of element with sub-menu');\n                $choice = $choice.clone();\n                $choice.find(selector.menu).remove();\n                $choice.find(selector.menuIcon).remove();\n              }\n              return ($choice.data(metadata.text) !== undefined)\n                ? $choice.data(metadata.text)\n                : (preserveHTML)\n                  ? $.trim($choice.html())\n                  : $.trim($choice.text())\n              ;\n            }\n          },\n          choiceValue: function($choice, choiceText) {\n            choiceText = choiceText || module.get.choiceText($choice);\n            if(!$choice) {\n              return false;\n            }\n            return ($choice.data(metadata.value) !== undefined)\n              ? String( $choice.data(metadata.value) )\n              : (typeof choiceText === 'string')\n                ? $.trim(choiceText.toLowerCase())\n                : String(choiceText)\n            ;\n          },\n          inputEvent: function() {\n            var\n              input = $search[0]\n            ;\n            if(input) {\n              return (input.oninput !== undefined)\n                ? 'input'\n                : (input.onpropertychange !== undefined)\n                  ? 'propertychange'\n                  : 'keyup'\n              ;\n            }\n            return false;\n          },\n          selectValues: function() {\n            var\n              select = {}\n            ;\n            select.values = [];\n            $module\n              .find('option')\n                .each(function() {\n                  var\n                    $option  = $(this),\n                    name     = $option.html(),\n                    disabled = $option.attr('disabled'),\n                    value    = ( $option.attr('value') !== undefined )\n                      ? $option.attr('value')\n                      : name\n                  ;\n                  if(settings.placeholder === 'auto' && value === '') {\n                    select.placeholder = name;\n                  }\n                  else {\n                    select.values.push({\n                      name     : name,\n                      value    : value,\n                      disabled : disabled\n                    });\n                  }\n                })\n            ;\n            if(settings.placeholder && settings.placeholder !== 'auto') {\n              module.debug('Setting placeholder value to', settings.placeholder);\n              select.placeholder = settings.placeholder;\n            }\n            if(settings.sortSelect) {\n              select.values.sort(function(a, b) {\n                return (a.name > b.name)\n                  ? 1\n                  : -1\n                ;\n              });\n              module.debug('Retrieved and sorted values from select', select);\n            }\n            else {\n              module.debug('Retrieved values from select', select);\n            }\n            return select;\n          },\n          activeItem: function() {\n            return $item.filter('.'  + className.active);\n          },\n          selectedItem: function() {\n            var\n              $selectedItem = $item.not(selector.unselectable).filter('.'  + className.selected)\n            ;\n            return ($selectedItem.length > 0)\n              ? $selectedItem\n              : $item.eq(0)\n            ;\n          },\n          itemWithAdditions: function(value) {\n            var\n              $items       = module.get.item(value),\n              $userItems   = module.create.userChoice(value),\n              hasUserItems = ($userItems && $userItems.length > 0)\n            ;\n            if(hasUserItems) {\n              $items = ($items.length > 0)\n                ? $items.add($userItems)\n                : $userItems\n              ;\n            }\n            return $items;\n          },\n          item: function(value, strict) {\n            var\n              $selectedItem = false,\n              shouldSearch,\n              isMultiple\n            ;\n            value = (value !== undefined)\n              ? value\n              : ( module.get.values() !== undefined)\n                ? module.get.values()\n                : module.get.text()\n            ;\n            shouldSearch = (isMultiple)\n              ? (value.length > 0)\n              : (value !== undefined && value !== null)\n            ;\n            isMultiple = (module.is.multiple() && $.isArray(value));\n            strict     = (value === '' || value === 0)\n              ? true\n              : strict || false\n            ;\n            if(shouldSearch) {\n              $item\n                .each(function() {\n                  var\n                    $choice       = $(this),\n                    optionText    = module.get.choiceText($choice),\n                    optionValue   = module.get.choiceValue($choice, optionText)\n                  ;\n                  // safe early exit\n                  if(optionValue === null || optionValue === undefined) {\n                    return;\n                  }\n                  if(isMultiple) {\n                    if($.inArray( String(optionValue), value) !== -1 || $.inArray(optionText, value) !== -1) {\n                      $selectedItem = ($selectedItem)\n                        ? $selectedItem.add($choice)\n                        : $choice\n                      ;\n                    }\n                  }\n                  else if(strict) {\n                    module.verbose('Ambiguous dropdown value using strict type check', $choice, value);\n                    if( optionValue === value || optionText === value) {\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                  else {\n                    if( String(optionValue) == String(value) || optionText == value) {\n                      module.verbose('Found select item by value', optionValue, value);\n                      $selectedItem = $choice;\n                      return true;\n                    }\n                  }\n                })\n              ;\n            }\n            return $selectedItem;\n          }\n        },\n\n        check: {\n          maxSelections: function(selectionCount) {\n            if(settings.maxSelections) {\n              selectionCount = (selectionCount !== undefined)\n                ? selectionCount\n                : module.get.selectionCount()\n              ;\n              if(selectionCount >= settings.maxSelections) {\n                module.debug('Maximum selection count reached');\n                if(settings.useLabels) {\n                  $item.addClass(className.filtered);\n                  module.add.message(message.maxSelections);\n                }\n                return true;\n              }\n              else {\n                module.verbose('No longer at maximum selection count');\n                module.remove.message();\n                module.remove.filteredItem();\n                if(module.is.searchSelection()) {\n                  module.filterItems();\n                }\n                return false;\n              }\n            }\n            return true;\n          }\n        },\n\n        restore: {\n          defaults: function() {\n            module.clear();\n            module.restore.defaultText();\n            module.restore.defaultValue();\n          },\n          defaultText: function() {\n            var\n              defaultText     = module.get.defaultText(),\n              placeholderText = module.get.placeholderText\n            ;\n            if(defaultText === placeholderText) {\n              module.debug('Restoring default placeholder text', defaultText);\n              module.set.placeholderText(defaultText);\n            }\n            else {\n              module.debug('Restoring default text', defaultText);\n              module.set.text(defaultText);\n            }\n          },\n          placeholderText: function() {\n            module.set.placeholderText();\n          },\n          defaultValue: function() {\n            var\n              defaultValue = module.get.defaultValue()\n            ;\n            if(defaultValue !== undefined) {\n              module.debug('Restoring default value', defaultValue);\n              if(defaultValue !== '') {\n                module.set.value(defaultValue);\n                module.set.selected();\n              }\n              else {\n                module.remove.activeItem();\n                module.remove.selectedItem();\n              }\n            }\n          },\n          labels: function() {\n            if(settings.allowAdditions) {\n              if(!settings.useLabels) {\n                module.error(error.labels);\n                settings.useLabels = true;\n              }\n              module.debug('Restoring selected values');\n              module.create.userLabels();\n            }\n            module.check.maxSelections();\n          },\n          selected: function() {\n            module.restore.values();\n            if(module.is.multiple()) {\n              module.debug('Restoring previously selected values and labels');\n              module.restore.labels();\n            }\n            else {\n              module.debug('Restoring previously selected values');\n            }\n          },\n          values: function() {\n            // prevents callbacks from occurring on initial load\n            module.set.initialLoad();\n            if(settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {\n              module.restore.remoteValues();\n            }\n            else {\n              module.set.selected();\n            }\n            module.remove.initialLoad();\n          },\n          remoteValues: function() {\n            var\n              values = module.get.remoteValues()\n            ;\n            module.debug('Recreating selected from session data', values);\n            if(values) {\n              if( module.is.single() ) {\n                $.each(values, function(value, name) {\n                  module.set.text(name);\n                });\n              }\n              else {\n                $.each(values, function(value, name) {\n                  module.add.label(value, name);\n                });\n              }\n            }\n          }\n        },\n\n        read: {\n          remoteData: function(value) {\n            var\n              name\n            ;\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            name = sessionStorage.getItem(value);\n            return (name !== undefined)\n              ? name\n              : false\n            ;\n          }\n        },\n\n        save: {\n          defaults: function() {\n            module.save.defaultText();\n            module.save.placeholderText();\n            module.save.defaultValue();\n          },\n          defaultValue: function() {\n            var\n              value = module.get.value()\n            ;\n            module.verbose('Saving default value as', value);\n            $module.data(metadata.defaultValue, value);\n          },\n          defaultText: function() {\n            var\n              text = module.get.text()\n            ;\n            module.verbose('Saving default text as', text);\n            $module.data(metadata.defaultText, text);\n          },\n          placeholderText: function() {\n            var\n              text\n            ;\n            if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {\n              text = module.get.text();\n              module.verbose('Saving placeholder text as', text);\n              $module.data(metadata.placeholderText, text);\n            }\n          },\n          remoteData: function(name, value) {\n            if(window.Storage === undefined) {\n              module.error(error.noStorage);\n              return;\n            }\n            module.verbose('Saving remote data to session storage', value, name);\n            sessionStorage.setItem(value, name);\n          }\n        },\n\n        clear: function() {\n          if(module.is.multiple() && settings.useLabels) {\n            module.remove.labels();\n          }\n          else {\n            module.remove.activeItem();\n            module.remove.selectedItem();\n          }\n          module.set.placeholderText();\n          module.clearValue();\n        },\n\n        clearValue: function() {\n          module.set.value('');\n        },\n\n        scrollPage: function(direction, $selectedItem) {\n          var\n            $currentItem  = $selectedItem || module.get.selectedItem(),\n            $menu         = $currentItem.closest(selector.menu),\n            menuHeight    = $menu.outerHeight(),\n            currentScroll = $menu.scrollTop(),\n            itemHeight    = $item.eq(0).outerHeight(),\n            itemsPerPage  = Math.floor(menuHeight / itemHeight),\n            maxScroll     = $menu.prop('scrollHeight'),\n            newScroll     = (direction == 'up')\n              ? currentScroll - (itemHeight * itemsPerPage)\n              : currentScroll + (itemHeight * itemsPerPage),\n            $selectableItem = $item.not(selector.unselectable),\n            isWithinRange,\n            $nextSelectedItem,\n            elementIndex\n          ;\n          elementIndex      = (direction == 'up')\n            ? $selectableItem.index($currentItem) - itemsPerPage\n            : $selectableItem.index($currentItem) + itemsPerPage\n          ;\n          isWithinRange = (direction == 'up')\n            ? (elementIndex >= 0)\n            : (elementIndex < $selectableItem.length)\n          ;\n          $nextSelectedItem = (isWithinRange)\n            ? $selectableItem.eq(elementIndex)\n            : (direction == 'up')\n              ? $selectableItem.first()\n              : $selectableItem.last()\n          ;\n          if($nextSelectedItem.length > 0) {\n            module.debug('Scrolling page', direction, $nextSelectedItem);\n            $currentItem\n              .removeClass(className.selected)\n            ;\n            $nextSelectedItem\n              .addClass(className.selected)\n            ;\n            if(settings.selectOnKeydown && module.is.single()) {\n              module.set.selectedItem($nextSelectedItem);\n            }\n            $menu\n              .scrollTop(newScroll)\n            ;\n          }\n        },\n\n        set: {\n          filtered: function() {\n            var\n              isMultiple       = module.is.multiple(),\n              isSearch         = module.is.searchSelection(),\n              isSearchMultiple = (isMultiple && isSearch),\n              searchValue      = (isSearch)\n                ? module.get.query()\n                : '',\n              hasSearchValue   = (typeof searchValue === 'string' && searchValue.length > 0),\n              searchWidth      = module.get.searchWidth(),\n              valueIsSet       = searchValue !== ''\n            ;\n            if(isMultiple && hasSearchValue) {\n              module.verbose('Adjusting input width', searchWidth, settings.glyphWidth);\n              $search.css('width', searchWidth);\n            }\n            if(hasSearchValue || (isSearchMultiple && valueIsSet)) {\n              module.verbose('Hiding placeholder text');\n              $text.addClass(className.filtered);\n            }\n            else if(!isMultiple || (isSearchMultiple && !valueIsSet)) {\n              module.verbose('Showing placeholder text');\n              $text.removeClass(className.filtered);\n            }\n          },\n          empty: function() {\n            $module.addClass(className.empty);\n          },\n          loading: function() {\n            $module.addClass(className.loading);\n          },\n          placeholderText: function(text) {\n            text = text || module.get.placeholderText();\n            module.debug('Setting placeholder text', text);\n            module.set.text(text);\n            $text.addClass(className.placeholder);\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Added tabindex to searchable dropdown');\n              $search\n                .val('')\n                .attr('tabindex', 0)\n              ;\n              $menu\n                .attr('tabindex', -1)\n              ;\n            }\n            else {\n              module.debug('Added tabindex to dropdown');\n              if( $module.attr('tabindex') === undefined) {\n                $module\n                  .attr('tabindex', 0)\n                ;\n                $menu\n                  .attr('tabindex', -1)\n                ;\n              }\n            }\n          },\n          initialLoad: function() {\n            module.verbose('Setting initial load');\n            initialLoad = true;\n          },\n          activeItem: function($item) {\n            if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {\n              $item.addClass(className.filtered);\n            }\n            else {\n              $item.addClass(className.active);\n            }\n          },\n          partialSearch: function(text) {\n            var\n              length = module.get.query().length\n            ;\n            $search.val( text.substr(0, length));\n          },\n          scrollPosition: function($item, forceScroll) {\n            var\n              edgeTolerance = 5,\n              $menu,\n              hasActive,\n              offset,\n              itemHeight,\n              itemOffset,\n              menuOffset,\n              menuScroll,\n              menuHeight,\n              abovePage,\n              belowPage\n            ;\n\n            $item       = $item || module.get.selectedItem();\n            $menu       = $item.closest(selector.menu);\n            hasActive   = ($item && $item.length > 0);\n            forceScroll = (forceScroll !== undefined)\n              ? forceScroll\n              : false\n            ;\n            if($item && $menu.length > 0 && hasActive) {\n              itemOffset = $item.position().top;\n\n              $menu.addClass(className.loading);\n              menuScroll = $menu.scrollTop();\n              menuOffset = $menu.offset().top;\n              itemOffset = $item.offset().top;\n              offset     = menuScroll - menuOffset + itemOffset;\n              if(!forceScroll) {\n                menuHeight = $menu.height();\n                belowPage  = menuScroll + menuHeight < (offset + edgeTolerance);\n                abovePage  = ((offset - edgeTolerance) < menuScroll);\n              }\n              module.debug('Scrolling to active item', offset);\n              if(forceScroll || abovePage || belowPage) {\n                $menu.scrollTop(offset);\n              }\n              $menu.removeClass(className.loading);\n            }\n          },\n          text: function(text) {\n            if(settings.action !== 'select') {\n              if(settings.action == 'combo') {\n                module.debug('Changing combo button text', text, $combo);\n                if(settings.preserveHTML) {\n                  $combo.html(text);\n                }\n                else {\n                  $combo.text(text);\n                }\n              }\n              else {\n                if(text !== module.get.placeholderText()) {\n                  $text.removeClass(className.placeholder);\n                }\n                module.debug('Changing text', text, $text);\n                $text\n                  .removeClass(className.filtered)\n                ;\n                if(settings.preserveHTML) {\n                  $text.html(text);\n                }\n                else {\n                  $text.text(text);\n                }\n              }\n            }\n          },\n          selectedItem: function($item) {\n            var\n              value      = module.get.choiceValue($item),\n              searchText = module.get.choiceText($item, false),\n              text       = module.get.choiceText($item, true)\n            ;\n            module.debug('Setting user selection to item', $item);\n            module.remove.activeItem();\n            module.set.partialSearch(searchText);\n            module.set.activeItem($item);\n            module.set.selected(value, $item);\n            module.set.text(text);\n          },\n          selectedLetter: function(letter) {\n            var\n              $selectedItem         = $item.filter('.' + className.selected),\n              alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),\n              $nextValue            = false,\n              $nextItem\n            ;\n            // check next of same letter\n            if(alreadySelectedLetter) {\n              $nextItem = $selectedItem.nextAll($item).eq(0);\n              if( module.has.firstLetter($nextItem, letter) ) {\n                $nextValue  = $nextItem;\n              }\n            }\n            // check all values\n            if(!$nextValue) {\n              $item\n                .each(function(){\n                  if(module.has.firstLetter($(this), letter)) {\n                    $nextValue = $(this);\n                    return false;\n                  }\n                })\n              ;\n            }\n            // set next value\n            if($nextValue) {\n              module.verbose('Scrolling to next value with letter', letter);\n              module.set.scrollPosition($nextValue);\n              $selectedItem.removeClass(className.selected);\n              $nextValue.addClass(className.selected);\n              module.aria.refreshDescendant();\n              if(settings.selectOnKeydown && module.is.single()) {\n                module.set.selectedItem($nextValue);\n              }\n            }\n          },\n          direction: function($menu) {\n            if(settings.direction == 'auto') {\n              // reset position\n              module.remove.upward();\n\n              if(module.can.openDownward($menu)) {\n                module.remove.upward($menu);\n              }\n              else {\n                module.set.upward($menu);\n              }\n              if(!module.is.leftward($menu) && !module.can.openRightward($menu)) {\n                module.set.leftward($menu);\n              }\n            }\n            else if(settings.direction == 'upward') {\n              module.set.upward($menu);\n            }\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.addClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.addClass(className.leftward);\n          },\n          value: function(value, text, $selected) {\n            var\n              escapedValue = module.escape.value(value),\n              hasInput     = ($input.length > 0),\n              currentValue = module.get.values(),\n              stringValue  = (value !== undefined)\n                ? String(value)\n                : value,\n              newValue\n            ;\n            if(hasInput) {\n              if(!settings.allowReselection && stringValue == currentValue) {\n                module.verbose('Skipping value update already same value', value, currentValue);\n                if(!module.is.initialLoad()) {\n                  return;\n                }\n              }\n\n              if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {\n                module.debug('Adding user option', value);\n                module.add.optionValue(value);\n              }\n              module.debug('Updating input value', escapedValue, currentValue);\n              internalChange = true;\n              $input\n                .val(escapedValue)\n              ;\n              if(settings.fireOnInit === false && module.is.initialLoad()) {\n                module.debug('Input native change event ignored on initial load');\n              }\n              else {\n                module.trigger.change();\n              }\n              internalChange = false;\n            }\n            else {\n              module.verbose('Storing value in metadata', escapedValue, $input);\n              if(escapedValue !== currentValue) {\n                $module.data(metadata.value, stringValue);\n              }\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onChange);\n            }\n            else {\n              settings.onChange.call(element, value, text, $selected);\n            }\n          },\n          active: function() {\n            $module\n              .addClass(className.active)\n            ;\n          },\n          multiple: function() {\n            $module.addClass(className.multiple);\n          },\n          visible: function() {\n            $module.addClass(className.visible);\n          },\n          exactly: function(value, $selectedItem) {\n            module.debug('Setting selected to exact values');\n            module.clear();\n            module.set.selected(value, $selectedItem);\n          },\n          selected: function(value, $selectedItem) {\n            var\n              isMultiple = module.is.multiple(),\n              $userSelectedItem\n            ;\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n            if(!$selectedItem) {\n              return;\n            }\n            module.debug('Setting selected menu item to', $selectedItem);\n            if(module.is.multiple()) {\n              module.remove.searchWidth();\n            }\n            if(module.is.single()) {\n              module.remove.activeItem();\n              module.remove.selectedItem();\n            }\n            else if(settings.useLabels) {\n              module.remove.selectedItem();\n            }\n            // select each item\n            $selectedItem\n              .each(function() {\n                var\n                  $selected      = $(this),\n                  selectedText   = module.get.choiceText($selected),\n                  selectedValue  = module.get.choiceValue($selected, selectedText),\n\n                  isFiltered     = $selected.hasClass(className.filtered),\n                  isActive       = $selected.hasClass(className.active),\n                  isUserValue    = $selected.hasClass(className.addition),\n                  shouldAnimate  = (isMultiple && $selectedItem.length == 1)\n                ;\n                if(isMultiple) {\n                  if(!isActive || isUserValue) {\n                    if(settings.apiSettings && settings.saveRemoteData) {\n                      module.save.remoteData(selectedText, selectedValue);\n                    }\n                    if(settings.useLabels) {\n                      module.add.label(selectedValue, selectedText, shouldAnimate);\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.activeItem($selected);\n                      module.filterActive();\n                      module.select.nextAvailable($selectedItem);\n                    }\n                    else {\n                      module.add.value(selectedValue, selectedText, $selected);\n                      module.set.text(module.add.variables(message.count));\n                      module.set.activeItem($selected);\n                    }\n                  }\n                  else if(!isFiltered) {\n                    module.debug('Selected active value, removing label');\n                    module.remove.selected(selectedValue);\n                  }\n                }\n                else {\n                  if(settings.apiSettings && settings.saveRemoteData) {\n                    module.save.remoteData(selectedText, selectedValue);\n                  }\n                  module.set.text(selectedText);\n                  module.set.value(selectedValue, selectedText, $selected);\n                  $selected\n                    .addClass(className.active)\n                    .addClass(className.selected)\n                  ;\n                }\n              })\n            ;\n          }\n        },\n\n        add: {\n          label: function(value, text, shouldAnimate) {\n            var\n              $next  = module.is.searchSelection()\n                ? $search\n                : $text,\n              escapedValue = module.escape.value(value),\n              $label\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            $label =  $('<a />')\n              .addClass(className.label)\n              .attr('data-' + metadata.value, escapedValue)\n              .html(templates.label(escapedValue, text))\n            ;\n            $label = settings.onLabelCreate.call($label, escapedValue, text);\n\n            if(module.has.label(value)) {\n              module.debug('User selection already exists, skipping', escapedValue);\n              return;\n            }\n            if(settings.label.variation) {\n              $label.addClass(settings.label.variation);\n            }\n            if(shouldAnimate === true) {\n              module.debug('Animating in label', $label);\n              $label\n                .addClass(className.hidden)\n                .insertBefore($next)\n                .transition(settings.label.transition, settings.label.duration)\n              ;\n            }\n            else {\n              module.debug('Adding selection label', $label);\n              $label\n                .insertBefore($next)\n              ;\n            }\n          },\n          message: function(message) {\n            var\n              $message = $menu.children(selector.message),\n              html     = settings.templates.message(module.add.variables(message))\n            ;\n            if($message.length > 0) {\n              $message\n                .html(html)\n              ;\n            }\n            else {\n              $message = $('<div/>')\n                .html(html)\n                .addClass(className.message)\n                .appendTo($menu)\n              ;\n            }\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(hasOption) {\n              return;\n            }\n            // temporarily disconnect observer\n            module.disconnect.selectObserver();\n            if( module.is.single() ) {\n              module.verbose('Removing previous user addition');\n              $input.find('option.' + className.addition).remove();\n            }\n            $('<option/>')\n              .prop('value', escapedValue)\n              .addClass(className.addition)\n              .html(value)\n              .appendTo($input)\n            ;\n            module.verbose('Adding user addition as an <option>', value);\n            module.observe.select();\n          },\n          userSuggestion: function(value) {\n            var\n              $addition         = $menu.children(selector.addition),\n              $existingItem     = module.get.item(value),\n              alreadyHasValue   = $existingItem && $existingItem.not(selector.addition).length,\n              hasUserSuggestion = $addition.length > 0,\n              html\n            ;\n            if(settings.useLabels && module.has.maxSelections()) {\n              return;\n            }\n            if(value === '' || alreadyHasValue) {\n              $addition.remove();\n              return;\n            }\n            if(hasUserSuggestion) {\n              $addition\n                .data(metadata.value, value)\n                .data(metadata.text, value)\n                .attr('data-' + metadata.value, value)\n                .attr('data-' + metadata.text, value)\n                .removeClass(className.filtered)\n              ;\n              if(!settings.hideAdditions) {\n                html = settings.templates.addition( module.add.variables(message.addResult, value) );\n                $addition\n                  .html(html)\n                ;\n              }\n              module.verbose('Replacing user suggestion with new value', $addition);\n            }\n            else {\n              $addition = module.create.userChoice(value);\n              $addition\n                .prependTo($menu)\n              ;\n              module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);\n            }\n            if(!settings.hideAdditions || module.is.allFiltered()) {\n              $addition\n                .addClass(className.selected)\n                .siblings()\n                .removeClass(className.selected)\n              ;\n            }\n            module.refreshItems();\n          },\n          variables: function(message, term) {\n            var\n              hasCount    = (message.search('{count}') !== -1),\n              hasMaxCount = (message.search('{maxCount}') !== -1),\n              hasTerm     = (message.search('{term}') !== -1),\n              values,\n              count,\n              query\n            ;\n            module.verbose('Adding templated variables to message', message);\n            if(hasCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{count}', count);\n            }\n            if(hasMaxCount) {\n              count  = module.get.selectionCount();\n              message = message.replace('{maxCount}', settings.maxSelections);\n            }\n            if(hasTerm) {\n              query   = term || module.get.query();\n              message = message.replace('{term}', query);\n            }\n            return message;\n          },\n          value: function(addedValue, addedText, $selectedItem) {\n            var\n              currentValue = module.get.values(),\n              newValue\n            ;\n            if(module.has.value(addedValue)) {\n              module.debug('Value already selected');\n              return;\n            }\n            if(addedValue === '') {\n              module.debug('Cannot select blank values from multiselect');\n              return;\n            }\n            // extend current array\n            if($.isArray(currentValue)) {\n              newValue = currentValue.concat([addedValue]);\n              newValue = module.get.uniqueArray(newValue);\n            }\n            else {\n              newValue = [addedValue];\n            }\n            // add values\n            if( module.has.selectInput() ) {\n              if(module.can.extendSelect()) {\n                module.debug('Adding value to select', addedValue, newValue, $input);\n                module.add.optionValue(addedValue);\n              }\n            }\n            else {\n              newValue = newValue.join(settings.delimiter);\n              module.debug('Setting hidden input to delimited value', newValue, $input);\n            }\n\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('Skipping onadd callback on initial load', settings.onAdd);\n            }\n            else {\n              settings.onAdd.call(element, addedValue, addedText, $selectedItem);\n            }\n            module.set.value(newValue, addedValue, addedText, $selectedItem);\n            module.check.maxSelections();\n          }\n        },\n\n        remove: {\n          active: function() {\n            $module.removeClass(className.active);\n          },\n          activeLabel: function() {\n            $module.find(selector.label).removeClass(className.active);\n          },\n          empty: function() {\n            $module.removeClass(className.empty);\n          },\n          loading: function() {\n            $module.removeClass(className.loading);\n          },\n          initialLoad: function() {\n            initialLoad = false;\n          },\n          upward: function($currentMenu) {\n            var $element = $currentMenu || $module;\n            $element.removeClass(className.upward);\n          },\n          leftward: function($currentMenu) {\n            var $element = $currentMenu || $menu;\n            $element.removeClass(className.leftward);\n          },\n          visible: function() {\n            $module.removeClass(className.visible);\n          },\n          activeItem: function() {\n            $item.removeClass(className.active);\n          },\n          filteredItem: function() {\n            if(settings.useLabels && module.has.maxSelections() ) {\n              return;\n            }\n            if(settings.useLabels && module.is.multiple()) {\n              $item.not('.' + className.active).removeClass(className.filtered);\n            }\n            else {\n              $item.removeClass(className.filtered);\n            }\n            module.remove.empty();\n          },\n          optionValue: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $option      = $input.find('option[value=\"' + module.escape.string(escapedValue) + '\"]'),\n              hasOption    = ($option.length > 0)\n            ;\n            if(!hasOption || !$option.hasClass(className.addition)) {\n              return;\n            }\n            // temporarily disconnect observer\n            if(selectObserver) {\n              selectObserver.disconnect();\n              module.verbose('Temporarily disconnecting mutation observer');\n            }\n            $option.remove();\n            module.verbose('Removing user addition as an <option>', escapedValue);\n            if(selectObserver) {\n              selectObserver.observe($input[0], {\n                childList : true,\n                subtree   : true\n              });\n            }\n          },\n          message: function() {\n            $menu.children(selector.message).remove();\n          },\n          searchWidth: function() {\n            $search.css('width', '');\n          },\n          searchTerm: function() {\n            module.verbose('Cleared search term');\n            $search.val('');\n            module.set.filtered();\n          },\n          userAddition: function() {\n            $item.filter(selector.addition).remove();\n          },\n          selected: function(value, $selectedItem) {\n            $selectedItem = (settings.allowAdditions)\n              ? $selectedItem || module.get.itemWithAdditions(value)\n              : $selectedItem || module.get.item(value)\n            ;\n\n            if(!$selectedItem) {\n              return false;\n            }\n\n            $selectedItem\n              .each(function() {\n                var\n                  $selected     = $(this),\n                  selectedText  = module.get.choiceText($selected),\n                  selectedValue = module.get.choiceValue($selected, selectedText)\n                ;\n                if(module.is.multiple()) {\n                  if(settings.useLabels) {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    module.remove.label(selectedValue);\n                  }\n                  else {\n                    module.remove.value(selectedValue, selectedText, $selected);\n                    if(module.get.selectionCount() === 0) {\n                      module.set.placeholderText();\n                    }\n                    else {\n                      module.set.text(module.add.variables(message.count));\n                    }\n                  }\n                }\n                else {\n                  module.remove.value(selectedValue, selectedText, $selected);\n                }\n                $selected\n                  .removeClass(className.filtered)\n                  .removeClass(className.active)\n                ;\n                if(settings.useLabels) {\n                  $selected.removeClass(className.selected);\n                }\n              })\n            ;\n          },\n          selectedItem: function() {\n            $item.removeClass(className.selected);\n          },\n          value: function(removedValue, removedText, $removedItem) {\n            var\n              values = module.get.values(),\n              newValue\n            ;\n            if( module.has.selectInput() ) {\n              module.verbose('Input is <select> removing selected option', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              module.remove.optionValue(removedValue);\n            }\n            else {\n              module.verbose('Removing from delimited values', removedValue);\n              newValue = module.remove.arrayValue(removedValue, values);\n              newValue = newValue.join(settings.delimiter);\n            }\n            if(settings.fireOnInit === false && module.is.initialLoad()) {\n              module.verbose('No callback on initial load', settings.onRemove);\n            }\n            else {\n              settings.onRemove.call(element, removedValue, removedText, $removedItem);\n            }\n            module.set.value(newValue, removedText, $removedItem);\n            module.check.maxSelections();\n          },\n          arrayValue: function(removedValue, values) {\n            if( !$.isArray(values) ) {\n              values = [values];\n            }\n            values = $.grep(values, function(value){\n              return (removedValue != value);\n            });\n            module.verbose('Removed value from delimited string', removedValue, values);\n            return values;\n          },\n          label: function(value, shouldAnimate) {\n            var\n              $labels       = $module.find(selector.label),\n              $removedLabel = $labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(value) +'\"]')\n            ;\n            module.verbose('Removing label', $removedLabel);\n            $removedLabel.remove();\n          },\n          activeLabels: function($activeLabels) {\n            $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);\n            module.verbose('Removing active label selections', $activeLabels);\n            module.remove.labels($activeLabels);\n          },\n          labels: function($labels) {\n            $labels = $labels || $module.find(selector.label);\n            module.verbose('Removing labels', $labels);\n            $labels\n              .each(function(){\n                var\n                  $label      = $(this),\n                  value       = $label.data(metadata.value),\n                  stringValue = (value !== undefined)\n                    ? String(value)\n                    : value,\n                  isUserValue = module.is.userValue(stringValue)\n                ;\n                if(settings.onLabelRemove.call($label, value) === false) {\n                  module.debug('Label remove callback cancelled removal');\n                  return;\n                }\n                module.remove.message();\n                if(isUserValue) {\n                  module.remove.value(stringValue);\n                  module.remove.label(stringValue);\n                }\n                else {\n                  // selected will also remove label\n                  module.remove.selected(stringValue);\n                }\n              })\n            ;\n          },\n          tabbable: function() {\n            if( module.is.searchSelection() ) {\n              module.debug('Searchable dropdown initialized');\n              $search\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n            else {\n              module.debug('Simple selection dropdown initialized');\n              $module\n                .removeAttr('tabindex')\n              ;\n              $menu\n                .removeAttr('tabindex')\n              ;\n            }\n          }\n        },\n\n        has: {\n          menuSearch: function() {\n            return (module.has.search() && $search.closest($menu).length > 0);\n          },\n          search: function() {\n            return ($search.length > 0);\n          },\n          sizer: function() {\n            return ($sizer.length > 0);\n          },\n          selectInput: function() {\n            return ( $input.is('select') );\n          },\n          minCharacters: function(searchTerm) {\n            if(settings.minCharacters) {\n              searchTerm = (searchTerm !== undefined)\n                ? String(searchTerm)\n                : String(module.get.query())\n              ;\n              return (searchTerm.length >= settings.minCharacters);\n            }\n            return true;\n          },\n          firstLetter: function($item, letter) {\n            var\n              text,\n              firstLetter\n            ;\n            if(!$item || $item.length === 0 || typeof letter !== 'string') {\n              return false;\n            }\n            text        = module.get.choiceText($item, false);\n            letter      = letter.toLowerCase();\n            firstLetter = String(text).charAt(0).toLowerCase();\n            return (letter == firstLetter);\n          },\n          input: function() {\n            return ($input.length > 0);\n          },\n          items: function() {\n            return ($item.length > 0);\n          },\n          menu: function() {\n            return ($menu.length > 0);\n          },\n          message: function() {\n            return ($menu.children(selector.message).length !== 0);\n          },\n          label: function(value) {\n            var\n              escapedValue = module.escape.value(value),\n              $labels      = $module.find(selector.label)\n            ;\n            if(settings.ignoreCase) {\n              escapedValue = escapedValue.toLowerCase();\n            }\n            return ($labels.filter('[data-' + metadata.value + '=\"' + module.escape.string(escapedValue) +'\"]').length > 0);\n          },\n          maxSelections: function() {\n            return (settings.maxSelections && module.get.selectionCount() >= settings.maxSelections);\n          },\n          allResultsFiltered: function() {\n            var\n              $normalResults = $item.not(selector.addition)\n            ;\n            return ($normalResults.filter(selector.unselectable).length === $normalResults.length);\n          },\n          userSuggestion: function() {\n            return ($menu.children(selector.addition).length > 0);\n          },\n          query: function() {\n            return (module.get.query() !== '');\n          },\n          value: function(value) {\n            return (settings.ignoreCase)\n              ? module.has.valueIgnoringCase(value)\n              : module.has.valueMatchingCase(value)\n            ;\n          },\n          valueMatchingCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = $.isArray(values)\n               ? values && ($.inArray(value, values) !== -1)\n               : (values == value)\n            ;\n            return (hasValue)\n              ? true\n              : false\n            ;\n          },\n          valueIgnoringCase: function(value) {\n            var\n              values   = module.get.values(),\n              hasValue = false\n            ;\n            if(!$.isArray(values)) {\n              values = [values];\n            }\n            $.each(values, function(index, existingValue) {\n              if(String(value).toLowerCase() == String(existingValue).toLowerCase()) {\n                hasValue = true;\n                return false;\n              }\n            });\n            return hasValue;\n          }\n        },\n\n        is: {\n          active: function() {\n            return $module.hasClass(className.active);\n          },\n          animatingInward: function() {\n            return $menu.transition('is inward');\n          },\n          animatingOutward: function() {\n            return $menu.transition('is outward');\n          },\n          bubbledLabelClick: function(event) {\n            return $(event.target).is('select, input') && $module.closest('label').length > 0;\n          },\n          bubbledIconClick: function(event) {\n            return $(event.target).closest($icon).length > 0;\n          },\n          alreadySetup: function() {\n            return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);\n          },\n          animating: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.transition && $subMenu.transition('is animating')\n              : $menu.transition    && $menu.transition('is animating')\n            ;\n          },\n          leftward: function($subMenu) {\n            var $selectedMenu = $subMenu || $menu;\n            return $selectedMenu.hasClass(className.leftward);\n          },\n          disabled: function() {\n            return $module.hasClass(className.disabled);\n          },\n          focused: function() {\n            return (document.activeElement === $module[0]);\n          },\n          focusedOnSearch: function() {\n            return (document.activeElement === $search[0]);\n          },\n          allFiltered: function() {\n            return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );\n          },\n          hidden: function($subMenu) {\n            return !module.is.visible($subMenu);\n          },\n          initialLoad: function() {\n            return initialLoad;\n          },\n          inObject: function(needle, object) {\n            var\n              found = false\n            ;\n            $.each(object, function(index, property) {\n              if(property == needle) {\n                found = true;\n                return true;\n              }\n            });\n            return found;\n          },\n          multiple: function() {\n            return $module.hasClass(className.multiple);\n          },\n          remote: function() {\n            return settings.apiSettings && module.can.useAPI();\n          },\n          single: function() {\n            return !module.is.multiple();\n          },\n          selectMutation: function(mutations) {\n            var\n              selectChanged = false\n            ;\n            $.each(mutations, function(index, mutation) {\n              if(mutation.target && $(mutation.target).is('select')) {\n                selectChanged = true;\n                return true;\n              }\n            });\n            return selectChanged;\n          },\n          search: function() {\n            return $module.hasClass(className.search);\n          },\n          searchSelection: function() {\n            return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );\n          },\n          selection: function() {\n            return $module.hasClass(className.selection);\n          },\n          userValue: function(value) {\n            return ($.inArray(value, module.get.userValues()) !== -1);\n          },\n          upward: function($menu) {\n            var $element = $menu || $module;\n            return $element.hasClass(className.upward);\n          },\n          visible: function($subMenu) {\n            return ($subMenu)\n              ? $subMenu.hasClass(className.visible)\n              : $menu.hasClass(className.visible)\n            ;\n          },\n          verticallyScrollableContext: function() {\n            var\n              overflowY = ($context.get(0) !== window)\n                ? $context.css('overflow-y')\n                : false\n            ;\n            return (overflowY == 'auto' || overflowY == 'scroll');\n          },\n          horizontallyScrollableContext: function() {\n            var\n              overflowX = ($context.get(0) !== window)\n                ? $context.css('overflow-X')\n                : false\n            ;\n            return (overflowX == 'auto' || overflowX == 'scroll');\n          }\n        },\n\n        can: {\n          activate: function($item) {\n            if(settings.useLabels) {\n              return true;\n            }\n            if(!module.has.maxSelections()) {\n              return true;\n            }\n            if(module.has.maxSelections() && $item.hasClass(className.active)) {\n              return true;\n            }\n            return false;\n          },\n          openDownward: function($subMenu) {\n            var\n              $currentMenu    = $subMenu || $menu,\n              canOpenDownward = true,\n              onScreen        = {},\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset    : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollTop : $context.scrollTop(),\n                height    : $context.outerHeight()\n              },\n              menu : {\n                offset: $currentMenu.offset(),\n                height: $currentMenu.outerHeight()\n              }\n            };\n            if(module.is.verticallyScrollableContext()) {\n              calculations.menu.offset.top += calculations.context.scrollTop;\n            }\n            onScreen = {\n              above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,\n              below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height\n            };\n            if(onScreen.below) {\n              module.verbose('Dropdown can fit in context downward', onScreen);\n              canOpenDownward = true;\n            }\n            else if(!onScreen.below && !onScreen.above) {\n              module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);\n              canOpenDownward = true;\n            }\n            else {\n              module.verbose('Dropdown cannot fit below, opening upward', onScreen);\n              canOpenDownward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenDownward;\n          },\n          openRightward: function($subMenu) {\n            var\n              $currentMenu     = $subMenu || $menu,\n              canOpenRightward = true,\n              isOffscreenRight = false,\n              calculations\n            ;\n            $currentMenu\n              .addClass(className.loading)\n            ;\n            calculations = {\n              context: {\n                offset     : ($context.get(0) === window)\n                  ? { top: 0, left: 0}\n                  : $context.offset(),\n                scrollLeft : $context.scrollLeft(),\n                width      : $context.outerWidth()\n              },\n              menu: {\n                offset : $currentMenu.offset(),\n                width  : $currentMenu.outerWidth()\n              }\n            };\n            if(module.is.horizontallyScrollableContext()) {\n              calculations.menu.offset.left += calculations.context.scrollLeft;\n            }\n            isOffscreenRight = (calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);\n            if(isOffscreenRight) {\n              module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);\n              canOpenRightward = false;\n            }\n            $currentMenu.removeClass(className.loading);\n            return canOpenRightward;\n          },\n          click: function() {\n            return (hasTouch || settings.on == 'click');\n          },\n          extendSelect: function() {\n            return settings.allowAdditions || settings.apiSettings;\n          },\n          show: function() {\n            return !module.is.disabled() && (module.has.items() || module.has.message());\n          },\n          useAPI: function() {\n            return $.fn.api !== undefined;\n          }\n        },\n\n        animate: {\n          show: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  module.hideSubMenus();\n                  module.hideOthers();\n                  module.set.active();\n                },\n              transition\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            module.verbose('Doing menu show animation', $currentMenu);\n            module.set.direction($subMenu);\n            transition = module.get.transition($subMenu);\n            if( module.is.selection() ) {\n              module.set.scrollPosition(module.get.selectedItem(), true);\n            }\n            if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('show');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' in',\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    duration   : settings.duration,\n                    queue      : true,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.noTransition, transition);\n              }\n            }\n          },\n          hide: function(callback, $subMenu) {\n            var\n              $currentMenu = $subMenu || $menu,\n              duration = ($subMenu)\n                ? (settings.duration * 0.9)\n                : settings.duration,\n              start = ($subMenu)\n                ? function() {}\n                : function() {\n                  if( module.can.click() ) {\n                    module.unbind.intent();\n                  }\n                  module.remove.active();\n                },\n              transition = module.get.transition($subMenu)\n            ;\n            callback = $.isFunction(callback)\n              ? callback\n              : function(){}\n            ;\n            if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {\n              module.verbose('Doing menu hide animation', $currentMenu);\n\n              if(transition == 'none') {\n                start();\n                $currentMenu.transition('hide');\n                callback.call(element);\n              }\n              else if($.fn.transition !== undefined && $module.transition('is supported')) {\n                $currentMenu\n                  .transition({\n                    animation  : transition + ' out',\n                    duration   : settings.duration,\n                    debug      : settings.debug,\n                    verbose    : settings.verbose,\n                    queue      : false,\n                    onStart    : start,\n                    onComplete : function() {\n                      callback.call(element);\n                    }\n                  })\n                ;\n              }\n              else {\n                module.error(error.transition);\n              }\n            }\n          }\n        },\n\n        hideAndClear: function() {\n          module.remove.searchTerm();\n          if( module.has.maxSelections() ) {\n            return;\n          }\n          if(module.has.search()) {\n            module.hide(function() {\n              module.remove.filteredItem();\n            });\n          }\n          else {\n            module.hide();\n          }\n        },\n\n        delay: {\n          show: function() {\n            module.verbose('Delaying show event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.show, settings.delay.show);\n          },\n          hide: function() {\n            module.verbose('Delaying hide event to ensure user intent');\n            clearTimeout(module.timer);\n            module.timer = setTimeout(module.hide, settings.delay.hide);\n          }\n        },\n\n        escape: {\n          value: function(value) {\n            var\n              multipleValues = $.isArray(value),\n              stringValue    = (typeof value === 'string'),\n              isUnparsable   = (!stringValue && !multipleValues),\n              hasQuotes      = (stringValue && value.search(regExp.quote) !== -1),\n              values         = []\n            ;\n            if(isUnparsable || !hasQuotes) {\n              return value;\n            }\n            module.debug('Encoding quote values for use in select', value);\n            if(multipleValues) {\n              $.each(value, function(index, value){\n                values.push(value.replace(regExp.quote, '&quot;'));\n              });\n              return values;\n            }\n            return value.replace(regExp.quote, '&quot;');\n          },\n          string: function(text) {\n            text =  String(text);\n            return text.replace(regExp.escape, '\\\\$&');\n          }\n        },\n\n        setting: function(name, value) {\n          module.debug('Changing setting', name, value);\n          if( $.isPlainObject(name) ) {\n            $.extend(true, settings, name);\n          }\n          else if(value !== undefined) {\n            if($.isPlainObject(settings[name])) {\n              $.extend(true, settings[name], value);\n            }\n            else {\n              settings[name] = value;\n            }\n          }\n          else {\n            return settings[name];\n          }\n        },\n        internal: function(name, value) {\n          if( $.isPlainObject(name) ) {\n            $.extend(true, module, name);\n          }\n          else if(value !== undefined) {\n            module[name] = value;\n          }\n          else {\n            return module[name];\n          }\n        },\n        debug: function() {\n          if(!settings.silent && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.debug.apply(console, arguments);\n            }\n          }\n        },\n        verbose: function() {\n          if(!settings.silent && settings.verbose && settings.debug) {\n            if(settings.performance) {\n              module.performance.log(arguments);\n            }\n            else {\n              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');\n              module.verbose.apply(console, arguments);\n            }\n          }\n        },\n        error: function() {\n          if(!settings.silent) {\n            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');\n            module.error.apply(console, arguments);\n          }\n        },\n        performance: {\n          log: function(message) {\n            var\n              currentTime,\n              executionTime,\n              previousTime\n            ;\n            if(settings.performance) {\n              currentTime   = new Date().getTime();\n              previousTime  = time || currentTime;\n              executionTime = currentTime - previousTime;\n              time          = currentTime;\n              performance.push({\n                'Name'           : message[0],\n                'Arguments'      : [].slice.call(message, 1) || '',\n                'Element'        : element,\n                'Execution Time' : executionTime\n              });\n            }\n            clearTimeout(module.performance.timer);\n            module.performance.timer = setTimeout(module.performance.display, 500);\n          },\n          display: function() {\n            var\n              title = settings.name + ':',\n              totalTime = 0\n            ;\n            time = false;\n            clearTimeout(module.performance.timer);\n            $.each(performance, function(index, data) {\n              totalTime += data['Execution Time'];\n            });\n            title += ' ' + totalTime + 'ms';\n            if(moduleSelector) {\n              title += ' \\'' + moduleSelector + '\\'';\n            }\n            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {\n              console.groupCollapsed(title);\n              if(console.table) {\n                console.table(performance);\n              }\n              else {\n                $.each(performance, function(index, data) {\n                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');\n                });\n              }\n              console.groupEnd();\n            }\n            performance = [];\n          }\n        },\n        invoke: function(query, passedArguments, context) {\n          var\n            object = instance,\n            maxDepth,\n            found,\n            response\n          ;\n          passedArguments = passedArguments || queryArguments;\n          context         = element         || context;\n          if(typeof query == 'string' && object !== undefined) {\n            query    = query.split(/[\\. ]/);\n            maxDepth = query.length - 1;\n            $.each(query, function(depth, value) {\n              var camelCaseValue = (depth != maxDepth)\n                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)\n                : query\n              ;\n              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {\n                object = object[camelCaseValue];\n              }\n              else if( object[camelCaseValue] !== undefined ) {\n                found = object[camelCaseValue];\n                return false;\n              }\n              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {\n                object = object[value];\n              }\n              else if( object[value] !== undefined ) {\n                found = object[value];\n                return false;\n              }\n              else {\n                module.error(error.method, query);\n                return false;\n              }\n            });\n          }\n          if ( $.isFunction( found ) ) {\n            response = found.apply(context, passedArguments);\n          }\n          else if(found !== undefined) {\n            response = found;\n          }\n          if($.isArray(returnedValue)) {\n            returnedValue.push(response);\n          }\n          else if(returnedValue !== undefined) {\n            returnedValue = [returnedValue, response];\n          }\n          else if(response !== undefined) {\n            returnedValue = response;\n          }\n          return found;\n        }\n      };\n\n      if(methodInvoked) {\n        if(instance === undefined) {\n          module.initialize();\n        }\n        module.invoke(query);\n      }\n      else {\n        if(instance !== undefined) {\n          instance.invoke('destroy');\n        }\n        module.initialize();\n      }\n    })\n  ;\n  return (returnedValue !== undefined)\n    ? returnedValue\n    : $allModules\n  ;\n};\n\n$.fn.dropdown.settings = {\n\n  silent                 : false,\n  debug                  : false,\n  verbose                : false,\n  performance            : true,\n\n  on                     : 'click',    // what event should show menu action on item selection\n  action                 : 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})\n\n  values                 : false,      // specify values to use for dropdown\n\n  apiSettings            : false,\n  selectOnKeydown        : true,       // Whether selection should occur automatically when keyboard shortcuts used\n  minCharacters          : 0,          // Minimum characters required to trigger API call\n\n  filterRemoteData       : false,      // Whether API results should be filtered after being returned for query term\n  saveRemoteData         : true,       // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh\n\n  throttle               : 200,        // How long to wait after last user input to search remotely\n\n  context                : window,     // Context to use when determining if on screen\n  direction              : 'auto',     // Whether dropdown should always open in one direction\n  keepOnScreen           : true,       // Whether dropdown should check whether it is on screen before showing\n\n  match                  : 'both',     // what to match against with search selection (both, text, or label)\n  fullTextSearch         : false,      // search anywhere in value (set to 'exact' to require exact matches)\n\n  placeholder            : 'auto',     // whether to convert blank <select> values to placeholder text\n  preserveHTML           : true,       // preserve html when selecting value\n  sortSelect             : false,      // sort selection on init\n\n  forceSelection         : true,       // force a choice on blur with search selection\n\n  allowAdditions         : false,      // whether multiple select should allow user added values\n  ignoreCase             : false,       // whether to consider values not matching in case to be the same\n  hideAdditions          : true,       // whether or not to hide special message prompting a user they can enter a value\n\n  maxSelections          : false,      // When set to a number limits the number of selections to this count\n  useLabels              : true,       // whether multiple select should filter currently active selections from choices\n  delimiter              : ',',        // when multiselect uses normal <input> the values will be delimited with this character\n\n  showOnFocus            : true,       // show menu on focus\n  allowReselection       : false,      // whether current value should trigger callbacks when reselected\n  allowTab               : true,       // add tabindex to element\n  allowCategorySelection : false,      // allow elements with sub-menus to be selected\n\n  fireOnInit             : false,      // Whether callbacks should fire when initializing dropdown values\n\n  transition             : 'auto',     // auto transition will slide down or up based on direction\n  duration               : 200,        // duration of transition\n\n  glyphWidth             : 1.037,      // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width\n\n  // label settings on multi-select\n  label: {\n    transition : 'scale',\n    duration   : 200,\n    variation  : false\n  },\n\n  // delay before event\n  delay : {\n    hide   : 300,\n    show   : 200,\n    search : 20,\n    touch  : 50\n  },\n\n  /* Callbacks */\n  onChange      : function(value, text, $selected){},\n  onAdd         : function(value, text, $selected){},\n  onRemove      : function(value, text, $selected){},\n\n  onLabelSelect : function($selectedLabels){},\n  onLabelCreate : function(value, text) { return $(this); },\n  onLabelRemove : function(value) { return true; },\n  onNoResults   : function(searchTerm) { return true; },\n  onShow        : function(){},\n  onHide        : function(){},\n\n  /* Component */\n  name           : 'Dropdown',\n  namespace      : 'dropdown',\n\n  message: {\n    addResult     : 'Add <b>{term}</b>',\n    count         : '{count} selected',\n    maxSelections : 'Max {maxCount} selections',\n    noResults     : 'No results found.',\n    serverError   : 'There was an error contacting the server'\n  },\n\n  error : {\n    action          : 'You called a dropdown action that was not defined',\n    alreadySetup    : 'Once a select has been initialized behaviors must be called on the created ui dropdown',\n    labels          : 'Allowing user additions currently requires the use of labels.',\n    missingMultiple : '<select> requires multiple property to be set to correctly preserve multiple values',\n    method          : 'The method you called is not defined.',\n    noAPI           : 'The API module is required to load resources remotely',\n    noStorage       : 'Saving remote data requires session storage',\n    noTransition    : 'This module requires ui transitions <https://github.com/Semantic-Org/UI-Transition>'\n  },\n\n  regExp : {\n    escape   : /[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\n    quote    : /\"/g\n  },\n\n  metadata : {\n    defaultText     : 'defaultText',\n    defaultValue    : 'defaultValue',\n    placeholderText : 'placeholder',\n    text            : 'text',\n    value           : 'value'\n  },\n\n  // property names for remote query\n  fields: {\n    remoteValues : 'results',  // grouping for api results\n    values       : 'values',   // grouping for all dropdown values\n    disabled     : 'disabled', // whether value should be disabled\n    name         : 'name',     // displayed dropdown text\n    value        : 'value',    // actual dropdown value\n    text         : 'text'      // displayed text when selected\n  },\n\n  keys : {\n    backspace  : 8,\n    delimiter  : 188, // comma\n    deleteKey  : 46,\n    enter      : 13,\n    escape     : 27,\n    pageUp     : 33,\n    pageDown   : 34,\n    leftArrow  : 37,\n    upArrow    : 38,\n    rightArrow : 39,\n    downArrow  : 40\n  },\n\n  selector : {\n    addition     : '.addition',\n    dropdown     : '.ui.dropdown',\n    hidden       : '.hidden',\n    icon         : '> .dropdown.icon',\n    input        : '> input[type=\"hidden\"], > select',\n    item         : '.item',\n    label        : '> .label',\n    remove       : '> .label > .delete.icon',\n    siblingLabel : '.label',\n    menu         : '.menu',\n    message      : '.message',\n    menuIcon     : '.dropdown.icon',\n    search       : 'input.search, .menu > .search > input, .menu input.search',\n    sizer        : '> input.sizer',\n    text         : '> .text:not(.icon)',\n    unselectable : '.disabled, .filtered'\n  },\n\n  className : {\n    active      : 'active',\n    addition    : 'addition',\n    animating   : 'animating',\n    disabled    : 'disabled',\n    empty       : 'empty',\n    dropdown    : 'ui dropdown',\n    filtered    : 'filtered',\n    hidden      : 'hidden transition',\n    item        : 'item',\n    label       : 'ui label',\n    loading     : 'loading',\n    menu        : 'menu',\n    message     : 'message',\n    multiple    : 'multiple',\n    placeholder : 'default',\n    sizer       : 'sizer',\n    search      : 'search',\n    selected    : 'selected',\n    selection   : 'selection',\n    upward      : 'upward',\n    leftward    : 'left',\n    visible     : 'visible'\n  }\n\n};\n\n/* Templates */\n$.fn.dropdown.settings.templates = {\n\n  // generates dropdown from select values\n  dropdown: function(select) {\n    var\n      placeholder = select.placeholder || false,\n      values      = select.values || {},\n      html        = ''\n    ;\n    html +=  '<i class=\"dropdown icon\"></i>';\n    if(select.placeholder) {\n      html += '<div class=\"default text\">' + placeholder + '</div>';\n    }\n    else {\n      html += '<div class=\"text\"></div>';\n    }\n    html += '<div class=\"menu\">';\n    $.each(select.values, function(index, option) {\n      html += (option.disabled)\n        ? '<div class=\"disabled item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n        : '<div class=\"item\" data-value=\"' + option.value + '\">' + option.name + '</div>'\n      ;\n    });\n    html += '</div>';\n    return html;\n  },\n\n  // generates just menu from select\n  menu: function(response, fields) {\n    var\n      values = response[fields.values] || {},\n      html   = ''\n    ;\n    $.each(values, function(index, option) {\n      var\n        maybeText = (option[fields.text])\n          ? 'data-text=\"' + option[fields.text] + '\"'\n          : '',\n        maybeDisabled = (option[fields.disabled])\n          ? 'disabled '\n          : ''\n      ;\n      html += '<div class=\"'+ maybeDisabled +'item\" data-value=\"' + option[fields.value] + '\"' + maybeText + '>';\n      html +=   option[fields.name];\n      html += '</div>';\n    });\n    return html;\n  },\n\n  // generates label for multiselect\n  label: function(value, text) {\n    return text + '<i class=\"delete icon\"></i>';\n  },\n\n\n  // generates messages like \"No results\"\n  message: function(message) {\n    return message;\n  },\n\n  // generates user addition to selection menu\n  addition: function(choice) {\n    return choice;\n  }\n\n};\n\n})( jQuery, window, document );\n","$(async () => {\n  const graphCanvas = document.getElementById('graph-canvas');\n  if (!graphCanvas) return;\n\n  const [{ default: gitGraph }] = await Promise.all([\n    import(/* webpackChunkName: \"gitgraph\" */'./gitGraph.js'),\n    import(/* webpackChunkName: \"gitgraph\" */'../css/gitGraph.css'),\n  ]);\n\n  const graphList = [];\n  $('#graph-raw-list li span.node-relation').each(function () {\n    graphList.push($(this).text());\n  });\n\n  gitGraph(graphCanvas, graphList);\n});\n","/* globals wipPrefixes, issuesTribute, emojiTribute */\n/* exported timeAddManual, toggleStopwatch, cancelStopwatch, initHeatmap */\n/* exported toggleDeadlineForm, setDeadline, updateDeadline, deleteDependencyModal, cancelCodeComment, onOAuthLoginClick */\n\nimport './publicPath.js';\nimport './gitGraphLoader.js';\nimport './semanticDropdown.js';\n\nfunction htmlEncode(text) {\n  return jQuery('<div />').text(text).html();\n}\n\nlet csrf;\nlet suburl;\nlet previewFileModes;\nlet simpleMDEditor;\nlet codeMirrorEditor;\n\n// Disable Dropzone auto-discover because it's manually initialized\nif (typeof (Dropzone) !== 'undefined') {\n  Dropzone.autoDiscover = false;\n}\n\nfunction initCommentPreviewTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('preview')}\"]`).click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      mode: 'gfm',\n      context: $this.data('context'),\n      text: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n    }, (data) => {\n      const $previewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('preview')}\"]`);\n      $previewPanel.html(data);\n      emojify.run($previewPanel[0]);\n      $('pre code', $previewPanel[0]).each(function () {\n        hljs.highlightBlock(this);\n      });\n    });\n  });\n\n  buttonsClickOnEnter();\n}\n\nfunction initEditPreviewTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  const $previewTab = $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('preview')}\"]`);\n  if ($previewTab.length) {\n    previewFileModes = $previewTab.data('preview-file-modes').split(',');\n    $previewTab.click(function () {\n      const $this = $(this);\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        mode: 'gfm',\n        context: $this.data('context'),\n        text: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n      }, (data) => {\n        const $previewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('preview')}\"]`);\n        $previewPanel.html(data);\n        emojify.run($previewPanel[0]);\n        $('pre code', $previewPanel[0]).each(function () {\n          hljs.highlightBlock(this);\n        });\n      });\n    });\n  }\n}\n\nfunction initEditDiffTab($form) {\n  const $tabMenu = $form.find('.tabular.menu');\n  $tabMenu.find('.item').tab();\n  $tabMenu.find(`.item[data-tab=\"${$tabMenu.data('diff')}\"]`).click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      context: $this.data('context'),\n      content: $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('write')}\"] textarea`).val()\n    }, (data) => {\n      const $diffPreviewPanel = $form.find(`.tab.segment[data-tab=\"${$tabMenu.data('diff')}\"]`);\n      $diffPreviewPanel.html(data);\n      emojify.run($diffPreviewPanel[0]);\n    });\n  });\n}\n\n\nfunction initEditForm() {\n  if ($('.edit.form').length === 0) {\n    return;\n  }\n\n  initEditPreviewTab($('.edit.form'));\n  initEditDiffTab($('.edit.form'));\n}\n\nfunction initBranchSelector() {\n  const $selectBranch = $('.ui.select-branch');\n  const $branchMenu = $selectBranch.find('.reference-list-menu');\n  $branchMenu.find('.item:not(.no-select)').click(function () {\n    const selectedValue = $(this).data('id');\n    $($(this).data('id-selector')).val(selectedValue);\n    $selectBranch.find('.ui .branch-name').text(selectedValue);\n  });\n  $selectBranch.find('.reference.column').click(function () {\n    $selectBranch.find('.scrolling.reference-list-menu').css('display', 'none');\n    $selectBranch.find('.reference .text').removeClass('black');\n    $($(this).data('target')).css('display', 'block');\n    $(this).find('.text').addClass('black');\n    return false;\n  });\n}\n\nfunction updateIssuesMeta(url, action, issueIds, elementId) {\n  return new Promise(((resolve) => {\n    $.ajax({\n      type: 'POST',\n      url,\n      data: {\n        _csrf: csrf,\n        action,\n        issue_ids: issueIds,\n        id: elementId\n      },\n      success: resolve\n    });\n  }));\n}\n\nfunction initRepoStatusChecker() {\n  const migrating = $('#repo_migrating');\n  $('#repo_migrating_failed').hide();\n  if (migrating) {\n    const repo_name = migrating.attr('repo');\n    if (typeof repo_name === 'undefined') {\n      return;\n    }\n    $.ajax({\n      type: 'GET',\n      url: `${suburl}/${repo_name}/status`,\n      data: {\n        _csrf: csrf,\n      },\n      complete(xhr) {\n        if (xhr.status === 200) {\n          if (xhr.responseJSON) {\n            if (xhr.responseJSON.status === 0) {\n              window.location.reload();\n              return;\n            }\n\n            setTimeout(() => {\n              initRepoStatusChecker();\n            }, 2000);\n            return;\n          }\n        }\n        $('#repo_migrating_progress').hide();\n        $('#repo_migrating_failed').show();\n      }\n    });\n  }\n}\n\nfunction initReactionSelector(parent) {\n  let reactions = '';\n  if (!parent) {\n    parent = $(document);\n    reactions = '.reactions > ';\n  }\n\n  parent.find(`${reactions}a.label`).popup({ position: 'bottom left', metadata: { content: 'title', title: 'none' } });\n\n  parent.find(`.select-reaction > .menu > .item, ${reactions}a.label`).on('click', function (e) {\n    const vm = this;\n    e.preventDefault();\n\n    if ($(this).hasClass('disabled')) return;\n\n    const actionURL = $(this).hasClass('item')\n      ? $(this).closest('.select-reaction').data('action-url')\n      : $(this).data('action-url');\n    const url = `${actionURL}/${$(this).hasClass('blue') ? 'unreact' : 'react'}`;\n    $.ajax({\n      type: 'POST',\n      url,\n      data: {\n        _csrf: csrf,\n        content: $(this).data('content')\n      }\n    }).done((resp) => {\n      if (resp && (resp.html || resp.empty)) {\n        const content = $(vm).closest('.content');\n        let react = content.find('.segment.reactions');\n        if (!resp.empty && react.length > 0) {\n          react.remove();\n        }\n        if (!resp.empty) {\n          react = $('<div class=\"ui attached segment reactions\"></div>');\n          const attachments = content.find('.segment.bottom:first');\n          if (attachments.length > 0) {\n            react.insertBefore(attachments);\n          } else {\n            react.appendTo(content);\n          }\n          react.html(resp.html);\n          const hasEmoji = react.find('.has-emoji');\n          for (let i = 0; i < hasEmoji.length; i++) {\n            emojify.run(hasEmoji.get(i));\n          }\n          react.find('.dropdown').dropdown();\n          initReactionSelector(react);\n        }\n      }\n    });\n  });\n}\n\nfunction insertAtCursor(field, value) {\n  if (field.selectionStart || field.selectionStart === 0) {\n    const startPos = field.selectionStart;\n    const endPos = field.selectionEnd;\n    field.value = field.value.substring(0, startPos)\n            + value\n            + field.value.substring(endPos, field.value.length);\n    field.selectionStart = startPos + value.length;\n    field.selectionEnd = startPos + value.length;\n  } else {\n    field.value += value;\n  }\n}\n\nfunction replaceAndKeepCursor(field, oldval, newval) {\n  if (field.selectionStart || field.selectionStart === 0) {\n    const startPos = field.selectionStart;\n    const endPos = field.selectionEnd;\n    field.value = field.value.replace(oldval, newval);\n    field.selectionStart = startPos + newval.length - oldval.length;\n    field.selectionEnd = endPos + newval.length - oldval.length;\n  } else {\n    field.value = field.value.replace(oldval, newval);\n  }\n}\n\nfunction retrieveImageFromClipboardAsBlob(pasteEvent, callback) {\n  if (!pasteEvent.clipboardData) {\n    return;\n  }\n\n  const { items } = pasteEvent.clipboardData;\n  if (typeof items === 'undefined') {\n    return;\n  }\n\n  for (let i = 0; i < items.length; i++) {\n    if (items[i].type.indexOf('image') === -1) continue;\n    const blob = items[i].getAsFile();\n\n    if (typeof (callback) === 'function') {\n      pasteEvent.preventDefault();\n      pasteEvent.stopPropagation();\n      callback(blob);\n    }\n  }\n}\n\nfunction uploadFile(file, callback) {\n  const xhr = new XMLHttpRequest();\n\n  xhr.onload = function () {\n    if (xhr.status === 200) {\n      callback(xhr.responseText);\n    }\n  };\n\n  xhr.open('post', `${suburl}/attachments`, true);\n  xhr.setRequestHeader('X-Csrf-Token', csrf);\n  const formData = new FormData();\n  formData.append('file', file, file.name);\n  xhr.send(formData);\n}\n\nfunction reload() {\n  window.location.reload();\n}\n\nfunction initImagePaste(target) {\n  target.each(function () {\n    const field = this;\n    field.addEventListener('paste', (event) => {\n      retrieveImageFromClipboardAsBlob(event, (img) => {\n        const name = img.name.substr(0, img.name.lastIndexOf('.'));\n        insertAtCursor(field, `![${name}]()`);\n        uploadFile(img, (res) => {\n          const data = JSON.parse(res);\n          replaceAndKeepCursor(field, `![${name}]()`, `![${name}](${suburl}/attachments/${data.uuid})`);\n          const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n          $('.files').append(input);\n        });\n      });\n    }, false);\n  });\n}\n\nfunction initCommentForm() {\n  if ($('.comment.form').length === 0) {\n    return;\n  }\n\n  initBranchSelector();\n  initCommentPreviewTab($('.comment.form'));\n  initImagePaste($('.comment.form textarea'));\n\n  // Listsubmit\n  function initListSubmits(selector, outerSelector) {\n    const $list = $(`.ui.${outerSelector}.list`);\n    const $noSelect = $list.find('.no-select');\n    const $listMenu = $(`.${selector} .menu`);\n    let hasLabelUpdateAction = $listMenu.data('action') === 'update';\n    const labels = {};\n\n    $(`.${selector}`).dropdown('setting', 'onHide', () => {\n      hasLabelUpdateAction = $listMenu.data('action') === 'update'; // Update the var\n      if (hasLabelUpdateAction) {\n        const promises = [];\n        Object.keys(labels).forEach((elementId) => {\n          const label = labels[elementId];\n          const promise = updateIssuesMeta(\n            label['update-url'],\n            label.action,\n            label['issue-id'],\n            elementId\n          );\n          promises.push(promise);\n        });\n        Promise.all(promises).then(reload);\n      }\n    });\n\n    $listMenu.find('.item:not(.no-select)').click(function () {\n      // we don't need the action attribute when updating assignees\n      if (selector === 'select-assignees-modify') {\n        // UI magic. We need to do this here, otherwise it would destroy the functionality of\n        // adding/removing labels\n        if ($(this).hasClass('checked')) {\n          $(this).removeClass('checked');\n          $(this).find('.octicon').removeClass('octicon-check');\n        } else {\n          $(this).addClass('checked');\n          $(this).find('.octicon').addClass('octicon-check');\n        }\n\n        updateIssuesMeta(\n          $listMenu.data('update-url'),\n          '',\n          $listMenu.data('issue-id'),\n          $(this).data('id')\n        );\n        $listMenu.data('action', 'update'); // Update to reload the page when we updated items\n        return false;\n      }\n\n      if ($(this).hasClass('checked')) {\n        $(this).removeClass('checked');\n        $(this).find('.octicon').removeClass('octicon-check');\n        if (hasLabelUpdateAction) {\n          if (!($(this).data('id') in labels)) {\n            labels[$(this).data('id')] = {\n              'update-url': $listMenu.data('update-url'),\n              action: 'detach',\n              'issue-id': $listMenu.data('issue-id'),\n            };\n          } else {\n            delete labels[$(this).data('id')];\n          }\n        }\n      } else {\n        $(this).addClass('checked');\n        $(this).find('.octicon').addClass('octicon-check');\n        if (hasLabelUpdateAction) {\n          if (!($(this).data('id') in labels)) {\n            labels[$(this).data('id')] = {\n              'update-url': $listMenu.data('update-url'),\n              action: 'attach',\n              'issue-id': $listMenu.data('issue-id'),\n            };\n          } else {\n            delete labels[$(this).data('id')];\n          }\n        }\n      }\n\n      const listIds = [];\n      $(this).parent().find('.item').each(function () {\n        if ($(this).hasClass('checked')) {\n          listIds.push($(this).data('id'));\n          $($(this).data('id-selector')).removeClass('hide');\n        } else {\n          $($(this).data('id-selector')).addClass('hide');\n        }\n      });\n      if (listIds.length === 0) {\n        $noSelect.removeClass('hide');\n      } else {\n        $noSelect.addClass('hide');\n      }\n      $($(this).parent().data('id')).val(listIds.join(','));\n      return false;\n    });\n    $listMenu.find('.no-select.item').click(function () {\n      if (hasLabelUpdateAction || selector === 'select-assignees-modify') {\n        updateIssuesMeta(\n          $listMenu.data('update-url'),\n          'clear',\n          $listMenu.data('issue-id'),\n          ''\n        ).then(reload);\n      }\n\n      $(this).parent().find('.item').each(function () {\n        $(this).removeClass('checked');\n        $(this).find('.octicon').removeClass('octicon-check');\n      });\n\n      $list.find('.item').each(function () {\n        $(this).addClass('hide');\n      });\n      $noSelect.removeClass('hide');\n      $($(this).parent().data('id')).val('');\n    });\n  }\n\n  // Init labels and assignees\n  initListSubmits('select-label', 'labels');\n  initListSubmits('select-assignees', 'assignees');\n  initListSubmits('select-assignees-modify', 'assignees');\n\n  function selectItem(select_id, input_id) {\n    const $menu = $(`${select_id} .menu`);\n    const $list = $(`.ui${select_id}.list`);\n    const hasUpdateAction = $menu.data('action') === 'update';\n\n    $menu.find('.item:not(.no-select)').click(function () {\n      $(this).parent().find('.item').each(function () {\n        $(this).removeClass('selected active');\n      });\n\n      $(this).addClass('selected active');\n      if (hasUpdateAction) {\n        updateIssuesMeta(\n          $menu.data('update-url'),\n          '',\n          $menu.data('issue-id'),\n          $(this).data('id')\n        ).then(reload);\n      }\n      switch (input_id) {\n        case '#milestone_id':\n          $list.find('.selected').html(`<a class=\"item\" href=${$(this).data('href')}>${\n            htmlEncode($(this).text())}</a>`);\n          break;\n        case '#assignee_id':\n          $list.find('.selected').html(`<a class=\"item\" href=${$(this).data('href')}>`\n                        + `<img class=\"ui avatar image\" src=${$(this).data('avatar')}>${\n                          htmlEncode($(this).text())}</a>`);\n      }\n      $(`.ui${select_id}.list .no-select`).addClass('hide');\n      $(input_id).val($(this).data('id'));\n    });\n    $menu.find('.no-select.item').click(function () {\n      $(this).parent().find('.item:not(.no-select)').each(function () {\n        $(this).removeClass('selected active');\n      });\n\n      if (hasUpdateAction) {\n        updateIssuesMeta(\n          $menu.data('update-url'),\n          '',\n          $menu.data('issue-id'),\n          $(this).data('id')\n        ).then(reload);\n      }\n\n      $list.find('.selected').html('');\n      $list.find('.no-select').removeClass('hide');\n      $(input_id).val('');\n    });\n  }\n\n  // Milestone and assignee\n  selectItem('.select-milestone', '#milestone_id');\n  selectItem('.select-assignee', '#assignee_id');\n}\n\nfunction initInstall() {\n  if ($('.install').length === 0) {\n    return;\n  }\n\n  if ($('#db_host').val() === '') {\n    $('#db_host').val('127.0.0.1:3306');\n    $('#db_user').val('gitea');\n    $('#db_name').val('gitea');\n  }\n\n  // Database type change detection.\n  $('#db_type').change(function () {\n    const sqliteDefault = 'data/gitea.db';\n    const tidbDefault = 'data/gitea_tidb';\n\n    const dbType = $(this).val();\n    if (dbType === 'SQLite3') {\n      $('#sql_settings').hide();\n      $('#pgsql_settings').hide();\n      $('#mysql_settings').hide();\n      $('#sqlite_settings').show();\n\n      if (dbType === 'SQLite3' && $('#db_path').val() === tidbDefault) {\n        $('#db_path').val(sqliteDefault);\n      }\n      return;\n    }\n\n    const dbDefaults = {\n      MySQL: '127.0.0.1:3306',\n      PostgreSQL: '127.0.0.1:5432',\n      MSSQL: '127.0.0.1:1433'\n    };\n\n    $('#sqlite_settings').hide();\n    $('#sql_settings').show();\n\n    $('#pgsql_settings').toggle(dbType === 'PostgreSQL');\n    $('#mysql_settings').toggle(dbType === 'MySQL');\n    $.each(dbDefaults, (_type, defaultHost) => {\n      if ($('#db_host').val() === defaultHost) {\n        $('#db_host').val(dbDefaults[dbType]);\n        return false;\n      }\n    });\n  });\n\n  // TODO: better handling of exclusive relations.\n  $('#offline-mode input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-gravatar').checkbox('check');\n      $('#federated-avatar-lookup').checkbox('uncheck');\n    }\n  });\n  $('#disable-gravatar input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#federated-avatar-lookup').checkbox('uncheck');\n    } else {\n      $('#offline-mode').checkbox('uncheck');\n    }\n  });\n  $('#federated-avatar-lookup input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-gravatar').checkbox('uncheck');\n      $('#offline-mode').checkbox('uncheck');\n    }\n  });\n  $('#enable-openid-signin input').change(function () {\n    if ($(this).is(':checked')) {\n      if (!$('#disable-registration input').is(':checked')) {\n        $('#enable-openid-signup').checkbox('check');\n      }\n    } else {\n      $('#enable-openid-signup').checkbox('uncheck');\n    }\n  });\n  $('#disable-registration input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#enable-captcha').checkbox('uncheck');\n      $('#enable-openid-signup').checkbox('uncheck');\n    } else {\n      $('#enable-openid-signup').checkbox('check');\n    }\n  });\n  $('#enable-captcha input').change(function () {\n    if ($(this).is(':checked')) {\n      $('#disable-registration').checkbox('uncheck');\n    }\n  });\n}\n\nfunction initRepository() {\n  if ($('.repository').length === 0) {\n    return;\n  }\n\n  function initFilterSearchDropdown(selector) {\n    const $dropdown = $(selector);\n    $dropdown.dropdown({\n      fullTextSearch: true,\n      selectOnKeydown: false,\n      onChange(_text, _value, $choice) {\n        if ($choice.data('url')) {\n          window.location.href = $choice.data('url');\n        }\n      },\n      message: { noResults: $dropdown.data('no-results') }\n    });\n  }\n\n  // File list and commits\n  if ($('.repository.file.list').length > 0 || ('.repository.commits').length > 0) {\n    initFilterBranchTagDropdown('.choose.reference .dropdown');\n  }\n\n  // Wiki\n  if ($('.repository.wiki.view').length > 0) {\n    initFilterSearchDropdown('.choose.page .dropdown');\n  }\n\n  // Options\n  if ($('.repository.settings.options').length > 0) {\n    $('#repo_name').keyup(function () {\n      const $prompt = $('#repo-name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n\n    // Enable or select internal/external wiki system and issue tracker.\n    $('.enable-system').change(function () {\n      if (this.checked) {\n        $($(this).data('target')).removeClass('disabled');\n        if (!$(this).data('context')) $($(this).data('context')).addClass('disabled');\n      } else {\n        $($(this).data('target')).addClass('disabled');\n        if (!$(this).data('context')) $($(this).data('context')).removeClass('disabled');\n      }\n    });\n    $('.enable-system-radio').change(function () {\n      if (this.value === 'false') {\n        $($(this).data('target')).addClass('disabled');\n        if (typeof $(this).data('context') !== 'undefined') $($(this).data('context')).removeClass('disabled');\n      } else if (this.value === 'true') {\n        $($(this).data('target')).removeClass('disabled');\n        if (typeof $(this).data('context') !== 'undefined') $($(this).data('context')).addClass('disabled');\n      }\n    });\n  }\n\n  // Labels\n  if ($('.repository.labels').length > 0) {\n    // Create label\n    const $newLabelPanel = $('.new-label.segment');\n    $('.new-label.button').click(() => {\n      $newLabelPanel.show();\n    });\n    $('.new-label.segment .cancel').click(() => {\n      $newLabelPanel.hide();\n    });\n\n    $('.color-picker').each(function () {\n      $(this).minicolors();\n    });\n    $('.precolors .color').click(function () {\n      const color_hex = $(this).data('color-hex');\n      $('.color-picker').val(color_hex);\n      $('.minicolors-swatch-color').css('background-color', color_hex);\n    });\n    $('.edit-label-button').click(function () {\n      $('#label-modal-id').val($(this).data('id'));\n      $('.edit-label .new-label-input').val($(this).data('title'));\n      $('.edit-label .new-label-desc-input').val($(this).data('description'));\n      $('.edit-label .color-picker').val($(this).data('color'));\n      $('.minicolors-swatch-color').css('background-color', $(this).data('color'));\n      $('.edit-label.modal').modal({\n        onApprove() {\n          $('.edit-label.form').submit();\n        }\n      }).modal('show');\n      return false;\n    });\n  }\n\n  // Milestones\n  if ($('.repository.new.milestone').length > 0) {\n    const $datepicker = $('.milestone.datepicker');\n    $datepicker.datetimepicker({\n      lang: $datepicker.data('lang'),\n      inline: true,\n      timepicker: false,\n      startDate: $datepicker.data('start-date'),\n      formatDate: 'Y-m-d',\n      onSelectDate(ct) {\n        $('#deadline').val(ct.dateFormat('Y-m-d'));\n      }\n    });\n    $('#clear-date').click(() => {\n      $('#deadline').val('');\n      return false;\n    });\n  }\n\n  // Issues\n  if ($('.repository.view.issue').length > 0) {\n    // Edit issue title\n    const $issueTitle = $('#issue-title');\n    const $editInput = $('#edit-title-input input');\n    const editTitleToggle = function () {\n      $issueTitle.toggle();\n      $('.not-in-edit').toggle();\n      $('#edit-title-input').toggle();\n      $('.in-edit').toggle();\n      $editInput.focus();\n      return false;\n    };\n    $('#edit-title').click(editTitleToggle);\n    $('#cancel-edit-title').click(editTitleToggle);\n    $('#save-edit-title').click(editTitleToggle).click(function () {\n      if ($editInput.val().length === 0 || $editInput.val() === $issueTitle.text()) {\n        $editInput.val($issueTitle.text());\n        return false;\n      }\n\n      $.post($(this).data('update-url'), {\n        _csrf: csrf,\n        title: $editInput.val()\n      },\n      (data) => {\n        $editInput.val(data.title);\n        $issueTitle.text(data.title);\n        reload();\n      });\n      return false;\n    });\n\n    // Issue/PR Context Menus\n    $('.context-dropdown').dropdown({\n      action: 'hide'\n    });\n\n    // Quote reply\n    $('.quote-reply').click(function (event) {\n      $(this).closest('.dropdown').find('.menu').toggle('visible');\n      const target = $(this).data('target');\n\n      let $content;\n      if ($(this).hasClass('quote-reply-diff')) {\n        const $parent = $(this).closest('.comment-code-cloud');\n        $parent.find('button.comment-form-reply').click();\n        $content = $parent.find('[name=\"content\"]');\n      } else {\n        $content = $('#content');\n      }\n\n      const quote = $(`#comment-${target}`).text().replace(/\\n/g, '\\n> ');\n      const content = `> ${quote}\\n\\n`;\n\n      if ($content.val() !== '') {\n        $content.val(`${$content.val()}\\n\\n${content}`);\n      } else {\n        $content.val(`${content}`);\n      }\n      $content.focus();\n      event.preventDefault();\n    });\n\n    // Edit issue or comment content\n    $('.edit-content').click(function (event) {\n      $(this).closest('.dropdown').find('.menu').toggle('visible');\n      const $segment = $(this).closest('.header').next();\n      const $editContentZone = $segment.find('.edit-content-zone');\n      const $renderContent = $segment.find('.render-content');\n      const $rawContent = $segment.find('.raw-content');\n      let $textarea;\n\n      // Setup new form\n      if ($editContentZone.html().length === 0) {\n        $editContentZone.html($('#edit-content-form').html());\n        $textarea = $editContentZone.find('textarea');\n        issuesTribute.attach($textarea.get());\n        emojiTribute.attach($textarea.get());\n\n        const $dropzone = $editContentZone.find('.dropzone');\n        $dropzone.data('saved', false);\n        const $files = $editContentZone.find('.comment-files');\n        if ($dropzone.length > 0) {\n          const filenameDict = {};\n          $dropzone.dropzone({\n            url: $dropzone.data('upload-url'),\n            headers: { 'X-Csrf-Token': csrf },\n            maxFiles: $dropzone.data('max-file'),\n            maxFilesize: $dropzone.data('max-size'),\n            acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),\n            addRemoveLinks: true,\n            dictDefaultMessage: $dropzone.data('default-message'),\n            dictInvalidFileType: $dropzone.data('invalid-input-type'),\n            dictFileTooBig: $dropzone.data('file-too-big'),\n            dictRemoveFile: $dropzone.data('remove-file'),\n            init() {\n              this.on('success', (file, data) => {\n                filenameDict[file.name] = {\n                  uuid: data.uuid,\n                  submitted: false\n                };\n                const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n                $files.append(input);\n              });\n              this.on('removedfile', (file) => {\n                if (!(file.name in filenameDict)) {\n                  return;\n                }\n                $(`#${filenameDict[file.name].uuid}`).remove();\n                if ($dropzone.data('remove-url') && $dropzone.data('csrf') && !filenameDict[file.name].submitted) {\n                  $.post($dropzone.data('remove-url'), {\n                    file: filenameDict[file.name].uuid,\n                    _csrf: $dropzone.data('csrf')\n                  });\n                }\n              });\n              this.on('submit', () => {\n                $.each(filenameDict, (name) => {\n                  filenameDict[name].submitted = true;\n                });\n              });\n              this.on('reload', () => {\n                $.getJSON($editContentZone.data('attachment-url'), (data) => {\n                  const drop = $dropzone.get(0).dropzone;\n                  drop.removeAllFiles(true);\n                  $files.empty();\n                  $.each(data, function () {\n                    const imgSrc = `${$dropzone.data('upload-url')}/${this.uuid}`;\n                    drop.emit('addedfile', this);\n                    drop.emit('thumbnail', this, imgSrc);\n                    drop.emit('complete', this);\n                    drop.files.push(this);\n                    filenameDict[this.name] = {\n                      submitted: true,\n                      uuid: this.uuid\n                    };\n                    $dropzone.find(`img[src='${imgSrc}']`).css('max-width', '100%');\n                    const input = $(`<input id=\"${this.uuid}\" name=\"files\" type=\"hidden\">`).val(this.uuid);\n                    $files.append(input);\n                  });\n                });\n              });\n            }\n          });\n          $dropzone.get(0).dropzone.emit('reload');\n        }\n        // Give new write/preview data-tab name to distinguish from others\n        const $editContentForm = $editContentZone.find('.ui.comment.form');\n        const $tabMenu = $editContentForm.find('.tabular.menu');\n        $tabMenu.attr('data-write', $editContentZone.data('write'));\n        $tabMenu.attr('data-preview', $editContentZone.data('preview'));\n        $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write'));\n        $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview'));\n        $editContentForm.find('.write.segment').attr('data-tab', $editContentZone.data('write'));\n        $editContentForm.find('.preview.segment').attr('data-tab', $editContentZone.data('preview'));\n\n        initCommentPreviewTab($editContentForm);\n\n        $editContentZone.find('.cancel.button').click(() => {\n          $renderContent.show();\n          $editContentZone.hide();\n          $dropzone.get(0).dropzone.emit('reload');\n        });\n        $editContentZone.find('.save.button').click(() => {\n          $renderContent.show();\n          $editContentZone.hide();\n          const $attachments = $files.find('[name=files]').map(function () {\n            return $(this).val();\n          }).get();\n          $.post($editContentZone.data('update-url'), {\n            _csrf: csrf,\n            content: $textarea.val(),\n            context: $editContentZone.data('context'),\n            files: $attachments\n          }, (data) => {\n            if (data.length === 0) {\n              $renderContent.html($('#no-content').html());\n            } else {\n              $renderContent.html(data.content);\n              emojify.run($renderContent[0]);\n              $('pre code', $renderContent[0]).each(function () {\n                hljs.highlightBlock(this);\n              });\n            }\n            const $content = $segment.parent();\n            if (!$content.find('.ui.small.images').length) {\n              if (data.attachments !== '') {\n                $content.append(\n                  '<div class=\"ui bottom attached segment\"><div class=\"ui small images\"></div></div>'\n                );\n                $content.find('.ui.small.images').html(data.attachments);\n              }\n            } else if (data.attachments === '') {\n              $content.find('.ui.small.images').parent().remove();\n            } else {\n              $content.find('.ui.small.images').html(data.attachments);\n            }\n            $dropzone.get(0).dropzone.emit('submit');\n            $dropzone.get(0).dropzone.emit('reload');\n          });\n        });\n      } else {\n        $textarea = $segment.find('textarea');\n      }\n\n      // Show write/preview tab and copy raw content as needed\n      $editContentZone.show();\n      $renderContent.hide();\n      if ($textarea.val().length === 0) {\n        $textarea.val($rawContent.text());\n      }\n      $textarea.focus();\n      event.preventDefault();\n    });\n\n    // Delete comment\n    $('.delete-comment').click(function () {\n      const $this = $(this);\n      if (window.confirm($this.data('locale'))) {\n        $.post($this.data('url'), {\n          _csrf: csrf\n        }).success(() => {\n          $(`#${$this.data('comment-id')}`).remove();\n        });\n      }\n      return false;\n    });\n\n    // Change status\n    const $statusButton = $('#status-button');\n    $('#comment-form .edit_area').keyup(function () {\n      if ($(this).val().length === 0) {\n        $statusButton.text($statusButton.data('status'));\n      } else {\n        $statusButton.text($statusButton.data('status-and-comment'));\n      }\n    });\n    $statusButton.click(() => {\n      $('#status').val($statusButton.data('status-val'));\n      $('#comment-form').submit();\n    });\n\n    // Pull Request merge button\n    const $mergeButton = $('.merge-button > button');\n    $mergeButton.on('click', function (e) {\n      e.preventDefault();\n      $(`.${$(this).data('do')}-fields`).show();\n      $(this).parent().hide();\n    });\n    $('.merge-button > .dropdown').dropdown({\n      onChange(_text, _value, $choice) {\n        if ($choice.data('do')) {\n          $mergeButton.find('.button-text').text($choice.text());\n          $mergeButton.data('do', $choice.data('do'));\n        }\n      }\n    });\n    $('.merge-cancel').on('click', function (e) {\n      e.preventDefault();\n      $(this).closest('.form').hide();\n      $mergeButton.parent().show();\n    });\n    initReactionSelector();\n  }\n\n  // Diff\n  if ($('.repository.diff').length > 0) {\n    $('.diff-counter').each(function () {\n      const $item = $(this);\n      const addLine = $item.find('span[data-line].add').data('line');\n      const delLine = $item.find('span[data-line].del').data('line');\n      const addPercent = parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine)) * 100;\n      $item.find('.bar .add').css('width', `${addPercent}%`);\n    });\n  }\n\n  // Quick start and repository home\n  $('#repo-clone-ssh').click(function () {\n    $('.clone-url').text($(this).data('link'));\n    $('#repo-clone-url').val($(this).data('link'));\n    $(this).addClass('blue');\n    $('#repo-clone-https').removeClass('blue');\n    localStorage.setItem('repo-clone-protocol', 'ssh');\n  });\n  $('#repo-clone-https').click(function () {\n    $('.clone-url').text($(this).data('link'));\n    $('#repo-clone-url').val($(this).data('link'));\n    $(this).addClass('blue');\n    $('#repo-clone-ssh').removeClass('blue');\n    localStorage.setItem('repo-clone-protocol', 'https');\n  });\n  $('#repo-clone-url').click(function () {\n    $(this).select();\n  });\n\n  // Pull request\n  const $repoComparePull = $('.repository.compare.pull');\n  if ($repoComparePull.length > 0) {\n    initFilterSearchDropdown('.choose.branch .dropdown');\n    // show pull request form\n    $repoComparePull.find('button.show-form').on('click', function (e) {\n      e.preventDefault();\n      $repoComparePull.find('.pullrequest-form').show();\n      $(this).parent().hide();\n    });\n  }\n\n  // Branches\n  if ($('.repository.settings.branches').length > 0) {\n    initFilterSearchDropdown('.protected-branches .dropdown');\n    $('.enable-protection, .enable-whitelist').change(function () {\n      if (this.checked) {\n        $($(this).data('target')).removeClass('disabled');\n      } else {\n        $($(this).data('target')).addClass('disabled');\n      }\n    });\n  }\n}\n\nfunction initMigration() {\n  const toggleMigrations = function () {\n    const authUserName = $('#auth_username').val();\n    const cloneAddr = $('#clone_addr').val();\n    if (!$('#mirror').is(':checked') && (authUserName && authUserName.length > 0)\n        && (cloneAddr !== undefined && (cloneAddr.startsWith('https://github.com') || cloneAddr.startsWith('http://github.com')))) {\n      $('#migrate_items').show();\n    } else {\n      $('#migrate_items').hide();\n    }\n  };\n\n  toggleMigrations();\n\n  $('#clone_addr').on('input', toggleMigrations);\n  $('#auth_username').on('input', toggleMigrations);\n  $('#mirror').on('change', toggleMigrations);\n}\n\nfunction initPullRequestReview() {\n  $('.show-outdated').on('click', function (e) {\n    e.preventDefault();\n    const id = $(this).data('comment');\n    $(this).addClass('hide');\n    $(`#code-comments-${id}`).removeClass('hide');\n    $(`#code-preview-${id}`).removeClass('hide');\n    $(`#hide-outdated-${id}`).removeClass('hide');\n  });\n\n  $('.hide-outdated').on('click', function (e) {\n    e.preventDefault();\n    const id = $(this).data('comment');\n    $(this).addClass('hide');\n    $(`#code-comments-${id}`).addClass('hide');\n    $(`#code-preview-${id}`).addClass('hide');\n    $(`#show-outdated-${id}`).removeClass('hide');\n  });\n\n  $('button.comment-form-reply').on('click', function (e) {\n    e.preventDefault();\n    $(this).hide();\n    const form = $(this).parent().find('.comment-form');\n    form.removeClass('hide');\n    assingMenuAttributes(form.find('.menu'));\n  });\n  // The following part is only for diff views\n  if ($('.repository.pull.diff').length === 0) {\n    return;\n  }\n\n  $('.diff-detail-box.ui.sticky').sticky();\n\n  $('.btn-review').on('click', function (e) {\n    e.preventDefault();\n    $(this).closest('.dropdown').find('.menu').toggle('visible');\n  }).closest('.dropdown').find('.link.close')\n    .on('click', function (e) {\n      e.preventDefault();\n      $(this).closest('.menu').toggle('visible');\n    });\n\n  $('.code-view .lines-code,.code-view .lines-num')\n    .on('mouseenter', function () {\n      const parent = $(this).closest('td');\n      $(this).closest('tr').addClass(\n        parent.hasClass('lines-num-old') || parent.hasClass('lines-code-old')\n          ? 'focus-lines-old' : 'focus-lines-new'\n      );\n    })\n    .on('mouseleave', function () {\n      $(this).closest('tr').removeClass('focus-lines-new focus-lines-old');\n    });\n  $('.add-code-comment').on('click', function (e) {\n    // https://github.com/go-gitea/gitea/issues/4745\n    if ($(e.target).hasClass('btn-add-single')) {\n      return;\n    }\n    e.preventDefault();\n    const isSplit = $(this).closest('.code-diff').hasClass('code-diff-split');\n    const side = $(this).data('side');\n    const idx = $(this).data('idx');\n    const path = $(this).data('path');\n    const form = $('#pull_review_add_comment').html();\n    const tr = $(this).closest('tr');\n    let ntr = tr.next();\n    if (!ntr.hasClass('add-comment')) {\n      ntr = $(`<tr class=\"add-comment\">${\n        isSplit ? '<td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-left\"></td><td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-right\"></td>'\n          : '<td class=\"lines-num\"></td><td class=\"lines-num\"></td><td class=\"lines-type-marker\"></td><td class=\"add-comment-left add-comment-right\"></td>'\n      }</tr>`);\n      tr.after(ntr);\n    }\n    const td = ntr.find(`.add-comment-${side}`);\n    let commentCloud = td.find('.comment-code-cloud');\n    if (commentCloud.length === 0) {\n      td.html(form);\n      commentCloud = td.find('.comment-code-cloud');\n      assingMenuAttributes(commentCloud.find('.menu'));\n\n      td.find(\"input[name='line']\").val(idx);\n      td.find(\"input[name='side']\").val(side === 'left' ? 'previous' : 'proposed');\n      td.find(\"input[name='path']\").val(path);\n    }\n    commentCloud.find('textarea').focus();\n  });\n}\n\nfunction assingMenuAttributes(menu) {\n  const id = Math.floor(Math.random() * Math.floor(1000000));\n  menu.attr('data-write', menu.attr('data-write') + id);\n  menu.attr('data-preview', menu.attr('data-preview') + id);\n  menu.find('.item').each(function () {\n    const tab = $(this).attr('data-tab') + id;\n    $(this).attr('data-tab', tab);\n  });\n  menu.parent().find(\"*[data-tab='write']\").attr('data-tab', `write${id}`);\n  menu.parent().find(\"*[data-tab='preview']\").attr('data-tab', `preview${id}`);\n  initCommentPreviewTab(menu.parent('.form'));\n  return id;\n}\n\nfunction initRepositoryCollaboration() {\n  // Change collaborator access mode\n  $('.access-mode.menu .item').click(function () {\n    const $menu = $(this).parent();\n    $.post($menu.data('url'), {\n      _csrf: csrf,\n      uid: $menu.data('uid'),\n      mode: $(this).data('value')\n    });\n  });\n}\n\nfunction initTeamSettings() {\n  // Change team access mode\n  $('.organization.new.team input[name=permission]').change(() => {\n    const val = $('input[name=permission]:checked', '.organization.new.team').val();\n    if (val === 'admin') {\n      $('.organization.new.team .team-units').hide();\n    } else {\n      $('.organization.new.team .team-units').show();\n    }\n  });\n}\n\nfunction initWikiForm() {\n  const $editArea = $('.repository.wiki textarea#edit_area');\n  let sideBySideChanges = 0;\n  let sideBySideTimeout = null;\n  if ($editArea.length > 0) {\n    const simplemde = new SimpleMDE({\n      autoDownloadFontAwesome: false,\n      element: $editArea[0],\n      forceSync: true,\n      previewRender(plainText, preview) { // Async method\n        setTimeout(() => {\n          // FIXME: still send render request when return back to edit mode\n          const render = function () {\n            sideBySideChanges = 0;\n            if (sideBySideTimeout != null) {\n              clearTimeout(sideBySideTimeout);\n              sideBySideTimeout = null;\n            }\n            $.post($editArea.data('url'), {\n              _csrf: csrf,\n              mode: 'gfm',\n              context: $editArea.data('context'),\n              text: plainText\n            },\n            (data) => {\n              preview.innerHTML = `<div class=\"markdown ui segment\">${data}</div>`;\n              emojify.run($('.editor-preview')[0]);\n              $(preview).find('pre code').each((_, e) => {\n                hljs.highlightBlock(e);\n              });\n            });\n          };\n          if (!simplemde.isSideBySideActive()) {\n            render();\n          } else {\n            // delay preview by keystroke counting\n            sideBySideChanges++;\n            if (sideBySideChanges > 10) {\n              render();\n            }\n            // or delay preview by timeout\n            if (sideBySideTimeout != null) {\n              clearTimeout(sideBySideTimeout);\n              sideBySideTimeout = null;\n            }\n            sideBySideTimeout = setTimeout(render, 600);\n          }\n        }, 0);\n        if (!simplemde.isSideBySideActive()) {\n          return 'Loading...';\n        }\n        return preview.innerHTML;\n      },\n      renderingConfig: {\n        singleLineBreaks: false\n      },\n      indentWithTabs: false,\n      tabSize: 4,\n      spellChecker: false,\n      toolbar: ['bold', 'italic', 'strikethrough', '|',\n        'heading-1', 'heading-2', 'heading-3', 'heading-bigger', 'heading-smaller', '|',\n        {\n          name: 'code-inline',\n          action(e) {\n            const cm = e.codemirror;\n            const selection = cm.getSelection();\n            cm.replaceSelection(`\\`${selection}\\``);\n            if (!selection) {\n              const cursorPos = cm.getCursor();\n              cm.setCursor(cursorPos.line, cursorPos.ch - 1);\n            }\n            cm.focus();\n          },\n          className: 'fa fa-angle-right',\n          title: 'Add Inline Code',\n        }, 'code', 'quote', '|', {\n          name: 'checkbox-empty',\n          action(e) {\n            const cm = e.codemirror;\n            cm.replaceSelection(`\\n- [ ] ${cm.getSelection()}`);\n            cm.focus();\n          },\n          className: 'fa fa-square-o',\n          title: 'Add Checkbox (empty)',\n        },\n        {\n          name: 'checkbox-checked',\n          action(e) {\n            const cm = e.codemirror;\n            cm.replaceSelection(`\\n- [x] ${cm.getSelection()}`);\n            cm.focus();\n          },\n          className: 'fa fa-check-square-o',\n          title: 'Add Checkbox (checked)',\n        }, '|',\n        'unordered-list', 'ordered-list', '|',\n        'link', 'image', 'table', 'horizontal-rule', '|',\n        'clean-block', 'preview', 'fullscreen', 'side-by-side']\n    });\n    $(simplemde.codemirror.getInputField()).addClass('js-quick-submit');\n\n    setTimeout(() => {\n      const $bEdit = $('.repository.wiki.new .previewtabs a[data-tab=\"write\"]');\n      const $bPrev = $('.repository.wiki.new .previewtabs a[data-tab=\"preview\"]');\n      const $toolbar = $('.editor-toolbar');\n      const $bPreview = $('.editor-toolbar a.fa-eye');\n      const $bSideBySide = $('.editor-toolbar a.fa-columns');\n      $bEdit.on('click', () => {\n        if ($toolbar.hasClass('disabled-for-preview')) {\n          $bPreview.click();\n        }\n      });\n      $bPrev.on('click', () => {\n        if (!$toolbar.hasClass('disabled-for-preview')) {\n          $bPreview.click();\n        }\n      });\n      $bPreview.on('click', () => {\n        setTimeout(() => {\n          if ($toolbar.hasClass('disabled-for-preview')) {\n            if ($bEdit.hasClass('active')) {\n              $bEdit.removeClass('active');\n            }\n            if (!$bPrev.hasClass('active')) {\n              $bPrev.addClass('active');\n            }\n          } else {\n            if (!$bEdit.hasClass('active')) {\n              $bEdit.addClass('active');\n            }\n            if ($bPrev.hasClass('active')) {\n              $bPrev.removeClass('active');\n            }\n          }\n        }, 0);\n      });\n      $bSideBySide.on('click', () => {\n        sideBySideChanges = 10;\n      });\n    }, 0);\n  }\n}\n\n// Adding function to get the cursor position in a text field to jQuery object.\n$.fn.getCursorPosition = function () {\n  const el = $(this).get(0);\n  let pos = 0;\n  if ('selectionStart' in el) {\n    pos = el.selectionStart;\n  } else if ('selection' in document) {\n    el.focus();\n    const Sel = document.selection.createRange();\n    const SelLength = document.selection.createRange().text.length;\n    Sel.moveStart('character', -el.value.length);\n    pos = Sel.text.length - SelLength;\n  }\n  return pos;\n};\n\nfunction setSimpleMDE($editArea) {\n  if (codeMirrorEditor) {\n    codeMirrorEditor.toTextArea();\n    codeMirrorEditor = null;\n  }\n\n  if (simpleMDEditor) {\n    return true;\n  }\n\n  simpleMDEditor = new SimpleMDE({\n    autoDownloadFontAwesome: false,\n    element: $editArea[0],\n    forceSync: true,\n    renderingConfig: {\n      singleLineBreaks: false\n    },\n    indentWithTabs: false,\n    tabSize: 4,\n    spellChecker: false,\n    previewRender(plainText, preview) { // Async method\n      setTimeout(() => {\n        // FIXME: still send render request when return back to edit mode\n        $.post($editArea.data('url'), {\n          _csrf: csrf,\n          mode: 'gfm',\n          context: $editArea.data('context'),\n          text: plainText\n        },\n        (data) => {\n          preview.innerHTML = `<div class=\"markdown ui segment\">${data}</div>`;\n          emojify.run($('.editor-preview')[0]);\n        });\n      }, 0);\n\n      return 'Loading...';\n    },\n    toolbar: ['bold', 'italic', 'strikethrough', '|',\n      'heading-1', 'heading-2', 'heading-3', 'heading-bigger', 'heading-smaller', '|',\n      'code', 'quote', '|',\n      'unordered-list', 'ordered-list', '|',\n      'link', 'image', 'table', 'horizontal-rule', '|',\n      'clean-block', 'preview', 'fullscreen', 'side-by-side']\n  });\n\n  return true;\n}\n\nfunction setCodeMirror($editArea) {\n  if (simpleMDEditor) {\n    simpleMDEditor.toTextArea();\n    simpleMDEditor = null;\n  }\n\n  if (codeMirrorEditor) {\n    return true;\n  }\n\n  codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], {\n    lineNumbers: true\n  });\n  codeMirrorEditor.on('change', (cm, _change) => {\n    $editArea.val(cm.getValue());\n  });\n\n  return true;\n}\n\nfunction initEditor() {\n  $('.js-quick-pull-choice-option').change(function () {\n    if ($(this).val() === 'commit-to-new-branch') {\n      $('.quick-pull-branch-name').show();\n      $('.quick-pull-branch-name input').prop('required', true);\n    } else {\n      $('.quick-pull-branch-name').hide();\n      $('.quick-pull-branch-name input').prop('required', false);\n    }\n    $('#commit-button').text($(this).attr('button_text'));\n  });\n\n  const $editFilename = $('#file-name');\n  $editFilename.keyup(function (e) {\n    const $section = $('.breadcrumb span.section');\n    const $divider = $('.breadcrumb div.divider');\n    let value;\n    let parts;\n\n    if (e.keyCode === 8) {\n      if ($(this).getCursorPosition() === 0) {\n        if ($section.length > 0) {\n          value = $section.last().find('a').text();\n          $(this).val(value + $(this).val());\n          $(this)[0].setSelectionRange(value.length, value.length);\n          $section.last().remove();\n          $divider.last().remove();\n        }\n      }\n    }\n    if (e.keyCode === 191) {\n      parts = $(this).val().split('/');\n      for (let i = 0; i < parts.length; ++i) {\n        value = parts[i];\n        if (i < parts.length - 1) {\n          if (value.length) {\n            $(`<span class=\"section\"><a href=\"#\">${value}</a></span>`).insertBefore($(this));\n            $('<div class=\"divider\"> / </div>').insertBefore($(this));\n          }\n        } else {\n          $(this).val(value);\n        }\n        $(this)[0].setSelectionRange(0, 0);\n      }\n    }\n    parts = [];\n    $('.breadcrumb span.section').each(function () {\n      const element = $(this);\n      if (element.find('a').length) {\n        parts.push(element.find('a').text());\n      } else {\n        parts.push(element.text());\n      }\n    });\n    if ($(this).val()) parts.push($(this).val());\n    $('#tree_path').val(parts.join('/'));\n  }).trigger('keyup');\n\n  const $editArea = $('.repository.editor textarea#edit_area');\n  if (!$editArea.length) return;\n\n  const markdownFileExts = $editArea.data('markdown-file-exts').split(',');\n  const lineWrapExtensions = $editArea.data('line-wrap-extensions').split(',');\n\n  $editFilename.on('keyup', () => {\n    const val = $editFilename.val();\n    let mode, spec, extension, extWithDot, dataUrl, apiCall;\n\n    extension = extWithDot = '';\n    const m = /.+\\.([^.]+)$/.exec(val);\n    if (m) {\n      extension = m[1];\n      extWithDot = `.${extension}`;\n    }\n\n    const info = CodeMirror.findModeByExtension(extension);\n    const previewLink = $('a[data-tab=preview]');\n    if (info) {\n      mode = info.mode;\n      spec = info.mime;\n      apiCall = mode;\n    } else {\n      apiCall = extension;\n    }\n\n    if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.indexOf(apiCall) >= 0) {\n      dataUrl = previewLink.data('url');\n      previewLink.data('url', dataUrl.replace(/(.*)\\/.*/i, `$1/${mode}`));\n      previewLink.show();\n    } else {\n      previewLink.hide();\n    }\n\n    // If this file is a Markdown extensions, we will load that editor and return\n    if (markdownFileExts.indexOf(extWithDot) >= 0) {\n      if (setSimpleMDE($editArea)) {\n        return;\n      }\n    }\n\n    // Else we are going to use CodeMirror\n    if (!codeMirrorEditor && !setCodeMirror($editArea)) {\n      return;\n    }\n\n    if (mode) {\n      codeMirrorEditor.setOption('mode', spec);\n      CodeMirror.autoLoadMode(codeMirrorEditor, mode);\n    }\n\n    if (lineWrapExtensions.indexOf(extWithDot) >= 0) {\n      codeMirrorEditor.setOption('lineWrapping', true);\n    } else {\n      codeMirrorEditor.setOption('lineWrapping', false);\n    }\n\n    // get the filename without any folder\n    let value = $editFilename.val();\n    if (value.length === 0) {\n      return;\n    }\n    value = value.split('/');\n    value = value[value.length - 1];\n\n    $.getJSON($editFilename.data('ec-url-prefix') + value, (editorconfig) => {\n      if (editorconfig.indent_style === 'tab') {\n        codeMirrorEditor.setOption('indentWithTabs', true);\n        codeMirrorEditor.setOption('extraKeys', {});\n      } else {\n        codeMirrorEditor.setOption('indentWithTabs', false);\n        // required because CodeMirror doesn't seems to use spaces correctly for {\"indentWithTabs\": false}:\n        // - https://github.com/codemirror/CodeMirror/issues/988\n        // - https://codemirror.net/doc/manual.html#keymaps\n        codeMirrorEditor.setOption('extraKeys', {\n          Tab(cm) {\n            const spaces = Array(parseInt(cm.getOption('indentUnit')) + 1).join(' ');\n            cm.replaceSelection(spaces);\n          }\n        });\n      }\n      codeMirrorEditor.setOption('indentUnit', editorconfig.indent_size || 4);\n      codeMirrorEditor.setOption('tabSize', editorconfig.tab_width || 4);\n    });\n  }).trigger('keyup');\n\n  // Using events from https://github.com/codedance/jquery.AreYouSure#advanced-usage\n  // to enable or disable the commit button\n  const $commitButton = $('#commit-button');\n  const $editForm = $('.ui.edit.form');\n  const dirtyFileClass = 'dirty-file';\n\n  // Disabling the button at the start\n  $commitButton.prop('disabled', true);\n\n  // Registering a custom listener for the file path and the file content\n  $editForm.areYouSure({\n    silent: true,\n    dirtyClass: dirtyFileClass,\n    fieldSelector: ':input:not(.commit-form-wrapper :input)',\n    change() {\n      const dirty = $(this).hasClass(dirtyFileClass);\n      $commitButton.prop('disabled', !dirty);\n    }\n  });\n\n  $commitButton.click((event) => {\n    // A modal which asks if an empty file should be committed\n    if ($editArea.val().length === 0) {\n      $('#edit-empty-content-modal').modal({\n        onApprove() {\n          $('.edit.form').submit();\n        }\n      }).modal('show');\n      event.preventDefault();\n    }\n  });\n}\n\nfunction initOrganization() {\n  if ($('.organization').length === 0) {\n    return;\n  }\n\n  // Options\n  if ($('.organization.settings.options').length > 0) {\n    $('#org_name').keyup(function () {\n      const $prompt = $('#org-name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('org-name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n  }\n}\n\nfunction initUserSettings() {\n  // Options\n  if ($('.user.settings.profile').length > 0) {\n    $('#username').keyup(function () {\n      const $prompt = $('#name-change-prompt');\n      if ($(this).val().toString().toLowerCase() !== $(this).data('name').toString().toLowerCase()) {\n        $prompt.show();\n      } else {\n        $prompt.hide();\n      }\n    });\n  }\n}\n\nfunction initGithook() {\n  if ($('.edit.githook').length === 0) {\n    return;\n  }\n\n  CodeMirror.autoLoadMode(CodeMirror.fromTextArea($('#content')[0], {\n    lineNumbers: true,\n    mode: 'shell'\n  }), 'shell');\n}\n\nfunction initWebhook() {\n  if ($('.new.webhook').length === 0) {\n    return;\n  }\n\n  $('.events.checkbox input').change(function () {\n    if ($(this).is(':checked')) {\n      $('.events.fields').show();\n    }\n  });\n  $('.non-events.checkbox input').change(function () {\n    if ($(this).is(':checked')) {\n      $('.events.fields').hide();\n    }\n  });\n\n  const updateContentType = function () {\n    const visible = $('#http_method').val() === 'POST';\n    $('#content_type').parent().parent()[visible ? 'show' : 'hide']();\n  };\n  updateContentType();\n  $('#http_method').change(() => {\n    updateContentType();\n  });\n\n  // Test delivery\n  $('#test-delivery').click(function () {\n    const $this = $(this);\n    $this.addClass('loading disabled');\n    $.post($this.data('link'), {\n      _csrf: csrf\n    }).done(\n      setTimeout(() => {\n        window.location.href = $this.data('redirect');\n      }, 5000)\n    );\n  });\n}\n\nfunction initAdmin() {\n  if ($('.admin').length === 0) {\n    return;\n  }\n\n  // New user\n  if ($('.admin.new.user').length > 0 || $('.admin.edit.user').length > 0) {\n    $('#login_type').change(function () {\n      if ($(this).val().substring(0, 1) === '0') {\n        $('#login_name').removeAttr('required');\n        $('.non-local').hide();\n        $('.local').show();\n        $('#user_name').focus();\n\n        if ($(this).data('password') === 'required') {\n          $('#password').attr('required', 'required');\n        }\n      } else {\n        $('#login_name').attr('required', 'required');\n        $('.non-local').show();\n        $('.local').hide();\n        $('#login_name').focus();\n\n        $('#password').removeAttr('required');\n      }\n    });\n  }\n\n  function onSecurityProtocolChange() {\n    if ($('#security_protocol').val() > 0) {\n      $('.has-tls').show();\n    } else {\n      $('.has-tls').hide();\n    }\n  }\n\n  function onUsePagedSearchChange() {\n    if ($('#use_paged_search').prop('checked')) {\n      $('.search-page-size').show()\n        .find('input').attr('required', 'required');\n    } else {\n      $('.search-page-size').hide()\n        .find('input').removeAttr('required');\n    }\n  }\n\n  function onOAuth2Change() {\n    $('.open_id_connect_auto_discovery_url, .oauth2_use_custom_url').hide();\n    $('.open_id_connect_auto_discovery_url input[required]').removeAttr('required');\n\n    const provider = $('#oauth2_provider').val();\n    switch (provider) {\n      case 'github':\n      case 'gitlab':\n      case 'gitea':\n        $('.oauth2_use_custom_url').show();\n        break;\n      case 'openidConnect':\n        $('.open_id_connect_auto_discovery_url input').attr('required', 'required');\n        $('.open_id_connect_auto_discovery_url').show();\n        break;\n    }\n    onOAuth2UseCustomURLChange();\n  }\n\n  function onOAuth2UseCustomURLChange() {\n    const provider = $('#oauth2_provider').val();\n    $('.oauth2_use_custom_url_field').hide();\n    $('.oauth2_use_custom_url_field input[required]').removeAttr('required');\n\n    if ($('#oauth2_use_custom_url').is(':checked')) {\n      if (!$('#oauth2_token_url').val()) {\n        $('#oauth2_token_url').val($(`#${provider}_token_url`).val());\n      }\n      if (!$('#oauth2_auth_url').val()) {\n        $('#oauth2_auth_url').val($(`#${provider}_auth_url`).val());\n      }\n      if (!$('#oauth2_profile_url').val()) {\n        $('#oauth2_profile_url').val($(`#${provider}_profile_url`).val());\n      }\n      if (!$('#oauth2_email_url').val()) {\n        $('#oauth2_email_url').val($(`#${provider}_email_url`).val());\n      }\n      switch (provider) {\n        case 'github':\n          $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input').attr('required', 'required');\n          $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url').show();\n          break;\n        case 'gitea':\n        case 'gitlab':\n          $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input').attr('required', 'required');\n          $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url').show();\n          $('#oauth2_email_url').val('');\n          break;\n      }\n    }\n  }\n\n  // New authentication\n  if ($('.admin.new.authentication').length > 0) {\n    $('#auth_type').change(function () {\n      $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size .sspi').hide();\n\n      $('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required], .sspi input[required]').removeAttr('required');\n      $('.binddnrequired').removeClass('required');\n\n      const authType = $(this).val();\n      switch (authType) {\n        case '2': // LDAP\n          $('.ldap').show();\n          $('.binddnrequired input, .ldap div.required:not(.dldap) input').attr('required', 'required');\n          $('.binddnrequired').addClass('required');\n          break;\n        case '3': // SMTP\n          $('.smtp').show();\n          $('.has-tls').show();\n          $('.smtp div.required input, .has-tls').attr('required', 'required');\n          break;\n        case '4': // PAM\n          $('.pam').show();\n          $('.pam input').attr('required', 'required');\n          break;\n        case '5': // LDAP\n          $('.dldap').show();\n          $('.dldap div.required:not(.ldap) input').attr('required', 'required');\n          break;\n        case '6': // OAuth2\n          $('.oauth2').show();\n          $('.oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input').attr('required', 'required');\n          onOAuth2Change();\n          break;\n        case '7': // SSPI\n          $('.sspi').show();\n          $('.sspi div.required input').attr('required', 'required');\n          break;\n      }\n      if (authType === '2' || authType === '5') {\n        onSecurityProtocolChange();\n      }\n      if (authType === '2') {\n        onUsePagedSearchChange();\n      }\n    });\n    $('#auth_type').change();\n    $('#security_protocol').change(onSecurityProtocolChange);\n    $('#use_paged_search').change(onUsePagedSearchChange);\n    $('#oauth2_provider').change(onOAuth2Change);\n    $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange);\n  }\n  // Edit authentication\n  if ($('.admin.edit.authentication').length > 0) {\n    const authType = $('#auth_type').val();\n    if (authType === '2' || authType === '5') {\n      $('#security_protocol').change(onSecurityProtocolChange);\n      if (authType === '2') {\n        $('#use_paged_search').change(onUsePagedSearchChange);\n      }\n    } else if (authType === '6') {\n      $('#oauth2_provider').change(onOAuth2Change);\n      $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange);\n      onOAuth2Change();\n    }\n  }\n\n  // Notice\n  if ($('.admin.notice')) {\n    const $detailModal = $('#detail-modal');\n\n    // Attach view detail modals\n    $('.view-detail').click(function () {\n      $detailModal.find('.content p').text($(this).data('content'));\n      $detailModal.modal('show');\n      return false;\n    });\n\n    // Select actions\n    const $checkboxes = $('.select.table .ui.checkbox');\n    $('.select.action').click(function () {\n      switch ($(this).data('action')) {\n        case 'select-all':\n          $checkboxes.checkbox('check');\n          break;\n        case 'deselect-all':\n          $checkboxes.checkbox('uncheck');\n          break;\n        case 'inverse':\n          $checkboxes.checkbox('toggle');\n          break;\n      }\n    });\n    $('#delete-selection').click(function () {\n      const $this = $(this);\n      $this.addClass('loading disabled');\n      const ids = [];\n      $checkboxes.each(function () {\n        if ($(this).checkbox('is checked')) {\n          ids.push($(this).data('id'));\n        }\n      });\n      $.post($this.data('link'), {\n        _csrf: csrf,\n        ids\n      }).done(() => {\n        window.location.href = $this.data('redirect');\n      });\n    });\n  }\n}\n\nfunction buttonsClickOnEnter() {\n  $('.ui.button').keypress(function (e) {\n    if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar\n      $(this).click();\n    }\n  });\n}\n\nfunction searchUsers() {\n  const $searchUserBox = $('#search-user-box');\n  $searchUserBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/users/search?q={query}`,\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          let title = item.login;\n          if (item.full_name && item.full_name.length > 0) {\n            title += ` (${htmlEncode(item.full_name)})`;\n          }\n          items.push({\n            title,\n            image: item.avatar_url\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['login', 'full_name'],\n    showNoResults: false\n  });\n}\n\nfunction searchTeams() {\n  const $searchTeamBox = $('#search-team-box');\n  $searchTeamBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,\n      headers: { 'X-Csrf-Token': csrf },\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          const title = `${item.name} (${item.permission} access)`;\n          items.push({\n            title,\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['name', 'description'],\n    showNoResults: false\n  });\n}\n\nfunction searchRepositories() {\n  const $searchRepoBox = $('#search-repo-box');\n  $searchRepoBox.search({\n    minCharacters: 2,\n    apiSettings: {\n      url: `${suburl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,\n      onResponse(response) {\n        const items = [];\n        $.each(response.data, (_i, item) => {\n          items.push({\n            title: item.full_name.split('/')[1],\n            description: item.full_name\n          });\n        });\n\n        return { results: items };\n      }\n    },\n    searchFields: ['full_name'],\n    showNoResults: false\n  });\n}\n\nfunction initCodeView() {\n  if ($('.code-view .linenums').length > 0) {\n    $(document).on('click', '.lines-num span', function (e) {\n      const $select = $(this);\n      const $list = $select.parent().siblings('.lines-code').find('ol.linenums > li');\n      selectRange($list, $list.filter(`[rel=${$select.attr('id')}]`), (e.shiftKey ? $list.filter('.active').eq(0) : null));\n      deSelect();\n    });\n\n    $(window).on('hashchange', () => {\n      let m = window.location.hash.match(/^#(L\\d+)-(L\\d+)$/);\n      const $list = $('.code-view ol.linenums > li');\n      let $first;\n      if (m) {\n        $first = $list.filter(`.${m[1]}`);\n        selectRange($list, $first, $list.filter(`.${m[2]}`));\n        $('html, body').scrollTop($first.offset().top - 200);\n        return;\n      }\n      m = window.location.hash.match(/^#(L|n)(\\d+)$/);\n      if (m) {\n        $first = $list.filter(`.L${m[2]}`);\n        selectRange($list, $first);\n        $('html, body').scrollTop($first.offset().top - 200);\n      }\n    }).trigger('hashchange');\n  }\n  $('.ui.fold-code').on('click', (e) => {\n    const $foldButton = $(e.target);\n    if ($foldButton.hasClass('fa-chevron-down')) {\n      $(e.target).parent().next().slideUp('fast', () => {\n        $foldButton.removeClass('fa-chevron-down').addClass('fa-chevron-right');\n      });\n    } else {\n      $(e.target).parent().next().slideDown('fast', () => {\n        $foldButton.removeClass('fa-chevron-right').addClass('fa-chevron-down');\n      });\n    }\n  });\n  function insertBlobExcerpt(e) {\n    const $blob = $(e.target);\n    const $row = $blob.parent().parent();\n    $.get(`${$blob.data('url')}?${$blob.data('query')}&anchor=${$blob.data('anchor')}`, (blob) => {\n      $row.replaceWith(blob);\n      $(`[data-anchor=\"${$blob.data('anchor')}\"]`).on('click', (e) => { insertBlobExcerpt(e); });\n    });\n  }\n  $('.ui.blob-excerpt').on('click', (e) => { insertBlobExcerpt(e); });\n}\n\nfunction initU2FAuth() {\n  if ($('#wait-for-key').length === 0) {\n    return;\n  }\n  u2fApi.ensureSupport()\n    .then(() => {\n      $.getJSON(`${suburl}/user/u2f/challenge`).success((req) => {\n        u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30)\n          .then(u2fSigned)\n          .catch((err) => {\n            if (err === undefined) {\n              u2fError(1);\n              return;\n            }\n            u2fError(err.metaData.code);\n          });\n      });\n    }).catch(() => {\n      // Fallback in case browser do not support U2F\n      window.location.href = `${suburl}/user/two_factor`;\n    });\n}\nfunction u2fSigned(resp) {\n  $.ajax({\n    url: `${suburl}/user/u2f/sign`,\n    type: 'POST',\n    headers: { 'X-Csrf-Token': csrf },\n    data: JSON.stringify(resp),\n    contentType: 'application/json; charset=utf-8',\n  }).done((res) => {\n    window.location.replace(res);\n  }).fail(() => {\n    u2fError(1);\n  });\n}\n\nfunction u2fRegistered(resp) {\n  if (checkError(resp)) {\n    return;\n  }\n  $.ajax({\n    url: `${suburl}/user/settings/security/u2f/register`,\n    type: 'POST',\n    headers: { 'X-Csrf-Token': csrf },\n    data: JSON.stringify(resp),\n    contentType: 'application/json; charset=utf-8',\n    success() {\n      reload();\n    },\n    fail() {\n      u2fError(1);\n    }\n  });\n}\n\nfunction checkError(resp) {\n  if (!('errorCode' in resp)) {\n    return false;\n  }\n  if (resp.errorCode === 0) {\n    return false;\n  }\n  u2fError(resp.errorCode);\n  return true;\n}\n\n\nfunction u2fError(errorType) {\n  const u2fErrors = {\n    browser: $('#unsupported-browser'),\n    1: $('#u2f-error-1'),\n    2: $('#u2f-error-2'),\n    3: $('#u2f-error-3'),\n    4: $('#u2f-error-4'),\n    5: $('.u2f-error-5')\n  };\n  u2fErrors[errorType].removeClass('hide');\n\n  Object.keys(u2fErrors).forEach((type) => {\n    if (type !== errorType) {\n      u2fErrors[type].addClass('hide');\n    }\n  });\n  $('#u2f-error').modal('show');\n}\n\nfunction initU2FRegister() {\n  $('#register-device').modal({ allowMultiple: false });\n  $('#u2f-error').modal({ allowMultiple: false });\n  $('#register-security-key').on('click', (e) => {\n    e.preventDefault();\n    u2fApi.ensureSupport()\n      .then(u2fRegisterRequest)\n      .catch(() => {\n        u2fError('browser');\n      });\n  });\n}\n\nfunction u2fRegisterRequest() {\n  $.post(`${suburl}/user/settings/security/u2f/request_register`, {\n    _csrf: csrf,\n    name: $('#nickname').val()\n  }).success((req) => {\n    $('#nickname').closest('div.field').removeClass('error');\n    $('#register-device').modal('show');\n    if (req.registeredKeys === null) {\n      req.registeredKeys = [];\n    }\n    u2fApi.register(req.appId, req.registerRequests, req.registeredKeys, 30)\n      .then(u2fRegistered)\n      .catch((reason) => {\n        if (reason === undefined) {\n          u2fError(1);\n          return;\n        }\n        u2fError(reason.metaData.code);\n      });\n  }).fail((xhr) => {\n    if (xhr.status === 409) {\n      $('#nickname').closest('div.field').addClass('error');\n    }\n  });\n}\n\nfunction initWipTitle() {\n  $('.title_wip_desc > a').click((e) => {\n    e.preventDefault();\n\n    const $issueTitle = $('#issue_title');\n    $issueTitle.focus();\n    const value = $issueTitle.val().trim().toUpperCase();\n\n    for (const i in wipPrefixes) {\n      if (value.startsWith(wipPrefixes[i].toUpperCase())) {\n        return;\n      }\n    }\n\n    $issueTitle.val(`${wipPrefixes[0]} ${$issueTitle.val()}`);\n  });\n}\n\nfunction initTemplateSearch() {\n  const $repoTemplate = $('#repo_template');\n  const checkTemplate = function () {\n    const $templateUnits = $('#template_units');\n    const $nonTemplate = $('#non_template');\n    if ($repoTemplate.val() !== '') {\n      $templateUnits.show();\n      $nonTemplate.hide();\n    } else {\n      $templateUnits.hide();\n      $nonTemplate.show();\n    }\n  };\n  $repoTemplate.change(checkTemplate);\n  checkTemplate();\n\n  const changeOwner = function () {\n    $('#repo_template_search')\n      .dropdown({\n        apiSettings: {\n          url: `${suburl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,\n          onResponse(response) {\n            const filteredResponse = { success: true, results: [] };\n            filteredResponse.results.push({\n              name: '',\n              value: ''\n            });\n            // Parse the response from the api to work with our dropdown\n            $.each(response.data, (_r, repo) => {\n              filteredResponse.results.push({\n                name: htmlEncode(repo.full_name),\n                value: repo.id\n              });\n            });\n            return filteredResponse;\n          },\n          cache: false,\n        },\n\n        fullTextSearch: true\n      });\n  };\n  $('#uid').change(changeOwner);\n  changeOwner();\n}\n\n$(document).ready(() => {\n  csrf = $('meta[name=_csrf]').attr('content');\n  suburl = $('meta[name=_suburl]').attr('content');\n\n  // Show exact time\n  $('.time-since').each(function () {\n    $(this)\n      .addClass('poping up')\n      .attr('data-content', $(this).attr('title'))\n      .attr('data-variation', 'inverted tiny')\n      .attr('title', '');\n  });\n\n  // Semantic UI modules.\n  $('.dropdown:not(.custom)').dropdown();\n  $('.jump.dropdown').dropdown({\n    action: 'hide',\n    onShow() {\n      $('.poping.up').popup('hide');\n    }\n  });\n  $('.slide.up.dropdown').dropdown({\n    transition: 'slide up'\n  });\n  $('.upward.dropdown').dropdown({\n    direction: 'upward'\n  });\n  $('.ui.accordion').accordion();\n  $('.ui.checkbox').checkbox();\n  $('.ui.progress').progress({\n    showActivity: false\n  });\n  $('.poping.up').popup();\n  $('.top.menu .poping.up').popup({\n    onShow() {\n      if ($('.top.menu .menu.transition').hasClass('visible')) {\n        return false;\n      }\n    }\n  });\n  $('.tabular.menu .item').tab();\n  $('.tabable.menu .item').tab();\n\n  $('.toggle.button').click(function () {\n    $($(this).data('target')).slideToggle(100);\n  });\n\n  // make table <tr> element clickable like a link\n  $('tr[data-href]').click(function () {\n    window.location = $(this).data('href');\n  });\n\n  // Highlight JS\n  if (typeof hljs !== 'undefined') {\n    const nodes = [].slice.call(document.querySelectorAll('pre code') || []);\n    for (let i = 0; i < nodes.length; i++) {\n      hljs.highlightBlock(nodes[i]);\n    }\n  }\n\n  // Dropzone\n  const $dropzone = $('#dropzone');\n  if ($dropzone.length > 0) {\n    const filenameDict = {};\n\n    new Dropzone('#dropzone', {\n      url: $dropzone.data('upload-url'),\n      headers: { 'X-Csrf-Token': csrf },\n      maxFiles: $dropzone.data('max-file'),\n      maxFilesize: $dropzone.data('max-size'),\n      acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),\n      addRemoveLinks: true,\n      dictDefaultMessage: $dropzone.data('default-message'),\n      dictInvalidFileType: $dropzone.data('invalid-input-type'),\n      dictFileTooBig: $dropzone.data('file-too-big'),\n      dictRemoveFile: $dropzone.data('remove-file'),\n      init() {\n        this.on('success', (file, data) => {\n          filenameDict[file.name] = data.uuid;\n          const input = $(`<input id=\"${data.uuid}\" name=\"files\" type=\"hidden\">`).val(data.uuid);\n          $('.files').append(input);\n        });\n        this.on('removedfile', (file) => {\n          if (file.name in filenameDict) {\n            $(`#${filenameDict[file.name]}`).remove();\n          }\n          if ($dropzone.data('remove-url') && $dropzone.data('csrf')) {\n            $.post($dropzone.data('remove-url'), {\n              file: filenameDict[file.name],\n              _csrf: $dropzone.data('csrf')\n            });\n          }\n        });\n      },\n    });\n  }\n\n  // Emojify\n  emojify.setConfig({\n    img_dir: `${suburl}/vendor/plugins/emojify/images`,\n    ignore_emoticons: true\n  });\n  const hasEmoji = document.getElementsByClassName('has-emoji');\n  for (let i = 0; i < hasEmoji.length; i++) {\n    emojify.run(hasEmoji[i]);\n    for (let j = 0; j < hasEmoji[i].childNodes.length; j++) {\n      if (hasEmoji[i].childNodes[j].nodeName === 'A') {\n        emojify.run(hasEmoji[i].childNodes[j]);\n      }\n    }\n  }\n\n  // Clipboard JS\n  const clipboard = new Clipboard('.clipboard');\n  clipboard.on('success', (e) => {\n    e.clearSelection();\n\n    $(`#${e.trigger.getAttribute('id')}`).popup('destroy');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-success'));\n    $(`#${e.trigger.getAttribute('id')}`).popup('show');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'));\n  });\n\n  clipboard.on('error', (e) => {\n    $(`#${e.trigger.getAttribute('id')}`).popup('destroy');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-error'));\n    $(`#${e.trigger.getAttribute('id')}`).popup('show');\n    e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'));\n  });\n\n  // Helpers.\n  $('.delete-button').click(showDeletePopup);\n  $('.add-all-button').click(showAddAllPopup);\n\n  $('.delete-branch-button').click(showDeletePopup);\n\n  $('.undo-button').click(function () {\n    const $this = $(this);\n    $.post($this.data('url'), {\n      _csrf: csrf,\n      id: $this.data('id')\n    }).done((data) => {\n      window.location.href = data.redirect;\n    });\n  });\n  $('.show-panel.button').click(function () {\n    $($(this).data('panel')).show();\n  });\n  $('.show-modal.button').click(function () {\n    $($(this).data('modal')).modal('show');\n  });\n  $('.delete-post.button').click(function () {\n    const $this = $(this);\n    $.post($this.data('request-url'), {\n      _csrf: csrf\n    }).done(() => {\n      window.location.href = $this.data('done-url');\n    });\n  });\n\n  // Set anchor.\n  $('.markdown').each(function () {\n    const headers = {};\n    $(this).find('h1, h2, h3, h4, h5, h6').each(function () {\n      let node = $(this);\n      const val = encodeURIComponent(node.text().toLowerCase().replace(/[^\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w\\- ]/g, '').replace(/[ ]/g, '-'));\n      let name = val;\n      if (headers[val] > 0) {\n        name = `${val}-${headers[val]}`;\n      }\n      if (headers[val] === undefined) {\n        headers[val] = 1;\n      } else {\n        headers[val] += 1;\n      }\n      node = node.wrap(`<div id=\"${name}\" class=\"anchor-wrap\" ></div>`);\n      node.append(`<a class=\"anchor\" href=\"#${name}\"><span class=\"octicon octicon-link\"></span></a>`);\n    });\n  });\n\n  $('.issue-checkbox').click(() => {\n    const numChecked = $('.issue-checkbox').children('input:checked').length;\n    if (numChecked > 0) {\n      $('#issue-filters').addClass('hide');\n      $('#issue-actions').removeClass('hide');\n    } else {\n      $('#issue-filters').removeClass('hide');\n      $('#issue-actions').addClass('hide');\n    }\n  });\n\n  $('.issue-action').click(function () {\n    let { action } = this.dataset;\n    let { elementId } = this.dataset;\n    const issueIDs = $('.issue-checkbox').children('input:checked').map(function () {\n      return this.dataset.issueId;\n    }).get().join();\n    const { url } = this.dataset;\n    if (elementId === '0' && url.substr(-9) === '/assignee') {\n      elementId = '';\n      action = 'clear';\n    }\n    updateIssuesMeta(url, action, issueIDs, elementId).then(() => {\n      // NOTICE: This reset of checkbox state targets Firefox caching behaviour, as the checkboxes stay checked after reload\n      if (action === 'close' || action === 'open') {\n        // uncheck all checkboxes\n        $('.issue-checkbox input[type=\"checkbox\"]').each((_, e) => { e.checked = false; });\n      }\n      reload();\n    });\n  });\n\n  // NOTICE: This event trigger targets Firefox caching behaviour, as the checkboxes stay checked after reload\n  // trigger ckecked event, if checkboxes are checked on load\n  $('.issue-checkbox input[type=\"checkbox\"]:checked').first().each((_, e) => {\n    e.checked = false;\n    $(e).click();\n  });\n\n  buttonsClickOnEnter();\n  searchUsers();\n  searchTeams();\n  searchRepositories();\n\n  initCommentForm();\n  initInstall();\n  initRepository();\n  initMigration();\n  initWikiForm();\n  initEditForm();\n  initEditor();\n  initOrganization();\n  initGithook();\n  initWebhook();\n  initAdmin();\n  initCodeView();\n  initVueApp();\n  initTeamSettings();\n  initCtrlEnterSubmit();\n  initNavbarContentToggle();\n  initTopicbar();\n  initU2FAuth();\n  initU2FRegister();\n  initIssueList();\n  initWipTitle();\n  initPullRequestReview();\n  initRepoStatusChecker();\n  initTemplateSearch();\n\n  // Repo clone url.\n  if ($('#repo-clone-url').length > 0) {\n    switch (localStorage.getItem('repo-clone-protocol')) {\n      case 'ssh':\n        if ($('#repo-clone-ssh').click().length === 0) {\n          $('#repo-clone-https').click();\n        }\n        break;\n      default:\n        $('#repo-clone-https').click();\n        break;\n    }\n  }\n\n  const routes = {\n    'div.user.settings': initUserSettings,\n    'div.repository.settings.collaboration': initRepositoryCollaboration\n  };\n\n  let selector;\n  for (selector in routes) {\n    if ($(selector).length > 0) {\n      routes[selector]();\n      break;\n    }\n  }\n\n  const $cloneAddr = $('#clone_addr');\n  $cloneAddr.change(() => {\n    const $repoName = $('#repo_name');\n    if ($cloneAddr.val().length > 0 && $repoName.val().length === 0) { // Only modify if repo_name input is blank\n      $repoName.val($cloneAddr.val().match(/^(.*\\/)?((.+?)(\\.git)?)$/)[3]);\n    }\n  });\n});\n\nfunction changeHash(hash) {\n  if (window.history.pushState) {\n    window.history.pushState(null, null, hash);\n  } else {\n    window.location.hash = hash;\n  }\n}\n\nfunction deSelect() {\n  if (window.getSelection) {\n    window.getSelection().removeAllRanges();\n  } else {\n    document.selection.empty();\n  }\n}\n\nfunction selectRange($list, $select, $from) {\n  $list.removeClass('active');\n  if ($from) {\n    let a = parseInt($select.attr('rel').substr(1));\n    let b = parseInt($from.attr('rel').substr(1));\n    let c;\n    if (a !== b) {\n      if (a > b) {\n        c = a;\n        a = b;\n        b = c;\n      }\n      const classes = [];\n      for (let i = a; i <= b; i++) {\n        classes.push(`.L${i}`);\n      }\n      $list.filter(classes.join(',')).addClass('active');\n      changeHash(`#L${a}-L${b}`);\n      return;\n    }\n  }\n  $select.addClass('active');\n  changeHash(`#${$select.attr('rel')}`);\n}\n\n$(() => {\n  // Warn users that try to leave a page after entering data into a form.\n  // Except on sign-in pages, and for forms marked as 'ignore-dirty'.\n  if ($('.user.signin').length === 0) {\n    $('form:not(.ignore-dirty)').areYouSure();\n  }\n\n  // Parse SSH Key\n  $('#ssh-key-content').on('change paste keyup', function () {\n    const arrays = $(this).val().split(' ');\n    const $title = $('#ssh-key-title');\n    if ($title.val() === '' && arrays.length === 3 && arrays[2] !== '') {\n      $title.val(arrays[2]);\n    }\n  });\n});\n\nfunction showDeletePopup() {\n  const $this = $(this);\n  let filter = '';\n  if ($this.attr('id')) {\n    filter += `#${$this.attr('id')}`;\n  }\n\n  const dialog = $(`.delete.modal${filter}`);\n  dialog.find('.name').text($this.data('name'));\n\n  dialog.modal({\n    closable: false,\n    onApprove() {\n      if ($this.data('type') === 'form') {\n        $($this.data('form')).submit();\n        return;\n      }\n\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        id: $this.data('id')\n      }).done((data) => {\n        window.location.href = data.redirect;\n      });\n    }\n  }).modal('show');\n  return false;\n}\n\nfunction showAddAllPopup() {\n  const $this = $(this);\n  let filter = '';\n  if ($this.attr('id')) {\n    filter += `#${$this.attr('id')}`;\n  }\n\n  const dialog = $(`.addall.modal${filter}`);\n  dialog.find('.name').text($this.data('name'));\n\n  dialog.modal({\n    closable: false,\n    onApprove() {\n      if ($this.data('type') === 'form') {\n        $($this.data('form')).submit();\n        return;\n      }\n\n      $.post($this.data('url'), {\n        _csrf: csrf,\n        id: $this.data('id')\n      }).done((data) => {\n        window.location.href = data.redirect;\n      });\n    }\n  }).modal('show');\n  return false;\n}\n\nfunction initVueComponents() {\n  const vueDelimeters = ['${', '}'];\n\n  Vue.component('repo-search', {\n    delimiters: vueDelimeters,\n\n    props: {\n      searchLimit: {\n        type: Number,\n        default: 10\n      },\n      suburl: {\n        type: String,\n        required: true\n      },\n      uid: {\n        type: Number,\n        required: true\n      },\n      organizations: {\n        type: Array,\n        default: []\n      },\n      isOrganization: {\n        type: Boolean,\n        default: true\n      },\n      canCreateOrganization: {\n        type: Boolean,\n        default: false\n      },\n      organizationsTotalCount: {\n        type: Number,\n        default: 0\n      },\n      moreReposLink: {\n        type: String,\n        default: ''\n      }\n    },\n\n    data() {\n      return {\n        tab: 'repos',\n        repos: [],\n        reposTotalCount: 0,\n        reposFilter: 'all',\n        searchQuery: '',\n        isLoading: false,\n        repoTypes: {\n          all: {\n            count: 0,\n            searchMode: '',\n          },\n          forks: {\n            count: 0,\n            searchMode: 'fork',\n          },\n          mirrors: {\n            count: 0,\n            searchMode: 'mirror',\n          },\n          sources: {\n            count: 0,\n            searchMode: 'source',\n          },\n          collaborative: {\n            count: 0,\n            searchMode: 'collaborative',\n          },\n        }\n      };\n    },\n\n    computed: {\n      showMoreReposLink() {\n        return this.repos.length > 0 && this.repos.length < this.repoTypes[this.reposFilter].count;\n      },\n      searchURL() {\n        return `${this.suburl}/api/v1/repos/search?sort=updated&order=desc&uid=${this.uid}&q=${this.searchQuery\n        }&limit=${this.searchLimit}&mode=${this.repoTypes[this.reposFilter].searchMode\n        }${this.reposFilter !== 'all' ? '&exclusive=1' : ''}`;\n      },\n      repoTypeCount() {\n        return this.repoTypes[this.reposFilter].count;\n      }\n    },\n\n    mounted() {\n      this.searchRepos(this.reposFilter);\n\n      const self = this;\n      Vue.nextTick(() => {\n        self.$refs.search.focus();\n      });\n    },\n\n    methods: {\n      changeTab(t) {\n        this.tab = t;\n      },\n\n      changeReposFilter(filter) {\n        this.reposFilter = filter;\n        this.repos = [];\n        this.repoTypes[filter].count = 0;\n        this.searchRepos(filter);\n      },\n\n      showRepo(repo, filter) {\n        switch (filter) {\n          case 'sources':\n            return repo.owner.id === this.uid && !repo.mirror && !repo.fork;\n          case 'forks':\n            return repo.owner.id === this.uid && !repo.mirror && repo.fork;\n          case 'mirrors':\n            return repo.mirror;\n          case 'collaborative':\n            return repo.owner.id !== this.uid && !repo.mirror;\n          default:\n            return true;\n        }\n      },\n\n      searchRepos(reposFilter) {\n        const self = this;\n\n        this.isLoading = true;\n\n        const searchedMode = this.repoTypes[reposFilter].searchMode;\n        const searchedURL = this.searchURL;\n        const searchedQuery = this.searchQuery;\n\n        $.getJSON(searchedURL, (result, _textStatus, request) => {\n          if (searchedURL === self.searchURL) {\n            self.repos = result.data;\n            const count = request.getResponseHeader('X-Total-Count');\n            if (searchedQuery === '' && searchedMode === '') {\n              self.reposTotalCount = count;\n            }\n            self.repoTypes[reposFilter].count = count;\n          }\n        }).always(() => {\n          if (searchedURL === self.searchURL) {\n            self.isLoading = false;\n          }\n        });\n      },\n\n      repoClass(repo) {\n        if (repo.fork) {\n          return 'octicon octicon-repo-forked';\n        } if (repo.mirror) {\n          return 'octicon octicon-repo-clone';\n        } if (repo.private) {\n          return 'octicon octicon-lock';\n        }\n        return 'octicon octicon-repo';\n      }\n    }\n  });\n}\n\nfunction initCtrlEnterSubmit() {\n  $('.js-quick-submit').keydown(function (e) {\n    if (((e.ctrlKey && !e.altKey) || e.metaKey) && (e.keyCode === 13 || e.keyCode === 10)) {\n      $(this).closest('form').submit();\n    }\n  });\n}\n\nfunction initVueApp() {\n  const el = document.getElementById('app');\n  if (!el) {\n    return;\n  }\n\n  initVueComponents();\n\n  new Vue({\n    delimiters: ['${', '}'],\n    el,\n    data: {\n      searchLimit: document.querySelector('meta[name=_search_limit]').content,\n      suburl: document.querySelector('meta[name=_suburl]').content,\n      uid: document.querySelector('meta[name=_context_uid]').content,\n    },\n  });\n}\n\nwindow.timeAddManual = function () {\n  $('.mini.modal')\n    .modal({\n      duration: 200,\n      onApprove() {\n        $('#add_time_manual_form').submit();\n      }\n    }).modal('show');\n};\n\nwindow.toggleStopwatch = function () {\n  $('#toggle_stopwatch_form').submit();\n};\nwindow.cancelStopwatch = function () {\n  $('#cancel_stopwatch_form').submit();\n};\n\nwindow.initHeatmap = function (appElementId, heatmapUser, locale) {\n  const el = document.getElementById(appElementId);\n  if (!el) {\n    return;\n  }\n\n  locale = locale || {};\n\n  locale.contributions = locale.contributions || 'contributions';\n  locale.no_contributions = locale.no_contributions || 'No contributions';\n\n  const vueDelimeters = ['${', '}'];\n\n  Vue.component('activity-heatmap', {\n    delimiters: vueDelimeters,\n\n    props: {\n      user: {\n        type: String,\n        required: true\n      },\n      suburl: {\n        type: String,\n        required: true\n      },\n      locale: {\n        type: Object,\n        required: true\n      }\n    },\n\n    data() {\n      return {\n        isLoading: true,\n        colorRange: [],\n        endDate: null,\n        values: [],\n        totalContributions: 0,\n      };\n    },\n\n    mounted() {\n      this.colorRange = [\n        this.getColor(0),\n        this.getColor(1),\n        this.getColor(2),\n        this.getColor(3),\n        this.getColor(4),\n        this.getColor(5)\n      ];\n      this.endDate = new Date();\n      this.loadHeatmap(this.user);\n    },\n\n    methods: {\n      loadHeatmap(userName) {\n        const self = this;\n        $.get(`${this.suburl}/api/v1/users/${userName}/heatmap`, (chartRawData) => {\n          const chartData = [];\n          for (let i = 0; i < chartRawData.length; i++) {\n            self.totalContributions += chartRawData[i].contributions;\n            chartData[i] = { date: new Date(chartRawData[i].timestamp * 1000), count: chartRawData[i].contributions };\n          }\n          self.values = chartData;\n          self.isLoading = false;\n        });\n      },\n\n      getColor(idx) {\n        const el = document.createElement('div');\n        el.className = `heatmap-color-${idx}`;\n        document.body.appendChild(el);\n\n        const color = getComputedStyle(el).backgroundColor;\n\n        document.body.removeChild(el);\n\n        return color;\n      }\n    },\n\n    template: '<div><div v-show=\"isLoading\"><slot name=\"loading\"></slot></div><h4 class=\"total-contributions\" v-if=\"!isLoading\"><span v-html=\"totalContributions\"></span> total contributions in the last 12 months</h4><calendar-heatmap v-show=\"!isLoading\" :locale=\"locale\" :no-data-text=\"locale.no_contributions\" :tooltip-unit=\"locale.contributions\" :end-date=\"endDate\" :values=\"values\" :range-color=\"colorRange\" />'\n  });\n\n  new Vue({\n    delimiters: vueDelimeters,\n    el,\n\n    data: {\n      suburl: document.querySelector('meta[name=_suburl]').content,\n      heatmapUser,\n      locale\n    },\n  });\n};\n\nfunction initFilterBranchTagDropdown(selector) {\n  $(selector).each(function () {\n    const $dropdown = $(this);\n    const $data = $dropdown.find('.data');\n    const data = {\n      items: [],\n      mode: $data.data('mode'),\n      searchTerm: '',\n      noResults: '',\n      canCreateBranch: false,\n      menuVisible: false,\n      active: 0\n    };\n    $data.find('.item').each(function () {\n      data.items.push({\n        name: $(this).text(),\n        url: $(this).data('url'),\n        branch: $(this).hasClass('branch'),\n        tag: $(this).hasClass('tag'),\n        selected: $(this).hasClass('selected')\n      });\n    });\n    $data.remove();\n    new Vue({\n      delimiters: ['${', '}'],\n      el: this,\n      data,\n\n      beforeMount() {\n        const vm = this;\n\n        this.noResults = vm.$el.getAttribute('data-no-results');\n        this.canCreateBranch = vm.$el.getAttribute('data-can-create-branch') === 'true';\n\n        document.body.addEventListener('click', (event) => {\n          if (vm.$el.contains(event.target)) {\n            return;\n          }\n          if (vm.menuVisible) {\n            Vue.set(vm, 'menuVisible', false);\n          }\n        });\n      },\n\n      watch: {\n        menuVisible(visible) {\n          if (visible) {\n            this.focusSearchField();\n          }\n        }\n      },\n\n      computed: {\n        filteredItems() {\n          const vm = this;\n\n          const items = vm.items.filter((item) => {\n            return ((vm.mode === 'branches' && item.branch) || (vm.mode === 'tags' && item.tag))\n              && (!vm.searchTerm || item.name.toLowerCase().indexOf(vm.searchTerm.toLowerCase()) >= 0);\n          });\n\n          vm.active = (items.length === 0 && vm.showCreateNewBranch ? 0 : -1);\n\n          return items;\n        },\n        showNoResults() {\n          return this.filteredItems.length === 0 && !this.showCreateNewBranch;\n        },\n        showCreateNewBranch() {\n          const vm = this;\n          if (!this.canCreateBranch || !vm.searchTerm || vm.mode === 'tags') {\n            return false;\n          }\n\n          return vm.items.filter((item) => item.name.toLowerCase() === vm.searchTerm.toLowerCase()).length === 0;\n        }\n      },\n\n      methods: {\n        selectItem(item) {\n          const prev = this.getSelected();\n          if (prev !== null) {\n            prev.selected = false;\n          }\n          item.selected = true;\n          window.location.href = item.url;\n        },\n        createNewBranch() {\n          if (!this.showCreateNewBranch) {\n            return;\n          }\n          this.$refs.newBranchForm.submit();\n        },\n        focusSearchField() {\n          const vm = this;\n          Vue.nextTick(() => {\n            vm.$refs.searchField.focus();\n          });\n        },\n        getSelected() {\n          for (let i = 0, j = this.items.length; i < j; ++i) {\n            if (this.items[i].selected) return this.items[i];\n          }\n          return null;\n        },\n        getSelectedIndexInFiltered() {\n          for (let i = 0, j = this.filteredItems.length; i < j; ++i) {\n            if (this.filteredItems[i].selected) return i;\n          }\n          return -1;\n        },\n        scrollToActive() {\n          let el = this.$refs[`listItem${this.active}`];\n          if (!el || el.length === 0) {\n            return;\n          }\n          if (Array.isArray(el)) {\n            el = el[0];\n          }\n\n          const cont = this.$refs.scrollContainer;\n\n          if (el.offsetTop < cont.scrollTop) {\n            cont.scrollTop = el.offsetTop;\n          } else if (el.offsetTop + el.clientHeight > cont.scrollTop + cont.clientHeight) {\n            cont.scrollTop = el.offsetTop + el.clientHeight - cont.clientHeight;\n          }\n        },\n        keydown(event) {\n          const vm = this;\n          if (event.keyCode === 40) {\n            // arrow down\n            event.preventDefault();\n\n            if (vm.active === -1) {\n              vm.active = vm.getSelectedIndexInFiltered();\n            }\n\n            if (vm.active + (vm.showCreateNewBranch ? 0 : 1) >= vm.filteredItems.length) {\n              return;\n            }\n            vm.active++;\n            vm.scrollToActive();\n          }\n          if (event.keyCode === 38) {\n            // arrow up\n            event.preventDefault();\n\n            if (vm.active === -1) {\n              vm.active = vm.getSelectedIndexInFiltered();\n            }\n\n            if (vm.active <= 0) {\n              return;\n            }\n            vm.active--;\n            vm.scrollToActive();\n          }\n          if (event.keyCode === 13) {\n            // enter\n            event.preventDefault();\n\n            if (vm.active >= vm.filteredItems.length) {\n              vm.createNewBranch();\n            } else if (vm.active >= 0) {\n              vm.selectItem(vm.filteredItems[vm.active]);\n            }\n          }\n          if (event.keyCode === 27) {\n            // escape\n            event.preventDefault();\n            vm.menuVisible = false;\n          }\n        }\n      }\n    });\n  });\n}\n\n$('.commit-button').click(function (e) {\n  e.preventDefault();\n  $(this).parent().find('.commit-body').toggle();\n});\n\nfunction initNavbarContentToggle() {\n  const content = $('#navbar');\n  const toggle = $('#navbar-expand-toggle');\n  let isExpanded = false;\n  toggle.click(() => {\n    isExpanded = !isExpanded;\n    if (isExpanded) {\n      content.addClass('shown');\n      toggle.addClass('active');\n    } else {\n      content.removeClass('shown');\n      toggle.removeClass('active');\n    }\n  });\n}\n\nfunction initTopicbar() {\n  const mgrBtn = $('#manage_topic');\n  const editDiv = $('#topic_edit');\n  const viewDiv = $('#repo-topics');\n  const saveBtn = $('#save_topic');\n  const topicDropdown = $('#topic_edit .dropdown');\n  const topicForm = $('#topic_edit.ui.form');\n  const topicPrompts = getPrompts();\n\n  mgrBtn.click(() => {\n    viewDiv.hide();\n    editDiv.css('display', ''); // show Semantic UI Grid\n  });\n\n  function getPrompts() {\n    const hidePrompt = $('div.hide#validate_prompt');\n    const prompts = {\n      countPrompt: hidePrompt.children('#count_prompt').text(),\n      formatPrompt: hidePrompt.children('#format_prompt').text()\n    };\n    hidePrompt.remove();\n    return prompts;\n  }\n\n  saveBtn.click(() => {\n    const topics = $('input[name=topics]').val();\n\n    $.post(saveBtn.data('link'), {\n      _csrf: csrf,\n      topics\n    }, (_data, _textStatus, xhr) => {\n      if (xhr.responseJSON.status === 'ok') {\n        viewDiv.children('.topic').remove();\n        if (topics.length) {\n          const topicArray = topics.split(',');\n\n          const last = viewDiv.children('a').last();\n          for (let i = 0; i < topicArray.length; i++) {\n            $(`<div class=\"ui small label topic\" style=\"cursor:pointer;\">${topicArray[i]}</div>`).insertBefore(last);\n          }\n        }\n        editDiv.css('display', 'none');\n        viewDiv.show();\n      }\n    }).fail((xhr) => {\n      if (xhr.status === 422) {\n        if (xhr.responseJSON.invalidTopics.length > 0) {\n          topicPrompts.formatPrompt = xhr.responseJSON.message;\n\n          const { invalidTopics } = xhr.responseJSON;\n          const topicLables = topicDropdown.children('a.ui.label');\n\n          topics.split(',').forEach((value, index) => {\n            for (let i = 0; i < invalidTopics.length; i++) {\n              if (invalidTopics[i] === value) {\n                topicLables.eq(index).removeClass('green').addClass('red');\n              }\n            }\n          });\n        } else {\n          topicPrompts.countPrompt = xhr.responseJSON.message;\n        }\n      }\n    }).always(() => {\n      topicForm.form('validate form');\n    });\n  });\n\n  topicDropdown.dropdown({\n    allowAdditions: true,\n    forceSelection: false,\n    fields: { name: 'description', value: 'data-value' },\n    saveRemoteData: false,\n    label: {\n      transition: 'horizontal flip',\n      duration: 200,\n      variation: false,\n      blue: true,\n      basic: true,\n    },\n    className: {\n      label: 'ui small label'\n    },\n    apiSettings: {\n      url: `${suburl}/api/v1/topics/search?q={query}`,\n      throttle: 500,\n      cache: false,\n      onResponse(res) {\n        const formattedResponse = {\n          success: false,\n          results: [],\n        };\n        const stripTags = function (text) {\n          return text.replace(/<[^>]*>?/gm, '');\n        };\n\n        const query = stripTags(this.urlData.query.trim());\n        let found_query = false;\n        const current_topics = [];\n        topicDropdown.find('div.label.visible.topic,a.label.visible').each((_, e) => { current_topics.push(e.dataset.value); });\n\n        if (res.topics) {\n          let found = false;\n          for (let i = 0; i < res.topics.length; i++) {\n            // skip currently added tags\n            if (current_topics.indexOf(res.topics[i].topic_name) !== -1) {\n              continue;\n            }\n\n            if (res.topics[i].topic_name.toLowerCase() === query.toLowerCase()) {\n              found_query = true;\n            }\n            formattedResponse.results.push({ description: res.topics[i].topic_name, 'data-value': res.topics[i].topic_name });\n            found = true;\n          }\n          formattedResponse.success = found;\n        }\n\n        if (query.length > 0 && !found_query) {\n          formattedResponse.success = true;\n          formattedResponse.results.unshift({ description: query, 'data-value': query });\n        } else if (query.length > 0 && found_query) {\n          formattedResponse.results.sort((a, b) => {\n            if (a.description.toLowerCase() === query.toLowerCase()) return -1;\n            if (b.description.toLowerCase() === query.toLowerCase()) return 1;\n            if (a.description > b.description) return -1;\n            if (a.description < b.description) return 1;\n            return 0;\n          });\n        }\n\n\n        return formattedResponse;\n      },\n    },\n    onLabelCreate(value) {\n      value = value.toLowerCase().trim();\n      this.attr('data-value', value).contents().first().replaceWith(value);\n      return $(this);\n    },\n    onAdd(addedValue, _addedText, $addedChoice) {\n      addedValue = addedValue.toLowerCase().trim();\n      $($addedChoice).attr('data-value', addedValue);\n      $($addedChoice).attr('data-text', addedValue);\n    }\n  });\n\n  $.fn.form.settings.rules.validateTopic = function (_values, regExp) {\n    const topics = topicDropdown.children('a.ui.label');\n    const status = topics.length === 0 || topics.last().attr('data-value').match(regExp);\n    if (!status) {\n      topics.last().removeClass('green').addClass('red');\n    }\n    return status && topicDropdown.children('a.ui.label.red').length === 0;\n  };\n\n  topicForm.form({\n    on: 'change',\n    inline: true,\n    fields: {\n      topics: {\n        identifier: 'topics',\n        rules: [\n          {\n            type: 'validateTopic',\n            value: /^[a-z0-9][a-z0-9-]{1,35}$/,\n            prompt: topicPrompts.formatPrompt\n          },\n          {\n            type: 'maxCount[25]',\n            prompt: topicPrompts.countPrompt\n          }\n        ]\n      },\n    }\n  });\n}\n\nwindow.toggleDeadlineForm = function () {\n  $('#deadlineForm').fadeToggle(150);\n};\n\nwindow.setDeadline = function () {\n  const deadline = $('#deadlineDate').val();\n  window.updateDeadline(deadline);\n};\n\nwindow.updateDeadline = function (deadlineString) {\n  $('#deadline-err-invalid-date').hide();\n  $('#deadline-loader').addClass('loading');\n\n  let realDeadline = null;\n  if (deadlineString !== '') {\n    const newDate = Date.parse(deadlineString);\n\n    if (Number.isNaN(newDate)) {\n      $('#deadline-loader').removeClass('loading');\n      $('#deadline-err-invalid-date').show();\n      return false;\n    }\n    realDeadline = new Date(newDate);\n  }\n\n  $.ajax(`${$('#update-issue-deadline-form').attr('action')}/deadline`, {\n    data: JSON.stringify({\n      due_date: realDeadline,\n    }),\n    headers: {\n      'X-Csrf-Token': csrf,\n      'X-Remote': true,\n    },\n    contentType: 'application/json',\n    type: 'POST',\n    success() {\n      reload();\n    },\n    error() {\n      $('#deadline-loader').removeClass('loading');\n      $('#deadline-err-invalid-date').show();\n    }\n  });\n};\n\nwindow.deleteDependencyModal = function (id, type) {\n  $('.remove-dependency')\n    .modal({\n      closable: false,\n      duration: 200,\n      onApprove() {\n        $('#removeDependencyID').val(id);\n        $('#dependencyType').val(type);\n        $('#removeDependencyForm').submit();\n      }\n    }).modal('show');\n};\n\nfunction initIssueList() {\n  const repolink = $('#repolink').val();\n  const repoId = $('#repoId').val();\n  const crossRepoSearch = $('#crossRepoSearch').val();\n  let issueSearchUrl = `${suburl}/api/v1/repos/${repolink}/issues?q={query}`;\n  if (crossRepoSearch === 'true') {\n    issueSearchUrl = `${suburl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}`;\n  }\n  $('#new-dependency-drop-list')\n    .dropdown({\n      apiSettings: {\n        url: issueSearchUrl,\n        onResponse(response) {\n          const filteredResponse = { success: true, results: [] };\n          const currIssueId = $('#new-dependency-drop-list').data('issue-id');\n          // Parse the response from the api to work with our dropdown\n          $.each(response, (_i, issue) => {\n            // Don't list current issue in the dependency list.\n            if (issue.id === currIssueId) {\n              return;\n            }\n            filteredResponse.results.push({\n              name: `#${issue.number} ${htmlEncode(issue.title)\n              }<div class=\"text small dont-break-out\">${htmlEncode(issue.repository.full_name)}</div>`,\n              value: issue.id\n            });\n          });\n          return filteredResponse;\n        },\n        cache: false,\n      },\n\n      fullTextSearch: true\n    });\n\n  $('.menu a.label-filter-item').each(function () {\n    $(this).click(function (e) {\n      if (e.altKey) {\n        e.preventDefault();\n\n        const href = $(this).attr('href');\n        const id = $(this).data('label-id');\n\n        const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;\n        const newStr = 'labels=$1-$2$3&';\n\n        window.location = href.replace(new RegExp(regStr), newStr);\n      }\n    });\n  });\n\n  $('.menu .ui.dropdown.label-filter').keydown((e) => {\n    if (e.altKey && e.keyCode === 13) {\n      const selectedItems = $('.menu .ui.dropdown.label-filter .menu .item.selected');\n\n      if (selectedItems.length > 0) {\n        const item = $(selectedItems[0]);\n\n        const href = item.attr('href');\n        const id = item.data('label-id');\n\n        const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;\n        const newStr = 'labels=$1-$2$3&';\n\n        window.location = href.replace(new RegExp(regStr), newStr);\n      }\n    }\n  });\n}\nwindow.cancelCodeComment = function (btn) {\n  const form = $(btn).closest('form');\n  if (form.length > 0 && form.hasClass('comment-form')) {\n    form.addClass('hide');\n    form.parent().find('button.comment-form-reply').show();\n  } else {\n    form.closest('.comment-code-cloud').remove();\n  }\n};\nwindow.onOAuthLoginClick = function () {\n  const oauthLoader = $('#oauth2-login-loader');\n  const oauthNav = $('#oauth2-login-navigator');\n\n  oauthNav.hide();\n  oauthLoader.removeClass('disabled');\n\n  setTimeout(() => {\n    // recover previous content to let user try again\n    // usually redirection will be performed before this action\n    oauthLoader.addClass('disabled');\n    oauthNav.show();\n  }, 5000);\n};\n"],"sourceRoot":""}
\ No newline at end of file
index 8e0c27e2267de0023cbb883ed2ce4801b2dbbf9f..8a16e36bf5002de36db72c8a647ff71129fb53d5 100644 (file)
@@ -5,7 +5,9 @@
 package admin
 
 import (
+       "errors"
        "fmt"
+       "regexp"
 
        "code.gitea.io/gitea/models"
        "code.gitea.io/gitea/modules/auth"
@@ -15,6 +17,7 @@ import (
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/util"
 
        "github.com/unknwon/com"
        "xorm.io/core"
@@ -26,6 +29,11 @@ const (
        tplAuthEdit base.TplName = "admin/auth/edit"
 )
 
+var (
+       separatorAntiPattern = regexp.MustCompile(`[^\w-\.]`)
+       langCodePattern      = regexp.MustCompile(`^[a-z]{2}-[A-Z]{2}$`)
+)
+
 // Authentications show authentication config page
 func Authentications(ctx *context.Context) {
        ctx.Data["Title"] = ctx.Tr("admin.authentication")
@@ -55,6 +63,7 @@ var (
                {models.LoginNames[models.LoginSMTP], models.LoginSMTP},
                {models.LoginNames[models.LoginPAM], models.LoginPAM},
                {models.LoginNames[models.LoginOAuth2], models.LoginOAuth2},
+               {models.LoginNames[models.LoginSSPI], models.LoginSSPI},
        }
        securityProtocols = []dropdownItem{
                {models.SecurityProtocolNames[ldap.SecurityProtocolUnencrypted], ldap.SecurityProtocolUnencrypted},
@@ -81,6 +90,12 @@ func NewAuthSource(ctx *context.Context) {
        ctx.Data["OAuth2Providers"] = models.OAuth2Providers
        ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 
+       ctx.Data["SSPIAutoCreateUsers"] = true
+       ctx.Data["SSPIAutoActivateUsers"] = true
+       ctx.Data["SSPIStripDomainNames"] = true
+       ctx.Data["SSPISeparatorReplacement"] = "_"
+       ctx.Data["SSPIDefaultLanguage"] = ""
+
        // only the first as default
        for key := range models.OAuth2Providers {
                ctx.Data["oauth2_provider"] = key
@@ -152,6 +167,30 @@ func parseOAuth2Config(form auth.AuthenticationForm) *models.OAuth2Config {
        }
 }
 
+func parseSSPIConfig(ctx *context.Context, form auth.AuthenticationForm) (*models.SSPIConfig, error) {
+       if util.IsEmptyString(form.SSPISeparatorReplacement) {
+               ctx.Data["Err_SSPISeparatorReplacement"] = true
+               return nil, errors.New(ctx.Tr("form.SSPISeparatorReplacement") + ctx.Tr("form.require_error"))
+       }
+       if separatorAntiPattern.MatchString(form.SSPISeparatorReplacement) {
+               ctx.Data["Err_SSPISeparatorReplacement"] = true
+               return nil, errors.New(ctx.Tr("form.SSPISeparatorReplacement") + ctx.Tr("form.alpha_dash_dot_error"))
+       }
+
+       if form.SSPIDefaultLanguage != "" && !langCodePattern.MatchString(form.SSPIDefaultLanguage) {
+               ctx.Data["Err_SSPIDefaultLanguage"] = true
+               return nil, errors.New(ctx.Tr("form.lang_select_error"))
+       }
+
+       return &models.SSPIConfig{
+               AutoCreateUsers:      form.SSPIAutoCreateUsers,
+               AutoActivateUsers:    form.SSPIAutoActivateUsers,
+               StripDomainNames:     form.SSPIStripDomainNames,
+               SeparatorReplacement: form.SSPISeparatorReplacement,
+               DefaultLanguage:      form.SSPIDefaultLanguage,
+       }, nil
+}
+
 // NewAuthSourcePost response for adding an auth source
 func NewAuthSourcePost(ctx *context.Context, form auth.AuthenticationForm) {
        ctx.Data["Title"] = ctx.Tr("admin.auths.new")
@@ -166,6 +205,12 @@ func NewAuthSourcePost(ctx *context.Context, form auth.AuthenticationForm) {
        ctx.Data["OAuth2Providers"] = models.OAuth2Providers
        ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 
+       ctx.Data["SSPIAutoCreateUsers"] = true
+       ctx.Data["SSPIAutoActivateUsers"] = true
+       ctx.Data["SSPIStripDomainNames"] = true
+       ctx.Data["SSPISeparatorReplacement"] = "_"
+       ctx.Data["SSPIDefaultLanguage"] = ""
+
        hasTLS := false
        var config core.Conversion
        switch models.LoginType(form.Type) {
@@ -181,6 +226,19 @@ func NewAuthSourcePost(ctx *context.Context, form auth.AuthenticationForm) {
                }
        case models.LoginOAuth2:
                config = parseOAuth2Config(form)
+       case models.LoginSSPI:
+               var err error
+               config, err = parseSSPIConfig(ctx, form)
+               if err != nil {
+                       ctx.RenderWithErr(err.Error(), tplAuthNew, form)
+                       return
+               }
+               existing, err := models.LoginSourcesByType(models.LoginSSPI)
+               if err != nil || len(existing) > 0 {
+                       ctx.Data["Err_Type"] = true
+                       ctx.RenderWithErr(ctx.Tr("admin.auths.login_source_of_type_exist"), tplAuthNew, form)
+                       return
+               }
        default:
                ctx.Error(400)
                return
@@ -274,6 +332,12 @@ func EditAuthSourcePost(ctx *context.Context, form auth.AuthenticationForm) {
                }
        case models.LoginOAuth2:
                config = parseOAuth2Config(form)
+       case models.LoginSSPI:
+               config, err = parseSSPIConfig(ctx, form)
+               if err != nil {
+                       ctx.RenderWithErr(err.Error(), tplAuthEdit, form)
+                       return
+               }
        default:
                ctx.Error(400)
                return
index 4623f02e661934f3ab63d8754d83b1ab90a67ec5..e161143f472a17aa30c735c0e0fd7bbb254f6bf3 100644 (file)
@@ -10,6 +10,7 @@ import (
 
        "code.gitea.io/gitea/models"
        "code.gitea.io/gitea/models/migrations"
+       "code.gitea.io/gitea/modules/auth/sso"
        "code.gitea.io/gitea/modules/cache"
        "code.gitea.io/gitea/modules/cron"
        "code.gitea.io/gitea/modules/git"
@@ -124,4 +125,8 @@ func GlobalInit() {
                        ssh.Unused()
                }
        }
+
+       if setting.InstallLock {
+               sso.Init()
+       }
 }
index 63cce0f7135c895333249d08e878a73e94249653..0025ba2af4bb1fb88453ecd6b5d54f32f10fba53 100644 (file)
@@ -19,7 +19,7 @@ import (
        "time"
 
        "code.gitea.io/gitea/models"
-       "code.gitea.io/gitea/modules/auth"
+       "code.gitea.io/gitea/modules/auth/sso"
        "code.gitea.io/gitea/modules/base"
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/git"
@@ -169,7 +169,7 @@ func HTTP(ctx *context.Context) {
                                // Assume password is token
                                authToken = authPasswd
                        }
-                       uid := auth.CheckOAuthAccessToken(authToken)
+                       uid := sso.CheckOAuthAccessToken(authToken)
                        if uid != 0 {
                                ctx.Data["IsApiToken"] = true
 
index d0ad4afffd21bdc5cc1d5913684e14b7e4272fce..1596e11bbbc05c6184596f76a252cd9b3d08dd74 100644 (file)
@@ -137,6 +137,7 @@ func SignIn(ctx *context.Context) {
        ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login"
        ctx.Data["PageIsSignIn"] = true
        ctx.Data["PageIsLogin"] = true
+       ctx.Data["EnableSSPI"] = models.IsSSPIEnabled()
 
        ctx.HTML(200, tplSignIn)
 }
@@ -156,6 +157,7 @@ func SignInPost(ctx *context.Context, form auth.SignInForm) {
        ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login"
        ctx.Data["PageIsSignIn"] = true
        ctx.Data["PageIsLogin"] = true
+       ctx.Data["EnableSSPI"] = models.IsSSPIEnabled()
 
        if ctx.HasError() {
                ctx.HTML(200, tplSignIn)
index 6a176a43a84ee4e1ab53ba2454cdcc4e8040bbd6..d1a614b1f00d4a7a33dcc1f79dedd8033f64b07d 100644 (file)
                                        {{end}}{{end}}
                                {{end}}
 
+                               <!-- SSPI -->
+                               {{if .Source.IsSSPI}}
+                                       {{ $cfg:=.Source.SSPI }}
+                                       <div class="field">
+                                               <div class="ui checkbox">
+                                                       <label for="sspi_auto_create_users"><strong>{{.i18n.Tr "admin.auths.sspi_auto_create_users"}}</strong></label>
+                                                       <input id="sspi_auto_create_users" name="sspi_auto_create_users" class="sspi-auto-create-users" type="checkbox" {{if $cfg.AutoCreateUsers}}checked{{end}}>
+                                                       <p class="help">{{.i18n.Tr "admin.auths.sspi_auto_create_users_helper"}}</p>
+                                               </div>
+                                       </div>
+                                       <div class="field">
+                                               <div class="ui checkbox">
+                                                       <label for="sspi_auto_activate_users"><strong>{{.i18n.Tr "admin.auths.sspi_auto_activate_users"}}</strong></label>
+                                                       <input id="sspi_auto_activate_users" name="sspi_auto_activate_users" class="sspi-auto-activate-users" type="checkbox" {{if $cfg.AutoActivateUsers}}checked{{end}}>
+                                                       <p class="help">{{.i18n.Tr "admin.auths.sspi_auto_activate_users_helper"}}</p>
+                                               </div>
+                                       </div>
+                                       <div class="field">
+                                               <div class="ui checkbox">
+                                                       <label for="sspi_strip_domain_names"><strong>{{.i18n.Tr "admin.auths.sspi_strip_domain_names"}}</strong></label>
+                                                       <input id="sspi_strip_domain_names" name="sspi_strip_domain_names" class="sspi-strip-domain-names" type="checkbox" {{if $cfg.StripDomainNames}}checked{{end}}>
+                                                       <p class="help">{{.i18n.Tr "admin.auths.sspi_strip_domain_names_helper"}}</p>
+                                               </div>
+                                       </div>
+                                       <div class="required field">
+                                               <label for="sspi_separator_replacement">{{.i18n.Tr "admin.auths.sspi_separator_replacement"}}</label>
+                                               <input id="sspi_separator_replacement" name="sspi_separator_replacement" value="{{$cfg.SeparatorReplacement}}" required>
+                                               <p class="help">{{.i18n.Tr "admin.auths.sspi_separator_replacement_helper"}}</p>
+                                       </div>
+                                       <div class="field">
+                                               <label for="sspi_default_language">{{.i18n.Tr "admin.auths.sspi_default_language"}}</label>
+                                               <div class="ui language selection dropdown" id="sspi_default_language">
+                                                       <input name="sspi_default_language" type="hidden" value="{{$cfg.DefaultLanguage}}">
+                                                       <i class="dropdown icon"></i>
+                                                       <div class="text">{{range .AllLangs}}{{if eq $cfg.DefaultLanguage .Lang}}{{.Name}}{{end}}{{end}}</div>
+                                                       <div class="menu">
+                                                               <div class="item{{if not $.SSPIDefaultLanguage}} active selected{{end}}" data-value="">-</div>
+                                                       {{range .AllLangs}}
+                                                               <div class="item{{if eq $cfg.DefaultLanguage .Lang}} active selected{{end}}" data-value="{{.Lang}}">{{.Name}}</div>
+                                                       {{end}}
+                                                       </div>
+                                               </div>
+                                               <p class="help">{{.i18n.Tr "admin.auths.sspi_default_language_helper"}}</p>
+                                       </div>
+                               {{end}}
+
                                <div class="inline field {{if not .Source.IsSMTP}}hide{{end}}">
                                        <div class="ui checkbox">
                                                <label><strong>{{.i18n.Tr "admin.auths.enable_tls"}}</strong></label>
index e759ec0ba4271cb95411f400a418bc5f2b648a69..f2fc26cdc8c07d373e6f1a0ab0699ef35dbf3a8e 100644 (file)
@@ -43,6 +43,9 @@
                                <!-- OAuth2 -->
                                {{ template "admin/auth/source/oauth" . }}
 
+                               <!-- SSPI -->
+                               {{ template "admin/auth/source/sspi" . }}
+
                                <div class="ldap field">
                                        <div class="ui checkbox">
                                                <label><strong>{{.i18n.Tr "admin.auths.attributes_in_bind"}}</strong></label>
diff --git a/templates/admin/auth/source/sspi.tmpl b/templates/admin/auth/source/sspi.tmpl
new file mode 100644 (file)
index 0000000..50f9f99
--- /dev/null
@@ -0,0 +1,43 @@
+<div class="sspi field {{if not (eq .type 7)}}hide{{end}}">
+       <div class="field">
+               <div class="ui checkbox">
+                       <label for="sspi_auto_create_users"><strong>{{.i18n.Tr "admin.auths.sspi_auto_create_users"}}</strong></label>
+                       <input id="sspi_auto_create_users" name="sspi_auto_create_users" class="sspi-auto-create-users" type="checkbox" {{if .SSPIAutoCreateUsers}}checked{{end}}>
+                       <p class="help">{{.i18n.Tr "admin.auths.sspi_auto_create_users_helper"}}</p>
+               </div>
+       </div>
+       <div class="field">
+               <div class="ui checkbox">
+                       <label for="sspi_auto_activate_users"><strong>{{.i18n.Tr "admin.auths.sspi_auto_activate_users"}}</strong></label>
+                       <input id="sspi_auto_activate_users" name="sspi_auto_activate_users" class="sspi-auto-activate-users" type="checkbox" {{if .SSPIAutoActivateUsers}}checked{{end}}>
+                       <p class="help">{{.i18n.Tr "admin.auths.sspi_auto_activate_users_helper"}}</p>
+               </div>
+       </div>
+       <div class="field">
+               <div class="ui checkbox">
+                       <label for="sspi_strip_domain_names"><strong>{{.i18n.Tr "admin.auths.sspi_strip_domain_names"}}</strong></label>
+                       <input id="sspi_strip_domain_names" name="sspi_strip_domain_names" class="sspi-strip-domain-names" type="checkbox" {{if .SSPIStripDomainNames}}checked{{end}}>
+                       <p class="help">{{.i18n.Tr "admin.auths.sspi_strip_domain_names_helper"}}</p>
+               </div>
+       </div>
+       <div class="required field">
+               <label for="sspi_separator_replacement">{{.i18n.Tr "admin.auths.sspi_separator_replacement"}}</label>
+               <input id="sspi_separator_replacement" name="sspi_separator_replacement" value="{{.SSPISeparatorReplacement}}">
+               <p class="help">{{.i18n.Tr "admin.auths.sspi_separator_replacement_helper"}}</p>
+       </div>
+       <div class="field">
+               <label for="sspi_default_language">{{.i18n.Tr "admin.auths.sspi_default_language"}}</label>
+               <div class="ui language selection dropdown" id="sspi_default_language">
+                       <input name="sspi_default_language" type="hidden" value="{{.SSPIDefaultLanguage}}">
+                       <i class="dropdown icon"></i>
+                       <div class="text">{{range .AllLangs}}{{if eq $.SSPIDefaultLanguage .Lang}}{{.Name}}{{end}}{{end}}</div>
+                       <div class="menu">
+                               <div class="item{{if not $.SSPIDefaultLanguage}} active selected{{end}}" data-value="">-</div>
+                       {{range .AllLangs}}
+                               <div class="item{{if eq $.SSPIDefaultLanguage .Lang}} active selected{{end}}" data-value="{{.Lang}}">{{.Name}}</div>
+                       {{end}}
+                       </div>
+               </div>
+               <p class="help">{{.i18n.Tr "admin.auths.sspi_default_language_helper"}}</p>
+       </div>
+</div>
index 345e2212963f84708aeb0af13aa2ddee14ce71ec..428a3d843acd752166803f912acb167780d74868 100644 (file)
@@ -1,11 +1,19 @@
-{{if .EnableOpenIDSignIn}}
+{{if or .EnableOpenIDSignIn .EnableSSPI}}
 <div class="ui secondary pointing tabular top attached borderless menu new-menu navbar">
        <a class="{{if .PageIsLogin}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login">
                {{.i18n.Tr "auth.login_userpass"}}
        </a>
+       {{if .EnableOpenIDSignIn}}
        <a class="{{if .PageIsLoginOpenID}}active{{end}} item" rel="nofollow" href="{{AppSubUrl}}/user/login/openid">
                <i class="fa fa-openid"></i>
                &nbsp;OpenID
        </a>
+       {{end}}
+       {{if .EnableSSPI}}
+       <a class="item" rel="nofollow" href="{{AppSubUrl}}/user/login?auth_with_sspi=1">
+               <i class="fa fa-windows"></i>
+               &nbsp;SSPI
+       </a>
+       {{end}}
 </div>
 {{end}}
diff --git a/vendor/github.com/quasoft/websspi/.gitignore b/vendor/github.com/quasoft/websspi/.gitignore
new file mode 100644 (file)
index 0000000..f1c181e
--- /dev/null
@@ -0,0 +1,12 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
diff --git a/vendor/github.com/quasoft/websspi/.travis.yml b/vendor/github.com/quasoft/websspi/.travis.yml
new file mode 100644 (file)
index 0000000..1aaa667
--- /dev/null
@@ -0,0 +1,13 @@
+jobs:
+  include:
+    - os: windows
+      script: $GOPATH/bin/goveralls -service=travis-ci
+      language: go
+      sudo: false
+      go: 1.13.x
+      before_install: go get github.com/mattn/goveralls
+    - os: linux
+      script: go build
+      language: go
+      sudo: false
+      go: 1.13.x
diff --git a/vendor/github.com/quasoft/websspi/LICENSE b/vendor/github.com/quasoft/websspi/LICENSE
new file mode 100644 (file)
index 0000000..e1520f7
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 QuaSoft
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/quasoft/websspi/README.md b/vendor/github.com/quasoft/websspi/README.md
new file mode 100644 (file)
index 0000000..4f7b121
--- /dev/null
@@ -0,0 +1,41 @@
+# websspi
+
+[![GoDoc](https://godoc.org/github.com/quasoft/websspi?status.svg)](https://godoc.org/github.com/quasoft/websspi) [![Build Status](https://travis-ci.org/quasoft/websspi.png?branch=master)](https://travis-ci.org/quasoft/websspi) [![Coverage Status](https://coveralls.io/repos/github/quasoft/websspi/badge.svg?branch=master)](https://coveralls.io/github/quasoft/websspi?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/quasoft/websspi)](https://goreportcard.com/report/github.com/quasoft/websspi)
+
+`websspi` will be an HTTP middleware for Golang that uses Kerberos for single sign-on (SSO) authentication of browser based clients in a Windows environment.
+
+The main goal is to create a middleware that performs authentication of HTTP requests without the need to create or use keytab files.
+
+The middleware will implement the scheme defined by RFC4559 (SPNEGO-based HTTP Authentication in Microsoft Windows) to exchange security tokens via HTTP headers and will use SSPI (Security Support Provider Interface) to authenticate HTTP requests.
+
+## How to use
+
+The examples directory contains a simple web server that demonstrates how to use the package.
+Before trying it, you need to prepare your environment:
+
+1. Create a separate user account in active directory, under which the web server process will be running (eg. `user` under the `domain.local` domain)
+
+2. Create a service principal name for the host with class HTTP:
+   - Start Command prompt or PowerShell as domain administrator
+   - Run the command below, replacing `host.domain.local` with the fully qualified domain name of the server where the web application will be running, and `domain\user` with the name of the account created in step 1.:
+
+         setspn -A HTTP/host.domain.local domain\user
+
+3. Start the web server app under the account created in step 1.
+
+4. If you are using Chrome, Edge or Internet Explorer, add the URL of the web app to the Local intranet sites (`Internet Options -> Security -> Local intranet -> Sites`)
+
+5. Start Chrome, Edge or Internet Explorer and navigate to the URL of the web app (eg. `http://host.domain.local:9000`)
+
+6. The web app should greet you with the name of your AD account without asking you to login. In case it doesn't, make sure that:
+
+   - You are not running the web browser on the same server where the web app is running. You should be running the web browser on a domain joined computer (client) that is different from the server
+   - There is only one HTTP/... SPN for the host
+   - The SPN contains only the hostname, without the port
+   - You have added the URL of the web app to the `Local intranet` zone
+   - The clocks of the server and client should not differ with more than 5 minutes
+   - `Integrated Windows Authentication` should be enabled in Internet Explorer (under `Advanced settings`)
+
+## Security requirements
+
+- SPNEGO HTTP provides no facilities for protecting the HTTP headers or data including the Authorization and WWW-Authenticate headers, which means that the HTTP server **MUST** enforce use of SSL to provide confidentiality to data in these headers!
diff --git a/vendor/github.com/quasoft/websspi/go.mod b/vendor/github.com/quasoft/websspi/go.mod
new file mode 100644 (file)
index 0000000..0b53f16
--- /dev/null
@@ -0,0 +1,9 @@
+module github.com/quasoft/websspi
+
+go 1.13
+
+require (
+       github.com/gorilla/securecookie v1.1.1
+       github.com/gorilla/sessions v1.2.0
+       golang.org/x/sys v0.0.0-20191010194322-b09406accb47
+)
diff --git a/vendor/github.com/quasoft/websspi/go.sum b/vendor/github.com/quasoft/websspi/go.sum
new file mode 100644 (file)
index 0000000..d6b6b7d
--- /dev/null
@@ -0,0 +1,6 @@
+github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ=
+github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/vendor/github.com/quasoft/websspi/secctx/session.go b/vendor/github.com/quasoft/websspi/secctx/session.go
new file mode 100644 (file)
index 0000000..6f8ce29
--- /dev/null
@@ -0,0 +1,36 @@
+package secctx
+
+import (
+       "net/http"
+
+       "github.com/gorilla/securecookie"
+       "github.com/gorilla/sessions"
+)
+
+// CookieStore can store and retrieve SSPI context handles to/from an encrypted Cookie.
+type CookieStore struct {
+       store *sessions.CookieStore
+}
+
+// NewCookieStore creates a new CookieStore for storing and retrieving of SSPI context handles
+// to/from encrypted Cookies
+func NewCookieStore() *CookieStore {
+       s := &CookieStore{}
+       s.store = sessions.NewCookieStore([]byte(securecookie.GenerateRandomKey(32)))
+       return s
+}
+
+// GetHandle retrieves a *websspi.CtxtHandle value from the store
+func (s *CookieStore) GetHandle(r *http.Request) (interface{}, error) {
+       session, _ := s.store.Get(r, "websspi")
+       contextHandle := session.Values["contextHandle"]
+       return contextHandle, nil
+}
+
+// SetHandle saves a *websspi.CtxtHandle value to the store
+func (s *CookieStore) SetHandle(r *http.Request, w http.ResponseWriter, contextHandle interface{}) error {
+       session, _ := s.store.Get(r, "websspi")
+       session.Values["contextHandle"] = contextHandle
+       err := session.Save(r, w)
+       return err
+}
diff --git a/vendor/github.com/quasoft/websspi/secctx/store.go b/vendor/github.com/quasoft/websspi/secctx/store.go
new file mode 100644 (file)
index 0000000..9c336c3
--- /dev/null
@@ -0,0 +1,13 @@
+package secctx
+
+import "net/http"
+
+// Store is an interface for storage of SSPI context handles.
+// SSPI context handles are Windows API handles and have nothing to do
+// with the "context" package in Go.
+type Store interface {
+       // GetHandle retrieves a *websspi.CtxtHandle value from the store
+       GetHandle(r *http.Request) (interface{}, error)
+       // SetHandle saves a *websspi.CtxtHandle value to the store
+       SetHandle(r *http.Request, w http.ResponseWriter, contextHandle interface{}) error
+}
diff --git a/vendor/github.com/quasoft/websspi/userinfo.go b/vendor/github.com/quasoft/websspi/userinfo.go
new file mode 100644 (file)
index 0000000..359bfb5
--- /dev/null
@@ -0,0 +1,7 @@
+package websspi
+
+// UserInfo represents an authenticated user.
+type UserInfo struct {
+       Username string   // Name of user, usually in the form DOMAIN\User
+       Groups   []string // The global groups the user is a member of
+}
diff --git a/vendor/github.com/quasoft/websspi/utf16.go b/vendor/github.com/quasoft/websspi/utf16.go
new file mode 100644 (file)
index 0000000..7c85c88
--- /dev/null
@@ -0,0 +1,22 @@
+package websspi
+
+import (
+       "unicode/utf16"
+       "unsafe"
+)
+
+// UTF16PtrToString converts a pointer to a UTF16 string to a string
+func UTF16PtrToString(ptr *uint16, maxLen int) (s string) {
+       if ptr == nil {
+               return ""
+       }
+       buf := make([]uint16, 0, maxLen)
+       for i, p := 0, uintptr(unsafe.Pointer(ptr)); i < maxLen; i, p = i+1, p+2 {
+               char := *(*uint16)(unsafe.Pointer(p))
+               if char == 0 {
+                       return string(utf16.Decode(buf))
+               }
+               buf = append(buf, char)
+       }
+       return ""
+}
diff --git a/vendor/github.com/quasoft/websspi/websspi_windows.go b/vendor/github.com/quasoft/websspi/websspi_windows.go
new file mode 100644 (file)
index 0000000..1605a6c
--- /dev/null
@@ -0,0 +1,615 @@
+package websspi
+
+import (
+       "context"
+       "encoding/base64"
+       "encoding/gob"
+       "errors"
+       "fmt"
+       "log"
+       "net/http"
+       "strings"
+       "sync"
+       "syscall"
+       "time"
+       "unsafe"
+
+       "github.com/quasoft/websspi/secctx"
+)
+
+// The Config object determines the behaviour of the Authenticator.
+type Config struct {
+       contextStore    secctx.Store
+       authAPI         API
+       KrbPrincipal    string // Name of Kerberos principle used by the service (optional).
+       AuthUserKey     string // Key of header to fill with authenticated username, eg. "X-Authenticated-User" or "REMOTE_USER" (optional).
+       EnumerateGroups bool   // If true, groups the user is a member of are enumerated and stored in request context (default false)
+       ServerName      string // Specifies the DNS or NetBIOS name of the remote server which to query about user groups. Ignored if EnumerateGroups is false.
+}
+
+// NewConfig creates a configuration object with default values.
+func NewConfig() *Config {
+       return &Config{
+               contextStore: secctx.NewCookieStore(),
+               authAPI:      &Win32{},
+       }
+}
+
+// Validate makes basic validation of configuration to make sure that important and required fields
+// have been set with values in expected format.
+func (c *Config) Validate() error {
+       if c.contextStore == nil {
+               return errors.New("Store for context handles not specified in Config")
+       }
+       if c.authAPI == nil {
+               return errors.New("Authentication API not specified in Config")
+       }
+       return nil
+}
+
+// contextKey represents a custom key for values stored in context.Context
+type contextKey string
+
+func (c contextKey) String() string {
+       return "websspi-key-" + string(c)
+}
+
+var (
+       UserInfoKey = contextKey("UserInfo")
+)
+
+// The Authenticator type provides middleware methods for authentication of http requests.
+// A single authenticator object can be shared by concurrent goroutines.
+type Authenticator struct {
+       Config     Config
+       serverCred *CredHandle
+       credExpiry *time.Time
+       ctxList    []CtxtHandle
+       ctxListMux *sync.Mutex
+}
+
+// New creates a new Authenticator object with the given configuration options.
+func New(config *Config) (*Authenticator, error) {
+       err := config.Validate()
+       if err != nil {
+               return nil, fmt.Errorf("invalid config: %v", err)
+       }
+
+       var auth = &Authenticator{
+               Config:     *config,
+               ctxListMux: &sync.Mutex{},
+       }
+
+       err = auth.PrepareCredentials(config.KrbPrincipal)
+       if err != nil {
+               return nil, fmt.Errorf("could not acquire credentials handle for the service: %v", err)
+       }
+       log.Printf("Credential handle expiry: %v\n", *auth.credExpiry)
+
+       return auth, nil
+}
+
+// PrepareCredentials method acquires a credentials handle for the specified principal
+// for use during the live of the application.
+// On success stores the handle in the serverCred field and its expiry time in the
+// credExpiry field.
+// This method must be called once - when the application is starting or when the first
+// request from a client is received.
+func (a *Authenticator) PrepareCredentials(principal string) error {
+       var principalPtr *uint16
+       if principal != "" {
+               var err error
+               principalPtr, err = syscall.UTF16PtrFromString(principal)
+               if err != nil {
+                       return err
+               }
+       }
+       credentialUsePtr, err := syscall.UTF16PtrFromString(NEGOSSP_NAME)
+       if err != nil {
+               return err
+       }
+       var handle CredHandle
+       var expiry syscall.Filetime
+       status := a.Config.authAPI.AcquireCredentialsHandle(
+               principalPtr,
+               credentialUsePtr,
+               SECPKG_CRED_INBOUND,
+               nil, // logonId
+               nil, // authData
+               0,   // getKeyFn
+               0,   // getKeyArgument
+               &handle,
+               &expiry,
+       )
+       if status != SEC_E_OK {
+               return fmt.Errorf("call to AcquireCredentialsHandle failed with code 0x%x", status)
+       }
+       expiryTime := time.Unix(0, expiry.Nanoseconds())
+       a.credExpiry = &expiryTime
+       a.serverCred = &handle
+       return nil
+}
+
+// Free method should be called before shutting down the server to let
+// it release allocated Win32 resources
+func (a *Authenticator) Free() error {
+       var status SECURITY_STATUS
+       a.ctxListMux.Lock()
+       for _, ctx := range a.ctxList {
+               // TODO: Also check for stale security contexts and delete them periodically
+               status = a.Config.authAPI.DeleteSecurityContext(&ctx)
+               if status != SEC_E_OK {
+                       return fmt.Errorf("call to DeleteSecurityContext failed with code 0x%x", status)
+               }
+       }
+       a.ctxList = nil
+       a.ctxListMux.Unlock()
+       if a.serverCred != nil {
+               status = a.Config.authAPI.FreeCredentialsHandle(a.serverCred)
+               if status != SEC_E_OK {
+                       return fmt.Errorf("call to FreeCredentialsHandle failed with code 0x%x", status)
+               }
+               a.serverCred = nil
+       }
+       return nil
+}
+
+// StoreCtxHandle stores the specified context to the internal list (ctxList)
+func (a *Authenticator) StoreCtxHandle(handle *CtxtHandle) {
+       if handle == nil || *handle == (CtxtHandle{}) {
+               // Should not add nil or empty handle
+               return
+       }
+       a.ctxListMux.Lock()
+       defer a.ctxListMux.Unlock()
+       a.ctxList = append(a.ctxList, *handle)
+}
+
+// ReleaseCtxHandle deletes a context handle and removes it from the internal list (ctxList)
+func (a *Authenticator) ReleaseCtxHandle(handle *CtxtHandle) error {
+       if handle == nil || *handle == (CtxtHandle{}) {
+               // Removing a nil or empty handle is not an error condition
+               return nil
+       }
+       a.ctxListMux.Lock()
+       defer a.ctxListMux.Unlock()
+
+       // First, try to delete the handle
+       status := a.Config.authAPI.DeleteSecurityContext(handle)
+       if status != SEC_E_OK {
+               return fmt.Errorf("call to DeleteSecurityContext failed with code 0x%x", status)
+       }
+
+       // Then remove it from the internal list
+       foundAt := -1
+       for i, ctx := range a.ctxList {
+               if ctx == *handle {
+                       foundAt = i
+                       break
+               }
+       }
+       if foundAt > -1 {
+               a.ctxList[foundAt] = a.ctxList[len(a.ctxList)-1]
+               a.ctxList = a.ctxList[:len(a.ctxList)-1]
+       }
+       return nil
+}
+
+// AcceptOrContinue tries to validate the auth-data token by calling the AcceptSecurityContext
+// function and returns and error if validation failed or continuation of the negotiation is needed.
+// No error is returned if the token was validated (user was authenticated).
+func (a *Authenticator) AcceptOrContinue(context *CtxtHandle, authData []byte) (newCtx *CtxtHandle, out []byte, exp *time.Time, err error) {
+       if authData == nil {
+               err = errors.New("input token cannot be nil")
+               return
+       }
+
+       var inputDesc SecBufferDesc
+       var inputBuf SecBuffer
+       inputDesc.BuffersCount = 1
+       inputDesc.Version = SECBUFFER_VERSION
+       inputDesc.Buffers = &inputBuf
+       inputBuf.BufferSize = uint32(len(authData))
+       inputBuf.BufferType = SECBUFFER_TOKEN
+       inputBuf.Buffer = &authData[0]
+
+       var outputDesc SecBufferDesc
+       var outputBuf SecBuffer
+       outputDesc.BuffersCount = 1
+       outputDesc.Version = SECBUFFER_VERSION
+       outputDesc.Buffers = &outputBuf
+       outputBuf.BufferSize = 0
+       outputBuf.BufferType = SECBUFFER_TOKEN
+       outputBuf.Buffer = nil
+
+       var expiry syscall.Filetime
+       var contextAttr uint32
+       var newContextHandle CtxtHandle
+
+       var status = a.Config.authAPI.AcceptSecurityContext(
+               a.serverCred,
+               context,
+               &inputDesc,
+               ASC_REQ_ALLOCATE_MEMORY|ASC_REQ_MUTUAL_AUTH|ASC_REQ_CONFIDENTIALITY|
+                       ASC_REQ_INTEGRITY|ASC_REQ_REPLAY_DETECT|ASC_REQ_SEQUENCE_DETECT, // contextReq uint32,
+               SECURITY_NATIVE_DREP, // targDataRep uint32,
+               &newContextHandle,
+               &outputDesc,  // *SecBufferDesc
+               &contextAttr, // contextAttr *uint32,
+               &expiry,      // *syscall.Filetime
+       )
+       if newContextHandle.Lower != 0 || newContextHandle.Upper != 0 {
+               newCtx = &newContextHandle
+       }
+       tm := time.Unix(0, expiry.Nanoseconds())
+       exp = &tm
+       if status == SEC_E_OK || status == SEC_I_CONTINUE_NEEDED {
+               // Copy outputBuf.Buffer to out and free the outputBuf.Buffer
+               out = make([]byte, outputBuf.BufferSize)
+               var bufPtr = uintptr(unsafe.Pointer(outputBuf.Buffer))
+               for i := 0; i < len(out); i++ {
+                       out[i] = *(*byte)(unsafe.Pointer(bufPtr))
+                       bufPtr++
+               }
+       }
+       if outputBuf.Buffer != nil {
+               freeStatus := a.Config.authAPI.FreeContextBuffer(outputBuf.Buffer)
+               if freeStatus != SEC_E_OK {
+                       status = freeStatus
+                       err = fmt.Errorf("could not free output buffer; FreeContextBuffer() failed with code: 0x%x", freeStatus)
+                       return
+               }
+       }
+       if status == SEC_I_CONTINUE_NEEDED {
+               err = errors.New("Negotiation should continue")
+               return
+       } else if status != SEC_E_OK {
+               err = fmt.Errorf("call to AcceptSecurityContext failed with code 0x%x", status)
+               return
+       }
+       // TODO: Check contextAttr?
+       return
+}
+
+// GetCtxHandle retrieves the context handle for this client from request's cookies
+func (a *Authenticator) GetCtxHandle(r *http.Request) (*CtxtHandle, error) {
+       sessionHandle, err := a.Config.contextStore.GetHandle(r)
+       if err != nil {
+               return nil, fmt.Errorf("could not get context handle from session: %s", err)
+       }
+       if contextHandle, ok := sessionHandle.(*CtxtHandle); ok {
+               log.Printf("CtxHandle: 0x%x\n", *contextHandle)
+               if contextHandle.Lower == 0 && contextHandle.Upper == 0 {
+                       return nil, nil
+               }
+               return contextHandle, nil
+       }
+       log.Printf("CtxHandle: nil\n")
+       return nil, nil
+}
+
+// SetCtxHandle stores the context handle for this client to cookie of response
+func (a *Authenticator) SetCtxHandle(r *http.Request, w http.ResponseWriter, newContext *CtxtHandle) error {
+       // Store can't store nil value, so if newContext is nil, store an empty CtxHandle
+       ctx := &CtxtHandle{}
+       if newContext != nil {
+               ctx = newContext
+       }
+       err := a.Config.contextStore.SetHandle(r, w, ctx)
+       if err != nil {
+               return fmt.Errorf("could not save context to cookie: %s", err)
+       }
+       log.Printf("New context: 0x%x\n", *ctx)
+       return nil
+}
+
+// GetFlags returns the negotiated context flags
+func (a *Authenticator) GetFlags(context *CtxtHandle) (uint32, error) {
+       var flags SecPkgContext_Flags
+       status := a.Config.authAPI.QueryContextAttributes(context, SECPKG_ATTR_FLAGS, (*byte)(unsafe.Pointer(&flags)))
+       if status != SEC_E_OK {
+               return 0, fmt.Errorf("QueryContextAttributes failed with status 0x%x", status)
+       }
+       return flags.Flags, nil
+}
+
+// GetUsername returns the name of the user associated with the specified security context
+func (a *Authenticator) GetUsername(context *CtxtHandle) (username string, err error) {
+       var names SecPkgContext_Names
+       status := a.Config.authAPI.QueryContextAttributes(context, SECPKG_ATTR_NAMES, (*byte)(unsafe.Pointer(&names)))
+       if status != SEC_E_OK {
+               err = fmt.Errorf("QueryContextAttributes failed with status 0x%x", status)
+               return
+       }
+       if names.UserName != nil {
+               username = UTF16PtrToString(names.UserName, 2048)
+               status = a.Config.authAPI.FreeContextBuffer((*byte)(unsafe.Pointer(names.UserName)))
+               if status != SEC_E_OK {
+                       err = fmt.Errorf("FreeContextBuffer failed with status 0x%x", status)
+               }
+               return
+       }
+       err = errors.New("QueryContextAttributes returned empty name")
+       return
+}
+
+// GetUserGroups returns the groups the user is a member of
+func (a *Authenticator) GetUserGroups(userName string) (groups []string, err error) {
+       var serverNamePtr *uint16
+       if a.Config.ServerName != "" {
+               serverNamePtr, err = syscall.UTF16PtrFromString(a.Config.ServerName)
+               if err != nil {
+                       return
+               }
+       }
+
+       userNamePtr, err := syscall.UTF16PtrFromString(userName)
+       if err != nil {
+               return
+       }
+       var buf *byte
+       var entriesRead uint32
+       var totalEntries uint32
+       err = a.Config.authAPI.NetUserGetGroups(
+               serverNamePtr,
+               userNamePtr,
+               0,
+               &buf,
+               MAX_PREFERRED_LENGTH,
+               &entriesRead,
+               &totalEntries,
+       )
+       if buf == nil {
+               err = fmt.Errorf("NetUserGetGroups(): returned nil buffer, error: %s", err)
+               return
+       }
+       defer func() {
+               freeErr := a.Config.authAPI.NetApiBufferFree(buf)
+               if freeErr != nil {
+                       err = freeErr
+               }
+       }()
+       if err != nil {
+               return
+       }
+       if entriesRead < totalEntries {
+               err = fmt.Errorf("NetUserGetGroups(): could not read all entries, read only %d entries of %d", entriesRead, totalEntries)
+               return
+       }
+
+       ptr := uintptr(unsafe.Pointer(buf))
+       for i := uint32(0); i < entriesRead; i++ {
+               groupInfo := (*GroupUsersInfo0)(unsafe.Pointer(ptr))
+               groupName := UTF16PtrToString(groupInfo.Grui0_name, MAX_GROUP_NAME_LENGTH)
+               if groupName != "" {
+                       groups = append(groups, groupName)
+               }
+               ptr += unsafe.Sizeof(GroupUsersInfo0{})
+       }
+       return
+}
+
+// GetUserInfo returns a structure containing the name of the user associated with the
+// specified security context and the groups to which they are a member of (if Config.EnumerateGroups)
+// is enabled
+func (a *Authenticator) GetUserInfo(context *CtxtHandle) (*UserInfo, error) {
+       // Get username
+       username, err := a.GetUsername(context)
+       if err != nil {
+               return nil, err
+       }
+       info := UserInfo{
+               Username: username,
+       }
+
+       // Get groups
+       if a.Config.EnumerateGroups {
+               info.Groups, err = a.GetUserGroups(username)
+               if err != nil {
+                       return nil, err
+               }
+       }
+
+       return &info, nil
+}
+
+// GetAuthData parses the "Authorization" header received from the client,
+// extracts the auth-data token (input token) and decodes it to []byte
+func (a *Authenticator) GetAuthData(r *http.Request, w http.ResponseWriter) (authData []byte, err error) {
+       // 1. Check if Authorization header is present
+       headers := r.Header["Authorization"]
+       if len(headers) == 0 {
+               err = errors.New("the Authorization header is not provided")
+               return
+       }
+       if len(headers) > 1 {
+               err = errors.New("received multiple Authorization headers, but expected only one")
+               return
+       }
+
+       authzHeader := strings.TrimSpace(headers[0])
+       if authzHeader == "" {
+               err = errors.New("the Authorization header is empty")
+               return
+       }
+       // 1.1. Make sure header starts with "Negotiate"
+       if !strings.HasPrefix(strings.ToLower(authzHeader), "negotiate") {
+               err = errors.New("the Authorization header does not start with 'Negotiate'")
+               return
+       }
+
+       // 2. Extract token from Authorization header
+       authzParts := strings.Split(authzHeader, " ")
+       if len(authzParts) < 2 {
+               err = errors.New("the Authorization header does not contain token (gssapi-data)")
+               return
+       }
+       token := authzParts[len(authzParts)-1]
+       if token == "" {
+               err = errors.New("the token (gssapi-data) in the Authorization header is empty")
+               return
+       }
+
+       // 3. Decode token
+       authData, err = base64.StdEncoding.DecodeString(token)
+       if err != nil {
+               err = errors.New("could not decode token as base64 string")
+               return
+       }
+
+       return
+}
+
+// Authenticate tries to authenticate the HTTP request and returns nil
+// if authentication was successful.
+// Returns error and data for continuation if authentication was not successful.
+func (a *Authenticator) Authenticate(r *http.Request, w http.ResponseWriter) (userInfo *UserInfo, outToken string, err error) {
+       // 1. Extract auth-data from Authorization header
+       authData, err := a.GetAuthData(r, w)
+       if err != nil {
+               err = fmt.Errorf("could not get auth data: %s", err)
+               return
+       }
+
+       // 2. Authenticate user with provided token
+       contextHandle, err := a.GetCtxHandle(r)
+       if err != nil {
+               return
+       }
+       newCtx, output, _, err := a.AcceptOrContinue(contextHandle, authData)
+
+       // If a new context was created, make sure to delete it or store it
+       // both in internal list and response Cookie
+       defer func() {
+               // Negotiation is ending if we don't expect further responses from the client
+               // (authentication was successful or no output token is going to be sent back),
+               // clear client cookie
+               endOfNegotiation := err == nil || len(output) == 0
+
+               // Current context (contextHandle) is not needed anymore and should be deleted if:
+               // - we don't expect further responses from the client
+               // - a new context has been returned by AcceptSecurityContext
+               currCtxNotNeeded := endOfNegotiation || newCtx != nil
+               if !currCtxNotNeeded {
+                       // Release current context only if its different than the new context
+                       if contextHandle != nil && *contextHandle != *newCtx {
+                               remErr := a.ReleaseCtxHandle(contextHandle)
+                               if remErr != nil {
+                                       err = remErr
+                                       return
+                               }
+                       }
+               }
+
+               if endOfNegotiation {
+                       // Clear client cookie
+                       setErr := a.SetCtxHandle(r, w, nil)
+                       if setErr != nil {
+                               err = fmt.Errorf("could not clear context, error: %s", setErr)
+                               return
+                       }
+
+                       // Delete any new context handle
+                       remErr := a.ReleaseCtxHandle(newCtx)
+                       if remErr != nil {
+                               err = remErr
+                               return
+                       }
+
+                       // Exit defer func
+                       return
+               }
+
+               if newCtx != nil {
+                       // Store new context handle to internal list and response Cookie
+                       a.StoreCtxHandle(newCtx)
+                       setErr := a.SetCtxHandle(r, w, newCtx)
+                       if setErr != nil {
+                               err = setErr
+                               return
+                       }
+               }
+       }()
+
+       outToken = base64.StdEncoding.EncodeToString(output)
+       if err != nil {
+               err = fmt.Errorf("AcceptOrContinue failed: %s", err)
+               return
+       }
+
+       // 3. Get username and user groups
+       currentCtx := newCtx
+       if currentCtx == nil {
+               currentCtx = contextHandle
+       }
+       userInfo, err = a.GetUserInfo(currentCtx)
+       if err != nil {
+               err = fmt.Errorf("could not get username, error: %s", err)
+               return
+       }
+
+       return
+}
+
+// AppendAuthenticateHeader populates WWW-Authenticate header,
+// indicating to client that authentication is required and returns a 401 (Unauthorized)
+// response code.
+// The data parameter can be empty for the first 401 response from the server.
+// For subsequent 401 responses the data parameter should contain the gssapi-data,
+// which is required for continuation of the negotiation.
+func (a *Authenticator) AppendAuthenticateHeader(w http.ResponseWriter, data string) {
+       value := "Negotiate"
+       if data != "" {
+               value += " " + data
+       }
+       w.Header().Set("WWW-Authenticate", value)
+}
+
+// Return401 populates WWW-Authenticate header, indicating to client that authentication
+// is required and returns a 401 (Unauthorized) response code.
+// The data parameter can be empty for the first 401 response from the server.
+// For subsequent 401 responses the data parameter should contain the gssapi-data,
+// which is required for continuation of the negotiation.
+func (a *Authenticator) Return401(w http.ResponseWriter, data string) {
+       a.AppendAuthenticateHeader(w, data)
+       http.Error(w, "Error!", http.StatusUnauthorized)
+}
+
+// WithAuth authenticates the request. On successful authentication the request
+// is passed down to the next http handler. The next handler can access information
+// about the authenticated user via the GetUserName method.
+// If authentication was not successful, the server returns 401 response code with
+// a WWW-Authenticate, indicating that authentication is required.
+func (a *Authenticator) WithAuth(next http.Handler) http.Handler {
+       return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               log.Printf("Authenticating request to %s\n", r.RequestURI)
+
+               user, data, err := a.Authenticate(r, w)
+               if err != nil {
+                       log.Printf("Authentication failed with error: %v\n", err)
+                       a.Return401(w, data)
+                       return
+               }
+
+               log.Print("Authenticated\n")
+               // Add the UserInfo value to the reqest's context
+               r = r.WithContext(context.WithValue(r.Context(), UserInfoKey, user))
+               // and to the request header with key Config.AuthUserKey
+               if a.Config.AuthUserKey != "" {
+                       r.Header.Set(a.Config.AuthUserKey, user.Username)
+               }
+
+               // The WWW-Authenticate header might need to be sent back even
+               // on successful authentication (eg. in order to let the client complete
+               // mutual authentication).
+               if data != "" {
+                       a.AppendAuthenticateHeader(w, data)
+               }
+               next.ServeHTTP(w, r)
+       })
+}
+
+func init() {
+       gob.Register(&CtxtHandle{})
+       gob.Register(&UserInfo{})
+}
diff --git a/vendor/github.com/quasoft/websspi/win32_windows.go b/vendor/github.com/quasoft/websspi/win32_windows.go
new file mode 100644 (file)
index 0000000..7359a09
--- /dev/null
@@ -0,0 +1,312 @@
+package websspi
+
+import (
+       "syscall"
+       "unsafe"
+
+       "golang.org/x/sys/windows"
+)
+
+// secur32.dll
+
+type SECURITY_STATUS syscall.Errno
+
+const (
+       SEC_E_OK = SECURITY_STATUS(0)
+
+       SEC_E_INCOMPLETE_MESSAGE          = SECURITY_STATUS(0x80090318)
+       SEC_E_INSUFFICIENT_MEMORY         = SECURITY_STATUS(0x80090300)
+       SEC_E_INTERNAL_ERROR              = SECURITY_STATUS(0x80090304)
+       SEC_E_INVALID_HANDLE              = SECURITY_STATUS(0x80090301)
+       SEC_E_INVALID_TOKEN               = SECURITY_STATUS(0x80090308)
+       SEC_E_LOGON_DENIED                = SECURITY_STATUS(0x8009030C)
+       SEC_E_NO_AUTHENTICATING_AUTHORITY = SECURITY_STATUS(0x80090311)
+       SEC_E_NO_CREDENTIALS              = SECURITY_STATUS(0x8009030E)
+       SEC_E_UNSUPPORTED_FUNCTION        = SECURITY_STATUS(0x80090302)
+       SEC_I_COMPLETE_AND_CONTINUE       = SECURITY_STATUS(0x00090314)
+       SEC_I_COMPLETE_NEEDED             = SECURITY_STATUS(0x00090313)
+       SEC_I_CONTINUE_NEEDED             = SECURITY_STATUS(0x00090312)
+       SEC_E_NOT_OWNER                   = SECURITY_STATUS(0x80090306)
+       SEC_E_SECPKG_NOT_FOUND            = SECURITY_STATUS(0x80090305)
+       SEC_E_UNKNOWN_CREDENTIALS         = SECURITY_STATUS(0x8009030D)
+
+       NEGOSSP_NAME         = "Negotiate"
+       SECPKG_CRED_INBOUND  = 1
+       SECURITY_NATIVE_DREP = 16
+
+       ASC_REQ_DELEGATE        = 1
+       ASC_REQ_MUTUAL_AUTH     = 2
+       ASC_REQ_REPLAY_DETECT   = 4
+       ASC_REQ_SEQUENCE_DETECT = 8
+       ASC_REQ_CONFIDENTIALITY = 16
+       ASC_REQ_USE_SESSION_KEY = 32
+       ASC_REQ_ALLOCATE_MEMORY = 256
+       ASC_REQ_USE_DCE_STYLE   = 512
+       ASC_REQ_DATAGRAM        = 1024
+       ASC_REQ_CONNECTION      = 2048
+       ASC_REQ_EXTENDED_ERROR  = 32768
+       ASC_REQ_STREAM          = 65536
+       ASC_REQ_INTEGRITY       = 131072
+
+       SECPKG_ATTR_SIZES            = 0
+       SECPKG_ATTR_NAMES            = 1
+       SECPKG_ATTR_LIFESPAN         = 2
+       SECPKG_ATTR_DCE_INFO         = 3
+       SECPKG_ATTR_STREAM_SIZES     = 4
+       SECPKG_ATTR_KEY_INFO         = 5
+       SECPKG_ATTR_AUTHORITY        = 6
+       SECPKG_ATTR_PROTO_INFO       = 7
+       SECPKG_ATTR_PASSWORD_EXPIRY  = 8
+       SECPKG_ATTR_SESSION_KEY      = 9
+       SECPKG_ATTR_PACKAGE_INFO     = 10
+       SECPKG_ATTR_USER_FLAGS       = 11
+       SECPKG_ATTR_NEGOTIATION_INFO = 12
+       SECPKG_ATTR_NATIVE_NAMES     = 13
+       SECPKG_ATTR_FLAGS            = 14
+
+       SECBUFFER_VERSION = 0
+       SECBUFFER_TOKEN   = 2
+)
+
+type CredHandle struct {
+       Lower uintptr
+       Upper uintptr
+}
+
+type CtxtHandle struct {
+       Lower uintptr
+       Upper uintptr
+}
+
+type SecBuffer struct {
+       BufferSize uint32
+       BufferType uint32
+       Buffer     *byte
+}
+
+type SecBufferDesc struct {
+       Version      uint32
+       BuffersCount uint32
+       Buffers      *SecBuffer
+}
+
+type LUID struct {
+       LowPart  uint32
+       HighPart int32
+}
+
+type SecPkgContext_Names struct {
+       UserName *uint16
+}
+
+type SecPkgContext_Flags struct {
+       Flags uint32
+}
+
+// netapi32.dll
+
+const (
+       NERR_Success       = 0x0
+       NERR_InternalError = 0x85C
+       NERR_UserNotFound  = 0x8AD
+
+       ERROR_ACCESS_DENIED     = 0x5
+       ERROR_BAD_NETPATH       = 0x35
+       ERROR_INVALID_LEVEL     = 0x7C
+       ERROR_INVALID_NAME      = 0x7B
+       ERROR_MORE_DATA         = 0xEA
+       ERROR_NOT_ENOUGH_MEMORY = 0x8
+
+       MAX_PREFERRED_LENGTH  = 0xFFFFFFFF
+       MAX_GROUP_NAME_LENGTH = 256
+
+       SE_GROUP_MANDATORY          = 0x1
+       SE_GROUP_ENABLED_BY_DEFAULT = 0x2
+       SE_GROUP_ENABLED            = 0x4
+       SE_GROUP_OWNER              = 0x8
+       SE_GROUP_USE_FOR_DENY_ONLY  = 0x10
+       SE_GROUP_INTEGRITY          = 0x20
+       SE_GROUP_INTEGRITY_ENABLED  = 0x40
+       SE_GROUP_LOGON_ID           = 0xC0000000
+       SE_GROUP_RESOURCE           = 0x20000000
+)
+
+type GroupUsersInfo0 struct {
+       Grui0_name *uint16
+}
+
+type GroupUsersInfo1 struct {
+       Grui1_name       *uint16
+       Grui1_attributes uint32
+}
+
+// The API interface describes the Win32 functions used in this package and
+// its primary purpose is to allow replacing them with stub functions in unit tests.
+type API interface {
+       AcquireCredentialsHandle(
+               principal *uint16,
+               _package *uint16,
+               credentialUse uint32,
+               logonID *LUID,
+               authData *byte,
+               getKeyFn uintptr,
+               getKeyArgument uintptr,
+               credHandle *CredHandle,
+               expiry *syscall.Filetime,
+       ) SECURITY_STATUS
+       AcceptSecurityContext(
+               credential *CredHandle,
+               context *CtxtHandle,
+               input *SecBufferDesc,
+               contextReq uint32,
+               targDataRep uint32,
+               newContext *CtxtHandle,
+               output *SecBufferDesc,
+               contextAttr *uint32,
+               expiry *syscall.Filetime,
+       ) SECURITY_STATUS
+       QueryContextAttributes(context *CtxtHandle, attribute uint32, buffer *byte) SECURITY_STATUS
+       DeleteSecurityContext(context *CtxtHandle) SECURITY_STATUS
+       FreeContextBuffer(buffer *byte) SECURITY_STATUS
+       FreeCredentialsHandle(handle *CredHandle) SECURITY_STATUS
+       NetUserGetGroups(
+               serverName *uint16,
+               userName *uint16,
+               level uint32,
+               buf **byte,
+               prefmaxlen uint32,
+               entriesread *uint32,
+               totalentries *uint32,
+       ) (neterr error)
+       NetApiBufferFree(buf *byte) (neterr error)
+}
+
+// Win32 implements the API interface by calling the relevant system functions
+// from secur32.dll and netapi32.dll
+type Win32 struct{}
+
+var (
+       secur32dll  = windows.NewLazySystemDLL("secur32.dll")
+       netapi32dll = windows.NewLazySystemDLL("netapi32.dll")
+
+       procAcquireCredentialsHandleW = secur32dll.NewProc("AcquireCredentialsHandleW")
+       procAcceptSecurityContext     = secur32dll.NewProc("AcceptSecurityContext")
+       procQueryContextAttributesW   = secur32dll.NewProc("QueryContextAttributesW")
+       procDeleteSecurityContext     = secur32dll.NewProc("DeleteSecurityContext")
+       procFreeContextBuffer         = secur32dll.NewProc("FreeContextBuffer")
+       procFreeCredentialsHandle     = secur32dll.NewProc("FreeCredentialsHandle")
+       procNetUserGetGroups          = netapi32dll.NewProc("NetUserGetGroups")
+)
+
+func (w *Win32) AcquireCredentialsHandle(
+       principal *uint16,
+       _package *uint16,
+       credentialUse uint32,
+       logonId *LUID,
+       authData *byte,
+       getKeyFn uintptr,
+       getKeyArgument uintptr,
+       credHandle *CredHandle,
+       expiry *syscall.Filetime,
+) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall9(
+               procAcquireCredentialsHandleW.Addr(), 9,
+               uintptr(unsafe.Pointer(principal)),
+               uintptr(unsafe.Pointer(_package)),
+               uintptr(credentialUse),
+               uintptr(unsafe.Pointer(logonId)),
+               uintptr(unsafe.Pointer(authData)),
+               uintptr(getKeyFn),
+               uintptr(getKeyArgument),
+               uintptr(unsafe.Pointer(credHandle)),
+               uintptr(unsafe.Pointer(expiry)),
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) AcceptSecurityContext(
+       credential *CredHandle,
+       context *CtxtHandle,
+       input *SecBufferDesc,
+       contextReq uint32,
+       targDataRep uint32,
+       newContext *CtxtHandle,
+       output *SecBufferDesc,
+       contextAttr *uint32,
+       expiry *syscall.Filetime,
+) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall9(
+               procAcceptSecurityContext.Addr(), 9,
+               uintptr(unsafe.Pointer(credential)),
+               uintptr(unsafe.Pointer(context)),
+               uintptr(unsafe.Pointer(input)),
+               uintptr(contextReq),
+               uintptr(targDataRep),
+               uintptr(unsafe.Pointer(newContext)),
+               uintptr(unsafe.Pointer(output)),
+               uintptr(unsafe.Pointer(contextAttr)),
+               uintptr(unsafe.Pointer(expiry)),
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) QueryContextAttributes(
+       context *CtxtHandle,
+       attribute uint32,
+       buffer *byte,
+) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall(
+               procQueryContextAttributesW.Addr(), 3,
+               uintptr(unsafe.Pointer(context)),
+               uintptr(attribute),
+               uintptr(unsafe.Pointer(buffer)),
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) DeleteSecurityContext(context *CtxtHandle) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall(
+               procDeleteSecurityContext.Addr(), 1,
+               uintptr(unsafe.Pointer(context)),
+               0, 0,
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) FreeContextBuffer(buffer *byte) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall(
+               procFreeContextBuffer.Addr(), 1,
+               uintptr(unsafe.Pointer(buffer)),
+               0, 0,
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) FreeCredentialsHandle(handle *CredHandle) SECURITY_STATUS {
+       r1, _, _ := syscall.Syscall(
+               procFreeCredentialsHandle.Addr(), 1,
+               uintptr(unsafe.Pointer(handle)),
+               0, 0,
+       )
+       return SECURITY_STATUS(r1)
+}
+
+func (w *Win32) NetUserGetGroups(
+       serverName *uint16,
+       userName *uint16,
+       level uint32,
+       buf **byte,
+       prefmaxlen uint32,
+       entriesread *uint32,
+       totalentries *uint32,
+) (neterr error) {
+       r0, _, _ := syscall.Syscall9(procNetUserGetGroups.Addr(), 7, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(prefmaxlen), uintptr(unsafe.Pointer(entriesread)), uintptr(unsafe.Pointer(totalentries)), 0, 0)
+       if r0 != 0 {
+               neterr = syscall.Errno(r0)
+       }
+       return
+}
+
+func (w *Win32) NetApiBufferFree(buf *byte) (neterr error) {
+       return syscall.NetApiBufferFree(buf)
+}
index da6b9e4363d47e8c3b54a956ac1f73c2d0cda2cd..ed8da8deacf082c277bdb353489cbd5408d08d1a 100644 (file)
@@ -5,26 +5,56 @@
 package cpu
 
 import (
-       "encoding/binary"
        "runtime"
 )
 
+// byteOrder is a subset of encoding/binary.ByteOrder.
+type byteOrder interface {
+       Uint32([]byte) uint32
+       Uint64([]byte) uint64
+}
+
+type littleEndian struct{}
+type bigEndian struct{}
+
+func (littleEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
+}
+
+func (littleEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
+               uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
+}
+
+func (bigEndian) Uint32(b []byte) uint32 {
+       _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
+}
+
+func (bigEndian) Uint64(b []byte) uint64 {
+       _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+       return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+               uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+}
+
 // hostByteOrder returns binary.LittleEndian on little-endian machines and
 // binary.BigEndian on big-endian machines.
-func hostByteOrder() binary.ByteOrder {
+func hostByteOrder() byteOrder {
        switch runtime.GOARCH {
        case "386", "amd64", "amd64p32",
                "arm", "arm64",
                "mipsle", "mips64le", "mips64p32le",
                "ppc64le",
                "riscv", "riscv64":
-               return binary.LittleEndian
+               return littleEndian{}
        case "armbe", "arm64be",
                "mips", "mips64", "mips64p32",
                "ppc", "ppc64",
                "s390", "s390x",
                "sparc", "sparc64":
-               return binary.BigEndian
+               return bigEndian{}
        }
        panic("unknown architecture")
 }
index 679e78c2cefec4cb95409d0832d29cbe2d445841..b4e6ecb2dcc80d1b711ad5488bb30eddc673dc15 100644 (file)
@@ -78,6 +78,42 @@ var ARM64 struct {
        _           CacheLinePad
 }
 
+// ARM contains the supported CPU features of the current ARM (32-bit) platform.
+// All feature flags are false if:
+//   1. the current platform is not arm, or
+//   2. the current operating system is not Linux.
+var ARM struct {
+       _           CacheLinePad
+       HasSWP      bool // SWP instruction support
+       HasHALF     bool // Half-word load and store support
+       HasTHUMB    bool // ARM Thumb instruction set
+       Has26BIT    bool // Address space limited to 26-bits
+       HasFASTMUL  bool // 32-bit operand, 64-bit result multiplication support
+       HasFPA      bool // Floating point arithmetic support
+       HasVFP      bool // Vector floating point support
+       HasEDSP     bool // DSP Extensions support
+       HasJAVA     bool // Java instruction set
+       HasIWMMXT   bool // Intel Wireless MMX technology support
+       HasCRUNCH   bool // MaverickCrunch context switching and handling
+       HasTHUMBEE  bool // Thumb EE instruction set
+       HasNEON     bool // NEON instruction set
+       HasVFPv3    bool // Vector floating point version 3 support
+       HasVFPv3D16 bool // Vector floating point version 3 D8-D15
+       HasTLS      bool // Thread local storage support
+       HasVFPv4    bool // Vector floating point version 4 support
+       HasIDIVA    bool // Integer divide instruction support in ARM mode
+       HasIDIVT    bool // Integer divide instruction support in Thumb mode
+       HasVFPD32   bool // Vector floating point version 3 D15-D31
+       HasLPAE     bool // Large Physical Address Extensions
+       HasEVTSTRM  bool // Event stream support
+       HasAES      bool // AES hardware implementation
+       HasPMULL    bool // Polynomial multiplication instruction set
+       HasSHA1     bool // SHA1 hardware implementation
+       HasSHA2     bool // SHA2 hardware implementation
+       HasCRC32    bool // CRC32 hardware implementation
+       _           CacheLinePad
+}
+
 // PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms.
 // If the current platform is not ppc64/ppc64le then all feature flags are false.
 //
index 7f2348b7d4b623816a330eb511aed8372af596bf..981af6818ca9204798df0f77058488e6e58b3665 100644 (file)
@@ -6,4 +6,35 @@ package cpu
 
 const cacheLineSize = 32
 
-func doinit() {}
+// HWCAP/HWCAP2 bits.
+// These are specific to Linux.
+const (
+       hwcap_SWP       = 1 << 0
+       hwcap_HALF      = 1 << 1
+       hwcap_THUMB     = 1 << 2
+       hwcap_26BIT     = 1 << 3
+       hwcap_FAST_MULT = 1 << 4
+       hwcap_FPA       = 1 << 5
+       hwcap_VFP       = 1 << 6
+       hwcap_EDSP      = 1 << 7
+       hwcap_JAVA      = 1 << 8
+       hwcap_IWMMXT    = 1 << 9
+       hwcap_CRUNCH    = 1 << 10
+       hwcap_THUMBEE   = 1 << 11
+       hwcap_NEON      = 1 << 12
+       hwcap_VFPv3     = 1 << 13
+       hwcap_VFPv3D16  = 1 << 14
+       hwcap_TLS       = 1 << 15
+       hwcap_VFPv4     = 1 << 16
+       hwcap_IDIVA     = 1 << 17
+       hwcap_IDIVT     = 1 << 18
+       hwcap_VFPD32    = 1 << 19
+       hwcap_LPAE      = 1 << 20
+       hwcap_EVTSTRM   = 1 << 21
+
+       hwcap2_AES   = 1 << 0
+       hwcap2_PMULL = 1 << 1
+       hwcap2_SHA1  = 1 << 2
+       hwcap2_SHA2  = 1 << 3
+       hwcap2_CRC32 = 1 << 4
+)
diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go
new file mode 100644 (file)
index 0000000..2057006
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+func doinit() {
+       ARM.HasSWP = isSet(hwCap, hwcap_SWP)
+       ARM.HasHALF = isSet(hwCap, hwcap_HALF)
+       ARM.HasTHUMB = isSet(hwCap, hwcap_THUMB)
+       ARM.Has26BIT = isSet(hwCap, hwcap_26BIT)
+       ARM.HasFASTMUL = isSet(hwCap, hwcap_FAST_MULT)
+       ARM.HasFPA = isSet(hwCap, hwcap_FPA)
+       ARM.HasVFP = isSet(hwCap, hwcap_VFP)
+       ARM.HasEDSP = isSet(hwCap, hwcap_EDSP)
+       ARM.HasJAVA = isSet(hwCap, hwcap_JAVA)
+       ARM.HasIWMMXT = isSet(hwCap, hwcap_IWMMXT)
+       ARM.HasCRUNCH = isSet(hwCap, hwcap_CRUNCH)
+       ARM.HasTHUMBEE = isSet(hwCap, hwcap_THUMBEE)
+       ARM.HasNEON = isSet(hwCap, hwcap_NEON)
+       ARM.HasVFPv3 = isSet(hwCap, hwcap_VFPv3)
+       ARM.HasVFPv3D16 = isSet(hwCap, hwcap_VFPv3D16)
+       ARM.HasTLS = isSet(hwCap, hwcap_TLS)
+       ARM.HasVFPv4 = isSet(hwCap, hwcap_VFPv4)
+       ARM.HasIDIVA = isSet(hwCap, hwcap_IDIVA)
+       ARM.HasIDIVT = isSet(hwCap, hwcap_IDIVT)
+       ARM.HasVFPD32 = isSet(hwCap, hwcap_VFPD32)
+       ARM.HasLPAE = isSet(hwCap, hwcap_LPAE)
+       ARM.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM)
+       ARM.HasAES = isSet(hwCap2, hwcap2_AES)
+       ARM.HasPMULL = isSet(hwCap2, hwcap2_PMULL)
+       ARM.HasSHA1 = isSet(hwCap2, hwcap2_SHA1)
+       ARM.HasSHA2 = isSet(hwCap2, hwcap2_SHA2)
+       ARM.HasCRC32 = isSet(hwCap2, hwcap2_CRC32)
+}
+
+func isSet(hwc uint, value uint) bool {
+       return hwc&value != 0
+}
index 5a22eca96761284a760ad2d3648a0a659ef9e3c2..890ec464c7a8ee219ff740b567b51305e6c4b98e 100644 (file)
@@ -212,9 +212,11 @@ esac
                                echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ;
                        elif [ "$GOOS" == "darwin" ]; then
                                # pre-1.12, direct syscalls
-                               echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go";
+                               echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos syscall_darwin_${GOARCH}.1_11.go $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go";
                                # 1.12 and later, syscalls via libSystem
                                echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
+                               # 1.13 and later, syscalls via libSystem (including syscallPtr)
+                               echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go";
                        else
                                echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
                        fi
index e096161a527e56fe03fd418dae015bc6d0f6132c..67b84828ac063a289809f08e7553c91803e47965 100644 (file)
@@ -60,6 +60,7 @@ includes_Darwin='
 #include <sys/types.h>
 #include <sys/event.h>
 #include <sys/ptrace.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
@@ -80,6 +81,7 @@ includes_Darwin='
 includes_DragonFly='
 #include <sys/types.h>
 #include <sys/event.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/stat.h>
@@ -103,6 +105,7 @@ includes_FreeBSD='
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/event.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/stat.h>
@@ -179,24 +182,31 @@ struct ltchars {
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/time.h>
+#include <sys/select.h>
 #include <sys/signalfd.h>
 #include <sys/socket.h>
 #include <sys/xattr.h>
 #include <linux/bpf.h>
+#include <linux/can.h>
 #include <linux/capability.h>
+#include <linux/cryptouser.h>
 #include <linux/errqueue.h>
+#include <linux/falloc.h>
+#include <linux/fanotify.h>
+#include <linux/filter.h>
+#include <linux/fs.h>
+#include <linux/genetlink.h>
+#include <linux/hdreg.h>
+#include <linux/icmpv6.h>
 #include <linux/if.h>
+#include <linux/if_addr.h>
 #include <linux/if_alg.h>
 #include <linux/if_arp.h>
 #include <linux/if_ether.h>
 #include <linux/if_ppp.h>
 #include <linux/if_tun.h>
 #include <linux/if_packet.h>
-#include <linux/if_addr.h>
-#include <linux/falloc.h>
-#include <linux/fanotify.h>
-#include <linux/filter.h>
-#include <linux/fs.h>
+#include <linux/if_xdp.h>
 #include <linux/kexec.h>
 #include <linux/keyctl.h>
 #include <linux/loop.h>
@@ -208,26 +218,21 @@ struct ltchars {
 #include <linux/net_namespace.h>
 #include <linux/nsfs.h>
 #include <linux/perf_event.h>
+#include <linux/ptrace.h>
 #include <linux/random.h>
 #include <linux/reboot.h>
+#include <linux/rtc.h>
 #include <linux/rtnetlink.h>
-#include <linux/ptrace.h>
 #include <linux/sched.h>
 #include <linux/seccomp.h>
-#include <linux/sockios.h>
-#include <linux/wait.h>
-#include <linux/icmpv6.h>
 #include <linux/serial.h>
-#include <linux/can.h>
-#include <linux/vm_sockets.h>
+#include <linux/sockios.h>
 #include <linux/taskstats.h>
-#include <linux/genetlink.h>
-#include <linux/watchdog.h>
-#include <linux/hdreg.h>
-#include <linux/rtc.h>
-#include <linux/if_xdp.h>
-#include <linux/cryptouser.h>
 #include <linux/tipc.h>
+#include <linux/vm_sockets.h>
+#include <linux/wait.h>
+#include <linux/watchdog.h>
+
 #include <mtd/ubi-user.h>
 #include <net/route.h>
 
@@ -266,6 +271,11 @@ struct ltchars {
 #define FS_KEY_DESC_PREFIX              "fscrypt:"
 #define FS_KEY_DESC_PREFIX_SIZE         8
 #define FS_MAX_KEY_SIZE                 64
+
+// The code generator produces -0x1 for (~0), but an unsigned value is necessary
+// for the tipc_subscr timeout __u32 field.
+#undef TIPC_WAIT_FOREVER
+#define TIPC_WAIT_FOREVER 0xffffffff
 '
 
 includes_NetBSD='
@@ -275,6 +285,7 @@ includes_NetBSD='
 #include <sys/extattr.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
@@ -301,6 +312,7 @@ includes_OpenBSD='
 #include <sys/event.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/stat.h>
@@ -337,6 +349,7 @@ includes_OpenBSD='
 includes_SunOS='
 #include <limits.h>
 #include <sys/types.h>
+#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/stat.h>
@@ -429,6 +442,7 @@ ccflags="$@"
                $2 == "XCASE" ||
                $2 == "ALTWERASE" ||
                $2 == "NOKERNINFO" ||
+               $2 == "NFDBITS" ||
                $2 ~ /^PAR/ ||
                $2 ~ /^SIG[^_]/ ||
                $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ ||
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go
new file mode 100644 (file)
index 0000000..6a15cba
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,go1.12,!go1.13
+
+package unix
+
+import (
+       "unsafe"
+)
+
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       // To implement this using libSystem we'd need syscall_syscallPtr for
+       // fdopendir. However, syscallPtr was only added in Go 1.13, so we fall
+       // back to raw syscalls for this func on Go 1.12.
+       var p unsafe.Pointer
+       if len(buf) > 0 {
+               p = unsafe.Pointer(&buf[0])
+       } else {
+               p = unsafe.Pointer(&_zero)
+       }
+       r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(p), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
+       n = int(r0)
+       if e1 != 0 {
+               return n, errnoErr(e1)
+       }
+       return n, nil
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
new file mode 100644 (file)
index 0000000..24960c3
--- /dev/null
@@ -0,0 +1,103 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,go1.13
+
+package unix
+
+import "unsafe"
+
+//sys  closedir(dir uintptr) (err error)
+//sys  readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)
+
+func fdopendir(fd int) (dir uintptr, err error) {
+       r0, _, e1 := syscall_syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
+       dir = uintptr(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_fdopendir_trampoline()
+
+//go:linkname libc_fdopendir libc_fdopendir
+//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
+
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       // Simulate Getdirentries using fdopendir/readdir_r/closedir.
+       const ptrSize = unsafe.Sizeof(uintptr(0))
+
+       // We store the number of entries to skip in the seek
+       // offset of fd. See issue #31368.
+       // It's not the full required semantics, but should handle the case
+       // of calling Getdirentries or ReadDirent repeatedly.
+       // It won't handle assigning the results of lseek to *basep, or handle
+       // the directory being edited underfoot.
+       skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
+       if err != nil {
+               return 0, err
+       }
+
+       // We need to duplicate the incoming file descriptor
+       // because the caller expects to retain control of it, but
+       // fdopendir expects to take control of its argument.
+       // Just Dup'ing the file descriptor is not enough, as the
+       // result shares underlying state. Use Openat to make a really
+       // new file descriptor referring to the same directory.
+       fd2, err := Openat(fd, ".", O_RDONLY, 0)
+       if err != nil {
+               return 0, err
+       }
+       d, err := fdopendir(fd2)
+       if err != nil {
+               Close(fd2)
+               return 0, err
+       }
+       defer closedir(d)
+
+       var cnt int64
+       for {
+               var entry Dirent
+               var entryp *Dirent
+               e := readdir_r(d, &entry, &entryp)
+               if e != 0 {
+                       return n, errnoErr(e)
+               }
+               if entryp == nil {
+                       break
+               }
+               if skip > 0 {
+                       skip--
+                       cnt++
+                       continue
+               }
+               reclen := int(entry.Reclen)
+               if reclen > len(buf) {
+                       // Not enough room. Return for now.
+                       // The counter will let us know where we should start up again.
+                       // Note: this strategy for suspending in the middle and
+                       // restarting is O(n^2) in the length of the directory. Oh well.
+                       break
+               }
+               // Copy entry into return buffer.
+               s := struct {
+                       ptr unsafe.Pointer
+                       siz int
+                       cap int
+               }{ptr: unsafe.Pointer(&entry), siz: reclen, cap: reclen}
+               copy(buf, *(*[]byte)(unsafe.Pointer(&s)))
+               buf = buf[reclen:]
+               n += reclen
+               cnt++
+       }
+       // Set the seek offset of the input fd to record
+       // how many files we've already returned.
+       _, err = Seek(fd, cnt, 0 /* SEEK_SET */)
+       if err != nil {
+               return n, err
+       }
+
+       return n, nil
+}
index f26a19ebd6a6a2c72d47b0a90f11648029aacd6d..c5018a385c87909076c32cabfb6cd513e7956642 100644 (file)
@@ -460,7 +460,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 //sys  Revoke(path string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sys  Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go
new file mode 100644 (file)
index 0000000..6b223f9
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,386,!go1.12
+
+package unix
+
+//sys  Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
index cf1bec6a3b745cbee1a37f42db421e97179d7f73..dd756e708c2515e852f8d3f9c5549881c2274a70 100644 (file)
@@ -63,7 +63,6 @@ const SYS___SYSCTL = SYS_SYSCTL
 //sys  Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 //sys  Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
 //sys  Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
-//sys  Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
 //sys  getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
 //sys  Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 //sys  Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go
new file mode 100644 (file)
index 0000000..68ebd6f
--- /dev/null
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,amd64,!go1.12
+
+package unix
+
+//sys  Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
index 5867ed00b631d523a9d8f6f462176ed8a3df6c32..7f148c428e8c46cf2e18ec1229fb20c7cf798bb2 100644 (file)
@@ -63,7 +63,6 @@ const SYS___SYSCTL = SYS_SYSCTL
 //sys  Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 //sys  Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
 //sys  Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
-//sys  Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
 //sys  getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
 //sys  Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 //sys  Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go
new file mode 100644 (file)
index 0000000..c81510d
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,386,!go1.12
+
+package unix
+
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       return 0, ENOSYS
+}
index e199e12a5d500eac97da91c95189725f3ac8eeba..58be02e718a1ef434f64e1b5d67ec82cfba42e02 100644 (file)
@@ -70,7 +70,3 @@ const SYS___SYSCTL = SYS_SYSCTL
 //sys  Lstat(path string, stat *Stat_t) (err error)
 //sys  Stat(path string, stat *Stat_t) (err error)
 //sys  Statfs(path string, stat *Statfs_t) (err error)
-
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       return 0, ENOSYS
-}
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go
new file mode 100644 (file)
index 0000000..01d4504
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin,arm64,!go1.12
+
+package unix
+
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       return 0, ENOSYS
+}
index 2c50ca9015404625392d18a2ce6da54f4e512475..1ee931f97c1ce4fb10fbf95d92180e0b2955cf83 100644 (file)
@@ -72,7 +72,3 @@ const SYS___SYSCTL = SYS_SYSCTL
 //sys  Lstat(path string, stat *Stat_t) (err error)
 //sys  Stat(path string, stat *Stat_t) (err error)
 //sys  Statfs(path string, stat *Statfs_t) (err error)
-
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       return 0, ENOSYS
-}
index 4b4ae460f2ff94631580e1bbb5f81c1d82acd577..f34c86c899ac2759a063b230f1351b62dc762261 100644 (file)
@@ -15,6 +15,7 @@ func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err
 func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // 32-bit only
 func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
 func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
+func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
 
 //go:linkname syscall_syscall syscall.syscall
 //go:linkname syscall_syscall6 syscall.syscall6
@@ -22,6 +23,7 @@ func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, er
 //go:linkname syscall_syscall9 syscall.syscall9
 //go:linkname syscall_rawSyscall syscall.rawSyscall
 //go:linkname syscall_rawSyscall6 syscall.rawSyscall6
+//go:linkname syscall_syscallPtr syscall.syscallPtr
 
 // Find the entry point for f. See comments in runtime/proc.go for the
 // function of the same name.
index 99d875624935084a26e1cfddcd365ae686dae705..8c8d5029799b3c7e744b22be6ad382058047bbcc 100644 (file)
@@ -290,7 +290,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 //sys  Revoke(path string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sysnb        Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
index b62231bca253b8103838c0684e5a753e74a67a5f..25ac9340c023455674d9f638048cf5e5ae65c943 100644 (file)
@@ -653,7 +653,7 @@ func PtraceSingleStep(pid int) (err error) {
 //sys  Revoke(path string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sysnb        Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
index e538bb5677a0a81df69f830885bb7401cdcccbf9..ebf3195b65491d86544193266e722ff3b9bea5a8 100644 (file)
@@ -1222,6 +1222,34 @@ func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error
        return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)
 }
 
+// KeyctlRestrictKeyring implements the KEYCTL_RESTRICT_KEYRING command. This
+// command limits the set of keys that can be linked to the keyring, regardless
+// of keyring permissions. The command requires the "setattr" permission.
+//
+// When called with an empty keyType the command locks the keyring, preventing
+// any further keys from being linked to the keyring.
+//
+// The "asymmetric" keyType defines restrictions requiring key payloads to be
+// DER encoded X.509 certificates signed by keys in another keyring. Restrictions
+// for "asymmetric" include "builtin_trusted", "builtin_and_secondary_trusted",
+// "key_or_keyring:<key>", and "key_or_keyring:<key>:chain".
+//
+// As of Linux 4.12, only the "asymmetric" keyType defines type-specific
+// restrictions.
+//
+// See the full documentation at:
+// http://man7.org/linux/man-pages/man3/keyctl_restrict_keyring.3.html
+// http://man7.org/linux/man-pages/man2/keyctl.2.html
+func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error {
+       if keyType == "" {
+               return keyctlRestrictKeyring(KEYCTL_RESTRICT_KEYRING, ringid)
+       }
+       return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, ringid, keyType, restriction)
+}
+
+//sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL
+//sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL
+
 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
        var msg Msghdr
        var rsa RawSockaddrAny
@@ -1465,8 +1493,12 @@ func PtraceSyscall(pid int, signal int) (err error) {
 
 func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
 
+func PtraceInterrupt(pid int) (err error) { return ptrace(PTRACE_INTERRUPT, pid, 0, 0) }
+
 func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
 
+func PtraceSeize(pid int) (err error) { return ptrace(PTRACE_SEIZE, pid, 0, 0) }
+
 func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
 
 //sys  reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
@@ -1823,6 +1855,17 @@ func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err erro
        return openByHandleAt(mountFD, handle.fileHandle, flags)
 }
 
+// Klogset wraps the sys_syslog system call; it sets console_loglevel to
+// the value specified by arg and passes a dummy pointer to bufp.
+func Klogset(typ int, arg int) (err error) {
+       var p unsafe.Pointer
+       _, _, errno := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(p), uintptr(arg))
+       if errno != 0 {
+               return errnoErr(errno)
+       }
+       return nil
+}
+
 /*
  * Unimplemented
  */
index 3e3f075076ded374ebf6e93b1911e79872d11273..f95463ee2874a0c3ae36a1709c94e997c37658c6 100644 (file)
@@ -330,7 +330,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 //sys  Revoke(path string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sysnb        Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
index 035c043a7c96f43077535a59f7884e814690c8dd..7fe65ef75f83fb35488e60dade859906a3c1eba4 100644 (file)
@@ -305,7 +305,7 @@ func Uname(uname *Utsname) error {
 //sys  Revoke(path string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sysnb        Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
index 1610f551d4c8c0133ee4b30158e5d2629fdad576..62f968c7f02b3ce443388df37b3d61cb953d94cc 100644 (file)
@@ -649,7 +649,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 //sys  Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 //sys  Rmdir(path string) (err error)
 //sys  Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
-//sys  Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
+//sys  Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 //sysnb        Setegid(egid int) (err error)
 //sysnb        Seteuid(euid int) (err error)
 //sysnb        Setgid(gid int) (err error)
index 3b39d7408ad84bd494918a9ca70a766ac65d2e7e..6217cdba57bea8fa703b9b0447066a177e18b1ef 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build 386,darwin
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m32 _const.go
 
 package unix
@@ -980,6 +980,7 @@ const (
        NET_RT_MAXID                      = 0xa
        NET_RT_STAT                       = 0x4
        NET_RT_TRASH                      = 0x5
+       NFDBITS                           = 0x20
        NL0                               = 0x0
        NL1                               = 0x100
        NL2                               = 0x200
index 8fe5547775b2ced15c43edfa5082d6882a1ce0d7..e3ff2ee3d48cabd0952d921698317026e96fab1e 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build amd64,darwin
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -980,6 +980,7 @@ const (
        NET_RT_MAXID                      = 0xa
        NET_RT_STAT                       = 0x4
        NET_RT_TRASH                      = 0x5
+       NFDBITS                           = 0x20
        NL0                               = 0x0
        NL1                               = 0x100
        NL2                               = 0x200
index 7a977770d0ade59dc3e1cfdc0b5d4c2f704c0e62..3e417571a94a276b3c49ca4c77cb29d552653885 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm,darwin
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- _const.go
 
 package unix
@@ -980,6 +980,7 @@ const (
        NET_RT_MAXID                      = 0xa
        NET_RT_STAT                       = 0x4
        NET_RT_TRASH                      = 0x5
+       NFDBITS                           = 0x20
        NL0                               = 0x0
        NL1                               = 0x100
        NL2                               = 0x200
index 6d56d8a059d17f30478a85ec7ca785391e464d39..cbd8ed18b97c5f1a7a509ad867d6d35677a158e4 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm64,darwin
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -980,6 +980,7 @@ const (
        NET_RT_MAXID                      = 0xa
        NET_RT_STAT                       = 0x4
        NET_RT_TRASH                      = 0x5
+       NFDBITS                           = 0x20
        NL0                               = 0x0
        NL1                               = 0x100
        NL2                               = 0x200
index bbe6089bb7ecb74ec01a825d7573a069ff8ae059..6130471748acf3dae804a697fbdbefd7db2ab586 100644 (file)
@@ -938,6 +938,7 @@ const (
        NET_RT_FLAGS                      = 0x2
        NET_RT_IFLIST                     = 0x3
        NET_RT_MAXID                      = 0x4
+       NFDBITS                           = 0x40
        NOFLSH                            = 0x80000000
        NOKERNINFO                        = 0x2000000
        NOTE_ATTRIB                       = 0x8
index d2bbaabc87faa2cbac459e605204bb63a575bbcc..b72544fcd2f6049905e6b6b42042ba8be9363e6c 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build 386,freebsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m32 _const.go
 
 package unix
@@ -1055,6 +1055,7 @@ const (
        NET_RT_IFLIST                  = 0x3
        NET_RT_IFLISTL                 = 0x5
        NET_RT_IFMALIST                = 0x4
+       NFDBITS                        = 0x20
        NOFLSH                         = 0x80000000
        NOKERNINFO                     = 0x2000000
        NOTE_ATTRIB                    = 0x8
index 4f8db783d3cc0f892d2d3104fd6e533bbd535438..9f382678e5aea2cddf5caafe1b5cdf8b8bdac857 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build amd64,freebsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -1056,6 +1056,7 @@ const (
        NET_RT_IFLIST                  = 0x3
        NET_RT_IFLISTL                 = 0x5
        NET_RT_IFMALIST                = 0x4
+       NFDBITS                        = 0x40
        NOFLSH                         = 0x80000000
        NOKERNINFO                     = 0x2000000
        NOTE_ATTRIB                    = 0x8
index 53e5de605184ab6636eebf3b32aa9a222307fd64..16db56abc469c65ee6630db337c18a031e72449c 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm,freebsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- _const.go
 
 package unix
@@ -1063,6 +1063,7 @@ const (
        NET_RT_IFLIST                  = 0x3
        NET_RT_IFLISTL                 = 0x5
        NET_RT_IFMALIST                = 0x4
+       NFDBITS                        = 0x20
        NOFLSH                         = 0x80000000
        NOKERNINFO                     = 0x2000000
        NOTE_ATTRIB                    = 0x8
index d4a192fefeeef30e33102d59d7af36725dbefe3e..1a1de34543179232be40837d9c5c82bf07578f6e 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm64,freebsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -1056,6 +1056,7 @@ const (
        NET_RT_IFLIST                  = 0x3
        NET_RT_IFLISTL                 = 0x5
        NET_RT_IFMALIST                = 0x4
+       NFDBITS                        = 0x40
        NOFLSH                         = 0x80000000
        NOKERNINFO                     = 0x2000000
        NOTE_ATTRIB                    = 0x8
index df7c8964b860fed147a22c235e37f62b85b231c7..fcf5796a01bc6aa93554260b8ffb0a96559400d8 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1087,6 +1091,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1099,6 +1114,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1344,6 +1361,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x20
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1677,6 +1695,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1692,6 +1712,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
@@ -1730,6 +1751,10 @@ const (
        PTRACE_SINGLEBLOCK                   = 0x21
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_SYSEMU                        = 0x1f
        PTRACE_SYSEMU_SINGLESTEP             = 0x20
        PTRACE_TRACEME                       = 0x0
@@ -1790,7 +1815,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1863,6 +1888,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1887,6 +1913,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1894,7 +1921,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1906,6 +1933,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1914,8 +1942,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2140,6 +2168,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2497,7 +2526,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2518,7 +2547,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2717,6 +2746,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2733,6 +2764,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index a3af923f6c52895302aed0a473e186f18b29d5e6..5bcf3dbd75b71e8466b41eca768b6665105fb5a4 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1087,6 +1091,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1099,6 +1114,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1344,6 +1361,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1678,6 +1696,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1693,6 +1713,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
@@ -1731,6 +1752,10 @@ const (
        PTRACE_SINGLEBLOCK                   = 0x21
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_SYSEMU                        = 0x1f
        PTRACE_SYSEMU_SINGLESTEP             = 0x20
        PTRACE_TRACEME                       = 0x0
@@ -1791,7 +1816,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1864,6 +1889,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1888,6 +1914,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1895,7 +1922,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1907,6 +1934,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1915,8 +1943,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2141,6 +2169,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2498,7 +2527,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2519,7 +2548,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2717,6 +2746,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2733,6 +2764,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index a0e87d2cd6b35a3ba7c1d9c946c9af5747761be2..3e02dcff8819b5c57328fa856f4eef42119aa40a 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x20
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1696,6 +1716,7 @@ const (
        PTRACE_GETSIGMASK                    = 0x420a
        PTRACE_GETVFPREGS                    = 0x1b
        PTRACE_GETWMMXREGS                   = 0x12
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x16
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
@@ -1736,6 +1757,10 @@ const (
        PTRACE_SET_SYSCALL                   = 0x17
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        PT_DATA_ADDR                         = 0x10004
        PT_TEXT_ADDR                         = 0x10000
@@ -1797,7 +1822,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1870,6 +1895,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1894,6 +1920,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1901,7 +1928,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1913,6 +1940,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1921,8 +1949,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2147,6 +2175,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2504,7 +2533,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2525,7 +2554,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2723,6 +2752,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2739,6 +2770,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index f3c51b038963726736ddce48fe7ea630e957da32..2293f8bb86939a1fd992c23160c3e8b110393080 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -561,6 +564,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1089,6 +1093,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1101,6 +1116,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1345,6 +1362,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1678,6 +1696,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1691,6 +1711,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1723,6 +1744,12 @@ const (
        PTRACE_SETSIGMASK                    = 0x420b
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
+       PTRACE_SYSEMU                        = 0x1f
+       PTRACE_SYSEMU_SINGLESTEP             = 0x20
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1781,7 +1808,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1854,6 +1881,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1878,6 +1906,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1885,7 +1914,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1897,6 +1926,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1905,8 +1935,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2131,6 +2161,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2489,7 +2520,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2510,7 +2541,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2708,6 +2739,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2724,6 +2757,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 0f3aad7c872c1159cefbde7fc6880069f47521c6..57742ea276864718fad66b847d286710034e8e2f 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x20
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1689,6 +1709,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_GET_THREAD_AREA_3264          = 0xc4
        PTRACE_GET_WATCH_REGS                = 0xd0
@@ -1732,6 +1753,10 @@ const (
        PTRACE_SET_WATCH_REGS                = 0xd1
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1790,7 +1815,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1863,6 +1888,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1887,6 +1913,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1894,7 +1921,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1906,6 +1933,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1914,8 +1942,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2140,6 +2168,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x1029
        SO_DONTROUTE                         = 0x10
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2499,7 +2528,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2520,7 +2549,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2719,6 +2748,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2735,6 +2766,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 6fa9b6e9f2b7934b5df3ddc2c3736c2a3ecb78a8..33bfa6cbf0595e96b88208162327949c5527cc07 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1689,6 +1709,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_GET_THREAD_AREA_3264          = 0xc4
        PTRACE_GET_WATCH_REGS                = 0xd0
@@ -1732,6 +1753,10 @@ const (
        PTRACE_SET_WATCH_REGS                = 0xd1
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1790,7 +1815,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1863,6 +1888,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1887,6 +1913,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1894,7 +1921,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1906,6 +1933,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1914,8 +1942,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2140,6 +2168,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x1029
        SO_DONTROUTE                         = 0x10
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2499,7 +2528,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2520,7 +2549,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2719,6 +2748,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2735,6 +2766,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 25faaf94deca158097f7fa20c0e099a03bf127b5..89fd414e66e8f03c1246873a195b80a0300fbc0d 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1689,6 +1709,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_GET_THREAD_AREA_3264          = 0xc4
        PTRACE_GET_WATCH_REGS                = 0xd0
@@ -1732,6 +1753,10 @@ const (
        PTRACE_SET_WATCH_REGS                = 0xd1
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1790,7 +1815,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1863,6 +1888,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1887,6 +1913,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1894,7 +1921,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1906,6 +1933,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1914,8 +1942,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2140,6 +2168,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x1029
        SO_DONTROUTE                         = 0x10
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2499,7 +2528,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2520,7 +2549,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2719,6 +2748,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2735,6 +2766,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 85f5bf18deeb7f977d27cb99180a4c29c5b5bb03..aabe5e4244f4c6edd8861fb7a55e787919515795 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x20
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1689,6 +1709,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_GET_THREAD_AREA               = 0x19
        PTRACE_GET_THREAD_AREA_3264          = 0xc4
        PTRACE_GET_WATCH_REGS                = 0xd0
@@ -1732,6 +1753,10 @@ const (
        PTRACE_SET_WATCH_REGS                = 0xd1
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1790,7 +1815,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1863,6 +1888,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1887,6 +1913,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1894,7 +1921,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1906,6 +1933,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1914,8 +1942,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2140,6 +2168,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x1029
        SO_DONTROUTE                         = 0x10
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2499,7 +2528,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2520,7 +2549,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2719,6 +2748,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2735,6 +2766,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 8249f8e767b07dcc87145465b89c62e9e2ca6bd8..2722791287909e010369e27bebc06124ceecbe91 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1341,6 +1358,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1677,6 +1695,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1696,6 +1716,7 @@ const (
        PTRACE_GETVRREGS                     = 0x12
        PTRACE_GETVSRREGS                    = 0x1b
        PTRACE_GET_DEBUGREG                  = 0x19
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1735,6 +1756,10 @@ const (
        PTRACE_SINGLEBLOCK                   = 0x100
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_SYSEMU                        = 0x1d
        PTRACE_SYSEMU_SINGLESTEP             = 0x1e
        PTRACE_TRACEME                       = 0x0
@@ -1848,7 +1873,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1921,6 +1946,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1945,6 +1971,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1952,7 +1979,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1964,6 +1991,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1972,8 +2000,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2198,6 +2226,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2559,7 +2588,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2580,7 +2609,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2778,6 +2807,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2794,6 +2825,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0xc00
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 5a0d2d3ac62178873727b5b8321380110c3a7ea9..e33be416c7dd867c97cd1d38cea0685ba8738445 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1341,6 +1358,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1677,6 +1695,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1696,6 +1716,7 @@ const (
        PTRACE_GETVRREGS                     = 0x12
        PTRACE_GETVSRREGS                    = 0x1b
        PTRACE_GET_DEBUGREG                  = 0x19
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1735,6 +1756,10 @@ const (
        PTRACE_SINGLEBLOCK                   = 0x100
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_SYSEMU                        = 0x1d
        PTRACE_SYSEMU_SINGLESTEP             = 0x1e
        PTRACE_TRACEME                       = 0x0
@@ -1848,7 +1873,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1921,6 +1946,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1945,6 +1971,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1952,7 +1979,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1964,6 +1991,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1972,8 +2000,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2198,6 +2226,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2559,7 +2588,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2580,7 +2609,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2778,6 +2807,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2794,6 +2825,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0xc00
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index 0c7dec3b73939adf6744e0aa160071a728694efd..b9908d3094f2888a17b97dcec35d3019ed6097ba 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1675,6 +1693,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1688,6 +1708,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1720,6 +1741,10 @@ const (
        PTRACE_SETSIGMASK                    = 0x420b
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        QNX4_SUPER_MAGIC                     = 0x2f
        QNX6_SUPER_MAGIC                     = 0x68191122
@@ -1778,7 +1803,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1851,6 +1876,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1875,6 +1901,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1882,7 +1909,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1894,6 +1921,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1902,8 +1930,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2128,6 +2156,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2485,7 +2514,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2506,7 +2535,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2704,6 +2733,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2720,6 +2751,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index f0b3c3fd973963ad9097ba84d2d6f480b88f4be4..85647f4f79eceb61ebb6dab2302a3e864cc22e91 100644 (file)
@@ -253,6 +253,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -304,9 +305,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -460,6 +462,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -560,6 +563,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1086,6 +1090,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1098,6 +1113,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1342,6 +1359,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1677,6 +1695,8 @@ const (
        PTRACE_DETACH                        = 0x11
        PTRACE_DISABLE_TE                    = 0x5010
        PTRACE_ENABLE_TE                     = 0x5009
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1691,6 +1711,7 @@ const (
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
        PTRACE_GET_LAST_BREAK                = 0x5006
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1734,6 +1755,10 @@ const (
        PTRACE_SINGLEBLOCK                   = 0xc
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TE_ABORT_RAND                 = 0x5011
        PTRACE_TRACEME                       = 0x0
        PT_ACR0                              = 0x90
@@ -1851,7 +1876,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1924,6 +1949,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1948,6 +1974,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1955,7 +1982,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1967,6 +1994,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1975,8 +2003,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2201,6 +2229,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x44
        SO_DOMAIN                            = 0x27
        SO_DONTROUTE                         = 0x5
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2558,7 +2587,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2579,7 +2608,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2777,6 +2806,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2793,6 +2824,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
 )
 
index ebe264d60e6d76a696e85c0ac33a5ad47891a8fc..c0095a5432eb61b321cb091d186f109cd21b485c 100644 (file)
@@ -256,6 +256,7 @@ const (
        BPF_F_STACK_BUILD_ID                 = 0x20
        BPF_F_STRICT_ALIGNMENT               = 0x1
        BPF_F_SYSCTL_BASE_NAME               = 0x1
+       BPF_F_TEST_RND_HI32                  = 0x4
        BPF_F_TUNINFO_IPV6                   = 0x1
        BPF_F_USER_BUILD_ID                  = 0x800
        BPF_F_USER_STACK                     = 0x100
@@ -307,9 +308,10 @@ const (
        BPF_RET                              = 0x6
        BPF_RSH                              = 0x70
        BPF_SK_STORAGE_GET_F_CREATE          = 0x1
-       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0x7
+       BPF_SOCK_OPS_ALL_CB_FLAGS            = 0xf
        BPF_SOCK_OPS_RETRANS_CB_FLAG         = 0x2
        BPF_SOCK_OPS_RTO_CB_FLAG             = 0x1
+       BPF_SOCK_OPS_RTT_CB_FLAG             = 0x8
        BPF_SOCK_OPS_STATE_CB_FLAG           = 0x4
        BPF_ST                               = 0x2
        BPF_STX                              = 0x3
@@ -463,6 +465,7 @@ const (
        DAXFS_MAGIC                          = 0x64646178
        DEBUGFS_MAGIC                        = 0x64626720
        DEVPTS_SUPER_MAGIC                   = 0x1cd1
+       DMA_BUF_MAGIC                        = 0x444d4142
        DT_BLK                               = 0x6
        DT_CHR                               = 0x2
        DT_DIR                               = 0x4
@@ -564,6 +567,7 @@ const (
        ETH_P_IRDA                           = 0x17
        ETH_P_LAT                            = 0x6004
        ETH_P_LINK_CTL                       = 0x886c
+       ETH_P_LLDP                           = 0x88cc
        ETH_P_LOCALTALK                      = 0x9
        ETH_P_LOOP                           = 0x60
        ETH_P_LOOPBACK                       = 0x9000
@@ -1090,6 +1094,17 @@ const (
        KEXEC_PRESERVE_CONTEXT               = 0x2
        KEXEC_SEGMENT_MAX                    = 0x10
        KEYCTL_ASSUME_AUTHORITY              = 0x10
+       KEYCTL_CAPABILITIES                  = 0x1f
+       KEYCTL_CAPS0_BIG_KEY                 = 0x10
+       KEYCTL_CAPS0_CAPABILITIES            = 0x1
+       KEYCTL_CAPS0_DIFFIE_HELLMAN          = 0x4
+       KEYCTL_CAPS0_INVALIDATE              = 0x20
+       KEYCTL_CAPS0_MOVE                    = 0x80
+       KEYCTL_CAPS0_PERSISTENT_KEYRINGS     = 0x2
+       KEYCTL_CAPS0_PUBLIC_KEY              = 0x8
+       KEYCTL_CAPS0_RESTRICT_KEYRING        = 0x40
+       KEYCTL_CAPS1_NS_KEYRING_NAME         = 0x1
+       KEYCTL_CAPS1_NS_KEY_TAG              = 0x2
        KEYCTL_CHOWN                         = 0x4
        KEYCTL_CLEAR                         = 0x7
        KEYCTL_DESCRIBE                      = 0x6
@@ -1102,6 +1117,8 @@ const (
        KEYCTL_INVALIDATE                    = 0x15
        KEYCTL_JOIN_SESSION_KEYRING          = 0x1
        KEYCTL_LINK                          = 0x8
+       KEYCTL_MOVE                          = 0x1e
+       KEYCTL_MOVE_EXCL                     = 0x1
        KEYCTL_NEGATE                        = 0xd
        KEYCTL_PKEY_DECRYPT                  = 0x1a
        KEYCTL_PKEY_ENCRYPT                  = 0x19
@@ -1346,6 +1363,7 @@ const (
        NETLINK_XFRM                         = 0x6
        NETNSA_MAX                           = 0x5
        NETNSA_NSID_NOT_ASSIGNED             = -0x1
+       NFDBITS                              = 0x40
        NFNETLINK_V0                         = 0x0
        NFNLGRP_ACCT_QUOTA                   = 0x8
        NFNLGRP_CONNTRACK_DESTROY            = 0x3
@@ -1679,6 +1697,8 @@ const (
        PTRACE_ATTACH                        = 0x10
        PTRACE_CONT                          = 0x7
        PTRACE_DETACH                        = 0x11
+       PTRACE_EVENTMSG_SYSCALL_ENTRY        = 0x1
+       PTRACE_EVENTMSG_SYSCALL_EXIT         = 0x2
        PTRACE_EVENT_CLONE                   = 0x3
        PTRACE_EVENT_EXEC                    = 0x4
        PTRACE_EVENT_EXIT                    = 0x6
@@ -1696,6 +1716,7 @@ const (
        PTRACE_GETREGSET                     = 0x4204
        PTRACE_GETSIGINFO                    = 0x4202
        PTRACE_GETSIGMASK                    = 0x420a
+       PTRACE_GET_SYSCALL_INFO              = 0x420e
        PTRACE_INTERRUPT                     = 0x4207
        PTRACE_KILL                          = 0x8
        PTRACE_LISTEN                        = 0x4208
@@ -1735,6 +1756,10 @@ const (
        PTRACE_SINGLESTEP                    = 0x9
        PTRACE_SPARC_DETACH                  = 0xb
        PTRACE_SYSCALL                       = 0x18
+       PTRACE_SYSCALL_INFO_ENTRY            = 0x1
+       PTRACE_SYSCALL_INFO_EXIT             = 0x2
+       PTRACE_SYSCALL_INFO_NONE             = 0x0
+       PTRACE_SYSCALL_INFO_SECCOMP          = 0x3
        PTRACE_TRACEME                       = 0x0
        PTRACE_WRITEDATA                     = 0x11
        PTRACE_WRITETEXT                     = 0x13
@@ -1843,7 +1868,7 @@ const (
        RTAX_UNSPEC                          = 0x0
        RTAX_WINDOW                          = 0x3
        RTA_ALIGNTO                          = 0x4
-       RTA_MAX                              = 0x1d
+       RTA_MAX                              = 0x1e
        RTCF_DIRECTSRC                       = 0x4000000
        RTCF_DOREDIRECT                      = 0x1000000
        RTCF_LOG                             = 0x2000000
@@ -1916,6 +1941,7 @@ const (
        RTM_DELMDB                           = 0x55
        RTM_DELNEIGH                         = 0x1d
        RTM_DELNETCONF                       = 0x51
+       RTM_DELNEXTHOP                       = 0x69
        RTM_DELNSID                          = 0x59
        RTM_DELQDISC                         = 0x25
        RTM_DELROUTE                         = 0x19
@@ -1940,6 +1966,7 @@ const (
        RTM_GETNEIGH                         = 0x1e
        RTM_GETNEIGHTBL                      = 0x42
        RTM_GETNETCONF                       = 0x52
+       RTM_GETNEXTHOP                       = 0x6a
        RTM_GETNSID                          = 0x5a
        RTM_GETQDISC                         = 0x26
        RTM_GETROUTE                         = 0x1a
@@ -1947,7 +1974,7 @@ const (
        RTM_GETSTATS                         = 0x5e
        RTM_GETTCLASS                        = 0x2a
        RTM_GETTFILTER                       = 0x2e
-       RTM_MAX                              = 0x67
+       RTM_MAX                              = 0x6b
        RTM_NEWACTION                        = 0x30
        RTM_NEWADDR                          = 0x14
        RTM_NEWADDRLABEL                     = 0x48
@@ -1959,6 +1986,7 @@ const (
        RTM_NEWNEIGH                         = 0x1c
        RTM_NEWNEIGHTBL                      = 0x40
        RTM_NEWNETCONF                       = 0x50
+       RTM_NEWNEXTHOP                       = 0x68
        RTM_NEWNSID                          = 0x58
        RTM_NEWPREFIX                        = 0x34
        RTM_NEWQDISC                         = 0x24
@@ -1967,8 +1995,8 @@ const (
        RTM_NEWSTATS                         = 0x5c
        RTM_NEWTCLASS                        = 0x28
        RTM_NEWTFILTER                       = 0x2c
-       RTM_NR_FAMILIES                      = 0x16
-       RTM_NR_MSGTYPES                      = 0x58
+       RTM_NR_FAMILIES                      = 0x17
+       RTM_NR_MSGTYPES                      = 0x5c
        RTM_SETDCB                           = 0x4f
        RTM_SETLINK                          = 0x13
        RTM_SETNEIGHTBL                      = 0x43
@@ -2193,6 +2221,7 @@ const (
        SO_DEBUG                             = 0x1
        SO_DETACH_BPF                        = 0x1b
        SO_DETACH_FILTER                     = 0x1b
+       SO_DETACH_REUSEPORT_BPF              = 0x47
        SO_DOMAIN                            = 0x1029
        SO_DONTROUTE                         = 0x10
        SO_EE_CODE_TXTIME_INVALID_PARAM      = 0x1
@@ -2547,7 +2576,7 @@ const (
        TIPC_SUB_PORTS                       = 0x1
        TIPC_SUB_SERVICE                     = 0x2
        TIPC_TOP_SRV                         = 0x1
-       TIPC_WAIT_FOREVER                    = -0x1
+       TIPC_WAIT_FOREVER                    = 0xffffffff
        TIPC_WITHDRAWN                       = 0x2
        TIPC_ZONE_BITS                       = 0x8
        TIPC_ZONE_CLUSTER_MASK               = 0xfffff000
@@ -2568,7 +2597,7 @@ const (
        TP_STATUS_LOSING                     = 0x4
        TP_STATUS_SENDING                    = 0x2
        TP_STATUS_SEND_REQUEST               = 0x1
-       TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+       TP_STATUS_TS_RAW_HARDWARE            = 0x80000000
        TP_STATUS_TS_SOFTWARE                = 0x20000000
        TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
        TP_STATUS_USER                       = 0x1
@@ -2766,6 +2795,8 @@ const (
        XDP_FLAGS_SKB_MODE                   = 0x2
        XDP_FLAGS_UPDATE_IF_NOEXIST          = 0x1
        XDP_MMAP_OFFSETS                     = 0x1
+       XDP_OPTIONS                          = 0x8
+       XDP_OPTIONS_ZEROCOPY                 = 0x1
        XDP_PACKET_HEADROOM                  = 0x100
        XDP_PGOFF_RX_RING                    = 0x0
        XDP_PGOFF_TX_RING                    = 0x80000000
@@ -2782,6 +2813,7 @@ const (
        XENFS_SUPER_MAGIC                    = 0xabba1974
        XFS_SUPER_MAGIC                      = 0x58465342
        XTABS                                = 0x1800
+       Z3FOLD_MAGIC                         = 0x33
        ZSMALLOC_MAGIC                       = 0x58295829
        __TIOCFLUSH                          = 0x80047410
 )
index 78cc04ea6df16d26064c318dfdc81490e50bf4c1..96b9b8ab300e07a51b1fa531d927d224c82c90af 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build 386,netbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m32 _const.go
 
 package unix
@@ -1085,6 +1085,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_OIFLIST                    = 0x4
        NET_RT_OOIFLIST                   = 0x3
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index 92185e693ff01e4bce473605976d4b904043d242..ed522a84e841bbace76da4a7647f026aa0648936 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build amd64,netbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -1075,6 +1075,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_OIFLIST                    = 0x4
        NET_RT_OOIFLIST                   = 0x3
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index 373ad4543d831fc7582499f57acdc5032bc5cda5..c8d36fe998eb9ceb2370b1eb79de761b378e6f26 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm,netbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -marm _const.go
 
 package unix
@@ -1065,6 +1065,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_OIFLIST                    = 0x4
        NET_RT_OOIFLIST                   = 0x3
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index fb6c60441daa6007d9537f8be992f1806ee6d465..f1c146a74c9d9dde6bb35f4c3ea3f244f5b297bc 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build arm64,netbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -1075,6 +1075,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_OIFLIST                    = 0x4
        NET_RT_OOIFLIST                   = 0x3
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index d8be045189b3457ab01793c60838c5879ec5274e..5402bd55ce10448f10e9054ac0affe9b59dcc487 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build 386,openbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m32 _const.go
 
 package unix
@@ -881,14 +881,15 @@ const (
        MADV_SPACEAVAIL                   = 0x5
        MADV_WILLNEED                     = 0x3
        MAP_ANON                          = 0x1000
-       MAP_COPY                          = 0x4
+       MAP_ANONYMOUS                     = 0x1000
+       MAP_CONCEAL                       = 0x8000
+       MAP_COPY                          = 0x2
        MAP_FILE                          = 0x0
        MAP_FIXED                         = 0x10
-       MAP_FLAGMASK                      = 0x1ff7
-       MAP_HASSEMAPHORE                  = 0x200
-       MAP_INHERIT                       = 0x80
+       MAP_FLAGMASK                      = 0xfff7
+       MAP_HASSEMAPHORE                  = 0x0
+       MAP_INHERIT                       = 0x0
        MAP_INHERIT_COPY                  = 0x1
-       MAP_INHERIT_DONATE_COPY           = 0x3
        MAP_INHERIT_NONE                  = 0x2
        MAP_INHERIT_SHARE                 = 0x0
        MAP_NOEXTEND                      = 0x100
@@ -896,7 +897,8 @@ const (
        MAP_PRIVATE                       = 0x2
        MAP_RENAME                        = 0x20
        MAP_SHARED                        = 0x1
-       MAP_TRYFIXED                      = 0x400
+       MAP_STACK                         = 0x4000
+       MAP_TRYFIXED                      = 0x0
        MCL_CURRENT                       = 0x1
        MCL_FUTURE                        = 0x2
        MNT_ASYNC                         = 0x40
@@ -946,6 +948,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_STATS                      = 0x4
        NET_RT_TABLE                      = 0x5
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index 1f9e8a29ea9e9f887f6e1c6cfdb4434b702cf9d8..ffaf2d2f9f2ae33ad69879d648102cfe8a94d1bd 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build amd64,openbsd
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -920,10 +920,11 @@ const (
        MADV_WILLNEED                     = 0x3
        MAP_ANON                          = 0x1000
        MAP_ANONYMOUS                     = 0x1000
+       MAP_CONCEAL                       = 0x8000
        MAP_COPY                          = 0x2
        MAP_FILE                          = 0x0
        MAP_FIXED                         = 0x10
-       MAP_FLAGMASK                      = 0x7ff7
+       MAP_FLAGMASK                      = 0xfff7
        MAP_HASSEMAPHORE                  = 0x0
        MAP_INHERIT                       = 0x0
        MAP_INHERIT_COPY                  = 0x1
@@ -990,6 +991,7 @@ const (
        NET_RT_MAXID                      = 0x7
        NET_RT_STATS                      = 0x4
        NET_RT_TABLE                      = 0x5
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOKERNINFO                        = 0x2000000
        NOTE_ATTRIB                       = 0x8
index 79d5695c376fb73c60a81d1633d6b804ee006881..7aa796a642b62c921b20690c4f27a60b32698bd3 100644 (file)
@@ -1,11 +1,11 @@
 // mkerrors.sh
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs -- _const.go
-
 // +build arm,openbsd
 
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
+// cgo -godefs -- _const.go
+
 package unix
 
 import "syscall"
@@ -881,10 +881,11 @@ const (
        MADV_WILLNEED                     = 0x3
        MAP_ANON                          = 0x1000
        MAP_ANONYMOUS                     = 0x1000
+       MAP_CONCEAL                       = 0x8000
        MAP_COPY                          = 0x2
        MAP_FILE                          = 0x0
        MAP_FIXED                         = 0x10
-       MAP_FLAGMASK                      = 0x3ff7
+       MAP_FLAGMASK                      = 0xfff7
        MAP_HASSEMAPHORE                  = 0x0
        MAP_INHERIT                       = 0x0
        MAP_INHERIT_COPY                  = 0x1
@@ -896,6 +897,7 @@ const (
        MAP_PRIVATE                       = 0x2
        MAP_RENAME                        = 0x0
        MAP_SHARED                        = 0x1
+       MAP_STACK                         = 0x4000
        MAP_TRYFIXED                      = 0x0
        MCL_CURRENT                       = 0x1
        MCL_FUTURE                        = 0x2
@@ -947,6 +949,7 @@ const (
        NET_RT_MAXID                      = 0x6
        NET_RT_STATS                      = 0x4
        NET_RT_TABLE                      = 0x5
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOTE_ATTRIB                       = 0x8
        NOTE_CHILD                        = 0x4
index ec5f92de8883f31956b02a390fd4ba19c241d9b5..1792d3f13e6d5374df0b41d07edcf7bcacec09ce 100644 (file)
@@ -996,6 +996,7 @@ const (
        NET_RT_MAXID                      = 0x7
        NET_RT_STATS                      = 0x4
        NET_RT_TABLE                      = 0x5
+       NFDBITS                           = 0x20
        NOFLSH                            = 0x80000000
        NOKERNINFO                        = 0x2000000
        NOTE_ATTRIB                       = 0x8
index 22569db31d3cee8118632273ca349620d3271126..46e054ccb0e0dffe178c06b5c9d0d2abcbd06d2d 100644 (file)
@@ -3,7 +3,7 @@
 
 // +build amd64,solaris
 
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
 // cgo -godefs -- -m64 _const.go
 
 package unix
@@ -666,6 +666,7 @@ const (
        M_FLUSH                       = 0x86
        NAME_MAX                      = 0xff
        NEWDEV                        = 0x1
+       NFDBITS                       = 0x40
        NL0                           = 0x0
        NL1                           = 0x100
        NLDLY                         = 0x100
index dd5ea36ee97cf7b8fbd0dd2710ae3704b435ec16..b42c1cbadd2223b4ebd0b85b8802de1ef07a299c 100644 (file)
@@ -1,4 +1,4 @@
-// go run mksyscall.go -l32 -tags darwin,386,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go
+// go run mksyscall.go -l32 -tags darwin,386,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_386.1_11.go syscall_darwin_386.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build darwin,386,!go1.12
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -1342,8 +1326,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -1681,6 +1666,39 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       var _p0 unsafe.Pointer
+       if len(buf) > 0 {
+               _p0 = unsafe.Pointer(&buf[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
+       n = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
@@ -1738,23 +1756,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(buf) > 0 {
-               _p0 = unsafe.Pointer(&buf[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) {
        r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(buf), uintptr(size), uintptr(flags))
        n = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go
new file mode 100644 (file)
index 0000000..e263fbd
--- /dev/null
@@ -0,0 +1,41 @@
+// go run mksyscall.go -l32 -tags darwin,386,go1.13 syscall_darwin.1_13.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
+
+// +build darwin,386,go1.13
+
+package unix
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var _ syscall.Errno
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func closedir(dir uintptr) (err error) {
+       _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_closedir_trampoline()
+
+//go:linkname libc_closedir libc_closedir
+//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
+       r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
+       res = Errno(r0)
+       return
+}
+
+func libc_readdir_r_trampoline()
+
+//go:linkname libc_readdir_r libc_readdir_r
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s
new file mode 100644 (file)
index 0000000..00da1eb
--- /dev/null
@@ -0,0 +1,12 @@
+// go run mkasm_darwin.go 386
+// Code generated by the command above; DO NOT EDIT.
+
+// +build go1.13
+
+#include "textflag.h"
+TEXT Â·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fdopendir(SB)
+TEXT Â·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
+TEXT Â·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
index 5ab9a8277a40605c98c0872f4b44f8c7ae372e22..603c9f6eb19d2a7a476ad64d41e9ff18b3f9f2ea 100644 (file)
@@ -1851,8 +1851,9 @@ func libc_lseek_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -2423,28 +2424,6 @@ func libc_fstatfs64_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(buf) > 0 {
-               _p0 = unsafe.Pointer(&buf[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := syscall_syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc___getdirentries64_trampoline()
-
-//go:linkname libc___getdirentries64 libc___getdirentries64
-//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) {
        r0, _, e1 := syscall_syscall(funcPC(libc_getfsstat64_trampoline), uintptr(buf), uintptr(size), uintptr(flags))
        n = int(r0)
index c6557b135a2ea2e28ba3efa4053bdabcafc29b87..ece6f67c26eaa2002ce0708362b91bea31c18ab2 100644 (file)
@@ -274,8 +274,6 @@ TEXT Â·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat64(SB)
 TEXT Â·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatfs64(SB)
-TEXT Â·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___getdirentries64(SB)
 TEXT Â·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getfsstat64(SB)
 TEXT Â·libc_lstat64_trampoline(SB),NOSPLIT,$0-0
index 985f3388846ab9a21c90ea9d114fc398dd7e038c..38b7cbab38afc903fd06c7b07ab4441e5b0aceea 100644 (file)
@@ -1,4 +1,4 @@
-// go run mksyscall.go -tags darwin,amd64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go
+// go run mksyscall.go -tags darwin,amd64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.1_11.go syscall_darwin_amd64.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build darwin,amd64,!go1.12
@@ -1326,8 +1326,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -1665,6 +1666,23 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
+       var _p0 unsafe.Pointer
+       if len(buf) > 0 {
+               _p0 = unsafe.Pointer(&buf[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
+       n = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
        var _p0 unsafe.Pointer
        if len(mib) > 0 {
@@ -1738,23 +1756,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(buf) > 0 {
-               _p0 = unsafe.Pointer(&buf[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) {
        r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(buf), uintptr(size), uintptr(flags))
        n = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go
new file mode 100644 (file)
index 0000000..314042a
--- /dev/null
@@ -0,0 +1,41 @@
+// go run mksyscall.go -tags darwin,amd64,go1.13 syscall_darwin.1_13.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
+
+// +build darwin,amd64,go1.13
+
+package unix
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var _ syscall.Errno
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func closedir(dir uintptr) (err error) {
+       _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_closedir_trampoline()
+
+//go:linkname libc_closedir libc_closedir
+//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
+       r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
+       res = Errno(r0)
+       return
+}
+
+func libc_readdir_r_trampoline()
+
+//go:linkname libc_readdir_r libc_readdir_r
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s
new file mode 100644 (file)
index 0000000..d671e83
--- /dev/null
@@ -0,0 +1,12 @@
+// go run mkasm_darwin.go amd64
+// Code generated by the command above; DO NOT EDIT.
+
+// +build go1.13
+
+#include "textflag.h"
+TEXT Â·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fdopendir(SB)
+TEXT Â·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
+TEXT Â·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
index 22163ef40122cb651df73c182be51a4dc434c741..fda478e8bdff9639e57f86e074c645c5a5aadc1f 100644 (file)
@@ -1851,8 +1851,9 @@ func libc_lseek_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -2423,28 +2424,6 @@ func libc_fstatfs64_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(buf) > 0 {
-               _p0 = unsafe.Pointer(&buf[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := syscall_syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc___getdirentries64_trampoline()
-
-//go:linkname libc___getdirentries64 libc___getdirentries64
-//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib"
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) {
        r0, _, e1 := syscall_syscall(funcPC(libc_getfsstat64_trampoline), uintptr(buf), uintptr(size), uintptr(flags))
        n = int(r0)
index ad410cfbceb3cf183f0929bfaf788c765b33c150..7c4d59016334ea25a382d611ed388feaef05cf84 100644 (file)
@@ -274,8 +274,6 @@ TEXT Â·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatat64(SB)
 TEXT Â·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstatfs64(SB)
-TEXT Â·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___getdirentries64(SB)
 TEXT Â·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getfsstat64(SB)
 TEXT Â·libc_lstat64_trampoline(SB),NOSPLIT,$0-0
index 0e47deb788dbbb7598d81ed758774e96f88220a0..abb69183a34eb949d6cef68a9c9e385fd1126b01 100644 (file)
@@ -1,4 +1,4 @@
-// go run mksyscall.go -l32 -tags darwin,arm,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go
+// go run mksyscall.go -l32 -tags darwin,arm,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm.1_11.go syscall_darwin_arm.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build darwin,arm,!go1.12
@@ -1326,8 +1326,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go
new file mode 100644 (file)
index 0000000..f519ce9
--- /dev/null
@@ -0,0 +1,41 @@
+// go run mksyscall.go -l32 -tags darwin,arm,go1.13 syscall_darwin.1_13.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
+
+// +build darwin,arm,go1.13
+
+package unix
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var _ syscall.Errno
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func closedir(dir uintptr) (err error) {
+       _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_closedir_trampoline()
+
+//go:linkname libc_closedir libc_closedir
+//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
+       r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
+       res = Errno(r0)
+       return
+}
+
+func libc_readdir_r_trampoline()
+
+//go:linkname libc_readdir_r libc_readdir_r
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s
new file mode 100644 (file)
index 0000000..488e557
--- /dev/null
@@ -0,0 +1,12 @@
+// go run mkasm_darwin.go arm
+// Code generated by the command above; DO NOT EDIT.
+
+// +build go1.13
+
+#include "textflag.h"
+TEXT Â·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fdopendir(SB)
+TEXT Â·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
+TEXT Â·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
index bbc18c4f60f5ef3830cf2639e82c2866eaf6cefe..163b3912d32db9acbca25003d13743908bdd1510 100644 (file)
@@ -1851,8 +1851,9 @@ func libc_lseek_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 66af9f480e50d9f70ed8396d87e87b64e07fd4d9..5bebb1bbd0009a043f2865991b13bc09494c1d5e 100644 (file)
@@ -40,8 +40,6 @@ TEXT Â·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_sendmsg(SB)
 TEXT Â·libc_kevent_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_kevent(SB)
-TEXT Â·libc___sysctl_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc___sysctl(SB)
 TEXT Â·libc_utimes_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_utimes(SB)
 TEXT Â·libc_futimes_trampoline(SB),NOSPLIT,$0-0
@@ -106,6 +104,8 @@ TEXT Â·libc_chown_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_chown(SB)
 TEXT Â·libc_chroot_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_chroot(SB)
+TEXT Â·libc_clock_gettime_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_clock_gettime(SB)
 TEXT Â·libc_close_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_close(SB)
 TEXT Â·libc_dup_trampoline(SB),NOSPLIT,$0-0
index 3f4cc0f34d59c3c7b267dfba6b2737f2ebfad092..b75c11d41e0cd2e243ecbea16be260311704e8dc 100644 (file)
@@ -1,4 +1,4 @@
-// go run mksyscall.go -tags darwin,arm64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go
+// go run mksyscall.go -tags darwin,arm64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.1_11.go syscall_darwin_arm64.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build darwin,arm64,!go1.12
@@ -1326,8 +1326,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go
new file mode 100644 (file)
index 0000000..d64e6c8
--- /dev/null
@@ -0,0 +1,41 @@
+// go run mksyscall.go -tags darwin,arm64,go1.13 syscall_darwin.1_13.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
+
+// +build darwin,arm64,go1.13
+
+package unix
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+var _ syscall.Errno
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func closedir(dir uintptr) (err error) {
+       _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_closedir_trampoline()
+
+//go:linkname libc_closedir libc_closedir
+//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
+       r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
+       res = Errno(r0)
+       return
+}
+
+func libc_readdir_r_trampoline()
+
+//go:linkname libc_readdir_r libc_readdir_r
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s
new file mode 100644 (file)
index 0000000..b29dabb
--- /dev/null
@@ -0,0 +1,12 @@
+// go run mkasm_darwin.go arm64
+// Code generated by the command above; DO NOT EDIT.
+
+// +build go1.13
+
+#include "textflag.h"
+TEXT Â·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_fdopendir(SB)
+TEXT Â·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
+TEXT Â·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
index 43356c832e5d0f5fbc5ba23a86b5dcc64c28c44b..7c5bd510e5fb3f675d5a50bdb666953d8f9d1273 100644 (file)
@@ -1851,8 +1851,9 @@ func libc_lseek_trampoline()
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index cdfe9318ba0247ad207e24a5d4c52e453996bf56..df199b3454571b3556c201248dd92821d9028c2f 100644 (file)
@@ -1272,8 +1272,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index a783306b2ad1c90096b449769d4e0a423e2b0e7d..e68185f1e30a9eebf7fb60974dddf8cdb755a01a 100644 (file)
@@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index f995520d38dec74d0b4b77e05e4378e823b831eb..2f77f93c4ea8a1cae29ddf3e0c2c39197da0228f 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,8 +361,14 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func pipe2(p *[2]_C_int, flags int) (err error) {
-       _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -387,8 +377,8 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data int) (err error) {
-       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+func pipe2(p *[2]_C_int, flags int) (err error) {
+       _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -424,6 +414,16 @@ func ioctl(fd int, req uint, arg uintptr) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptrace(request int, pid int, addr uintptr, data int) (err error) {
+       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index d681acd43006de7a6bfa6014c4e248d6c7df17d9..e9a12c9d93be8f4a7129eb247362c58cfa7d11f7 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,8 +361,14 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func pipe2(p *[2]_C_int, flags int) (err error) {
-       _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -387,8 +377,8 @@ func pipe2(p *[2]_C_int, flags int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data int) (err error) {
-       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+func pipe2(p *[2]_C_int, flags int) (err error) {
+       _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -424,6 +414,16 @@ func ioctl(fd int, req uint, arg uintptr) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func ptrace(request int, pid int, addr uintptr, data int) (err error) {
+       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Access(path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 5049b2ede451835a289820f527bc542d338acc12..27ab0fbda0bd241b4a957f1858ac26d18916c419 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe2(p *[2]_C_int, flags int) (err error) {
        _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
        if e1 != 0 {
@@ -404,8 +404,8 @@ func Getcwd(buf []byte) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ptrace(request int, pid int, addr uintptr, data int) (err error) {
-       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+       _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -414,8 +414,8 @@ func ptrace(request int, pid int, addr uintptr, data int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func ioctl(fd int, req uint, arg uintptr) (err error) {
-       _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+func ptrace(request int, pid int, addr uintptr, data int) (err error) {
+       _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
@@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index c5e46e4cf666e04a8dbb896851434e8d3bec613b..fe5d462e494440f48c95cfb132cfa05cddd23cdd 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index da8819e480d95d80a89c0e19711dc17d29eff248..536abcea339e4d987303b4631df804d3d8883024 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 6ad9be6dd484501d878ec3366756bd57a1745a21..37823cd6bfc79d26c4661118e199543a4b3ad089 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index f88331782b39ea1be8011d333af75a5881b8b271..794f61264ad4263728d822abb7bf46f1250118f4 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 8eebc6c77c040758ad711d5daf7ce2d405710047..1b34b550c364d132cdc4e0a57c9144329dfa42ed 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index ecf62a677d8405705d8775edfb3231ce3c6e17f2..5714e259227f720b815836b8e5503cb7fe479d7f 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 1ba0f7b6f4e0393ebcbce0aab0c8d7bbca48d049..88a6b3362f0f65bccf7c95841e4fedbed8f72c77 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 20012b2f0ec7e001e54ba2246964a2fe1e9b8265..c09dbe345484625d55c7dfc4cbccb672ca85eb3d 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 2b520deaa2f199fc618a647538d37cccbdd4c590..42f6c210398870f14b10b12fd0e5432eb6218e42 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index d9f044c95347e9d1e4df2422fd89ce043493e036..de2cd8db9187c4eb185086e1062ca30b19c6a63c 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 9feed65eb0bec1b4253c588e2b13390baf77a268..d51bf07fc57892f4a715998c2ed13c915910199e 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 0a65150881419586ea3b1dac3bce3df9439857c2..1e3a3cb7324535105508c2259d4fc319559cb28b 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index e27f66930c00564cec4da9a46d015b1cdbf0590b..3c97008cd0c349e58df8dd998c05fedd01604122 100644 (file)
@@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(keyType)
+       if err != nil {
+               return
+       }
+       var _p1 *byte
+       _p1, err = BytePtrFromString(restriction)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func keyctlRestrictKeyring(cmd int, arg2 int) (err error) {
+       _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
        _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
        if e1 != 0 {
index 7e05826647e4ec883874701816d48b4439672f8b..5ade42cce0eb5bd6d3804f7c1110826cb87c0b18 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe() (fd1 int, fd2 int, err error) {
        r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
        fd1 = int(r0)
@@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index d94d076aa019ebdb024596cffd88c6a2b496c4ed..3e0bbc5f101e0aa3b0bc2be7e61898d950224056 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe() (fd1 int, fd2 int, err error) {
        r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
        fd1 = int(r0)
@@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index cf5bf3d05467c9b04aa2edc4daf703f6f81f01e7..cb0af13a3cb902ac2404398b8a4eab397abcbe87 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe() (fd1 int, fd2 int, err error) {
        r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
        fd1 = int(r0)
@@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 243a9317cf2876d96b30ae5e41a84adfd709c5c1..6fd48d3dcd760e651a626f4033a850866f31a411 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe() (fd1 int, fd2 int, err error) {
        r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
        fd1 = int(r0)
@@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index a9532d07870b12bb48eff402e5effbb1b67194e2..2938e4124ed53f09967827dfa92f4055c36cc1e9 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe(p *[2]_C_int) (err error) {
        _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 0cb9f01774b1c02e953f99433b993647c649a16a..22b79ab0e2793b4222632435d2f423d8121230dc 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe(p *[2]_C_int) (err error) {
        _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 6fc99b54947de0baf832df9b2ca213af2fdc4922..cb921f37afd1d9fa6285fac5226a49164815aa4c 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe(p *[2]_C_int) (err error) {
        _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 27878a72b83c0f053513e2253cf7eb87a64b293b..5a7438035508c66eb5761834d63e3a8e47931743 100644 (file)
@@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
-       var _p0 unsafe.Pointer
-       if len(mib) > 0 {
-               _p0 = unsafe.Pointer(&mib[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func utimes(path string, timeval *[2]Timeval) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
@@ -377,6 +361,22 @@ func Munlockall() (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {
+       var _p0 unsafe.Pointer
+       if len(mib) > 0 {
+               _p0 = unsafe.Pointer(&mib[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func pipe(p *[2]_C_int) (err error) {
        _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)
        if e1 != 0 {
@@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = errnoErr(e1)
        }
index 5f614760c6c8fcab630f8d87510ed2ee6f9217cf..a96165d4bf06f2a31ef96ac9b5e3c00090da2a7a 100644 (file)
@@ -1478,8 +1478,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
-       _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+       r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index e869c060318d2758ab1961d4bf4530802bdc1c5c..7aae554f21001c6f7de00b978f4ea75832903b5b 100644 (file)
@@ -429,4 +429,6 @@ const (
        SYS_FSCONFIG                     = 431
        SYS_FSMOUNT                      = 432
        SYS_FSPICK                       = 433
+       SYS_PIDFD_OPEN                   = 434
+       SYS_CLONE3                       = 435
 )
index 4917b8ab6d400cb4f03f264c88079733694aac8a..7968439a926fbeb9fe3c3c532601149f9b9cc848 100644 (file)
@@ -351,4 +351,6 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
+       SYS_CLONE3                 = 435
 )
index f85fcb4f80b776b2f0a29b523ed260bec1db65a5..3c663c69d4b2c667bc0ddd6e060f794b1efbf9f1 100644 (file)
@@ -393,4 +393,6 @@ const (
        SYS_FSCONFIG                     = 431
        SYS_FSMOUNT                      = 432
        SYS_FSPICK                       = 433
+       SYS_PIDFD_OPEN                   = 434
+       SYS_CLONE3                       = 435
 )
index 678a119bc9e67c14cce5046cfb41c9419a0ebf77..753def987ece80b6458b639f40d24c0dece63745 100644 (file)
@@ -296,4 +296,5 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
 )
index 222c9f9a2f9bdab260860eead96233129690643b..ac86bd5446af7d026c222f834c1147baf7b76fbd 100644 (file)
@@ -414,4 +414,5 @@ const (
        SYS_FSCONFIG                     = 4431
        SYS_FSMOUNT                      = 4432
        SYS_FSPICK                       = 4433
+       SYS_PIDFD_OPEN                   = 4434
 )
index 28e6d0e9d66a7147a825d5a06376f0308a1a28ed..1f5705b58847cc1bd074801c16e214e48b88c8bd 100644 (file)
@@ -344,4 +344,5 @@ const (
        SYS_FSCONFIG               = 5431
        SYS_FSMOUNT                = 5432
        SYS_FSPICK                 = 5433
+       SYS_PIDFD_OPEN             = 5434
 )
index e643c6f6322530ebbde610d91d82cf85d069a352..d9ed953264cc54b52f85c5d88d39be0789cc0d8f 100644 (file)
@@ -344,4 +344,5 @@ const (
        SYS_FSCONFIG               = 5431
        SYS_FSMOUNT                = 5432
        SYS_FSPICK                 = 5433
+       SYS_PIDFD_OPEN             = 5434
 )
index 01d93c420f490621577019171d7020d44e00be36..94266b65a45cc5a552f5d78c350a327990497bdc 100644 (file)
@@ -414,4 +414,5 @@ const (
        SYS_FSCONFIG                     = 4431
        SYS_FSMOUNT                      = 4432
        SYS_FSPICK                       = 4433
+       SYS_PIDFD_OPEN                   = 4434
 )
index 5744149ebf9e756cd6986291139132668c9317c2..52e3da64904cc5a6f893240686e10d4855708a16 100644 (file)
@@ -393,4 +393,6 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
+       SYS_CLONE3                 = 435
 )
index 21c8320428139bb99f39caa91180832128b38a45..6141f90a8232b28bd4fa1ead58a287337d435b7c 100644 (file)
@@ -393,4 +393,6 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
+       SYS_CLONE3                 = 435
 )
index c1bb6d8f2d8c76a794734f2e126d8c948c28e8c2..4f7261a884d76d6c798b6a8752e295a983544061 100644 (file)
@@ -295,4 +295,6 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
+       SYS_CLONE3                 = 435
 )
index bc3cc6b5b24e1fa84dbef3ccf944624997f445e8..f47014ac0588fd1df5b0e1a9ddb027393a9ff77b 100644 (file)
@@ -358,4 +358,6 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
+       SYS_CLONE3                 = 435
 )
index 0a2841ba8ce0196b198383a00111bb08cab09044..dd78abb0d6b2ca45ec28dbda82e92a2408dcb745 100644 (file)
@@ -373,4 +373,5 @@ const (
        SYS_FSCONFIG               = 431
        SYS_FSMOUNT                = 432
        SYS_FSPICK                 = 433
+       SYS_PIDFD_OPEN             = 434
 )
index 37c69e235cb932041b43e83992126e9348efb6f7..16d62fa49274ff31dcc0d79b32d7c664c95edaed 100644 (file)
@@ -599,22 +599,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -622,6 +606,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -672,6 +657,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2476,6 +2468,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2584,3 +2612,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index d686b9f6d47c2826075cb6f03f72b68e18e75b70..97e92393cd0129c9b2e5c1cc17dc7847b9ebd350 100644 (file)
@@ -600,22 +600,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -623,6 +607,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -673,6 +658,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2489,6 +2481,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2598,3 +2626,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 6d5d460e0e5f62d470980a9dda741191b1f17343..05f978e8173d8d3a489285ebfbcb3f7394430a6d 100644 (file)
@@ -603,22 +603,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -626,6 +610,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -676,6 +661,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2467,6 +2459,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2575,3 +2603,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 619ba8ccc28836d10030e512082f97c0c30b73b5..5086fcea989bb0289df01fe635ca04d99e57ab63 100644 (file)
@@ -601,22 +601,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -624,6 +608,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -674,6 +659,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2468,6 +2460,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2577,3 +2605,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 7f22e4175ed43d13931a402c5fb3897dd52a85d8..b6ddd8c536a679a2f073125d1f982d6724a8a2b4 100644 (file)
@@ -602,22 +602,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -625,6 +609,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -675,6 +660,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2473,6 +2465,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2581,3 +2609,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index ad9837101e3eb6428b249c18db77b5b4cfd476da..89f3e32af9e303c387c9519ef4fe7f7a7cee2706 100644 (file)
@@ -601,22 +601,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -624,6 +608,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -674,6 +659,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2470,6 +2462,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2579,3 +2607,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index e5a414a0345c81d4605262db8895279e32d34c7d..6b84cf79af4c6683fa590f1cbdd42516fca29f68 100644 (file)
@@ -601,22 +601,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -624,6 +608,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -674,6 +659,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2470,6 +2462,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2579,3 +2607,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 6e4c502d3b237f1ea90c0f39e95e9cdfcfdf2ac0..bc50cd3819b0b433387ec3721e60dc11f8db2803 100644 (file)
@@ -602,22 +602,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -625,6 +609,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -675,6 +660,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2473,6 +2465,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2581,3 +2609,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 041d73471f0db8438efbd3a5d037f5f337161856..0a1ec1705d4689b3c6eb367c3e334434f894411f 100644 (file)
@@ -602,22 +602,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -625,6 +609,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -675,6 +660,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2478,6 +2470,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2587,3 +2615,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 252e38d056fadef28545f0d0191de3a605cf2d6e..c7f045a55c72635cc70691361c3688af4a005801 100644 (file)
@@ -602,22 +602,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -625,6 +609,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -675,6 +660,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2478,6 +2470,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2587,3 +2615,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 6880f0ba49a3d611206a3984b3d459cac211de3c..5d8d44799f7a48a20596848306a013b18f47ea1d 100644 (file)
@@ -601,22 +601,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -624,6 +608,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -674,6 +659,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2496,6 +2488,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2605,3 +2633,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 6832422162e5d8d670683eee5c2a19229c94eee8..034875a69ea75434401de6ae86c59d9e3a670892 100644 (file)
@@ -600,22 +600,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -623,6 +607,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -673,6 +658,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2492,6 +2484,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2601,3 +2629,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
index 991916e8436c978fe7c83b26778e4a313447ae5d..2f7ec8b8870909dc2818a22377546d244bf39d58 100644 (file)
@@ -604,22 +604,6 @@ const (
        RTN_THROW               = 0x9
        RTN_NAT                 = 0xa
        RTN_XRESOLVE            = 0xb
-       RTNLGRP_NONE            = 0x0
-       RTNLGRP_LINK            = 0x1
-       RTNLGRP_NOTIFY          = 0x2
-       RTNLGRP_NEIGH           = 0x3
-       RTNLGRP_TC              = 0x4
-       RTNLGRP_IPV4_IFADDR     = 0x5
-       RTNLGRP_IPV4_MROUTE     = 0x6
-       RTNLGRP_IPV4_ROUTE      = 0x7
-       RTNLGRP_IPV4_RULE       = 0x8
-       RTNLGRP_IPV6_IFADDR     = 0x9
-       RTNLGRP_IPV6_MROUTE     = 0xa
-       RTNLGRP_IPV6_ROUTE      = 0xb
-       RTNLGRP_IPV6_IFINFO     = 0xc
-       RTNLGRP_IPV6_PREFIX     = 0x12
-       RTNLGRP_IPV6_RULE       = 0x13
-       RTNLGRP_ND_USEROPT      = 0x14
        SizeofNlMsghdr          = 0x10
        SizeofNlMsgerr          = 0x14
        SizeofRtGenmsg          = 0x1
@@ -627,6 +611,7 @@ const (
        SizeofRtAttr            = 0x4
        SizeofIfInfomsg         = 0x10
        SizeofIfAddrmsg         = 0x8
+       SizeofIfaCacheinfo      = 0x10
        SizeofRtMsg             = 0xc
        SizeofRtNexthop         = 0x8
        SizeofNdUseroptmsg      = 0x10
@@ -677,6 +662,13 @@ type IfAddrmsg struct {
        Index     uint32
 }
 
+type IfaCacheinfo struct {
+       Prefered uint32
+       Valid    uint32
+       Cstamp   uint32
+       Tstamp   uint32
+}
+
 type RtMsg struct {
        Family   uint8
        Dst_len  uint8
@@ -2473,6 +2465,42 @@ const (
        BPF_FD_TYPE_URETPROBE               = 0x5
 )
 
+const (
+       RTNLGRP_NONE          = 0x0
+       RTNLGRP_LINK          = 0x1
+       RTNLGRP_NOTIFY        = 0x2
+       RTNLGRP_NEIGH         = 0x3
+       RTNLGRP_TC            = 0x4
+       RTNLGRP_IPV4_IFADDR   = 0x5
+       RTNLGRP_IPV4_MROUTE   = 0x6
+       RTNLGRP_IPV4_ROUTE    = 0x7
+       RTNLGRP_IPV4_RULE     = 0x8
+       RTNLGRP_IPV6_IFADDR   = 0x9
+       RTNLGRP_IPV6_MROUTE   = 0xa
+       RTNLGRP_IPV6_ROUTE    = 0xb
+       RTNLGRP_IPV6_IFINFO   = 0xc
+       RTNLGRP_DECnet_IFADDR = 0xd
+       RTNLGRP_NOP2          = 0xe
+       RTNLGRP_DECnet_ROUTE  = 0xf
+       RTNLGRP_DECnet_RULE   = 0x10
+       RTNLGRP_NOP4          = 0x11
+       RTNLGRP_IPV6_PREFIX   = 0x12
+       RTNLGRP_IPV6_RULE     = 0x13
+       RTNLGRP_ND_USEROPT    = 0x14
+       RTNLGRP_PHONET_IFADDR = 0x15
+       RTNLGRP_PHONET_ROUTE  = 0x16
+       RTNLGRP_DCB           = 0x17
+       RTNLGRP_IPV4_NETCONF  = 0x18
+       RTNLGRP_IPV6_NETCONF  = 0x19
+       RTNLGRP_MDB           = 0x1a
+       RTNLGRP_MPLS_ROUTE    = 0x1b
+       RTNLGRP_NSID          = 0x1c
+       RTNLGRP_MPLS_NETCONF  = 0x1d
+       RTNLGRP_IPV4_MROUTE_R = 0x1e
+       RTNLGRP_IPV6_MROUTE_R = 0x1f
+       RTNLGRP_NEXTHOP       = 0x20
+)
+
 type CapUserHeader struct {
        Version uint32
        Pid     int32
@@ -2582,3 +2610,17 @@ const (
        TIPC_CLUSTER_SCOPE = 0x2
        TIPC_NODE_SCOPE    = 0x3
 )
+
+const (
+       SYSLOG_ACTION_CLOSE         = 0
+       SYSLOG_ACTION_OPEN          = 1
+       SYSLOG_ACTION_READ          = 2
+       SYSLOG_ACTION_READ_ALL      = 3
+       SYSLOG_ACTION_READ_CLEAR    = 4
+       SYSLOG_ACTION_CLEAR         = 5
+       SYSLOG_ACTION_CONSOLE_OFF   = 6
+       SYSLOG_ACTION_CONSOLE_ON    = 7
+       SYSLOG_ACTION_CONSOLE_LEVEL = 8
+       SYSLOG_ACTION_SIZE_UNREAD   = 9
+       SYSLOG_ACTION_SIZE_BUFFER   = 10
+)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s
deleted file mode 100644 (file)
index 21d994d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//
-// System calls for 386, Windows are implemented in runtime/syscall_windows.goc
-//
-
-TEXT Â·getprocaddress(SB), 7, $0-16
-       JMP     syscall·getprocaddress(SB)
-
-TEXT Â·loadlibrary(SB), 7, $0-12
-       JMP     syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
deleted file mode 100644 (file)
index 5bfdf79..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//
-// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc
-//
-
-TEXT Â·getprocaddress(SB), 7, $0-32
-       JMP     syscall·getprocaddress(SB)
-
-TEXT Â·loadlibrary(SB), 7, $0-24
-       JMP     syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_arm.s b/vendor/golang.org/x/sys/windows/asm_windows_arm.s
deleted file mode 100644 (file)
index 55d8b91..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "textflag.h"
-
-TEXT Â·getprocaddress(SB),NOSPLIT,$0
-       B       syscall·getprocaddress(SB)
-
-TEXT Â·loadlibrary(SB),NOSPLIT,$0
-       B       syscall·loadlibrary(SB)
index ba67658db1d13909c4ab063bcc0fb7c1dff53be6..d7771134158f162a0246acdfefa14471c33495ae 100644 (file)
@@ -11,6 +11,18 @@ import (
        "unsafe"
 )
 
+// We need to use LoadLibrary and GetProcAddress from the Go runtime, because
+// the these symbols are loaded by the system linker and are required to
+// dynamically load additional symbols. Note that in the Go runtime, these
+// return syscall.Handle and syscall.Errno, but these are the same, in fact,
+// as windows.Handle and windows.Errno, and we intend to keep these the same.
+
+//go:linkname syscall_loadlibrary syscall.loadlibrary
+func syscall_loadlibrary(filename *uint16) (handle Handle, err Errno)
+
+//go:linkname syscall_getprocaddress syscall.getprocaddress
+func syscall_getprocaddress(handle Handle, procname *uint8) (proc uintptr, err Errno)
+
 // DLLError describes reasons for DLL load failures.
 type DLLError struct {
        Err     error
@@ -20,10 +32,6 @@ type DLLError struct {
 
 func (e *DLLError) Error() string { return e.Msg }
 
-// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.
-func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno)
-func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno)
-
 // A DLL implements access to a single DLL.
 type DLL struct {
        Name   string
@@ -40,7 +48,7 @@ func LoadDLL(name string) (dll *DLL, err error) {
        if err != nil {
                return nil, err
        }
-       h, e := loadlibrary(namep)
+       h, e := syscall_loadlibrary(namep)
        if e != 0 {
                return nil, &DLLError{
                        Err:     e,
@@ -50,7 +58,7 @@ func LoadDLL(name string) (dll *DLL, err error) {
        }
        d := &DLL{
                Name:   name,
-               Handle: Handle(h),
+               Handle: h,
        }
        return d, nil
 }
@@ -71,7 +79,7 @@ func (d *DLL) FindProc(name string) (proc *Proc, err error) {
        if err != nil {
                return nil, err
        }
-       a, e := getprocaddress(uintptr(d.Handle), namep)
+       a, e := syscall_getprocaddress(d.Handle, namep)
        if e != 0 {
                return nil, &DLLError{
                        Err:     e,
index 62770572747ea0c7e35a4052c570a96c52fc0bd4..328e3b2ace2d3c4f0ad0c58328e066d03b46a8fc 100644 (file)
@@ -6,4 +6,4 @@
 
 package windows
 
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
+//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
index 7b2cfb9e0ac6207b1988c7c56db95674db3b20d5..c605ee6abba507be876365897d9bdd1347d0b81d 100644 (file)
@@ -9,14 +9,6 @@ import (
        "unsafe"
 )
 
-const (
-       STANDARD_RIGHTS_REQUIRED = 0xf0000
-       STANDARD_RIGHTS_READ     = 0x20000
-       STANDARD_RIGHTS_WRITE    = 0x20000
-       STANDARD_RIGHTS_EXECUTE  = 0x20000
-       STANDARD_RIGHTS_ALL      = 0x1F0000
-)
-
 const (
        NameUnknown          = 0
        NameFullyQualifiedDN = 1
@@ -235,16 +227,15 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32,
        }
 }
 
-// String converts SID to a string format
-// suitable for display, storage, or transmission.
-func (sid *SID) String() (string, error) {
+// String converts SID to a string format suitable for display, storage, or transmission.
+func (sid *SID) String() string {
        var s *uint16
        e := ConvertSidToStringSid(sid, &s)
        if e != nil {
-               return "", e
+               return ""
        }
        defer LocalFree((Handle)(unsafe.Pointer(s)))
-       return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil
+       return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(s))[:])
 }
 
 // Len returns the length, in bytes, of a valid security identifier SID.
@@ -656,21 +647,16 @@ func (tml *Tokenmandatorylabel) Size() uint32 {
 // system-related operations on the local computer.
 type Token Handle
 
-// OpenCurrentProcessToken opens the access token
-// associated with current process. It is a real
-// token that needs to be closed, unlike
-// GetCurrentProcessToken.
+// OpenCurrentProcessToken opens an access token associated with current
+// process with TOKEN_QUERY access. It is a real token that needs to be closed.
+//
+// Deprecated: Explicitly call OpenProcessToken(CurrentProcess(), ...)
+// with the desired access instead, or use GetCurrentProcessToken for a
+// TOKEN_QUERY token.
 func OpenCurrentProcessToken() (Token, error) {
-       p, e := GetCurrentProcess()
-       if e != nil {
-               return 0, e
-       }
-       var t Token
-       e = OpenProcessToken(p, TOKEN_QUERY|TOKEN_DUPLICATE, &t)
-       if e != nil {
-               return 0, e
-       }
-       return t, nil
+       var token Token
+       err := OpenProcessToken(CurrentProcess(), TOKEN_QUERY, &token)
+       return token, err
 }
 
 // GetCurrentProcessToken returns the access token associated with
@@ -890,3 +876,521 @@ type WTS_SESSION_INFO struct {
 //sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken
 //sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW
 //sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory
+
+type ACL struct {
+       aclRevision byte
+       sbz1        byte
+       aclSize     uint16
+       aceCount    uint16
+       sbz2        uint16
+}
+
+type SECURITY_DESCRIPTOR struct {
+       revision byte
+       sbz1     byte
+       control  SECURITY_DESCRIPTOR_CONTROL
+       owner    *SID
+       group    *SID
+       sacl     *ACL
+       dacl     *ACL
+}
+
+type SecurityAttributes struct {
+       Length             uint32
+       SecurityDescriptor *SECURITY_DESCRIPTOR
+       InheritHandle      uint32
+}
+
+type SE_OBJECT_TYPE uint32
+
+// Constants for type SE_OBJECT_TYPE
+const (
+       SE_UNKNOWN_OBJECT_TYPE     = 0
+       SE_FILE_OBJECT             = 1
+       SE_SERVICE                 = 2
+       SE_PRINTER                 = 3
+       SE_REGISTRY_KEY            = 4
+       SE_LMSHARE                 = 5
+       SE_KERNEL_OBJECT           = 6
+       SE_WINDOW_OBJECT           = 7
+       SE_DS_OBJECT               = 8
+       SE_DS_OBJECT_ALL           = 9
+       SE_PROVIDER_DEFINED_OBJECT = 10
+       SE_WMIGUID_OBJECT          = 11
+       SE_REGISTRY_WOW64_32KEY    = 12
+       SE_REGISTRY_WOW64_64KEY    = 13
+)
+
+type SECURITY_INFORMATION uint32
+
+// Constants for type SECURITY_INFORMATION
+const (
+       OWNER_SECURITY_INFORMATION            = 0x00000001
+       GROUP_SECURITY_INFORMATION            = 0x00000002
+       DACL_SECURITY_INFORMATION             = 0x00000004
+       SACL_SECURITY_INFORMATION             = 0x00000008
+       LABEL_SECURITY_INFORMATION            = 0x00000010
+       ATTRIBUTE_SECURITY_INFORMATION        = 0x00000020
+       SCOPE_SECURITY_INFORMATION            = 0x00000040
+       BACKUP_SECURITY_INFORMATION           = 0x00010000
+       PROTECTED_DACL_SECURITY_INFORMATION   = 0x80000000
+       PROTECTED_SACL_SECURITY_INFORMATION   = 0x40000000
+       UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000
+       UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000
+)
+
+type SECURITY_DESCRIPTOR_CONTROL uint16
+
+// Constants for type SECURITY_DESCRIPTOR_CONTROL
+const (
+       SE_OWNER_DEFAULTED       = 0x0001
+       SE_GROUP_DEFAULTED       = 0x0002
+       SE_DACL_PRESENT          = 0x0004
+       SE_DACL_DEFAULTED        = 0x0008
+       SE_SACL_PRESENT          = 0x0010
+       SE_SACL_DEFAULTED        = 0x0020
+       SE_DACL_AUTO_INHERIT_REQ = 0x0100
+       SE_SACL_AUTO_INHERIT_REQ = 0x0200
+       SE_DACL_AUTO_INHERITED   = 0x0400
+       SE_SACL_AUTO_INHERITED   = 0x0800
+       SE_DACL_PROTECTED        = 0x1000
+       SE_SACL_PROTECTED        = 0x2000
+       SE_RM_CONTROL_VALID      = 0x4000
+       SE_SELF_RELATIVE         = 0x8000
+)
+
+type ACCESS_MASK uint32
+
+// Constants for type ACCESS_MASK
+const (
+       DELETE                   = 0x00010000
+       READ_CONTROL             = 0x00020000
+       WRITE_DAC                = 0x00040000
+       WRITE_OWNER              = 0x00080000
+       SYNCHRONIZE              = 0x00100000
+       STANDARD_RIGHTS_REQUIRED = 0x000F0000
+       STANDARD_RIGHTS_READ     = READ_CONTROL
+       STANDARD_RIGHTS_WRITE    = READ_CONTROL
+       STANDARD_RIGHTS_EXECUTE  = READ_CONTROL
+       STANDARD_RIGHTS_ALL      = 0x001F0000
+       SPECIFIC_RIGHTS_ALL      = 0x0000FFFF
+       ACCESS_SYSTEM_SECURITY   = 0x01000000
+       MAXIMUM_ALLOWED          = 0x02000000
+       GENERIC_READ             = 0x80000000
+       GENERIC_WRITE            = 0x40000000
+       GENERIC_EXECUTE          = 0x20000000
+       GENERIC_ALL              = 0x10000000
+)
+
+type ACCESS_MODE uint32
+
+// Constants for type ACCESS_MODE
+const (
+       NOT_USED_ACCESS   = 0
+       GRANT_ACCESS      = 1
+       SET_ACCESS        = 2
+       DENY_ACCESS       = 3
+       REVOKE_ACCESS     = 4
+       SET_AUDIT_SUCCESS = 5
+       SET_AUDIT_FAILURE = 6
+)
+
+// Constants for AceFlags and Inheritance fields
+const (
+       NO_INHERITANCE                     = 0x0
+       SUB_OBJECTS_ONLY_INHERIT           = 0x1
+       SUB_CONTAINERS_ONLY_INHERIT        = 0x2
+       SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3
+       INHERIT_NO_PROPAGATE               = 0x4
+       INHERIT_ONLY                       = 0x8
+       INHERITED_ACCESS_ENTRY             = 0x10
+       INHERITED_PARENT                   = 0x10000000
+       INHERITED_GRANDPARENT              = 0x20000000
+       OBJECT_INHERIT_ACE                 = 0x1
+       CONTAINER_INHERIT_ACE              = 0x2
+       NO_PROPAGATE_INHERIT_ACE           = 0x4
+       INHERIT_ONLY_ACE                   = 0x8
+       INHERITED_ACE                      = 0x10
+       VALID_INHERIT_FLAGS                = 0x1F
+)
+
+type MULTIPLE_TRUSTEE_OPERATION uint32
+
+// Constants for MULTIPLE_TRUSTEE_OPERATION
+const (
+       NO_MULTIPLE_TRUSTEE    = 0
+       TRUSTEE_IS_IMPERSONATE = 1
+)
+
+type TRUSTEE_FORM uint32
+
+// Constants for TRUSTEE_FORM
+const (
+       TRUSTEE_IS_SID              = 0
+       TRUSTEE_IS_NAME             = 1
+       TRUSTEE_BAD_FORM            = 2
+       TRUSTEE_IS_OBJECTS_AND_SID  = 3
+       TRUSTEE_IS_OBJECTS_AND_NAME = 4
+)
+
+type TRUSTEE_TYPE uint32
+
+// Constants for TRUSTEE_TYPE
+const (
+       TRUSTEE_IS_UNKNOWN          = 0
+       TRUSTEE_IS_USER             = 1
+       TRUSTEE_IS_GROUP            = 2
+       TRUSTEE_IS_DOMAIN           = 3
+       TRUSTEE_IS_ALIAS            = 4
+       TRUSTEE_IS_WELL_KNOWN_GROUP = 5
+       TRUSTEE_IS_DELETED          = 6
+       TRUSTEE_IS_INVALID          = 7
+       TRUSTEE_IS_COMPUTER         = 8
+)
+
+// Constants for ObjectsPresent field
+const (
+       ACE_OBJECT_TYPE_PRESENT           = 0x1
+       ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x2
+)
+
+type EXPLICIT_ACCESS struct {
+       AccessPermissions ACCESS_MASK
+       AccessMode        ACCESS_MODE
+       Inheritance       uint32
+       Trustee           TRUSTEE
+}
+
+// This type is the union inside of TRUSTEE and must be created using one of the TrusteeValueFrom* functions.
+type TrusteeValue uintptr
+
+func TrusteeValueFromString(str string) TrusteeValue {
+       return TrusteeValue(unsafe.Pointer(StringToUTF16Ptr(str)))
+}
+func TrusteeValueFromSID(sid *SID) TrusteeValue {
+       return TrusteeValue(unsafe.Pointer(sid))
+}
+func TrusteeValueFromObjectsAndSid(objectsAndSid *OBJECTS_AND_SID) TrusteeValue {
+       return TrusteeValue(unsafe.Pointer(objectsAndSid))
+}
+func TrusteeValueFromObjectsAndName(objectsAndName *OBJECTS_AND_NAME) TrusteeValue {
+       return TrusteeValue(unsafe.Pointer(objectsAndName))
+}
+
+type TRUSTEE struct {
+       MultipleTrustee          *TRUSTEE
+       MultipleTrusteeOperation MULTIPLE_TRUSTEE_OPERATION
+       TrusteeForm              TRUSTEE_FORM
+       TrusteeType              TRUSTEE_TYPE
+       TrusteeValue             TrusteeValue
+}
+
+type OBJECTS_AND_SID struct {
+       ObjectsPresent          uint32
+       ObjectTypeGuid          GUID
+       InheritedObjectTypeGuid GUID
+       Sid                     *SID
+}
+
+type OBJECTS_AND_NAME struct {
+       ObjectsPresent          uint32
+       ObjectType              SE_OBJECT_TYPE
+       ObjectTypeName          *uint16
+       InheritedObjectTypeName *uint16
+       Name                    *uint16
+}
+
+//sys  getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetSecurityInfo
+//sys  SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) = advapi32.SetSecurityInfo
+//sys  getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetNamedSecurityInfoW
+//sys  SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) = advapi32.SetNamedSecurityInfoW
+
+//sys  buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) = advapi32.BuildSecurityDescriptorW
+//sys  initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) = advapi32.InitializeSecurityDescriptor
+
+//sys  getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) = advapi32.GetSecurityDescriptorControl
+//sys  getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorDacl
+//sys  getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorSacl
+//sys  getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorOwner
+//sys  getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorGroup
+//sys  getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) = advapi32.GetSecurityDescriptorLength
+//sys  getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) [failretval!=0] = advapi32.GetSecurityDescriptorRMControl
+//sys  isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) = advapi32.IsValidSecurityDescriptor
+
+//sys  setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) = advapi32.SetSecurityDescriptorControl
+//sys  setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorDacl
+//sys  setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorSacl
+//sys  setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) = advapi32.SetSecurityDescriptorOwner
+//sys  setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) = advapi32.SetSecurityDescriptorGroup
+//sys  setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) = advapi32.SetSecurityDescriptorRMControl
+
+//sys  convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW
+//sys  convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW
+
+//sys  makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) = advapi32.MakeAbsoluteSD
+//sys  makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) = advapi32.MakeSelfRelativeSD
+
+//sys  setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) = advapi32.SetEntriesInAclW
+
+// Control returns the security descriptor control bits.
+func (sd *SECURITY_DESCRIPTOR) Control() (control SECURITY_DESCRIPTOR_CONTROL, revision uint32, err error) {
+       err = getSecurityDescriptorControl(sd, &control, &revision)
+       return
+}
+
+// SetControl sets the security descriptor control bits.
+func (sd *SECURITY_DESCRIPTOR) SetControl(controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) error {
+       return setSecurityDescriptorControl(sd, controlBitsOfInterest, controlBitsToSet)
+}
+
+// RMControl returns the security descriptor resource manager control bits.
+func (sd *SECURITY_DESCRIPTOR) RMControl() (control uint8, err error) {
+       err = getSecurityDescriptorRMControl(sd, &control)
+       return
+}
+
+// SetRMControl sets the security descriptor resource manager control bits.
+func (sd *SECURITY_DESCRIPTOR) SetRMControl(rmControl uint8) {
+       setSecurityDescriptorRMControl(sd, &rmControl)
+}
+
+// DACL returns the security descriptor DACL and whether it was defaulted. The dacl return value may be nil
+// if a DACL exists but is an "empty DACL", meaning fully permissive. If the DACL does not exist, err returns
+// ERROR_OBJECT_NOT_FOUND.
+func (sd *SECURITY_DESCRIPTOR) DACL() (dacl *ACL, defaulted bool, err error) {
+       var present bool
+       err = getSecurityDescriptorDacl(sd, &present, &dacl, &defaulted)
+       if !present {
+               err = ERROR_OBJECT_NOT_FOUND
+       }
+       return
+}
+
+// SetDACL sets the absolute security descriptor DACL.
+func (absoluteSD *SECURITY_DESCRIPTOR) SetDACL(dacl *ACL, present, defaulted bool) error {
+       return setSecurityDescriptorDacl(absoluteSD, present, dacl, defaulted)
+}
+
+// SACL returns the security descriptor SACL and whether it was defaulted. The sacl return value may be nil
+// if a SACL exists but is an "empty SACL", meaning fully permissive. If the SACL does not exist, err returns
+// ERROR_OBJECT_NOT_FOUND.
+func (sd *SECURITY_DESCRIPTOR) SACL() (sacl *ACL, defaulted bool, err error) {
+       var present bool
+       err = getSecurityDescriptorSacl(sd, &present, &sacl, &defaulted)
+       if !present {
+               err = ERROR_OBJECT_NOT_FOUND
+       }
+       return
+}
+
+// SetSACL sets the absolute security descriptor SACL.
+func (absoluteSD *SECURITY_DESCRIPTOR) SetSACL(sacl *ACL, present, defaulted bool) error {
+       return setSecurityDescriptorSacl(absoluteSD, present, sacl, defaulted)
+}
+
+// Owner returns the security descriptor owner and whether it was defaulted.
+func (sd *SECURITY_DESCRIPTOR) Owner() (owner *SID, defaulted bool, err error) {
+       err = getSecurityDescriptorOwner(sd, &owner, &defaulted)
+       return
+}
+
+// SetOwner sets the absolute security descriptor owner.
+func (absoluteSD *SECURITY_DESCRIPTOR) SetOwner(owner *SID, defaulted bool) error {
+       return setSecurityDescriptorOwner(absoluteSD, owner, defaulted)
+}
+
+// Group returns the security descriptor group and whether it was defaulted.
+func (sd *SECURITY_DESCRIPTOR) Group() (group *SID, defaulted bool, err error) {
+       err = getSecurityDescriptorGroup(sd, &group, &defaulted)
+       return
+}
+
+// SetGroup sets the absolute security descriptor owner.
+func (absoluteSD *SECURITY_DESCRIPTOR) SetGroup(group *SID, defaulted bool) error {
+       return setSecurityDescriptorGroup(absoluteSD, group, defaulted)
+}
+
+// Length returns the length of the security descriptor.
+func (sd *SECURITY_DESCRIPTOR) Length() uint32 {
+       return getSecurityDescriptorLength(sd)
+}
+
+// IsValid returns whether the security descriptor is valid.
+func (sd *SECURITY_DESCRIPTOR) IsValid() bool {
+       return isValidSecurityDescriptor(sd)
+}
+
+// String returns the SDDL form of the security descriptor, with a function signature that can be
+// used with %v formatting directives.
+func (sd *SECURITY_DESCRIPTOR) String() string {
+       var sddl *uint16
+       err := convertSecurityDescriptorToStringSecurityDescriptor(sd, 1, 0xff, &sddl, nil)
+       if err != nil {
+               return ""
+       }
+       defer LocalFree(Handle(unsafe.Pointer(sddl)))
+       return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(sddl))[:])
+}
+
+// ToAbsolute converts a self-relative security descriptor into an absolute one.
+func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DESCRIPTOR, err error) {
+       control, _, err := selfRelativeSD.Control()
+       if err != nil {
+               return
+       }
+       if control&SE_SELF_RELATIVE == 0 {
+               err = ERROR_INVALID_PARAMETER
+               return
+       }
+       var absoluteSDSize, daclSize, saclSize, ownerSize, groupSize uint32
+       err = makeAbsoluteSD(selfRelativeSD, nil, &absoluteSDSize,
+               nil, &daclSize, nil, &saclSize, nil, &ownerSize, nil, &groupSize)
+       switch err {
+       case ERROR_INSUFFICIENT_BUFFER:
+       case nil:
+               // makeAbsoluteSD is expected to fail, but it succeeds.
+               return nil, ERROR_INTERNAL_ERROR
+       default:
+               return nil, err
+       }
+       if absoluteSDSize > 0 {
+               absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0]))
+       }
+       var (
+               dacl  *ACL
+               sacl  *ACL
+               owner *SID
+               group *SID
+       )
+       if daclSize > 0 {
+               dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0]))
+       }
+       if saclSize > 0 {
+               sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0]))
+       }
+       if ownerSize > 0 {
+               owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0]))
+       }
+       if groupSize > 0 {
+               group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0]))
+       }
+       err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize,
+               dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize)
+       return
+}
+
+// ToSelfRelative converts an absolute security descriptor into a self-relative one.
+func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURITY_DESCRIPTOR, err error) {
+       control, _, err := absoluteSD.Control()
+       if err != nil {
+               return
+       }
+       if control&SE_SELF_RELATIVE != 0 {
+               err = ERROR_INVALID_PARAMETER
+               return
+       }
+       var selfRelativeSDSize uint32
+       err = makeSelfRelativeSD(absoluteSD, nil, &selfRelativeSDSize)
+       switch err {
+       case ERROR_INSUFFICIENT_BUFFER:
+       case nil:
+               // makeSelfRelativeSD is expected to fail, but it succeeds.
+               return nil, ERROR_INTERNAL_ERROR
+       default:
+               return nil, err
+       }
+       if selfRelativeSDSize > 0 {
+               selfRelativeSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, selfRelativeSDSize)[0]))
+       }
+       err = makeSelfRelativeSD(absoluteSD, selfRelativeSD, &selfRelativeSDSize)
+       return
+}
+
+func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() *SECURITY_DESCRIPTOR {
+       sdBytes := make([]byte, selfRelativeSD.Length())
+       copy(sdBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(selfRelativeSD))[:len(sdBytes)])
+       return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&sdBytes[0]))
+}
+
+// SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a
+// self-relative security descriptor object allocated on the Go heap.
+func SecurityDescriptorFromString(sddl string) (sd *SECURITY_DESCRIPTOR, err error) {
+       var winHeapSD *SECURITY_DESCRIPTOR
+       err = convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &winHeapSD, nil)
+       if err != nil {
+               return
+       }
+       defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
+       return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
+}
+
+// GetSecurityInfo queries the security information for a given handle and returns the self-relative security
+// descriptor result on the Go heap.
+func GetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) {
+       var winHeapSD *SECURITY_DESCRIPTOR
+       err = getSecurityInfo(handle, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD)
+       if err != nil {
+               return
+       }
+       defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
+       return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
+}
+
+// GetNamedSecurityInfo queries the security information for a given named object and returns the self-relative security
+// descriptor result on the Go heap.
+func GetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) {
+       var winHeapSD *SECURITY_DESCRIPTOR
+       err = getNamedSecurityInfo(objectName, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD)
+       if err != nil {
+               return
+       }
+       defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
+       return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
+}
+
+// BuildSecurityDescriptor makes a new security descriptor using the input trustees, explicit access lists, and
+// prior security descriptor to be merged, any of which can be nil, returning the self-relative security descriptor
+// result on the Go heap.
+func BuildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, accessEntries []EXPLICIT_ACCESS, auditEntries []EXPLICIT_ACCESS, mergedSecurityDescriptor *SECURITY_DESCRIPTOR) (sd *SECURITY_DESCRIPTOR, err error) {
+       var winHeapSD *SECURITY_DESCRIPTOR
+       var winHeapSDSize uint32
+       var firstAccessEntry *EXPLICIT_ACCESS
+       if len(accessEntries) > 0 {
+               firstAccessEntry = &accessEntries[0]
+       }
+       var firstAuditEntry *EXPLICIT_ACCESS
+       if len(auditEntries) > 0 {
+               firstAuditEntry = &auditEntries[0]
+       }
+       err = buildSecurityDescriptor(owner, group, uint32(len(accessEntries)), firstAccessEntry, uint32(len(auditEntries)), firstAuditEntry, mergedSecurityDescriptor, &winHeapSDSize, &winHeapSD)
+       if err != nil {
+               return
+       }
+       defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
+       return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
+}
+
+// NewSecurityDescriptor creates and initializes a new absolute security descriptor.
+func NewSecurityDescriptor() (absoluteSD *SECURITY_DESCRIPTOR, err error) {
+       absoluteSD = &SECURITY_DESCRIPTOR{}
+       err = initializeSecurityDescriptor(absoluteSD, 1)
+       return
+}
+
+// ACLFromEntries returns a new ACL on the Go heap containing a list of explicit entries as well as those of another ACL.
+// Both explicitEntries and mergedACL are optional and can be nil.
+func ACLFromEntries(explicitEntries []EXPLICIT_ACCESS, mergedACL *ACL) (acl *ACL, err error) {
+       var firstExplicitEntry *EXPLICIT_ACCESS
+       if len(explicitEntries) > 0 {
+               firstExplicitEntry = &explicitEntries[0]
+       }
+       var winHeapACL *ACL
+       err = setEntriesInAcl(uint32(len(explicitEntries)), firstExplicitEntry, mergedACL, &winHeapACL)
+       if err != nil {
+               return
+       }
+       defer LocalFree(Handle(unsafe.Pointer(winHeapACL)))
+       aclBytes := make([]byte, winHeapACL.aclSize)
+       copy(aclBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(winHeapACL))[:len(aclBytes)])
+       return (*ACL)(unsafe.Pointer(&aclBytes[0])), nil
+}
index abdefc33ca42f7118081198c24dd6b462d08389d..df0ffc69634a1628b6f7353b1b63e3572ce4c0cb 100644 (file)
@@ -57,6 +57,10 @@ const (
        FILE_VOLUME_IS_COMPRESSED         = 0x00008000
        FILE_VOLUME_QUOTAS                = 0x00000020
 
+       // Flags for LockFileEx.
+       LOCKFILE_FAIL_IMMEDIATELY = 0x00000001
+       LOCKFILE_EXCLUSIVE_LOCK   = 0x00000002
+
        // Return values of SleepEx and other APC functions
        STATUS_USER_APC    = 0x000000C0
        WAIT_IO_COMPLETION = STATUS_USER_APC
@@ -136,6 +140,8 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys  LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
 //sys  FreeLibrary(handle Handle) (err error)
 //sys  GetProcAddress(module Handle, procname string) (proc uintptr, err error)
+//sys  GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW
+//sys  GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW
 //sys  GetVersion() (ver uint32, err error)
 //sys  FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
 //sys  ExitProcess(exitcode uint32)
@@ -160,6 +166,8 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys  DeleteFile(path *uint16) (err error) = DeleteFileW
 //sys  MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
 //sys  MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
+//sys  LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
+//sys  UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
 //sys  GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
 //sys  GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
 //sys  SetEndOfFile(handle Handle) (err error)
@@ -173,13 +181,11 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys  CancelIoEx(s Handle, o *Overlapped) (err error)
 //sys  CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW
 //sys  OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error)
-//sys  ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) = shell32.ShellExecuteW
+//sys  ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW
 //sys  shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath
 //sys  TerminateProcess(handle Handle, exitcode uint32) (err error)
 //sys  GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
 //sys  GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW
-//sys  GetCurrentProcess() (pseudoHandle Handle, err error)
-//sys  GetCurrentThread() (pseudoHandle Handle, err error)
 //sys  GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
 //sys  DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
 //sys  WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
@@ -284,6 +290,7 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys  FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW
 //sys  FindVolumeClose(findVolume Handle) (err error)
 //sys  FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error)
+//sys  GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = GetDiskFreeSpaceExW
 //sys  GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW
 //sys  GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0]
 //sys  GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW
@@ -296,6 +303,10 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys  SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW
 //sys  SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW
 //sys  MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW
+//sys  ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx
+//sys  InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW
+//sys  SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters
+//sys  GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters
 //sys  clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString
 //sys  stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2
 //sys  coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid
@@ -305,6 +316,34 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 
 // syscall interface implementation for other packages
 
+// GetCurrentProcess returns the handle for the current process.
+// It is a pseudo handle that does not need to be closed.
+// The returned error is always nil.
+//
+// Deprecated: use CurrentProcess for the same Handle without the nil
+// error.
+func GetCurrentProcess() (Handle, error) {
+       return CurrentProcess(), nil
+}
+
+// CurrentProcess returns the handle for the current process.
+// It is a pseudo handle that does not need to be closed.
+func CurrentProcess() Handle { return Handle(^uintptr(1 - 1)) }
+
+// GetCurrentThread returns the handle for the current thread.
+// It is a pseudo handle that does not need to be closed.
+// The returned error is always nil.
+//
+// Deprecated: use CurrentThread for the same Handle without the nil
+// error.
+func GetCurrentThread() (Handle, error) {
+       return CurrentThread(), nil
+}
+
+// CurrentThread returns the handle for the current thread.
+// It is a pseudo handle that does not need to be closed.
+func CurrentThread() Handle { return Handle(^uintptr(2 - 1)) }
+
 // GetProcAddressByOrdinal retrieves the address of the exported
 // function from module by ordinal.
 func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) {
index 1ef80cd71791cb64f91bd5a03a00d9ca27b37d80..7f178bb91ed2952badcc00c05a67d021ccdf8c3e 100644 (file)
@@ -62,11 +62,6 @@ var signals = [...]string{
 }
 
 const (
-       GENERIC_READ    = 0x80000000
-       GENERIC_WRITE   = 0x40000000
-       GENERIC_EXECUTE = 0x20000000
-       GENERIC_ALL     = 0x10000000
-
        FILE_LIST_DIRECTORY   = 0x00000001
        FILE_APPEND_DATA      = 0x00000004
        FILE_WRITE_ATTRIBUTES = 0x00000100
@@ -158,13 +153,6 @@ const (
        WAIT_OBJECT_0  = 0x00000000
        WAIT_FAILED    = 0xFFFFFFFF
 
-       // Standard access rights.
-       DELETE       = 0x00010000
-       READ_CONTROL = 0x00020000
-       SYNCHRONIZE  = 0x00100000
-       WRITE_DAC    = 0x00040000
-       WRITE_OWNER  = 0x00080000
-
        // Access rights for process.
        PROCESS_CREATE_PROCESS            = 0x0080
        PROCESS_CREATE_THREAD             = 0x0002
@@ -483,12 +471,6 @@ func NsecToTimeval(nsec int64) (tv Timeval) {
        return
 }
 
-type SecurityAttributes struct {
-       Length             uint32
-       SecurityDescriptor uintptr
-       InheritHandle      uint32
-}
-
 type Overlapped struct {
        Internal     uintptr
        InternalHigh uintptr
@@ -1688,3 +1670,75 @@ type OsVersionInfoEx struct {
        ProductType       byte
        _                 byte
 }
+
+const (
+       EWX_LOGOFF          = 0x00000000
+       EWX_SHUTDOWN        = 0x00000001
+       EWX_REBOOT          = 0x00000002
+       EWX_FORCE           = 0x00000004
+       EWX_POWEROFF        = 0x00000008
+       EWX_FORCEIFHUNG     = 0x00000010
+       EWX_QUICKRESOLVE    = 0x00000020
+       EWX_RESTARTAPPS     = 0x00000040
+       EWX_HYBRID_SHUTDOWN = 0x00400000
+       EWX_BOOTOPTIONS     = 0x01000000
+
+       SHTDN_REASON_FLAG_COMMENT_REQUIRED          = 0x01000000
+       SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000
+       SHTDN_REASON_FLAG_CLEAN_UI                  = 0x04000000
+       SHTDN_REASON_FLAG_DIRTY_UI                  = 0x08000000
+       SHTDN_REASON_FLAG_USER_DEFINED              = 0x40000000
+       SHTDN_REASON_FLAG_PLANNED                   = 0x80000000
+       SHTDN_REASON_MAJOR_OTHER                    = 0x00000000
+       SHTDN_REASON_MAJOR_NONE                     = 0x00000000
+       SHTDN_REASON_MAJOR_HARDWARE                 = 0x00010000
+       SHTDN_REASON_MAJOR_OPERATINGSYSTEM          = 0x00020000
+       SHTDN_REASON_MAJOR_SOFTWARE                 = 0x00030000
+       SHTDN_REASON_MAJOR_APPLICATION              = 0x00040000
+       SHTDN_REASON_MAJOR_SYSTEM                   = 0x00050000
+       SHTDN_REASON_MAJOR_POWER                    = 0x00060000
+       SHTDN_REASON_MAJOR_LEGACY_API               = 0x00070000
+       SHTDN_REASON_MINOR_OTHER                    = 0x00000000
+       SHTDN_REASON_MINOR_NONE                     = 0x000000ff
+       SHTDN_REASON_MINOR_MAINTENANCE              = 0x00000001
+       SHTDN_REASON_MINOR_INSTALLATION             = 0x00000002
+       SHTDN_REASON_MINOR_UPGRADE                  = 0x00000003
+       SHTDN_REASON_MINOR_RECONFIG                 = 0x00000004
+       SHTDN_REASON_MINOR_HUNG                     = 0x00000005
+       SHTDN_REASON_MINOR_UNSTABLE                 = 0x00000006
+       SHTDN_REASON_MINOR_DISK                     = 0x00000007
+       SHTDN_REASON_MINOR_PROCESSOR                = 0x00000008
+       SHTDN_REASON_MINOR_NETWORKCARD              = 0x00000009
+       SHTDN_REASON_MINOR_POWER_SUPPLY             = 0x0000000a
+       SHTDN_REASON_MINOR_CORDUNPLUGGED            = 0x0000000b
+       SHTDN_REASON_MINOR_ENVIRONMENT              = 0x0000000c
+       SHTDN_REASON_MINOR_HARDWARE_DRIVER          = 0x0000000d
+       SHTDN_REASON_MINOR_OTHERDRIVER              = 0x0000000e
+       SHTDN_REASON_MINOR_BLUESCREEN               = 0x0000000F
+       SHTDN_REASON_MINOR_SERVICEPACK              = 0x00000010
+       SHTDN_REASON_MINOR_HOTFIX                   = 0x00000011
+       SHTDN_REASON_MINOR_SECURITYFIX              = 0x00000012
+       SHTDN_REASON_MINOR_SECURITY                 = 0x00000013
+       SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY     = 0x00000014
+       SHTDN_REASON_MINOR_WMI                      = 0x00000015
+       SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL    = 0x00000016
+       SHTDN_REASON_MINOR_HOTFIX_UNINSTALL         = 0x00000017
+       SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL    = 0x00000018
+       SHTDN_REASON_MINOR_MMC                      = 0x00000019
+       SHTDN_REASON_MINOR_SYSTEMRESTORE            = 0x0000001a
+       SHTDN_REASON_MINOR_TERMSRV                  = 0x00000020
+       SHTDN_REASON_MINOR_DC_PROMOTION             = 0x00000021
+       SHTDN_REASON_MINOR_DC_DEMOTION              = 0x00000022
+       SHTDN_REASON_UNKNOWN                        = SHTDN_REASON_MINOR_NONE
+       SHTDN_REASON_LEGACY_API                     = SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED
+       SHTDN_REASON_VALID_BIT_MASK                 = 0xc0ffffff
+
+       SHUTDOWN_NORETRY = 0x1
+)
+
+// Flags used for GetModuleHandleEx
+const (
+       GET_MODULE_HANDLE_EX_FLAG_PIN                = 1
+       GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2
+       GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS       = 4
+)
index 9c448be31c15a7dd2b8ea750d1597dabf7ce51b1..74d721e0f3553d2482fe2ec34c4479db87bd1139 100644 (file)
@@ -51,269 +51,301 @@ var (
        modnetapi32 = NewLazySystemDLL("netapi32.dll")
        modwtsapi32 = NewLazySystemDLL("wtsapi32.dll")
 
-       procRegisterEventSourceW               = modadvapi32.NewProc("RegisterEventSourceW")
-       procDeregisterEventSource              = modadvapi32.NewProc("DeregisterEventSource")
-       procReportEventW                       = modadvapi32.NewProc("ReportEventW")
-       procOpenSCManagerW                     = modadvapi32.NewProc("OpenSCManagerW")
-       procCloseServiceHandle                 = modadvapi32.NewProc("CloseServiceHandle")
-       procCreateServiceW                     = modadvapi32.NewProc("CreateServiceW")
-       procOpenServiceW                       = modadvapi32.NewProc("OpenServiceW")
-       procDeleteService                      = modadvapi32.NewProc("DeleteService")
-       procStartServiceW                      = modadvapi32.NewProc("StartServiceW")
-       procQueryServiceStatus                 = modadvapi32.NewProc("QueryServiceStatus")
-       procQueryServiceLockStatusW            = modadvapi32.NewProc("QueryServiceLockStatusW")
-       procControlService                     = modadvapi32.NewProc("ControlService")
-       procStartServiceCtrlDispatcherW        = modadvapi32.NewProc("StartServiceCtrlDispatcherW")
-       procSetServiceStatus                   = modadvapi32.NewProc("SetServiceStatus")
-       procChangeServiceConfigW               = modadvapi32.NewProc("ChangeServiceConfigW")
-       procQueryServiceConfigW                = modadvapi32.NewProc("QueryServiceConfigW")
-       procChangeServiceConfig2W              = modadvapi32.NewProc("ChangeServiceConfig2W")
-       procQueryServiceConfig2W               = modadvapi32.NewProc("QueryServiceConfig2W")
-       procEnumServicesStatusExW              = modadvapi32.NewProc("EnumServicesStatusExW")
-       procQueryServiceStatusEx               = modadvapi32.NewProc("QueryServiceStatusEx")
-       procNotifyServiceStatusChangeW         = modadvapi32.NewProc("NotifyServiceStatusChangeW")
-       procGetLastError                       = modkernel32.NewProc("GetLastError")
-       procLoadLibraryW                       = modkernel32.NewProc("LoadLibraryW")
-       procLoadLibraryExW                     = modkernel32.NewProc("LoadLibraryExW")
-       procFreeLibrary                        = modkernel32.NewProc("FreeLibrary")
-       procGetProcAddress                     = modkernel32.NewProc("GetProcAddress")
-       procGetVersion                         = modkernel32.NewProc("GetVersion")
-       procFormatMessageW                     = modkernel32.NewProc("FormatMessageW")
-       procExitProcess                        = modkernel32.NewProc("ExitProcess")
-       procIsWow64Process                     = modkernel32.NewProc("IsWow64Process")
-       procCreateFileW                        = modkernel32.NewProc("CreateFileW")
-       procReadFile                           = modkernel32.NewProc("ReadFile")
-       procWriteFile                          = modkernel32.NewProc("WriteFile")
-       procGetOverlappedResult                = modkernel32.NewProc("GetOverlappedResult")
-       procSetFilePointer                     = modkernel32.NewProc("SetFilePointer")
-       procCloseHandle                        = modkernel32.NewProc("CloseHandle")
-       procGetStdHandle                       = modkernel32.NewProc("GetStdHandle")
-       procSetStdHandle                       = modkernel32.NewProc("SetStdHandle")
-       procFindFirstFileW                     = modkernel32.NewProc("FindFirstFileW")
-       procFindNextFileW                      = modkernel32.NewProc("FindNextFileW")
-       procFindClose                          = modkernel32.NewProc("FindClose")
-       procGetFileInformationByHandle         = modkernel32.NewProc("GetFileInformationByHandle")
-       procGetFileInformationByHandleEx       = modkernel32.NewProc("GetFileInformationByHandleEx")
-       procGetCurrentDirectoryW               = modkernel32.NewProc("GetCurrentDirectoryW")
-       procSetCurrentDirectoryW               = modkernel32.NewProc("SetCurrentDirectoryW")
-       procCreateDirectoryW                   = modkernel32.NewProc("CreateDirectoryW")
-       procRemoveDirectoryW                   = modkernel32.NewProc("RemoveDirectoryW")
-       procDeleteFileW                        = modkernel32.NewProc("DeleteFileW")
-       procMoveFileW                          = modkernel32.NewProc("MoveFileW")
-       procMoveFileExW                        = modkernel32.NewProc("MoveFileExW")
-       procGetComputerNameW                   = modkernel32.NewProc("GetComputerNameW")
-       procGetComputerNameExW                 = modkernel32.NewProc("GetComputerNameExW")
-       procSetEndOfFile                       = modkernel32.NewProc("SetEndOfFile")
-       procGetSystemTimeAsFileTime            = modkernel32.NewProc("GetSystemTimeAsFileTime")
-       procGetSystemTimePreciseAsFileTime     = modkernel32.NewProc("GetSystemTimePreciseAsFileTime")
-       procGetTimeZoneInformation             = modkernel32.NewProc("GetTimeZoneInformation")
-       procCreateIoCompletionPort             = modkernel32.NewProc("CreateIoCompletionPort")
-       procGetQueuedCompletionStatus          = modkernel32.NewProc("GetQueuedCompletionStatus")
-       procPostQueuedCompletionStatus         = modkernel32.NewProc("PostQueuedCompletionStatus")
-       procCancelIo                           = modkernel32.NewProc("CancelIo")
-       procCancelIoEx                         = modkernel32.NewProc("CancelIoEx")
-       procCreateProcessW                     = modkernel32.NewProc("CreateProcessW")
-       procOpenProcess                        = modkernel32.NewProc("OpenProcess")
-       procShellExecuteW                      = modshell32.NewProc("ShellExecuteW")
-       procSHGetKnownFolderPath               = modshell32.NewProc("SHGetKnownFolderPath")
-       procTerminateProcess                   = modkernel32.NewProc("TerminateProcess")
-       procGetExitCodeProcess                 = modkernel32.NewProc("GetExitCodeProcess")
-       procGetStartupInfoW                    = modkernel32.NewProc("GetStartupInfoW")
-       procGetCurrentProcess                  = modkernel32.NewProc("GetCurrentProcess")
-       procGetCurrentThread                   = modkernel32.NewProc("GetCurrentThread")
-       procGetProcessTimes                    = modkernel32.NewProc("GetProcessTimes")
-       procDuplicateHandle                    = modkernel32.NewProc("DuplicateHandle")
-       procWaitForSingleObject                = modkernel32.NewProc("WaitForSingleObject")
-       procWaitForMultipleObjects             = modkernel32.NewProc("WaitForMultipleObjects")
-       procGetTempPathW                       = modkernel32.NewProc("GetTempPathW")
-       procCreatePipe                         = modkernel32.NewProc("CreatePipe")
-       procGetFileType                        = modkernel32.NewProc("GetFileType")
-       procCryptAcquireContextW               = modadvapi32.NewProc("CryptAcquireContextW")
-       procCryptReleaseContext                = modadvapi32.NewProc("CryptReleaseContext")
-       procCryptGenRandom                     = modadvapi32.NewProc("CryptGenRandom")
-       procGetEnvironmentStringsW             = modkernel32.NewProc("GetEnvironmentStringsW")
-       procFreeEnvironmentStringsW            = modkernel32.NewProc("FreeEnvironmentStringsW")
-       procGetEnvironmentVariableW            = modkernel32.NewProc("GetEnvironmentVariableW")
-       procSetEnvironmentVariableW            = modkernel32.NewProc("SetEnvironmentVariableW")
-       procCreateEnvironmentBlock             = moduserenv.NewProc("CreateEnvironmentBlock")
-       procDestroyEnvironmentBlock            = moduserenv.NewProc("DestroyEnvironmentBlock")
-       procGetTickCount64                     = modkernel32.NewProc("GetTickCount64")
-       procSetFileTime                        = modkernel32.NewProc("SetFileTime")
-       procGetFileAttributesW                 = modkernel32.NewProc("GetFileAttributesW")
-       procSetFileAttributesW                 = modkernel32.NewProc("SetFileAttributesW")
-       procGetFileAttributesExW               = modkernel32.NewProc("GetFileAttributesExW")
-       procGetCommandLineW                    = modkernel32.NewProc("GetCommandLineW")
-       procCommandLineToArgvW                 = modshell32.NewProc("CommandLineToArgvW")
-       procLocalFree                          = modkernel32.NewProc("LocalFree")
-       procSetHandleInformation               = modkernel32.NewProc("SetHandleInformation")
-       procFlushFileBuffers                   = modkernel32.NewProc("FlushFileBuffers")
-       procGetFullPathNameW                   = modkernel32.NewProc("GetFullPathNameW")
-       procGetLongPathNameW                   = modkernel32.NewProc("GetLongPathNameW")
-       procGetShortPathNameW                  = modkernel32.NewProc("GetShortPathNameW")
-       procCreateFileMappingW                 = modkernel32.NewProc("CreateFileMappingW")
-       procMapViewOfFile                      = modkernel32.NewProc("MapViewOfFile")
-       procUnmapViewOfFile                    = modkernel32.NewProc("UnmapViewOfFile")
-       procFlushViewOfFile                    = modkernel32.NewProc("FlushViewOfFile")
-       procVirtualLock                        = modkernel32.NewProc("VirtualLock")
-       procVirtualUnlock                      = modkernel32.NewProc("VirtualUnlock")
-       procVirtualAlloc                       = modkernel32.NewProc("VirtualAlloc")
-       procVirtualFree                        = modkernel32.NewProc("VirtualFree")
-       procVirtualProtect                     = modkernel32.NewProc("VirtualProtect")
-       procTransmitFile                       = modmswsock.NewProc("TransmitFile")
-       procReadDirectoryChangesW              = modkernel32.NewProc("ReadDirectoryChangesW")
-       procCertOpenSystemStoreW               = modcrypt32.NewProc("CertOpenSystemStoreW")
-       procCertOpenStore                      = modcrypt32.NewProc("CertOpenStore")
-       procCertEnumCertificatesInStore        = modcrypt32.NewProc("CertEnumCertificatesInStore")
-       procCertAddCertificateContextToStore   = modcrypt32.NewProc("CertAddCertificateContextToStore")
-       procCertCloseStore                     = modcrypt32.NewProc("CertCloseStore")
-       procCertGetCertificateChain            = modcrypt32.NewProc("CertGetCertificateChain")
-       procCertFreeCertificateChain           = modcrypt32.NewProc("CertFreeCertificateChain")
-       procCertCreateCertificateContext       = modcrypt32.NewProc("CertCreateCertificateContext")
-       procCertFreeCertificateContext         = modcrypt32.NewProc("CertFreeCertificateContext")
-       procCertVerifyCertificateChainPolicy   = modcrypt32.NewProc("CertVerifyCertificateChainPolicy")
-       procRegOpenKeyExW                      = modadvapi32.NewProc("RegOpenKeyExW")
-       procRegCloseKey                        = modadvapi32.NewProc("RegCloseKey")
-       procRegQueryInfoKeyW                   = modadvapi32.NewProc("RegQueryInfoKeyW")
-       procRegEnumKeyExW                      = modadvapi32.NewProc("RegEnumKeyExW")
-       procRegQueryValueExW                   = modadvapi32.NewProc("RegQueryValueExW")
-       procGetCurrentProcessId                = modkernel32.NewProc("GetCurrentProcessId")
-       procGetConsoleMode                     = modkernel32.NewProc("GetConsoleMode")
-       procSetConsoleMode                     = modkernel32.NewProc("SetConsoleMode")
-       procGetConsoleScreenBufferInfo         = modkernel32.NewProc("GetConsoleScreenBufferInfo")
-       procWriteConsoleW                      = modkernel32.NewProc("WriteConsoleW")
-       procReadConsoleW                       = modkernel32.NewProc("ReadConsoleW")
-       procCreateToolhelp32Snapshot           = modkernel32.NewProc("CreateToolhelp32Snapshot")
-       procProcess32FirstW                    = modkernel32.NewProc("Process32FirstW")
-       procProcess32NextW                     = modkernel32.NewProc("Process32NextW")
-       procThread32First                      = modkernel32.NewProc("Thread32First")
-       procThread32Next                       = modkernel32.NewProc("Thread32Next")
-       procDeviceIoControl                    = modkernel32.NewProc("DeviceIoControl")
-       procCreateSymbolicLinkW                = modkernel32.NewProc("CreateSymbolicLinkW")
-       procCreateHardLinkW                    = modkernel32.NewProc("CreateHardLinkW")
-       procGetCurrentThreadId                 = modkernel32.NewProc("GetCurrentThreadId")
-       procCreateEventW                       = modkernel32.NewProc("CreateEventW")
-       procCreateEventExW                     = modkernel32.NewProc("CreateEventExW")
-       procOpenEventW                         = modkernel32.NewProc("OpenEventW")
-       procSetEvent                           = modkernel32.NewProc("SetEvent")
-       procResetEvent                         = modkernel32.NewProc("ResetEvent")
-       procPulseEvent                         = modkernel32.NewProc("PulseEvent")
-       procCreateMutexW                       = modkernel32.NewProc("CreateMutexW")
-       procCreateMutexExW                     = modkernel32.NewProc("CreateMutexExW")
-       procOpenMutexW                         = modkernel32.NewProc("OpenMutexW")
-       procReleaseMutex                       = modkernel32.NewProc("ReleaseMutex")
-       procSleepEx                            = modkernel32.NewProc("SleepEx")
-       procCreateJobObjectW                   = modkernel32.NewProc("CreateJobObjectW")
-       procAssignProcessToJobObject           = modkernel32.NewProc("AssignProcessToJobObject")
-       procTerminateJobObject                 = modkernel32.NewProc("TerminateJobObject")
-       procSetErrorMode                       = modkernel32.NewProc("SetErrorMode")
-       procResumeThread                       = modkernel32.NewProc("ResumeThread")
-       procSetPriorityClass                   = modkernel32.NewProc("SetPriorityClass")
-       procGetPriorityClass                   = modkernel32.NewProc("GetPriorityClass")
-       procSetInformationJobObject            = modkernel32.NewProc("SetInformationJobObject")
-       procGenerateConsoleCtrlEvent           = modkernel32.NewProc("GenerateConsoleCtrlEvent")
-       procGetProcessId                       = modkernel32.NewProc("GetProcessId")
-       procOpenThread                         = modkernel32.NewProc("OpenThread")
-       procSetProcessPriorityBoost            = modkernel32.NewProc("SetProcessPriorityBoost")
-       procDefineDosDeviceW                   = modkernel32.NewProc("DefineDosDeviceW")
-       procDeleteVolumeMountPointW            = modkernel32.NewProc("DeleteVolumeMountPointW")
-       procFindFirstVolumeW                   = modkernel32.NewProc("FindFirstVolumeW")
-       procFindFirstVolumeMountPointW         = modkernel32.NewProc("FindFirstVolumeMountPointW")
-       procFindNextVolumeW                    = modkernel32.NewProc("FindNextVolumeW")
-       procFindNextVolumeMountPointW          = modkernel32.NewProc("FindNextVolumeMountPointW")
-       procFindVolumeClose                    = modkernel32.NewProc("FindVolumeClose")
-       procFindVolumeMountPointClose          = modkernel32.NewProc("FindVolumeMountPointClose")
-       procGetDriveTypeW                      = modkernel32.NewProc("GetDriveTypeW")
-       procGetLogicalDrives                   = modkernel32.NewProc("GetLogicalDrives")
-       procGetLogicalDriveStringsW            = modkernel32.NewProc("GetLogicalDriveStringsW")
-       procGetVolumeInformationW              = modkernel32.NewProc("GetVolumeInformationW")
-       procGetVolumeInformationByHandleW      = modkernel32.NewProc("GetVolumeInformationByHandleW")
-       procGetVolumeNameForVolumeMountPointW  = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW")
-       procGetVolumePathNameW                 = modkernel32.NewProc("GetVolumePathNameW")
-       procGetVolumePathNamesForVolumeNameW   = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW")
-       procQueryDosDeviceW                    = modkernel32.NewProc("QueryDosDeviceW")
-       procSetVolumeLabelW                    = modkernel32.NewProc("SetVolumeLabelW")
-       procSetVolumeMountPointW               = modkernel32.NewProc("SetVolumeMountPointW")
-       procMessageBoxW                        = moduser32.NewProc("MessageBoxW")
-       procCLSIDFromString                    = modole32.NewProc("CLSIDFromString")
-       procStringFromGUID2                    = modole32.NewProc("StringFromGUID2")
-       procCoCreateGuid                       = modole32.NewProc("CoCreateGuid")
-       procCoTaskMemFree                      = modole32.NewProc("CoTaskMemFree")
-       procRtlGetVersion                      = modntdll.NewProc("RtlGetVersion")
-       procRtlGetNtVersionNumbers             = modntdll.NewProc("RtlGetNtVersionNumbers")
-       procWSAStartup                         = modws2_32.NewProc("WSAStartup")
-       procWSACleanup                         = modws2_32.NewProc("WSACleanup")
-       procWSAIoctl                           = modws2_32.NewProc("WSAIoctl")
-       procsocket                             = modws2_32.NewProc("socket")
-       procsetsockopt                         = modws2_32.NewProc("setsockopt")
-       procgetsockopt                         = modws2_32.NewProc("getsockopt")
-       procbind                               = modws2_32.NewProc("bind")
-       procconnect                            = modws2_32.NewProc("connect")
-       procgetsockname                        = modws2_32.NewProc("getsockname")
-       procgetpeername                        = modws2_32.NewProc("getpeername")
-       proclisten                             = modws2_32.NewProc("listen")
-       procshutdown                           = modws2_32.NewProc("shutdown")
-       procclosesocket                        = modws2_32.NewProc("closesocket")
-       procAcceptEx                           = modmswsock.NewProc("AcceptEx")
-       procGetAcceptExSockaddrs               = modmswsock.NewProc("GetAcceptExSockaddrs")
-       procWSARecv                            = modws2_32.NewProc("WSARecv")
-       procWSASend                            = modws2_32.NewProc("WSASend")
-       procWSARecvFrom                        = modws2_32.NewProc("WSARecvFrom")
-       procWSASendTo                          = modws2_32.NewProc("WSASendTo")
-       procgethostbyname                      = modws2_32.NewProc("gethostbyname")
-       procgetservbyname                      = modws2_32.NewProc("getservbyname")
-       procntohs                              = modws2_32.NewProc("ntohs")
-       procgetprotobyname                     = modws2_32.NewProc("getprotobyname")
-       procDnsQuery_W                         = moddnsapi.NewProc("DnsQuery_W")
-       procDnsRecordListFree                  = moddnsapi.NewProc("DnsRecordListFree")
-       procDnsNameCompare_W                   = moddnsapi.NewProc("DnsNameCompare_W")
-       procGetAddrInfoW                       = modws2_32.NewProc("GetAddrInfoW")
-       procFreeAddrInfoW                      = modws2_32.NewProc("FreeAddrInfoW")
-       procGetIfEntry                         = modiphlpapi.NewProc("GetIfEntry")
-       procGetAdaptersInfo                    = modiphlpapi.NewProc("GetAdaptersInfo")
-       procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes")
-       procWSAEnumProtocolsW                  = modws2_32.NewProc("WSAEnumProtocolsW")
-       procGetAdaptersAddresses               = modiphlpapi.NewProc("GetAdaptersAddresses")
-       procGetACP                             = modkernel32.NewProc("GetACP")
-       procMultiByteToWideChar                = modkernel32.NewProc("MultiByteToWideChar")
-       procTranslateNameW                     = modsecur32.NewProc("TranslateNameW")
-       procGetUserNameExW                     = modsecur32.NewProc("GetUserNameExW")
-       procNetUserGetInfo                     = modnetapi32.NewProc("NetUserGetInfo")
-       procNetGetJoinInformation              = modnetapi32.NewProc("NetGetJoinInformation")
-       procNetApiBufferFree                   = modnetapi32.NewProc("NetApiBufferFree")
-       procLookupAccountSidW                  = modadvapi32.NewProc("LookupAccountSidW")
-       procLookupAccountNameW                 = modadvapi32.NewProc("LookupAccountNameW")
-       procConvertSidToStringSidW             = modadvapi32.NewProc("ConvertSidToStringSidW")
-       procConvertStringSidToSidW             = modadvapi32.NewProc("ConvertStringSidToSidW")
-       procGetLengthSid                       = modadvapi32.NewProc("GetLengthSid")
-       procCopySid                            = modadvapi32.NewProc("CopySid")
-       procAllocateAndInitializeSid           = modadvapi32.NewProc("AllocateAndInitializeSid")
-       procCreateWellKnownSid                 = modadvapi32.NewProc("CreateWellKnownSid")
-       procIsWellKnownSid                     = modadvapi32.NewProc("IsWellKnownSid")
-       procFreeSid                            = modadvapi32.NewProc("FreeSid")
-       procEqualSid                           = modadvapi32.NewProc("EqualSid")
-       procGetSidIdentifierAuthority          = modadvapi32.NewProc("GetSidIdentifierAuthority")
-       procGetSidSubAuthorityCount            = modadvapi32.NewProc("GetSidSubAuthorityCount")
-       procGetSidSubAuthority                 = modadvapi32.NewProc("GetSidSubAuthority")
-       procIsValidSid                         = modadvapi32.NewProc("IsValidSid")
-       procCheckTokenMembership               = modadvapi32.NewProc("CheckTokenMembership")
-       procOpenProcessToken                   = modadvapi32.NewProc("OpenProcessToken")
-       procOpenThreadToken                    = modadvapi32.NewProc("OpenThreadToken")
-       procImpersonateSelf                    = modadvapi32.NewProc("ImpersonateSelf")
-       procRevertToSelf                       = modadvapi32.NewProc("RevertToSelf")
-       procSetThreadToken                     = modadvapi32.NewProc("SetThreadToken")
-       procLookupPrivilegeValueW              = modadvapi32.NewProc("LookupPrivilegeValueW")
-       procAdjustTokenPrivileges              = modadvapi32.NewProc("AdjustTokenPrivileges")
-       procAdjustTokenGroups                  = modadvapi32.NewProc("AdjustTokenGroups")
-       procGetTokenInformation                = modadvapi32.NewProc("GetTokenInformation")
-       procSetTokenInformation                = modadvapi32.NewProc("SetTokenInformation")
-       procDuplicateTokenEx                   = modadvapi32.NewProc("DuplicateTokenEx")
-       procGetUserProfileDirectoryW           = moduserenv.NewProc("GetUserProfileDirectoryW")
-       procGetSystemDirectoryW                = modkernel32.NewProc("GetSystemDirectoryW")
-       procGetWindowsDirectoryW               = modkernel32.NewProc("GetWindowsDirectoryW")
-       procGetSystemWindowsDirectoryW         = modkernel32.NewProc("GetSystemWindowsDirectoryW")
-       procWTSQueryUserToken                  = modwtsapi32.NewProc("WTSQueryUserToken")
-       procWTSEnumerateSessionsW              = modwtsapi32.NewProc("WTSEnumerateSessionsW")
-       procWTSFreeMemory                      = modwtsapi32.NewProc("WTSFreeMemory")
+       procRegisterEventSourceW                                 = modadvapi32.NewProc("RegisterEventSourceW")
+       procDeregisterEventSource                                = modadvapi32.NewProc("DeregisterEventSource")
+       procReportEventW                                         = modadvapi32.NewProc("ReportEventW")
+       procOpenSCManagerW                                       = modadvapi32.NewProc("OpenSCManagerW")
+       procCloseServiceHandle                                   = modadvapi32.NewProc("CloseServiceHandle")
+       procCreateServiceW                                       = modadvapi32.NewProc("CreateServiceW")
+       procOpenServiceW                                         = modadvapi32.NewProc("OpenServiceW")
+       procDeleteService                                        = modadvapi32.NewProc("DeleteService")
+       procStartServiceW                                        = modadvapi32.NewProc("StartServiceW")
+       procQueryServiceStatus                                   = modadvapi32.NewProc("QueryServiceStatus")
+       procQueryServiceLockStatusW                              = modadvapi32.NewProc("QueryServiceLockStatusW")
+       procControlService                                       = modadvapi32.NewProc("ControlService")
+       procStartServiceCtrlDispatcherW                          = modadvapi32.NewProc("StartServiceCtrlDispatcherW")
+       procSetServiceStatus                                     = modadvapi32.NewProc("SetServiceStatus")
+       procChangeServiceConfigW                                 = modadvapi32.NewProc("ChangeServiceConfigW")
+       procQueryServiceConfigW                                  = modadvapi32.NewProc("QueryServiceConfigW")
+       procChangeServiceConfig2W                                = modadvapi32.NewProc("ChangeServiceConfig2W")
+       procQueryServiceConfig2W                                 = modadvapi32.NewProc("QueryServiceConfig2W")
+       procEnumServicesStatusExW                                = modadvapi32.NewProc("EnumServicesStatusExW")
+       procQueryServiceStatusEx                                 = modadvapi32.NewProc("QueryServiceStatusEx")
+       procNotifyServiceStatusChangeW                           = modadvapi32.NewProc("NotifyServiceStatusChangeW")
+       procGetLastError                                         = modkernel32.NewProc("GetLastError")
+       procLoadLibraryW                                         = modkernel32.NewProc("LoadLibraryW")
+       procLoadLibraryExW                                       = modkernel32.NewProc("LoadLibraryExW")
+       procFreeLibrary                                          = modkernel32.NewProc("FreeLibrary")
+       procGetProcAddress                                       = modkernel32.NewProc("GetProcAddress")
+       procGetModuleFileNameW                                   = modkernel32.NewProc("GetModuleFileNameW")
+       procGetModuleHandleExW                                   = modkernel32.NewProc("GetModuleHandleExW")
+       procGetVersion                                           = modkernel32.NewProc("GetVersion")
+       procFormatMessageW                                       = modkernel32.NewProc("FormatMessageW")
+       procExitProcess                                          = modkernel32.NewProc("ExitProcess")
+       procIsWow64Process                                       = modkernel32.NewProc("IsWow64Process")
+       procCreateFileW                                          = modkernel32.NewProc("CreateFileW")
+       procReadFile                                             = modkernel32.NewProc("ReadFile")
+       procWriteFile                                            = modkernel32.NewProc("WriteFile")
+       procGetOverlappedResult                                  = modkernel32.NewProc("GetOverlappedResult")
+       procSetFilePointer                                       = modkernel32.NewProc("SetFilePointer")
+       procCloseHandle                                          = modkernel32.NewProc("CloseHandle")
+       procGetStdHandle                                         = modkernel32.NewProc("GetStdHandle")
+       procSetStdHandle                                         = modkernel32.NewProc("SetStdHandle")
+       procFindFirstFileW                                       = modkernel32.NewProc("FindFirstFileW")
+       procFindNextFileW                                        = modkernel32.NewProc("FindNextFileW")
+       procFindClose                                            = modkernel32.NewProc("FindClose")
+       procGetFileInformationByHandle                           = modkernel32.NewProc("GetFileInformationByHandle")
+       procGetFileInformationByHandleEx                         = modkernel32.NewProc("GetFileInformationByHandleEx")
+       procGetCurrentDirectoryW                                 = modkernel32.NewProc("GetCurrentDirectoryW")
+       procSetCurrentDirectoryW                                 = modkernel32.NewProc("SetCurrentDirectoryW")
+       procCreateDirectoryW                                     = modkernel32.NewProc("CreateDirectoryW")
+       procRemoveDirectoryW                                     = modkernel32.NewProc("RemoveDirectoryW")
+       procDeleteFileW                                          = modkernel32.NewProc("DeleteFileW")
+       procMoveFileW                                            = modkernel32.NewProc("MoveFileW")
+       procMoveFileExW                                          = modkernel32.NewProc("MoveFileExW")
+       procLockFileEx                                           = modkernel32.NewProc("LockFileEx")
+       procUnlockFileEx                                         = modkernel32.NewProc("UnlockFileEx")
+       procGetComputerNameW                                     = modkernel32.NewProc("GetComputerNameW")
+       procGetComputerNameExW                                   = modkernel32.NewProc("GetComputerNameExW")
+       procSetEndOfFile                                         = modkernel32.NewProc("SetEndOfFile")
+       procGetSystemTimeAsFileTime                              = modkernel32.NewProc("GetSystemTimeAsFileTime")
+       procGetSystemTimePreciseAsFileTime                       = modkernel32.NewProc("GetSystemTimePreciseAsFileTime")
+       procGetTimeZoneInformation                               = modkernel32.NewProc("GetTimeZoneInformation")
+       procCreateIoCompletionPort                               = modkernel32.NewProc("CreateIoCompletionPort")
+       procGetQueuedCompletionStatus                            = modkernel32.NewProc("GetQueuedCompletionStatus")
+       procPostQueuedCompletionStatus                           = modkernel32.NewProc("PostQueuedCompletionStatus")
+       procCancelIo                                             = modkernel32.NewProc("CancelIo")
+       procCancelIoEx                                           = modkernel32.NewProc("CancelIoEx")
+       procCreateProcessW                                       = modkernel32.NewProc("CreateProcessW")
+       procOpenProcess                                          = modkernel32.NewProc("OpenProcess")
+       procShellExecuteW                                        = modshell32.NewProc("ShellExecuteW")
+       procSHGetKnownFolderPath                                 = modshell32.NewProc("SHGetKnownFolderPath")
+       procTerminateProcess                                     = modkernel32.NewProc("TerminateProcess")
+       procGetExitCodeProcess                                   = modkernel32.NewProc("GetExitCodeProcess")
+       procGetStartupInfoW                                      = modkernel32.NewProc("GetStartupInfoW")
+       procGetProcessTimes                                      = modkernel32.NewProc("GetProcessTimes")
+       procDuplicateHandle                                      = modkernel32.NewProc("DuplicateHandle")
+       procWaitForSingleObject                                  = modkernel32.NewProc("WaitForSingleObject")
+       procWaitForMultipleObjects                               = modkernel32.NewProc("WaitForMultipleObjects")
+       procGetTempPathW                                         = modkernel32.NewProc("GetTempPathW")
+       procCreatePipe                                           = modkernel32.NewProc("CreatePipe")
+       procGetFileType                                          = modkernel32.NewProc("GetFileType")
+       procCryptAcquireContextW                                 = modadvapi32.NewProc("CryptAcquireContextW")
+       procCryptReleaseContext                                  = modadvapi32.NewProc("CryptReleaseContext")
+       procCryptGenRandom                                       = modadvapi32.NewProc("CryptGenRandom")
+       procGetEnvironmentStringsW                               = modkernel32.NewProc("GetEnvironmentStringsW")
+       procFreeEnvironmentStringsW                              = modkernel32.NewProc("FreeEnvironmentStringsW")
+       procGetEnvironmentVariableW                              = modkernel32.NewProc("GetEnvironmentVariableW")
+       procSetEnvironmentVariableW                              = modkernel32.NewProc("SetEnvironmentVariableW")
+       procCreateEnvironmentBlock                               = moduserenv.NewProc("CreateEnvironmentBlock")
+       procDestroyEnvironmentBlock                              = moduserenv.NewProc("DestroyEnvironmentBlock")
+       procGetTickCount64                                       = modkernel32.NewProc("GetTickCount64")
+       procSetFileTime                                          = modkernel32.NewProc("SetFileTime")
+       procGetFileAttributesW                                   = modkernel32.NewProc("GetFileAttributesW")
+       procSetFileAttributesW                                   = modkernel32.NewProc("SetFileAttributesW")
+       procGetFileAttributesExW                                 = modkernel32.NewProc("GetFileAttributesExW")
+       procGetCommandLineW                                      = modkernel32.NewProc("GetCommandLineW")
+       procCommandLineToArgvW                                   = modshell32.NewProc("CommandLineToArgvW")
+       procLocalFree                                            = modkernel32.NewProc("LocalFree")
+       procSetHandleInformation                                 = modkernel32.NewProc("SetHandleInformation")
+       procFlushFileBuffers                                     = modkernel32.NewProc("FlushFileBuffers")
+       procGetFullPathNameW                                     = modkernel32.NewProc("GetFullPathNameW")
+       procGetLongPathNameW                                     = modkernel32.NewProc("GetLongPathNameW")
+       procGetShortPathNameW                                    = modkernel32.NewProc("GetShortPathNameW")
+       procCreateFileMappingW                                   = modkernel32.NewProc("CreateFileMappingW")
+       procMapViewOfFile                                        = modkernel32.NewProc("MapViewOfFile")
+       procUnmapViewOfFile                                      = modkernel32.NewProc("UnmapViewOfFile")
+       procFlushViewOfFile                                      = modkernel32.NewProc("FlushViewOfFile")
+       procVirtualLock                                          = modkernel32.NewProc("VirtualLock")
+       procVirtualUnlock                                        = modkernel32.NewProc("VirtualUnlock")
+       procVirtualAlloc                                         = modkernel32.NewProc("VirtualAlloc")
+       procVirtualFree                                          = modkernel32.NewProc("VirtualFree")
+       procVirtualProtect                                       = modkernel32.NewProc("VirtualProtect")
+       procTransmitFile                                         = modmswsock.NewProc("TransmitFile")
+       procReadDirectoryChangesW                                = modkernel32.NewProc("ReadDirectoryChangesW")
+       procCertOpenSystemStoreW                                 = modcrypt32.NewProc("CertOpenSystemStoreW")
+       procCertOpenStore                                        = modcrypt32.NewProc("CertOpenStore")
+       procCertEnumCertificatesInStore                          = modcrypt32.NewProc("CertEnumCertificatesInStore")
+       procCertAddCertificateContextToStore                     = modcrypt32.NewProc("CertAddCertificateContextToStore")
+       procCertCloseStore                                       = modcrypt32.NewProc("CertCloseStore")
+       procCertGetCertificateChain                              = modcrypt32.NewProc("CertGetCertificateChain")
+       procCertFreeCertificateChain                             = modcrypt32.NewProc("CertFreeCertificateChain")
+       procCertCreateCertificateContext                         = modcrypt32.NewProc("CertCreateCertificateContext")
+       procCertFreeCertificateContext                           = modcrypt32.NewProc("CertFreeCertificateContext")
+       procCertVerifyCertificateChainPolicy                     = modcrypt32.NewProc("CertVerifyCertificateChainPolicy")
+       procRegOpenKeyExW                                        = modadvapi32.NewProc("RegOpenKeyExW")
+       procRegCloseKey                                          = modadvapi32.NewProc("RegCloseKey")
+       procRegQueryInfoKeyW                                     = modadvapi32.NewProc("RegQueryInfoKeyW")
+       procRegEnumKeyExW                                        = modadvapi32.NewProc("RegEnumKeyExW")
+       procRegQueryValueExW                                     = modadvapi32.NewProc("RegQueryValueExW")
+       procGetCurrentProcessId                                  = modkernel32.NewProc("GetCurrentProcessId")
+       procGetConsoleMode                                       = modkernel32.NewProc("GetConsoleMode")
+       procSetConsoleMode                                       = modkernel32.NewProc("SetConsoleMode")
+       procGetConsoleScreenBufferInfo                           = modkernel32.NewProc("GetConsoleScreenBufferInfo")
+       procWriteConsoleW                                        = modkernel32.NewProc("WriteConsoleW")
+       procReadConsoleW                                         = modkernel32.NewProc("ReadConsoleW")
+       procCreateToolhelp32Snapshot                             = modkernel32.NewProc("CreateToolhelp32Snapshot")
+       procProcess32FirstW                                      = modkernel32.NewProc("Process32FirstW")
+       procProcess32NextW                                       = modkernel32.NewProc("Process32NextW")
+       procThread32First                                        = modkernel32.NewProc("Thread32First")
+       procThread32Next                                         = modkernel32.NewProc("Thread32Next")
+       procDeviceIoControl                                      = modkernel32.NewProc("DeviceIoControl")
+       procCreateSymbolicLinkW                                  = modkernel32.NewProc("CreateSymbolicLinkW")
+       procCreateHardLinkW                                      = modkernel32.NewProc("CreateHardLinkW")
+       procGetCurrentThreadId                                   = modkernel32.NewProc("GetCurrentThreadId")
+       procCreateEventW                                         = modkernel32.NewProc("CreateEventW")
+       procCreateEventExW                                       = modkernel32.NewProc("CreateEventExW")
+       procOpenEventW                                           = modkernel32.NewProc("OpenEventW")
+       procSetEvent                                             = modkernel32.NewProc("SetEvent")
+       procResetEvent                                           = modkernel32.NewProc("ResetEvent")
+       procPulseEvent                                           = modkernel32.NewProc("PulseEvent")
+       procCreateMutexW                                         = modkernel32.NewProc("CreateMutexW")
+       procCreateMutexExW                                       = modkernel32.NewProc("CreateMutexExW")
+       procOpenMutexW                                           = modkernel32.NewProc("OpenMutexW")
+       procReleaseMutex                                         = modkernel32.NewProc("ReleaseMutex")
+       procSleepEx                                              = modkernel32.NewProc("SleepEx")
+       procCreateJobObjectW                                     = modkernel32.NewProc("CreateJobObjectW")
+       procAssignProcessToJobObject                             = modkernel32.NewProc("AssignProcessToJobObject")
+       procTerminateJobObject                                   = modkernel32.NewProc("TerminateJobObject")
+       procSetErrorMode                                         = modkernel32.NewProc("SetErrorMode")
+       procResumeThread                                         = modkernel32.NewProc("ResumeThread")
+       procSetPriorityClass                                     = modkernel32.NewProc("SetPriorityClass")
+       procGetPriorityClass                                     = modkernel32.NewProc("GetPriorityClass")
+       procSetInformationJobObject                              = modkernel32.NewProc("SetInformationJobObject")
+       procGenerateConsoleCtrlEvent                             = modkernel32.NewProc("GenerateConsoleCtrlEvent")
+       procGetProcessId                                         = modkernel32.NewProc("GetProcessId")
+       procOpenThread                                           = modkernel32.NewProc("OpenThread")
+       procSetProcessPriorityBoost                              = modkernel32.NewProc("SetProcessPriorityBoost")
+       procDefineDosDeviceW                                     = modkernel32.NewProc("DefineDosDeviceW")
+       procDeleteVolumeMountPointW                              = modkernel32.NewProc("DeleteVolumeMountPointW")
+       procFindFirstVolumeW                                     = modkernel32.NewProc("FindFirstVolumeW")
+       procFindFirstVolumeMountPointW                           = modkernel32.NewProc("FindFirstVolumeMountPointW")
+       procFindNextVolumeW                                      = modkernel32.NewProc("FindNextVolumeW")
+       procFindNextVolumeMountPointW                            = modkernel32.NewProc("FindNextVolumeMountPointW")
+       procFindVolumeClose                                      = modkernel32.NewProc("FindVolumeClose")
+       procFindVolumeMountPointClose                            = modkernel32.NewProc("FindVolumeMountPointClose")
+       procGetDiskFreeSpaceExW                                  = modkernel32.NewProc("GetDiskFreeSpaceExW")
+       procGetDriveTypeW                                        = modkernel32.NewProc("GetDriveTypeW")
+       procGetLogicalDrives                                     = modkernel32.NewProc("GetLogicalDrives")
+       procGetLogicalDriveStringsW                              = modkernel32.NewProc("GetLogicalDriveStringsW")
+       procGetVolumeInformationW                                = modkernel32.NewProc("GetVolumeInformationW")
+       procGetVolumeInformationByHandleW                        = modkernel32.NewProc("GetVolumeInformationByHandleW")
+       procGetVolumeNameForVolumeMountPointW                    = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW")
+       procGetVolumePathNameW                                   = modkernel32.NewProc("GetVolumePathNameW")
+       procGetVolumePathNamesForVolumeNameW                     = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW")
+       procQueryDosDeviceW                                      = modkernel32.NewProc("QueryDosDeviceW")
+       procSetVolumeLabelW                                      = modkernel32.NewProc("SetVolumeLabelW")
+       procSetVolumeMountPointW                                 = modkernel32.NewProc("SetVolumeMountPointW")
+       procMessageBoxW                                          = moduser32.NewProc("MessageBoxW")
+       procExitWindowsEx                                        = moduser32.NewProc("ExitWindowsEx")
+       procInitiateSystemShutdownExW                            = modadvapi32.NewProc("InitiateSystemShutdownExW")
+       procSetProcessShutdownParameters                         = modkernel32.NewProc("SetProcessShutdownParameters")
+       procGetProcessShutdownParameters                         = modkernel32.NewProc("GetProcessShutdownParameters")
+       procCLSIDFromString                                      = modole32.NewProc("CLSIDFromString")
+       procStringFromGUID2                                      = modole32.NewProc("StringFromGUID2")
+       procCoCreateGuid                                         = modole32.NewProc("CoCreateGuid")
+       procCoTaskMemFree                                        = modole32.NewProc("CoTaskMemFree")
+       procRtlGetVersion                                        = modntdll.NewProc("RtlGetVersion")
+       procRtlGetNtVersionNumbers                               = modntdll.NewProc("RtlGetNtVersionNumbers")
+       procWSAStartup                                           = modws2_32.NewProc("WSAStartup")
+       procWSACleanup                                           = modws2_32.NewProc("WSACleanup")
+       procWSAIoctl                                             = modws2_32.NewProc("WSAIoctl")
+       procsocket                                               = modws2_32.NewProc("socket")
+       procsetsockopt                                           = modws2_32.NewProc("setsockopt")
+       procgetsockopt                                           = modws2_32.NewProc("getsockopt")
+       procbind                                                 = modws2_32.NewProc("bind")
+       procconnect                                              = modws2_32.NewProc("connect")
+       procgetsockname                                          = modws2_32.NewProc("getsockname")
+       procgetpeername                                          = modws2_32.NewProc("getpeername")
+       proclisten                                               = modws2_32.NewProc("listen")
+       procshutdown                                             = modws2_32.NewProc("shutdown")
+       procclosesocket                                          = modws2_32.NewProc("closesocket")
+       procAcceptEx                                             = modmswsock.NewProc("AcceptEx")
+       procGetAcceptExSockaddrs                                 = modmswsock.NewProc("GetAcceptExSockaddrs")
+       procWSARecv                                              = modws2_32.NewProc("WSARecv")
+       procWSASend                                              = modws2_32.NewProc("WSASend")
+       procWSARecvFrom                                          = modws2_32.NewProc("WSARecvFrom")
+       procWSASendTo                                            = modws2_32.NewProc("WSASendTo")
+       procgethostbyname                                        = modws2_32.NewProc("gethostbyname")
+       procgetservbyname                                        = modws2_32.NewProc("getservbyname")
+       procntohs                                                = modws2_32.NewProc("ntohs")
+       procgetprotobyname                                       = modws2_32.NewProc("getprotobyname")
+       procDnsQuery_W                                           = moddnsapi.NewProc("DnsQuery_W")
+       procDnsRecordListFree                                    = moddnsapi.NewProc("DnsRecordListFree")
+       procDnsNameCompare_W                                     = moddnsapi.NewProc("DnsNameCompare_W")
+       procGetAddrInfoW                                         = modws2_32.NewProc("GetAddrInfoW")
+       procFreeAddrInfoW                                        = modws2_32.NewProc("FreeAddrInfoW")
+       procGetIfEntry                                           = modiphlpapi.NewProc("GetIfEntry")
+       procGetAdaptersInfo                                      = modiphlpapi.NewProc("GetAdaptersInfo")
+       procSetFileCompletionNotificationModes                   = modkernel32.NewProc("SetFileCompletionNotificationModes")
+       procWSAEnumProtocolsW                                    = modws2_32.NewProc("WSAEnumProtocolsW")
+       procGetAdaptersAddresses                                 = modiphlpapi.NewProc("GetAdaptersAddresses")
+       procGetACP                                               = modkernel32.NewProc("GetACP")
+       procMultiByteToWideChar                                  = modkernel32.NewProc("MultiByteToWideChar")
+       procTranslateNameW                                       = modsecur32.NewProc("TranslateNameW")
+       procGetUserNameExW                                       = modsecur32.NewProc("GetUserNameExW")
+       procNetUserGetInfo                                       = modnetapi32.NewProc("NetUserGetInfo")
+       procNetGetJoinInformation                                = modnetapi32.NewProc("NetGetJoinInformation")
+       procNetApiBufferFree                                     = modnetapi32.NewProc("NetApiBufferFree")
+       procLookupAccountSidW                                    = modadvapi32.NewProc("LookupAccountSidW")
+       procLookupAccountNameW                                   = modadvapi32.NewProc("LookupAccountNameW")
+       procConvertSidToStringSidW                               = modadvapi32.NewProc("ConvertSidToStringSidW")
+       procConvertStringSidToSidW                               = modadvapi32.NewProc("ConvertStringSidToSidW")
+       procGetLengthSid                                         = modadvapi32.NewProc("GetLengthSid")
+       procCopySid                                              = modadvapi32.NewProc("CopySid")
+       procAllocateAndInitializeSid                             = modadvapi32.NewProc("AllocateAndInitializeSid")
+       procCreateWellKnownSid                                   = modadvapi32.NewProc("CreateWellKnownSid")
+       procIsWellKnownSid                                       = modadvapi32.NewProc("IsWellKnownSid")
+       procFreeSid                                              = modadvapi32.NewProc("FreeSid")
+       procEqualSid                                             = modadvapi32.NewProc("EqualSid")
+       procGetSidIdentifierAuthority                            = modadvapi32.NewProc("GetSidIdentifierAuthority")
+       procGetSidSubAuthorityCount                              = modadvapi32.NewProc("GetSidSubAuthorityCount")
+       procGetSidSubAuthority                                   = modadvapi32.NewProc("GetSidSubAuthority")
+       procIsValidSid                                           = modadvapi32.NewProc("IsValidSid")
+       procCheckTokenMembership                                 = modadvapi32.NewProc("CheckTokenMembership")
+       procOpenProcessToken                                     = modadvapi32.NewProc("OpenProcessToken")
+       procOpenThreadToken                                      = modadvapi32.NewProc("OpenThreadToken")
+       procImpersonateSelf                                      = modadvapi32.NewProc("ImpersonateSelf")
+       procRevertToSelf                                         = modadvapi32.NewProc("RevertToSelf")
+       procSetThreadToken                                       = modadvapi32.NewProc("SetThreadToken")
+       procLookupPrivilegeValueW                                = modadvapi32.NewProc("LookupPrivilegeValueW")
+       procAdjustTokenPrivileges                                = modadvapi32.NewProc("AdjustTokenPrivileges")
+       procAdjustTokenGroups                                    = modadvapi32.NewProc("AdjustTokenGroups")
+       procGetTokenInformation                                  = modadvapi32.NewProc("GetTokenInformation")
+       procSetTokenInformation                                  = modadvapi32.NewProc("SetTokenInformation")
+       procDuplicateTokenEx                                     = modadvapi32.NewProc("DuplicateTokenEx")
+       procGetUserProfileDirectoryW                             = moduserenv.NewProc("GetUserProfileDirectoryW")
+       procGetSystemDirectoryW                                  = modkernel32.NewProc("GetSystemDirectoryW")
+       procGetWindowsDirectoryW                                 = modkernel32.NewProc("GetWindowsDirectoryW")
+       procGetSystemWindowsDirectoryW                           = modkernel32.NewProc("GetSystemWindowsDirectoryW")
+       procWTSQueryUserToken                                    = modwtsapi32.NewProc("WTSQueryUserToken")
+       procWTSEnumerateSessionsW                                = modwtsapi32.NewProc("WTSEnumerateSessionsW")
+       procWTSFreeMemory                                        = modwtsapi32.NewProc("WTSFreeMemory")
+       procGetSecurityInfo                                      = modadvapi32.NewProc("GetSecurityInfo")
+       procSetSecurityInfo                                      = modadvapi32.NewProc("SetSecurityInfo")
+       procGetNamedSecurityInfoW                                = modadvapi32.NewProc("GetNamedSecurityInfoW")
+       procSetNamedSecurityInfoW                                = modadvapi32.NewProc("SetNamedSecurityInfoW")
+       procBuildSecurityDescriptorW                             = modadvapi32.NewProc("BuildSecurityDescriptorW")
+       procInitializeSecurityDescriptor                         = modadvapi32.NewProc("InitializeSecurityDescriptor")
+       procGetSecurityDescriptorControl                         = modadvapi32.NewProc("GetSecurityDescriptorControl")
+       procGetSecurityDescriptorDacl                            = modadvapi32.NewProc("GetSecurityDescriptorDacl")
+       procGetSecurityDescriptorSacl                            = modadvapi32.NewProc("GetSecurityDescriptorSacl")
+       procGetSecurityDescriptorOwner                           = modadvapi32.NewProc("GetSecurityDescriptorOwner")
+       procGetSecurityDescriptorGroup                           = modadvapi32.NewProc("GetSecurityDescriptorGroup")
+       procGetSecurityDescriptorLength                          = modadvapi32.NewProc("GetSecurityDescriptorLength")
+       procGetSecurityDescriptorRMControl                       = modadvapi32.NewProc("GetSecurityDescriptorRMControl")
+       procIsValidSecurityDescriptor                            = modadvapi32.NewProc("IsValidSecurityDescriptor")
+       procSetSecurityDescriptorControl                         = modadvapi32.NewProc("SetSecurityDescriptorControl")
+       procSetSecurityDescriptorDacl                            = modadvapi32.NewProc("SetSecurityDescriptorDacl")
+       procSetSecurityDescriptorSacl                            = modadvapi32.NewProc("SetSecurityDescriptorSacl")
+       procSetSecurityDescriptorOwner                           = modadvapi32.NewProc("SetSecurityDescriptorOwner")
+       procSetSecurityDescriptorGroup                           = modadvapi32.NewProc("SetSecurityDescriptorGroup")
+       procSetSecurityDescriptorRMControl                       = modadvapi32.NewProc("SetSecurityDescriptorRMControl")
+       procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW")
+       procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW")
+       procMakeAbsoluteSD                                       = modadvapi32.NewProc("MakeAbsoluteSD")
+       procMakeSelfRelativeSD                                   = modadvapi32.NewProc("MakeSelfRelativeSD")
+       procSetEntriesInAclW                                     = modadvapi32.NewProc("SetEntriesInAclW")
 )
 
 func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) {
@@ -654,6 +686,31 @@ func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) {
        return
 }
 
+func GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) {
+       r0, _, e1 := syscall.Syscall(procGetModuleFileNameW.Addr(), 3, uintptr(module), uintptr(unsafe.Pointer(filename)), uintptr(size))
+       n = uint32(r0)
+       if n == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetModuleHandleExW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(moduleName)), uintptr(unsafe.Pointer(module)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func GetVersion() (ver uint32, err error) {
        r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0)
        ver = uint32(r0)
@@ -690,7 +747,14 @@ func ExitProcess(exitcode uint32) {
 }
 
 func IsWow64Process(handle Handle, isWow64 *bool) (err error) {
-       r1, _, e1 := syscall.Syscall(procIsWow64Process.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(isWow64)), 0)
+       var _p0 uint32
+       if *isWow64 {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procIsWow64Process.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(&_p0)), 0)
+       *isWow64 = _p0 != 0
        if r1 == 0 {
                if e1 != 0 {
                        err = errnoErr(e1)
@@ -960,6 +1024,30 @@ func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) {
        return
 }
 
+func LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(file), uintptr(flags), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall6(procUnlockFileEx.Addr(), 5, uintptr(file), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func GetComputerName(buf *uint16, n *uint32) (err error) {
        r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0)
        if r1 == 0 {
@@ -1119,7 +1207,7 @@ func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (ha
 
 func ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) {
        r1, _, e1 := syscall.Syscall6(procShellExecuteW.Addr(), 6, uintptr(hwnd), uintptr(unsafe.Pointer(verb)), uintptr(unsafe.Pointer(file)), uintptr(unsafe.Pointer(args)), uintptr(unsafe.Pointer(cwd)), uintptr(showCmd))
-       if r1 == 0 {
+       if r1 <= 32 {
                if e1 != 0 {
                        err = errnoErr(e1)
                } else {
@@ -1173,32 +1261,6 @@ func GetStartupInfo(startupInfo *StartupInfo) (err error) {
        return
 }
 
-func GetCurrentProcess() (pseudoHandle Handle, err error) {
-       r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0)
-       pseudoHandle = Handle(r0)
-       if pseudoHandle == 0 {
-               if e1 != 0 {
-                       err = errnoErr(e1)
-               } else {
-                       err = syscall.EINVAL
-               }
-       }
-       return
-}
-
-func GetCurrentThread() (pseudoHandle Handle, err error) {
-       r0, _, e1 := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0)
-       pseudoHandle = Handle(r0)
-       if pseudoHandle == 0 {
-               if e1 != 0 {
-                       err = errnoErr(e1)
-               } else {
-                       err = syscall.EINVAL
-               }
-       }
-       return
-}
-
 func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) {
        r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0)
        if r1 == 0 {
@@ -2442,6 +2504,18 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) {
        return
 }
 
+func GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) {
+       r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailableToCaller)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func GetDriveType(rootPathName *uint16) (driveType uint32) {
        r0, _, _ := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0)
        driveType = uint32(r0)
@@ -2584,6 +2658,66 @@ func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret
        return
 }
 
+func ExitWindowsEx(flags uint32, reason uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procExitWindowsEx.Addr(), 2, uintptr(flags), uintptr(reason), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) {
+       var _p0 uint32
+       if forceAppsClosed {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       var _p1 uint32
+       if rebootAfterShutdown {
+               _p1 = 1
+       } else {
+               _p1 = 0
+       }
+       r1, _, e1 := syscall.Syscall6(procInitiateSystemShutdownExW.Addr(), 6, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(message)), uintptr(timeout), uintptr(_p0), uintptr(_p1), uintptr(reason))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func SetProcessShutdownParameters(level uint32, flags uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetProcessShutdownParameters.Addr(), 2, uintptr(level), uintptr(flags), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetProcessShutdownParameters.Addr(), 2, uintptr(unsafe.Pointer(level)), uintptr(unsafe.Pointer(flags)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) {
        r0, _, _ := syscall.Syscall(procCLSIDFromString.Addr(), 2, uintptr(unsafe.Pointer(lpsz)), uintptr(unsafe.Pointer(pclsid)), 0)
        if r0 != 0 {
@@ -3455,3 +3589,358 @@ func WTSFreeMemory(ptr uintptr) {
        syscall.Syscall(procWTSFreeMemory.Addr(), 1, uintptr(ptr), 0, 0)
        return
 }
+
+func getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) {
+       r0, _, _ := syscall.Syscall9(procGetSecurityInfo.Addr(), 8, uintptr(handle), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(sd)), 0)
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
+
+func SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) {
+       syscall.Syscall9(procSetSecurityInfo.Addr(), 7, uintptr(handle), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0)
+       return
+}
+
+func getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) {
+       var _p0 *uint16
+       _p0, ret = syscall.UTF16PtrFromString(objectName)
+       if ret != nil {
+               return
+       }
+       return _getNamedSecurityInfo(_p0, objectType, securityInformation, owner, group, dacl, sacl, sd)
+}
+
+func _getNamedSecurityInfo(objectName *uint16, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) {
+       r0, _, _ := syscall.Syscall9(procGetNamedSecurityInfoW.Addr(), 8, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(sd)), 0)
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
+
+func SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) {
+       var _p0 *uint16
+       _p0, ret = syscall.UTF16PtrFromString(objectName)
+       if ret != nil {
+               return
+       }
+       return _SetNamedSecurityInfo(_p0, objectType, securityInformation, owner, group, dacl, sacl)
+}
+
+func _SetNamedSecurityInfo(objectName *uint16, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) {
+       r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfoW.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0)
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
+
+func buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) {
+       r0, _, _ := syscall.Syscall9(procBuildSecurityDescriptorW.Addr(), 9, uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(countAccessEntries), uintptr(unsafe.Pointer(accessEntries)), uintptr(countAuditEntries), uintptr(unsafe.Pointer(auditEntries)), uintptr(unsafe.Pointer(oldSecurityDescriptor)), uintptr(unsafe.Pointer(sizeNewSecurityDescriptor)), uintptr(unsafe.Pointer(newSecurityDescriptor)))
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
+
+func initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procInitializeSecurityDescriptor.Addr(), 2, uintptr(unsafe.Pointer(absoluteSD)), uintptr(revision), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorControl.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(control)), uintptr(unsafe.Pointer(revision)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) {
+       var _p0 uint32
+       if *daclPresent {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       var _p1 uint32
+       if *daclDefaulted {
+               _p1 = 1
+       } else {
+               _p1 = 0
+       }
+       r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(&_p0)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(&_p1)), 0, 0)
+       *daclPresent = _p0 != 0
+       *daclDefaulted = _p1 != 0
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) {
+       var _p0 uint32
+       if *saclPresent {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       var _p1 uint32
+       if *saclDefaulted {
+               _p1 = 1
+       } else {
+               _p1 = 0
+       }
+       r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorSacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(&_p0)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(&_p1)), 0, 0)
+       *saclPresent = _p0 != 0
+       *saclDefaulted = _p1 != 0
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) {
+       var _p0 uint32
+       if *ownerDefaulted {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorOwner.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(&_p0)))
+       *ownerDefaulted = _p0 != 0
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) {
+       var _p0 uint32
+       if *groupDefaulted {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorGroup.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(&_p0)))
+       *groupDefaulted = _p0 != 0
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) {
+       r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(unsafe.Pointer(sd)), 0, 0)
+       len = uint32(r0)
+       return
+}
+
+func getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) {
+       r0, _, _ := syscall.Syscall(procGetSecurityDescriptorRMControl.Addr(), 2, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(rmControl)), 0)
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
+
+func isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) {
+       r0, _, _ := syscall.Syscall(procIsValidSecurityDescriptor.Addr(), 1, uintptr(unsafe.Pointer(sd)), 0, 0)
+       isValid = r0 != 0
+       return
+}
+
+func setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) {
+       r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorControl.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(controlBitsOfInterest), uintptr(controlBitsToSet))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) {
+       var _p0 uint32
+       if daclPresent {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       var _p1 uint32
+       if daclDefaulted {
+               _p1 = 1
+       } else {
+               _p1 = 0
+       }
+       r1, _, e1 := syscall.Syscall6(procSetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(_p0), uintptr(unsafe.Pointer(dacl)), uintptr(_p1), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) {
+       var _p0 uint32
+       if saclPresent {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       var _p1 uint32
+       if saclDefaulted {
+               _p1 = 1
+       } else {
+               _p1 = 0
+       }
+       r1, _, e1 := syscall.Syscall6(procSetSecurityDescriptorSacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(_p0), uintptr(unsafe.Pointer(sacl)), uintptr(_p1), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) {
+       var _p0 uint32
+       if ownerDefaulted {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorOwner.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(owner)), uintptr(_p0))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) {
+       var _p0 uint32
+       if groupDefaulted {
+               _p0 = 1
+       } else {
+               _p0 = 0
+       }
+       r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorGroup.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(group)), uintptr(_p0))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) {
+       syscall.Syscall(procSetSecurityDescriptorRMControl.Addr(), 2, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(rmControl)), 0)
+       return
+}
+
+func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) {
+       var _p0 *uint16
+       _p0, err = syscall.UTF16PtrFromString(str)
+       if err != nil {
+               return
+       }
+       return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size)
+}
+
+func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(securityInformation), uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(strLen)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall12(procMakeAbsoluteSD.Addr(), 11, uintptr(unsafe.Pointer(selfRelativeSD)), uintptr(unsafe.Pointer(absoluteSD)), uintptr(unsafe.Pointer(absoluteSDSize)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclSize)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(saclSize)), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(ownerSize)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(groupSize)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) {
+       r1, _, e1 := syscall.Syscall(procMakeSelfRelativeSD.Addr(), 3, uintptr(unsafe.Pointer(absoluteSD)), uintptr(unsafe.Pointer(selfRelativeSD)), uintptr(unsafe.Pointer(selfRelativeSDSize)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) {
+       r0, _, _ := syscall.Syscall6(procSetEntriesInAclW.Addr(), 4, uintptr(countExplicitEntries), uintptr(unsafe.Pointer(explicitEntries)), uintptr(unsafe.Pointer(oldACL)), uintptr(unsafe.Pointer(newACL)), 0, 0)
+       if r0 != 0 {
+               ret = syscall.Errno(r0)
+       }
+       return
+}
index bd049267ff50c5b2e5469feaf72912f95b66d6fa..fcd324344410035a1c6d1946aebe51d6c91d1dac 100644 (file)
@@ -358,6 +358,9 @@ github.com/prometheus/common/model
 github.com/prometheus/procfs
 github.com/prometheus/procfs/internal/fs
 github.com/prometheus/procfs/internal/util
+# github.com/quasoft/websspi v1.0.0
+github.com/quasoft/websspi
+github.com/quasoft/websspi/secctx
 # github.com/russross/blackfriday/v2 v2.0.1
 github.com/russross/blackfriday/v2
 # github.com/satori/go.uuid v1.2.0
@@ -477,7 +480,7 @@ golang.org/x/oauth2/google
 golang.org/x/oauth2/internal
 golang.org/x/oauth2/jws
 golang.org/x/oauth2/jwt
-# golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b
+# golang.org/x/sys v0.0.0-20191010194322-b09406accb47
 golang.org/x/sys/cpu
 golang.org/x/sys/unix
 golang.org/x/sys/windows
index 43c4cdc0fedaba30739a458fcbcf1c60d3432cbc..bae1a51731ebb438d68ccde6edd59cd651adb753 100644 (file)
@@ -1754,9 +1754,9 @@ function initAdmin() {
   // New authentication
   if ($('.admin.new.authentication').length > 0) {
     $('#auth_type').change(function () {
-      $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size').hide();
+      $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size .sspi').hide();
 
-      $('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]').removeAttr('required');
+      $('.ldap input[required], .binddnrequired input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required], .sspi input[required]').removeAttr('required');
       $('.binddnrequired').removeClass('required');
 
       const authType = $(this).val();
@@ -1784,6 +1784,10 @@ function initAdmin() {
           $('.oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input').attr('required', 'required');
           onOAuth2Change();
           break;
+        case '7': // SSPI
+          $('.sspi').show();
+          $('.sspi div.required input').attr('required', 'required');
+          break;
       }
       if (authType === '2' || authType === '5') {
         onSecurityProtocolChange();