diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..b9b66bb9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +tmpl/assets/* linguist-vendored +*.js linguist-vendored +*.css linguist-vendored +*.html linguist-vendored diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a4a4de05..8c1dadd7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,19 +1,20 @@ Please check if what you want to add to `awesome-go` list meets [quality standards](https://github.com/avelino/awesome-go/blob/master/CONTRIBUTING.md#quality-standard) before sending pull request. Thanks! -Please provide package links to: +**Please provide package links to:** +- github.com repo: - godoc.org: - goreportcard.com: -- gocover.io: +- coverage service link (gocover, coveralls etc.): -Note, that new categories can be added only when there are 3 packages or more. +**Note**: that new categories can be added only when there are 3 packages or more. -Make sure that you've checked the boxes below before you submit PR: +**Make sure that you've checked the boxes below before you submit PR:** - [ ] I have added my package in alphabetical order - [ ] I know that this package was not listed before -- [ ] I have added godoc link -- [ ] I have added gocover.io link -- [ ] I have added goreportcard link +- [ ] I have added godoc link to the repo and to my pull request +- [ ] I have added coverage service link to the repo and to my pull request +- [ ] I have added goreportcard link to the repo and to my pull request - [ ] I have read [Contribution guidelines](https://github.com/avelino/awesome-go/blob/master/CONTRIBUTING.md#contribution-guidelines) and [Quality standard](https://github.com/avelino/awesome-go/blob/master/CONTRIBUTING.md#quality-standard). Thanks for your PR, you're awesome! :+1: diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..83b7210a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +tmpl/index.html +awesome-go diff --git a/.travis.yml b/.travis.yml index 6812fc17..45a7b25c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,11 @@ language: go go: - - 1.4 + - 1.7 sudo: false install: - go get github.com/russross/blackfriday - go get github.com/PuerkitoBio/goquery - + - go get github.com/gorilla/mux diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 110e8efe..0fc90bf3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,10 +14,12 @@ To set this list apart from and compliment the excellent [Go wiki Projects page] - The link should be the name of the package or project - Descriptions should be clear, concise, and non-promotional - Descriptions should follow the link, on the same line -- Needs bibliotica 3 (minimum) to create a new category. +- Needs library 3 (minimum) to create a new category. Please contribute links to packages/projects you have used or are familiar with. This will help ensure high-quality entries. +If you removed our PR template you can find it [here](https://github.com/avelino/awesome-go/blob/master/.github/PULL_REQUEST_TEMPLATE.md). + ## Quality standard @@ -30,7 +32,7 @@ To be on the list, project repositories should adhere to these quality standards - Or, for finished projects, issues and pull requests are responded to - Stable or progressing toward stable - Thoroughly documented (README, godoc comments, etc.) -- Tests, where practical +- Tests, where practical. If library/program testable, than coverage should be >= 80% for non-data-related packages and >=90% for data related packages. **Notice**: the tests will be reviewed too. We will check your coverage manually if your package's coverage is just a benchmark results. ## Reporting issues diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f58bfdeb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM golang:alpine + +RUN apk add --update -t build-deps curl go git libc-dev gcc libgcc +RUN go get github.com/russross/blackfriday github.com/gorilla/mux + +WORKDIR /srv + +CMD ["go", "run", "repo.go"] diff --git a/README.md b/README.md index 168fb818..4e9cc56f 100644 --- a/README.md +++ b/README.md @@ -89,10 +89,12 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [flac](https://github.com/eaburns/flac) - A native Go FLAC decoder. * [flac](https://github.com/mewkiz/flac) - A native Go FLAC decoder. +* [gaad](https://github.com/Comcast/gaad) - A native Go AAC bitstream parser * [go-sox](https://github.com/krig/go-sox) - libsox bindings for go. * [go_mediainfo](https://github.com/zhulik/go_mediainfo) - libmediainfo bindings for go. +* [id3v2](https://github.com/bogem/id3v2) - Fast and stable ID3 parsing and writing library for Go * [mix](https://github.com/go-mix/mix) - Sequence-based Go-native audio mixer for music apps. -* [mp3](https://github.com/tcolgate/mp3) - A native Go MP# decoder. +* [mp3](https://github.com/tcolgate/mp3) - A native Go MP3 decoder. * [music-theory](https://github.com/go-music-theory/music-theory) - Music theory models in Go. * [PortAudio](https://github.com/gordonklaus/portaudio) - Go bindings for the PortAudio audio I/O library. * [portmidi](https://github.com/rakyll/portmidi) - Go bindings for PortMidi. @@ -108,11 +110,13 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [authboss](https://github.com/go-authboss/authboss) - A modular authentication system for the web. It tries to remove as much boilerplate and "hard things" as possible so that each time you start a new web project in Go, you can plug it in, configure, and start building your app without having to build an authentication system each time. * [Go-AWS-Auth](https://github.com/smartystreets/go-aws-auth) - AWS (Amazon Web Services) request signing library. * [go-jose](https://github.com/square/go-jose) - A fairly complete implementation of the JOSE working group's JSON Web Token, JSON Web Signatures, and JSON Web Encryption specs. +* [go-oauth2-server](https://github.com/RichardKnop/go-oauth2-server) - A standalone, specification-compliant, OAuth2 server written in Golang. * [go.auth](https://github.com/bradrydzewski/go.auth) - Authentication API for Go web applications. * [gologin](https://github.com/dghubble/gologin) - chainable handlers for login with OAuth1 and OAuth2 authentication providers. * [gorbac](https://github.com/mikespook/gorbac) - provides a lightweight role-based access control (RBAC) implementation in Golang. * [goth](https://github.com/markbates/goth) - provides a simple, clean, and idiomatic way to use OAuth and OAuth2. Handles multiple provides out of the box. * [httpauth](https://github.com/goji/httpauth) - HTTP Authentication middleware. +* [jwt](https://github.com/robbert229/jwt) - A clean and easy to use implementation of JSON Web Tokens (JWT). * [jwt-go](https://github.com/dgrijalva/jwt-go) - Golang implementation of JSON Web Tokens (JWT). * [oauth2](https://github.com/golang/oauth2) - Successor of goauth2. Generic OAuth 2.0 package that comes with JWT, Google APIs, Compute Engine and App Engine support. * [osin](https://github.com/RangelReale/osin) - Golang OAuth2 server library. @@ -131,8 +135,9 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [cli-init](https://github.com/tcnksm/gcli) - The easy way to start building Golang command line application. * [climax](http://github.com/tucnak/climax) - An alternative CLI with "human face", in spirit of Go command * [cobra](https://github.com/spf13/cobra) - A Commander for modern Go CLI interactions -* [codegangsta/cli](https://github.com/codegangsta/cli) - A small package for building command line apps in Go. * [docopt.go](https://github.com/docopt/docopt.go) - A command-line arguments parser that will make you smile. +* [drive](https://github.com/odeke-em/drive) - Google Drive client for the commandline +* [go-arg](https://github.com/alexflint/go-arg) - Struct-based argument parsing in Go * [go-flags](https://github.com/jessevdk/go-flags) - go command line option parser * [kingpin](https://github.com/alecthomas/kingpin) - A command line and flag parser supporting sub commands. * [liner](https://github.com/peterh/liner) - A Go readline-like library for command-line interfaces. @@ -140,6 +145,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [mow.cli](https://github.com/jawher/mow.cli) - A Go library for building CLI applications with sophisticated flag and argument parsing and validation. * [readline](https://github.com/chzyer/readline) - A pure golang implementation that provide most of features in GNU-Readline under MIT license. * [ukautz/clif](https://github.com/ukautz/clif) - A small command line interface framework. +* [urfave/cli](https://github.com/urfave/cli) - A simple, fast, and fun package for building command line apps in Go (formerly codegangsta/cli). * [wlog](https://github.com/dixonwille/wlog) - A simple logging interface that supports cross-platform color and concurrency. * [wmenu](https://github.com/dixonwille/wmenu) - An easy to use menu structure for cli applications that prompts users to make choices. @@ -148,6 +154,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Libraries for building Console Applications and Console User Interfaces* +* [aurora](https://github.com/logrusorgru/aurora) - ANSI terminal colors that supports fmt.Printf/Sprintf * [chalk](https://github.com/ttacon/chalk) - Intuitive package for prettifying terminal/console output. * [color](https://github.com/fatih/color) - Versatile package for colored terminal output. * [colourize](https://github.com/TreyBastian/colourize) - Go library for ANSI colour text in terminals. @@ -174,6 +181,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [envconfig](https://github.com/vrischmann/envconfig) - Read your configuration from environment variables. * [gcfg](https://github.com/go-gcfg/gcfg) - read INI-style configuration files into Go structs; supports user-defined types and subsections * [gofigure](https://github.com/ian-kent/gofigure) - Go application configuration made easy +* [hjson](https://github.com/hjson/hjson-go) - Human JSON, a configuration file format for humans. Relaxed syntax, fewer mistakes, more comments. * [ingo](https://github.com/schachmat/ingo) - Flags persisted in an ini-like config file * [ini](https://github.com/go-ini/ini) - Go package for read and write INI files * [mini](https://github.com/FogCreek/mini) - A golang package for parsing ini-style configuration files @@ -203,15 +211,18 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [binpacker](https://github.com/zhuangsirui/binpacker) - Binary packer and unpacker helps user build custom binary stream. * [bitset](https://github.com/willf/bitset) - Go package implementing bitsets. * [bloom](https://github.com/zhenjl/bloom) - Bloom filters implemented in Go. -* [boomfilters](https://github.com/tylertreat/BoomFilters) - probabilistic data structures for processing continuous, unbounded streams +* [boomfilters](https://github.com/tylertreat/BoomFilters) - Probabilistic data structures for processing continuous, unbounded streams * [count-min-log](https://github.com/seiflotfy/count-min-log) - A Go implementation Count-Min-Log sketch: Approximately counting with approximate counters (Like Count-Min sketch but using less memory). * [cuckoofilter](https://github.com/seiflotfy/cuckoofilter) - Cuckoo filter: a good alternative to a counting bloom filter implemented in Go. * [encoding](https://github.com/zhenjl/encoding) - Integer Compression Libraries for Go. * [go-adaptive-radix-tree](https://github.com/plar/go-adaptive-radix-tree) - A Go implementation of Adaptive Radix Tree. -* [go-datastructures](https://github.com/Workiva/go-datastructures) - a collection of useful, performant, and thread-safe data structures +* [go-datastructures](https://github.com/Workiva/go-datastructures) - A collection of useful, performant, and thread-safe data structures * [go-geoindex](https://github.com/hailocab/go-geoindex) - In-memory geo index. +* [gods](https://github.com/emirpasic/gods) - Go Data Structures. Containers, Sets, Lists, Stacks, Maps, BidiMaps, Trees, HashSet etc. * [golang-set](https://github.com/deckarep/golang-set) - Thread-Safe and Non-Thread-Safe high-performance sets for Go. * [goskiplist](https://github.com/ryszard/goskiplist) - A skip list implementation in Go. +* [hilbert](https://github.com/google/hilbert) - Go package for mapping values to and from space-filling curves, such as Hilbert and Peano curves. +* [levenshtein](https://github.com/agnivade/levenshtein) - Implementation to calculate levenshtein distance in Go. * [mafsa](https://github.com/smartystreets/mafsa) - MA-FSA implementation with Minimal Perfect Hashing * [roaring](https://github.com/RoaringBitmap/roaring) - Go package implementing compressed bitsets. * [skiplist](https://github.com/gansidui/skiplist) - Skiplist implementation in Go @@ -223,38 +234,49 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Databases implemented in Go.* + +* [BigCache](https://github.com/allegro/bigcache) - Efficient key/value cache for gigabytes of data. * [bolt](https://github.com/boltdb/bolt) - A low-level key/value database for Go. +* [buntdb](https://github.com/tidwall/buntdb) - A fast, embeddable, in-memory key/value database for Go with custom indexing and spatial support. * [cache2go](https://github.com/muesli/cache2go) - An in-memory key:value cache which supports automatic invalidation based on timeouts. * [cockroach](https://github.com/cockroachdb/cockroach) - A Scalable, Geo-Replicated, Transactional Datastore * [couchcache](https://github.com/codingsince1985/couchcache) - A RESTful caching micro-service backed by Couchbase server. * [dgraph](https://github.com/dgraph-io/dgraph) - Scalable, Distributed, Low Latency, High Throughput Graph Database. * [diskv](https://github.com/peterbourgon/diskv) - A home-grown disk-backed key-value store. +* [eliasdb](https://github.com/krotik/eliasdb) - Dependency-free, transactional graph database with REST API, phrase search and SQL-like query language. * [forestdb](https://github.com/couchbase/goforestdb) - Go bindings for ForestDB. * [GCache](https://github.com/bluele/gcache) - Cache library with support for expirable Cache, LFU, LRU and ARC. +* [geocache](https://github.com/melihmucuk/geocache) - An in-memory cache that is suitable for geolocation based applications. * [go-cache](https://github.com/pmylund/go-cache) - An in-memory key:value store/cache (similar to Memcached) library for Go, suitable for single-machine applications. * [goleveldb](https://github.com/syndtr/goleveldb) - An implementation of the [LevelDB](https://github.com/google/leveldb) key/value database in the Go. * [groupcache](https://github.com/golang/groupcache) - Groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases. * [influxdb](https://github.com/influxdb/influxdb) - Scalable datastore for metrics, events, and real-time analytics * [ledisdb](https://github.com/siddontang/ledisdb) - Ledisdb is a high performance NoSQL like Redis based on LevelDB. * [levigo](https://github.com/jmhodges/levigo) - Levigo is a Go wrapper for LevelDB. -* [prometheus](https://github.com/prometheus/prometheus) - Monitoring system and time series database. +* [pREST](https://github.com/nuveo/prest) - Serve a RESTful API from any PostgreSQL database. +* [prometheus](https://github.com/prometheus/prometheus) - Monitoring system and time series database. * [rqlite](https://github.com/rqlite/rqlite) - Replicated SQLite, using Raft consensus. * [tidb](https://github.com/pingcap/tidb) - TiDB is a distributed SQL database. Inspired by the design of Google F1. * [tiedot](https://github.com/HouzuoGuo/tiedot) - Your NoSQL database powered by Golang. * [Tile38](https://github.com/tidwall/tile38) - A geolocation DB with spatial index and realtime geofencing. +*Database schema migration.* + +* [darwin](https://github.com/GuiaBolso/darwin) - Database schema evolution library for Go +* [goose](https://github.com/steinbacher/goose) - Database migration tool. You can manage your database's evolution by creating incremental SQL or Go scripts. +* [gormigrate](https://github.com/go-gormigrate/gormigrate) - Database schema migration helper for Gorm ORM. +* [migrate](https://github.com/mattes/migrate) - Database migration handling in Golang support MySQL,PostgreSQL,Cassandra and SQLite. +* [pravasan](https://github.com/pravasan/pravasan) - Simple Migration tool - currently for MySQL but planning to support soon for Postgres, SQLite, MongoDB, etc., +* [sql-migrate](https://github.com/rubenv/sql-migrate) - Database migration tool. Allows embedding migrations into the application using go-bindata. + *Database tools.* * [go-mysql](https://github.com/siddontang/go-mysql) - A go toolset to handle MySQL protocol and replication. * [go-mysql-elasticsearch](https://github.com/siddontang/go-mysql-elasticsearch) - Sync your MySQL data into Elasticsearch automatically. -* [goose](https://github.com/steinbacher/goose) - Database migration tool. You can manage your database's evolution by creating incremental SQL or Go scripts. * [kingshard](https://github.com/flike/kingshard) - kingshard is a high performance proxy for MySQL powered by Golang. -* [migrate](https://github.com/mattes/migrate) - Database migration handling in Golang support MySQL,PostgreSQL,Cassandra and SQLite. * [myreplication](https://github.com/2tvenom/myreplication) - MySql binary log replication listener. Support statement and row based replication. * [orchestrator](https://github.com/outbrain/orchestrator) - MySQL replication topology manager & visualizer * [pgweb](https://github.com/sosedoff/pgweb) - A web-based PostgreSQL database browser -* [pravasan](https://github.com/pravasan/pravasan) - Simple Migration tool - currently for MySQL but planning to support soon for Postgres, SQLite, MongoDB, etc., -* [sql-migrate](https://github.com/rubenv/sql-migrate) - Database migration tool. Allows embedding migrations into the application using go-bindata. * [vitess](https://github.com/youtube/vitess) - vitess provides servers and tools which facilitate scaling of MySQL databases for large scale web services. *SQL query builder, libraries for building and using SQL.* @@ -275,6 +297,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Libraries for connecting and operating databases.* * Relational Databases + * [bgc](https://github.com/viant/bgc) - Datastore Connectivity for BigQuery for go. * [firebirdsql](https://github.com/nakagami/firebirdsql) - Firebird RDBMS SQL driver for Go * [go-adodb](https://github.com/mattn/go-adodb) - Microsoft ActiveX Object DataBase driver for go that using database/sql. * [go-bqstreamer](https://github.com/rounds/go-bqstreamer) - BigQuery fast and concurrent stream insert. @@ -289,7 +312,9 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * NoSQL Databases * [aerospike-client-go](https://github.com/aerospike/aerospike-client-go) - Aerospike client in Go language. * [arangolite](https://github.com/solher/arangolite) - Lightweight golang driver for ArangoDB. + * [asc](https://github.com/viant/asc) - Datastore Connectivity for Aerospike for go. * [cayley](https://github.com/google/cayley) - A graph database with support for multiple backends. + * [dsc](https://github.com/viant/dsc) - Datastore connectivity for SQL, NoSQL, structured files. * [dynago](https://github.com/underarmour/dynago) - Dynago is a principle of least surprise client for DynamoDB * [go-couchbase](https://github.com/couchbase/go-couchbase) - Couchbase client in Go * [go-couchdb](https://github.com/fjl/go-couchdb) - Yet another CouchDB HTTP API wrapper for Go @@ -297,6 +322,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [gocql](http://gocql.github.io) - A Go language driver for Apache Cassandra. * [gomemcache](https://github.com/bradfitz/gomemcache/) - memcache client library for the Go programming language. * [gorethink](https://github.com/dancannon/gorethink) - Go language driver for RethinkDB + * [goriak](https://github.com/zegl/goriak) - Go language driver for Riak KV * [mgo](https://godoc.org/labix.org/v2/mgo) - MongoDB driver for the Go language that implements a rich and well tested selection of features under a very simple API following standard Go idioms. * [neo4j](https://github.com/cihangir/neo4j) - Neo4j Rest API Bindings for Golang * [Neo4j-GO](https://github.com/davemeehan/Neo4j-GO) - Neo4j REST Client in golang. @@ -308,7 +334,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * Search and Analytic Databases * [bleve](https://github.com/blevesearch/bleve) - A modern text indexing library for go. - * [elastic](https://github.com/olivere/elastic) - Elasticsearch client for Google Go. + * [elastic](https://github.com/olivere/elastic) - Elasticsearch client for Go. * [elastigo](https://github.com/mattbaird/elastigo) - A Elasticsearch client library. * [goes](https://github.com/belogik/goes) - A library to interact with Elasticsearch. * [skizze](https://github.com/seiflotfy/skizze) - A probabilistic data-structures service and storage. @@ -317,6 +343,8 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Libraries for working with dates and times.* +* [carbon](https://github.com/uniplaces/carbon) - A simple Time extension with a lot of util methods, ported from PHP Carbon library. +* [durafmt](https://github.com/hako/durafmt) - A time duration formatting library for Go. * [go-persian-calendar](https://github.com/yaa110/go-persian-calendar) - The implementation of the Persian (Solar Hijri) Calendar in Go (golang). * [goweek](https://github.com/grsmv/goweek) - Library for working with week entity in golang. * [now](https://github.com/jinzhu/now) - Now is a time toolkit for golang. @@ -334,8 +362,17 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [go-jump](https://github.com/dgryski/go-jump) - A port of Google's "Jump" Consistent Hash function. * [gorpc](https://github.com/valyala/gorpc) - Simple, fast and scalable RPC library for high load. * [grpc-go](https://github.com/grpc/grpc-go) - The Go language implementation of gRPC. HTTP/2 based RPC. +* [hprose](https://github.com/hprose/hprose-golang) - A very newbility RPC Library, support 25+ languages now. +* [jsonrpc](https://github.com/osamingo/jsonrpc) - The jsonrpc package helps implement of JSON-RPC 2.0. +* [jsonrpc](https://github.com/ybbus/jsonrpc) - A JSON-RPC 2.0 HTTP client implementation * [micro](https://github.com/micro/micro) - A pluggable microservice toolkit and distributed systems platform. +* [NATS](https://github.com/nats-io/gnatsd) - A lightweight, high performance messaging system for microservices, IoT, and cloud native systems. * [raft](https://github.com/hashicorp/raft) - Golang implementation of the Raft consensus protocol, by HashiCorp. +* [raft](https://github.com/coreos/etcd/tree/master/raft#readme) - Go implementation of the Raft consensus protocol, by CoreOS. +* [ringpop-go](https://github.com/uber/ringpop-go) - Scalable, fault-tolerant application-layer sharding for Go applications +* [rpcx](https://github.com/smallnest/rpcx) - A distributed pluggable RPC service framework like alibaba Dubbo. +* [sleuth](https://github.com/ursiform/sleuth) - A library for master-less p2p auto-discovery and RPC between HTTP services (using [ZeroMQ](https://github.com/zeromq/libzmq)). +* [tendermint](https://github.com/tendermint/tendermint) - High-performance middleware for transforming a state machine written in any programming language into a Byzantine Fault Tolerant replicated state machine using the Tendermint consensus and blockchain protocols. * [torrent](https://github.com/anacrolix/torrent) - BitTorrent client package. * [dht](https://godoc.org/github.com/anacrolix/torrent/dht) - BitTorrent Kademlia DHT implementation. * [go-peerflix](https://github.com/Sioro-Neoku/go-peerflix) - Video streaming torrent client. @@ -347,6 +384,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [douceur](https://github.com/aymerick/douceur) - CSS inliner for your HTML emails. * [email](https://github.com/jordan-wright/email) - A robust and flexible email library for Go. * [go-dkim](https://github.com/toorop/go-dkim) - A DKIM library, to sign & verify email. +* [go-imap](https://github.com/emersion/go-imap) - An IMAP library for clients and servers * [Gomail](https://github.com/go-gomail/gomail/) - Gomail is a very simple and powerful package to send emails. * [Hectane](https://github.com/hectane/hectane) - Lightweight SMTP client providing an HTTP API * [MailHog](https://github.com/mailhog/MailHog) - Email and SMTP testing with web and API interface @@ -368,6 +406,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [go-python](https://github.com/sbinet/go-python) - naive go bindings to the CPython C-API * [golua](https://github.com/aarzilli/golua) - Go bindings for Lua C API * [gopher-lua](https://github.com/yuin/gopher-lua) - a Lua 5.1 VM and compiler written in Go +* [ngaro](https://github.com/db47h/ngaro) - Embeddable Ngaro VM implementation enabling scripting in Retro * [otto](https://github.com/robertkrimen/otto) - A JavaScript interpreter written in Go * [purl](https://github.com/ian-kent/purl) - Perl 5.18.2 embedded in Go @@ -378,6 +417,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [accounting](https://github.com/leekchan/accounting) - money and currency formatting for golang * [decimal](https://github.com/shopspring/decimal) - Arbitrary-precision fixed-point decimal numbers +* [vat](https://github.com/dannyvankooten/vat) - VAT number validation & EU VAT rates ## Forms @@ -387,6 +427,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [bind](https://github.com/robfig/bind) - Bind form data to any Go values * [binding](https://github.com/mholt/binding) - Binds form and JSON data from net/http Request to struct. * [conform](https://github.com/leebenson/conform) - Keeps user input in check. Trims, sanitizes & scrubs data based on struct tags. +* [form](https://github.com/go-playground/form) - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support. * [formam](https://github.com/monoculum/formam) - decode form's values into a struct. * [forms](https://github.com/albrow/forms) - A framework-agnostic library for parsing and validating form/JSON data which supports multipart forms and files. * [gorilla/csrf](https://github.com/gorilla/csrf) - CSRF protection for Go web applications & services. @@ -397,6 +438,8 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Awesome game development libraries.* +* [Azul3D](https://github.com/azul3d/engine) - A 3D game engine written in Go +* [Ebiten](https://github.com/hajimehoshi/ebiten) - A simple SNES-like 2D game library in Go * [engo](https://github.com/EngoEngine/engo) - Engo is an open-source 2D game engine written in Go. It follows the Entity-Component-System paradigm. * [GarageEngine](https://github.com/vova616/GarageEngine) - 2d game engine written in Go working on OpenGL. * [glop](https://github.com/runningwild/glop) - Glop (Game Library Of Power) is a fairly simple cross-platform game library. @@ -413,6 +456,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Tools to enhance the language with features like generics via code generation* +* [efaceconv](https://github.com/t0pep0/efaceconv) - Code generation tool for high performance conversion from interface{} to immutable type without allocations * [gen](https://github.com/clipperhouse/gen) - Code generation tool for ‘generics’-like functionality. * [go-linq](https://github.com/ahmetalpbalkan/go-linq) - .NET LINQ-like query methods for Go. * [interfaces](https://github.com/rjeczalik/interfaces) - Command line tool for generating interface definitions. @@ -432,8 +476,10 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a *Tools for managing and working with Goroutines* +* [go-flow](https://github.com/kamildrazkiewicz/go-flow) - Control goroutines execution order. +* [goworker](https://github.com/benmanns/goworker) - goworker is a Go-based background worker * [grpool](https://github.com/ivpusic/grpool) - Lightweight Goroutine pool. -* [pool](https://github.com/go-playground/pool) - Go consumer goroutine pool for easy goroutine handling + time saving. +* [pool](https://github.com/go-playground/pool) - a limited consumer goroutine or unlimited goroutine pool for easier goroutine handling and cancellation. * [tunny](https://github.com/Jeffail/tunny) - A goroutine pool for golang. @@ -446,6 +492,7 @@ Please take a quick gander at the [contribution guidelines](https://github.com/a * [goqt](https://github.com/visualfc/goqt) - Golang bindings to the Qt cross-platform application framework. * [gosx-notifier](https://github.com/deckarep/gosx-notifier) - OSX Desktop Notifications library for Go. * [gotk3](https://github.com/gotk3/gotk3) - Go bindings for GTK3. +* [qt](https://github.com/therecipe/qt) - Qt binding for Go (support for Windows / macOS / Linux / Android / iOS / Sailfish OS / Raspberry Pi) * [sciter](https://github.com/oskca/sciter) - Go bindings for Sciter: the Embeddable HTML/CSS/script engine for modern desktop UI development. * [systray](https://github.com/getlantern/systray) - Cross platform Go library to place an icon and menu in the notification area * [trayhost](https://github.com/shurcooL/trayhost) - Cross-platform Go library to place an icon in the host operating system's taskbar. @@ -463,23 +510,27 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries for manipulating images.* -* [bimg](https://github.com/h2non/bimg) - Small package for fast and efficient image processing using libvips +* [bild](https://github.com/anthonynsimon/bild) - A collection of image processing algorithms in pure Go. +* [bimg](https://github.com/h2non/bimg) - Small package for fast and efficient image processing using libvips. * [geopattern](https://github.com/pravj/geopattern) - Create beautiful generative image patterns from a string. +* [gg](https://github.com/fogleman/gg) - 2D rendering in pure Go. * [gift](https://github.com/disintegration/gift) - Package of image processing filters. * [go-cairo](https://github.com/ungerik/go-cairo) - Go binding for the cairo graphics library. -* [go-gd](https://github.com/bolknote/go-gd) - Go binding for GD library +* [go-gd](https://github.com/bolknote/go-gd) - Go binding for GD library. * [go-nude](https://github.com/koyachi/go-nude) - Nudity detection with Go. * [go-opencv](https://github.com/lazywei/go-opencv) - Go bindings for OpenCV. * [go-webcolors](https://github.com/jyotiska/go-webcolors) - Port of webcolors library from Python to Go. * [imagick](https://github.com/gographics/imagick) - Go binding to ImageMagick's MagickWand C API. -* [imaginary](https://github.com/h2non/imaginary) - Fast and simple HTTP microservice for image resizing +* [imaginary](https://github.com/h2non/imaginary) - Fast and simple HTTP microservice for image resizing. * [imaging](https://github.com/disintegration/imaging) - Simple Go image processing package. * [img](https://github.com/hawx/img) - A selection of image manipulation tools. +* [ln](https://github.com/fogleman/ln) - 3D line art rendering in Go. * [mpo](https://github.com/donatj/mpo) - A decoder and conversion tool for MPO 3D Photos. -* [picfit](https://github.com/thoas/picfit) - An image resizing server written in Go +* [picfit](https://github.com/thoas/picfit) - An image resizing server written in Go. +* [pt](https://github.com/fogleman/pt) - A path tracing engine written in Go. * [resize](https://github.com/nfnt/resize) - Image resizing for the Go with common interpolation methods. * [rez](https://github.com/bamiaux/rez) - Image resizing in pure Go and SIMD. -* [smartcrop](https://github.com/muesli/smartcrop) - Finds good crops for arbitrary images and crop sizes +* [smartcrop](https://github.com/muesli/smartcrop) - Finds good crops for arbitrary images and crop sizes. * [svgo](https://github.com/ajstarks/svgo) - Go Language Library for SVG generation. * [tga](https://github.com/ftrvxmtrx/tga) - Package tga is a TARGA image format decoder/encoder. @@ -492,6 +543,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [go-log](https://github.com/ian-kent/go-log) - A log4j implementation in Go. * [go-logger](https://github.com/apsdehal/go-logger) - Simple logger of Go Programs, with level handlers. * [gologger](https://github.com/sadlil/gologger) - Simple easy to use log lib for go, logs in Colored Cosole, Simple Console, File or Elasticsearch. +* [gone/log](https://github.com/One-com/gone/tree/master/log#readme) - Fast, extendable, full-featured, std-lib source compatible log library. * [log](https://github.com/apex/log) - Structured logging package for Go. * [log](https://github.com/go-playground/log) - Simple, configurable and scalable Structured Logging for Go. * [log-voyage](https://github.com/firstrow/logvoyage) - Full-featured logging saas written in golang. @@ -511,6 +563,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [stdlog](https://github.com/alexcesaro/log) - Stdlog is an object-oriented library providing leveled logging. It is very useful for cron jobs. * [tail](https://github.com/hpcloud/tail) - A Go package striving to emulate the features of the BSD tail program. * [xlog](https://github.com/rs/xlog) - A structured logger for `net/context` aware HTTP handlers with flexible dispatching. +* [zap](https://github.com/uber-go/zap) - Fast, structured, leveled logging in Go. ## Machine Learning @@ -529,6 +582,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [golinear](https://github.com/danieldk/golinear) - liblinear bindings for Go * [goml](https://github.com/cdipaolo/goml) - On-line Machine Learning in Go * [goRecommend](https://github.com/timkaye11/goRecommend) - Recommendation Algorithms library written in Go. +* [gorgonia](https://github.com/chewxy/gorgonia) - graph-based computational library like Theano for Go that provides primitives for building various machine learning and neural network algorithms. * [libsvm](https://github.com/datastream/libsvm) - libsvm golang version derived work based on LIBSVM 3.14. * [mlgo](https://github.com/NullHypothesis/mlgo) - This project aims to provide minimalistic machine learning algorithms in Go. * [neural-go](https://github.com/schuyler/neural-go) - A multilayer perceptron network implemented in Go, with training via backpropagation. @@ -550,11 +604,13 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [go-nsq](https://github.com/nsqio/go-nsq) - the official Go package for NSQ * [gopush-cluster](https://github.com/Terry-Mao/gopush-cluster) - gopush-cluster is a go push server cluster. * [gorush](https://github.com/appleboy/gorush) - A push notification server using [APNs2](https://github.com/sideshow/apns2) and google [GCM](https://github.com/google/go-gcm). +* [guble](https://github.com/smancke/guble) - A messaging server using push notifications (Google Firebase Cloud Messaging, Apple Push Notification services, SMS) as well as websockets, a REST API, featuring distributed operation and message-persistence. * [machinery](https://github.com/RichardKnop/machinery) - An asynchronous task queue/job queue based on distributed message passing. * [mangos](https://github.com/go-mangos/mangos) - Pure go implementation of the Nanomsg ("Scalable Protocols") with transport interoperability. -* [NATS](https://github.com/nats-io/nats) - A lightweight and highly performant publish-subscribe and distributed queueing messaging system. +* [NATS Go Client](https://github.com/nats-io/nats) - A lightweight and high performance publish-subscribe and distributed queueing messaging system - this is the Go library. * [oplog](https://github.com/dailymotion/oplog) - A generic oplog/replication system for REST APIs * [pubsub](https://github.com/tuxychandru/pubsub) - A simple pubsub package for go. +* [RapidMQ](https://github.com/sybrexsys/RapidMQ) - RapidMQ is a lightweight and reliable library for managing of the local messages queue * [sarama](https://github.com/Shopify/sarama) - A Go library for Apache Kafka. * [Uniqush-Push](https://github.com/uniqush/uniqush-push) - A redis backed unified push service for server-side notifications to mobile devices. * [zmq4](https://github.com/pebbe/zmq4) - A Go interface to ZeroMQ version 4. Also available for [version 3](https://github.com/pebbe/zmq3) and [version 2](https://github.com/pebbe/zmq2). @@ -568,19 +624,28 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [archiver](https://github.com/mholt/archiver) - Library and command for making and extracting .zip and .tar.gz archives * [autoflags](https://github.com/artyom/autoflags) - Go package to automatically define command line flags from struct fields. * [banner](https://github.com/dimiro1/banner) - Add beautiful banners into your Go applications. +* [battery](https://github.com/distatus/battery) - A cross-platform, normalized battery information library. +* [bitio](https://github.com/icza/bitio) - Highly optimized bit-level Reader and Writer for Go. * [browscap_go](https://github.com/digitalcrab/browscap_go) - GoLang Library for [Browser Capabilities Project](http://browscap.org/). +* [conv](https://github.com/cstockton/go-conv) - Package conv provides fast and intuitive conversions across Go types. * [datacounter](https://github.com/miolini/datacounter) - Go counters for readers/writer/http.ResponseWriter. +* [errors](https://github.com/pkg/errors) - A package that provides simple error handling primitives. * [go-chat-bot](https://github.com/go-chat-bot/bot) - IRC, Slack & Telegram bot written in Go. * [go-commons-pool](https://github.com/jolestar/go-commons-pool) - A generic object pool for Golang. * [go-multierror](https://github.com/hashicorp/go-multierror) - A Go (golang) package for representing a list of errors as a single error. +* [go-openapi](https://github.com/go-openapi) - A collection of packages to parse and utilize open-api schemas * [go-shortid](https://github.com/ventu-io/go-shortid) - Distributed generation of super short, unique, non-sequential, URL friendly IDs. +* [go.uuid](https://github.com/satori/go.uuid) - Implementation of Universally Unique Identifier (UUID). Supported both creation and parsing of UUIDs. * [gopsutil](https://github.com/shirou/gopsutil) - A cross-platform library for retrieving process and system utilization(CPU, Memory, Disks, etc). * [gosms](https://github.com/haxpax/gosms) - Your own local SMS gateway in Go that can be used to send SMS * [gountries](https://github.com/pariz/gountries) - A package that exposes country and subdivision data. +* [hanu](https://github.com/sbstjn/hanu) - Framework for writing Slack bots. * [health](https://github.com/dimiro1/health) - A Easy to use, extensible health check library. +* [indigo](https://github.com/osamingo/indigo) - A distributed unique ID generator of using Sonyflake and encoded by Base58. * [jobs](https://github.com/albrow/jobs) - A persistent and flexible background jobs library. * [margelet](https://github.com/zhulik/margelet) - A framework for building Telegram bots. * [notify](https://github.com/rjeczalik/notify) - File system event notification library with simple API, similar to os/signal. +* [secdl](https://github.com/xor-gate/secdl) - Lighttpd ModSecDownload algorithm ported to go to secure download urls. * [stats](https://github.com/go-playground/stats) - Monitors Go MemStats + System stats such as Memory, Swap and CPU and sends via UDP anywhere you want for logging etc... * [werr](https://github.com/txgruppi/werr) - Error Wrapper creates an wrapper for the error type in Go which captures the File, Line and Stack of where it was called. * [xkg](https://github.com/go-xkg/xkg) - X Keyboard Grabber @@ -593,8 +658,10 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [dpar](https://github.com/danieldk/dpar/) - Transition-based statistical dependency parser. * [go-eco](https://github.com/ThePaw/go-eco) - Similarity, dissimilarity and distance matrices; diversity, equitability and inequality measures; species richness estimators; coenocline models. * [go-i18n](https://github.com/nicksnyder/go-i18n/) - A package and an accompanying tool to work with localized text. +* [go-mystem](https://github.com/dveselov/mystem) - CGo bindings to Yandex.Mystem - russian morphology analyzer. * [go-nlp](https://github.com/nuance/go-nlp) - Utilities for working with discrete probability distributions and other tools useful for doing NLP work. * [go-stem](https://github.com/agonopol/go-stem) - Implementation of the porter stemming algorithm. +* [go-unidecode](https://github.com/mozillazg/go-unidecode) - ASCII transliterations of Unicode text. * [go2vec](https://github.com/danieldk/go2vec) - Reader and utility functions for word2vec embeddings. * [gojieba](https://github.com/yanyiwu/gojieba) - This is a Go implementation of [jieba](https://github.com/fxsjy/jieba) which a Chinese word splitting algorithm. * [golibstemmer](https://github.com/rjohnsondev/golibstemmer) - Go bindings for the snowball libstemmer library including porter 2 @@ -626,6 +693,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [ftp](https://github.com/jlaffaye/ftp) - Package ftp implements a FTP client as described in [RFC 959](http://tools.ietf.org/html/rfc959). * [go-getter](https://github.com/hashicorp/go-getter) - A Go library for downloading files or directories from various sources using a URL. * [go-stun](https://github.com/ccding/go-stun) - A go implementation of the STUN client (RFC 3489 and RFC 5389). +* [gobgp](https://github.com/osrg/gobgp) - BGP implemented in the Go Programming Language. * [golibwireshark](https://github.com/sunwxg/golibwireshark) - Package golibwireshark use libwireshark library to decode pcap file and analyse dissection data. * [gopacket](https://github.com/google/gopacket) - A Go library for packet processing with libpcap bindings * [gopcap](https://github.com/akrennmair/gopcap) - A Go wrapper for libpcap @@ -634,6 +702,10 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [gotcp](https://github.com/gansidui/gotcp) - A Go package for quickly writing tcp applications * [grab](https://github.com/cavaliercoder/grab) - Go package for managing file downloads * [graval](https://github.com/koofr/graval) - An experimental FTP server framework. +* [jazigo](https://github.com/udhos/jazigo) - Jazigo is a tool written in Go for retrieving configuration for multiple network devices. +* [kcp-go](https://github.com/xtaci/kcp-go) - KCP - A Fast and Reliable ARQ Protocol. +* [kcptun](https://github.com/xtaci/kcptun) - An extremely simple & fast udp tunnel based on KCP protocol +* [lhttp](https://github.com/fanux/lhttp) - A powerful websocket framework, build your IM server more easily. * [linkio](https://github.com/ian-kent/linkio) - Network link speed simulation for Reader/Writer interfaces * [llb](https://github.com/kirillDanshin/llb) - It's a very simple but quick backend for proxy servers. Can be useful for fast redirection to predefined domain with zero memory allocation and fast response. * [mdns](https://github.com/hashicorp/mdns) - Simple mDNS (Multicast DNS) client/server library in Golang @@ -644,7 +716,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [sslb](https://github.com/eduardonunesp/sslb) - It's a Super Simples Load Balancer, just a little project to achieve some kind of performance. * [tcp_server](https://github.com/firstrow/tcp_server) - A Go library for building tcp servers faster. * [utp](https://github.com/anacrolix/utp) - Go uTP micro transport protocol implementation. - +* [winrm](https://github.com/masterzen/winrm) - A Go WinRM client to remotely execute commands on Windows machines ## OpenGL @@ -667,12 +739,13 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [GORM](https://github.com/jinzhu/gorm) - The fantastic ORM library for Golang, aims to be developer friendly. * [gorp](https://github.com/go-gorp/gorp) - Go Relational Persistence, ORM-ish library for Go. * [QBS](https://github.com/coocood/qbs) - Stands for Query By Struct. A Go ORM. +* [reform](https://github.com/go-reform/reform) - A better ORM for Go, based on non-empty interfaces and code generation. +* [SQLBoiler](https://github.com/vattle/sqlboiler) - An ORM generator. Generate a featureful and blazing-fast ORM tailored to your database schema. * [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. * [upper.io/db](https://github.com/upper/db) - Single interface for interacting with different data sources through the use of adapters that wrap mature database drivers. * [Xorm](https://github.com/go-xorm/xorm) - Simple and powerful ORM for Go. * [Zoom](https://github.com/albrow/zoom) - A blazing-fast datastore and querying engine built on Redis. - ## Package Management *Libraries for package and dependency management.* @@ -683,22 +756,27 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [gom](https://github.com/mattn/gom) - Go Manager - bundle for go. * [goop](https://github.com/nitrous-io/goop) - A simple dependency manager for Go (golang), inspired by Bundler. * [gopm](https://github.com/gpmgo/gopm) - Go Package Manager +* [govendor](https://github.com/kardianos/govendor) - Go Package Manager. Go vendor tool that works with the standard vendor file. * [gpm](https://github.com/pote/gpm) - Barebones dependency manager for Go. +* [gvt](https://github.com/FiloSottile/gvt) - `gvt` is a simple vendoring tool made for Go native vendoring (aka GO15VENDOREXPERIMENT), based on gb-vendor. * [johnny-deps](https://github.com/VividCortex/johnny-deps) - Minimal dependency version using Git * [nut](https://github.com/jingweno/nut) - Vendor Go dependencies * [VenGO](https://github.com/DamnWidget/VenGO) - create and manage exportable isolated go virtual environments + + ## Query Language * [graphql](https://github.com/tmc/graphql) - graphql parser + utilities. * [graphql](https://github.com/sevki/graphql) - GraphQL implementation in go. -* [graphql-go](https://github.com/chris-ramon/graphql-go) - An implementation of GraphQL for Go. +* [graphql-go](https://github.com/graphql-go/graphql) - An implementation of GraphQL for Go. * [jsonql](https://github.com/elgs/jsonql) - JSON query expression library in Golang. ## Resource Embedding +* [esc](https://github.com/mjibson/esc) - Embeds files into Go programs and provides http.FileSystem interfaces to them. * [fileb0x](https://github.com/UnnoTed/fileb0x) - Simple tool to embed files in go with focus on "customization" and ease to use. * [go-bindata](https://github.com/jteeuwen/go-bindata) - Package that converts any file into managable Go source code. * [go-embed](https://github.com/pyros2097/go-embed) - Generates go code to embed resource files into your library or executable @@ -729,7 +807,9 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [goraph](https://github.com/gyuho/goraph) - A pure Go graph theory library(data structure, algorith visualization) * [gostat](https://github.com/ematvey/gostat) - A statistics library for the go language * [mudlark-go](https://github.com/pwil3058/mudlark-go-pkgs) - A collection of packages providing (hopefully) useful code for use in software using Google's Go programming language. +* [ode](https://github.com/ChristopherRabotin/ode) - An ordinary differential equation (ODE) solver which supports extended states and channel-based iteration stop conditions. * [pagerank](https://github.com/alixaxel/pagerank) - Weighted PageRank algorithm implemented in Go +* [PiHex](https://github.com/claygod/PiHex) - Implementation of the "Bailey-Borwein-Plouffe" algorithm for the hexadecimal number Pi * [stats](https://github.com/montanaflynn/stats) - A statistics package with common functions missing from the Golang standard library. * [streamtools](https://github.com/nytlabs/streamtools) - general purpose, graphical tool for dealing with streams of data. * [vectormath](https://github.com/spate/vectormath) - Vectormath for Go, an adaptation of the scalar C functions from Sony's Vector Math library, as found in the Bullet-2.79 source code. (currently inactive) @@ -751,6 +831,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries and tools for binary serialization* * [asn1](https://github.com/PromonLogicalis/asn1) - Asn.1 BER and DER encoding library for golang +* [colfer](https://github.com/pascaldekloe/colfer) - Code generation for the Colfer binary format * [go-capnproto](https://github.com/glycerine/go-capnproto) - Cap'n Proto library and parser for go * [bambam](https://github.com/glycerine/bambam) - generator for Cap'n Proto schemas from go. * [go-codec](https://github.com/ugorji/go) - High Performance, feature-Rich, idiomatic encode, decode and rpc library for msgpack, cbor and json, with runtime-based OR code-generation support @@ -783,6 +864,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [ego](https://github.com/benbjohnson/ego) - A lightweight templating language that lets you write templates in Go. Templates are translated into Go and compiled. * [fasttemplate](https://github.com/valyala/fasttemplate) - Simple and fast template engine. Substitutes template placeholders up to 10x faster than [text/template](http://golang.org/pkg/text/template/). * [gofpdf](https://github.com/jung-kurt/gofpdf) - A PDF document generator with high level support for text, drawing and images. +* [jet](https://github.com/CloudyKit/jet) - Jet template engine * [kasia.go](https://github.com/ziutek/kasia.go) - Templating system for HTML and other text documents - go implementation. * [mustache](https://github.com/hoisie/mustache) - A Go implementation of the Mustache template language. * [pongo2](https://github.com/flosch/pongo2) - A Django-like template-engine for Go. @@ -798,9 +880,10 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * Testing Frameworks * [assert](https://github.com/go-playground/assert) - Basic Assertion Library used along side native go testing, with building blocks for custom assertions - * [assert](https://github.com/bmizerany/assert) - Asserts to Go testing * [badio](https://github.com/cavaliercoder/badio) - Extensions to Go's `testing/iotest` package + * [baloo](https://github.com/h2non/baloo) - Expressive and versatile end-to-end HTTP API testing made easy. * [bro](https://github.com/marioidival/bro) - Watch files in directory and run tests for them + * [dsunit](https://github.com/viant/dsunit) - Datastore testing for SQL, NoSQL, structured files. * [frisby](https://github.com/verdverm/frisby) - a REST API testing framework * [ginkgo](http://onsi.github.io/ginkgo/) - BDD Testing Framework for Go * [go-carpet](https://github.com/msoap/go-carpet) - Tool for viewing test coverage in terminal @@ -814,7 +897,9 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [gomega](http://onsi.github.io/gomega/) - Rspec like matcher/assertion library. * [GoSpec](https://github.com/orfjackal/gospec) - BDD-style testing framework for the Go programming language. * [gospecify](https://github.com/stesla/gospecify) - This provides a BDD syntax for testing your Go code. It should be familiar to anybody who has used libraries such as rspec. + * [gosuite](https://github.com/pavlo/gosuite) - Brings lightweight test suites with setup/teardown facilities to `testing` by leveraging Go1.7's Subtests * [Hamcrest](https://github.com/rdrdr/hamcrest) - fluent framework for declarative Matcher objects that, when applied to input values, produce self-describing results. + * [httpexpect](https://github.com/gavv/httpexpect) - Concise, declarative, and easy to use end-to-end HTTP and REST API testing * [restit](https://github.com/yookoala/restit) - A Go micro framework to help writing RESTful API integration test. * [testfixtures](https://github.com/go-testfixtures/testfixtures) - A helper for Rails' like test fixtures to test database applications. * [Testify](https://github.com/stretchr/testify) - A sacred extension to the standard go testing package. @@ -825,12 +910,12 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [go-txdb](https://github.com/DATA-DOG/go-txdb) - Single transaction based database driver mainly for testing purposes. * [gock](https://github.com/h2non/gock) - Versatile HTTP mocking made easy. * [gomock](https://github.com/golang/mock) - Mocking framework for the Go programming language. + * [govcr](https://github.com/seborama/govcr) - HTTP mock for Golang: record and replay HTTP interactions for offline testing * [mockhttp](https://github.com/tv42/mockhttp) - Mock object for Go http.ResponseWriter * Fuzzing and delta-debugging/reducing/shrinking * [go-fuzz](https://github.com/dvyukov/go-fuzz) - A randomized testing system * [gofuzz](https://github.com/google/gofuzz) - A library for populating go objects with random values - * [gogenerate](https://github.com/arschles/gogenerate) - A Scalacheck-like library for Go * [Tavor](https://github.com/zimmski/tavor) - A generic fuzzing and delta-debugging framework ## Text Processing @@ -838,9 +923,12 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries for parsing and manipulating texts.* * Specific Formats + * [allot](https://github.com/sbstjn/allot) - Placeholder and wildcard text parsing for CLI tools and bots + * [bbConvert](https://github.com/CalebQ42/bbConvert) - Converts bbCode to HTML that allows you to add support for custom bbCode tags * [blackfriday](https://github.com/russross/blackfriday) - Markdown processor in Go * [github_flavored_markdown](https://godoc.org/github.com/shurcooL/github_flavored_markdown) - GitHub Flavored Markdown renderer with fenced code block highlighting, clickable header anchor links. * [bluemonday](https://github.com/microcosm-cc/bluemonday) - HTML Sanitizer + * [editorconfig-core-go](https://github.com/editorconfig/editorconfig-core-go) - Editorconfig file parser and manipulator for Go * [enca](https://github.com/endeveit/enca) - Minimal cgo bindings for [libenca](http://cihar.com/software/enca/). * [genex](https://github.com/alixaxel/genex) - Count and expand Regular Expressions into all matching Strings * [go-humanize](https://github.com/dustin/go-humanize) - Formatters for time, numbers, and memory size to human readable format. @@ -848,14 +936,18 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [go-pkg-rss](https://github.com/jteeuwen/go-pkg-rss) - This package reads RSS and Atom feeds and provides a caching mechanism that adheres to the feed specs. * [go-pkg-xmlx](https://github.com/jteeuwen/go-pkg-xmlx) - Extension to the standard Go XML package. Maintains a node tree that allows forward/backwards browsing and exposes some simple single/multi-node search functions. * [go-runewidth](https://github.com/mattn/go-runewidth) - Functions to get fixed width of the character or string. + * [go-slugify](https://github.com/mozillazg/go-slugify) - Make pretty slug with multiple languages support. * [gofeed](https://github.com/mmcdole/gofeed) - Parse RSS and Atom feeds in Go * [gographviz](https://github.com/awalterschulze/gographviz) - Parses the Graphviz DOT language. * [gommon/bytes](https://github.com/labstack/gommon/tree/master/bytes) - Format bytes to string. * [gonameparts](https://github.com/polera/gonameparts) - Parses human names into individual name parts * [GoQuery](https://github.com/PuerkitoBio/goquery) - GoQuery brings a syntax and a set of features similar to jQuery to the Go language. * [goregen](https://github.com/zach-klippenstein/goregen) - A library for generating random strings from regular expressions. + * [gotext](https://github.com/leonelquinteros/gotext) - GNU gettext utilities for Go. * [guesslanguage](https://github.com/endeveit/guesslanguage) - Functions to determine the natural language of a unicode text. + * [inject](https://github.com/facebookgo/inject) - Package inject provides a reflect based injector. * [mxj](https://github.com/clbanning/mxj) - Encode / decode XML as JSON or map[string]interface{}; extract values with dot-notation paths and wildcards. Replaces x2j and j2x packages. + * [sh](https://github.com/mvdan/sh) - A shell parser and formatter * [slug](https://github.com/gosimple/slug) - URL-friendly slugify with multiple languages support. * [Slugify](https://github.com/avelino/slugify) - A Go slugify application that handles string. * [toml](https://github.com/BurntSushi/toml) - TOML configuration format (encoder/decoder with reflection). @@ -871,33 +963,40 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries for accessing third party APIs.* +* [amazon-product-advertising-api](https://github.com/ngs/go-amazon-product-advertising-api) - Go Client Library for [Amazon Product Advertising API](https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html) * [anaconda](https://github.com/ChimeraCoder/anaconda) - A Go client library for the Twitter 1.1 API * [aws-sdk-go](https://github.com/aws/aws-sdk-go) - The official AWS SDK for the Go programming language. * [brewerydb](https://github.com/naegelejd/brewerydb) - Go library for accessing the BreweryDB API. +* [cachet](https://github.com/andygrunwald/cachet) - Go client library for [Cachet (open source status page system)](https://cachethq.io/) +* [circleci](https://github.com/jszwedko/go-circleci) - A Go client library for interacting with CircleCI's API * [clarifai](https://github.com/samuelcouch/clarifai) - A Go client library for interfacing with the Clarifai API. * [discordgo](https://github.com/bwmarrin/discordgo) - Go bindings for the Discord Chat API * [facebook](https://github.com/huandu/facebook) - Go Library that supports the Facebook Graph API * [gads](https://github.com/emiddleton/gads) - Google Adwords Unofficial API * [gami](https://github.com/bit4bit/gami) - Go library for Asterisk Manager Interface. * [gcm](https://github.com/Aorioli/gcm) - Go library for Google Cloud Messaging -* [geo-golang](https://github.com/codingsince1985/geo-golang) - Go Library to access [Google Maps](https://developers.google.com/maps/documentation/geocoding/intro), [MapQuest](http://open.mapquestapi.com/geocoding/), [Nominatim](http://open.mapquestapi.com/nominatim/), [OpenCage](http://geocoder.opencagedata.com/api.html), [HERE](https://developer.here.com/rest-apis/documentation/geocoder), [Bing](https://msdn.microsoft.com/en-us/library/ff701715.aspx), and [Mapbox](https://www.mapbox.com/developers/api/geocoding/) geocoding / reverse geocoding APIs. +* [geo-golang](https://github.com/codingsince1985/geo-golang) - Go Library to access [Google Maps](https://developers.google.com/maps/documentation/geocoding/intro), [MapQuest](http://open.mapquestapi.com/geocoding/), [Nominatim](http://open.mapquestapi.com/nominatim/), [OpenCage](http://geocoder.opencagedata.com/api.html), [HERE](https://developer.here.com/rest-apis/documentation/geocoder), [Bing](https://msdn.microsoft.com/en-us/library/ff701715.aspx), [Mapbox](https://www.mapbox.com/developers/api/geocoding/), and [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Nominatim) geocoding / reverse geocoding APIs. * [ghost](https://github.com/neuegram/ghost) - Go Library for accessing the Snapchat API. * [github](https://github.com/google/go-github) - Go library for accessing the GitHub API. +* [go-imgur](https://github.com/koffeinsource/go-imgur) - Go client library for [imgur](https://imgur.com) * [go-jira](https://github.com/andygrunwald/go-jira) - Go client library for [Atlassian JIRA](https://www.atlassian.com/software/jira) * [go-marathon](https://github.com/gambol99/go-marathon) - A Go library for interacting with Mesosphere's Marathon PAAS. * [go-trending](https://github.com/andygrunwald/go-trending) - Go library for accessing [trending repositories](https://github.com/trending) and [developers](https://github.com/trending/developers) at Github. * [go-twitter](https://github.com/dghubble/go-twitter) - Go client library for the Twitter v1.1 APIs. * [go-xkcd](https://github.com/nishanths/go-xkcd) - Go client for the xkcd API. * [goamz](https://github.com/mitchellh/goamz) - Popular fork of [goamz](https://launchpad.net/goamz) which adds some missing API calls to certain packages. +* [golyrics](https://github.com/mamal72/golyrics) - Golyrics is a Go library to fetch music lyrics data from the Wikia website. * [GoMusicBrainz](https://github.com/michiwend/gomusicbrainz) - a Go MusicBrainz WS2 client library. * [google](https://github.com/google/google-api-go-client) - Auto-generated Google APIs for Go. * [google-analytics](https://github.com/chonthu/go-google-analytics) - A simple wrapper for easy google analytics reporting. * [google-cloud](https://github.com/GoogleCloudPlatform/gcloud-golang) - Google Cloud APIs Go Client Library. +* [google-email-audit-api](https://github.com/ngs/go-google-email-audit-api) - Go client library for [Google G Suite Email Audit API](https://developers.google.com/admin-sdk/email-audit/). * [gostorm](https://github.com/jsgilmore/gostorm) - GoStorm is a Go library that implements the communications protocol required to write Storm spouts and Bolts in Go that communicate with the Storm shells. * [hipchat](https://github.com/andybons/hipchat) - This project implements a golang client library for the Hipchat API. * [hipchat (xmpp)](https://github.com/daneharrigan/hipchat) - A golang package to communicate with HipChat over XMPP. * [Medium](https://github.com/Medium/medium-sdk-go) - A Golang SDK for Medium's OAuth2 API. * [megos](https://github.com/andygrunwald/megos) - A client library for accessing an [Apache Mesos](http://mesos.apache.org/) cluster +* [micha](https://github.com/onrik/micha) - Go Library for Telegram bot api. * [minio-go](https://github.com/minio/minio-go) - Minio Go Library for Amazon S3 compatible cloud storage. * [mixpanel](https://github.com/dukex/mixpanel) - Mixpanel is a library for tracking events and sending Mixpanel profile updates to Mixpanel from your go applications. * [paypal](https://github.com/logpacker/paypalsdk) - Wrapper for PayPal payment API @@ -916,7 +1015,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [TheMovieDb](https://github.com/jbrodriguez/go-tmdb) - A simple golang package to communicate with [themoviedb.org](https://themoviedb.org) * [translate](https://github.com/poorny/translate) - Go online translation package. * [tumblr](https://github.com/mattcunningham/gumblr) - Go wrapper for the Tumblr v2 API. -* [webhooks](https://github.com/go-playground/webhooks) - Webhook reciever for GitHub and Bitbucket. +* [webhooks](https://github.com/go-playground/webhooks) - Webhook receiver for GitHub and Bitbucket. ## Utilities @@ -930,16 +1029,20 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [Death](https://github.com/vrecan/death) - Managing go application shutdown with signals. * [Deepcopier](https://github.com/ulule/deepcopier) - Simple struct copying for Go. * [delve](https://github.com/derekparker/delve) - Go debugger. +* [dlog](https://github.com/kirillDanshin/dlog) - Compile-time controlled logger to make your release smaller without removing debug calls. * [fastlz](https://github.com/digitalcrab/fastlz) - Wrap over [FastLz](http://fastlz.org/) (free, open-source, portable real-time compression library) for GoLang. * [filetype](https://github.com/h2non/filetype) - Small package to infer the file type checking the magic numbers signature. * [fzf](https://github.com/junegunn/fzf) - A command-line fuzzy finder written in Go * [generate](https://github.com/go-playground/generate) - runs go generate recursively on a specified path or environment variable and can filter by regex. * [gentleman](https://github.com/h2non/gentleman) - Full-featured plugin-driven HTTP client library. +* [git-time-metric](https://github.com/git-time-metric/gtm) - Simple, seamless, lightweight time tracking for Git +* [go-bind-plugin](https://github.com/wendigo/go-bind-plugin) - go:generate tool for wrapping symbols exported by golang plugins (1.8 only) * [go-cron](https://github.com/rk/go-cron) - A simple Cron library for go that can execute closures or functions at varying intervals, from once a second to once a year on a specific date and time. Primarily for web applications and long running daemons. * [go-debug](https://github.com/tj/go-debug) - Conditional debug logging for Golang libraries & applications. * [go-dry](https://github.com/ungerik/go-dry) - DRY (don't repeat yourself) package for Go. * [go-rate](https://github.com/beefsack/go-rate) - A timed rate limiter for Go. * [go-sitemap-generator](https://github.com/ikeikeikeike/go-sitemap-generator) - XML Sitemap generator written in Go. +* [go-torch](https://github.com/uber/go-torch) - Stochastic flame graph profiler for Go programs. * [go-trigger](https://github.com/sadlil/go-trigger) - Go-lang global event triggerer, Register Events with an id and trigger the event from anywhere from your project. * [go-underscore](https://github.com/tobyhede/go-underscore) - A useful collection of helpfully functional Go collection utilities. * [goback](https://github.com/carlescere/goback) - Go simple exponential backoff package. @@ -961,11 +1064,14 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [httpcontrol](https://github.com/facebookgo/httpcontrol) - Package httpcontrol allows for HTTP transport level control around timeouts and retries. * [hystrix-go](https://github.com/afex/hystrix-go) - Implements Hystrix patterns of programmer-defined fallbacks aka circuit breaker. * [JobRunner](https://github.com/bamzi/jobrunner) - Smart and featureful cron job scheduler with job queuing and live monitoring built in. +* [jsonapi-errors](https://github.com/AmuzaTkts/jsonapi-errors) - Go bindings based on the JSON API errors reference. * [jsonf](https://github.com/miolini/jsonf) - Console tool for highlighted formatting and struct query fetching JSON. * [jsongo](https://github.com/ricardolonga/jsongo) - Fluent API to make it easier to create Json objects. +* [kazaam](https://github.com/Qntfy/kazaam) - API for arbitrary transformation of JSON documents. * [lrserver](https://github.com/jaschaephraim/lrserver) - LiveReload server for Go * [mc](https://github.com/minio/mc) - Minio Client provides minimal tools to work with Amazon S3 compatible cloud storage and filesystems. * [mergo](https://github.com/imdario/mergo) - A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. +* [minify](https://github.com/tdewolff/minify) - Fast minifiers for HTML, CSS, JS, XML, JSON and SVG file formats. * [moldova](https://github.com/StabbyCutyou/moldova) - A utility for generating random data based on an input template. * [mp](https://github.com/sanbornm/mp) - A simple cli email parser. It currently takes stdin and outputs JSON. * [multitick](https://github.com/VividCortex/multitick) - Multiplexor for aligned tickers. @@ -977,7 +1083,9 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [pester](https://github.com/sethgrid/pester) - Go HTTP client calls with retries, backoff, and concurrency. * [pm](https://github.com/VividCortex/pm) - Process (i.e. goroutine) manager with an HTTP API. * [profile](https://github.com/davecheney/profile) - Simple profiling support package for Go. +* [realize](https://github.com/tockins/realize) - Go build system with file watchers and live reload. Run, build and watch file changes with custom paths. * [request](https://github.com/mozillazg/request) - Go HTTP Requests for Humans™. +* [rerate](https://github.com/abo/rerate) - Redis-based rate counter and rate limiter for Go. * [rerun](https://github.com/ivpusic/rerun) - Recompiling and rerunning go apps when source changes. * [resty](https://github.com/go-resty/resty) - Simple HTTP and REST client for Go inspired by Ruby rest-client. * [robustly](https://github.com/VividCortex/robustly) - Runs functions resiliently, catching and restarting panics. @@ -985,7 +1093,9 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [sling](https://github.com/dghubble/sling) - Go HTTP requests builder for API clients. * [spinner](https://github.com/briandowns/spinner) - Go package to easily provide a terminal spinner with options. * [sqlx](https://github.com/jmoiron/sqlx) - provides a set of extensions on top of the excellent built-in database/sql package. +* [toolbox](https://github.com/viant/toolbox) - Slice, map, multimap, struct, function, data conversion utilities. Service router, macro evaluator, tokenizer. * [ugo](https://github.com/alxrm/ugo) - ugo is slice toolbox with concise syntax for Go. +* [xferspdy](https://github.com/monmohan/xferspdy) - Xferspdy provides binary diff and patch library in golang * [xlsx](https://github.com/tealeg/xlsx) - Library to simplify reading the XML format used by recent version of Microsoft Excel in Go programs. @@ -994,6 +1104,7 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries for validation.* * [govalidator](https://github.com/asaskevich/govalidator) - Validators and sanitizers for strings, numerics, slices and structs. +* [ozzo-validation](https://github.com/go-ozzo/ozzo-validation) - Supports validation of various data types (structs, strings, maps, slices, etc.) with configurable and extensible validation rules specified in usual code constructs instead of struct tags. * [validator](https://github.com/go-playground/validator) - Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving. @@ -1011,20 +1122,26 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis *Libraries for manipulating video.* -* [aac/h264](https://github.com/nareix/codec) - Golang aac/h264 encoder and decoder. * [gmf](https://github.com/3d0c/gmf) - Go bindings for FFmpeg av\* libraries. * [goav](https://github.com/giorgisio/goav) - Comphrensive Go bindings for FFmpeg. * [gst](https://github.com/ziutek/gst) - Go bindings for GStreamer. +* [v4l](https://github.com/korandiz/v4l) - A video capture library for Linux, written in Go. ## Web Frameworks *Full stack web frameworks.* +* [alien](https://github.com/gernest/alien) - A lightweight and fast http router from outer space * [Beego](https://github.com/astaxie/beego) - beego is an open-source, high-performance web framework for the Go programming language. * [Bone](https://github.com/go-zoo/bone) - Lightning Fast HTTP Multiplexer. +* [Bxog](https://github.com/claygod/Bxog) - Simple and fast HTTP router for Go. It works with routes of varying difficulty, length and nesting. And he knows how to create a URL from the received parameters. * [chi](https://github.com/pressly/chi) - Small, fast and expressive HTTP router built on net/context. -* [Echo](https://github.com/labstack/echo) - A fast and unfancy micro web framework for Go. +* [Echo](https://github.com/labstack/echo) - High performance, minimalist Go web framework. +* [fasthttprouter](https://github.com/buaazp/fasthttprouter) - A high performance router forked from `httprouter`. The first router fit for `fasthttp`. +* [Fireball](https://github.com/zpatrick/fireball) - A more "natural" feeling web framework. +* [Florest](https://github.com/jabong/florest-core) - High-performance workflow based REST API framework +* [Gem](https://github.com/go-gem/gem) - A simple and fast web framework, friendly to REST API. * [Gin](https://github.com/gin-gonic/gin) - Gin is a web framework written in Go! It features a martini-like API with much better performance, up to 40 times faster. If you need performance and good productivity. * [Gizmo](https://github.com/NYTimes/gizmo) - Microservice toolkit used by the New York Times. * [Glue](https://github.com/desertbit/glue) - Robust Go and Javascript Socket Library (Alternative to Socket.io). @@ -1040,11 +1157,11 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [Golf](https://github.com/dinever/golf) - Golf is a fast, simple and lightweight micro-web framework for Go. It comes with powerful features and has no dependencies other than the Go Standard Library. * [golongpoll](https://github.com/jcuga/golongpoll) - HTTP longpoll server library that makes web pub-sub simple. * [Gondola](https://github.com/rainycape/gondola) - The web framework for writing faster sites, faster +* [gongular](https://github.com/mustafaakin/gongular) - A fast Go web framework with input mapping/validation and (DI) Dependency Injection * [goose](https://github.com/ian-kent/goose) - Server Sent Events in Go * [Gorilla](https://github.com/gorilla/) - Gorilla is a web toolkit for the Go programming language. * [httprouter](https://github.com/julienschmidt/httprouter) - A high performance router. Use this and the standard http handlers to form a very high performance web framework. * [httptreemux](https://github.com/dimfeld/httptreemux) - High-speed, flexible tree-based HTTP router for Go. Inspiration from httprouter. -* [Iris](https://kataras.github.io/iris) - A very minimal but flexible and high-performance golang web application framework, providing a robust set of features for building web applications. * [lars](https://github.com/go-playground/lars) - Is a lightweight, fast and extensible zero allocation HTTP router for Go used to create customizable frameworks. * [Macaron](https://github.com/go-macaron/macaron) - Macaron is a high productive and modular design web framework in Go. * [mango](https://github.com/paulbellamy/mango) - Mango is a modular web-application framework for Go, inspired by Rack, and PEP333. @@ -1054,18 +1171,21 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [ozzo-routing](https://github.com/go-ozzo/ozzo-routing) - A high-performance HTTP router and Web framework supporting routes with regular expressions. Comes with full support for quickly building a RESTful API application. * [pat](https://github.com/bmizerany/pat) - Sinatra style pattern muxer for Go’s net/http library, by the author of Sinatra. * [Resoursea](https://github.com/resoursea/api) - A REST framework for quickly writing resource based services. +* [REST Layer](http://rest-layer.io) - A framework to build REST/GraphQL API on top of databases with mostly configuration over code. * [Revel](https://github.com/revel/revel) - A high-productivity web framework for the Go language. * [rex](https://github.com/goanywhere/rex) - Rex is a library for modular development built upon gorilla/mux, fully compatible with `net/http`. * [sawsij](http://sawsij.com/) - lightweight, open-source web framework for building high-performance, data-driven web applications. +* [session](https://github.com/icza/session) - Go session management for web servers (including support for Google App Engine - GAE). * [Siesta](https://github.com/VividCortex/siesta) - Composable framework to write middleware and handlers * [tango](https://github.com/lunny/tango) - Micro & pluggable web framework for Go. * [tigertonic](https://github.com/rcrowley/go-tigertonic) - A Go framework for building JSON web services inspired by Dropwizard * [traffic](https://github.com/pilu/traffic) - Sinatra inspired regexp/pattern mux and web framework for Go. +* [utron](https://github.com/gernest/utron) - A lightweight MVC framework for Go(Golang). * [VarHandler](https://github.com/azr/generators/tree/master/varhandler) - Generate boilerplate http input and ouput handling. * [vestigo](https://github.com/husobee/vestigo) - A performant, stand-alone, HTTP compliant URL Router for go web applications. * [Volatile](https://github.com/volatile/core) - Minimalist middleware stack promoting flexibility, good practices and clean code. -* [web.go](https://github.com/hoisie/web) - A simple framework to write webapps in Go. * [xmux](https://github.com/rs/xmux) - A high performance muxer based on `httprouter` with `net/context` support. +* [YARF](https://github.com/yarf-framework/yarf) - Fast micro-framework designed to build REST APIs and web services in a fast and simple way. * [Zerver](https://github.com/cosiner/zerver) - Zerver is an expressive, modular, feature completed RESTful framework. * [zeus](https://github.com/daryl/zeus) - A very simple and fast HTTP router for Go. @@ -1087,11 +1207,11 @@ See [go-hardware](https://github.com/rakyll/go-hardware) for a comprehensive lis * [chain](https://github.com/codemodus/chain) - Handler wrapper chaining with scoped data (net/context-based "middleware"). * [go-wrap](https://github.com/go-on/wrap) - Small middlewares package for net/http. * [gores](https://github.com/alioygur/gores) - Go package that handles HTML, JSON, XML and etc. responses. Useful for RESTful APIs. -* [httpware](https://github.com/nstogner/httpware) - Stackable middleware (using net/context) with easy chaining. * [interpose](https://github.com/carbocation/interpose) - Minimalist net/http middleware for golang. * [muxchain](https://github.com/stephens2424/muxchain) - Lightweight middleware for net/http. -* [negroni](https://github.com/codegangsta/negroni) - Idiomatic HTTP middleware for Golang. +* [negroni](https://github.com/urfave/negroni) - Idiomatic HTTP middleware for Golang. * [render](https://github.com/unrolled/render) - Go package for easily rendering JSON, XML, and HTML template responses. +* [rye](https://github.com/InVisionApp/rye) - Tiny Go middleware library (with canned Middlewares) that supports JWT, CORS, Statsd, and Go 1.7 context * [stats](https://github.com/thoas/stats) - A Go middleware that stores various information about your web application. # Tools @@ -1101,6 +1221,7 @@ Go software and plugins. ## Code Analysis +* [apicompat](https://github.com/bradleyfalzon/apicompat) - Checks recent changes to a Go project for backwards incompatible changes. * [dupl](https://github.com/mibk/dupl) - A tool for code clone detection. * [errcheck](https://github.com/kisielk/errcheck) - Errcheck is a program for checking for unchecked errors in Go programs. * [gcvis](https://github.com/davecheney/gcvis) - Visualise Go program GC trace data in real time. @@ -1112,9 +1233,10 @@ Go software and plugins. * [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports) - Tool to fix (add, remove) your Go imports automatically. * [GoLint](https://github.com/golang/lint) - Golint is a linter for Go source code. * [Golint online](http://go-lint.appspot.com/) - Lints online Go source files on GitHub, Bitbucket and Google Project Hosting using the golint package. -* [goreturns](https://sourcegraph.com/sqs/goreturns) - Adds zero-value return statements to match the func return types. +* [goreturns](https://sourcegraph.com/github.com/sqs/goreturns) - Adds zero-value return statements to match the func return types. * [gostatus](https://github.com/shurcooL/gostatus) - A command line tool, shows the status of repositories that contain Go packages. * [interfacer](https://github.com/mvdan/interfacer) - A linter that suggests interface types. +* [lint](https://github.com/surullabs/lint) - Run linters as part of go test * [validate](https://github.com/mccoyst/validate) - Automatically validates struct fields with tags. @@ -1135,6 +1257,7 @@ Go software and plugins. * [colorgo](https://github.com/songgao/colorgo) - A wrapper around `go` command for colorized `go build` output. * [gb](https://getgb.io/) - An easy to use project based build tool for the Go programming language. * [go-pkg-complete](https://github.com/skelterjohn/go-pkg-complete) - Bash completion for go and wgo. +* [go-swagger](https://github.com/go-swagger/go-swagger) - Swagger 2.0 implementation for go. Swagger is a simple yet powerful representation of your RESTful API. * [rts](https://github.com/galeone/rts) - RTS: response to struct. Generates Go structs from server responses. ## Software Packages @@ -1147,21 +1270,23 @@ Software written in Go. * [aptly](https://github.com/smira/aptly) - aptly is a Debian repository management tool. * [awsenv](https://github.com/soniah/awsenv) - a small binary that loads Amazon (AWS) environment variables for a profile. * [Banshee](https://github.com/eleme/banshee) - Anomalies detection system for periodic metrics. -* [Boom](https://github.com/rakyll/boom) - Boom is a tiny program that sends some load to a web application. * [bosun](https://github.com/bosun-monitor/bosun) - Time Series Alerting Framework. * [dogo](https://github.com/liudng/dogo) - Monitoring changes in the source file and automatically compile and run (restart). * [Dropship](https://github.com/chrismckenzie/dropship) - A tool for deploying code via cdn. * [EasySSH](https://github.com/hypersleep/easyssh) - Golang package for easy remote execution through SSH and SCP downloading. +* [Gitea](https://github.com/go-gitea/gitea) - A fork of Gogs, entirely community driven. * [Go Metrics](https://github.com/rcrowley/go-metrics) - Go port of Coda Hale's Metrics library: https://github.com/codahale/metrics. * [go-selfupdate](https://github.com/sanbornm/go-selfupdate) - Enable your Go applications to self update. * [gobrew](https://github.com/cryptojuice/gobrew) - gobrew lets you easily switch between multiple versions of go. * [godbg](https://github.com/sirnewton01/godbg) - Web-based gdb front-end application. * [Gogs](https://gogs.io/) - A Self Hosted Git Service in the Go Programming Language. * [gonative](https://github.com/inconshreveable/gonative) - Tool which creates a build of Go that can cross compile to all platforms while still using the Cgo-enabled versions of the stdlib packages. +* [govvv](https://github.com/ahmetalpbalkan/govvv) - A “go build” wrapper to easily add version information into Go binaries * [gox](https://github.com/mitchellh/gox) - A dead simple, no frills Go cross compile tool. * [goxc](https://github.com/laher/goxc) - build tool for Go, with a focus on cross-compiling and packaging. +* [grapes](https://github.com/yaronsumel/grapes) - lightweight tool designed to distribute commands over ssh with ease. * [GVM](https://github.com/moovweb/gvm) - GVM provides an interface to manage Go versions. -* [hk](https://github.com/heroku/hk) - Heroku command-line interface in Go. +* [Hey](https://github.com/rakyll/hey) - Hey is a tiny program that sends some load to a web application. * [kala](https://github.com/ajvb/kala) - Simplistic, modern, and performant job scheduler. * [kubernetes](https://github.com/kubernetes/kubernetes) - Container Cluster Manager from Google. * [Mora](https://github.com/emicklei/mora) - REST server for accessing MongoDB documents and meta data. @@ -1170,31 +1295,34 @@ Software written in Go. * [Rodent](https://github.com/alouche/rodent) - Rodent helps you manage Go versions, projects and track dependencies. * [s3gof3r](https://github.com/rlmcpherson/s3gof3r) - A small utility/library optimized for high speed transfer of large objects into and out of Amazon S3. * [Scaleway-cli](https://github.com/scaleway/scaleway-cli) - Manage BareMetal Servers from Command Line (as easily as with Docker). +* [sg](https://github.com/ChristopherRabotin/sg) - Benchmarks a set of HTTP endpoints (like ab), with possibility to use the reponse code and data between each call for specific server stress based on its previous response. * [Vegeta] (https://github.com/tsenart/vegeta) - HTTP load testing tool and library. It's over 9000! * [webhook](https://github.com/adnanh/webhook) - Tool which allows user to create HTTP endpoints (hooks) that execute commands on the server. * [Wide](https://wide.b3log.org/login) - A Web-based IDE for Teams using Golang. - +* [winrm-cli](https://github.com/masterzen/winrm-cli) - A cli tool to remotely execute commands on Windows machines ### Other Software +* [borg](https://github.com/crufter/borg) - A terminal based search engine for bash snippets * [boxed](https://github.com/tejo/boxed) - Dropbox based blog engine * [Cherry](https://github.com/rafael-santiago/cherry) - A tiny webchat server in Go. * [Circuit](https://github.com/gocircuit/circuit) - Circuit is a programmable platform-as-a-service (PaaS) and/or Infrastructure-as-a-Service (IaaS), for management, discovery, synchronization and orchestration of services and hosts comprising cloud applications. * [Comcast](https://github.com/tylertreat/Comcast) - Simulate bad network connections. * [confd](https://github.com/kelseyhightower/confd) - Manage local application configuration files using templates and data from etcd or consul. * [Docker](http://www.docker.com/) - An open platform for distributed applications for developers and sysadmins. +* [Documize](https://github.com/documize/community) - Modern wiki software that integrates data from SaaS tools. * [fleet](https://github.com/coreos/fleet) - A Distributed init System. * [Go Package Store](https://github.com/shurcooL/Go-Package-Store#go-package-store-) - An app that displays updates for the Go packages in your GOPATH. * [gocc](https://github.com/goccmack/gocc) - Gocc is a compiler kit for Go written in Go. * [GoDocTooltip](https://github.com/diankong/GoDocTooltip) - A chrome extension for Go Doc sites, which shows function description as tooltip at funciton list. * [Gor](https://github.com/buger/gor) - Http traffic replication tool, for replaying traffic from production to stage/dev environments in real-time. -* [heka](https://github.com/mozilla-services/heka) - universal tool for data processing from Mozilla. Large collection of built-in plugins. Extendable via Go and Lua plugin API. * [hsync](http://ambrevar.bitbucket.org/hsync/) - A filesystem hierarchy synchronizer. * [hugo](http://gohugo.io/) - A Fast and Modern Static Website Engine. * [ipe](https://github.com/dimiro1/ipe) - An open source Pusher server implementation compatible with Pusher client libraries written in GO. * [Juju](https://jujucharms.com/) - Cloud-agnostic service deployment and orchestration - supports EC2, Azure, Openstack, MAAS and more. * [limetext](http://limetext.org/) Lime Text is a powerful and elegant text editor primarily developed in Go that aims to be a Free and open-source software successor to Sublime Text. * [LiteIDE](https://github.com/visualfc/liteide) LiteIDE is a simple, open source, cross-platform Go IDE. -* [mockingjay](https://github.com/quii/mockingjay-server) Fake HTTP servers and consumer driven contracts from one configuration file. You can also make the server randomly misbehave to help do more realistic performance tests. +* [mockingjay](https://github.com/quii/mockingjay-server) Fake HTTP servers and consumer driven contracts from one configuration file. You can also make the server randomly misbehave to help do more realistic performance tests. +* [myLG](https://github.com/mehrdadrad/mylg) - Command Line Network Diagnostic tool written in Go. * [naclpipe](https://github.com/unix4fun/naclpipe) - A simple NaCL EC25519 based crypto pipe tool written in Go. * [nes](https://github.com/fogleman/nes) - A Nintendo Entertainment System (NES) emulator written in Go. * [orange-cat](https://github.com/noraesae/orange-cat) - A Markdown previewer written in Go. @@ -1213,6 +1341,7 @@ Software written in Go. * [tsuru](https://tsuru.io/) - An extensible and open source Platform as a Service software. * [websysd](https://github.com/ian-kent/websysd) - Web based process manager (like Marathon or Upstart). * [wellington](https://github.com/wellington/wellington) - Sass project management tool, extends the language with sprite functions (like Compass). +* [XML-Comp](https://github.com/xml-comp/xml-comp) - Simple command line XML comparer that generates diffs of folders, files and tags. @@ -1228,9 +1357,10 @@ Where to discover new Go libraries. ## Benchmarks * [autobench](https://github.com/davecheney/autobench) - Framework to compare the performance between different Go versions. -* [go-benchmarks](https://github.com/tylertreat/go-benchmarks) - A few miscellaneous Go microbenchmarks. Compare some language features to alternative aproaches. +* [go-benchmarks](https://github.com/tylertreat/go-benchmarks) - A few miscellaneous Go microbenchmarks. Compare some language features to alternative approaches. * [go-http-routing-benchmark](https://github.com/julienschmidt/go-http-routing-benchmark) - Go HTTP request router benchmark and comparison. * [go-type-assertion-benchmark](https://github.com/hgfischer/go-type-assertion-benchmark) - Naive performance test of two ways to do type assertion in Go. +* [go-web-framework-benchmark](https://github.com/smallnest/go-web-framework-benchmark) - Go web framework benchmark. * [go_serialization_benchmarks](https://github.com/alecthomas/go_serialization_benchmarks) - Benchmarks of Go serialization methods. * [gocostmodel](https://github.com/PuerkitoBio/gocostmodel) - Benchmarks of common basic operations for the Go language. * [golang-micro-benchmarks](https://github.com/amscanne/golang-micro-benchmarks) - Tiny collection of Go micro benchmarks. The intent is to compare some language features to others. @@ -1248,8 +1378,9 @@ Where to discover new Go libraries. * [GolangUK](http://golanguk.com/) - London, UK * [GopherChina](http://gopherchina.org) - Shanghai, China * [GopherCon](http://www.gophercon.com/) - Denver, USA +* [GopherCon Brazil](https://gopherconbr.org) - Florianópolis, BR * [GopherCon Dubai](http://www.gophercon.ae/) - Dubai, UAE -* [GopherCon India](http://www.gophercon.in/) - Bengaluru, India +* [GopherCon India](http://www.gophercon.in/) - Pune, India * [GothamGo](http://gothamgo.com/) - New York City, USA ## E-Books @@ -1263,6 +1394,7 @@ Where to discover new Go libraries. * [Learning Go](https://www.miek.nl/downloads/Go/Learning-Go-latest.pdf) * [Network Programming With Go](https://jan.newmarch.name/go/) * [The Go Programming Language](http://www.gopl.io/) +* [Web Application with Go the Anti-Textbook](https://github.com/thewhitetulip/web-dev-golang-anti-textbook/) ## Twitter @@ -1273,12 +1405,16 @@ Where to discover new Go libraries. ## Websites +* [Awesome Go @LibHunt](https://go.libhunt.com) - Your go-to Go Toolbox. * [Awesome Remote Job](https://github.com/lukasz-madon/awesome-remote-job) - A curated list of awesome remote jobs. A lot of them is looking for Go hackers. * [awesome-awesomeness](https://github.com/bayandin/awesome-awesomeness) - List of other amazingly awesome lists. * [Flipboard - Go Magazine](https://flipboard.com/section/the-golang-magazine-bVP7nS) - A collection of Go articles and tutorials. * [Go Blog](http://blog.golang.org) - The official Go blog. +* [Go Challenge](http://golang-challenge.org/) - Learn Go by solving problems and getting feedback from Go experts. * [Go Forum](https://forum.golangbridge.org) - Forum to discuss Go. +* [Go In 5 Minutes](https://www.goin5minutes.com/) - 5 minute screencasts focused on getting one thing done. * [Go Projects](https://github.com/golang/go/wiki/Projects) - List of projects on the Go community wiki. +* [gocryforhelp](https://github.com/ninedraft/gocryforhelp) - A collection of Go projects that needs help. Good place to start your open-source way in Go. * [godoc.org](https://godoc.org/) - Documentation for open source Go packages. * [golang-graphics](https://github.com/mholt/golang-graphics) - A collection of Go images, graphics, and art. * [golang-nuts](https://groups.google.com/forum/#!forum/golang-nuts) - Go mailing list. @@ -1291,11 +1427,15 @@ Where to discover new Go libraries. ### Tutorials * [A Tour of Go](http://tour.golang.org/) - Interactive tour of Go. +* [Building Go Web Applications and Microservices Using Gin](https://semaphoreci.com/community/tutorials/building-go-web-applications-and-microservices-using-gin) - Get familiar with Gin and find out how it can help you reduce boilerplate code and build a request handling pipeline. * [Go By Example](https://gobyexample.com/) - A hands-on introduction to Go using annotated example programs. * [Go database/sql tutorial](http://go-database-sql.org/) - Introduction to database/sql. +* [How to Use Godog for Behavior-driven Development in Go](https://semaphoreci.com/community/tutorials/how-to-use-godog-for-behavior-driven-development-in-go) - Get started with Godog — a Behavior-driven development framework for building and testing Go applications. * [Working with Go](https://github.com/mkaz/working-with-go) - An intro to go for experienced programmers. + ## Windows +* [d3d9](https://github.com/gonutz/d3d9) - Go bindings for Direct3D9 * [go-ole](https://github.com/go-ole/go-ole) - Win32 OLE implementation for golang. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..b42a8ac0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: "2" + +services: + caddy: + image: abiosoft/caddy + volumes: + - ./tmpl:/srv + ports: + - 80:2015 + webhook: + build: ./ + volumes: + - ./:/srv + ports: + - 9000:9000 \ No newline at end of file diff --git a/repo.go b/repo.go index e0281bfd..9c53515c 100644 --- a/repo.go +++ b/repo.go @@ -1 +1,88 @@ -package repo +package main + +import ( + "io/ioutil" + "net/http" + "os" + "os/exec" + "text/template" + + "github.com/gorilla/mux" + "github.com/russross/blackfriday" +) + +// memory usage optimizations +const ( + emtyStr = "" + git = "git" + checkout = "checkout" + force = "-f" + pull = "pull" + + // options + readmePath = "./README.md" + tplPath = "tmpl/tmpl.html" + idxPath = "tmpl/index.html" + + bfHTMLRendererOpts = 0 | + blackfriday.HTML_USE_XHTML | + blackfriday.HTML_USE_SMARTYPANTS | + blackfriday.HTML_SMARTYPANTS_FRACTIONS | + blackfriday.HTML_SMARTYPANTS_DASHES | + blackfriday.HTML_SMARTYPANTS_LATEX_DASHES + + bfMDOpts = 0 | + blackfriday.EXTENSION_NO_INTRA_EMPHASIS | + blackfriday.EXTENSION_TABLES | + blackfriday.EXTENSION_FENCED_CODE | + blackfriday.EXTENSION_AUTOLINK | + blackfriday.EXTENSION_STRIKETHROUGH | + blackfriday.EXTENSION_SPACE_HEADERS | + blackfriday.EXTENSION_HEADER_IDS | + blackfriday.EXTENSION_BACKSLASH_LINE_BREAK | + blackfriday.EXTENSION_DEFINITION_LISTS | + blackfriday.EXTENSION_AUTO_HEADER_IDS +) + +var ( + doneResp = []byte("Done!\n") +) + +type content struct { + Body string +} + +func generateHTML() { + // Update repo + exec.Command(git, checkout, force).Output() + exec.Command(git, pull).Output() + + input, _ := ioutil.ReadFile(readmePath) + body := string( + blackfriday.Markdown( + input, + blackfriday.HtmlRenderer( + bfHTMLRendererOpts, + emtyStr, + emtyStr, + ), + bfMDOpts, + ), + ) + c := &content{Body: body} + + t := template.Must(template.ParseFiles(tplPath)) + f, _ := os.Create(idxPath) + t.Execute(f, c) +} + +func hookHandler(w http.ResponseWriter, r *http.Request) { + go generateHTML() + w.Write(doneResp) +} + +func main() { + r := mux.NewRouter() + r.HandleFunc("/hook", hookHandler) + http.ListenAndServe(":9000", r) +} diff --git a/repo_test.go b/repo_test.go index d6e72627..33eeecab 100644 --- a/repo_test.go +++ b/repo_test.go @@ -1,9 +1,8 @@ -package repo +package main import ( "bytes" "io/ioutil" - "log" "sort" "strings" "testing" @@ -25,19 +24,18 @@ func TestDuplicatedLinks(t *testing.T) { links := make(map[string]bool, 0) query.Find("body a").Each(func(_ int, s *goquery.Selection) { - href, ok := s.Attr("href") - if !ok { - log.Printf("expected '%s' href", s) - t.Fail() - } + t.Run(s.Text(), func(t *testing.T) { + href, ok := s.Attr("href") + if !ok { + t.Error("expected to have href") + } - if links[href] { - log.Printf("duplicated link '%s'", href) - t.Fail() - return - } + if links[href] { + t.Fatalf("duplicated link '%s'", href) + } - links[href] = true + links[href] = true + }) }) } @@ -46,7 +44,12 @@ func testList(t *testing.T, list *goquery.Selection) { testList(t, items) items.RemoveFiltered("ul") }) - checkAlphabeticOrder(t, list) + + category := list.Prev().Text() + + t.Run(category, func(t *testing.T) { + checkAlphabeticOrder(t, list) + }) } func readme() []byte { @@ -80,8 +83,10 @@ func checkAlphabeticOrder(t *testing.T, s *goquery.Selection) { for k, item := range items { if item != sorted[k] { - log.Printf("expected '%s' but actual is '%s'", sorted[k], item) - t.Fail() + t.Errorf("expected '%s' but actual is '%s'", sorted[k], item) } } + if t.Failed() { + t.Logf("expected order is:\n%s", strings.Join(sorted, "\n")) + } } diff --git a/tmpl/assets/awesome-go.css b/tmpl/assets/awesome-go.css new file mode 100644 index 00000000..5dd55395 --- /dev/null +++ b/tmpl/assets/awesome-go.css @@ -0,0 +1,43 @@ +* { + max-width: 100%; + box-sizing: border-box; + font-family: "Fira Sans"; + text-decoration: none; + font-weight: 300; +} +.awesome-logo { + max-width: 500px; + width: 100%; + margin: auto; + display: block; +} + +a { + color: #669; +} +a:visited, h1, h2, h3, h4 { + color: #494368; + font-weight: 400; +} +h1 > a:nth-child(1) { + margin-left: 10px; +} +h1 > a img { + padding-right: 5px; +} + +#content { + width: 100%; + padding: 40px 80px; +} + +@media (max-width: 720px) { + #content { + padding: 20px 40px; + } +} +@media (max-width: 420px) { + #content * { + word-wrap: break-word; + } +} \ No newline at end of file diff --git a/tmpl/assets/fonts/firasans.css b/tmpl/assets/fonts/firasans.css new file mode 100644 index 00000000..b52258d7 --- /dev/null +++ b/tmpl/assets/fonts/firasans.css @@ -0,0 +1,140 @@ +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans ExtraLight'), + local('FiraSans-ExtraLight'), + url('/assets/fonts/firasansextralight.woff2') format('woff2'), + url('/assets/fonts/firasansextralight.woff') format('woff'), + url('/assets/fonts/firasansextralight.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans ExtraLight Italic'), + local('FiraSans-ExtraLightItalic'), + url('/assets/fonts/firasansextralightitalic.woff2') format('woff2'), + url('/assets/fonts/firasansextralightitalic.woff') format('woff'), + url('/assets/fonts/firasansextralightitalic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Light'), + local('FiraSans-Light'), + url('/assets/fonts/firasanslight.woff2') format('woff2'), + url('/assets/fonts/firasanslight.woff') format('woff'), + url('/assets/fonts/firasanslight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Light Italic'), + local('FiraSans-LightItalic'), + url('/assets/fonts/firasanslightitalic.woff2') format('woff2'), + url('/assets/fonts/firasanslightitalic.woff') format('woff'), + url('/assets/fonts/firasanslightitalic.ttf') format('truetype'); + font-weight: 200; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Book'), + local('FiraSans-Book'), + url('/assets/fonts/firasansbook.woff2') format('woff2'), + url('/assets/fonts/firasansbook.woff') format('woff'), + url('/assets/fonts/firasansbook.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Book Italic'), + local('FiraSans-BookItalic'), + url('/assets/fonts/firasansbookitalic.woff2') format('woff2'), + url('/assets/fonts/firasansbookitalic.woff') format('woff'), + url('/assets/fonts/firasansbookitalic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans'), + local('FiraSans-Regular'), + url('/assets/fonts/firasans.woff2') format('woff2'), + url('/assets/fonts/firasans.woff') format('woff'), + url('/assets/fonts/firasans.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Italic'), + local('FiraSans-Italic'), + url('/assets/fonts/firasansitalic.woff2') format('woff2'), + url('/assets/fonts/firasansitalic.woff') format('woff'), + url('/assets/fonts/firasansitalic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Medium'), + local('FiraSans-Medium'), + url('/assets/fonts/firasansmedium.woff2') format('woff2'), + url('/assets/fonts/firasansmedium.woff') format('woff'), + url('/assets/fonts/firasansmedium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Medium Italic'), + local('FiraSans-MediumItalic'), + url('/assets/fonts/firasansmediumitalic.woff2') format('woff2'), + url('/assets/fonts/firasansmediumitalic.woff') format('woff'), + url('/assets/fonts/firasansmediumitalic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans SemiBold'), + local('FiraSans-SemiBold'), + url('/assets/fonts/firasanssemibold.woff2') format('woff2'), + url('/assets/fonts/firasanssemibold.woff') format('woff'), + url('/assets/fonts/firasanssemibold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans SemiBold Italic'), + local('FiraSans-SemiBoldItalic'), + url('/assets/fonts/firasanssemibolditalic.woff2') format('woff2'), + url('/assets/fonts/firasanssemibolditalic.woff') format('woff'), + url('/assets/fonts/firasanssemibolditalic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Bold'), + local('FiraSans-Bold'), + url('/assets/fonts/firasansbold.woff2') format('woff2'), + url('/assets/fonts/firasansbold.woff') format('woff'), + url('/assets/fonts/firasansbold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Fira Sans'; + src: local('Fira Sans Bold Italic'), + local('FiraSans-BoldItalic'), + url('/assets/fonts/firasansbolditalic.woff2') format('woff2'), + url('/assets/fonts/firasansbolditalic.woff') format('woff'), + url('/assets/fonts/firasansbolditalic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; +} diff --git a/tmpl/assets/fonts/firasans.ttf b/tmpl/assets/fonts/firasans.ttf new file mode 100644 index 00000000..5ea949d2 Binary files /dev/null and b/tmpl/assets/fonts/firasans.ttf differ diff --git a/tmpl/assets/fonts/firasans.woff b/tmpl/assets/fonts/firasans.woff new file mode 100644 index 00000000..5259871c Binary files /dev/null and b/tmpl/assets/fonts/firasans.woff differ diff --git a/tmpl/assets/fonts/firasans.woff2 b/tmpl/assets/fonts/firasans.woff2 new file mode 100644 index 00000000..b28d3362 Binary files /dev/null and b/tmpl/assets/fonts/firasans.woff2 differ diff --git a/tmpl/assets/fonts/firasansbold.ttf b/tmpl/assets/fonts/firasansbold.ttf new file mode 100644 index 00000000..bcf62411 Binary files /dev/null and b/tmpl/assets/fonts/firasansbold.ttf differ diff --git a/tmpl/assets/fonts/firasansbold.woff b/tmpl/assets/fonts/firasansbold.woff new file mode 100644 index 00000000..dae100fb Binary files /dev/null and b/tmpl/assets/fonts/firasansbold.woff differ diff --git a/tmpl/assets/fonts/firasansbold.woff2 b/tmpl/assets/fonts/firasansbold.woff2 new file mode 100644 index 00000000..05c5da2f Binary files /dev/null and b/tmpl/assets/fonts/firasansbold.woff2 differ diff --git a/tmpl/assets/fonts/firasansbolditalic.ttf b/tmpl/assets/fonts/firasansbolditalic.ttf new file mode 100644 index 00000000..fab739eb Binary files /dev/null and b/tmpl/assets/fonts/firasansbolditalic.ttf differ diff --git a/tmpl/assets/fonts/firasansbolditalic.woff b/tmpl/assets/fonts/firasansbolditalic.woff new file mode 100644 index 00000000..48ca8dcc Binary files /dev/null and b/tmpl/assets/fonts/firasansbolditalic.woff differ diff --git a/tmpl/assets/fonts/firasansbolditalic.woff2 b/tmpl/assets/fonts/firasansbolditalic.woff2 new file mode 100644 index 00000000..426dda7b Binary files /dev/null and b/tmpl/assets/fonts/firasansbolditalic.woff2 differ diff --git a/tmpl/assets/fonts/firasansbook.ttf b/tmpl/assets/fonts/firasansbook.ttf new file mode 100644 index 00000000..8bfe3037 Binary files /dev/null and b/tmpl/assets/fonts/firasansbook.ttf differ diff --git a/tmpl/assets/fonts/firasansbook.woff b/tmpl/assets/fonts/firasansbook.woff new file mode 100644 index 00000000..239780f9 Binary files /dev/null and b/tmpl/assets/fonts/firasansbook.woff differ diff --git a/tmpl/assets/fonts/firasansbook.woff2 b/tmpl/assets/fonts/firasansbook.woff2 new file mode 100644 index 00000000..2d880f92 Binary files /dev/null and b/tmpl/assets/fonts/firasansbook.woff2 differ diff --git a/tmpl/assets/fonts/firasansbookitalic.ttf b/tmpl/assets/fonts/firasansbookitalic.ttf new file mode 100644 index 00000000..d4b76ed4 Binary files /dev/null and b/tmpl/assets/fonts/firasansbookitalic.ttf differ diff --git a/tmpl/assets/fonts/firasansbookitalic.woff b/tmpl/assets/fonts/firasansbookitalic.woff new file mode 100644 index 00000000..61674f34 Binary files /dev/null and b/tmpl/assets/fonts/firasansbookitalic.woff differ diff --git a/tmpl/assets/fonts/firasansbookitalic.woff2 b/tmpl/assets/fonts/firasansbookitalic.woff2 new file mode 100644 index 00000000..b4ddd45f Binary files /dev/null and b/tmpl/assets/fonts/firasansbookitalic.woff2 differ diff --git a/tmpl/assets/fonts/firasansextralight.ttf b/tmpl/assets/fonts/firasansextralight.ttf new file mode 100644 index 00000000..92fa7ddb Binary files /dev/null and b/tmpl/assets/fonts/firasansextralight.ttf differ diff --git a/tmpl/assets/fonts/firasansextralight.woff b/tmpl/assets/fonts/firasansextralight.woff new file mode 100644 index 00000000..02f74122 Binary files /dev/null and b/tmpl/assets/fonts/firasansextralight.woff differ diff --git a/tmpl/assets/fonts/firasansextralight.woff2 b/tmpl/assets/fonts/firasansextralight.woff2 new file mode 100644 index 00000000..0e207ed3 Binary files /dev/null and b/tmpl/assets/fonts/firasansextralight.woff2 differ diff --git a/tmpl/assets/fonts/firasansextralightitalic.ttf b/tmpl/assets/fonts/firasansextralightitalic.ttf new file mode 100644 index 00000000..226bd9a5 Binary files /dev/null and b/tmpl/assets/fonts/firasansextralightitalic.ttf differ diff --git a/tmpl/assets/fonts/firasansextralightitalic.woff b/tmpl/assets/fonts/firasansextralightitalic.woff new file mode 100644 index 00000000..fbd889ab Binary files /dev/null and b/tmpl/assets/fonts/firasansextralightitalic.woff differ diff --git a/tmpl/assets/fonts/firasansextralightitalic.woff2 b/tmpl/assets/fonts/firasansextralightitalic.woff2 new file mode 100644 index 00000000..c7340a40 Binary files /dev/null and b/tmpl/assets/fonts/firasansextralightitalic.woff2 differ diff --git a/tmpl/assets/fonts/firasansitalic.ttf b/tmpl/assets/fonts/firasansitalic.ttf new file mode 100644 index 00000000..aa45c66c Binary files /dev/null and b/tmpl/assets/fonts/firasansitalic.ttf differ diff --git a/tmpl/assets/fonts/firasansitalic.woff b/tmpl/assets/fonts/firasansitalic.woff new file mode 100644 index 00000000..ff5a05aa Binary files /dev/null and b/tmpl/assets/fonts/firasansitalic.woff differ diff --git a/tmpl/assets/fonts/firasansitalic.woff2 b/tmpl/assets/fonts/firasansitalic.woff2 new file mode 100644 index 00000000..f86040d3 Binary files /dev/null and b/tmpl/assets/fonts/firasansitalic.woff2 differ diff --git a/tmpl/assets/fonts/firasanslight.ttf b/tmpl/assets/fonts/firasanslight.ttf new file mode 100644 index 00000000..c22cfa36 Binary files /dev/null and b/tmpl/assets/fonts/firasanslight.ttf differ diff --git a/tmpl/assets/fonts/firasanslight.woff b/tmpl/assets/fonts/firasanslight.woff new file mode 100644 index 00000000..31ab37de Binary files /dev/null and b/tmpl/assets/fonts/firasanslight.woff differ diff --git a/tmpl/assets/fonts/firasanslight.woff2 b/tmpl/assets/fonts/firasanslight.woff2 new file mode 100644 index 00000000..65fb70a7 Binary files /dev/null and b/tmpl/assets/fonts/firasanslight.woff2 differ diff --git a/tmpl/assets/fonts/firasanslightitalic.ttf b/tmpl/assets/fonts/firasanslightitalic.ttf new file mode 100644 index 00000000..b442b2b3 Binary files /dev/null and b/tmpl/assets/fonts/firasanslightitalic.ttf differ diff --git a/tmpl/assets/fonts/firasanslightitalic.woff b/tmpl/assets/fonts/firasanslightitalic.woff new file mode 100644 index 00000000..19a3a199 Binary files /dev/null and b/tmpl/assets/fonts/firasanslightitalic.woff differ diff --git a/tmpl/assets/fonts/firasanslightitalic.woff2 b/tmpl/assets/fonts/firasanslightitalic.woff2 new file mode 100644 index 00000000..367e5b1c Binary files /dev/null and b/tmpl/assets/fonts/firasanslightitalic.woff2 differ diff --git a/tmpl/assets/fonts/firasansmedium.ttf b/tmpl/assets/fonts/firasansmedium.ttf new file mode 100644 index 00000000..81f97072 Binary files /dev/null and b/tmpl/assets/fonts/firasansmedium.ttf differ diff --git a/tmpl/assets/fonts/firasansmedium.woff b/tmpl/assets/fonts/firasansmedium.woff new file mode 100644 index 00000000..12b998bb Binary files /dev/null and b/tmpl/assets/fonts/firasansmedium.woff differ diff --git a/tmpl/assets/fonts/firasansmedium.woff2 b/tmpl/assets/fonts/firasansmedium.woff2 new file mode 100644 index 00000000..4e23dc48 Binary files /dev/null and b/tmpl/assets/fonts/firasansmedium.woff2 differ diff --git a/tmpl/assets/fonts/firasansmediumitalic.ttf b/tmpl/assets/fonts/firasansmediumitalic.ttf new file mode 100644 index 00000000..1beedda5 Binary files /dev/null and b/tmpl/assets/fonts/firasansmediumitalic.ttf differ diff --git a/tmpl/assets/fonts/firasansmediumitalic.woff b/tmpl/assets/fonts/firasansmediumitalic.woff new file mode 100644 index 00000000..e6944225 Binary files /dev/null and b/tmpl/assets/fonts/firasansmediumitalic.woff differ diff --git a/tmpl/assets/fonts/firasansmediumitalic.woff2 b/tmpl/assets/fonts/firasansmediumitalic.woff2 new file mode 100644 index 00000000..01de8266 Binary files /dev/null and b/tmpl/assets/fonts/firasansmediumitalic.woff2 differ diff --git a/tmpl/assets/fonts/firasanssemibold.ttf b/tmpl/assets/fonts/firasanssemibold.ttf new file mode 100644 index 00000000..69a4be5a Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibold.ttf differ diff --git a/tmpl/assets/fonts/firasanssemibold.woff b/tmpl/assets/fonts/firasanssemibold.woff new file mode 100644 index 00000000..fe733039 Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibold.woff differ diff --git a/tmpl/assets/fonts/firasanssemibold.woff2 b/tmpl/assets/fonts/firasanssemibold.woff2 new file mode 100644 index 00000000..b828fd27 Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibold.woff2 differ diff --git a/tmpl/assets/fonts/firasanssemibolditalic.ttf b/tmpl/assets/fonts/firasanssemibolditalic.ttf new file mode 100644 index 00000000..dd5c7eee Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibolditalic.ttf differ diff --git a/tmpl/assets/fonts/firasanssemibolditalic.woff b/tmpl/assets/fonts/firasanssemibolditalic.woff new file mode 100644 index 00000000..9bbb771b Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibolditalic.woff differ diff --git a/tmpl/assets/fonts/firasanssemibolditalic.woff2 b/tmpl/assets/fonts/firasanssemibolditalic.woff2 new file mode 100644 index 00000000..dc18c323 Binary files /dev/null and b/tmpl/assets/fonts/firasanssemibolditalic.woff2 differ diff --git a/tmpl/assets/jquery-custom.min.js b/tmpl/assets/jquery-custom.min.js new file mode 100644 index 00000000..ee49d986 --- /dev/null +++ b/tmpl/assets/jquery-custom.min.js @@ -0,0 +1,5 @@ +/*! jQuery v3.0.0 -css,-css/addGetHookIf,-css/adjustCSS,-css/curCSS,-css/hiddenVisibleSelectors,-css/showHide,-effects,-effects/Tween,-effects/animatedSelector,-css/support,-css/var/cssExpand,-css/var/getStyles,-css/var/isHiddenWithinTree,-css/var/rmargin,-css/var/rnumnonpx,-css/var/swap,-dimensions,-offset,-deprecated,-event/alias,-wrap | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"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){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.0.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.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:h,sort:c.sort,splice:c.splice},r.extend=r.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||r.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&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return a&&"[object Object]"===k.call(a)?(b=e(a))?(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n):!0:!1},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?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(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(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.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,f=0,h=[];if(w(a))for(d=a.length;d>f;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a)?(d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e):void 0},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"===c||r.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var x=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=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=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)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(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 qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.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),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(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(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);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=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.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?I(k,a)-I(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?I(k,a)-I(k,b):0;if(e===f)return la(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?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$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 ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.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},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.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=ga.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=ga.selectors={cacheLength:50,createPseudo:ia,match:V,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(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===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]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.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(_,aa).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("(^|"+K+")"+a+"("+K+"|$)"))&&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=ga.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(O," ")+" ").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()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(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:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).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:oa(!1),disabled:oa(!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 X.test(a.nodeName)},input:function(a){return W.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:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(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 va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(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 xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(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?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(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=[ta(ua(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 xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(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()||.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]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.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(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.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(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;d>b;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.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 r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;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&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.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-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?r.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||b||(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};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(f>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(1>=b&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){ +return j.call(r(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},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(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[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.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=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.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 V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ca=/^$|\/(?:java|ecma)script/i,da={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function fa(a,b){for(var c=0,d=a.length;d>c;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var ga=/<|&#?\w+;/;function ha(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;o>n;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(ga.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ba.exec(f)||["",""])[1].toLowerCase(),i=da[h]||da._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ea(l.appendChild(f),"script"),j&&fa(g),c){k=0;while(f=g[k++])ca.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),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ia=d.documentElement,ja=/^key/,ka=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,la=/^([^.]*)(?:\.(.+)|)/;function ma(){return!0}function na(){return!1}function oa(){try{return d.activeElement}catch(a){}}function pa(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)pa(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=na;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ia,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=la.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,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),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=la.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==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,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;cc;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h\x20\t\r\n\f]*)[^>]*)\/>/gi,ra=/\s*$/g;function va(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function wa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function xa(a){var b=ta.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ya(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.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++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function za(a,b){var c=b.nodeName.toLowerCase();"input"===c&&aa.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Aa(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&sa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Aa(f,b,c,d)});if(m&&(e=ha(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ea(e,"script"),wa),i=h.length;m>l;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ea(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,xa),l=0;i>l;l++)j=h[l],ca.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(ua,""),k))}return a}function Ba(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ea(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(qa,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ea(h),f=ea(a),d=0,e=f.length;e>d;d++)za(f[d],g[d]);if(b)if(c)for(f=f||ea(a),g=g||ea(h),d=0,e=f.length;e>d;d++)ya(f[d],g[d]);else ya(a,h);return g=ea(h,"script"),g.length>0&&fa(g,!i&&ea(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ba(this,a,!0)},remove:function(a){return Ba(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.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 Aa(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=va(this,a);b.appendChild(a)}})},prepend:function(){return Aa(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=va(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Aa(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Aa(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&&(r.cleanData(ea(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 r.clone(this,a,b)})},html:function(a){return S(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&&!ra.test(a)&&!da[(ba.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Aa(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var Ca,Da=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?Ca:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),Ca={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=Da[b]||r.find.attr;Da[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=Da[g],Da[g]=e,e=null!=c(a,b,d)?g:null,Da[g]=f),e}});var Ea=/^(?:input|select|textarea|button)$/i,Fa=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):Ea.test(a.nodeName)||Fa.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var Ga=/[\t\r\n\f]/g;function Ha(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,Ha(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=Ha(c),d=1===c.nodeType&&(" "+e+" ").replace(Ga," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,Ha(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=Ha(c),d=1===c.nodeType&&(" "+e+" ").replace(Ga," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,Ha(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Ha(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Ha(c)+" ").replace(Ga," ").indexOf(b)>-1)return!0;return!1}});var Ia=/\r/g,Ja=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(Ia,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(Ja," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){return r.isArray(b)?a.checked=r.inArray(r(a).val(),b)>-1:void 0}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var Ka=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!Ka.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,Ka.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?r.event.trigger(a,b,c,!0):void 0}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var La=a.location,Ma=r.now(),Na=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var Oa=/\[\]$/,Pa=/\r?\n/g,Qa=/^(?:submit|button|image|reset|file)$/i,Ra=/^(?:input|select|textarea|keygen)/i;function Sa(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||Oa.test(a)?d(a,e):Sa(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Sa(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Sa(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&Ra.test(this.nodeName)&&!Qa.test(a)&&(this.checked||!aa.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(Pa,"\r\n")}}):{name:b.name,value:c.replace(Pa,"\r\n")}}).get()}});var Ta=/%20/g,Ua=/#.*$/,Va=/([?&])_=[^&]*/,Wa=/^(.*?):[ \t]*([^\r\n]*)$/gm,Xa=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ya=/^(?:GET|HEAD)$/,Za=/^\/\//,$a={},_a={},ab="*/".concat("*"),bb=d.createElement("a");bb.href=La.href;function cb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function db(a,b,c,d){var e={},f=a===_a;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function eb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function fb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function gb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:La.href,type:"GET",isLocal:Xa.test(La.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ab,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?eb(eb(a,r.ajaxSettings),b):eb(r.ajaxSettings,a)},ajaxPrefilter:cb($a),ajaxTransport:cb(_a),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Wa.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||La.href)+"").replace(Za,La.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=bb.protocol+"//"+bb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),db($a,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Ya.test(o.type),f=o.url.replace(Ua,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Ta,"+")):(n=o.url.slice(f.length),o.data&&(f+=(Na.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Va,""),n=(Na.test(f)?"&":"?")+"_="+Ma++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+ab+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=db(_a,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=fb(o,y,d)),v=gb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d, +d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var hb={0:200,1223:204},ib=r.ajaxSettings.xhr();o.cors=!!ib&&"withCredentials"in ib,o.ajax=ib=!!ib,r.ajaxTransport(function(b){var c,d;return o.cors||ib&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(hb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + +