diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4a44e03a3..15fc41e59 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,8 +8,8 @@ Please explain the changes you made here. - [ ] For all _code_ changes, an entry added to the `CHANGELOG.md` file describing and linking to this PR - [ ] Tests added for new functionality, or regression tests for bug fixes added as applicable -- [ ] For public APIs, new features, etc., PR on - [docs repo](https://github.com/dgraph-io/dgraph-docs) staged and linked here +- [ ] For public APIs, new features, etc., PR on [docs repo](https://github.com/hypermodeinc/docs) + staged and linked here **Instructions** diff --git a/README.md b/README.md index f7ff3b810..38a3711fc 100644 --- a/README.md +++ b/README.md @@ -273,6 +273,10 @@ Below is a list of known projects that use Badger: local metadata KV store implementation - [Goptivum](https://github.com/smegg99/Goptivum) - Goptivum is a better frontend and API for the Vulcan Optivum schedule program +- [ActionManager](https://mftlabs.io/actionmanager) - A dynamic entity manager based on rjsf schema + and badger db +- [MightyMap](https://github.com/thisisdevelopment/mightymap) - Mightymap: Conveys both robustness + and high capability, fitting for a powerful concurrent map. If you are using Badger in a project please send a pull request to add it to the list. diff --git a/SECURITY.md b/SECURITY.md index 240addefa..361a26c09 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,7 +1,7 @@ # Reporting Security Concerns -We take the security of Badger very seriously. If you believe you have found a security vulnerability -in Badger, we encourage you to let us know right away. +We take the security of Badger very seriously. If you believe you have found a security +vulnerability in Badger, we encourage you to let us know right away. We will investigate all legitimate reports and do our best to quickly fix the problem. Please report any issues or vulnerabilities via GitHub Security Advisories instead of posting a public issue in diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 08ea158df..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/public - diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 83641b232..000000000 --- a/docs/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Badger Docs - -If you are looking for Badger's documentation, you might find https://dgraph.io/docs/badger much -more readable. - -## Getting Started - -We use [Hugo](https://gohugo.io/) for our documentation. - -### Running locally - -1. Download and install the latest patch of Hugo version v0.69.x from - [here](https://github.com/gohugoio/hugo/releases/). -2. Run `hugo server` within the `docs` folder. -3. Visit http://localhost:1313 to see the documentation site. - -## Contributing - -If you're interested in contributing to Badger, please review our [guidelines](../CONTRIBUTING.md). - -## Contact - -- Please use [discuss.dgraph.io](https://discuss.dgraph.io) for questions, feature requests, and - discussions. -- Follow us on Twitter [@dgraphlabs](https://twitter.com/dgraphlabs). diff --git a/docs/archetypes/default.md b/docs/archetypes/default.md deleted file mode 100644 index 26f317f30..000000000 --- a/docs/archetypes/default.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -date: {{ .Date }} -draft: true ---- diff --git a/docs/config.toml b/docs/config.toml deleted file mode 100644 index e618e6c97..000000000 --- a/docs/config.toml +++ /dev/null @@ -1,43 +0,0 @@ -languageCode = "en-us" -theme = "hugo-docs" -canonifyURLs = false - -[markup.goldmark.renderer] -unsafe = true - -[markup.highlight] -noClasses = false -[[menu.main]] -name = "Home" -url = "/" -identifier = "home" -weight = -1 - -[[menu.main]] -name = "Getting Started" -url = "/get-started/" -identifier = "get-started" -weight = 1 -[[menu.main]] -name = "Resources" -url = "/resources/" -identifier = "resources" -weight = 2 - -[[menu.main]] -name = "Design" -url = "/design/" -identifier = "design" -weight = 3 - -[[menu.main]] -name = "Projects using Badger" -url = "/projects-using-badger/" -identifier = "project-using-badger" -weight = 4 - -[[menu.main]] -name = "Frequently Asked Questions" -url = "/faq/" -identifier = "faq" -weight = 5 diff --git a/docs/content/_index.md b/docs/content/_index.md deleted file mode 100644 index 5b4f12d22..000000000 --- a/docs/content/_index.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "BadgerDB Documentation" -date: 2020-07-06T17:43:29+05:30 -draft: false ---- - -
-
-

-BadgerDB is an embeddable, persistent, and fast key-value (KV) database written -in pure Go. It is the underlying database for Dgraph, a -fast, distributed graph database. It's meant to be a performant alternative to -non-Go-based key-value stores like RocksDB. -

- -
-
-
- }}"> -

Quickstart Guide

-

- A single page quickstart guide to get started with BadgerDB -

-
-
-
-
- }}"> -

Resources

-

- Additional resources and information -

-
-
-
-
- }}"> -

Design

-

- Design goals behind BadgerDB -

-
-
- -
-
- }}"> -

Projects using Badger

-

- A list of known projects that use BadgerDB -

-
-
-
-
- }}"> -

FAQ

-

- Frequently asked questions -

-
-
-
-
- -

Badger

-

- Embeddable, persistent, and fast key-value database that powers Dgraph -

-
-
- -
- - - -## Changelog - -The [Changelog] is kept fairly up-to-date with each release. - -[Changelog]: https://github.com/dgraph-io/badger/blob/main/CHANGELOG.md - -## Contribute - -
-
-
-
-
- -

- Get started with contributing fixes and enhancements to Badger and related software. -

-
-
-
-
-
- -## Our Community - -**Badger is made better every day by the growing community and the contributors all over the -world.** - -
-
-
-
-
- -

- Discuss Badger on the official community. -

-
-
-
-
-
diff --git a/docs/content/contact/_index.md b/docs/content/contact/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/contact/index.md b/docs/content/contact/index.md deleted file mode 100644 index 61d3358a5..000000000 --- a/docs/content/contact/index.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -title = "Contact" -aliases = ["/contact"] -+++ - -- Please use [discuss.dgraph.io](https://discuss.dgraph.io) for questions, feature requests and - discussions. -- Please use [Github issue tracker](https://github.com/dgraph-io/badger/issues) for filing bugs or - feature requests. -- Follow us on Twitter [@dgraphlabs](https://twitter.com/dgraphlabs). diff --git a/docs/content/design/_index.md b/docs/content/design/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/design/index.md b/docs/content/design/index.md deleted file mode 100644 index e0a510f3a..000000000 --- a/docs/content/design/index.md +++ /dev/null @@ -1,51 +0,0 @@ -+++ -title = "Design" -aliases = ["/design"] -+++ - -Badger was written with these design goals in mind: - -- Write a key-value database in pure Go. -- Use latest research to build the fastest KV database for data sets spanning terabytes. -- Optimize for SSDs. - -Badger’s design is based on a paper titled _[WiscKey: Separating Keys from Values in SSD-conscious -Storage][wisckey]_. - -[wisckey]: https://www.usenix.org/system/files/conference/fast16/fast16-papers-lu.pdf - -## Comparisons - -| Feature | Badger | RocksDB | BoltDB | -| ----------------------------- | ------------------------------------------ | ----------------------------- | --------- | -| Design | LSM tree with value log | LSM tree only | B+ tree | -| High Read throughput | Yes | No | Yes | -| High Write throughput | Yes | Yes | No | -| Designed for SSDs | Yes (with latest research 1) | Not specifically 2 | No | -| Embeddable | Yes | Yes | Yes | -| Sorted KV access | Yes | Yes | Yes | -| Pure Go (no Cgo) | Yes | No | Yes | -| Transactions | Yes, ACID, concurrent with SSI3 | Yes (but non-ACID) | Yes, ACID | -| Snapshots | Yes | Yes | Yes | -| TTL support | Yes | Yes | No | -| 3D access (key-value-version) | Yes4 | No | No | - -1 The [WISCKEY paper][wisckey] (on which Badger is based) saw big wins with separating -values from keys, significantly reducing the write amplification compared to a typical LSM tree. - -2 RocksDB is an SSD optimized version of LevelDB, which was designed specifically for -rotating disks. As such RocksDB's design isn't aimed at SSDs. - -3 SSI: Serializable Snapshot Isolation. For more details, see the blog post -[Concurrent ACID Transactions in Badger](https://blog.dgraph.io/post/badger-txn/) - -4 Badger provides direct access to value versions via its Iterator API. Users can also -specify how many versions to keep per key via Options. - -## Benchmarks - -We have run comprehensive benchmarks against RocksDB, Bolt and LMDB. The benchmarking code, and the -detailed logs for the benchmarks can be found in the [badger-bench] repo. More explanation, -including graphs can be found the blog posts (linked above). - -[badger-bench]: https://github.com/dgraph-io/badger-bench diff --git a/docs/content/faq/_index.md b/docs/content/faq/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/faq/index.md b/docs/content/faq/index.md deleted file mode 100644 index ec994131a..000000000 --- a/docs/content/faq/index.md +++ /dev/null @@ -1,149 +0,0 @@ -+++ -title = "Frequently Asked Question" -aliases = ["/faq"] -+++ - -## My writes are getting stuck. Why? - -**Update: With the new `Value(func(v []byte))` API, this deadlock can no longer happen.** - -The following is true for users on Badger v1.x. - -This can happen if a long running iteration with `Prefetch` is set to false, but a `Item::Value` -call is made internally in the loop. That causes Badger to acquire read locks over the value log -files to avoid value log GC removing the file from underneath. As a side effect, this also blocks a -new value log GC file from being created, when the value log file boundary is hit. - -Please see Github issues [#293](https://github.com/dgraph-io/badger/issues/293) and -[#315](https://github.com/dgraph-io/badger/issues/315). - -There are multiple workarounds during iteration: - -1. Use `Item::ValueCopy` instead of `Item::Value` when retrieving value. -1. Set `Prefetch` to true. Badger would then copy over the value and release the file lock - immediately. -1. When `Prefetch` is false, don't call `Item::Value` and do a pure key-only iteration. This might - be useful if you just want to delete a lot of keys. -1. Do the writes in a separate transaction after the reads. - -## My writes are really slow. Why? - -Are you creating a new transaction for every single key update, and waiting for it to `Commit` fully -before creating a new one? This will lead to very low throughput. - -We have created `WriteBatch` API which provides a way to batch up many updates into a single -transaction and `Commit` that transaction using callbacks to avoid blocking. This amortizes the cost -of a transaction really well, and provides the most efficient way to do bulk writes. - -```go -wb := db.NewWriteBatch() -defer wb.Cancel() - -for i := 0; i < N; i++ { - err := wb.Set(key(i), value(i), 0) // Will create txns as needed. - handle(err) -} -handle(wb.Flush()) // Wait for all txns to finish. -``` - -Note that `WriteBatch` API does not allow any reads. For read-modify-write workloads, you should be -using the `Transaction` API. - -## I don't see any disk writes. Why? - -If you're using Badger with `SyncWrites=false`, then your writes might not be written to value log -and won't get synced to disk immediately. Writes to LSM tree are done inmemory first, before they -get compacted to disk. The compaction would only happen once `BaseTableSize` has been reached. So, -if you're doing a few writes and then checking, you might not see anything on disk. Once you `Close` -the database, you'll see these writes on disk. - -## Reverse iteration doesn't give me the right results. - -Just like forward iteration goes to the first key which is equal or greater than the SEEK key, -reverse iteration goes to the first key which is equal or lesser than the SEEK key. Therefore, SEEK -key would not be part of the results. You can typically add a `0xff` byte as a suffix to the SEEK -key to include it in the results. See the following issues: -[#436](https://github.com/dgraph-io/badger/issues/436) and -[#347](https://github.com/dgraph-io/badger/issues/347). - -## Which instances should I use for Badger? - -We recommend using instances which provide local SSD storage, without any limit on the maximum IOPS. -In AWS, these are storage optimized instances like i3. They provide local SSDs which clock 100K IOPS -over 4KB blocks easily. - -## I'm getting a closed channel error. Why? - -``` -panic: close of closed channel -panic: send on closed channel -``` - -If you're seeing panics like above, this would be because you're operating on a closed DB. This can -happen, if you call `Close()` before sending a write, or multiple times. You should ensure that you -only call `Close()` once, and all your read/write operations finish before closing. - -## Are there any Go specific settings that I should use? - -We _highly_ recommend setting a high number for `GOMAXPROCS`, which allows Go to observe the full -IOPS throughput provided by modern SSDs. In Dgraph, we have set it to 128. For more details, -[see this thread](https://groups.google.com/d/topic/golang-nuts/jPb_h3TvlKE/discussion). - -## Are there any Linux specific settings that I should use? - -We recommend setting `max file descriptors` to a high number depending upon the expected size of -your data. On Linux and Mac, you can check the file descriptor limit with `ulimit -n -H` for the -hard limit and `ulimit -n -S` for the soft limit. A soft limit of `65535` is a good lower bound. You -can adjust the limit as needed. - -## I see "manifest has unsupported version: X (we support Y)" error. - -This error means you have a badger directory which was created by an older version of badger and -you're trying to open in a newer version of badger. The underlying data format can change across -badger versions and users will have to migrate their data directory. Badger data can be migrated -from version X of badger to version Y of badger by following the steps listed below. Assume you were -on badger v1.6.0 and you wish to migrate to v2.0.0 version. - -1. Install badger version v1.6.0 - - - `cd $GOPATH/src/github.com/dgraph-io/badger` - - `git checkout v1.6.0` - - `cd badger && go install` - - This should install the old badger binary in your $GOBIN. - -2. Create Backup - - `badger backup --dir path/to/badger/directory -f badger.backup` -3. Install badger version v2.0.0 - - - `cd $GOPATH/src/github.com/dgraph-io/badger` - - `git checkout v2.0.0` - - `cd badger && go install` - - This should install new badger binary in your $GOBIN - -4. Restore data from backup - - - `badger restore --dir path/to/new/badger/directory -f badger.backup` - - This will create a new directory on `path/to/new/badger/directory` and add badger data in newer - format to it. - -NOTE - The above steps shouldn't cause any data loss but please ensure the new data is valid before -deleting the old badger directory. - -## Why do I need gcc to build badger? Does badger need CGO? - -Badger does not directly use CGO but it relies on https://github.com/DataDog/zstd library for zstd -compression and the library requires `gcc/cgo`. You can build badger without cgo by running -`CGO_ENABLED=0 go build`. This will build badger without the support for ZSTD compression algorithm. - -As of Badger versions [v2.2007.4](https://github.com/dgraph-io/badger/releases/tag/v2.2007.4) and -[v3.2103.1](https://github.com/dgraph-io/badger/releases/tag/v3.2103.1) the DataDog ZSTD library was -replaced by pure Golang version and CGO is no longer required. The new library is -[backwards compatible in nearly all cases](https://discuss.dgraph.io/t/use-pure-go-zstd-implementation/8670/10): - - > Yes they are compatible both ways. The only exception is 0 bytes of input which will give - > 0 bytes output with the Go zstd. But you already have the zstd.WithZeroFrames(true) which - > will wrap 0 bytes in a header so it can be fed to DD zstd. This will of course only be relevant - > when downgrading. diff --git a/docs/content/get-started/_index.md b/docs/content/get-started/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/get-started/index.md b/docs/content/get-started/index.md deleted file mode 100644 index 7a2d0e47b..000000000 --- a/docs/content/get-started/index.md +++ /dev/null @@ -1,687 +0,0 @@ -+++ -title = "Get Started - Quickstart Guide" -aliases = ["/get-started"] -+++ - -## Installing - -To start using Badger, install Go 1.23 or above. Run the following command to retrieve the library. - -```sh -$ go get github.com/dgraph-io/badger/v4 -``` - -This will retrieve the library. - -### Installing Badger Command Line Tool - -```sh -$ go install github.com/dgraph-io/badger/v4/badger@latest -``` - -This will install the badger command line utility into your $GOBIN path. - -## Opening a database - -The top-level object in Badger is a `DB`. It represents multiple files on disk in specific -directories, which contain the data for a single database. - -To open your database, use the `badger.Open()` function, with the appropriate options. The `Dir` and -`ValueDir` options are mandatory and must be specified by the client. They can be set to the same -value to simplify things. - -```go -package main - -import ( - "log" - - badger "github.com/dgraph-io/badger/v4" -) - -func main() { - // Open the Badger database located in the /tmp/badger directory. - // It will be created if it doesn't exist. - db, err := badger.Open(badger.DefaultOptions("/tmp/badger")) - if err != nil { - log.Fatal(err) - } - defer db.Close() - // Your code here… -} -``` - -Please note that Badger obtains a lock on the directories so multiple processes cannot open the same -database at the same time. - -### In-Memory Mode/Diskless Mode - -By default, Badger ensures all the data is persisted to the disk. It also supports a pure in-memory -mode. When Badger is running in in-memory mode, all the data is stored in the memory. Reads and -writes are much faster in in-memory mode, but all the data stored in Badger will be lost in case of -a crash or close. To open badger in in-memory mode, set the `InMemory` option. - -```go -opt := badger.DefaultOptions("").WithInMemory(true) -``` - -### Encryption Mode - -If you enable encryption on Badger, you also need to set the index cache size. - -{{% notice "tip" %}} Having a cache improves the performance. Otherwise, your reads would be very -slow while encryption is enabled. {{% /notice %}} - -For example, to set a `100 Mb` cache: - -```go -opts.IndexCache = 100 << 20 // 100 mb or some other size based on the amount of data -``` - -## Transactions - -### Read-only transactions - -To start a read-only transaction, you can use the `DB.View()` method: - -```go -err := db.View(func(txn *badger.Txn) error { - // Your code here… - return nil -}) -``` - -You cannot perform any writes or deletes within this transaction. Badger ensures that you get a -consistent view of the database within this closure. Any writes that happen elsewhere after the -transaction has started, will not be seen by calls made within the closure. - -### Read-write transactions - -To start a read-write transaction, you can use the `DB.Update()` method: - -```go -err := db.Update(func(txn *badger.Txn) error { - // Your code here… - return nil -}) -``` - -All database operations are allowed inside a read-write transaction. - -Always check the returned error value. If you return an error within your closure it will be passed -through. - -An `ErrConflict` error will be reported in case of a conflict. Depending on the state of your -application, you have the option to retry the operation if you receive this error. - -An `ErrTxnTooBig` will be reported in case the number of pending writes/deletes in the transaction -exceeds a certain limit. In that case, it is best to commit the transaction and start a new -transaction immediately. Here is an example (we are not checking for errors in some places for -simplicity): - -```go -updates := make(map[string]string) -txn := db.NewTransaction(true) -for k,v := range updates { - if err := txn.Set([]byte(k),[]byte(v)); err == badger.ErrTxnTooBig { - _ = txn.Commit() - txn = db.NewTransaction(true) - _ = txn.Set([]byte(k),[]byte(v)) - } -} -_ = txn.Commit() -``` - -### Managing transactions manually - -The `DB.View()` and `DB.Update()` methods are wrappers around the `DB.NewTransaction()` and -`Txn.Commit()` methods (or `Txn.Discard()` in case of read-only transactions). These helper methods -will start the transaction, execute a function, and then safely discard your transaction if an error -is returned. This is the recommended way to use Badger transactions. - -However, sometimes you may want to manually create and commit your transactions. You can use the -`DB.NewTransaction()` function directly, which takes in a boolean argument to specify whether a -read-write transaction is required. For read-write transactions, it is necessary to call -`Txn.Commit()` to ensure the transaction is committed. For read-only transactions, calling -`Txn.Discard()` is sufficient. `Txn.Commit()` also calls `Txn.Discard()` internally to cleanup the -transaction, so just calling `Txn.Commit()` is sufficient for read-write transaction. However, if -your code doesn’t call `Txn.Commit()` for some reason (for e.g it returns prematurely with an -error), then please make sure you call `Txn.Discard()` in a `defer` block. Refer to the code below. - -```go -// Start a writable transaction. -txn := db.NewTransaction(true) -defer txn.Discard() - -// Use the transaction... -err := txn.Set([]byte("answer"), []byte("42")) -if err != nil { - return err -} - -// Commit the transaction and check for error. -if err := txn.Commit(); err != nil { - return err -} -``` - -The first argument to `DB.NewTransaction()` is a boolean stating if the transaction should be -writable. - -Badger allows an optional callback to the `Txn.Commit()` method. Normally, the callback can be set -to `nil`, and the method will return after all the writes have succeeded. However, if this callback -is provided, the `Txn.Commit()` method returns as soon as it has checked for any conflicts. The -actual writing to the disk happens asynchronously, and the callback is invoked once the writing has -finished, or an error has occurred. This can improve the throughput of the application in some -cases. But it also means that a transaction is not durable until the callback has been invoked with -a `nil` error value. - -## Using key/value pairs - -To save a key/value pair, use the `Txn.Set()` method: - -```go -err := db.Update(func(txn *badger.Txn) error { - err := txn.Set([]byte("answer"), []byte("42")) - return err -}) -``` - -Key/Value pair can also be saved by first creating `Entry`, then setting this `Entry` using -`Txn.SetEntry()`. `Entry` also exposes methods to set properties on it. - -```go -err := db.Update(func(txn *badger.Txn) error { - e := badger.NewEntry([]byte("answer"), []byte("42")) - err := txn.SetEntry(e) - return err -}) -``` - -This will set the value of the `"answer"` key to `"42"`. To retrieve this value, we can use the -`Txn.Get()` method: - -```go -err := db.View(func(txn *badger.Txn) error { - item, err := txn.Get([]byte("answer")) - handle(err) - - var valNot, valCopy []byte - err := item.Value(func(val []byte) error { - // This func with val would only be called if item.Value encounters no error. - - // Accessing val here is valid. - fmt.Printf("The answer is: %s\n", val) - - // Copying or parsing val is valid. - valCopy = append([]byte{}, val...) - - // Assigning val slice to another variable is NOT OK. - valNot = val // Do not do this. - return nil - }) - handle(err) - - // DO NOT access val here. It is the most common cause of bugs. - fmt.Printf("NEVER do this. %s\n", valNot) - - // You must copy it to use it outside item.Value(...). - fmt.Printf("The answer is: %s\n", valCopy) - - // Alternatively, you could also use item.ValueCopy(). - valCopy, err = item.ValueCopy(nil) - handle(err) - fmt.Printf("The answer is: %s\n", valCopy) - - return nil -}) -``` - -`Txn.Get()` returns `ErrKeyNotFound` if the value is not found. - -Please note that values returned from `Get()` are only valid while the transaction is open. If you -need to use a value outside of the transaction then you must use `copy()` to copy it to another byte -slice. - -Use the `Txn.Delete()` method to delete a key. - -## Monotonically increasing integers - -To get unique monotonically increasing integers with strong durability, you can use the -`DB.GetSequence` method. This method returns a `Sequence` object, which is thread-safe and can be -used concurrently via various goroutines. - -Badger would lease a range of integers to hand out from memory, with the bandwidth provided to -`DB.GetSequence`. The frequency at which disk writes are done is determined by this lease bandwidth -and the frequency of `Next` invocations. Setting a bandwidth too low would do more disk writes, -setting it too high would result in wasted integers if Badger is closed or crashes. To avoid wasted -integers, call `Release` before closing Badger. - -```go -seq, err := db.GetSequence(key, 1000) -defer seq.Release() -for { - num, err := seq.Next() -} -``` - -## Merge Operations - -Badger provides support for ordered merge operations. You can define a func of type `MergeFunc` -which takes in an existing value, and a value to be _merged_ with it. It returns a new value which -is the result of the _merge_ operation. All values are specified in byte arrays. For e.g., here is a -merge function (`add`) which appends a `[]byte` value to an existing `[]byte` value. - -```go -// Merge function to append one byte slice to another -func add(originalValue, newValue []byte) []byte { - return append(originalValue, newValue...) -} -``` - -This function can then be passed to the `DB.GetMergeOperator()` method, along with a key, and a -duration value. The duration specifies how often the merge function is run on values that have been -added using the `MergeOperator.Add()` method. - -`MergeOperator.Get()` method can be used to retrieve the cumulative value of the key associated with -the merge operation. - -```go -key := []byte("merge") - -m := db.GetMergeOperator(key, add, 200*time.Millisecond) -defer m.Stop() - -m.Add([]byte("A")) -m.Add([]byte("B")) -m.Add([]byte("C")) - -res, _ := m.Get() // res should have value ABC encoded -``` - -Example: Merge operator which increments a counter - -```go -func uint64ToBytes(i uint64) []byte { - var buf [8]byte - binary.BigEndian.PutUint64(buf[:], i) - return buf[:] -} - -func bytesToUint64(b []byte) uint64 { - return binary.BigEndian.Uint64(b) -} - -// Merge function to add two uint64 numbers -func add(existing, new []byte) []byte { - return uint64ToBytes(bytesToUint64(existing) + bytesToUint64(new)) -} -``` - -It can be used as - -``` -key := []byte("merge") - -m := db.GetMergeOperator(key, add, 200*time.Millisecond) -defer m.Stop() - -m.Add(uint64ToBytes(1)) -m.Add(uint64ToBytes(2)) -m.Add(uint64ToBytes(3)) - -res, _ := m.Get() // res should have value 6 encoded -``` - -## Setting Time To Live(TTL) and User Metadata on Keys - -Badger allows setting an optional Time to Live (TTL) value on keys. Once the TTL has elapsed, the -key will no longer be retrievable and will be eligible for garbage collection. A TTL can be set as a -`time.Duration` value using the `Entry.WithTTL()` and `Txn.SetEntry()` API methods. - -```go -err := db.Update(func(txn *badger.Txn) error { - e := badger.NewEntry([]byte("answer"), []byte("42")).WithTTL(time.Hour) - err := txn.SetEntry(e) - return err -}) -``` - -An optional user metadata value can be set on each key. A user metadata value is represented by a -single byte. It can be used to set certain bits along with the key to aid in interpreting or -decoding the key-value pair. User metadata can be set using `Entry.WithMeta()` and `Txn.SetEntry()` -API methods. - -```go -err := db.Update(func(txn *badger.Txn) error { - e := badger.NewEntry([]byte("answer"), []byte("42")).WithMeta(byte(1)) - err := txn.SetEntry(e) - return err -}) -``` - -`Entry` APIs can be used to add the user metadata and TTL for same key. This `Entry` then can be set -using `Txn.SetEntry()`. - -```go -err := db.Update(func(txn *badger.Txn) error { - e := badger.NewEntry([]byte("answer"), []byte("42")).WithMeta(byte(1)).WithTTL(time.Hour) - err := txn.SetEntry(e) - return err -}) -``` - -## Iterating over keys - -To iterate over keys, we can use an `Iterator`, which can be obtained using the `Txn.NewIterator()` -method. Iteration happens in byte-wise lexicographical sorting order. - -```go -err := db.View(func(txn *badger.Txn) error { - opts := badger.DefaultIteratorOptions - opts.PrefetchSize = 10 - it := txn.NewIterator(opts) - defer it.Close() - for it.Rewind(); it.Valid(); it.Next() { - item := it.Item() - k := item.Key() - err := item.Value(func(v []byte) error { - fmt.Printf("key=%s, value=%s\n", k, v) - return nil - }) - if err != nil { - return err - } - } - return nil -}) -``` - -The iterator allows you to move to a specific point in the list of keys and move forward or backward -through the keys one at a time. - -By default, Badger prefetches the values of the next 100 items. You can adjust that with the -`IteratorOptions.PrefetchSize` field. However, setting it to a value higher than `GOMAXPROCS` (which -we recommend to be 128 or higher) shouldn’t give any additional benefits. You can also turn off the -fetching of values altogether. See section below on key-only iteration. - -### Prefix scans - -To iterate over a key prefix, you can combine `Seek()` and `ValidForPrefix()`: - -```go -db.View(func(txn *badger.Txn) error { - it := txn.NewIterator(badger.DefaultIteratorOptions) - defer it.Close() - prefix := []byte("1234") - for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { - item := it.Item() - k := item.Key() - err := item.Value(func(v []byte) error { - fmt.Printf("key=%s, value=%s\n", k, v) - return nil - }) - if err != nil { - return err - } - } - return nil -}) -``` - -### Possible pagination implementation using Prefix scans - -Considering that iteration happens in **byte-wise lexicographical sorting** order, it's possible to -create a sorting-sensitive key. For example, a simple blog post key might look -like:`feed:userUuid:timestamp:postUuid`. Here, the `timestamp` part of the key is treated as an -attribute, and items will be stored in the corresponding order: - -| Order ASC | Key | -| :-------: | :------------------------------------------------------------ | -| 1 | feed:tQpnEDVRoCxTFQDvyQEzdo:1733127889:tQpnEDVRoCxTFQDvyQEzdo | -| 2 | feed:tQpnEDVRoCxTFQDvyQEzdo:1733127533:1Mryrou1xoekEaxzrFiHwL | -| 3 | feed:tQpnEDVRoCxTFQDvyQEzdo:1733127486:pprRrNL2WP4yfVXsSNBSx6 | - -It is important to properly configure keys for lexicographical sorting to avoid incorrect ordering. - -A **prefix scan** through the keys above can be achieved using the prefix -`feed:tQpnEDVRoCxTFQDvyQEzdo`. All matching keys will be returned, sorted by `timestamp`. -For the example above, sorting can be done in ascending or descending order based on `timestamp` or -`reversed timestamp` as needed: - -```go -reversedTimestamp := math.MaxInt64-time.Now().Unix() -``` - -This makes it possible to implement simple pagination by using a limit for the number of keys and a -cursor (the last key from the previous iteration) to identify where to resume. - -```go -// startCursor may look like 'feed:tQpnEDVRoCxTFQDvyQEzdo:1733127486'. -// A prefix scan with this cursor will locate the specific key where -// the previous iteration stopped. -err = db.badger.View(func(txn *badger.Txn) error { - it := txn.NewIterator(opts) - defer it.Close() - - // Prefix example 'feed:tQpnEDVRoCxTFQDvyQEzdo' - // if no cursor provided prefix scan starts from the beginning - p := prefix - if startCursor != nil { - p = startCursor - } - iterNum := 0 // Tracks the number of iterations to enforce the limit. - for it.Seek(p); it.ValidForPrefix(p); it.Next() { - // The method it.ValidForPrefix ensures that iteration continues - // as long as keys match the prefix. - // For example, if p = 'feed:tQpnEDVRoCxTFQDvyQEzdo:1733127486', - // it matches keys like - // 'feed:tQpnEDVRoCxTFQDvyQEzdo:1733127889:pprRrNL2WP4yfVXsSNBSx6'. - - // Once the starting point for iteration is found, revert the prefix - // back to 'feed:tQpnEDVRoCxTFQDvyQEzdo' to continue iterating sequentially. - // Otherwise, iteration would stop after a single prefix-key match. - p = prefix - - item := it.Item() - key := string(item.Key()) - - if iterNum > limit { // Limit reached. - nextCursor = key // Save the next cursor for future iterations. - return nil - } - iterNum++ // Increment iteration count. - - err := item.Value(func(v []byte) error { - fmt.Printf("key=%s, value=%s\n", k, v) - return nil - }) - if err != nil { - return err - } - } - // If the number of iterations is less than the limit, - // it means there are no more items for the prefix. - if iterNum < limit { - nextCursor = "" - } - return nil - }) -return nextCursor, err -``` - -### Key-only iteration - -Badger supports a unique mode of iteration called _key-only_ iteration. It is several order of -magnitudes faster than regular iteration, because it involves access to the LSM-tree only, which is -usually resident entirely in RAM. To enable key-only iteration, you need to set the -`IteratorOptions.PrefetchValues` field to `false`. This can also be used to do sparse reads for -selected keys during an iteration, by calling `item.Value()` only when required. - -```go -err := db.View(func(txn *badger.Txn) error { - opts := badger.DefaultIteratorOptions - opts.PrefetchValues = false - it := txn.NewIterator(opts) - defer it.Close() - for it.Rewind(); it.Valid(); it.Next() { - item := it.Item() - k := item.Key() - fmt.Printf("key=%s\n", k) - } - return nil -}) -``` - -## Stream - -Badger provides a Stream framework, which concurrently iterates over all or a portion of the DB, -converting data into custom key-values, and streams it out serially to be sent over network, written -to disk, or even written back to Badger. This is a lot faster way to iterate over Badger than using -a single Iterator. Stream supports Badger in both managed and normal mode. - -Stream uses the natural boundaries created by SSTables within the LSM tree, to quickly generate key -ranges. Each goroutine then picks a range and runs an iterator to iterate over it. Each iterator -iterates over all versions of values and is created from the same transaction, thus working over a -snapshot of the DB. Every time a new key is encountered, it calls `ChooseKey(item)`, followed by -`KeyToList(key, itr)`. This allows a user to select or reject that key, and if selected, convert the -value versions into custom key-values. The goroutine batches up 4MB worth of key-values, before -sending it over to a channel. Another goroutine further batches up data from this channel using -_smart batching_ algorithm and calls `Send` serially. - -This framework is designed for high throughput key-value iteration, spreading the work of iteration -across many goroutines. `DB.Backup` uses this framework to provide full and incremental backups -quickly. Dgraph is a heavy user of this framework. In fact, this framework was developed and used -within Dgraph, before getting ported over to Badger. - -```go -stream := db.NewStream() -// db.NewStreamAt(readTs) for managed mode. - -// -- Optional settings -stream.NumGo = 16 // Set number of goroutines to use for iteration. -stream.Prefix = []byte("some-prefix") // Leave nil for iteration over the whole DB. -stream.LogPrefix = "Badger.Streaming" // For identifying stream logs. Outputs to Logger. - -// ChooseKey is called concurrently for every key. If left nil, assumes true by default. -stream.ChooseKey = func(item *badger.Item) bool { - return bytes.HasSuffix(item.Key(), []byte("er")) -} - -// KeyToList is called concurrently for chosen keys. This can be used to convert -// Badger data into custom key-values. If nil, uses stream.ToList, a default -// implementation, which picks all valid key-values. -stream.KeyToList = nil - -// -- End of optional settings. - -// Send is called serially, while Stream.Orchestrate is running. -stream.Send = func(list *pb.KVList) error { - return proto.MarshalText(w, list) // Write to w. -} - -// Run the stream -if err := stream.Orchestrate(context.Background()); err != nil { - return err -} -// Done. -``` - -## Garbage Collection - -Badger values need to be garbage collected, because of two reasons: - -- Badger keeps values separately from the LSM tree. This means that the compaction operations that - clean up the LSM tree do not touch the values at all. Values need to be cleaned up separately. - -- Concurrent read/write transactions could leave behind multiple values for a single key, because - they are stored with different versions. These could accumulate, and take up unneeded space beyond - the time these older versions are needed. - -Badger relies on the client to perform garbage collection at a time of their choosing. It provides -the following method, which can be invoked at an appropriate time: - -- `DB.RunValueLogGC()`: This method is designed to do garbage collection while Badger is online. - Along with randomly picking a file, it uses statistics generated by the LSM-tree compactions to - pick files that are likely to lead to maximum space reclamation. It is recommended to be called - during periods of low activity in your system, or periodically. One call would only result in - removal of at max one log file. As an optimization, you could also immediately re-run it whenever - it returns nil error (indicating a successful value log GC), as shown below. - - ```go - ticker := time.NewTicker(5 * time.Minute) - defer ticker.Stop() - for range ticker.C { - again: - err := db.RunValueLogGC(0.7) - if err == nil { - goto again - } - } - ``` - -- `DB.PurgeOlderVersions()`: This method is **DEPRECATED** since v1.5.0. Now, Badger's LSM tree - automatically discards older/invalid versions of keys. - -{{% notice "note" %}} The RunValueLogGC method would not garbage collect the latest value -log.{{% /notice %}} - -## Database backup - -There are two public API methods `DB.Backup()` and `DB.Load()` which can be used to do online -backups and restores. Badger v0.9 provides a CLI tool `badger`, which can do offline backup/restore. -Make sure you have `$GOPATH/bin` in your PATH to use this tool. - -The command below will create a version-agnostic backup of the database, to a file `badger.bak` in -the current working directory - -```sh -badger backup --dir -``` - -To restore `badger.bak` in the current working directory to a new database: - -```sh -badger restore --dir -``` - -See `badger --help` for more details. - -If you have a Badger database that was created using v0.8 (or below), you can use the -`badger_backup` tool provided in v0.8.1, and then restore it using the command above to upgrade your -database to work with the latest version. - -```sh -badger_backup --dir --backup-file badger.bak -``` - -We recommend all users to use the `Backup` and `Restore` APIs and tools. However, Badger is also -rsync-friendly because all files are immutable, barring the latest value log which is append-only. -So, rsync can be used as rudimentary way to perform a backup. In the following script, we repeat -rsync to ensure that the LSM tree remains consistent with the MANIFEST file while doing a full -backup. - -```sh -#!/bin/bash -set -o history -set -o histexpand -# Makes a complete copy of a Badger database directory. -# Repeat rsync if the MANIFEST and SSTables are updated. -rsync -avz --delete db/ dst -while !! | grep -q "(MANIFEST\|\.sst)$"; do :; done -``` - -## Memory usage - -Badger's memory usage can be managed by tweaking several options available in the `Options` struct -that is passed in when opening the database using `DB.Open`. - -- Number of memtables (`Options.NumMemtables`) - - If you modify `Options.NumMemtables`, also adjust `Options.NumLevelZeroTables` and - `Options.NumLevelZeroTablesStall` accordingly. -- Number of concurrent compactions (`Options.NumCompactors`) -- Size of table (`Options.BaseTableSize`) -- Size of value log file (`Options.ValueLogFileSize`) - -If you want to decrease the memory usage of Badger instance, tweak these options (ideally one at a -time) until you achieve the desired memory usage. diff --git a/docs/content/projects-using-badger/_index.md b/docs/content/projects-using-badger/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/projects-using-badger/index.md b/docs/content/projects-using-badger/index.md deleted file mode 100644 index cbb919138..000000000 --- a/docs/content/projects-using-badger/index.md +++ /dev/null @@ -1,109 +0,0 @@ -+++ -title = "Projects Using Badger" -aliases = ["/project-using-badger"] -+++ - -Below is a list of known projects that use Badger: - -- [Dgraph](https://github.com/dgraph-io/dgraph) - Distributed graph database. -- [Jaeger](https://github.com/jaegertracing/jaeger) - Distributed tracing platform. -- [go-ipfs](https://github.com/ipfs/go-ipfs) - Go client for the InterPlanetary File System (IPFS), - a new hypermedia distribution protocol. -- [Riot](https://github.com/go-ego/riot) - An open-source, distributed search engine. -- [emitter](https://github.com/emitter-io/emitter) - Scalable, low latency, distributed pub/sub - broker with message storage, uses MQTT, gossip and badger. -- [OctoSQL](https://github.com/cube2222/octosql) - Query tool that allows you to join, analyse and - transform data from multiple databases using SQL. -- [Dkron](https://dkron.io/) - Distributed, fault tolerant job scheduling system. -- [smallstep/certificates](https://github.com/smallstep/certificates) - Step-ca is an online - certificate authority for secure, automated certificate management. -- [Sandglass](https://github.com/celrenheit/sandglass) - distributed, horizontally scalable, - persistent, time sorted message queue. -- [TalariaDB](https://github.com/grab/talaria) - Grab's Distributed, low latency time-series - database. -- [Sloop](https://github.com/salesforce/sloop) - Salesforce's Kubernetes History Visualization - Project. -- [Usenet Express](https://usenetexpress.com/) - Serving over 300TB of data with Badger. -- [gorush](https://github.com/appleboy/gorush) - A push notification server written in Go. -- [0-stor](https://github.com/zero-os/0-stor) - Single device object store. -- [Dispatch Protocol](https://github.com/dispatchlabs/disgo) - Blockchain protocol for distributed - application data analytics. -- [GarageMQ](https://github.com/valinurovam/garagemq) - AMQP server written in Go. -- [RedixDB](https://alash3al.github.io/redix/) - A real-time persistent key-value store with the - same redis protocol. -- [BBVA](https://github.com/BBVA/raft-badger) - Raft backend implementation using BadgerDB for - Hashicorp raft. -- [Fantom](https://github.com/Fantom-foundation/go-lachesis) - aBFT Consensus platform for - distributed applications. -- [decred](https://github.com/decred/dcrdata) - An open, progressive, and self-funding - cryptocurrency with a system of community-based governance integrated into its blockchain. -- [OpenNetSys](https://github.com/opennetsys/c3-go) - Create useful dApps in any software language. -- [HoneyTrap](https://github.com/honeytrap/honeytrap) - An extensible and opensource system for - running, monitoring and managing honeypots. -- [Insolar](https://github.com/insolar/insolar) - Enterprise-ready blockchain platform. -- [IoTeX](https://github.com/iotexproject/iotex-core) - The next generation of the decentralized - network for IoT powered by scalability- and privacy-centric blockchains. -- [go-sessions](https://github.com/kataras/go-sessions) - The sessions manager for Go net/http and - fasthttp. -- [Babble](https://github.com/mosaicnetworks/babble) - BFT Consensus platform for distributed - applications. -- [Tormenta](https://github.com/jpincas/tormenta) - Embedded object-persistence layer / simple JSON - database for Go projects. -- [BadgerHold](https://github.com/timshannon/badgerhold) - An embeddable NoSQL store for querying Go - types built on Badger -- [Goblero](https://github.com/didil/goblero) - Pure Go embedded persistent job queue backed by - BadgerDB -- [Surfline](https://www.surfline.com) - Serving global wave and weather forecast data with Badger. -- [Cete](https://github.com/mosuka/cete) - Simple and highly available distributed key-value store - built on Badger. Makes it easy bringing up a cluster of Badger with Raft consensus algorithm by - hashicorp/raft. -- [Volument](https://volument.com/) - A new take on website analytics backed by Badger. -- [KVdb](https://kvdb.io/) - Hosted key-value store and serverless platform built on top of Badger. -- [Terminotes](https://gitlab.com/asad-awadia/terminotes) - Self hosted notes storage and search - server - storage powered by BadgerDB -- [Pyroscope](https://github.com/pyroscope-io/pyroscope) - Open source continuous profiling platform - built with BadgerDB -- [Veri](https://github.com/bgokden/veri) - A distributed feature store optimized for Search and - Recommendation tasks. -- [bIter](https://github.com/MikkelHJuul/bIter) - A library and Iterator interface for working with - the `badger.Iterator`, simplifying from-to, and prefix mechanics. -- [ld](https://github.com/MikkelHJuul/ld) - (Lean Database) A very simple gRPC-only key-value - database, exposing BadgerDB with key-range scanning semantics. -- [Souin](https://github.com/darkweak/Souin) - A RFC compliant HTTP cache with lot of other features - based on Badger for the storage. Compatible with all existing reverse-proxies. -- [Xuperchain](https://github.com/xuperchain/xupercore) - A highly flexible blockchain architecture - with great transaction performance. -- [m2](https://github.com/qichengzx/m2) - A simple http key/value store based on the raft protocol. -- [chaindb](https://github.com/ChainSafe/chaindb) - A blockchain storage layer used by - [Gossamer](https://chainsafe.github.io/gossamer/), a Go client for the - [Polkadot Network](https://polkadot.network/). -- [vxdb](https://github.com/vitalvas/vxdb) - Simple schema-less Key-Value NoSQL database with - simplest API interface. -- [Opacity](https://github.com/opacity/storage-node) - Backend implementation for the Opacity - storage project -- [Vephar](https://github.com/vaccovecrana/vephar) - A minimal key/value store using hashicorp-raft - for cluster coordination and Badger for data storage. -- [gowarcserver](https://github.com/nlnwa/gowarcserver) - Open-source server for warc files. Can be - used in conjunction with pywb -- [flow-go](https://github.com/onflow/flow-go) - A fast, secure, and developer-friendly blockchain - built to support the next generation of games, apps and the digital assets that power them. -- [Wrgl](https://www.wrgl.co) - A data version control system that works like Git but specialized to - store and diff CSV. -- [Loggie](https://github.com/loggie-io/loggie) - A lightweight, cloud-native data transfer agent - and aggregator. -- [raft-badger](https://github.com/rfyiamcool/raft-badger) - raft-badger implements LogStore and - StableStore Interface of hashcorp/raft. it is used to store raft log and metadata of - hashcorp/raft. -- [DVID](https://github.com/janelia-flyem/dvid) - A dataservice for branched versioning of a variety - of data types. Originally created for large-scale brain reconstructions in Connectomics. -- [KVS](https://github.com/tauraamui/kvs) - A library for making it easy to persist, load and query - full structs into BadgerDB, using an ownership hierarchy model. -- [LLS](https://github.com/Boc-chi-no/LLS) - LLS is an efficient URL Shortener that can be used to - shorten links and track link usage. Support for BadgerDB and MongoDB. Improved performance by more - than 30% when using BadgerDB -- [ActionManager](https://mftlabs.io/actionmanager) - A dynamic entity manager based on rjsf schema - and badger db -- [MightyMap](https://github.com/thisisdevelopment/mightymap) - Mightymap: Conveys both robustness - and high capability, fitting for a powerful concurrent map. - -If you are using Badger in a project please send a pull request to add it to the list. diff --git a/docs/content/resources/_index.md b/docs/content/resources/_index.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/content/resources/index.md b/docs/content/resources/index.md deleted file mode 100644 index 7e270f208..000000000 --- a/docs/content/resources/index.md +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Resources" -aliases = ["/resouces"] -+++ - -## Blog Posts - -1. [Introducing Badger: A fast key-value store written natively in Go](https://open.dgraph.io/post/badger/) -2. [Make Badger crash resilient with ALICE](https://blog.dgraph.io/post/alice/) -3. [Badger vs LMDB vs BoltDB: Benchmarking key-value databases in Go](https://blog.dgraph.io/post/badger-lmdb-boltdb/) -4. [Concurrent ACID Transactions in Badger](https://blog.dgraph.io/post/badger-txn/) - -## Contact - -- Please use [discuss.dgraph.io](https://discuss.dgraph.io) for questions, bugs, feature requests, - and discussions. -- Follow us on Twitter [@dgraphlabs](https://twitter.com/dgraphlabs). - -## Contributing - -If you're interested in contributing to Badger see -[CONTRIBUTING.md](https://github.com/dgraph-io/badger/blob/main/CONTRIBUTING.md). diff --git a/docs/scripts/build.sh b/docs/scripts/build.sh deleted file mode 100755 index 19da58889..000000000 --- a/docs/scripts/build.sh +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/bash -# This script runs in a loop (configurable with LOOP), checks for updates to the -# Hugo docs theme or to the docs on certain branches and rebuilds the public -# folder for them. It has be made more generalized, so that we don't have to -# hardcode versions. - -# Warning - Changes should not be made on the server on which this script is running -# becauses this script does git checkout and merge. - -set -e - -GREEN='\033[32;1m' -RESET='\033[0m' -HOST="${HOST:-https://dgraph.io/docs/badger}" -# Name of output public directory -PUBLIC="${PUBLIC:-public}" -# LOOP true makes this script run in a loop to check for updates -LOOP="${LOOP:-true}" -# Binary of hugo command to run. -HUGO="${HUGO:-hugo}" - -# TODO - Maybe get list of released versions from Github API and filter -# those which have docs. - -# Place the latest version at the beginning so that version selector can -# append '(latest)' to the version string, followed by the master version, -# and then the older versions in descending order, such that the -# build script can place the artifact in an appropriate location. -VERSIONS_ARRAY=( - 'master' -) - -joinVersions() { - versions=$(printf ",%s" "${VERSIONS_ARRAY[@]}") - echo "${versions:1}" -} - -function version { echo "$@" | gawk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; } - -rebuild() { - echo -e "$(date) ${GREEN} Updating docs for branch: $1.${RESET}" - - # The latest documentation is generated in the root of /public dir - # Older documentations are generated in their respective `/public/vx.x.x` dirs - dir='' - if [[ $2 != "${VERSIONS_ARRAY[0]}" ]]; then - dir=$2 - fi - - VERSION_STRING=$(joinVersions) - # In Unix environments, env variables should also be exported to be seen by Hugo - export CURRENT_BRANCH=${1} - export CURRENT_VERSION=${2} - export VERSIONS=${VERSION_STRING} - - HUGO_TITLE="Badger Doc ${2}" \ - VERSIONS=${VERSION_STRING} \ - CURRENT_BRANCH=${1} \ - CURRENT_VERSION=${2} ${HUGO} \ - --destination="${PUBLIC}"/"${dir}" \ - --baseURL="${HOST}"/"${dir}" 1>/dev/null -} - -branchUpdated() { - local branch="$1" - git checkout -q "$1" - UPSTREAM=$(git rev-parse "@{u}") - LOCAL=$(git rev-parse "@") - - if [[ ${LOCAL} != "${UPSTREAM}" ]]; then - git merge -q origin/"${branch}" - return 0 - else - return 1 - fi -} - -publicFolder() { - dir='' - if [[ $1 == "${VERSIONS_ARRAY[0]}" ]]; then - echo "${PUBLIC}" - else - echo "${PUBLIC}/$1" - fi -} - -checkAndUpdate() { - local version="$1" - local branch="" - - if [[ ${version} == "master" ]]; then - branch="master" - else - branch="release/${version}" - fi - - if branchUpdated "${branch}"; then - git merge -q origin/"${branch}" - rebuild "${branch}" "${version}" - fi - - folder=$(publicFolder "${version}") - if [[ ${firstRun} == 1 ]] || [[ ${themeUpdated} == 0 ]] || [[ ! -d ${folder} ]]; then - rebuild "${branch}" "${version}" - fi -} - -firstRun=1 -while true; do - # Lets move to the docs directory. - pushd "$(dirname "$0")/.." >/dev/null - - currentBranch=$(git rev-parse --abbrev-ref HEAD) - - # Lets check if the theme was updated. - pushd themes/hugo-docs >/dev/null - git remote update >/dev/null - themeUpdated=1 - if branchUpdated "master"; then - echo -e "$(date) ${GREEN} Theme has been updated. Now will update the docs.${RESET}" - themeUpdated=0 - fi - popd >/dev/null - - # Now lets check the theme. - echo -e "$(date) Starting to check branches." - git remote update >/dev/null - - for version in "${VERSIONS_ARRAY[@]}"; do - checkAndUpdate "${version}" - done - - echo -e "$(date) Done checking branches.\n" - - git checkout -q "${currentBranch}" - popd >/dev/null - - firstRun=0 - if ! ${LOOP}; then - exit - fi - sleep 60 -done diff --git a/docs/scripts/local.sh b/docs/scripts/local.sh deleted file mode 100755 index 5ede5f594..000000000 --- a/docs/scripts/local.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -set -e - -GREEN='\033[32;1m' -RESET='\033[0m' - -VERSIONS_ARRAY=( - 'preview' -) - -joinVersions() { - versions=$(printf ",%s" "${VERSIONS_ARRAY[@]}") - echo "${versions:1}" -} - -VERSION_STRING=$(joinVersions) - -run() { - export CURRENT_BRANCH="master" - export CURRENT_VERSION=${VERSIONS_ARRAY[0]} - export VERSIONS=${VERSION_STRING} - export DGRAPH_ENDPOINT=${DGRAPH_ENDPOINT:-"https://play.dgraph.io/query?latency=true"} - - export HUGO_TITLE="Badger Doc - Preview" \ - export VERSIONS=${VERSION_STRING} \ - export CURRENT_BRANCH="master" \ - export CURRENT_VERSION=${CURRENT_VERSION} - - pushd "$(dirname "$0")/.." >/dev/null - pushd themes >/dev/null - - if [[ ! -d "hugo-docs" ]]; then - echo -e "$(date) ${GREEN} Hugo-docs repository not found. Cloning the repo. ${RESET}" - git clone https://github.com/dgraph-io/hugo-docs.git - else - echo -e "$(date) ${GREEN} Hugo-docs repository found. Pulling the latest version from master. ${RESET}" - pushd hugo-docs >/dev/null - git pull - popd >/dev/null - fi - popd >/dev/null - - if [[ $1 == "-p" || $1 == "--preview" ]]; then - echo -e "$(date) ${GREEN} Generating documentation static pages in the public folder. ${RESET}" - hugo --destination=public --baseURL="$2" 1>/dev/null - echo -e "$(date) ${GREEN} Done building. ${RESET}" - else - hugo server -w --baseURL=http://localhost:1313 - fi - popd >/dev/null -} - -run "$1" "$2" diff --git a/docs/static/images/diggy-shadow.png b/docs/static/images/diggy-shadow.png deleted file mode 100644 index d0e9b7095..000000000 Binary files a/docs/static/images/diggy-shadow.png and /dev/null differ diff --git a/docs/themes/.DS_Store b/docs/themes/.DS_Store deleted file mode 100644 index 8921d9792..000000000 Binary files a/docs/themes/.DS_Store and /dev/null differ diff --git a/docs/themes/hugo-docs/LICENSE.md b/docs/themes/hugo-docs/LICENSE.md deleted file mode 100644 index 1336985ab..000000000 --- a/docs/themes/hugo-docs/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Grav Copyright (c) 2016 MATHIEU CORNIC - -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/docs/themes/hugo-docs/archetypes/default.md b/docs/themes/hugo-docs/archetypes/default.md deleted file mode 100644 index 2b35103fe..000000000 --- a/docs/themes/hugo-docs/archetypes/default.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Some Title" -weight: 5 -prev: /prev/path -next: /next/path -toc: true ---- - -Lorem Ipsum diff --git a/docs/themes/hugo-docs/images/screenshot.png b/docs/themes/hugo-docs/images/screenshot.png deleted file mode 100644 index e4bfb96bb..000000000 Binary files a/docs/themes/hugo-docs/images/screenshot.png and /dev/null differ diff --git a/docs/themes/hugo-docs/images/tn.png b/docs/themes/hugo-docs/images/tn.png deleted file mode 100644 index 2ccc485f5..000000000 Binary files a/docs/themes/hugo-docs/images/tn.png and /dev/null differ diff --git a/docs/themes/hugo-docs/layouts/.gitignore b/docs/themes/hugo-docs/layouts/.gitignore deleted file mode 100644 index f3ecebe23..000000000 --- a/docs/themes/hugo-docs/layouts/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/hugo-docs - diff --git a/docs/themes/hugo-docs/layouts/404.html b/docs/themes/hugo-docs/layouts/404.html deleted file mode 100644 index 8a9b80e07..000000000 --- a/docs/themes/hugo-docs/layouts/404.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - {{ partial "meta.html" . }} - {{ .Title }} - - - - - - - - - - - - - - -
-
-
-
-

Error

-

-

-

Woops. Looks like this page doesn't exist.

-

-

Go to homepage

-

-
-
- -
- - - diff --git a/docs/themes/hugo-docs/layouts/_default/article.html b/docs/themes/hugo-docs/layouts/_default/article.html deleted file mode 100644 index 4a86a7167..000000000 --- a/docs/themes/hugo-docs/layouts/_default/article.html +++ /dev/null @@ -1,9 +0,0 @@ - -
- {{ partial "request-edit.html" . }} - {{ partial "suggest-edit.html" . }} - -

{{ .Title }}

- -
{{ .Content }}
-
diff --git a/docs/themes/hugo-docs/layouts/_default/list.html b/docs/themes/hugo-docs/layouts/_default/list.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/themes/hugo-docs/layouts/_default/section.html b/docs/themes/hugo-docs/layouts/_default/section.html deleted file mode 100644 index 78a61d7ff..000000000 --- a/docs/themes/hugo-docs/layouts/_default/section.html +++ /dev/null @@ -1,7 +0,0 @@ -{{ partial "header.html" . }} - -{{ range .Data.Pages.ByWeight }} - {{ .Render "article" }} -{{ end }} - -{{ partial "footer.html" . }} diff --git a/docs/themes/hugo-docs/layouts/index.html b/docs/themes/hugo-docs/layouts/index.html deleted file mode 100644 index 0169320ad..000000000 --- a/docs/themes/hugo-docs/layouts/index.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ partial "header.html" . }} - -
- {{ partial "request-edit.html" . }} - {{ partial "suggest-edit.html" . }} - -

{{ .Title }}

- -
{{ .Content }}
-
- - -{{ partial "footer.html" . }} diff --git a/docs/themes/hugo-docs/layouts/partials/footer.html b/docs/themes/hugo-docs/layouts/partials/footer.html deleted file mode 100644 index f6df81639..000000000 --- a/docs/themes/hugo-docs/layouts/partials/footer.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/themes/hugo-docs/layouts/partials/header.html b/docs/themes/hugo-docs/layouts/partials/header.html deleted file mode 100644 index 73b5b9f35..000000000 --- a/docs/themes/hugo-docs/layouts/partials/header.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - {{ .Hugo.Generator }} - {{ partial "meta.html" . }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{.Section | default "Badgerdb Documentation" | humanize}} — {{ .Site.Title }} - - - - - - - - - - - - - - - {{ partial "topbar.html" . }} - {{ partial "sidebar.html" . }} - -
-
diff --git a/docs/themes/hugo-docs/layouts/partials/meta.html b/docs/themes/hugo-docs/layouts/partials/meta.html deleted file mode 100644 index 9f4975a17..000000000 --- a/docs/themes/hugo-docs/layouts/partials/meta.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/themes/hugo-docs/layouts/partials/request-edit.html b/docs/themes/hugo-docs/layouts/partials/request-edit.html deleted file mode 100644 index 2bf3ed670..000000000 --- a/docs/themes/hugo-docs/layouts/partials/request-edit.html +++ /dev/null @@ -1,8 +0,0 @@ -{{ $currentBranch := getenv "CURRENT_BRANCH" }} - - - Report Issue - diff --git a/docs/themes/hugo-docs/layouts/partials/sidebar.html b/docs/themes/hugo-docs/layouts/partials/sidebar.html deleted file mode 100644 index e3dd12e9a..000000000 --- a/docs/themes/hugo-docs/layouts/partials/sidebar.html +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/docs/themes/hugo-docs/layouts/partials/suggest-edit.html b/docs/themes/hugo-docs/layouts/partials/suggest-edit.html deleted file mode 100644 index 66b2a7d2a..000000000 --- a/docs/themes/hugo-docs/layouts/partials/suggest-edit.html +++ /dev/null @@ -1,6 +0,0 @@ -{{ $currentBranch := getenv "CURRENT_BRANCH" }} - - - Edit Page - \ No newline at end of file diff --git a/docs/themes/hugo-docs/layouts/partials/topbar.html b/docs/themes/hugo-docs/layouts/partials/topbar.html deleted file mode 100644 index a8f7fc7f7..000000000 --- a/docs/themes/hugo-docs/layouts/partials/topbar.html +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/docs/themes/hugo-docs/layouts/shortcodes/load-img.html b/docs/themes/hugo-docs/layouts/shortcodes/load-img.html deleted file mode 100644 index b83a8ae68..000000000 --- a/docs/themes/hugo-docs/layouts/shortcodes/load-img.html +++ /dev/null @@ -1,4 +0,0 @@ -{{ $url := .Get 0}} -{{ $alt := .Get 1}} - -{{ $alt }} \ No newline at end of file diff --git a/docs/themes/hugo-docs/layouts/shortcodes/notice.html b/docs/themes/hugo-docs/layouts/shortcodes/notice.html deleted file mode 100644 index 0febde8fe..000000000 --- a/docs/themes/hugo-docs/layouts/shortcodes/notice.html +++ /dev/null @@ -1,5 +0,0 @@ -{{ $type := .Get 0}} - -
- {{ humanize $type }} {{ .Inner | markdownify }} -
diff --git a/docs/themes/hugo-docs/layouts/shortcodes/version.html b/docs/themes/hugo-docs/layouts/shortcodes/version.html deleted file mode 100644 index 3dd67c17a..000000000 --- a/docs/themes/hugo-docs/layouts/shortcodes/version.html +++ /dev/null @@ -1 +0,0 @@ -{{ getenv "CURRENT_VERSION" }} \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/css/theme.css b/docs/themes/hugo-docs/static/css/theme.css deleted file mode 100644 index a98670a77..000000000 --- a/docs/themes/hugo-docs/static/css/theme.css +++ /dev/null @@ -1,741 +0,0 @@ -@charset "UTF-8"; -html body { - font-family: "Lato", sans-serif; - font-size: 15px; - line-height: 1.6; - background-color: #fff; - color: #4a4a4a; - margin: 0; -} -a { - color: #00bdf3; -} -a:hover { - color: #0082a7; -} -b, -strong, -label, -th { - font-weight: 600; -} -/*code { - border-radius: 2px; - white-space: nowrap; - color: #5e5e5e; - background: #FFF7DD; - border: 1px solid #fbf0cb; - padding: 0px 2px; -}*/ -hr { - border-bottom: 4px solid #f0f2f4; -} - -table { - border: 1px solid #eaeaea; - table-layout: auto; -} -th { - background: #f7f7f7; - padding: 0.5rem; -} -td { - padding: 0.5rem; - border: 1px solid #eaeaea; -} - -.notices { - border-radius: 3px; - margin: 10px 0; - padding: 10px 19px; -} - -.notices .type { - font-weight: 600; - margin-right: 8px; - font-size: 105%; -} - -.notices p { - margin: 0; - display: inline-block; -} - -.notices.incomplete { - border-color: #f3d98c; - background-color: #f7f7f1; - border: 1px solid #e2e2e2; -} - -.notices.note { - border-color: #f3d98c; - background-color: #fffad5; - border: 1px solid #e2e2e2; -} - -.notices.tip { - border-color: #87cb74; - background-color: #e3f9e3; - border: 1px solid #e2e2e2; -} - -.notices.warning { - border-color: #c16560; - background-color: #ffefe3; - border: 1px solid #e2e2e2; -} - -.notices.outdated { - border-color: #c16560; - background-color: #ffefe3; - border: 1px solid #e2e2e2; -} - -/* headers */ -html h1, -html h2, -html h3, -html h4, -html h5, -html h6 { - font-family: "Lato", sans-serif; - font-weight: 700; - color: #232323; - line-height: 1.1; - margin: 1.6em 0 0.8em; -} -html h1 { - font-size: 2.1em; - border-bottom: 1px solid #f4f4f4; - padding-bottom: 0.6em; -} -html h2 { - font-size: 1.9em; -} -html h3 { - font-size: 1.5em; -} -html h4 { - font-size: 1.25em; -} -html p { - margin: 0 0 0.8em; -} - -.content-wrapper { - padding-top: 64px; - position: relative; - background: white; - transition: all 300ms cubic-bezier(0.175, 0.885, 0.335, 1.05); -} -.content-wrapper h1 { - margin-top: 0; -} -.content-wrapper .content { - padding: 21px 43px 67px; -} - -@media screen and (max-width: 480px) { - .content-wrapper .content { - padding: 23px 22px; - } -} - -.content img { - max-width: 100%; -} - -body.sidebar-visible { - overflow-x: hidden; -} -body.sidebar-visible .content-wrapper { - transform: translateX(280px); - border-left: 1px solid #f1f1f1; -} - -html pre { - position: relative; - padding: 10px 19px; - transition: all 300ms cubic-bezier(0.175, 0.885, 0.335, 1.05); - margin: 10px 0; - background: #f9f9f9; - border: 0; - border-radius: 2px; - line-height: 1.45; - border: 1px solid #ececec; -} -html pre code { - /*color: #237794;*/ - background: inherit; - white-space: inherit; - border: 0; - padding: 0; - margin: 0; - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; - font-size: 90%; -} -pre.collapsed { - max-height: 330px; - overflow: hidden; -} -pre.collapsed .showmore { - text-align: center; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - padding-bottom: 5px; - padding-top: 26px; - cursor: pointer; - background: linear-gradient(180deg, hsla(0, 0%, 100%, 0.1), rgba(226, 226, 226, 0.72)); - color: #5a5a5a; -} -pre.collapsed .showmore:hover { - background: linear-gradient(180deg, hsla(0, 0%, 100%, 0.1), rgba(226, 226, 226, 0.91)); - font-weight: 600; -} -pre.collapsed .showmore span { - /*background: white; - border: 1px solid #ececec; - padding: 6px 11px 3px; - text-transform: uppercase; - font-size: 11px;*/ -} -/* unset the default hljs default style*/ -.hljs { - display: block; - overflow-x: inherit; - padding: 0; - background: inherit; -} -.copy-btn { - position: absolute; - right: 0; - top: 0; - color: #5a5a5a; - background: white; - padding: 6px 11px 3px; - text-transform: uppercase; - font-size: 11px; - letter-spacing: 0.5px; - border-bottom: 1px solid #ececec; - border-left: 1px solid #ececec; - border-bottom-left-radius: 3px; - cursor: pointer; -} -.copy-btn:not(.copied):hover { - background-color: #fdfdfd; -} -.copy-btn.copied { - cursor: default; -} - -#header { - height: 64px; - position: fixed; - border-bottom: 1px solid #eee; - padding: 0 31px; - z-index: 2; - top: 0; - right: 0; - bottom: auto; - left: 0; - width: auto; - background: #ffffff; - opacity: 0.99; -} -#header .logo { - width: 118px; -} -#header .menu-search { - width: 250px; -} -#header .outer-menu-container { - height: 100%; - float: right; - padding-left: 16px; -} -#header .outer-menu-container:before { - content: ""; - display: inline-block; - vertical-align: middle; - height: 100%; -} -#header .menu-search { - display: inline-block; -} -#header .menu-search .algolia-autocomplete { - width: 100%; -} -#header .menu-container { - display: inline-block; -} -#header .menu-container .main-menu { - margin: 0; - padding-left: 10px; -} -#header .menu-container ul { - list-style: none; -} -#header .menu-container ul li { - display: inline-block; -} -#header .menu-container ul li a { - color: #5f5f5f; - padding: 21px 17px; - display: inline-block; - text-decoration: none; - font-size: 14px; -} -#header .menu-container ul li a:hover { - text-decoration: none; - background: #f7f7f7; - color: #464646; -} -#header .menu-container ul li a:focus { - text-decoration: none; -} -#header .brand { - margin-top: 14px; - display: inline-block; -} - -#sidebar-toggle { - display: inline-block; - color: #3e3e3e; - font-size: 21px; - float: right; - padding: 15px 16px 15px 30px; -} - -#sidebar { - background-color: #fdfdfd; - padding-bottom: 3rem; - position: fixed; - width: 280px; - bottom: 0; - left: 0; - font-weight: 400; - overflow-x: hidden; - overflow-y: scroll; - font-size: 15px; - top: 64px; - transition: all 300ms cubic-bezier(0.175, 0.885, 0.335, 1.05); -} -#sidebar::-webkit-scrollbar-thumb { - background: rgba(0, 0, 0, 0.06); -} -#sidebar::-webkit-scrollbar { - width: 6px; -} -#sidebar::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.05); -} - -#sidebar a { - text-decoration: none; -} - -#sidebar .sidebar-menu { - list-style: none; - margin-bottom: 0; - margin-top: 0; - padding: 71px 30px 23px; - display: flex; - justify-content: space-between; -} -#sidebar .sidebar-menu li { - display: inline-block; -} -#sidebar .sidebar-menu a { - display: block; - color: #a7a4a4; - font-size: 12px; -} -#sidebar .sidebar-menu a:hover { - color: #464646; -} - -.topics { - list-style: none; - padding-left: 19px; - margin-bottom: 0; -} -.topics .main-topic { - padding-bottom: 8px; -} -.topics .main-topic > a { - font-weight: 600; - font-size: 16px; - color: black; - display: block; - padding-bottom: 8px; -} -.topics .main-topic.active > a { - font-weight: 600; - color: #fb5812; -} - -.topic { - position: relative; - transition: all 250ms ease-out; -} - -.topic .fa { - visibility: hidden; - position: absolute; - left: -11px; - top: 9.5px; - font-size: 12px; - transition: all 250ms ease-out; -} - -.topic:hover > .fa { - visibility: visible; - color: #fb5812; -} -.topic.active > .fa { - visibility: visible; - color: #fb5812; -} - -.sub-topics { - list-style: none; - padding-left: 14px; - font-weight: 400; -} -.sub-topics li { - color: #707070; -} -.sub-topics li.active { - /*color: #ff6929;*/ - color: #fb5812; -} -.sub-topics li a { - color: inherit; - display: block; - font-size: 0.95em; - padding: 5px 0px; -} -.menu-header { - padding: 20px 20px 10px; - display: flex; - justify-content: space-between; - align-items: center; -} -.menu-header .heading { - display: inline-block; - font-weight: 600; -} - -h2, -h3 { - position: relative; -} -h1:hover .anchor i, -h2:hover .anchor i, -h3:hover .anchor i { - visibility: visible; -} -.anchor { - position: absolute; - top: 50%; - right: auto; - bottom: auto; - left: -24px; - width: auto; - height: auto; - padding-right: 13px; - transform: translateY(-50%); - font-size: 16px; - line-height: 24px; - color: #868686; -} -.anchor i { - visibility: hidden; - vertical-align: middle; - /*vertical-align: -webkit-baseline-middle;*/ -} -.anchor:hover { - color: #717171; -} -.anchor-offset { - display: block; - position: relative; - top: -83px; - visibility: hidden; -} -.edit-btn { - float: right; - text-decoration: none; - border: 1px solid #d6d6d6; - border-radius: 2px; - padding: 2px 9px; - color: #5d5d5d; - font-size: 12px; - margin: 8px 4px; -} -.edit-btn:hover { - color: #333333; - box-shadow: 0px 0px 0.5px 0px #888888; -} -.edit-btn .fa { - margin-right: 3px; -} - -/* min-width: 800px */ -/* toggle sidebar visibility */ -@media screen and (min-width: 800px) { - .content-wrapper { - margin-left: 280px; - border-left: 1px solid #f1f1f1; - } - #sidebar-toggle { - display: none; - } - #sidebar .sidebar-menu { - display: none; - } -} -@media screen and (max-width: 999px) { - #header .menu-search { - width: 192px; - } -} -@media screen and (max-width: 799px) { - #header .menu-search { - width: 180px; - } - #header .menu-search .algolia-autocomplete .ds-dropdown-menu { - min-width: 390px; - } - #header .menu-container { - display: none; - } - .edit-btn { - display: none; - } -} -@media screen and (max-width: 500px) { - #header { - padding: 0 13px 0 31px; - } - #header .menu-search { - width: 150px; - } - #header .menu-search .algolia-autocomplete .ds-dropdown-menu { - min-width: 310px; - } -} -@media screen and (max-width: 425px) { - #header { - padding: 0 13px 0 31px; - } -} -@media screen and (max-width: 400px) { - #header .menu-search { - width: 120px; - } - #header .menu-search .algolia-autocomplete .ds-dropdown-menu { - min-width: 290px; - } -} -@media screen and (max-width: 375px) { - #header .outer-menu-container { - padding-left: 8px; - } - #header .menu-search { - width: 112px; - } - #header .menu-search .algolia-autocomplete .ds-dropdown-menu { - min-width: 250px; - } - #header #sidebar-toggle { - padding-left: 8px; - } -} -@media screen and (max-width: 340px) { - #header .outer-menu-container { - padding-left: 5px; - } - #header .menu-search { - width: 100px; - } - #header .menu-search .algolia-autocomplete .ds-dropdown-menu { - min-width: 225px; - } - #header #sidebar-toggle { - padding-left: 5px; - } -} - -/* table of contents in home page */ - -section.toc .section-name { - font-size: 16px; - font-weight: 600; -} -section.toc .section-desc { - margin-bottom: 0; -} -section.toc .section-item { - margin-bottom: 8px; -} - -/* custom bootstrap */ -.row-no-padding [class^="col-"] { - padding-left: 0 !important; - padding-right: 0 !important; -} - -/* MC modal */ -.mc-modal { - width: 360px !important; - bottom: 0 !important; - right: 15px !important; -} - -.modalContent { - width: 360px !important; -} - -.mc-banner { - top: auto !important; - bottom: 0 !important; -} - -@media only screen and (max-width: 768px) { - .mc-banner { - border-top: 1px solid #ccc !important; - } -} - -:root { - --cols: 1; - --width: 90vw; - --gap: 5vw; -} -@media screen and (min-width: 680px) { - :root { - --cols: 2; - --width: 300px; - --gap: 10px; - } -} -@media screen and (min-width: 1000px) { - :root { - --cols: 3; - --width: 300px; - --gap: 10px; - } -} -@media screen and (min-width: 1200px) { - :root { - --cols: 3; - --width: 320px; - --gap: 30px; - } -} -.landing { - display: flex; - flex-direction: row; - align-items: stretch; - flex-wrap: wrap; - - margin: 0 calc(0px - var(--gap)); - width: calc(var(--cols) * (var(--width) + 2 * var(--gap))); -} -.landing .hero { - width: calc(var(--cols) * (var(--width) + 2 * var(--gap))); - padding: 0 var(--gap); -} -.landing .hero p { - width: 50%; -} -@media screen and (max-width: 1000px) { - .landing .hero img { - display: none; - } - .landing .hero p { - width: 100%; - } -} - -.landing .hero img { - right: var(--gap); -} -.landing .item { - padding: 72px 32px 32px; - border-radius: 4px; - box-shadow: 0 0 6px 1px #ccc; - display: inline-block; - margin-bottom: 24px; - position: relative; - - box-sizing: border-box; - width: var(--width); - margin: var(--gap); -} - -.landing .item h3 { - margin: 0 0 8px; - padding: 0; - font-size: 1rem; - font-weight: bold; -} -.landing .item h3:hover, -.landing .item .cta:hover { - text-decoration: underline; -} - -.landing .item .icon { - position: absolute; - left: 32px; - top: 32px; - height: 24px; - width: 24px; - font-size: 24px; - line-height: 24px; -} - -.landing .item .icon * { - fill: #fb5812; - color: #fb5812; -} - -.landing .item p { - margin: 0 0 16px; - padding: 0; - color: #000; -} -.landing .item a:hover { - text-decoration: none; -} - -.landing .item p.cta { - margin: 0 0 16px; - padding: 0; - color: #fb5812; -} - -.landing .hero { - position: relative; - height: 160px; - margin-bottom: 32px; -} -.landing .hero h1 { - padding: 24px 0 8px; - font-size: 24px; -} -.landing .hero img { - position: absolute; - border-radius: 4px; - overflow: hidden; - height: 160px; - top: 0; - max-width: 45%; -} diff --git a/docs/themes/hugo-docs/static/fonts/FontAwesome.otf b/docs/themes/hugo-docs/static/fonts/FontAwesome.otf deleted file mode 100644 index 3ed7f8b48..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/FontAwesome.otf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Inconsolata.eot b/docs/themes/hugo-docs/static/fonts/Inconsolata.eot deleted file mode 100644 index 0a705d653..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Inconsolata.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Inconsolata.svg b/docs/themes/hugo-docs/static/fonts/Inconsolata.svg deleted file mode 100644 index 925c8252a..000000000 --- a/docs/themes/hugo-docs/static/fonts/Inconsolata.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Inconsolata.ttf b/docs/themes/hugo-docs/static/fonts/Inconsolata.ttf deleted file mode 100644 index 4b8a36d24..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Inconsolata.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Inconsolata.woff b/docs/themes/hugo-docs/static/fonts/Inconsolata.woff deleted file mode 100644 index 6f39625e5..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Inconsolata.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.eot b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.eot deleted file mode 100644 index 9984682fc..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.svg b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.svg deleted file mode 100644 index d7faba581..000000000 --- a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.ttf b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.ttf deleted file mode 100644 index 8cfb62dd5..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff deleted file mode 100644 index d5c429079..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 deleted file mode 100644 index eefb4a318..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-Normal-webfont.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot deleted file mode 100644 index 2a26561f9..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg deleted file mode 100644 index a9f412f88..000000000 --- a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf deleted file mode 100644 index 9ce9c7f99..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff deleted file mode 100644 index 381650c98..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 b/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 deleted file mode 100644 index 7e659549b..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.eot b/docs/themes/hugo-docs/static/fonts/Work_Sans_200.eot deleted file mode 100644 index 4052e4f94..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.svg b/docs/themes/hugo-docs/static/fonts/Work_Sans_200.svg deleted file mode 100644 index 8e426cf9f..000000000 --- a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.ttf b/docs/themes/hugo-docs/static/fonts/Work_Sans_200.ttf deleted file mode 100644 index 68019e1cc..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff b/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff deleted file mode 100644 index a1bd9e469..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff2 b/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff2 deleted file mode 100644 index 20c68a75c..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_200.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.eot b/docs/themes/hugo-docs/static/fonts/Work_Sans_300.eot deleted file mode 100644 index ace799382..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.svg b/docs/themes/hugo-docs/static/fonts/Work_Sans_300.svg deleted file mode 100644 index 50620ae6d..000000000 --- a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.ttf b/docs/themes/hugo-docs/static/fonts/Work_Sans_300.ttf deleted file mode 100644 index 35387c235..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff b/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff deleted file mode 100644 index 8d789eae9..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff2 b/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff2 deleted file mode 100644 index f6e216d64..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_300.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.eot b/docs/themes/hugo-docs/static/fonts/Work_Sans_500.eot deleted file mode 100644 index 9df692942..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.svg b/docs/themes/hugo-docs/static/fonts/Work_Sans_500.svg deleted file mode 100644 index 1bd4f27a2..000000000 --- a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.ttf b/docs/themes/hugo-docs/static/fonts/Work_Sans_500.ttf deleted file mode 100644 index 5b8cc5342..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff b/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff deleted file mode 100644 index df058514f..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff2 b/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff2 deleted file mode 100644 index b06c54df0..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/Work_Sans_500.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.eot b/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.eot deleted file mode 100644 index 9b6afaedc..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.svg b/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.svg deleted file mode 100644 index d05688e9e..000000000 --- a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.ttf b/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 26dea7951..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff b/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff deleted file mode 100644 index dc35ce3c2..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff2 b/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 500e51725..000000000 Binary files a/docs/themes/hugo-docs/static/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/Screenshot from 2020-07-07 19-14-26.png b/docs/themes/hugo-docs/static/images/Screenshot from 2020-07-07 19-14-26.png deleted file mode 100644 index 669ff0089..000000000 Binary files a/docs/themes/hugo-docs/static/images/Screenshot from 2020-07-07 19-14-26.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/badger.png b/docs/themes/hugo-docs/static/images/badger.png deleted file mode 100644 index 18780a441..000000000 Binary files a/docs/themes/hugo-docs/static/images/badger.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/badger.svg b/docs/themes/hugo-docs/static/images/badger.svg deleted file mode 100644 index 2a25f5b83..000000000 --- a/docs/themes/hugo-docs/static/images/badger.svg +++ /dev/null @@ -1 +0,0 @@ -BadgerDB \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/images/dgraph-black.png b/docs/themes/hugo-docs/static/images/dgraph-black.png deleted file mode 100644 index 51a0493fb..000000000 Binary files a/docs/themes/hugo-docs/static/images/dgraph-black.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/dgraph.svg b/docs/themes/hugo-docs/static/images/dgraph.svg deleted file mode 100644 index 527e52c1c..000000000 --- a/docs/themes/hugo-docs/static/images/dgraph.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - --> diff --git a/docs/themes/hugo-docs/static/images/diggy-shadow.png b/docs/themes/hugo-docs/static/images/diggy-shadow.png deleted file mode 100644 index d0e9b7095..000000000 Binary files a/docs/themes/hugo-docs/static/images/diggy-shadow.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-144x144.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-144x144.png deleted file mode 100644 index 7193ebc3b..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-144x144.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-192x192.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-192x192.png deleted file mode 100644 index 26c006aff..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-192x192.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-36x36.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-36x36.png deleted file mode 100644 index 4dd81f668..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-36x36.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-48x48.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-48x48.png deleted file mode 100644 index 81ed194fb..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-48x48.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-72x72.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-72x72.png deleted file mode 100644 index 154d4135b..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-72x72.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/android-chrome-96x96.png b/docs/themes/hugo-docs/static/images/favicons/android-chrome-96x96.png deleted file mode 100644 index 67289675e..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/android-chrome-96x96.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-114x114.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-114x114.png deleted file mode 100644 index 2e14befc7..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-114x114.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-120x120.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-120x120.png deleted file mode 100644 index db9eda1e1..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-120x120.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-144x144.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-144x144.png deleted file mode 100644 index 60999b92b..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-144x144.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-152x152.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-152x152.png deleted file mode 100644 index 50ef52104..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-152x152.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-180x180.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-180x180.png deleted file mode 100644 index c4add71b4..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-180x180.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-57x57.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-57x57.png deleted file mode 100644 index 41edf36e2..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-57x57.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-60x60.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-60x60.png deleted file mode 100644 index a53c799be..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-60x60.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-72x72.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-72x72.png deleted file mode 100644 index 4412dfadf..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-72x72.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-76x76.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-76x76.png deleted file mode 100644 index 25d1a9e3e..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon-76x76.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon.png b/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon.png deleted file mode 100644 index c4add71b4..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/apple-touch-icon.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/favicon-16x16.png b/docs/themes/hugo-docs/static/images/favicons/favicon-16x16.png deleted file mode 100644 index 616137fac..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/favicon-16x16.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/favicon-194x194.png b/docs/themes/hugo-docs/static/images/favicons/favicon-194x194.png deleted file mode 100644 index f1e788ddb..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/favicon-194x194.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/favicon-32x32.png b/docs/themes/hugo-docs/static/images/favicons/favicon-32x32.png deleted file mode 100644 index d9820313f..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/favicon-32x32.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/favicon-96x96.png b/docs/themes/hugo-docs/static/images/favicons/favicon-96x96.png deleted file mode 100644 index dd1f77247..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/favicon-96x96.png and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/favicon.ico b/docs/themes/hugo-docs/static/images/favicons/favicon.ico deleted file mode 100644 index d40f66193..000000000 Binary files a/docs/themes/hugo-docs/static/images/favicons/favicon.ico and /dev/null differ diff --git a/docs/themes/hugo-docs/static/images/favicons/manifest.json b/docs/themes/hugo-docs/static/images/favicons/manifest.json deleted file mode 100644 index 90cc7908d..000000000 --- a/docs/themes/hugo-docs/static/images/favicons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Dgraph", - "icons": [ - { - "src": "\/images\/favicons\/android-chrome-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": 0.75 - }, - { - "src": "\/images\/favicons\/android-chrome-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": 1 - }, - { - "src": "\/images\/favicons\/android-chrome-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": 1.5 - }, - { - "src": "\/images\/favicons\/android-chrome-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": 2 - }, - { - "src": "\/images\/favicons\/android-chrome-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": 3 - }, - { - "src": "\/images\/favicons\/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": 4 - } - ] -} diff --git a/docs/themes/hugo-docs/static/images/favicons/safari-pinned-tab.svg b/docs/themes/hugo-docs/static/images/favicons/safari-pinned-tab.svg deleted file mode 100644 index b1116dbbe..000000000 --- a/docs/themes/hugo-docs/static/images/favicons/safari-pinned-tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/themes/hugo-docs/static/images/gopher-404.jpg b/docs/themes/hugo-docs/static/images/gopher-404.jpg deleted file mode 100644 index df1064868..000000000 Binary files a/docs/themes/hugo-docs/static/images/gopher-404.jpg and /dev/null differ diff --git a/docs/themes/hugo-docs/static/js/clipboard.min.js b/docs/themes/hugo-docs/static/js/clipboard.min.js deleted file mode 100644 index 812246d38..000000000 --- a/docs/themes/hugo-docs/static/js/clipboard.min.js +++ /dev/null @@ -1,458 +0,0 @@ -/*! - * clipboard.js v1.5.5 - * https://zenorocha.github.io/clipboard.js - * - * Licensed MIT © Zeno Rocha - */ -!(function (t) { - if ("object" == typeof exports && "undefined" != typeof module) module.exports = t() - else if ("function" == typeof define && define.amd) define([], t) - else { - var e - ;(e = - "undefined" != typeof window - ? window - : "undefined" != typeof global - ? global - : "undefined" != typeof self - ? self - : this), - (e.Clipboard = t()) - } -})(function () { - var t, e, n - return (function t(e, n, r) { - function o(a, c) { - if (!n[a]) { - if (!e[a]) { - var s = "function" == typeof require && require - if (!c && s) return s(a, !0) - if (i) return i(a, !0) - var u = new Error("Cannot find module '" + a + "'") - throw ((u.code = "MODULE_NOT_FOUND"), u) - } - var l = (n[a] = { exports: {} }) - e[a][0].call( - l.exports, - function (t) { - var n = e[a][1][t] - return o(n ? n : t) - }, - l, - l.exports, - t, - e, - n, - r, - ) - } - return n[a].exports - } - for (var i = "function" == typeof require && require, a = 0; a < r.length; a++) o(r[a]) - return o - })( - { - 1: [ - function (t, e, n) { - var r = t("matches-selector") - e.exports = function (t, e, n) { - for (var o = n ? t : t.parentNode; o && o !== document; ) { - if (r(o, e)) return o - o = o.parentNode - } - } - }, - { "matches-selector": 2 }, - ], - 2: [ - function (t, e, n) { - function r(t, e) { - if (i) return i.call(t, e) - for (var n = t.parentNode.querySelectorAll(e), r = 0; r < n.length; ++r) - if (n[r] == t) return !0 - return !1 - } - var o = Element.prototype, - i = - o.matchesSelector || - o.webkitMatchesSelector || - o.mozMatchesSelector || - o.msMatchesSelector || - o.oMatchesSelector - e.exports = r - }, - {}, - ], - 3: [ - function (t, e, n) { - function r(t, e, n, r) { - var i = o.apply(this, arguments) - return ( - t.addEventListener(n, i), - { - destroy: function () { - t.removeEventListener(n, i) - }, - } - ) - } - function o(t, e, n, r) { - return function (n) { - ;(n.delegateTarget = i(n.target, e, !0)), n.delegateTarget && r.call(t, n) - } - } - var i = t("closest") - e.exports = r - }, - { closest: 1 }, - ], - 4: [ - function (t, e, n) { - ;(n.node = function (t) { - return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType - }), - (n.nodeList = function (t) { - var e = Object.prototype.toString.call(t) - return ( - void 0 !== t && - ("[object NodeList]" === e || "[object HTMLCollection]" === e) && - "length" in t && - (0 === t.length || n.node(t[0])) - ) - }), - (n.string = function (t) { - return "string" == typeof t || t instanceof String - }), - (n.function = function (t) { - var e = Object.prototype.toString.call(t) - return "[object Function]" === e - }) - }, - {}, - ], - 5: [ - function (t, e, n) { - function r(t, e, n) { - if (!t && !e && !n) throw new Error("Missing required arguments") - if (!c.string(e)) throw new TypeError("Second argument must be a String") - if (!c.function(n)) throw new TypeError("Third argument must be a Function") - if (c.node(t)) return o(t, e, n) - if (c.nodeList(t)) return i(t, e, n) - if (c.string(t)) return a(t, e, n) - throw new TypeError( - "First argument must be a String, HTMLElement, HTMLCollection, or NodeList", - ) - } - function o(t, e, n) { - return ( - t.addEventListener(e, n), - { - destroy: function () { - t.removeEventListener(e, n) - }, - } - ) - } - function i(t, e, n) { - return ( - Array.prototype.forEach.call(t, function (t) { - t.addEventListener(e, n) - }), - { - destroy: function () { - Array.prototype.forEach.call(t, function (t) { - t.removeEventListener(e, n) - }) - }, - } - ) - } - function a(t, e, n) { - return s(document.body, t, e, n) - } - var c = t("./is"), - s = t("delegate") - e.exports = r - }, - { "./is": 4, delegate: 3 }, - ], - 6: [ - function (t, e, n) { - function r(t) { - var e - if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) - t.focus(), t.setSelectionRange(0, t.value.length), (e = t.value) - else { - t.hasAttribute("contenteditable") && t.focus() - var n = window.getSelection(), - r = document.createRange() - r.selectNodeContents(t), n.removeAllRanges(), n.addRange(r), (e = n.toString()) - } - return e - } - e.exports = r - }, - {}, - ], - 7: [ - function (t, e, n) { - function r() {} - ;(r.prototype = { - on: function (t, e, n) { - var r = this.e || (this.e = {}) - return (r[t] || (r[t] = [])).push({ fn: e, ctx: n }), this - }, - once: function (t, e, n) { - function r() { - o.off(t, r), e.apply(n, arguments) - } - var o = this - return (r._ = e), this.on(t, r, n) - }, - emit: function (t) { - var e = [].slice.call(arguments, 1), - n = ((this.e || (this.e = {}))[t] || []).slice(), - r = 0, - o = n.length - for (r; o > r; r++) n[r].fn.apply(n[r].ctx, e) - return this - }, - off: function (t, e) { - var n = this.e || (this.e = {}), - r = n[t], - o = [] - if (r && e) - for (var i = 0, a = r.length; a > i; i++) - r[i].fn !== e && r[i].fn._ !== e && o.push(r[i]) - return o.length ? (n[t] = o) : delete n[t], this - }, - }), - (e.exports = r) - }, - {}, - ], - 8: [ - function (t, e, n) { - "use strict" - function r(t) { - return t && t.__esModule ? t : { default: t } - } - function o(t, e) { - if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") - } - n.__esModule = !0 - var i = (function () { - function t(t, e) { - for (var n = 0; n < e.length; n++) { - var r = e[n] - ;(r.enumerable = r.enumerable || !1), - (r.configurable = !0), - "value" in r && (r.writable = !0), - Object.defineProperty(t, r.key, r) - } - } - return function (e, n, r) { - return n && t(e.prototype, n), r && t(e, r), e - } - })(), - a = t("select"), - c = r(a), - s = (function () { - function t(e) { - o(this, t), this.resolveOptions(e), this.initSelection() - } - return ( - (t.prototype.resolveOptions = function t() { - var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0] - ;(this.action = e.action), - (this.emitter = e.emitter), - (this.target = e.target), - (this.text = e.text), - (this.trigger = e.trigger), - (this.selectedText = "") - }), - (t.prototype.initSelection = function t() { - if (this.text && this.target) - throw new Error('Multiple attributes declared, use either "target" or "text"') - if (this.text) this.selectFake() - else { - if (!this.target) - throw new Error('Missing required attributes, use either "target" or "text"') - this.selectTarget() - } - }), - (t.prototype.selectFake = function t() { - var e = this - this.removeFake(), - (this.fakeHandler = document.body.addEventListener("click", function () { - return e.removeFake() - })), - (this.fakeElem = document.createElement("textarea")), - (this.fakeElem.style.position = "absolute"), - (this.fakeElem.style.left = "-9999px"), - (this.fakeElem.style.top = - (window.pageYOffset || document.documentElement.scrollTop) + "px"), - this.fakeElem.setAttribute("readonly", ""), - (this.fakeElem.value = this.text), - document.body.appendChild(this.fakeElem), - (this.selectedText = c.default(this.fakeElem)), - this.copyText() - }), - (t.prototype.removeFake = function t() { - this.fakeHandler && - (document.body.removeEventListener("click"), (this.fakeHandler = null)), - this.fakeElem && - (document.body.removeChild(this.fakeElem), (this.fakeElem = null)) - }), - (t.prototype.selectTarget = function t() { - ;(this.selectedText = c.default(this.target)), this.copyText() - }), - (t.prototype.copyText = function t() { - var e = void 0 - try { - e = document.execCommand(this.action) - } catch (n) { - e = !1 - } - this.handleResult(e) - }), - (t.prototype.handleResult = function t(e) { - e - ? this.emitter.emit("success", { - action: this.action, - text: this.selectedText, - trigger: this.trigger, - clearSelection: this.clearSelection.bind(this), - }) - : this.emitter.emit("error", { - action: this.action, - trigger: this.trigger, - clearSelection: this.clearSelection.bind(this), - }) - }), - (t.prototype.clearSelection = function t() { - this.target && this.target.blur(), window.getSelection().removeAllRanges() - }), - (t.prototype.destroy = function t() { - this.removeFake() - }), - i(t, [ - { - key: "action", - set: function t() { - var e = - arguments.length <= 0 || void 0 === arguments[0] ? "copy" : arguments[0] - if (((this._action = e), "copy" !== this._action && "cut" !== this._action)) - throw new Error('Invalid "action" value, use either "copy" or "cut"') - }, - get: function t() { - return this._action - }, - }, - { - key: "target", - set: function t(e) { - if (void 0 !== e) { - if (!e || "object" != typeof e || 1 !== e.nodeType) - throw new Error('Invalid "target" value, use a valid Element') - this._target = e - } - }, - get: function t() { - return this._target - }, - }, - ]), - t - ) - })() - ;(n.default = s), (e.exports = n.default) - }, - { select: 6 }, - ], - 9: [ - function (t, e, n) { - "use strict" - function r(t) { - return t && t.__esModule ? t : { default: t } - } - function o(t, e) { - if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") - } - function i(t, e) { - if ("function" != typeof e && null !== e) - throw new TypeError( - "Super expression must either be null or a function, not " + typeof e, - ) - ;(t.prototype = Object.create(e && e.prototype, { - constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 }, - })), - e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : (t.__proto__ = e)) - } - function a(t, e) { - var n = "data-clipboard-" + t - if (e.hasAttribute(n)) return e.getAttribute(n) - } - n.__esModule = !0 - var c = t("./clipboard-action"), - s = r(c), - u = t("tiny-emitter"), - l = r(u), - f = t("good-listener"), - d = r(f), - h = (function (t) { - function e(n, r) { - o(this, e), t.call(this), this.resolveOptions(r), this.listenClick(n) - } - return ( - i(e, t), - (e.prototype.resolveOptions = function t() { - var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0] - ;(this.action = "function" == typeof e.action ? e.action : this.defaultAction), - (this.target = "function" == typeof e.target ? e.target : this.defaultTarget), - (this.text = "function" == typeof e.text ? e.text : this.defaultText) - }), - (e.prototype.listenClick = function t(e) { - var n = this - this.listener = d.default(e, "click", function (t) { - return n.onClick(t) - }) - }), - (e.prototype.onClick = function t(e) { - var n = e.delegateTarget || e.currentTarget - this.clipboardAction && (this.clipboardAction = null), - (this.clipboardAction = new s.default({ - action: this.action(n), - target: this.target(n), - text: this.text(n), - trigger: n, - emitter: this, - })) - }), - (e.prototype.defaultAction = function t(e) { - return a("action", e) - }), - (e.prototype.defaultTarget = function t(e) { - var n = a("target", e) - return n ? document.querySelector(n) : void 0 - }), - (e.prototype.defaultText = function t(e) { - return a("text", e) - }), - (e.prototype.destroy = function t() { - this.listener.destroy(), - this.clipboardAction && - (this.clipboardAction.destroy(), (this.clipboardAction = null)) - }), - e - ) - })(l.default) - ;(n.default = h), (e.exports = n.default) - }, - { "./clipboard-action": 8, "good-listener": 5, "tiny-emitter": 7 }, - ], - }, - {}, - [9], - )(9) -}) diff --git a/docs/themes/hugo-docs/static/js/dgraph.js b/docs/themes/hugo-docs/static/js/dgraph.js deleted file mode 100644 index 9197ac00b..000000000 --- a/docs/themes/hugo-docs/static/js/dgraph.js +++ /dev/null @@ -1,387 +0,0 @@ -// debounce limits the amount of function invocation by spacing out the calls -// by at least `wait` ms. -function debounce(func, wait, immediate) { - var timeout - - return function () { - var context = this, - args = arguments - var later = function () { - timeout = null - if (!immediate) func.apply(context, args) - } - - var callNow = immediate && !timeout - clearTimeout(timeout) - timeout = setTimeout(later, wait) - if (callNow) func.apply(context, args) - } -} - -/********** Cookie helpers **/ - -function createCookie(name, val, days) { - var expires = "" - if (days) { - var date = new Date() - date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000) - expires = "; expires=" + date.toUTCString() - } - - document.cookie = name + "=" + val + expires + "; path=/" -} - -function readCookie(name) { - var nameEQ = name + "=" - var ca = document.cookie.split(";") - for (var i = 0; i < ca.length; i++) { - var c = ca[i] - while (c.charAt(0) == " ") c = c.substring(1, c.length) - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length) - } - return null -} - -function eraseCookie(name) { - createCookie(name, "", -1) -} - -/** - * getCurrentVersion gets the current doc version from the URL path and returns it - * - * @params pathname {String} - current path in a format of '/current/path'. - * @return {String} - e.g. 'master', 'v7.7.1', '' - * empty string denotes the latest version - */ -function getCurrentVersion(pathname) { - let candidate - - if (location.pathname.startsWith("/docs")) { - candidate = pathname.split("/")[2] - } else { - candidate = pathname.split("/")[1] - } - - if (candidate === "master") { - return candidate - } - - if (/v\d+\.\d+\.\d+/.test(candidate)) { - return candidate - } - - return "" -} - -// getPathBeforeVersionName gets the current URL path before the version prefix -function getPathBeforeVersionName(location, versionName) { - if (location.pathname.startsWith("/docs")) { - return "/docs/" - } - return "/" -} - -// getPathAfterVersionName gets the current URL path after the version prefix -function getPathAfterVersionName(location, versionName) { - let path - if (location.pathname.startsWith("/docs")) { - if (versionName === "") { - path = location.pathname.split("/").slice(2).join("/") - } else { - path = location.pathname.split("/").slice(3).join("/") - } - return path + location.hash - } - - if (versionName === "") { - path = location.pathname.split("/").slice(1).join("/") - } else { - path = location.pathname.split("/").slice(2).join("/") - } - - return path + location.hash -} - -;(function () { - // clipboard - var clipInit = false - $("pre code:not(.no-copy)").each(function () { - var code = $(this), - text = code.text() - - if (text.length > 5) { - if (!clipInit) { - var text - var clip = new Clipboard(".copy-btn", { - text: function (trigger) { - text = $(trigger).prev("code").text() - return text.replace(/^\$\s/gm, "") - }, - }) - - clip.on("success", function (e) { - e.clearSelection() - $(e.trigger).text("Copied to clipboard!").addClass("copied") - - window.setTimeout(function () { - $(e.trigger).text("Copy").removeClass("copied") - }, 2000) - }) - - clip.on("error", function (e) { - e.clearSelection() - $(e.trigger).text("Error copying") - - window.setTimeout(function () { - $(e.trigger).text("Copy") - }, 2000) - }) - - clipInit = true - } - - code.after('Copy') - } - }) - - // Sidebar - var h2s = document.querySelectorAll("h2") - var h3s = document.querySelectorAll("h3") - var isAfter = function (e1, e2) { - return e1.compareDocumentPosition(e2) & Node.DOCUMENT_POSITION_FOLLOWING - } - var activeLink = document.querySelector(".topic.active") - var allLinks = [] - - var h2sWithH3s = [] - var j = 0 - for (var i = 0; i < h2s.length; i++) { - var h2 = h2s[i] - var nextH2 = h2s[i + 1] - var ourH3s = [] - while (h3s[j] && isAfter(h2, h3s[j]) && (!nextH2 || !isAfter(nextH2, h3s[j]))) { - ourH3s.push({ header: h3s[j] }) - j++ - } - - h2sWithH3s.push({ - header: h2, - subHeaders: ourH3s, - }) - } - - // console.log(h2sWithH3s); - - function createSubtopic(container, headers) { - var subMenu = document.createElement("ul") - subMenu.className = "sub-topics" - container.appendChild(subMenu) - - Array.prototype.forEach.call(headers, function (h) { - var li = createSubtopicItem(h.header) - li.className = "topic sub-topic" - subMenu.appendChild(li) - - if (h.subHeaders) { - createSubtopic(subMenu, h.subHeaders) - } - }) - } - - function createSubtopicItem(h) { - allLinks.push(h) - - var li = document.createElement("li") - li.innerHTML = - ' ' + - (h.title || h.textContent) + - "" - return li - } - - // setActiveSubTopic updates the active subtopic on the sidebar based on the - // hash - // @params hash [String] - hash including the hash sign at the beginning - function setActiveSubTopic(hash) { - // Set inactive the previously active topic - var prevActiveTopic = document.querySelector(".sub-topics .topic.active") - var nextActiveTopic = document.querySelector('.sub-topics a[href="' + hash + '"]').parentNode - - if (prevActiveTopic !== nextActiveTopic) { - nextActiveTopic.classList.add("active") - - if (prevActiveTopic) { - prevActiveTopic.classList.remove("active") - } - } - } - - // updateSidebar updates the active menu in the sidebar - function updateSidebar() { - var currentScrollY = document.body.scrollTop - var topSideOffset = 120 - - var activeHash - for (var i = 0; i < allLinks.length; i++) { - var h = allLinks[i] - var hash = h.getElementsByTagName("a")[0].hash - - if (h.offsetTop - topSideOffset > currentScrollY) { - if (!activeHash) { - activeHash = hash - break - } - } else { - activeHash = hash - } - } - - if (activeHash) { - setActiveSubTopic(activeHash) - } - } - - if (h2sWithH3s.length > 0 && activeLink) { - createSubtopic(activeLink, h2sWithH3s) - } - - var subTopics = document.querySelectorAll(".sub-topics .sub-topic") - for (var i = 0; i < subTopics.length; i++) { - var subTopic = subTopics[i] - subTopic.addEventListener("click", function (e) { - var hash = e.target.hash - setActiveSubTopic(hash) - }) - } - - // Scrollspy for sidebar - window.addEventListener("scroll", debounce(updateSidebar, 15)) - - // Sidebar toggle - document.getElementById("sidebar-toggle").addEventListener("click", function (e) { - e.preventDefault() - var klass = document.body.className - if (klass === "sidebar-visible") { - document.body.className = "" - } else { - document.body.className = "sidebar-visible" - } - }) - - // Anchor tags for headings - function appendAnchor(heading) { - var id = heading.id - var anchorOffset = document.createElement("div") - anchorOffset.className = "anchor-offset" - anchorOffset.id = id - - var anchor = document.createElement("a") - anchor.href = "#" + id - anchor.className = "anchor" - // anchor.innerHTML = 'link' - anchor.innerHTML = '' - heading.insertBefore(anchor, heading.firstChild) - heading.insertBefore(anchorOffset, heading.firstChild) - - // Remove the id from heading - // Instead we will assign the id to the .anchor-offset element to account - // for the fixed header height - heading.removeAttribute("id") - } - var h2s = document.querySelectorAll(".content-wrapper h2, .content-wrapper h3") - for (var i = 0; i < h2s.length; i++) { - appendAnchor(h2s[i]) - } - - // code collapse - var pres = $("pre") - pres.each(function () { - var self = this - - var isInRunnable = $(self).parents(".runnable").length > 0 - if (isInRunnable) { - return - } - - if (self.clientHeight > 330) { - if (self.clientHeight < 380) { - return - } - - self.className += " collapsed" - - var showMore = document.createElement("div") - showMore.className = "showmore" - showMore.innerHTML = "Show all" - showMore.addEventListener("click", function () { - self.className = "" - showMore.parentNode.removeChild(showMore) - }) - - this.appendChild(showMore) - } - }) - - // version selector - // var currentVersion = getCurrentVersion(location.pathname); - // if ( document.getElementsByClassName("version-selector")) { - // document - // .getElementsByClassName("version-selector")[0] - // .addEventListener("change", function(e) { - // // targetVersion: '', 'master', 'v0.7.7', 'v0.7.6', etc. - // var targetVersion = e.target.value; - - // if (currentVersion !== targetVersion) { - // var basePath = getPathBeforeVersionName(location, currentVersion); - // // Getting everything after targetVersion and concatenating it with the hash part. - // var currentPath = getPathAfterVersionName(location, currentVersion); - - // var targetPath; - // if (targetVersion === "") { - // targetPath = basePath + currentPath; - // } else { - // targetPath = basePath + targetVersion + "/" + currentPath; - // } - // location.assign(targetPath); - // } - // }); - // } - - // var versionSelector = document.getElementsByClassName("version-selector")[0], - // options = versionSelector.options; - - // for (var i = 0; i < options.length; i++) { - // if (options[i].value.indexOf("latest") != -1) { - // options[i].value = options[i].value.replace(/\s\(latest\)/, ""); - // } - // } - - // for (var i = 0; i < options.length; i++) { - // if (options[i].value === currentVersion) { - // options[i].selected = true; - // break; - // } - // } - // (" "); - - // Add target = _blank to all external links. - var links = document.links - - for (var i = 0, linksLength = links.length; i < linksLength; i++) { - if (links[i].hostname != window.location.hostname) { - links[i].target = "_blank" - } - } - - /********** On page load **/ - updateSidebar() - var activeTopic = document.querySelector(".sub-topics .topic.active") - - if (activeTopic) { - activeTopic.scrollIntoView() - } -})() diff --git a/docs/themes/hugo-docs/static/js/jquery-2.x.min.js b/docs/themes/hugo-docs/static/js/jquery-2.x.min.js deleted file mode 100644 index 0a638c7e5..000000000 --- a/docs/themes/hugo-docs/static/js/jquery-2.x.min.js +++ /dev/null @@ -1,4786 +0,0 @@ -/*! jQuery v2.2.3 | (c) jQuery Foundation | jquery.org/license */ -!(function (a, b) { - "object" == typeof module && "object" == typeof module.exports - ? (module.exports = a.document - ? b(a, !0) - : function (a) { - if (!a.document) throw new Error("jQuery requires a window with a document") - return b(a) - }) - : b(a) -})("undefined" != typeof window ? window : this, function (a, b) { - var c = [], - d = a.document, - e = c.slice, - f = c.concat, - g = c.push, - h = c.indexOf, - i = {}, - j = i.toString, - k = i.hasOwnProperty, - l = {}, - m = "2.2.3", - n = function (a, b) { - return new n.fn.init(a, b) - }, - o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - p = /^-ms-/, - q = /-([\da-z])/gi, - r = function (a, b) { - return b.toUpperCase() - } - ;(n.fn = n.prototype = - { - jquery: m, - constructor: n, - selector: "", - length: 0, - toArray: function () { - return e.call(this) - }, - get: function (a) { - return null != a ? (0 > a ? this[a + this.length] : this[a]) : e.call(this) - }, - pushStack: function (a) { - var b = n.merge(this.constructor(), a) - return (b.prevObject = this), (b.context = this.context), b - }, - each: function (a) { - return n.each(this, a) - }, - map: function (a) { - return this.pushStack( - n.map(this, function (b, c) { - return a.call(b, c, b) - }), - ) - }, - slice: function () { - return this.pushStack(e.apply(this, arguments)) - }, - first: function () { - return this.eq(0) - }, - last: function () { - return this.eq(-1) - }, - eq: function (a) { - var b = this.length, - c = +a + (0 > a ? b : 0) - return this.pushStack(c >= 0 && b > c ? [this[c]] : []) - }, - end: function () { - return this.prevObject || this.constructor() - }, - push: g, - sort: c.sort, - splice: c.splice, - }), - (n.extend = n.fn.extend = - function () { - var a, - b, - c, - d, - e, - f, - g = arguments[0] || {}, - h = 1, - i = arguments.length, - j = !1 - for ( - "boolean" == typeof g && ((j = g), (g = arguments[h] || {}), h++), - "object" == typeof g || n.isFunction(g) || (g = {}), - h === i && ((g = this), h--); - i > h; - h++ - ) - if (null != (a = arguments[h])) - for (b in a) - (c = g[b]), - (d = a[b]), - g !== d && - (j && d && (n.isPlainObject(d) || (e = n.isArray(d))) - ? (e - ? ((e = !1), (f = c && n.isArray(c) ? c : [])) - : (f = c && n.isPlainObject(c) ? c : {}), - (g[b] = n.extend(j, f, d))) - : void 0 !== d && (g[b] = d)) - return g - }), - n.extend({ - expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""), - isReady: !0, - error: function (a) { - throw new Error(a) - }, - noop: function () {}, - isFunction: function (a) { - return "function" === n.type(a) - }, - isArray: Array.isArray, - isWindow: function (a) { - return null != a && a === a.window - }, - isNumeric: function (a) { - var b = a && a.toString() - return !n.isArray(a) && b - parseFloat(b) + 1 >= 0 - }, - isPlainObject: function (a) { - var b - if ("object" !== n.type(a) || a.nodeType || n.isWindow(a)) return !1 - if ( - a.constructor && - !k.call(a, "constructor") && - !k.call(a.constructor.prototype || {}, "isPrototypeOf") - ) - return !1 - for (b in a); - return void 0 === b || k.call(a, b) - }, - isEmptyObject: function (a) { - var b - for (b in a) return !1 - return !0 - }, - type: function (a) { - return null == a - ? a + "" - : "object" == typeof a || "function" == typeof a - ? i[j.call(a)] || "object" - : typeof a - }, - globalEval: function (a) { - var b, - c = eval - ;(a = n.trim(a)), - a && - (1 === a.indexOf("use strict") - ? ((b = d.createElement("script")), - (b.text = a), - d.head.appendChild(b).parentNode.removeChild(b)) - : c(a)) - }, - camelCase: function (a) { - return a.replace(p, "ms-").replace(q, r) - }, - nodeName: function (a, b) { - return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase() - }, - each: function (a, b) { - var c, - d = 0 - if (s(a)) { - for (c = a.length; c > d; d++) if (b.call(a[d], d, a[d]) === !1) break - } else for (d in a) if (b.call(a[d], d, a[d]) === !1) break - return a - }, - trim: function (a) { - return null == a ? "" : (a + "").replace(o, "") - }, - makeArray: function (a, b) { - var c = b || [] - return ( - null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : g.call(c, a)), c - ) - }, - inArray: function (a, b, c) { - return null == b ? -1 : h.call(b, a, c) - }, - merge: function (a, b) { - for (var c = +b.length, d = 0, e = a.length; c > d; d++) a[e++] = b[d] - return (a.length = e), a - }, - grep: function (a, b, c) { - for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++) - (d = !b(a[f], f)), d !== h && e.push(a[f]) - return e - }, - map: function (a, b, c) { - var d, - e, - g = 0, - h = [] - if (s(a)) for (d = a.length; d > g; g++) (e = b(a[g], g, c)), null != e && h.push(e) - else for (g in a) (e = b(a[g], g, c)), null != e && h.push(e) - return f.apply([], h) - }, - guid: 1, - proxy: function (a, b) { - var c, d, f - return ( - "string" == typeof b && ((c = a[b]), (b = a), (a = c)), - n.isFunction(a) - ? ((d = e.call(arguments, 2)), - (f = function () { - return a.apply(b || this, d.concat(e.call(arguments))) - }), - (f.guid = a.guid = a.guid || n.guid++), - f) - : void 0 - ) - }, - now: Date.now, - support: l, - }), - "function" == typeof Symbol && (n.fn[Symbol.iterator] = c[Symbol.iterator]), - n.each( - "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), - function (a, b) { - i["[object " + b + "]"] = b.toLowerCase() - }, - ) - function s(a) { - var b = !!a && "length" in a && a.length, - c = n.type(a) - return "function" === c || n.isWindow(a) - ? !1 - : "array" === c || 0 === b || ("number" == typeof b && b > 0 && b - 1 in a) - } - var t = (function (a) { - var b, - c, - d, - e, - f, - g, - h, - i, - j, - k, - l, - m, - n, - o, - p, - q, - r, - s, - t, - u = "sizzle" + 1 * new Date(), - v = a.document, - w = 0, - x = 0, - y = ga(), - z = ga(), - A = ga(), - B = function (a, b) { - return a === b && (l = !0), 0 - }, - C = 1 << 31, - D = {}.hasOwnProperty, - E = [], - F = E.pop, - G = E.push, - H = E.push, - I = E.slice, - J = function (a, b) { - for (var c = 0, d = a.length; d > c; c++) if (a[c] === b) return c - return -1 - }, - K = - "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - L = "[\\x20\\t\\r\\n\\f]", - M = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - N = - "\\[" + - L + - "*(" + - M + - ")(?:" + - L + - "*([*^$|!~]?=)" + - L + - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + - M + - "))|)" + - L + - "*\\]", - O = - ":(" + - M + - ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + - N + - ")*)|.*)\\)|)", - P = new RegExp(L + "+", "g"), - Q = new RegExp("^" + L + "+|((?:^|[^\\\\])(?:\\\\.)*)" + L + "+$", "g"), - R = new RegExp("^" + L + "*," + L + "*"), - S = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"), - T = new RegExp("=" + L + "*([^\\]'\"]*?)" + L + "*\\]", "g"), - U = new RegExp(O), - V = new RegExp("^" + M + "$"), - W = { - ID: new RegExp("^#(" + M + ")"), - CLASS: new RegExp("^\\.(" + M + ")"), - TAG: new RegExp("^(" + M + "|[*])"), - ATTR: new RegExp("^" + N), - PSEUDO: new RegExp("^" + O), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - L + - "*(even|odd|(([+-]|)(\\d*)n|)" + - L + - "*(?:([+-]|)" + - L + - "*(\\d+)|))" + - L + - "*\\)|)", - "i", - ), - bool: new RegExp("^(?:" + K + ")$", "i"), - needsContext: new RegExp( - "^" + - L + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - L + - "*((?:-\\d)?\\d*)" + - L + - "*\\)|)(?=[^-]|$)", - "i", - ), - }, - X = /^(?:input|select|textarea|button)$/i, - Y = /^h\d$/i, - Z = /^[^{]+\{\s*\[native \w/, - $ = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - _ = /[+~]/, - aa = /'|\\/g, - ba = new RegExp("\\\\([\\da-f]{1,6}" + L + "?|(" + L + ")|.)", "ig"), - ca = function (a, b, c) { - var d = "0x" + b - 65536 - return d !== d || c - ? b - : 0 > d - ? String.fromCharCode(d + 65536) - : String.fromCharCode((d >> 10) | 55296, (1023 & d) | 56320) - }, - da = function () { - m() - } - try { - H.apply((E = I.call(v.childNodes)), v.childNodes), E[v.childNodes.length].nodeType - } catch (ea) { - H = { - apply: E.length - ? function (a, b) { - G.apply(a, I.call(b)) - } - : function (a, b) { - var c = a.length, - d = 0 - while ((a[c++] = b[d++])); - a.length = c - 1 - }, - } - } - function fa(a, b, d, e) { - var f, - h, - j, - k, - l, - o, - r, - s, - w = b && b.ownerDocument, - x = b ? b.nodeType : 9 - if (((d = d || []), "string" != typeof a || !a || (1 !== x && 9 !== x && 11 !== x))) return d - if (!e && ((b ? b.ownerDocument || b : v) !== n && m(b), (b = b || n), p)) { - if (11 !== x && (o = $.exec(a))) - if ((f = o[1])) { - if (9 === x) { - if (!(j = b.getElementById(f))) return d - if (j.id === f) return d.push(j), d - } else if (w && (j = w.getElementById(f)) && t(b, j) && j.id === f) return d.push(j), d - } else { - if (o[2]) return H.apply(d, b.getElementsByTagName(a)), d - if ((f = o[3]) && c.getElementsByClassName && b.getElementsByClassName) - return H.apply(d, b.getElementsByClassName(f)), d - } - if (c.qsa && !A[a + " "] && (!q || !q.test(a))) { - if (1 !== x) (w = b), (s = a) - else if ("object" !== b.nodeName.toLowerCase()) { - ;(k = b.getAttribute("id")) - ? (k = k.replace(aa, "\\$&")) - : b.setAttribute("id", (k = u)), - (r = g(a)), - (h = r.length), - (l = V.test(k) ? "#" + k : "[id='" + k + "']") - while (h--) r[h] = l + " " + qa(r[h]) - ;(s = r.join(",")), (w = (_.test(a) && oa(b.parentNode)) || b) - } - if (s) - try { - return H.apply(d, w.querySelectorAll(s)), d - } catch (y) { - } finally { - k === u && b.removeAttribute("id") - } - } - } - return i(a.replace(Q, "$1"), b, d, e) - } - function ga() { - var a = [] - function b(c, e) { - return a.push(c + " ") > d.cacheLength && delete b[a.shift()], (b[c + " "] = e) - } - return b - } - function ha(a) { - return (a[u] = !0), a - } - function ia(a) { - var b = n.createElement("div") - try { - return !!a(b) - } catch (c) { - return !1 - } finally { - b.parentNode && b.parentNode.removeChild(b), (b = null) - } - } - function ja(a, b) { - var c = a.split("|"), - e = c.length - while (e--) d.attrHandle[c[e]] = b - } - function ka(a, b) { - var c = b && a, - d = - c && 1 === a.nodeType && 1 === b.nodeType && (~b.sourceIndex || C) - (~a.sourceIndex || C) - if (d) return d - if (c) while ((c = c.nextSibling)) if (c === b) return -1 - return a ? 1 : -1 - } - function la(a) { - return function (b) { - var c = b.nodeName.toLowerCase() - return "input" === c && b.type === a - } - } - function ma(a) { - return function (b) { - var c = b.nodeName.toLowerCase() - return ("input" === c || "button" === c) && b.type === a - } - } - function na(a) { - return ha(function (b) { - return ( - (b = +b), - ha(function (c, d) { - var e, - f = a([], c.length, b), - g = f.length - while (g--) c[(e = f[g])] && (c[e] = !(d[e] = c[e])) - }) - ) - }) - } - function oa(a) { - return a && "undefined" != typeof a.getElementsByTagName && a - } - ;(c = fa.support = {}), - (f = fa.isXML = - function (a) { - var b = a && (a.ownerDocument || a).documentElement - return b ? "HTML" !== b.nodeName : !1 - }), - (m = fa.setDocument = - function (a) { - var b, - e, - g = a ? a.ownerDocument || a : v - return g !== n && 9 === g.nodeType && g.documentElement - ? ((n = g), - (o = n.documentElement), - (p = !f(n)), - (e = n.defaultView) && - e.top !== e && - (e.addEventListener - ? e.addEventListener("unload", da, !1) - : e.attachEvent && e.attachEvent("onunload", da)), - (c.attributes = ia(function (a) { - return (a.className = "i"), !a.getAttribute("className") - })), - (c.getElementsByTagName = ia(function (a) { - return a.appendChild(n.createComment("")), !a.getElementsByTagName("*").length - })), - (c.getElementsByClassName = Z.test(n.getElementsByClassName)), - (c.getById = ia(function (a) { - return ( - (o.appendChild(a).id = u), !n.getElementsByName || !n.getElementsByName(u).length - ) - })), - c.getById - ? ((d.find.ID = function (a, b) { - if ("undefined" != typeof b.getElementById && p) { - var c = b.getElementById(a) - return c ? [c] : [] - } - }), - (d.filter.ID = function (a) { - var b = a.replace(ba, ca) - return function (a) { - return a.getAttribute("id") === b - } - })) - : (delete d.find.ID, - (d.filter.ID = function (a) { - var b = a.replace(ba, ca) - return function (a) { - var c = "undefined" != typeof a.getAttributeNode && a.getAttributeNode("id") - return c && c.value === b - } - })), - (d.find.TAG = c.getElementsByTagName - ? function (a, b) { - return "undefined" != typeof b.getElementsByTagName - ? b.getElementsByTagName(a) - : c.qsa - ? b.querySelectorAll(a) - : void 0 - } - : function (a, b) { - var c, - d = [], - e = 0, - f = b.getElementsByTagName(a) - if ("*" === a) { - while ((c = f[e++])) 1 === c.nodeType && d.push(c) - return d - } - return f - }), - (d.find.CLASS = - c.getElementsByClassName && - function (a, b) { - return "undefined" != typeof b.getElementsByClassName && p - ? b.getElementsByClassName(a) - : void 0 - }), - (r = []), - (q = []), - (c.qsa = Z.test(n.querySelectorAll)) && - (ia(function (a) { - ;(o.appendChild(a).innerHTML = - ""), - a.querySelectorAll("[msallowcapture^='']").length && - q.push("[*^$]=" + L + "*(?:''|\"\")"), - a.querySelectorAll("[selected]").length || - q.push("\\[" + L + "*(?:value|" + K + ")"), - a.querySelectorAll("[id~=" + u + "-]").length || q.push("~="), - a.querySelectorAll(":checked").length || q.push(":checked"), - a.querySelectorAll("a#" + u + "+*").length || q.push(".#.+[+~]") - }), - ia(function (a) { - var b = n.createElement("input") - b.setAttribute("type", "hidden"), - a.appendChild(b).setAttribute("name", "D"), - a.querySelectorAll("[name=d]").length && q.push("name" + L + "*[*^$|!~]?="), - a.querySelectorAll(":enabled").length || q.push(":enabled", ":disabled"), - a.querySelectorAll("*,:x"), - q.push(",.*:") - })), - (c.matchesSelector = Z.test( - (s = - o.matches || - o.webkitMatchesSelector || - o.mozMatchesSelector || - o.oMatchesSelector || - o.msMatchesSelector), - )) && - ia(function (a) { - ;(c.disconnectedMatch = s.call(a, "div")), s.call(a, "[s!='']:x"), r.push("!=", O) - }), - (q = q.length && new RegExp(q.join("|"))), - (r = r.length && new RegExp(r.join("|"))), - (b = Z.test(o.compareDocumentPosition)), - (t = - b || Z.test(o.contains) - ? function (a, b) { - var c = 9 === a.nodeType ? a.documentElement : a, - d = b && b.parentNode - return ( - a === d || - !( - !d || - 1 !== d.nodeType || - !(c.contains - ? c.contains(d) - : a.compareDocumentPosition && 16 & a.compareDocumentPosition(d)) - ) - ) - } - : function (a, b) { - if (b) while ((b = b.parentNode)) if (b === a) return !0 - return !1 - }), - (B = b - ? function (a, b) { - if (a === b) return (l = !0), 0 - var d = !a.compareDocumentPosition - !b.compareDocumentPosition - return d - ? d - : ((d = - (a.ownerDocument || a) === (b.ownerDocument || b) - ? a.compareDocumentPosition(b) - : 1), - 1 & d || (!c.sortDetached && b.compareDocumentPosition(a) === d) - ? a === n || (a.ownerDocument === v && t(v, a)) - ? -1 - : b === n || (b.ownerDocument === v && t(v, b)) - ? 1 - : k - ? J(k, a) - J(k, b) - : 0 - : 4 & d - ? -1 - : 1) - } - : function (a, b) { - if (a === b) return (l = !0), 0 - var c, - d = 0, - e = a.parentNode, - f = b.parentNode, - g = [a], - h = [b] - if (!e || !f) - return a === n ? -1 : b === n ? 1 : e ? -1 : f ? 1 : k ? J(k, a) - J(k, b) : 0 - if (e === f) return ka(a, b) - c = a - while ((c = c.parentNode)) g.unshift(c) - c = b - while ((c = c.parentNode)) h.unshift(c) - while (g[d] === h[d]) d++ - return d ? ka(g[d], h[d]) : g[d] === v ? -1 : h[d] === v ? 1 : 0 - }), - n) - : n - }), - (fa.matches = function (a, b) { - return fa(a, null, null, b) - }), - (fa.matchesSelector = function (a, b) { - if ( - ((a.ownerDocument || a) !== n && m(a), - (b = b.replace(T, "='$1']")), - c.matchesSelector && p && !A[b + " "] && (!r || !r.test(b)) && (!q || !q.test(b))) - ) - try { - var d = s.call(a, b) - if (d || c.disconnectedMatch || (a.document && 11 !== a.document.nodeType)) return d - } catch (e) {} - return fa(b, n, null, [a]).length > 0 - }), - (fa.contains = function (a, b) { - return (a.ownerDocument || a) !== n && m(a), t(a, b) - }), - (fa.attr = function (a, b) { - ;(a.ownerDocument || a) !== n && m(a) - var e = d.attrHandle[b.toLowerCase()], - f = e && D.call(d.attrHandle, b.toLowerCase()) ? e(a, b, !p) : void 0 - return void 0 !== f - ? f - : c.attributes || !p - ? a.getAttribute(b) - : (f = a.getAttributeNode(b)) && f.specified - ? f.value - : null - }), - (fa.error = function (a) { - throw new Error("Syntax error, unrecognized expression: " + a) - }), - (fa.uniqueSort = function (a) { - var b, - d = [], - e = 0, - f = 0 - if (((l = !c.detectDuplicates), (k = !c.sortStable && a.slice(0)), a.sort(B), l)) { - while ((b = a[f++])) b === a[f] && (e = d.push(f)) - while (e--) a.splice(d[e], 1) - } - return (k = null), a - }), - (e = fa.getText = - function (a) { - var b, - c = "", - d = 0, - f = a.nodeType - if (f) { - if (1 === f || 9 === f || 11 === f) { - if ("string" == typeof a.textContent) return a.textContent - for (a = a.firstChild; a; a = a.nextSibling) c += e(a) - } else if (3 === f || 4 === f) return a.nodeValue - } else while ((b = a[d++])) c += e(b) - return c - }), - (d = fa.selectors = - { - cacheLength: 50, - createPseudo: ha, - match: W, - attrHandle: {}, - find: {}, - relative: { - ">": { dir: "parentNode", first: !0 }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: !0 }, - "~": { dir: "previousSibling" }, - }, - preFilter: { - ATTR: function (a) { - return ( - (a[1] = a[1].replace(ba, ca)), - (a[3] = (a[3] || a[4] || a[5] || "").replace(ba, ca)), - "~=" === a[2] && (a[3] = " " + a[3] + " "), - a.slice(0, 4) - ) - }, - CHILD: function (a) { - return ( - (a[1] = a[1].toLowerCase()), - "nth" === a[1].slice(0, 3) - ? (a[3] || fa.error(a[0]), - (a[4] = +(a[4] ? a[5] + (a[6] || 1) : 2 * ("even" === a[3] || "odd" === a[3]))), - (a[5] = +(a[7] + a[8] || "odd" === a[3]))) - : a[3] && fa.error(a[0]), - a - ) - }, - PSEUDO: function (a) { - var b, - c = !a[6] && a[2] - return W.CHILD.test(a[0]) - ? null - : (a[3] - ? (a[2] = a[4] || a[5] || "") - : c && - U.test(c) && - (b = g(c, !0)) && - (b = c.indexOf(")", c.length - b) - c.length) && - ((a[0] = a[0].slice(0, b)), (a[2] = c.slice(0, b))), - a.slice(0, 3)) - }, - }, - filter: { - TAG: function (a) { - var b = a.replace(ba, ca).toLowerCase() - return "*" === a - ? function () { - return !0 - } - : function (a) { - return a.nodeName && a.nodeName.toLowerCase() === b - } - }, - CLASS: function (a) { - var b = y[a + " "] - return ( - b || - ((b = new RegExp("(^|" + L + ")" + a + "(" + L + "|$)")) && - y(a, function (a) { - return b.test( - ("string" == typeof a.className && a.className) || - ("undefined" != typeof a.getAttribute && a.getAttribute("class")) || - "", - ) - })) - ) - }, - ATTR: function (a, b, c) { - return function (d) { - var e = fa.attr(d, a) - return null == e - ? "!=" === b - : b - ? ((e += ""), - "=" === b - ? e === c - : "!=" === b - ? e !== c - : "^=" === b - ? c && 0 === e.indexOf(c) - : "*=" === b - ? c && e.indexOf(c) > -1 - : "$=" === b - ? c && e.slice(-c.length) === c - : "~=" === b - ? (" " + e.replace(P, " ") + " ").indexOf(c) > -1 - : "|=" === b - ? e === c || e.slice(0, c.length + 1) === c + "-" - : !1) - : !0 - } - }, - CHILD: function (a, b, c, d, e) { - var f = "nth" !== a.slice(0, 3), - g = "last" !== a.slice(-4), - h = "of-type" === b - return 1 === d && 0 === e - ? function (a) { - return !!a.parentNode - } - : function (b, c, i) { - var j, - k, - l, - m, - n, - o, - p = f !== g ? "nextSibling" : "previousSibling", - q = b.parentNode, - r = h && b.nodeName.toLowerCase(), - s = !i && !h, - t = !1 - if (q) { - if (f) { - while (p) { - m = b - while ((m = m[p])) - if (h ? m.nodeName.toLowerCase() === r : 1 === m.nodeType) return !1 - o = p = "only" === a && !o && "nextSibling" - } - return !0 - } - if (((o = [g ? q.firstChild : q.lastChild]), g && s)) { - ;(m = q), - (l = m[u] || (m[u] = {})), - (k = l[m.uniqueID] || (l[m.uniqueID] = {})), - (j = k[a] || []), - (n = j[0] === w && j[1]), - (t = n && j[2]), - (m = n && q.childNodes[n]) - while ((m = (++n && m && m[p]) || (t = n = 0) || o.pop())) - if (1 === m.nodeType && ++t && m === b) { - k[a] = [w, n, t] - break - } - } else if ( - (s && - ((m = b), - (l = m[u] || (m[u] = {})), - (k = l[m.uniqueID] || (l[m.uniqueID] = {})), - (j = k[a] || []), - (n = j[0] === w && j[1]), - (t = n)), - t === !1) - ) - while ((m = (++n && m && m[p]) || (t = n = 0) || o.pop())) - if ( - (h ? m.nodeName.toLowerCase() === r : 1 === m.nodeType) && - ++t && - (s && - ((l = m[u] || (m[u] = {})), - (k = l[m.uniqueID] || (l[m.uniqueID] = {})), - (k[a] = [w, t])), - m === b) - ) - break - return (t -= e), t === d || (t % d === 0 && t / d >= 0) - } - } - }, - PSEUDO: function (a, b) { - var c, - e = - d.pseudos[a] || - d.setFilters[a.toLowerCase()] || - fa.error("unsupported pseudo: " + a) - return e[u] - ? e(b) - : e.length > 1 - ? ((c = [a, a, "", b]), - d.setFilters.hasOwnProperty(a.toLowerCase()) - ? ha(function (a, c) { - var d, - f = e(a, b), - g = f.length - while (g--) (d = J(a, f[g])), (a[d] = !(c[d] = f[g])) - }) - : function (a) { - return e(a, 0, c) - }) - : e - }, - }, - pseudos: { - not: ha(function (a) { - var b = [], - c = [], - d = h(a.replace(Q, "$1")) - return d[u] - ? ha(function (a, b, c, e) { - var f, - g = d(a, null, e, []), - h = a.length - while (h--) (f = g[h]) && (a[h] = !(b[h] = f)) - }) - : function (a, e, f) { - return (b[0] = a), d(b, null, f, c), (b[0] = null), !c.pop() - } - }), - has: ha(function (a) { - return function (b) { - return fa(a, b).length > 0 - } - }), - contains: ha(function (a) { - return ( - (a = a.replace(ba, ca)), - function (b) { - return (b.textContent || b.innerText || e(b)).indexOf(a) > -1 - } - ) - }), - lang: ha(function (a) { - return ( - V.test(a || "") || fa.error("unsupported lang: " + a), - (a = a.replace(ba, ca).toLowerCase()), - function (b) { - var c - do - if ((c = p ? b.lang : b.getAttribute("xml:lang") || b.getAttribute("lang"))) - return (c = c.toLowerCase()), c === a || 0 === c.indexOf(a + "-") - while ((b = b.parentNode) && 1 === b.nodeType) - return !1 - } - ) - }), - target: function (b) { - var c = a.location && a.location.hash - return c && c.slice(1) === b.id - }, - root: function (a) { - return a === o - }, - focus: function (a) { - return ( - a === n.activeElement && - (!n.hasFocus || n.hasFocus()) && - !!(a.type || a.href || ~a.tabIndex) - ) - }, - enabled: function (a) { - return a.disabled === !1 - }, - disabled: function (a) { - return a.disabled === !0 - }, - checked: function (a) { - var b = a.nodeName.toLowerCase() - return ("input" === b && !!a.checked) || ("option" === b && !!a.selected) - }, - selected: function (a) { - return a.parentNode && a.parentNode.selectedIndex, a.selected === !0 - }, - empty: function (a) { - for (a = a.firstChild; a; a = a.nextSibling) if (a.nodeType < 6) return !1 - return !0 - }, - parent: function (a) { - return !d.pseudos.empty(a) - }, - header: function (a) { - return Y.test(a.nodeName) - }, - input: function (a) { - return X.test(a.nodeName) - }, - button: function (a) { - var b = a.nodeName.toLowerCase() - return ("input" === b && "button" === a.type) || "button" === b - }, - text: function (a) { - var b - return ( - "input" === a.nodeName.toLowerCase() && - "text" === a.type && - (null == (b = a.getAttribute("type")) || "text" === b.toLowerCase()) - ) - }, - first: na(function () { - return [0] - }), - last: na(function (a, b) { - return [b - 1] - }), - eq: na(function (a, b, c) { - return [0 > c ? c + b : c] - }), - even: na(function (a, b) { - for (var c = 0; b > c; c += 2) a.push(c) - return a - }), - odd: na(function (a, b) { - for (var c = 1; b > c; c += 2) a.push(c) - return a - }), - lt: na(function (a, b, c) { - for (var d = 0 > c ? c + b : c; --d >= 0; ) a.push(d) - return a - }), - gt: na(function (a, b, c) { - for (var d = 0 > c ? c + b : c; ++d < b; ) a.push(d) - return a - }), - }, - }), - (d.pseudos.nth = d.pseudos.eq) - for (b in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) d.pseudos[b] = la(b) - for (b in { submit: !0, reset: !0 }) d.pseudos[b] = ma(b) - function pa() {} - ;(pa.prototype = d.filters = d.pseudos), - (d.setFilters = new pa()), - (g = fa.tokenize = - function (a, b) { - var c, - e, - f, - g, - h, - i, - j, - k = z[a + " "] - if (k) return b ? 0 : k.slice(0) - ;(h = a), (i = []), (j = d.preFilter) - while (h) { - ;(c && !(e = R.exec(h))) || (e && (h = h.slice(e[0].length) || h), i.push((f = []))), - (c = !1), - (e = S.exec(h)) && - ((c = e.shift()), - f.push({ value: c, type: e[0].replace(Q, " ") }), - (h = h.slice(c.length))) - for (g in d.filter) - !(e = W[g].exec(h)) || - (j[g] && !(e = j[g](e))) || - ((c = e.shift()), - f.push({ value: c, type: g, matches: e }), - (h = h.slice(c.length))) - if (!c) break - } - return b ? h.length : h ? fa.error(a) : z(a, i).slice(0) - }) - function qa(a) { - for (var b = 0, c = a.length, d = ""; c > b; b++) d += a[b].value - return d - } - function ra(a, b, c) { - var d = b.dir, - e = c && "parentNode" === d, - f = x++ - return b.first - ? function (b, c, f) { - while ((b = b[d])) if (1 === b.nodeType || e) return a(b, c, f) - } - : function (b, c, g) { - var h, - i, - j, - k = [w, f] - if (g) { - while ((b = b[d])) if ((1 === b.nodeType || e) && a(b, c, g)) return !0 - } else - while ((b = b[d])) - if (1 === b.nodeType || e) { - if ( - ((j = b[u] || (b[u] = {})), - (i = j[b.uniqueID] || (j[b.uniqueID] = {})), - (h = i[d]) && h[0] === w && h[1] === f) - ) - return (k[2] = h[2]) - if (((i[d] = k), (k[2] = a(b, c, g)))) return !0 - } - } - } - function sa(a) { - return a.length > 1 - ? function (b, c, d) { - var e = a.length - while (e--) if (!a[e](b, c, d)) return !1 - return !0 - } - : a[0] - } - function ta(a, b, c) { - for (var d = 0, e = b.length; e > d; d++) fa(a, b[d], c) - return c - } - function ua(a, b, c, d, e) { - for (var f, g = [], h = 0, i = a.length, j = null != b; i > h; h++) - (f = a[h]) && ((c && !c(f, d, e)) || (g.push(f), j && b.push(h))) - return g - } - function va(a, b, c, d, e, f) { - return ( - d && !d[u] && (d = va(d)), - e && !e[u] && (e = va(e, f)), - ha(function (f, g, h, i) { - var j, - k, - l, - m = [], - n = [], - o = g.length, - p = f || ta(b || "*", h.nodeType ? [h] : h, []), - q = !a || (!f && b) ? p : ua(p, m, a, h, i), - r = c ? (e || (f ? a : o || d) ? [] : g) : q - if ((c && c(q, r, h, i), d)) { - ;(j = ua(r, n)), d(j, [], h, i), (k = j.length) - while (k--) (l = j[k]) && (r[n[k]] = !(q[n[k]] = l)) - } - if (f) { - if (e || a) { - if (e) { - ;(j = []), (k = r.length) - while (k--) (l = r[k]) && j.push((q[k] = l)) - e(null, (r = []), j, i) - } - k = r.length - while (k--) (l = r[k]) && (j = e ? J(f, l) : m[k]) > -1 && (f[j] = !(g[j] = l)) - } - } else (r = ua(r === g ? r.splice(o, r.length) : r)), e ? e(null, g, r, i) : H.apply(g, r) - }) - ) - } - function wa(a) { - for ( - var b, - c, - e, - f = a.length, - g = d.relative[a[0].type], - h = g || d.relative[" "], - i = g ? 1 : 0, - k = ra( - function (a) { - return a === b - }, - h, - !0, - ), - l = ra( - function (a) { - return J(b, a) > -1 - }, - h, - !0, - ), - m = [ - function (a, c, d) { - var e = (!g && (d || c !== j)) || ((b = c).nodeType ? k(a, c, d) : l(a, c, d)) - return (b = null), e - }, - ]; - f > i; - i++ - ) - if ((c = d.relative[a[i].type])) m = [ra(sa(m), c)] - else { - if (((c = d.filter[a[i].type].apply(null, a[i].matches)), c[u])) { - for (e = ++i; f > e; e++) if (d.relative[a[e].type]) break - return va( - i > 1 && sa(m), - i > 1 && - qa(a.slice(0, i - 1).concat({ value: " " === a[i - 2].type ? "*" : "" })).replace( - Q, - "$1", - ), - c, - e > i && wa(a.slice(i, e)), - f > e && wa((a = a.slice(e))), - f > e && qa(a), - ) - } - m.push(c) - } - return sa(m) - } - function xa(a, b) { - var c = b.length > 0, - e = a.length > 0, - f = function (f, g, h, i, k) { - var l, - o, - q, - r = 0, - s = "0", - t = f && [], - u = [], - v = j, - x = f || (e && d.find.TAG("*", k)), - y = (w += null == v ? 1 : Math.random() || 0.1), - z = x.length - for (k && (j = g === n || g || k); s !== z && null != (l = x[s]); s++) { - if (e && l) { - ;(o = 0), g || l.ownerDocument === n || (m(l), (h = !p)) - while ((q = a[o++])) - if (q(l, g || n, h)) { - i.push(l) - break - } - k && (w = y) - } - c && ((l = !q && l) && r--, f && t.push(l)) - } - if (((r += s), c && s !== r)) { - o = 0 - while ((q = b[o++])) q(t, u, g, h) - if (f) { - if (r > 0) while (s--) t[s] || u[s] || (u[s] = F.call(i)) - u = ua(u) - } - H.apply(i, u), k && !f && u.length > 0 && r + b.length > 1 && fa.uniqueSort(i) - } - return k && ((w = y), (j = v)), t - } - return c ? ha(f) : f - } - return ( - (h = fa.compile = - function (a, b) { - var c, - d = [], - e = [], - f = A[a + " "] - if (!f) { - b || (b = g(a)), (c = b.length) - while (c--) (f = wa(b[c])), f[u] ? d.push(f) : e.push(f) - ;(f = A(a, xa(e, d))), (f.selector = a) - } - return f - }), - (i = fa.select = - function (a, b, e, f) { - var i, - j, - k, - l, - m, - n = "function" == typeof a && a, - o = !f && g((a = n.selector || a)) - if (((e = e || []), 1 === o.length)) { - if ( - ((j = o[0] = o[0].slice(0)), - j.length > 2 && - "ID" === (k = j[0]).type && - c.getById && - 9 === b.nodeType && - p && - d.relative[j[1].type]) - ) { - if (((b = (d.find.ID(k.matches[0].replace(ba, ca), b) || [])[0]), !b)) return e - n && (b = b.parentNode), (a = a.slice(j.shift().value.length)) - } - i = W.needsContext.test(a) ? 0 : j.length - while (i--) { - if (((k = j[i]), d.relative[(l = k.type)])) break - if ( - (m = d.find[l]) && - (f = m(k.matches[0].replace(ba, ca), (_.test(j[0].type) && oa(b.parentNode)) || b)) - ) { - if ((j.splice(i, 1), (a = f.length && qa(j)), !a)) return H.apply(e, f), e - break - } - } - } - return (n || h(a, o))(f, b, !p, e, !b || (_.test(a) && oa(b.parentNode)) || b), e - }), - (c.sortStable = u.split("").sort(B).join("") === u), - (c.detectDuplicates = !!l), - m(), - (c.sortDetached = ia(function (a) { - return 1 & a.compareDocumentPosition(n.createElement("div")) - })), - ia(function (a) { - return (a.innerHTML = ""), "#" === a.firstChild.getAttribute("href") - }) || - ja("type|href|height|width", function (a, b, c) { - return c ? void 0 : a.getAttribute(b, "type" === b.toLowerCase() ? 1 : 2) - }), - (c.attributes && - ia(function (a) { - return ( - (a.innerHTML = ""), - a.firstChild.setAttribute("value", ""), - "" === a.firstChild.getAttribute("value") - ) - })) || - ja("value", function (a, b, c) { - return c || "input" !== a.nodeName.toLowerCase() ? void 0 : a.defaultValue - }), - ia(function (a) { - return null == a.getAttribute("disabled") - }) || - ja(K, function (a, b, c) { - var d - return c - ? void 0 - : a[b] === !0 - ? b.toLowerCase() - : (d = a.getAttributeNode(b)) && d.specified - ? d.value - : null - }), - fa - ) - })(a) - ;(n.find = t), - (n.expr = t.selectors), - (n.expr[":"] = n.expr.pseudos), - (n.uniqueSort = n.unique = t.uniqueSort), - (n.text = t.getText), - (n.isXMLDoc = t.isXML), - (n.contains = t.contains) - var u = function (a, b, c) { - var d = [], - e = void 0 !== c - while ((a = a[b]) && 9 !== a.nodeType) - if (1 === a.nodeType) { - if (e && n(a).is(c)) break - d.push(a) - } - return d - }, - v = function (a, b) { - for (var c = []; a; a = a.nextSibling) 1 === a.nodeType && a !== b && c.push(a) - return c - }, - w = n.expr.match.needsContext, - x = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/, - y = /^.[^:#\[\.,]*$/ - function z(a, b, c) { - if (n.isFunction(b)) - return n.grep(a, function (a, d) { - return !!b.call(a, d, a) !== c - }) - if (b.nodeType) - return n.grep(a, function (a) { - return (a === b) !== c - }) - if ("string" == typeof b) { - if (y.test(b)) return n.filter(b, a, c) - b = n.filter(b, a) - } - return n.grep(a, function (a) { - return h.call(b, a) > -1 !== c - }) - } - ;(n.filter = function (a, b, c) { - var d = b[0] - return ( - c && (a = ":not(" + a + ")"), - 1 === b.length && 1 === d.nodeType - ? n.find.matchesSelector(d, a) - ? [d] - : [] - : n.find.matches( - a, - n.grep(b, function (a) { - return 1 === a.nodeType - }), - ) - ) - }), - n.fn.extend({ - find: function (a) { - var b, - c = this.length, - d = [], - e = this - if ("string" != typeof a) - return this.pushStack( - n(a).filter(function () { - for (b = 0; c > b; b++) if (n.contains(e[b], this)) return !0 - }), - ) - for (b = 0; c > b; b++) n.find(a, e[b], d) - return ( - (d = this.pushStack(c > 1 ? n.unique(d) : d)), - (d.selector = this.selector ? this.selector + " " + a : a), - d - ) - }, - filter: function (a) { - return this.pushStack(z(this, a || [], !1)) - }, - not: function (a) { - return this.pushStack(z(this, a || [], !0)) - }, - is: function (a) { - return !!z(this, "string" == typeof a && w.test(a) ? n(a) : a || [], !1).length - }, - }) - var A, - B = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - C = (n.fn.init = function (a, b, c) { - var e, f - if (!a) return this - if (((c = c || A), "string" == typeof a)) { - if ( - ((e = - "<" === a[0] && ">" === a[a.length - 1] && a.length >= 3 ? [null, a, null] : B.exec(a)), - !e || (!e[1] && b)) - ) - return !b || b.jquery ? (b || c).find(a) : this.constructor(b).find(a) - if (e[1]) { - if ( - ((b = b instanceof n ? b[0] : b), - n.merge(this, n.parseHTML(e[1], b && b.nodeType ? b.ownerDocument || b : d, !0)), - x.test(e[1]) && n.isPlainObject(b)) - ) - for (e in b) n.isFunction(this[e]) ? this[e](b[e]) : this.attr(e, b[e]) - return this - } - return ( - (f = d.getElementById(e[2])), - f && f.parentNode && ((this.length = 1), (this[0] = f)), - (this.context = d), - (this.selector = a), - this - ) - } - return a.nodeType - ? ((this.context = this[0] = a), (this.length = 1), this) - : n.isFunction(a) - ? void 0 !== c.ready - ? c.ready(a) - : a(n) - : (void 0 !== a.selector && ((this.selector = a.selector), (this.context = a.context)), - n.makeArray(a, this)) - }) - ;(C.prototype = n.fn), (A = n(d)) - var D = /^(?:parents|prev(?:Until|All))/, - E = { children: !0, contents: !0, next: !0, prev: !0 } - n.fn.extend({ - has: function (a) { - var b = n(a, this), - c = b.length - return this.filter(function () { - for (var a = 0; c > a; a++) if (n.contains(this, b[a])) return !0 - }) - }, - closest: function (a, b) { - for ( - var c, - d = 0, - e = this.length, - f = [], - g = w.test(a) || "string" != typeof a ? n(a, b || this.context) : 0; - e > d; - d++ - ) - for (c = this[d]; c && c !== b; c = c.parentNode) - if ( - c.nodeType < 11 && - (g ? g.index(c) > -1 : 1 === c.nodeType && n.find.matchesSelector(c, a)) - ) { - f.push(c) - break - } - return this.pushStack(f.length > 1 ? n.uniqueSort(f) : f) - }, - index: function (a) { - return a - ? "string" == typeof a - ? h.call(n(a), this[0]) - : h.call(this, a.jquery ? a[0] : a) - : this[0] && this[0].parentNode - ? this.first().prevAll().length - : -1 - }, - add: function (a, b) { - return this.pushStack(n.uniqueSort(n.merge(this.get(), n(a, b)))) - }, - addBack: function (a) { - return this.add(null == a ? this.prevObject : this.prevObject.filter(a)) - }, - }) - function F(a, b) { - while ((a = a[b]) && 1 !== a.nodeType); - return a - } - n.each( - { - parent: function (a) { - var b = a.parentNode - return b && 11 !== b.nodeType ? b : null - }, - parents: function (a) { - return u(a, "parentNode") - }, - parentsUntil: function (a, b, c) { - return u(a, "parentNode", c) - }, - next: function (a) { - return F(a, "nextSibling") - }, - prev: function (a) { - return F(a, "previousSibling") - }, - nextAll: function (a) { - return u(a, "nextSibling") - }, - prevAll: function (a) { - return u(a, "previousSibling") - }, - nextUntil: function (a, b, c) { - return u(a, "nextSibling", c) - }, - prevUntil: function (a, b, c) { - return u(a, "previousSibling", c) - }, - siblings: function (a) { - return v((a.parentNode || {}).firstChild, a) - }, - children: function (a) { - return v(a.firstChild) - }, - contents: function (a) { - return a.contentDocument || n.merge([], a.childNodes) - }, - }, - function (a, b) { - n.fn[a] = function (c, d) { - var e = n.map(this, b, c) - return ( - "Until" !== a.slice(-5) && (d = c), - d && "string" == typeof d && (e = n.filter(d, e)), - this.length > 1 && (E[a] || n.uniqueSort(e), D.test(a) && e.reverse()), - this.pushStack(e) - ) - } - }, - ) - var G = /\S+/g - function H(a) { - var b = {} - return ( - n.each(a.match(G) || [], function (a, c) { - b[c] = !0 - }), - b - ) - } - ;(n.Callbacks = function (a) { - a = "string" == typeof a ? H(a) : n.extend({}, a) - var b, - c, - d, - e, - f = [], - g = [], - h = -1, - i = function () { - for (e = a.once, d = b = !0; g.length; h = -1) { - c = g.shift() - while (++h < f.length) - f[h].apply(c[0], c[1]) === !1 && a.stopOnFalse && ((h = f.length), (c = !1)) - } - a.memory || (c = !1), (b = !1), e && (f = c ? [] : "") - }, - j = { - add: function () { - return ( - f && - (c && !b && ((h = f.length - 1), g.push(c)), - (function d(b) { - n.each(b, function (b, c) { - n.isFunction(c) - ? (a.unique && j.has(c)) || f.push(c) - : c && c.length && "string" !== n.type(c) && d(c) - }) - })(arguments), - c && !b && i()), - this - ) - }, - remove: function () { - return ( - n.each(arguments, function (a, b) { - var c - while ((c = n.inArray(b, f, c)) > -1) f.splice(c, 1), h >= c && h-- - }), - this - ) - }, - has: function (a) { - return a ? n.inArray(a, f) > -1 : f.length > 0 - }, - empty: function () { - return f && (f = []), this - }, - disable: function () { - return (e = g = []), (f = c = ""), this - }, - disabled: function () { - return !f - }, - lock: function () { - return (e = g = []), c || (f = c = ""), this - }, - locked: function () { - return !!e - }, - fireWith: function (a, c) { - return e || ((c = c || []), (c = [a, c.slice ? c.slice() : c]), g.push(c), b || i()), this - }, - fire: function () { - return j.fireWith(this, arguments), this - }, - fired: function () { - return !!d - }, - } - return j - }), - n.extend({ - Deferred: function (a) { - var b = [ - ["resolve", "done", n.Callbacks("once memory"), "resolved"], - ["reject", "fail", n.Callbacks("once memory"), "rejected"], - ["notify", "progress", n.Callbacks("memory")], - ], - c = "pending", - d = { - state: function () { - return c - }, - always: function () { - return e.done(arguments).fail(arguments), this - }, - then: function () { - var a = arguments - return n - .Deferred(function (c) { - n.each(b, function (b, f) { - var g = n.isFunction(a[b]) && a[b] - e[f[1]](function () { - var a = g && g.apply(this, arguments) - a && n.isFunction(a.promise) - ? a.promise().progress(c.notify).done(c.resolve).fail(c.reject) - : c[f[0] + "With"](this === d ? c.promise() : this, g ? [a] : arguments) - }) - }), - (a = null) - }) - .promise() - }, - promise: function (a) { - return null != a ? n.extend(a, d) : d - }, - }, - e = {} - return ( - (d.pipe = d.then), - n.each(b, function (a, f) { - var g = f[2], - h = f[3] - ;(d[f[1]] = g.add), - h && - g.add( - function () { - c = h - }, - b[1 ^ a][2].disable, - b[2][2].lock, - ), - (e[f[0]] = function () { - return e[f[0] + "With"](this === e ? d : this, arguments), this - }), - (e[f[0] + "With"] = g.fireWith) - }), - d.promise(e), - a && a.call(e, e), - e - ) - }, - when: function (a) { - var b = 0, - c = e.call(arguments), - d = c.length, - f = 1 !== d || (a && n.isFunction(a.promise)) ? d : 0, - g = 1 === f ? a : n.Deferred(), - h = function (a, b, c) { - return function (d) { - ;(b[a] = this), - (c[a] = arguments.length > 1 ? e.call(arguments) : d), - c === i ? g.notifyWith(b, c) : --f || g.resolveWith(b, c) - } - }, - i, - j, - k - if (d > 1) - for (i = new Array(d), j = new Array(d), k = new Array(d); d > b; b++) - c[b] && n.isFunction(c[b].promise) - ? c[b] - .promise() - .progress(h(b, j, i)) - .done(h(b, k, c)) - .fail(g.reject) - : --f - return f || g.resolveWith(k, c), g.promise() - }, - }) - var I - ;(n.fn.ready = function (a) { - return n.ready.promise().done(a), this - }), - n.extend({ - isReady: !1, - readyWait: 1, - holdReady: function (a) { - a ? n.readyWait++ : n.ready(!0) - }, - ready: function (a) { - ;(a === !0 ? --n.readyWait : n.isReady) || - ((n.isReady = !0), - (a !== !0 && --n.readyWait > 0) || - (I.resolveWith(d, [n]), - n.fn.triggerHandler && (n(d).triggerHandler("ready"), n(d).off("ready")))) - }, - }) - function J() { - d.removeEventListener("DOMContentLoaded", J), a.removeEventListener("load", J), n.ready() - } - ;(n.ready.promise = function (b) { - return ( - I || - ((I = n.Deferred()), - "complete" === d.readyState || ("loading" !== d.readyState && !d.documentElement.doScroll) - ? a.setTimeout(n.ready) - : (d.addEventListener("DOMContentLoaded", J), a.addEventListener("load", J))), - I.promise(b) - ) - }), - n.ready.promise() - var K = function (a, b, c, d, e, f, g) { - var h = 0, - i = a.length, - j = null == c - if ("object" === n.type(c)) { - e = !0 - for (h in c) K(a, b, h, c[h], !0, f, g) - } else if ( - void 0 !== d && - ((e = !0), - n.isFunction(d) || (g = !0), - j && - (g - ? (b.call(a, d), (b = null)) - : ((j = b), - (b = function (a, b, c) { - return j.call(n(a), c) - }))), - b) - ) - for (; i > h; h++) b(a[h], c, g ? d : d.call(a[h], h, b(a[h], c))) - return e ? a : j ? b.call(a) : i ? b(a[0], c) : f - }, - L = function (a) { - return 1 === a.nodeType || 9 === a.nodeType || !+a.nodeType - } - function M() { - this.expando = n.expando + M.uid++ - } - ;(M.uid = 1), - (M.prototype = { - register: function (a, b) { - var c = b || {} - return ( - a.nodeType - ? (a[this.expando] = c) - : Object.defineProperty(a, this.expando, { value: c, writable: !0, configurable: !0 }), - a[this.expando] - ) - }, - cache: function (a) { - if (!L(a)) return {} - var b = a[this.expando] - return ( - b || - ((b = {}), - L(a) && - (a.nodeType - ? (a[this.expando] = b) - : Object.defineProperty(a, this.expando, { value: b, configurable: !0 }))), - b - ) - }, - set: function (a, b, c) { - var d, - e = this.cache(a) - if ("string" == typeof b) e[b] = c - else for (d in b) e[d] = b[d] - return e - }, - get: function (a, b) { - return void 0 === b ? this.cache(a) : a[this.expando] && a[this.expando][b] - }, - access: function (a, b, c) { - var d - return void 0 === b || (b && "string" == typeof b && void 0 === c) - ? ((d = this.get(a, b)), void 0 !== d ? d : this.get(a, n.camelCase(b))) - : (this.set(a, b, c), void 0 !== c ? c : b) - }, - remove: function (a, b) { - var c, - d, - e, - f = a[this.expando] - if (void 0 !== f) { - if (void 0 === b) this.register(a) - else { - n.isArray(b) - ? (d = b.concat(b.map(n.camelCase))) - : ((e = n.camelCase(b)), - b in f ? (d = [b, e]) : ((d = e), (d = d in f ? [d] : d.match(G) || []))), - (c = d.length) - while (c--) delete f[d[c]] - } - ;(void 0 === b || n.isEmptyObject(f)) && - (a.nodeType ? (a[this.expando] = void 0) : delete a[this.expando]) - } - }, - hasData: function (a) { - var b = a[this.expando] - return void 0 !== b && !n.isEmptyObject(b) - }, - }) - var N = new M(), - O = new M(), - P = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - Q = /[A-Z]/g - function R(a, b, c) { - var d - if (void 0 === c && 1 === a.nodeType) - if ( - ((d = "data-" + b.replace(Q, "-$&").toLowerCase()), - (c = a.getAttribute(d)), - "string" == typeof c) - ) { - try { - c = - "true" === c - ? !0 - : "false" === c - ? !1 - : "null" === c - ? null - : +c + "" === c - ? +c - : P.test(c) - ? n.parseJSON(c) - : c - } catch (e) {} - O.set(a, b, c) - } else c = void 0 - return c - } - n.extend({ - hasData: function (a) { - return O.hasData(a) || N.hasData(a) - }, - data: function (a, b, c) { - return O.access(a, b, c) - }, - removeData: function (a, b) { - O.remove(a, b) - }, - _data: function (a, b, c) { - return N.access(a, b, c) - }, - _removeData: function (a, b) { - N.remove(a, b) - }, - }), - n.fn.extend({ - data: function (a, b) { - var c, - d, - e, - f = this[0], - g = f && f.attributes - if (void 0 === a) { - if (this.length && ((e = O.get(f)), 1 === f.nodeType && !N.get(f, "hasDataAttrs"))) { - c = g.length - while (c--) - g[c] && - ((d = g[c].name), - 0 === d.indexOf("data-") && ((d = n.camelCase(d.slice(5))), R(f, d, e[d]))) - N.set(f, "hasDataAttrs", !0) - } - return e - } - return "object" == typeof a - ? this.each(function () { - O.set(this, a) - }) - : K( - this, - function (b) { - var c, d - if (f && void 0 === b) { - if ( - ((c = O.get(f, a) || O.get(f, a.replace(Q, "-$&").toLowerCase())), void 0 !== c) - ) - return c - if (((d = n.camelCase(a)), (c = O.get(f, d)), void 0 !== c)) return c - if (((c = R(f, d, void 0)), void 0 !== c)) return c - } else - (d = n.camelCase(a)), - this.each(function () { - var c = O.get(this, d) - O.set(this, d, b), a.indexOf("-") > -1 && void 0 !== c && O.set(this, a, b) - }) - }, - null, - b, - arguments.length > 1, - null, - !0, - ) - }, - removeData: function (a) { - return this.each(function () { - O.remove(this, a) - }) - }, - }), - n.extend({ - queue: function (a, b, c) { - var d - return a - ? ((b = (b || "fx") + "queue"), - (d = N.get(a, b)), - c && (!d || n.isArray(c) ? (d = N.access(a, b, n.makeArray(c))) : d.push(c)), - d || []) - : void 0 - }, - dequeue: function (a, b) { - b = b || "fx" - var c = n.queue(a, b), - d = c.length, - e = c.shift(), - f = n._queueHooks(a, b), - g = function () { - n.dequeue(a, b) - } - "inprogress" === e && ((e = c.shift()), d--), - e && ("fx" === b && c.unshift("inprogress"), delete f.stop, e.call(a, g, f)), - !d && f && f.empty.fire() - }, - _queueHooks: function (a, b) { - var c = b + "queueHooks" - return ( - N.get(a, c) || - N.access(a, c, { - empty: n.Callbacks("once memory").add(function () { - N.remove(a, [b + "queue", c]) - }), - }) - ) - }, - }), - n.fn.extend({ - queue: function (a, b) { - var c = 2 - return ( - "string" != typeof a && ((b = a), (a = "fx"), c--), - arguments.length < c - ? n.queue(this[0], a) - : void 0 === b - ? this - : this.each(function () { - var c = n.queue(this, a, b) - n._queueHooks(this, a), "fx" === a && "inprogress" !== c[0] && n.dequeue(this, a) - }) - ) - }, - dequeue: function (a) { - return this.each(function () { - n.dequeue(this, a) - }) - }, - clearQueue: function (a) { - return this.queue(a || "fx", []) - }, - promise: function (a, b) { - var c, - d = 1, - e = n.Deferred(), - f = this, - g = this.length, - h = function () { - --d || e.resolveWith(f, [f]) - } - "string" != typeof a && ((b = a), (a = void 0)), (a = a || "fx") - while (g--) (c = N.get(f[g], a + "queueHooks")), c && c.empty && (d++, c.empty.add(h)) - return h(), e.promise(b) - }, - }) - var S = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - T = new RegExp("^(?:([+-])=|)(" + S + ")([a-z%]*)$", "i"), - U = ["Top", "Right", "Bottom", "Left"], - V = function (a, b) { - return (a = b || a), "none" === n.css(a, "display") || !n.contains(a.ownerDocument, a) - } - function W(a, b, c, d) { - var e, - f = 1, - g = 20, - h = d - ? function () { - return d.cur() - } - : function () { - return n.css(a, b, "") - }, - i = h(), - j = (c && c[3]) || (n.cssNumber[b] ? "" : "px"), - k = (n.cssNumber[b] || ("px" !== j && +i)) && T.exec(n.css(a, b)) - if (k && k[3] !== j) { - ;(j = j || k[3]), (c = c || []), (k = +i || 1) - do (f = f || ".5"), (k /= f), n.style(a, b, k + j) - while (f !== (f = h() / i) && 1 !== f && --g) - } - return ( - c && - ((k = +k || +i || 0), - (e = c[1] ? k + (c[1] + 1) * c[2] : +c[2]), - d && ((d.unit = j), (d.start = k), (d.end = e))), - e - ) - } - var X = /^(?:checkbox|radio)$/i, - Y = /<([\w:-]+)/, - Z = /^$|\/(?:java|ecma)script/i, - $ = { - option: [1, ""], - thead: [1, "", "
"], - col: [2, "", "
"], - tr: [2, "", "
"], - td: [3, "", "
"], - _default: [0, "", ""], - } - ;($.optgroup = $.option), ($.tbody = $.tfoot = $.colgroup = $.caption = $.thead), ($.th = $.td) - function _(a, b) { - var c = - "undefined" != typeof a.getElementsByTagName - ? a.getElementsByTagName(b || "*") - : "undefined" != typeof a.querySelectorAll - ? a.querySelectorAll(b || "*") - : [] - return void 0 === b || (b && n.nodeName(a, b)) ? n.merge([a], c) : c - } - function aa(a, b) { - for (var c = 0, d = a.length; d > c; c++) - N.set(a[c], "globalEval", !b || N.get(b[c], "globalEval")) - } - var ba = /<|&#?\w+;/ - function ca(a, b, c, d, e) { - for ( - var f, g, h, i, j, k, l = b.createDocumentFragment(), m = [], o = 0, p = a.length; - p > o; - o++ - ) - if (((f = a[o]), f || 0 === f)) - if ("object" === n.type(f)) n.merge(m, f.nodeType ? [f] : f) - else if (ba.test(f)) { - ;(g = g || l.appendChild(b.createElement("div"))), - (h = (Y.exec(f) || ["", ""])[1].toLowerCase()), - (i = $[h] || $._default), - (g.innerHTML = i[1] + n.htmlPrefilter(f) + i[2]), - (k = i[0]) - while (k--) g = g.lastChild - n.merge(m, g.childNodes), (g = l.firstChild), (g.textContent = "") - } else m.push(b.createTextNode(f)) - ;(l.textContent = ""), (o = 0) - while ((f = m[o++])) - if (d && n.inArray(f, d) > -1) e && e.push(f) - else if ( - ((j = n.contains(f.ownerDocument, f)), (g = _(l.appendChild(f), "script")), j && aa(g), c) - ) { - k = 0 - while ((f = g[k++])) Z.test(f.type || "") && c.push(f) - } - return l - } - !(function () { - var a = d.createDocumentFragment(), - b = a.appendChild(d.createElement("div")), - c = d.createElement("input") - c.setAttribute("type", "radio"), - c.setAttribute("checked", "checked"), - c.setAttribute("name", "t"), - b.appendChild(c), - (l.checkClone = b.cloneNode(!0).cloneNode(!0).lastChild.checked), - (b.innerHTML = ""), - (l.noCloneChecked = !!b.cloneNode(!0).lastChild.defaultValue) - })() - var da = /^key/, - ea = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - fa = /^([^.]*)(?:\.(.+)|)/ - function ga() { - return !0 - } - function ha() { - return !1 - } - function ia() { - try { - return d.activeElement - } catch (a) {} - } - function ja(a, b, c, d, e, f) { - var g, h - if ("object" == typeof b) { - "string" != typeof c && ((d = d || c), (c = void 0)) - for (h in b) ja(a, h, c, d, b[h], f) - return a - } - if ( - (null == d && null == e - ? ((e = c), (d = c = void 0)) - : null == e && - ("string" == typeof c ? ((e = d), (d = void 0)) : ((e = d), (d = c), (c = void 0))), - e === !1) - ) - e = ha - else if (!e) return a - return ( - 1 === f && - ((g = e), - (e = function (a) { - return n().off(a), g.apply(this, arguments) - }), - (e.guid = g.guid || (g.guid = n.guid++))), - a.each(function () { - n.event.add(this, b, e, d, c) - }) - ) - } - ;(n.event = { - global: {}, - add: function (a, b, c, d, e) { - var f, - g, - h, - i, - j, - k, - l, - m, - o, - p, - q, - r = N.get(a) - if (r) { - c.handler && ((f = c), (c = f.handler), (e = f.selector)), - c.guid || (c.guid = n.guid++), - (i = r.events) || (i = r.events = {}), - (g = r.handle) || - (g = r.handle = - function (b) { - return "undefined" != typeof n && n.event.triggered !== b.type - ? n.event.dispatch.apply(a, arguments) - : void 0 - }), - (b = (b || "").match(G) || [""]), - (j = b.length) - while (j--) - (h = fa.exec(b[j]) || []), - (o = q = h[1]), - (p = (h[2] || "").split(".").sort()), - o && - ((l = n.event.special[o] || {}), - (o = (e ? l.delegateType : l.bindType) || o), - (l = n.event.special[o] || {}), - (k = n.extend( - { - type: o, - origType: q, - data: d, - handler: c, - guid: c.guid, - selector: e, - needsContext: e && n.expr.match.needsContext.test(e), - namespace: p.join("."), - }, - f, - )), - (m = i[o]) || - ((m = i[o] = []), - (m.delegateCount = 0), - (l.setup && l.setup.call(a, d, p, g) !== !1) || - (a.addEventListener && a.addEventListener(o, g))), - l.add && (l.add.call(a, k), k.handler.guid || (k.handler.guid = c.guid)), - e ? m.splice(m.delegateCount++, 0, k) : m.push(k), - (n.event.global[o] = !0)) - } - }, - remove: function (a, b, c, d, e) { - var f, - g, - h, - i, - j, - k, - l, - m, - o, - p, - q, - r = N.hasData(a) && N.get(a) - if (r && (i = r.events)) { - ;(b = (b || "").match(G) || [""]), (j = b.length) - while (j--) - if ( - ((h = fa.exec(b[j]) || []), (o = q = h[1]), (p = (h[2] || "").split(".").sort()), o) - ) { - ;(l = n.event.special[o] || {}), - (o = (d ? l.delegateType : l.bindType) || o), - (m = i[o] || []), - (h = h[2] && new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)")), - (g = f = m.length) - while (f--) - (k = m[f]), - (!e && q !== k.origType) || - (c && c.guid !== k.guid) || - (h && !h.test(k.namespace)) || - (d && d !== k.selector && ("**" !== d || !k.selector)) || - (m.splice(f, 1), k.selector && m.delegateCount--, l.remove && l.remove.call(a, k)) - g && - !m.length && - ((l.teardown && l.teardown.call(a, p, r.handle) !== !1) || - n.removeEvent(a, o, r.handle), - delete i[o]) - } else for (o in i) n.event.remove(a, o + b[j], c, d, !0) - n.isEmptyObject(i) && N.remove(a, "handle events") - } - }, - dispatch: function (a) { - a = n.event.fix(a) - var b, - c, - d, - f, - g, - h = [], - i = e.call(arguments), - j = (N.get(this, "events") || {})[a.type] || [], - k = n.event.special[a.type] || {} - if ( - ((i[0] = a), - (a.delegateTarget = this), - !k.preDispatch || k.preDispatch.call(this, a) !== !1) - ) { - ;(h = n.event.handlers.call(this, a, j)), (b = 0) - while ((f = h[b++]) && !a.isPropagationStopped()) { - ;(a.currentTarget = f.elem), (c = 0) - while ((g = f.handlers[c++]) && !a.isImmediatePropagationStopped()) - (a.rnamespace && !a.rnamespace.test(g.namespace)) || - ((a.handleObj = g), - (a.data = g.data), - (d = ((n.event.special[g.origType] || {}).handle || g.handler).apply(f.elem, i)), - void 0 !== d && (a.result = d) === !1 && (a.preventDefault(), a.stopPropagation())) - } - return k.postDispatch && k.postDispatch.call(this, a), a.result - } - }, - handlers: function (a, b) { - var c, - d, - e, - f, - g = [], - h = b.delegateCount, - i = a.target - if (h && i.nodeType && ("click" !== a.type || isNaN(a.button) || a.button < 1)) - for (; i !== this; i = i.parentNode || this) - if (1 === i.nodeType && (i.disabled !== !0 || "click" !== a.type)) { - for (d = [], c = 0; h > c; c++) - (f = b[c]), - (e = f.selector + " "), - void 0 === d[e] && - (d[e] = f.needsContext - ? n(e, this).index(i) > -1 - : n.find(e, this, null, [i]).length), - d[e] && d.push(f) - d.length && g.push({ elem: i, handlers: d }) - } - return h < b.length && g.push({ elem: this, handlers: b.slice(h) }), g - }, - props: - "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split( - " ", - ), - fixHooks: {}, - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function (a, b) { - return null == a.which && (a.which = null != b.charCode ? b.charCode : b.keyCode), a - }, - }, - mouseHooks: { - props: - "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split( - " ", - ), - filter: function (a, b) { - var c, - e, - f, - g = b.button - return ( - null == a.pageX && - null != b.clientX && - ((c = a.target.ownerDocument || d), - (e = c.documentElement), - (f = c.body), - (a.pageX = - b.clientX + - ((e && e.scrollLeft) || (f && f.scrollLeft) || 0) - - ((e && e.clientLeft) || (f && f.clientLeft) || 0)), - (a.pageY = - b.clientY + - ((e && e.scrollTop) || (f && f.scrollTop) || 0) - - ((e && e.clientTop) || (f && f.clientTop) || 0))), - a.which || void 0 === g || (a.which = 1 & g ? 1 : 2 & g ? 3 : 4 & g ? 2 : 0), - a - ) - }, - }, - fix: function (a) { - if (a[n.expando]) return a - var b, - c, - e, - f = a.type, - g = a, - h = this.fixHooks[f] - h || (this.fixHooks[f] = h = ea.test(f) ? this.mouseHooks : da.test(f) ? this.keyHooks : {}), - (e = h.props ? this.props.concat(h.props) : this.props), - (a = new n.Event(g)), - (b = e.length) - while (b--) (c = e[b]), (a[c] = g[c]) - return ( - a.target || (a.target = d), - 3 === a.target.nodeType && (a.target = a.target.parentNode), - h.filter ? h.filter(a, g) : a - ) - }, - special: { - load: { noBubble: !0 }, - focus: { - trigger: function () { - return this !== ia() && this.focus ? (this.focus(), !1) : void 0 - }, - delegateType: "focusin", - }, - blur: { - trigger: function () { - return this === ia() && this.blur ? (this.blur(), !1) : void 0 - }, - delegateType: "focusout", - }, - click: { - trigger: function () { - return "checkbox" === this.type && this.click && n.nodeName(this, "input") - ? (this.click(), !1) - : void 0 - }, - _default: function (a) { - return n.nodeName(a.target, "a") - }, - }, - beforeunload: { - postDispatch: function (a) { - void 0 !== a.result && a.originalEvent && (a.originalEvent.returnValue = a.result) - }, - }, - }, - }), - (n.removeEvent = function (a, b, c) { - a.removeEventListener && a.removeEventListener(b, c) - }), - (n.Event = function (a, b) { - return this instanceof n.Event - ? (a && a.type - ? ((this.originalEvent = a), - (this.type = a.type), - (this.isDefaultPrevented = - a.defaultPrevented || (void 0 === a.defaultPrevented && a.returnValue === !1) - ? ga - : ha)) - : (this.type = a), - b && n.extend(this, b), - (this.timeStamp = (a && a.timeStamp) || n.now()), - void (this[n.expando] = !0)) - : new n.Event(a, b) - }), - (n.Event.prototype = { - constructor: n.Event, - isDefaultPrevented: ha, - isPropagationStopped: ha, - isImmediatePropagationStopped: ha, - preventDefault: function () { - var a = this.originalEvent - ;(this.isDefaultPrevented = ga), a && a.preventDefault() - }, - stopPropagation: function () { - var a = this.originalEvent - ;(this.isPropagationStopped = ga), a && a.stopPropagation() - }, - stopImmediatePropagation: function () { - var a = this.originalEvent - ;(this.isImmediatePropagationStopped = ga), - a && a.stopImmediatePropagation(), - this.stopPropagation() - }, - }), - n.each( - { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout", - }, - function (a, b) { - n.event.special[a] = { - delegateType: b, - bindType: b, - handle: function (a) { - var c, - d = this, - e = a.relatedTarget, - f = a.handleObj - return ( - (e && (e === d || n.contains(d, e))) || - ((a.type = f.origType), (c = f.handler.apply(this, arguments)), (a.type = b)), - c - ) - }, - } - }, - ), - n.fn.extend({ - on: function (a, b, c, d) { - return ja(this, a, b, c, d) - }, - one: function (a, b, c, d) { - return ja(this, a, b, c, d, 1) - }, - off: function (a, b, c) { - var d, e - if (a && a.preventDefault && a.handleObj) - return ( - (d = a.handleObj), - n(a.delegateTarget).off( - d.namespace ? d.origType + "." + d.namespace : d.origType, - d.selector, - d.handler, - ), - this - ) - if ("object" == typeof a) { - for (e in a) this.off(e, b, a[e]) - return this - } - return ( - (b !== !1 && "function" != typeof b) || ((c = b), (b = void 0)), - c === !1 && (c = ha), - this.each(function () { - n.event.remove(this, a, c, b) - }) - ) - }, - }) - var ka = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, - la = /\s*$/g - function pa(a, b) { - return n.nodeName(a, "table") && n.nodeName(11 !== b.nodeType ? b : b.firstChild, "tr") - ? a.getElementsByTagName("tbody")[0] || a.appendChild(a.ownerDocument.createElement("tbody")) - : a - } - function qa(a) { - return (a.type = (null !== a.getAttribute("type")) + "/" + a.type), a - } - function ra(a) { - var b = na.exec(a.type) - return b ? (a.type = b[1]) : a.removeAttribute("type"), a - } - function sa(a, b) { - var c, d, e, f, g, h, i, j - if (1 === b.nodeType) { - if (N.hasData(a) && ((f = N.access(a)), (g = N.set(b, f)), (j = f.events))) { - delete g.handle, (g.events = {}) - for (e in j) for (c = 0, d = j[e].length; d > c; c++) n.event.add(b, e, j[e][c]) - } - O.hasData(a) && ((h = O.access(a)), (i = n.extend({}, h)), O.set(b, i)) - } - } - function ta(a, b) { - var c = b.nodeName.toLowerCase() - "input" === c && X.test(a.type) - ? (b.checked = a.checked) - : ("input" !== c && "textarea" !== c) || (b.defaultValue = a.defaultValue) - } - function ua(a, b, c, d) { - b = f.apply([], b) - var e, - g, - h, - i, - j, - k, - m = 0, - o = a.length, - p = o - 1, - q = b[0], - r = n.isFunction(q) - if (r || (o > 1 && "string" == typeof q && !l.checkClone && ma.test(q))) - return a.each(function (e) { - var f = a.eq(e) - r && (b[0] = q.call(this, e, f.html())), ua(f, b, c, d) - }) - if ( - o && - ((e = ca(b, a[0].ownerDocument, !1, a, d)), - (g = e.firstChild), - 1 === e.childNodes.length && (e = g), - g || d) - ) { - for (h = n.map(_(e, "script"), qa), i = h.length; o > m; m++) - (j = e), - m !== p && ((j = n.clone(j, !0, !0)), i && n.merge(h, _(j, "script"))), - c.call(a[m], j, m) - if (i) - for (k = h[h.length - 1].ownerDocument, n.map(h, ra), m = 0; i > m; m++) - (j = h[m]), - Z.test(j.type || "") && - !N.access(j, "globalEval") && - n.contains(k, j) && - (j.src - ? n._evalUrl && n._evalUrl(j.src) - : n.globalEval(j.textContent.replace(oa, ""))) - } - return a - } - function va(a, b, c) { - for (var d, e = b ? n.filter(b, a) : a, f = 0; null != (d = e[f]); f++) - c || 1 !== d.nodeType || n.cleanData(_(d)), - d.parentNode && - (c && n.contains(d.ownerDocument, d) && aa(_(d, "script")), d.parentNode.removeChild(d)) - return a - } - n.extend({ - htmlPrefilter: function (a) { - return a.replace(ka, "<$1>") - }, - clone: function (a, b, c) { - var d, - e, - f, - g, - h = a.cloneNode(!0), - i = n.contains(a.ownerDocument, a) - if (!(l.noCloneChecked || (1 !== a.nodeType && 11 !== a.nodeType) || n.isXMLDoc(a))) - for (g = _(h), f = _(a), d = 0, e = f.length; e > d; d++) ta(f[d], g[d]) - if (b) - if (c) for (f = f || _(a), g = g || _(h), d = 0, e = f.length; e > d; d++) sa(f[d], g[d]) - else sa(a, h) - return (g = _(h, "script")), g.length > 0 && aa(g, !i && _(a, "script")), h - }, - cleanData: function (a) { - for (var b, c, d, e = n.event.special, f = 0; void 0 !== (c = a[f]); f++) - if (L(c)) { - if ((b = c[N.expando])) { - if (b.events) - for (d in b.events) e[d] ? n.event.remove(c, d) : n.removeEvent(c, d, b.handle) - c[N.expando] = void 0 - } - c[O.expando] && (c[O.expando] = void 0) - } - }, - }), - n.fn.extend({ - domManip: ua, - detach: function (a) { - return va(this, a, !0) - }, - remove: function (a) { - return va(this, a) - }, - text: function (a) { - return K( - this, - function (a) { - return void 0 === a - ? n.text(this) - : this.empty().each(function () { - ;(1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType) || - (this.textContent = a) - }) - }, - null, - a, - arguments.length, - ) - }, - append: function () { - return ua(this, arguments, function (a) { - if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { - var b = pa(this, a) - b.appendChild(a) - } - }) - }, - prepend: function () { - return ua(this, arguments, function (a) { - if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { - var b = pa(this, a) - b.insertBefore(a, b.firstChild) - } - }) - }, - before: function () { - return ua(this, arguments, function (a) { - this.parentNode && this.parentNode.insertBefore(a, this) - }) - }, - after: function () { - return ua(this, arguments, function (a) { - this.parentNode && this.parentNode.insertBefore(a, this.nextSibling) - }) - }, - empty: function () { - for (var a, b = 0; null != (a = this[b]); b++) - 1 === a.nodeType && (n.cleanData(_(a, !1)), (a.textContent = "")) - return this - }, - clone: function (a, b) { - return ( - (a = null == a ? !1 : a), - (b = null == b ? a : b), - this.map(function () { - return n.clone(this, a, b) - }) - ) - }, - html: function (a) { - return K( - this, - function (a) { - var b = this[0] || {}, - c = 0, - d = this.length - if (void 0 === a && 1 === b.nodeType) return b.innerHTML - if ( - "string" == typeof a && - !la.test(a) && - !$[(Y.exec(a) || ["", ""])[1].toLowerCase()] - ) { - a = n.htmlPrefilter(a) - try { - for (; d > c; c++) - (b = this[c] || {}), - 1 === b.nodeType && (n.cleanData(_(b, !1)), (b.innerHTML = a)) - b = 0 - } catch (e) {} - } - b && this.empty().append(a) - }, - null, - a, - arguments.length, - ) - }, - replaceWith: function () { - var a = [] - return ua( - this, - arguments, - function (b) { - var c = this.parentNode - n.inArray(this, a) < 0 && (n.cleanData(_(this)), c && c.replaceChild(b, this)) - }, - a, - ) - }, - }), - n.each( - { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith", - }, - function (a, b) { - n.fn[a] = function (a) { - for (var c, d = [], e = n(a), f = e.length - 1, h = 0; f >= h; h++) - (c = h === f ? this : this.clone(!0)), n(e[h])[b](c), g.apply(d, c.get()) - return this.pushStack(d) - } - }, - ) - var wa, - xa = { HTML: "block", BODY: "block" } - function ya(a, b) { - var c = n(b.createElement(a)).appendTo(b.body), - d = n.css(c[0], "display") - return c.detach(), d - } - function za(a) { - var b = d, - c = xa[a] - return ( - c || - ((c = ya(a, b)), - ("none" !== c && c) || - ((wa = (wa || n("