Showing preview only (9,631K chars total). Download the full file or copy to clipboard to get everything.
Repository: criticalstack/quake-kube
Branch: master
Commit: e1a940961fc5
Files: 41
Total size: 9.2 MB
Directory structure:
gitextract_5gtct1k9/
├── .dockerignore
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── push-image.yaml
│ └── test.yaml
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── cmd/
│ └── q3/
│ ├── app/
│ │ ├── cmd/
│ │ │ └── cmd.go
│ │ ├── content/
│ │ │ └── content.go
│ │ ├── proxy/
│ │ │ └── proxy.go
│ │ └── server/
│ │ └── server.go
│ └── main.go
├── config.yaml
├── example.yaml
├── go.mod
├── go.sum
├── internal/
│ ├── quake/
│ │ ├── client/
│ │ │ ├── proxy.go
│ │ │ ├── router.go
│ │ │ └── server.go
│ │ ├── content/
│ │ │ ├── download.go
│ │ │ ├── files.go
│ │ │ ├── maps.go
│ │ │ ├── router.go
│ │ │ └── router_test.go
│ │ ├── net/
│ │ │ └── net.go
│ │ └── server/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── eula.go
│ │ └── server.go
│ └── util/
│ ├── exec/
│ │ └── exec.go
│ └── net/
│ ├── http/
│ │ └── http.go
│ └── net.go
├── public/
│ ├── browserconfig.xml
│ ├── game.css
│ ├── index.html
│ ├── ioquake3.js
│ ├── manifest.json
│ └── zz_generated.static.go
└── tools/
└── genstatic.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
bin
chart
tools
================================================
FILE: .gitattributes
================================================
public/ioquake3.js linguist-vendored
================================================
FILE: .github/workflows/push-image.yaml
================================================
name: Push Image
on:
push:
# Sequence of patterns matched against refs/tags
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
jobs:
push:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Prepare
id: prep
run: |
DOCKER_IMAGE=criticalstack/quake
VERSION=noop
if [ "${{ github.event_name }}" = "schedule" ]; then
VERSION=nightly
elif [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
elif [[ $GITHUB_REF == refs/heads/* ]]; then
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then
VERSION=edge
fi
elif [[ $GITHUB_REF == refs/pull/* ]]; then
VERSION=pr-${{ github.event.number }}
fi
TAGS="${DOCKER_IMAGE}:${VERSION}"
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
MINOR=${VERSION%.*}
MAJOR=${MINOR%.*}
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:latest"
elif [ "${{ github.event_name }}" = "push" ]; then
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}"
fi
echo ::set-output name=version::${VERSION}
echo ::set-output name=tags::${TAGS}
echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.prep.outputs.tags }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
================================================
FILE: .github/workflows/test.yaml
================================================
name: Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install golang
uses: actions/setup-go@v2
with:
go-version: '^1.13.1' # The Go version to download (if necessary) and use.
- name: Run tests
run: |
make test
================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
vendor/
bin/
================================================
FILE: Dockerfile
================================================
FROM golang:1.13 as builder
WORKDIR /workspace
COPY go.mod go.mod
COPY go.sum go.sum
ARG GOPROXY
ARG GOSUMDB
RUN go mod download
COPY cmd cmd/
COPY internal internal/
COPY public public/
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on taskset -c 1 /usr/local/go/bin/go build -a -o q3 ./cmd/q3
FROM alpine:3.12 as quake-n-bake
RUN apk add --no-cache git gcc make libc-dev
RUN git clone https://github.com/ioquake/ioq3
RUN cd /ioq3 && make BUILD_MISSIONPACK=0 BUILD_BASEGAME=0 BUILD_CLIENT=0 BUILD_SERVER=1 BUILD_GAME_SO=0 BUILD_GAME_QVM=0 BUILD_RENDERER_OPENGL2=0 BUILD_STANDALONE=1
RUN cp /ioq3/build/release-linux-$(uname -m)/ioq3ded.$(uname -m) /usr/local/bin/ioq3ded
FROM alpine:3.12
COPY --from=builder /workspace/q3 /usr/local/bin
COPY --from=quake-n-bake /usr/local/bin/ioq3ded /usr/local/bin
COPY --from=quake-n-bake /lib/ld-musl-*.so.1 /lib
ENTRYPOINT ["/usr/local/bin/q3"]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
BIN_DIR ?= bin
LDFLAGS := -s -w
GOFLAGS = -gcflags "all=-trimpath=$(PWD)" -asmflags "all=-trimpath=$(PWD)"
GO_BUILD_ENV_VARS := GO111MODULE=on CGO_ENABLED=0
q3: gen
@$(GO_BUILD_ENV_VARS) go build -o $(BIN_DIR)/q3 $(GOFLAGS) -ldflags '$(LDFLAGS)' ./cmd/q3
gen: ## Generate and embed templates
@go run tools/genstatic.go public public
VERSION ?= latest
IMAGE ?= docker.io/criticalstack/quake:$(VERSION)
.PHONY: build
build:
@docker build . --force-rm --build-arg GOPROXY --build-arg GOSUMDB -t $(IMAGE)
.PHONY: buildx
buildx:
@docker buildx build . --platform=linux/amd64,linux/arm64 --progress=auto -t $(IMAGE) --push
.PHONY: test
test:
@go test -v ./internal/...
================================================
FILE: README.md
================================================
# Due to changes in the priorities, this project is currently not being supported. The project is archived as of 11/17/21 and will be available in a read-only state. Please note, since archival, the project is not maintained or reviewed. #

# QuakeKube
QuakeKube is a Kubernetes-ified version of [QuakeJS](https://github.com/inolen/quakejs) that runs a dedicated [Quake 3](https://en.wikipedia.org/wiki/Quake_III_Arena) server in a Kubernetes Deployment, and then allow clients to connect via QuakeJS in the browser.
## Quick start
### With an existing K8s cluster
Deploy the example manifest:
```shell
$ kubectl apply -f https://raw.githubusercontent.com/criticalstack/quake-kube/master/example.yaml
```
### Without an existing K8s cluster
Start an instance of Kubernetes locally using [cinder](https://docs.crit.sh/cinder-guide/what-is-cinder.html) (or [kind](https://kind.sigs.k8s.io/)):
```shell
$ cinder create cluster
```
Deploy the example manifest:
```shell
$ kubectl apply -f example.yaml
```
Finally, navigate to `http://$(cinder get ip):30001` in the browser.
## How it works
QuakeKube makes use of [ioquake](https://www.ioquake.org) for the Quake 3 dedicated server, and [QuakeJS](https://github.com/inolen/quakejs), a port of ioquake to javascript using [Emscripten](http://github.com/kripken/emscripten), to provide an in-browser game client.
### Networking
The client/server protocol of Quake 3 uses UDP to synchronize game state. Browsers do not natively support sending UDP packets so QuakeJS wraps the client and dedicated server net code in websockets, allowing the browser-based clients to send messages and enable multiplayer for other clients. This ends up preventing the browser client from using any other Quake 3 dedicated server. In order to use other Quake 3 dedicated servers, a proxy handles websocket traffic coming from browser clients and translates that into UDP to the backend. This gives the flexibility of being able to talk to other existing Quake 3 servers, but also allows using ioquake (instead of the javascript translation of it), which uses *considerably* less CPU and memory.
QuakeKube also uses a cool trick with [cmux](https://github.com/cockroachdb/cmux) to multiplex the client and websocket traffic into the same connection. Having all the traffic go through the same address makes routing a client to its backend much easier (since it can just use its `document.location.host`).
### Quake 3 demo EULA
The Quake 3 dedicated server requires an End-User License Agreement be agreed to by the user before distributing the Quake 3 demo files that are used (maps, textures, etc). To ensure that the installer is aware of, and agrees to, this EULA, the flag `--agree-eula` must be passed to `q3 server` at runtime. This flag is not set by default in the container image and is therefore required for the dedicated server to pass the prompt for EULA. The [example.yaml](example.yaml) manifest demonstrates usage of this flag to agree to the EULA.
## Configuration
The server and maps are configured via ConfigMap that is mounted to the container:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quake3-server-config
data:
config.yaml: |
fragLimit: 25
timeLimit: 15m
game:
motd: "Welcome to Critical Stack"
type: FreeForAll
forceRespawn: false
inactivity: 10m
quadFactor: 3
weaponRespawn: 3
server:
hostname: "quakekube"
maxClients: 12
password: "changeme"
maps:
- name: q3dm7
type: FreeForAll
- name: q3dm17
type: FreeForAll
- name: q3wctf1
type: CaptureTheFlag
captureLimit: 8
- name: q3tourney2
type: Tournament
- name: q3wctf3
type: CaptureTheFlag
captureLimit: 8
- name: ztn3tourney1
type: Tournament
```
The time limit and frag limit can be specified with each map (it will change it for subsequent maps in the list):
```yaml
- name: q3dm17
type: FreeForAll
fragLimit: 30
timeLimit: 30
```
Capture limit for CTF maps can also be configured:
```yaml
- name: q3wctf3
type: CaptureTheFlag
captureLimit: 8
```
Any commands not captured by the config yaml can be specified in the `commands` section:
```yaml
commands:
- seta g_inactivity 600
- seta sv_timeout 120
```
### Add bots
Bots can be added individually to map rotations using the `commands` section of the config:
```yaml
commands:
- addbot crash 1
- addbot sarge 2
```
The `addbot` server command requires the name of the bot and skill level (crash and sarge are a couple of the built-in bots).
Another way to add bots is by setting a minimum number of players to allow the server to add bots up to a certain value (removed when human players join):
```yaml
bot:
minPlayers: 8
game:
singlePlayerSkill: 2
```
`singlePlayerSkill` can be used to set the skill level of the automatically added bots (2 is the default skill level).
### Setting a password
A password should be set for the server to allow remote administration and is found in the server configuration settings:
```yaml
server:
password: "changeme"
```
This will allow clients to use `\rcon changeme <cmd>` to remotely administrate the server. To create a password that must be provided by clients to connect:
```yaml
game:
password: "letmein"
```
This will add an additional dialog to the in-browser client to accept the password. It will only appear if the server indicates it needs a password.
### Add custom maps
The content server hosts a small upload app to allow uploading `pk3` or `zip` files containing maps. The content server in the [example.yaml](example.yaml) shares a volume with the game server, effectively "side-loading" the map content, however, in the future the game server will introspect into the maps and make sure that it can fulfill the users map configuration before starting.
### Development
The easiest way to develop quake-kube is building the binary locally with `make` and running it directly. This only requires that you have the `ioq3ded` binary in your path:
```shell
$ bin/q3 server -c config.yaml --assets-dir $HOME/.q3a --agree-eula
```
### Multi-platform images
Container images are being cross-compiled with [Docker Buildx](https://docs.docker.com/buildx/working-with-buildx/) so it can run on hardware with different architectures and operating systems. Currently, it is building for `linux/amd64` and `linux/arm64`. While not specifically compiling to the macOS platform (`darwin/amd64`) QuakeKube should also work on macOS and maybe even Windows. This is due to the fact that they both use a linux VM to provide container support.
Docker Buildx uses [QEMU](https://www.qemu.org/) to virtualize non-native platforms, which has unfortunately had long-running issues running the Go compiler:
* [golang/go#24656](https://github.com/golang/go/issues/24656)
* [https://bugs.launchpad.net/qemu/+bug/1696773](https://bugs.launchpad.net/qemu/+bug/1696773)
This issue is circumvented by ensuring that the Go compiler does not run across multiple hardware threads, which is why the affinity is being limited in the Dockerfile.
## Credits
* [inolen/quakejs](https://github.com/inolen/quakejs) - The really awesome QuakeJS project that makes this possible.
* [ioquake/ioq3](https://github.com/ioquake/ioq3) - The community supported version of Quake 3 used by QuakeJS. It is licensed under the GPLv2.
* [begleysm/quakejs](https://github.com/begleysm/quakejs) - Information in the README.md (very helpful) was used as a guide, as well as, some forked assets of this project (which came from quakejs-web originally) were used.
* [joz3d.net](http://www.joz3d.net/html/q3console.html) - Useful information about configuration values.
================================================
FILE: cmd/q3/app/cmd/cmd.go
================================================
package cmd
import "github.com/spf13/cobra"
func NewCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "cmd",
Short: "send remote server commands",
RunE: func(cmd *cobra.Command, args []string) error {
return nil
},
}
return cmd
}
================================================
FILE: cmd/q3/app/content/content.go
================================================
package content
import (
"fmt"
"net/http"
"net/url"
"os"
"path/filepath"
"time"
"github.com/spf13/cobra"
quakecontent "github.com/criticalstack/quake-kube/internal/quake/content"
)
var opts struct {
Addr string
AssetsDir string
SeedContentURL string
}
func NewCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "content",
Short: "q3 content server",
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) (err error) {
if !filepath.IsAbs(opts.AssetsDir) {
opts.AssetsDir, err = filepath.Abs(opts.AssetsDir)
if err != nil {
return err
}
}
if err := os.MkdirAll(opts.AssetsDir, 0755); err != nil {
return err
}
if opts.SeedContentURL != "" {
u, err := url.Parse(opts.SeedContentURL)
if err != nil {
return err
}
if err := quakecontent.CopyAssets(u, opts.AssetsDir); err != nil {
return err
}
}
e, err := quakecontent.NewRouter(&quakecontent.Config{
AssetsDir: opts.AssetsDir,
})
if err != nil {
return err
}
s := &http.Server{
Addr: opts.Addr,
Handler: e,
ReadTimeout: 600 * time.Second,
WriteTimeout: 600 * time.Second,
MaxHeaderBytes: 1 << 20,
}
fmt.Printf("Starting server %s\n", opts.Addr)
return s.ListenAndServe()
},
}
cmd.Flags().StringVarP(&opts.Addr, "addr", "a", ":9090", "address <host>:<port>")
cmd.Flags().StringVarP(&opts.AssetsDir, "assets-dir", "d", "assets", "assets directory")
cmd.Flags().StringVar(&opts.SeedContentURL, "seed-content-url", "", "seed content from another content server")
return cmd
}
================================================
FILE: cmd/q3/app/proxy/proxy.go
================================================
package proxy
import (
"fmt"
"net/http"
"github.com/spf13/cobra"
quakeclient "github.com/criticalstack/quake-kube/internal/quake/client"
netutil "github.com/criticalstack/quake-kube/internal/util/net"
)
var opts struct {
ClientAddr string
ServerAddr string
ContentServer string
}
func NewCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "proxy",
Short: "q3 websocket/udp proxy",
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
if opts.ClientAddr == "" {
hostIPv4, err := netutil.DetectHostIPv4()
if err != nil {
return err
}
opts.ClientAddr = fmt.Sprintf("%s:8080", hostIPv4)
}
p, err := quakeclient.NewProxy(opts.ServerAddr)
if err != nil {
return err
}
s := http.Server{
Addr: opts.ClientAddr,
Handler: p,
}
return s.ListenAndServe()
},
}
cmd.Flags().StringVarP(&opts.ClientAddr, "client-addr", "c", "", "client address <host>:<port>")
cmd.Flags().StringVarP(&opts.ServerAddr, "server-addr", "s", "", "dedicated server <host>:<port>")
return cmd
}
================================================
FILE: cmd/q3/app/server/server.go
================================================
package server
import (
"context"
"fmt"
"net/url"
"time"
"github.com/pkg/errors"
"github.com/spf13/cobra"
quakeclient "github.com/criticalstack/quake-kube/internal/quake/client"
"github.com/criticalstack/quake-kube/internal/quake/content"
quakeserver "github.com/criticalstack/quake-kube/internal/quake/server"
httputil "github.com/criticalstack/quake-kube/internal/util/net/http"
"github.com/criticalstack/quake-kube/public"
)
var opts struct {
ClientAddr string
ServerAddr string
ContentServer string
AcceptEula bool
AssetsDir string
ConfigFile string
WatchInterval time.Duration
}
func NewCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "server",
Short: "q3 server",
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
csurl, err := url.Parse(opts.ContentServer)
if err != nil {
return err
}
if !opts.AcceptEula {
fmt.Println(quakeserver.Q3DemoEULA)
return errors.New("You must agree to the EULA to continue")
}
if err := httputil.GetUntil(opts.ContentServer, ctx.Done()); err != nil {
return err
}
// TODO(chrism): only download what is in map config
if err := content.CopyAssets(csurl, opts.AssetsDir); err != nil {
return err
}
go func() {
s := quakeserver.Server{
Dir: opts.AssetsDir,
WatchInterval: opts.WatchInterval,
ConfigFile: opts.ConfigFile,
Addr: opts.ServerAddr,
}
if err := s.Start(ctx); err != nil {
panic(err)
}
}()
e, err := quakeclient.NewRouter(&quakeclient.Config{
ContentServerURL: opts.ContentServer,
ServerAddr: opts.ServerAddr,
Files: public.Files,
})
if err != nil {
return err
}
s := &quakeclient.Server{
Addr: opts.ClientAddr,
Handler: e,
ServerAddr: opts.ServerAddr,
}
fmt.Printf("Starting server %s\n", opts.ClientAddr)
return s.ListenAndServe()
},
}
cmd.Flags().StringVarP(&opts.ConfigFile, "config", "c", "", "server configuration file")
cmd.Flags().StringVar(&opts.ContentServer, "content-server", "http://content.quakejs.com", "content server url")
cmd.Flags().BoolVar(&opts.AcceptEula, "agree-eula", false, "agree to the Quake 3 demo EULA")
cmd.Flags().StringVar(&opts.AssetsDir, "assets-dir", "assets", "location for game files")
cmd.Flags().StringVar(&opts.ClientAddr, "client-addr", "0.0.0.0:8080", "client address <host>:<port>")
cmd.Flags().StringVar(&opts.ServerAddr, "server-addr", "0.0.0.0:27960", "dedicated server <host>:<port>")
cmd.Flags().DurationVar(&opts.WatchInterval, "watch-interval", 15*time.Second, "dedicated server <host>:<port>")
return cmd
}
================================================
FILE: cmd/q3/main.go
================================================
package main
import (
"log"
"github.com/spf13/cobra"
q3cmd "github.com/criticalstack/quake-kube/cmd/q3/app/cmd"
q3content "github.com/criticalstack/quake-kube/cmd/q3/app/content"
q3proxy "github.com/criticalstack/quake-kube/cmd/q3/app/proxy"
q3server "github.com/criticalstack/quake-kube/cmd/q3/app/server"
)
var global struct {
Verbosity int
}
func main() {
cmd := &cobra.Command{
Use: "q3",
Short: "",
}
cmd.AddCommand(
q3cmd.NewCommand(),
q3content.NewCommand(),
q3proxy.NewCommand(),
q3server.NewCommand(),
)
cmd.PersistentFlags().CountVarP(&global.Verbosity, "verbose", "v", "log output verbosity")
if err := cmd.Execute(); err != nil {
log.Fatal(err)
}
}
================================================
FILE: config.yaml
================================================
fragLimit: 25
timeLimit: 15m
bot:
minPlayers: 3
game:
motd: "Welcome to Critical Stack"
type: FreeForAll
forceRespawn: false
inactivity: 10m
#password: "letmein"
quadFactor: 3
weaponRespawn: 3
server:
hostname: "quakekube"
maxClients: 16
password: "changeme"
commands:
- addbot sarge 2
maps:
- name: q3dm7
type: FreeForAll
timeLimit: 10m
- name: q3dm17
type: FreeForAll
- name: q3wctf1
type: CaptureTheFlag
captureLimit: 8
- name: q3tourney2
type: Tournament
- name: q3wctf3
type: CaptureTheFlag
captureLimit: 8
- name: ztn3tourney1
type: Tournament
================================================
FILE: example.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
name: quake
spec:
selector:
matchLabels:
run: quake
replicas: 1
template:
metadata:
labels:
run: quake
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '8080'
spec:
containers:
- command:
- q3
- server
- --config=/config/config.yaml
- --content-server=http://127.0.0.1:9090
- --agree-eula
image: docker.io/criticalstack/quake:latest
name: server
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
volumeMounts:
- name: quake3-server-config
mountPath: /config
- name: quake3-content
mountPath: /assets
- command:
- q3
- content
- --seed-content-url=http://content.quakejs.com
image: docker.io/criticalstack/quake:latest
name: content-server
ports:
- containerPort: 9090
volumeMounts:
- name: quake3-content
mountPath: /assets
volumes:
- name: quake3-server-config
configMap:
name: quake3-server-config
- name: quake3-content
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: quake
spec:
type: NodePort
selector:
run: quake
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
name: client
- port: 27960
targetPort: 27960
nodePort: 30003
name: server
- port: 9090
targetPort: 9090
nodePort: 30002
name: content
---
apiVersion: v1
kind: ConfigMap
metadata:
name: quake3-server-config
data:
config.yaml: |
fragLimit: 25
timeLimit: 15m
bot:
minPlayers: 3
game:
motd: "Welcome to Critical Stack"
type: FreeForAll
forceRespawn: false
inactivity: 10m
quadFactor: 3
weaponRespawn: 3
server:
hostname: "quakekube"
maxClients: 12
password: "changeme"
commands:
- addbot sarge 2
maps:
- name: q3dm7
type: FreeForAll
timeLimit: 10m
- name: q3dm17
type: FreeForAll
- name: q3wctf1
type: CaptureTheFlag
captureLimit: 8
- name: q3tourney2
type: Tournament
- name: q3wctf3
type: CaptureTheFlag
captureLimit: 8
- name: ztn3tourney1
type: Tournament
================================================
FILE: go.mod
================================================
module github.com/criticalstack/quake-kube
go 1.14
require (
github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292
github.com/google/go-cmp v0.3.0
github.com/gorilla/websocket v1.4.0
github.com/labstack/echo/v4 v4.1.16
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v0.9.3
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c // indirect
github.com/spf13/cobra v1.0.0
k8s.io/apimachinery v0.18.6
sigs.k8s.io/yaml v1.2.0
)
================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292 h1:dzj1/xcivGjNPwwifh/dWTczkwcuqsXXFHY1X/TZMtw=
github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o=
github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI=
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c h1:XLPw6rny9Vrrvrzhw8pNLrC2+x/kH0a/3gOx5xWDa6Y=
github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4=
github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
k8s.io/apimachinery v0.18.6 h1:RtFHnfGNfd1N0LeSrKCUznz5xtUP1elRGvHJbL3Ntag=
k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
================================================
FILE: internal/quake/client/proxy.go
================================================
package client
import (
"bytes"
"context"
"fmt"
"log"
"net"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var DefaultUpgrader = &websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
type WebsocketUDPProxy struct {
Upgrader *websocket.Upgrader
addr net.Addr
}
func NewProxy(addr string) (*WebsocketUDPProxy, error) {
raddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
return nil, err
}
return &WebsocketUDPProxy{addr: raddr}, nil
}
func (w *WebsocketUDPProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
upgrader := w.Upgrader
if w.Upgrader == nil {
upgrader = DefaultUpgrader
}
upgradeHeader := http.Header{}
if hdr := req.Header.Get("Sec-Websocket-Protocol"); hdr != "" {
upgradeHeader.Set("Sec-Websocket-Protocol", hdr)
}
ws, err := upgrader.Upgrade(rw, req, upgradeHeader)
if err != nil {
log.Printf("wsproxy: couldn't upgrade %v", err)
return
}
defer ws.Close()
backend, err := net.ListenPacket("udp", "0.0.0.0:0")
if err != nil {
return
}
defer backend.Close()
errc := make(chan error, 1)
go func() {
for {
_, msg, err := ws.ReadMessage()
if err != nil {
m := websocket.FormatCloseMessage(websocket.CloseNormalClosure, fmt.Sprintf("%v", err))
if e, ok := err.(*websocket.CloseError); ok {
if e.Code != websocket.CloseNoStatusReceived {
m = websocket.FormatCloseMessage(e.Code, e.Text)
}
}
errc <- err
ws.WriteMessage(websocket.CloseMessage, m)
return
}
if bytes.HasPrefix(msg, []byte("\xff\xff\xff\xffport")) {
continue
}
if err := backend.SetWriteDeadline(time.Now().Add(5 * time.Second)); err != nil {
errc <- err
return
}
_, err = backend.WriteTo(msg, w.addr)
if err != nil {
errc <- err
return
}
}
}()
go func() {
buffer := make([]byte, 1024*1024)
for {
n, _, err := backend.ReadFrom(buffer)
if err != nil {
errc <- err
return
}
if err := ws.WriteMessage(websocket.BinaryMessage, buffer[:n]); err != nil {
errc <- err
return
}
}
}()
select {
case err = <-errc:
if e, ok := err.(*websocket.CloseError); !ok || e.Code == websocket.CloseAbnormalClosure {
log.Printf("wsproxy: %v", err)
}
case <-ctx.Done():
return
}
}
================================================
FILE: internal/quake/client/router.go
================================================
package client
import (
"html/template"
"io"
"io/ioutil"
"net/http"
"net/url"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/prometheus/client_golang/prometheus/promhttp"
quakenet "github.com/criticalstack/quake-kube/internal/quake/net"
)
type Config struct {
ContentServerURL string
ServerAddr string
Files http.FileSystem
}
func NewRouter(cfg *Config) (*echo.Echo, error) {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"*"},
AllowHeaders: []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept},
}))
f, err := cfg.Files.Open("index.html")
if err != nil {
return nil, err
}
defer f.Close()
data, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
templates, err := template.New("index").Parse(string(data))
if err != nil {
return nil, err
}
e.Renderer = &TemplateRenderer{templates}
// default route
e.GET("/", func(c echo.Context) error {
m, err := quakenet.GetInfo(cfg.ServerAddr)
if err != nil {
return err
}
needsPass := false
if v, ok := m["g_needpass"]; ok {
if v == "1" {
needsPass = true
}
}
return c.Render(http.StatusOK, "index", map[string]interface{}{
"ServerAddr": cfg.ServerAddr,
"NeedsPass": needsPass,
})
})
e.GET("/metrics", echo.WrapHandler(promhttp.Handler()))
e.GET("/info", func(c echo.Context) error {
m, err := quakenet.GetInfo(cfg.ServerAddr)
if err != nil {
return err
}
return c.JSON(http.StatusOK, m)
})
e.GET("/status", func(c echo.Context) error {
m, err := quakenet.GetStatus(cfg.ServerAddr)
if err != nil {
return err
}
return c.JSON(http.StatusOK, m)
})
// static files
e.GET("/*", echo.WrapHandler(http.FileServer(cfg.Files)))
// Quake3 assets requests must be proxied to the content server. The host
// header is manipulated to ensure that services like CloudFlare will not
// reject requests based upon incorrect host header.
csurl, err := url.Parse(cfg.ContentServerURL)
if err != nil {
return nil, err
}
g := e.Group("/assets")
g.Use(middleware.ProxyWithConfig(middleware.ProxyConfig{
Balancer: middleware.NewRoundRobinBalancer([]*middleware.ProxyTarget{
{URL: csurl},
}),
Transport: &HostHeaderTransport{RoundTripper: http.DefaultTransport, Host: csurl.Host},
}))
return e, nil
}
type HostHeaderTransport struct {
http.RoundTripper
Host string
}
func (t *HostHeaderTransport) RoundTrip(req *http.Request) (*http.Response, error) {
req.Host = t.Host
return t.RoundTripper.RoundTrip(req)
}
type TemplateRenderer struct {
*template.Template
}
func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.ExecuteTemplate(w, name, data)
}
================================================
FILE: internal/quake/client/server.go
================================================
package client
import (
"net"
"net/http"
"time"
"github.com/cockroachdb/cmux"
)
type Server struct {
Addr string
Handler http.Handler
ServerAddr string
}
func (s *Server) Serve(l net.Listener) error {
m := cmux.New(l)
websocketL := m.Match(cmux.HTTP1HeaderField("Upgrade", "websocket"))
httpL := m.Match(cmux.Any())
go func() {
s := &http.Server{
Addr: s.Addr,
Handler: s.Handler,
ReadTimeout: 5 * time.Minute,
WriteTimeout: 5 * time.Minute,
MaxHeaderBytes: 1 << 20,
}
if err := s.Serve(httpL); err != cmux.ErrListenerClosed {
panic(err)
}
}()
host, port, err := net.SplitHostPort(s.ServerAddr)
if err != nil {
return err
}
proxyTarget := s.ServerAddr
if net.ParseIP(host).IsUnspecified() {
// handle case where host is 0.0.0.0
proxyTarget = net.JoinHostPort("127.0.0.1", port)
}
wsproxy, err := NewProxy(proxyTarget)
if err != nil {
return err
}
go func() {
s := &http.Server{
Handler: wsproxy,
}
if err := s.Serve(websocketL); err != cmux.ErrListenerClosed {
panic(err)
}
}()
return m.Serve()
}
func (s *Server) ListenAndServe() error {
l, err := net.Listen("tcp", s.Addr)
if err != nil {
return err
}
return s.Serve(l)
}
================================================
FILE: internal/quake/content/download.go
================================================
package content
import (
"archive/tar"
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/url"
"os"
"path/filepath"
"strings"
httputil "github.com/criticalstack/quake-kube/internal/util/net/http"
"github.com/pkg/errors"
)
func CopyAssets(u *url.URL, dir string) error {
url := strings.TrimSuffix(u.String(), "/")
files, err := getManifest(url)
if err != nil {
return err
}
for _, f := range files {
path := filepath.Join(dir, f.Name)
if _, err := os.Stat(path); !os.IsNotExist(err) {
continue
}
data, err := httputil.GetBody(url + fmt.Sprintf("/assets/%d-%s", f.Checksum, f.Name))
if err != nil {
return err
}
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
if err := ioutil.WriteFile(path, data, 0644); err != nil {
return err
}
if strings.HasPrefix(f.Name, "linuxq3ademo") {
if err := extractDemoPack(path, dir); err != nil {
return err
}
}
if strings.HasPrefix(f.Name, "linuxq3apoint") {
if err := extractPointPacks(path, dir); err != nil {
return err
}
}
}
return nil
}
func getManifest(url string) ([]*File, error) {
data, err := httputil.GetBody(url + "/assets/manifest.json")
if err != nil {
return nil, err
}
files := make([]*File, 0)
if err := json.Unmarshal(data, &files); err != nil {
return nil, errors.Wrapf(err, "cannot unmarshal %s/assets/manifest.json", url)
}
return files, nil
}
var gzipMagicHeader = []byte{'\x1f', '\x8b'}
func extractDemoPack(path, dir string) error {
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
idx := bytes.Index(data, gzipMagicHeader)
data = data[idx:]
gr, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
return err
}
defer gr.Close()
data, err = ioutil.ReadAll(gr)
if err != nil {
return err
}
tr := tar.NewReader(bytes.NewReader(data))
for {
hdr, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
if strings.HasSuffix(hdr.Name, ".pk3") {
fmt.Printf("Downloaded %s\n", hdr.Name)
data, err := ioutil.ReadAll(tr)
if err != nil {
return err
}
path := filepath.Join(dir, "baseq3", filepath.Base(hdr.Name))
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
if err := ioutil.WriteFile(path, data, 0644); err != nil {
return err
}
}
}
return nil
}
func extractPointPacks(path, dir string) error {
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
idx := bytes.Index(data, gzipMagicHeader)
data = data[idx:]
gr, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
return err
}
defer gr.Close()
data, err = ioutil.ReadAll(gr)
if err != nil {
return err
}
tr := tar.NewReader(bytes.NewReader(data))
for {
hdr, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
if strings.HasSuffix(hdr.Name, ".pk3") {
fmt.Printf("Downloaded %s\n", hdr.Name)
data, err := ioutil.ReadAll(tr)
if err != nil {
return err
}
path := filepath.Join(dir, hdr.Name)
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
if err := ioutil.WriteFile(path, data, 0644); err != nil {
return err
}
}
}
return nil
}
================================================
FILE: internal/quake/content/files.go
================================================
package content
import (
"hash/crc32"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
type File struct {
Name string `json:"name"`
Compressed int64 `json:"compressed"`
Checksum uint32 `json:"checksum"`
}
func getAssets(dir string) (files []*File, err error) {
err = walk(dir, func(path string, info os.FileInfo, err error) error {
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
n := crc32.ChecksumIEEE(data)
path = strings.TrimPrefix(path, dir+"/")
files = append(files, &File{path, info.Size(), n})
return nil
}, ".pk3", ".sh", ".run")
return
}
func hasExts(path string, exts ...string) bool {
for _, ext := range exts {
if strings.HasSuffix(path, ext) {
return true
}
}
return false
}
func walk(root string, walkFn filepath.WalkFunc, exts ...string) error {
return filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
if os.IsPermission(err) {
return nil
}
return err
}
if !hasExts(path, exts...) {
return nil
}
if info.IsDir() {
return nil
}
return walkFn(path, info, err)
})
}
================================================
FILE: internal/quake/content/maps.go
================================================
package content
import (
"archive/zip"
"os"
"path/filepath"
"strings"
)
type Map struct {
File string `json:"file"`
Name string `json:"name"`
}
func getMaps(dir string) (result []*Map, err error) {
err = walk(dir, func(path string, info os.FileInfo, err error) error {
mp, err := OpenMapPack(path)
if err != nil {
return err
}
defer mp.Close()
maps, err := mp.Maps()
if err != nil {
return err
}
result = append(result, maps...)
return err
}, ".pk3")
return
}
type MapPack struct {
*os.File
*zip.Reader
path string
}
func OpenMapPack(path string) (*MapPack, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
info, err := f.Stat()
if err != nil {
return nil, err
}
r, err := zip.NewReader(f, info.Size())
if err != nil {
return nil, err
}
mp := &MapPack{
File: f,
Reader: r,
path: path,
}
return mp, nil
}
func (m *MapPack) Maps() ([]*Map, error) {
maps := make([]*Map, 0)
for _, f := range m.Reader.File {
if !hasExts(f.Name, ".bsp") {
continue
}
path := filepath.Join(filepath.Base(filepath.Dir(m.path)), filepath.Base(m.path))
mapName := strings.TrimSuffix(filepath.Base(f.Name), ".bsp")
maps = append(maps, &Map{File: path, Name: mapName})
}
return maps, nil
}
================================================
FILE: internal/quake/content/router.go
================================================
package content
import (
"archive/zip"
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
type Config struct {
AssetsDir string
}
func NewRouter(cfg *Config) (*echo.Echo, error) {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
//e.Use(middleware.BodyLimit("100M"))
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"*"},
AllowHeaders: []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept},
}))
e.GET("/", func(c echo.Context) error {
return c.HTML(http.StatusOK, `<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Map pack upload</title>
</head>
<body>
<a href="/maps">Show maps</a>
<h1>Upload map pack file</h1>
<form action="/maps" method="post" enctype="multipart/form-data">
GameName: <input type="text" name="name" value="baseq3" /><br>
Files: <input type="file" name="file"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>`)
})
e.GET("/assets/manifest.json", func(c echo.Context) error {
files, err := getAssets(cfg.AssetsDir)
if err != nil {
return err
}
return c.JSONPretty(http.StatusOK, files, " ")
})
e.GET("/assets/*", func(c echo.Context) error {
path := filepath.Join(cfg.AssetsDir, trimAssetName(c.Param("*")))
if _, err := os.Stat(path); os.IsNotExist(err) {
return c.String(http.StatusNotFound, "file not found")
}
return c.File(path)
})
e.GET("/maps", func(c echo.Context) error {
maps, err := getMaps(cfg.AssetsDir)
if err != nil {
return err
}
return c.JSONPretty(http.StatusOK, maps, " ")
})
e.POST("/maps", func(c echo.Context) error {
name := c.FormValue("name")
file, err := c.FormFile("file")
if err != nil {
return err
}
src, err := file.Open()
if err != nil {
return err
}
defer src.Close()
if hasExts(file.Filename, ".zip") {
r, err := zip.NewReader(src, file.Size)
if err != nil {
return err
}
files := make([]string, 0)
for _, f := range r.File {
if !hasExts(f.Name, ".pk3") {
continue
}
pak, err := f.Open()
if err != nil {
return err
}
defer pak.Close()
dst, err := os.Create(filepath.Join(cfg.AssetsDir, name, filepath.Base(f.Name)))
if err != nil {
return err
}
defer dst.Close()
if _, err = io.Copy(dst, pak); err != nil {
return err
}
files = append(files, filepath.Base(f.Name))
}
if len(files) == 0 {
return c.HTML(http.StatusOK, fmt.Sprintf("<p>File %s did not contain any map pack files.</p>", file.Filename))
}
for i, _ := range files {
files[i] = "<li>" + files[i] + "</li>"
}
return c.HTML(http.StatusOK, fmt.Sprintf("<p>Loaded the following map packs from file %s:</p><ul>%s</ul>", file.Filename, strings.Join(files, "")))
}
dst, err := os.Create(filepath.Join(cfg.AssetsDir, name, file.Filename))
if err != nil {
return err
}
defer dst.Close()
if _, err = io.Copy(dst, src); err != nil {
return err
}
return c.HTML(http.StatusOK, fmt.Sprintf("<p>File %s uploaded successfully.</p>", filepath.Join(name, file.Filename)))
})
return e, nil
}
// trimAssetName returns a path string that has been prefixed with a crc32
// checksum.
func trimAssetName(s string) string {
d, f := filepath.Split(s)
f = f[strings.Index(f, "-")+1:]
return filepath.Join(d, f)
}
================================================
FILE: internal/quake/content/router_test.go
================================================
package content
import (
"testing"
"github.com/google/go-cmp/cmp"
)
func TestTrimAssetName(t *testing.T) {
cases := []struct {
name string
input string
expected string
}{
{
name: "root folder",
input: "857908472-linuxq3ademo-1.11-6.x86.gz.sh",
expected: "linuxq3ademo-1.11-6.x86.gz.sh",
},
{
name: "pak file",
input: "baseq3/2483777038-pak0.pk3",
expected: "baseq3/pak0.pk3",
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
result := trimAssetName(c.input)
if diff := cmp.Diff(c.expected, result); diff != "" {
t.Errorf("content: after trimAssetName differs: (-want +got)\n%s", diff)
}
})
}
}
================================================
FILE: internal/quake/net/net.go
================================================
package net
import (
"bytes"
"fmt"
"net"
"strconv"
"time"
"github.com/pkg/errors"
)
const (
OutOfBandHeader = "\xff\xff\xff\xff"
GetInfoCommand = "getinfo"
GetStatusCommand = "getstatus"
)
func SendCommand(addr, cmd string) ([]byte, error) {
raddr, err := net.ResolveUDPAddr("udp4", addr)
if err != nil {
return nil, err
}
conn, err := net.ListenPacket("udp4", "0.0.0.0:0")
if err != nil {
return nil, err
}
defer conn.Close()
buffer := make([]byte, 1024*1024)
if err := conn.SetDeadline(time.Now().Add(5 * time.Second)); err != nil {
return nil, err
}
n, err := conn.WriteTo([]byte(fmt.Sprintf("%s%s", OutOfBandHeader, cmd)), raddr)
if err != nil {
return nil, err
}
n, _, err = conn.ReadFrom(buffer)
if err != nil {
return nil, err
}
return buffer[:n], nil
}
func parseMap(data []byte) map[string]string {
if i := bytes.Index(data, []byte("\n")); i >= 0 {
data = data[i+1:]
}
data = bytes.TrimPrefix(data, []byte("\\"))
data = bytes.TrimSuffix(data, []byte("\n"))
parts := bytes.Split(data, []byte("\\"))
m := make(map[string]string)
for i := 0; i < len(parts)-1; i += 2 {
m[string(parts[i])] = string(parts[i+1])
}
return m
}
type Player struct {
Name string
Ping int
Score int
}
func parsePlayers(data []byte) ([]Player, error) {
players := make([]Player, 0)
for _, player := range bytes.Split(data, []byte("\n")) {
parts := bytes.SplitN(player, []byte(" "), 3)
if len(parts) != 3 {
continue
}
name, err := strconv.Unquote(string(parts[2]))
if err != nil {
return nil, err
}
ping, err := strconv.Atoi(string(parts[1]))
if err != nil {
return nil, err
}
score, err := strconv.Atoi(string(parts[0]))
if err != nil {
return nil, err
}
players = append(players, Player{
Name: name,
Ping: ping,
Score: score,
})
}
return players, nil
}
func GetInfo(addr string) (map[string]string, error) {
resp, err := SendCommand(addr, GetInfoCommand)
if err != nil {
return nil, err
}
return parseMap(resp), nil
}
type StatusResponse struct {
Configuration map[string]string
Players []Player
}
func GetStatus(addr string) (*StatusResponse, error) {
resp, err := SendCommand(addr, GetStatusCommand)
if err != nil {
return nil, err
}
data := bytes.TrimSuffix(resp, []byte("\n"))
parts := bytes.SplitN(data, []byte("\n"), 3)
switch len(parts) {
case 2:
status := &StatusResponse{
Configuration: parseMap(parts[1]),
Players: make([]Player, 0),
}
return status, nil
case 3:
status := &StatusResponse{
Configuration: parseMap(parts[1]),
}
status.Players, _ = parsePlayers(parts[2])
return status, nil
default:
return nil, errors.Errorf("cannot parse response: %q", resp)
}
}
================================================
FILE: internal/quake/server/config.go
================================================
package server
import (
"bytes"
"fmt"
"reflect"
"strconv"
"strings"
"time"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type GameType int
const (
FreeForAll GameType = 0
Tournament GameType = 1
SinglePlayer GameType = 2
TeamDeathmatch GameType = 3
CaptureTheFlag GameType = 4
)
func (gt GameType) String() string {
switch gt {
case FreeForAll:
return "FreeForAll"
case Tournament:
return "Tournament"
case SinglePlayer:
return "SinglePlayer"
case TeamDeathmatch:
return "TeamDeathmatch"
case CaptureTheFlag:
return "CaptureTheFlag"
default:
return "Unknown"
}
}
func (gt *GameType) UnmarshalText(data []byte) error {
switch string(data) {
case "FreeForAll", "FFA":
*gt = FreeForAll
case "Tournament":
*gt = Tournament
case "SinglePlayer":
*gt = SinglePlayer
case "TeamDeathmatch":
*gt = TeamDeathmatch
case "CaptureTheFlag", "CTF":
*gt = CaptureTheFlag
default:
return errors.Errorf("unknown GameType: %s", data)
}
return nil
}
type Config struct {
FragLimit int `name:"fraglimit"`
TimeLimit metav1.Duration `name:"timelimit"`
BotConfig `json:"bot"`
GameConfig `json:"game"`
FileServerConfig `json:"fs"`
ServerConfig `json:"server"`
Commands []string `json:"commands"`
Maps
}
type BotConfig struct {
MinPlayers int `name:"bot_minplayers"`
NoChat bool `name:"bot_nochat"`
}
type GameConfig struct {
ForceRespawn bool `name:"g_forcerespawn"`
GameType GameType `json:"type" name:"g_gametype"`
Inactivity metav1.Duration `name:"g_inactivity"`
Log string `name:"g_log"`
MOTD string `name:"g_motd"`
Password string `name:"g_password"`
QuadFactor int `name:"g_quadfactor"`
SinglePlayerSkill int `name:"g_spSkill"`
WeaponRespawn int `name:"g_weaponrespawn"`
}
type FileServerConfig struct {
// allows people to base mods upon mods syntax to follow
BaseGame string `name:"fs_basegame"`
// set base path root C:\Program Files\Quake III Arena for files to be
// downloaded from this path may change for TC's and MOD's
BasePath string `name:"fs_basepath"`
// toggle if files can be copied from servers or if client will download
CopyFiles bool `name:"fs_copyfiles"`
// possibly enables file server debug mode for download/uploads or
// something
Debug bool `name:"fs_debug"`
// set gamedir set the game folder/dir default is baseq3
Game string `name:"fs_game"`
// possibly for TC's and MODS the default is the path to quake3.exe
HomePath string `name:"fs_homepath"`
}
type ServerConfig struct {
AllowDownload bool `name:"sv_allowDownload"`
DownloadURL string `name:"sv_dlURL"`
Hostname string `name:"sv_hostname"`
MaxClients int `name:"sv_maxclients"`
Password string `name:"rconpassword"`
}
func (c *Config) Marshal() ([]byte, error) {
return writeStruct(reflect.Indirect(reflect.ValueOf(c)))
}
func writeStruct(v reflect.Value) ([]byte, error) {
if v.Kind() != reflect.Struct {
return nil, errors.Errorf("expected struct, received %T", v.Kind())
}
var b bytes.Buffer
for i := 0; i < v.Type().NumField(); i++ {
fv := v.Field(i)
switch fv.Kind() {
case reflect.Struct:
data, err := writeStruct(fv)
if err != nil {
return nil, err
}
b.Write(data)
case reflect.Slice:
switch val := fv.Interface().(type) {
case Maps:
data, _ := val.Marshal()
b.Write(data)
case []string:
default:
panic(fmt.Errorf("received unknown type %T", val))
}
default:
tv, ok := v.Type().Field(i).Tag.Lookup("name")
if !ok {
continue
}
s := toString(v.Type().Field(i).Name, fv)
switch tv {
case "sv_dlURL":
if s != "" {
b.WriteString(fmt.Sprintf("sets %s %s\n", tv, s))
}
default:
b.WriteString(fmt.Sprintf("seta %s %s\n", tv, strconv.Quote(s)))
}
}
}
for i := 0; i < v.Type().NumField(); i++ {
if v.Type().Field(i).Name == "Commands" {
cmds := v.Field(i).Interface().([]string)
for _, cmd := range cmds {
b.WriteString(cmd)
b.WriteString("\n")
}
}
}
return b.Bytes(), nil
}
func toString(name string, v reflect.Value) string {
switch val := v.Interface().(type) {
case string:
return val
case int:
return strconv.Itoa(val)
case metav1.Duration:
switch name {
case "TimeLimit":
return fmt.Sprintf("%d", int(val.Minutes()))
default:
return fmt.Sprintf("%d", int(val.Seconds()))
}
case bool:
if val {
return "1"
}
return "0"
case GameType:
return fmt.Sprintf("%d", val)
case Maps:
data, _ := val.Marshal()
return string(data)
default:
panic(fmt.Errorf("received unknown type %T", v.Interface()))
}
}
func Default() *Config {
return &Config{
FragLimit: 25,
TimeLimit: metav1.Duration{Duration: 15 * time.Minute},
Commands: []string{},
BotConfig: BotConfig{
NoChat: true,
},
GameConfig: GameConfig{
Log: "",
MOTD: "Welcome to Critical Stack",
QuadFactor: 3,
GameType: FreeForAll,
WeaponRespawn: 3,
Inactivity: metav1.Duration{Duration: 10 * time.Minute},
SinglePlayerSkill: 2,
ForceRespawn: false,
},
ServerConfig: ServerConfig{
MaxClients: 12,
Hostname: "quakekube",
Password: "changeme",
},
Maps: Maps{
{Name: "q3dm7", Type: FreeForAll},
{Name: "q3dm17", Type: FreeForAll},
},
}
}
type Map struct {
Name string `json:"name"`
Type GameType `json:"type"`
CaptureLimit int `json:"captureLimit"`
FragLimit int `json:"fragLimit"`
TimeLimit metav1.Duration `json:"timeLimit"`
}
type Maps []Map
func (maps Maps) Marshal() ([]byte, error) {
var b bytes.Buffer
for i, m := range maps {
cmds := []string{
fmt.Sprintf("g_gametype %d", m.Type),
}
if m.Type == CaptureTheFlag && m.CaptureLimit != 0 {
cmds = append(cmds, fmt.Sprintf("capturelimit %d", m.CaptureLimit))
}
if m.FragLimit != 0 {
cmds = append(cmds, fmt.Sprintf("fraglimit %d", m.FragLimit))
}
if m.TimeLimit.Duration != 0 {
cmds = append(cmds, fmt.Sprintf("timelimit %s", toString("TimeLimit", reflect.ValueOf(m.TimeLimit))))
}
cmds = append(cmds, fmt.Sprintf("map %s", m.Name))
nextmap := "d0"
if i < len(maps)-1 {
nextmap = fmt.Sprintf("d%d", i+1)
}
cmds = append(cmds, fmt.Sprintf("set nextmap vstr %s", nextmap))
b.WriteString(fmt.Sprintf("set d%d \"seta %s\"\n", i, strings.Join(cmds, " ; ")))
}
b.WriteString("vstr d0\n")
return b.Bytes(), nil
}
================================================
FILE: internal/quake/server/config_test.go
================================================
package server
import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"sigs.k8s.io/yaml"
)
const config = `
fragLimit: 25
timeLimit: 15m
game:
motd: "Welcome to Critical Stack"
type: FreeForAll
forceRespawn: false
inactivity: 10m
quadFactor: 3
weaponRespawn: 3
server:
hostname: "quakekube"
maxClients: 12
password: "changeme"
commands:
- seta g_inactivity 600
- seta sv_timeout 120
maps:
- name: q3dm7
type: FreeForAll
- name: q3dm17
type: FreeForAll
- name: q3wctf1
type: CaptureTheFlag
captureLimit: 8
- name: q3tourney2
type: Tournament
- name: q3wctf3
type: CaptureTheFlag
captureLimit: 8
- name: ztn3tourney1
type: Tournament
`
const expectedConfig = `seta fraglimit "25"
seta bot_minplayers "0"
seta bot_nochat "0"
seta g_forcerespawn "0"
seta g_gametype "0"
seta g_log ""
seta g_motd "Welcome to Critical Stack"
seta g_password ""
seta g_quadfactor "3"
seta g_spSkill "0"
seta g_weaponrespawn "3"
seta fs_basegame ""
seta fs_basepath ""
seta fs_copyfiles "0"
seta fs_debug "0"
seta fs_game ""
seta fs_homepath ""
seta sv_allowDownload "0"
seta sv_hostname "quakekube"
seta sv_maxclients "12"
seta rconpassword "changeme"
set d0 "seta g_gametype 0 ; map q3dm7 ; set nextmap vstr d1"
set d1 "seta g_gametype 0 ; map q3dm17 ; set nextmap vstr d2"
set d2 "seta g_gametype 4 ; capturelimit 8 ; map q3wctf1 ; set nextmap vstr d3"
set d3 "seta g_gametype 1 ; map q3tourney2 ; set nextmap vstr d4"
set d4 "seta g_gametype 4 ; capturelimit 8 ; map q3wctf3 ; set nextmap vstr d5"
set d5 "seta g_gametype 1 ; map ztn3tourney1 ; set nextmap vstr d0"
vstr d0
seta g_inactivity 600
seta sv_timeout 120
`
func TestConfigMarshal(t *testing.T) {
var cfg *Config
if err := yaml.Unmarshal([]byte(config), &cfg); err != nil {
t.Fatal(err)
}
data, err := cfg.Marshal()
if err != nil {
t.Fatal(err)
}
fmt.Printf("%s\n", data)
if diff := cmp.Diff(string(data), expectedConfig); diff != "" {
t.Fatalf(diff)
}
}
================================================
FILE: internal/quake/server/eula.go
================================================
package server
const Q3DemoEULA = `LIMITED USE SOFTWARE LICENSE AGREEMENT
This Limited Use Software License Agreement (the "Agreement") is a legal
agreement between you, the end-user, and Id Software, Inc. ("ID"). BY
CONTINUING THE INSTALLATION OF THIS GAME DEMO PROGRAM ENTITLED QUAKE III:
ARENA (THE "SOFTWARE"), BY LOADING OR RUNNING THE SOFTWARE, OR BY PLACING
OR COPYING THE SOFTWARE ONTO YOUR COMPUTER HARD DRIVE, COMPUTER RAM OR
OTHER STORAGE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS
AGREEMENT.
1. Grant of License. Subject to the terms and provisions of this
Agreement, ID grants to you the non-exclusive and limited right to use the
Software only in executable or object code form. The term "Software"
includes all elements of the Software, including, without limitation, data
files and screen displays. You are not receiving any ownership or
proprietary right, title or interest in or to the Software or the
copyright, trademarks, or other rights related thereto. For purposes of
this section, "use" means loading the Software into RAM and/or onto
computer hard drive, as well as installation of the Software on a hard
disk or other storage device and means the uses permitted in section 3.
hereinbelow. You agree that the Software will not be shipped,
transferred or exported into any country in violation of the U.S. Export
Administration Act (or any other law governing such matters) by you or
anyone at your direction and that you will not utilize and will not
authorize anyone to utilize, in any other manner, the Software in
violation of any applicable law. The Software may not be downloaded
or otherwise exported or exported into (or to a national or resident
of) any country to which the U.S. has embargoed goods or to anyone
or into any country who/which are prohibited, by applicable law, from
receiving such property.
2. Prohibitions. You, either directly or indirectly, shall not do
any of the following acts:
a. rent the Software;
b. sell the Software;
c. lease or lend the Software;
d. offer the Software on a "pay-per-play" basis;
e. distribute the Software (except as permitted by section 3.
hereinbelow);
f. in any other manner and through any medium whatsoever
commercially exploit the Software or use the Software for any commercial
purpose;
g. disassemble, reverse engineer, decompile, modify or alter the
Software including, without limitation, creating or developing extra or
add-on levels for the Software;
h. translate the Software;
i. reproduce or copy the Software (except as permitted by section
3. hereinbelow);
j. publicly display the Software;
k. prepare or develop derivative works based upon the Software; or
l. remove or alter any legal notices or other markings or
legends, such as trademark and copyright notices, affixed on or within
the Software.
3. Permitted Distribution and Copying. So long as this Agreement
accompanies each copy you make of the Software, and so long as you fully
comply, at all times, with this Agreement, ID grants to you the
non-exclusive and limited right to copy the Software and to distribute
such copies of the Software free of charge for non-commercial purposes
which shall include the free of charge distribution of copies of the
Software as mounted on the covers of magazines; provided, however, you
shall not copy or distribute the Software in any infringing manner or
in any manner which violates any law or third party right and you shall
not distribute the Software together with any material which is
infringing, libelous, defamatory, obscene, false, misleading, or
otherwise illegal or unlawful. You agree to label conspicuously as
"SHAREWARE" or "DEMO" each CD or other non-electronic copy of the
Software that you make and distribute. ID reserves all rights not
granted in this Agreement. You shall not commercially distribute the
Software unless you first enter into a separate contract with ID, a
copy of which you may request, but which ID may decline to execute.
For more information visit www.quake3arena.com.
4. Intellectual Property Rights. The Software and all copyrights,
trademarks and all other conceivable intellectual property rights related
to the Software are owned by ID and are protected by United States
copyright laws, international treaty provisions and all applicable law,
such as the Lanham Act. You must treat the Software like any other
copyrighted material, as required by 17 U.S.C., §101 et seq. and other
applicable law. You agree to use your best efforts to see that any user
of the Software licensed hereunder complies with this Agreement. You
agree that you are receiving a copy of the Software by license only
and not by sale and that the "first sale" doctrine of 17 U.S.C. §109
does not apply to your receipt or use of the Software.
5. NO WARRANTIES. ID DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS OR
IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT TO THE
SOFTWARE. ID DOES NOT WARRANT THAT THE OPERATION OF THE SOFTWARE WILL BE
UNINTERRUPTED OR ERROR FREE OR THAT THE SOFTWARE WILL MEET YOUR SPECIFIC
REQUIREMENTS. ADDITIONAL STATEMENTS SUCH AS PRESENTATIONS, WHETHER ORAL
OR WRITTEN, DO NOT CONSTITUTE WARRANTIES BY ID AND SHOULD NOT BE RELIED
UPON. THIS SECTION 5. SHALL SURVIVE CANCELLATION OR TERMINATION OF THIS
AGREEMENT.
6. Governing Law, Venue, Indemnity and Liability Limitation. This
Agreement shall be construed in accordance with and governed by the
applicable laws of the State of Texas and applicable United States federal
law. Copyright and other proprietary matters will be governed by United
States laws and international treaties. Exclusive venue for all
litigation regarding this Agreement shall be in Dallas County, Texas
and you agree to submit to the jurisdiction of the courts in Dallas,
Texas for any such litigation. You agree to indemnify, defend and hold
harmless ID and ID's officers, employees, directors, agents, licensees
(excluding you), successors and assigns from and against all losses,
lawsuits, damages, causes of action and claims relating to and/or
arising from your breach of this Agreement. You agree that your
unauthorized use of the Software, or any part thereof, may immediately
and irreparably damage ID such that ID could not be adequately
compensated solely by a monetary award and that at ID's option ID shall
be entitled to an injunctive order, in addition to all other available
remedies including a monetary award, appropriately restraining and/or
prohibiting such unauthorized use without the necessity of ID posting
bond or other security. IN ANY CASE, ID AND ID'S OFFICERS, EMPLOYEES,
DIRECTORS, AGENTS, LICENSEES, SUBLICENSEES, SUCCESSORS AND ASSIGNS
SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF PROFITS, LOST SAVINGS,
SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT, PUNITIVE OR OTHER SIMILAR
DAMAGES ARISING FROM ANY ALLEGED CLAIM FOR BREACH OF WARRANTY, BREACH
OF CONTRACT, NEGLIGENCE, STRICT PRODUCT LIABILITY, OR OTHER LEGAL
THEORY EVEN IF ID OR ITS AGENT HAVE BEEN ADVISED OF THE POSSIBILITY
OF SUCH DAMAGES OR EVEN IF SUCH DAMAGES ARE FORESEEABLE, OR LIABLE
FOR ANY CLAIM BY ANY OTHER PARTY. Some jurisdictions do not allow
the exclusion or limitation of incidental or consequential damages,
so the above limitation or exclusion may not apply to you. This
Section 6. shall survive cancellation or termination of this Agreement.
7. U.S. Government Restricted Rights. To the extent applicable,
the United States Government shall only have those rights to use the
Software as expressly stated and expressly limited and restricted in
this Agreement, as provided in 48 C.F.R. §§ 227.7201 through 227.7204,
inclusive.
8. General Provisions. Neither this Agreement nor any part or
portion hereof shall be assigned or sublicensed by you. ID may assign its
rights under this Agreement in ID's sole discretion. Should any provision
of this Agreement be held to be void, invalid, unenforceable or illegal by
a court of competent jurisdiction, the validity and enforceability of the
other provisions shall not be affected thereby. If any provision is
determined to be unenforceable by a court of competent jurisdiction, you
agree to a modification of such provision to provide for enforcement of
the provision's intent, to the extent permitted by applicable law.
Failure of ID to enforce any provision of this Agreement shall not
constitute or be construed as a waiver of such provision or of the right
to enforce such provision. Immediately upon your failure to comply with
or breach of any term or provision of this Agreement, THIS AGREEMENT
AND YOUR LICENSE SHALL AUTOMATICALLY TERMINATE, WITHOUT NOTICE, AND ID
MAY PURSUE ALL RELIEF AND REMEDIES AGAINST YOU WHICH ARE AVAILABLE UNDER
APPLICABLE LAW AND/OR THIS AGREEMENT. In the event this Agreement is
terminated, you shall have no right to use the Software, in any manner,
and you shall immediately destroy all copies of the Software in your
possession, custody or control.
YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, YOU UNDERSTAND THIS
AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE INSTALLATION OF THE
SOFTWARE, BY LOADING OR RUNNING THE SOFTWARE, OR BY PLACING OR COPYING
THE SOFTWARE ONTO YOUR COMPUTER HARD DRIVE OR RAM, YOU AGREE TO BE BOUND
BY THE TERMS AND CONDITIONS OF THIS AGREEMENT. YOU FURTHER AGREE THAT,
EXCEPT FOR WRITTEN SEPARATE AGREEMENTS BETWEEN ID AND YOU, THIS
AGREEMENT IS A COMPLETE AND EXCLUSIVE STATEMENT OF THE RIGHTS AND
LIABILITIES OF THE PARTIES HERETO. THIS AGREEMENT SUPERSEDES ALL PRIOR
ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND ANY OTHER
COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER OF
THIS AGREEMENT.
`
================================================
FILE: internal/quake/server/server.go
================================================
package server
import (
"context"
"io/ioutil"
"log"
"net"
"os"
"path/filepath"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"sigs.k8s.io/yaml"
quakenet "github.com/criticalstack/quake-kube/internal/quake/net"
"github.com/criticalstack/quake-kube/internal/util/exec"
)
var (
actrvePlayers = promauto.NewGauge(prometheus.GaugeOpts{
Name: "quake_active_players",
Help: "The current number of active players",
})
scores = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "quake_player_scores",
Help: "Current scores by player, by map",
}, []string{"player", "map"})
pings = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "quake_player_pings",
Help: "Current ping by player",
}, []string{"player"})
configReloads = promauto.NewCounter(prometheus.CounterOpts{
Name: "quake_config_reloads",
Help: "Config file reload count",
})
)
type Server struct {
Dir string
WatchInterval time.Duration
ConfigFile string
Addr string
}
func (s *Server) Start(ctx context.Context) error {
if s.Addr == "" {
s.Addr = "0.0.0.0:27960"
}
host, port, err := net.SplitHostPort(s.Addr)
if err != nil {
return err
}
args := []string{
"+set", "dedicated", "1",
"+set", "net_ip", host,
"+set", "net_port", port,
"+set", "com_homepath", s.Dir,
"+set", "com_basegame", "baseq3",
"+set", "com_gamename", "Quake3Arena",
"+exec", "server.cfg",
}
cmd := exec.CommandContext(ctx, "ioq3ded", args...)
cmd.Dir = s.Dir
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if s.ConfigFile == "" {
cfg := Default()
data, err := cfg.Marshal()
if err != nil {
return err
}
if err := ioutil.WriteFile(filepath.Join(s.Dir, "baseq3/server.cfg"), data, 0644); err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
return cmd.Wait()
}
if err := s.reload(); err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
go func() {
if err := cmd.Wait(); err != nil {
log.Println(err)
}
}()
go func() {
addr := s.Addr
if net.ParseIP(host).IsUnspecified() {
addr = net.JoinHostPort("127.0.0.1", port)
}
tick := time.NewTicker(5 * time.Second)
defer tick.Stop()
for {
select {
case <-tick.C:
status, err := quakenet.GetStatus(addr)
if err != nil {
log.Printf("metrics: get status failed %v", err)
continue
}
actrvePlayers.Set(float64(len(status.Players)))
for _, p := range status.Players {
if mapname, ok := status.Configuration["mapname"]; ok {
scores.WithLabelValues(p.Name, mapname).Set(float64(p.Score))
}
pings.WithLabelValues(p.Name).Set(float64(p.Ping))
}
case <-ctx.Done():
return
}
}
}()
ch, err := s.watch(ctx)
if err != nil {
return err
}
for {
select {
case <-ch:
if err := s.reload(); err != nil {
return err
}
configReloads.Inc()
if err := cmd.Restart(ctx); err != nil {
return err
}
go func() {
if err := cmd.Wait(); err != nil {
log.Println(err)
}
}()
case <-ctx.Done():
return ctx.Err()
}
}
}
func (s *Server) reload() error {
data, err := ioutil.ReadFile(s.ConfigFile)
if err != nil {
return err
}
cfg := Default()
if err := yaml.Unmarshal(data, &cfg); err != nil {
return err
}
data, err = cfg.Marshal()
if err != nil {
return err
}
return ioutil.WriteFile(filepath.Join(s.Dir, "baseq3/server.cfg"), data, 0644)
}
func (s *Server) watch(ctx context.Context) (<-chan struct{}, error) {
if s.WatchInterval == 0 {
s.WatchInterval = 15 * time.Second
}
cur, err := os.Stat(s.ConfigFile)
if err != nil {
return nil, err
}
ch := make(chan struct{})
go func() {
ticker := time.NewTicker(s.WatchInterval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
if fi, err := os.Stat(s.ConfigFile); err == nil {
if fi.ModTime().After(cur.ModTime()) {
ch <- struct{}{}
}
cur = fi
}
case <-ctx.Done():
return
}
}
}()
return ch, nil
}
================================================
FILE: internal/util/exec/exec.go
================================================
package exec
import (
"context"
"os/exec"
)
type Cmd struct {
*exec.Cmd
}
func (cmd *Cmd) Restart(ctx context.Context) error {
if cmd.Process != nil {
if err := cmd.Process.Kill(); err != nil {
return err
}
}
newCmd := exec.CommandContext(ctx, cmd.Args[0], cmd.Args[1:]...)
newCmd.Dir = cmd.Dir
newCmd.Env = cmd.Env
newCmd.Stdin = cmd.Stdin
newCmd.Stdout = cmd.Stdout
newCmd.Stderr = cmd.Stderr
cmd.Cmd = newCmd
return cmd.Start()
}
func CommandContext(ctx context.Context, name string, args ...string) *Cmd {
return &Cmd{Cmd: exec.CommandContext(ctx, name, args...)}
}
================================================
FILE: internal/util/net/http/http.go
================================================
package http
import (
"io/ioutil"
"net/http"
"time"
"github.com/pkg/errors"
)
func GetBody(url string) ([]byte, error) {
client := http.Client{
Timeout: 5 * time.Minute,
}
resp, err := client.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, errors.Errorf("cannot get url %q: %v", url, http.StatusText(resp.StatusCode))
}
return ioutil.ReadAll(resp.Body)
}
func GetUntil(url string, stop <-chan struct{}) error {
client := http.Client{
Timeout: 1 * time.Second,
}
for {
select {
case <-stop:
return errors.Errorf("not available: %q", url)
default:
resp, err := client.Get(url)
if err != nil {
continue
}
resp.Body.Close()
return nil
}
}
}
================================================
FILE: internal/util/net/net.go
================================================
package net
import (
"net"
"github.com/pkg/errors"
)
// DetectHostIPv4 attempts to determine the host IPv4 address by finding the
// first non-loopback device with an assigned IPv4 address.
func DetectHostIPv4() (string, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return "", errors.WithStack(err)
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() == nil {
continue
}
return ipnet.IP.String(), nil
}
}
return "", errors.New("cannot detect host IPv4 address")
}
================================================
FILE: public/browserconfig.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/images/ms-icon-70x70.png"/>
<square150x150logo src="/images/ms-icon-150x150.png"/>
<square310x310logo src="/images/ms-icon-310x310.png"/>
<TileColor>#ffffff</TileColor>
</tile>
</msapplication>
</browserconfig>
================================================
FILE: public/game.css
================================================
html, body {
height: 100%;
padding: 0;
margin: 0;
background: #000;
}
#bg {
position: absolute;
top: 0;
left: 0;
bottom: 24em;
right: 0;
overflow: hidden;
background-image: url('data:image/png;base64,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');
background-repeat: no-repeat;
background-position: center;
background-size: 24em;
}
#viewport-frame {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
overflow: hidden;
background-repeat: no-repeat;
background-position: center;
background-size: 24em;
}
#viewport-frame:focus {
outline: none;
}
#viewport {
background: #000;
width: 100%;
height: 100%;
}
#viewport-frame:-moz-full-screen,
#viewport:-moz-full-screen {
display: block;
position: absolute;
left: 0;
top: 0;
margin: 0;
width: 100%;
height: 100%;
}
#viewport-frame:-webkit-full-screen,
#viewport:-webkit-full-screen {
display: block;
position: absolute;
left: 0;
top: 0;
margin: 0;
width: 100%;
height: 100%;
}
================================================
FILE: public/index.html
================================================
{{define "index"}}<!DOCTYPE html>
<html>
<head>
<title>QuakeJS Local</title>
<link rel="stylesheet" href="game.css"></link>
<script type="text/javascript" src="ioquake3.js"></script>
<link rel="apple-touch-icon" sizes="57x57" href="/images/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/images/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/images/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/images/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/images/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/images/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/images/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/images/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/images/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/images/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/images/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<script type="text/javascript">
function getQueryCommands() {
var search = /([^&=]+)/g;
var query = window.location.search.substring(1);
var args = [];
var match;
while (match = search.exec(query)) {
var val = decodeURIComponent(match[1]);
val = val.split(' ');
val[0] = '+' + val[0];
args.push.apply(args, val);
}
return args;
}
window.onload = function () {
function resizeViewport() {
if (!ioq3.canvas) {
// ignore if the canvas hasn't yet initialized
return;
}
if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||
document['mozFullScreenElement'] || document['mozFullscreenElement'] ||
document['fullScreenElement'] || document['fullscreenElement'])) {
// ignore resize events due to going fullscreen
return;
}
ioq3.setCanvasSize(ioq3.viewport.offsetWidth, ioq3.viewport.offsetHeight);
}
ioq3.viewport = document.getElementById('viewport-frame');
ioq3.elementPointerLock = true;
ioq3.exitHandler = function (err) {
if (err) {
var form = document.createElement('form');
form.setAttribute('method', 'POST');
form.setAttribute('action', '/');
var hiddenField = document.createElement('input');
hiddenField.setAttribute('type', 'hidden');
hiddenField.setAttribute('name', 'error');
hiddenField.setAttribute('value', err);
form.appendChild(hiddenField);
document.body.appendChild(form);
form.submit();
return;
}
window.location.href = '/';
}
window.addEventListener('resize', resizeViewport);
};
</script>
<style>
.centered {
position: fixed;
top: 60%;
left: 50%;
transform: translate(-50%, -60%);
z-index: 1;
}
.form input[type=text], [type=password] {
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
box-shadow: inset 0 1px 3px #ddd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding-left: 20px;
padding-right: 20px;
padding-top: 16px;
padding-bottom: 16px;
}
.button {
background-color: #fe121e;
border: none;
color: white;
padding: 16px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
}
</style>
</head>
<body>
<div id="main">
<div id="bg"></div>
<div class="centered">
<form class="form">
<input type="text" id="playerName">
{{ with .NeedsPass }}
<input type="password" placeholder="password" id="password">
{{ end }}
<button onclick="join()" type="submit" class="button">Join</button>
</form>
<script type="text/javascript">
placeholder = "enter player name"
if (localStorage.playerName) {
placeholder = localStorage.playerName
}
document.getElementById("playerName").placeholder = placeholder
function join(){
var inputPlayerName = document.getElementById("playerName");
if (inputPlayerName.value != "") {
localStorage.setItem("playerName", inputPlayerName.value);
}
host = document.location.host
if (!host.includes(":")) { host = host + (window.location.protocol == 'https:' ? ":443" : ":80") }
var args = ['+set', 'fs_cdn', host, '+connect', host];
args.push.apply(args, ['+set', 'cl_allowDownload', '1'])
args.push.apply(args, ['+set', 'cl_timeout', '15'])
args.push.apply(args, ['+name', localStorage.playerName])
args.push.apply(args, getQueryCommands());
var inputPassword = document.getElementById("password");
if (inputPassword && inputPassword.value != "") {
args.push.apply(args, ['+set', 'password', inputPassword.value]);
}
var element = document.getElementById("main");
element.parentNode.removeChild(element);
ioq3.callMain(args);
}
</script>
</div>
</div>
<div id="viewport-frame"></div>
</body>
</html>
{{end}}
================================================
FILE: public/ioquake3.js
================================================
// Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code
// Note: Some Emscripten settings may limit the speed of the generated code.
// The Module object: Our interface to the outside world. We import
// and export values on it, and do the work to get that through
// closure compiler if necessary. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to do an eval in order to handle the closure compiler
// case, where this code here is minified but Module was defined
// elsewhere (e.g. case 4 above). We also need to check if Module
// already exists (e.g. case 3 above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module;
if (!Module) Module = eval('(function() { try { return ioq3 || {} } catch(e) { return {} } })()');
// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
for (var key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
// The environment setup code below is customized to use Module.
// *** Environment setup code ***
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
if (ENVIRONMENT_IS_NODE) {
// Expose functionality in the same simple way that the shells work
// Note that we pollute the global namespace here, otherwise we break in node
if (!Module['print']) Module['print'] = function print(x) {
process['stdout'].write(x + '\n');
};
if (!Module['printErr']) Module['printErr'] = function printErr(x) {
process['stderr'].write(x + '\n');
};
var nodeFS = require('fs');
var nodePath = require('path');
Module['read'] = function read(filename, binary) {
filename = nodePath['normalize'](filename);
var ret = nodeFS['readFileSync'](filename);
// The path is absolute if the normalized version is the same as the resolved.
if (!ret && filename != nodePath['resolve'](filename)) {
filename = path.join(__dirname, '..', 'src', filename);
ret = nodeFS['readFileSync'](filename);
}
if (ret && !binary) ret = ret.toString();
return ret;
};
Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };
Module['load'] = function load(f) {
globalEval(read(f));
};
Module['arguments'] = process['argv'].slice(2);
module['exports'] = Module;
}
else if (ENVIRONMENT_IS_SHELL) {
if (!Module['print']) Module['print'] = print;
if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm
if (typeof read != 'undefined') {
Module['read'] = read;
} else {
Module['read'] = function read() { throw 'no read() available (jsc?)' };
}
Module['readBinary'] = function readBinary(f) {
return read(f, 'binary');
};
if (typeof scriptArgs != 'undefined') {
Module['arguments'] = scriptArgs;
} else if (typeof arguments != 'undefined') {
Module['arguments'] = arguments;
}
this['ioq3'] = Module;
eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)
}
else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
Module['read'] = function read(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
};
if (typeof arguments != 'undefined') {
Module['arguments'] = arguments;
}
if (typeof console !== 'undefined') {
if (!Module['print']) Module['print'] = function print(x) {
console.log(x);
};
if (!Module['printErr']) Module['printErr'] = function printErr(x) {
console.log(x);
};
} else {
// Probably a worker, and without console.log. We can do very little here...
var TRY_USE_DUMP = false;
if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) {
dump(x);
}) : (function(x) {
// self.postMessage(x); // enable this if you want stdout to be sent as messages
}));
}
if (ENVIRONMENT_IS_WEB) {
this['ioq3'] = Module;
} else {
Module['load'] = importScripts;
}
}
else {
// Unreachable because SHELL is dependant on the others
throw 'Unknown runtime environment. Where are we?';
}
function globalEval(x) {
eval.call(null, x);
}
if (!Module['load'] == 'undefined' && Module['read']) {
Module['load'] = function load(f) {
globalEval(Module['read'](f));
};
}
if (!Module['print']) {
Module['print'] = function(){};
}
if (!Module['printErr']) {
Module['printErr'] = Module['print'];
}
if (!Module['arguments']) {
Module['arguments'] = [];
}
// *** Environment setup code ***
// Closure helpers
Module.print = Module['print'];
Module.printErr = Module['printErr'];
// Callbacks
Module['preRun'] = [];
Module['postRun'] = [];
// Merge back in the overrides
for (var key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
// === Auto-generated preamble library stuff ===
//========================================
// Runtime code shared with compiler
//========================================
var Runtime = {
stackSave: function () {
return STACKTOP;
},
stackRestore: function (stackTop) {
STACKTOP = stackTop;
},
forceAlign: function (target, quantum) {
quantum = quantum || 4;
if (quantum == 1) return target;
if (isNumber(target) && isNumber(quantum)) {
return Math.ceil(target/quantum)*quantum;
} else if (isNumber(quantum) && isPowerOfTwo(quantum)) {
return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';
}
return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;
},
isNumberType: function (type) {
return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;
},
isPointerType: function isPointerType(type) {
return type[type.length-1] == '*';
},
isStructType: function isStructType(type) {
if (isPointerType(type)) return false;
if (isArrayType(type)) return true;
if (/<?{ ?[^}]* ?}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types
// See comment in isStructPointerType()
return type[0] == '%';
},
INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},
FLOAT_TYPES: {"float":0,"double":0},
or64: function (x, y) {
var l = (x | 0) | (y | 0);
var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;
return l + h;
},
and64: function (x, y) {
var l = (x | 0) & (y | 0);
var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;
return l + h;
},
xor64: function (x, y) {
var l = (x | 0) ^ (y | 0);
var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;
return l + h;
},
getNativeTypeSize: function (type) {
switch (type) {
case 'i1': case 'i8': return 1;
case 'i16': return 2;
case 'i32': return 4;
case 'i64': return 8;
case 'float': return 4;
case 'double': return 8;
default: {
if (type[type.length-1] === '*') {
return Runtime.QUANTUM_SIZE; // A pointer
} else if (type[0] === 'i') {
var bits = parseInt(type.substr(1));
assert(bits % 8 === 0);
return bits/8;
} else {
return 0;
}
}
}
},
getNativeFieldSize: function (type) {
return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);
},
dedup: function dedup(items, ident) {
var seen = {};
if (ident) {
return items.filter(function(item) {
if (seen[item[ident]]) return false;
seen[item[ident]] = true;
return true;
});
} else {
return items.filter(function(item) {
if (seen[item]) return false;
seen[item] = true;
return true;
});
}
},
set: function set() {
var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;
var ret = {};
for (var i = 0; i < args.length; i++) {
ret[args[i]] = 0;
}
return ret;
},
STACK_ALIGN: 8,
getAlignSize: function (type, size, vararg) {
// we align i64s and doubles on 64-bit boundaries, unlike x86
if (vararg) return 8;
if (!vararg && (type == 'i64' || type == 'double')) return 8;
if (!type) return Math.min(size, 8); // align structures internally to 64 bits
return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);
},
calculateStructAlignment: function calculateStructAlignment(type) {
type.flatSize = 0;
type.alignSize = 0;
var diffs = [];
var prev = -1;
var index = 0;
type.flatIndexes = type.fields.map(function(field) {
index++;
var size, alignSize;
if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {
size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.
alignSize = Runtime.getAlignSize(field, size);
} else if (Runtime.isStructType(field)) {
if (field[1] === '0') {
// this is [0 x something]. When inside another structure like here, it must be at the end,
// and it adds no size
// XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');
size = 0;
if (Types.types[field]) {
alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
} else {
alignSize = type.alignSize || QUANTUM_SIZE;
}
} else {
size = Types.types[field].flatSize;
alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);
}
} else if (field[0] == 'b') {
// bN, large number field, like a [N x i8]
size = field.substr(1)|0;
alignSize = 1;
} else if (field[0] === '<') {
// vector type
size = alignSize = Types.types[field].flatSize; // fully aligned
} else if (field[0] === 'i') {
// illegal integer field, that could not be legalized because it is an internal structure field
// it is ok to have such fields, if we just use them as markers of field size and nothing more complex
size = alignSize = parseInt(field.substr(1))/8;
assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);
} else {
assert(false, 'invalid type for calculateStructAlignment');
}
if (type.packed) alignSize = 1;
type.alignSize = Math.max(type.alignSize, alignSize);
var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory
type.flatSize = curr + size;
if (prev >= 0) {
diffs.push(curr-prev);
}
prev = curr;
return curr;
});
if (type.name_ && type.name_[0] === '[') {
// arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid
// allocating a potentially huge array for [999999 x i8] etc.
type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;
}
type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);
if (diffs.length == 0) {
type.flatFactor = type.flatSize;
} else if (Runtime.dedup(diffs).length == 1) {
type.flatFactor = diffs[0];
}
type.needsFlattening = (type.flatFactor != 1);
return type.flatIndexes;
},
generateStructInfo: function (struct, typeName, offset) {
var type, alignment;
if (typeName) {
offset = offset || 0;
type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];
if (!type) return null;
if (type.fields.length != struct.length) {
printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');
return null;
}
alignment = type.flatIndexes;
} else {
var type = { fields: struct.map(function(item) { return item[0] }) };
alignment = Runtime.calculateStructAlignment(type);
}
var ret = {
__size__: type.flatSize
};
if (typeName) {
struct.forEach(function(item, i) {
if (typeof item === 'string') {
ret[item] = alignment[i] + offset;
} else {
// embedded struct
var key;
for (var k in item) key = k;
ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);
}
});
} else {
struct.forEach(function(item, i) {
ret[item[1]] = alignment[i];
});
}
return ret;
},
dynCall: function (sig, ptr, args) {
if (args && args.length) {
if (!args.splice) args = Array.prototype.slice.call(args);
args.splice(0, 0, ptr);
return Module['dynCall_' + sig].apply(null, args);
} else {
return Module['dynCall_' + sig].call(null, ptr);
}
},
functionPointers: [null],
addFunction: function (func) {
for (var i = 0; i < Runtime.functionPointers.length; i++) {
if (!Runtime.functionPointers[i]) {
Runtime.functionPointers[i] = func;
return 2*(1 + i);
}
}
throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';
},
removeFunction: function (index) {
Runtime.functionPointers[(index-2)/2] = null;
},
getAsmConst: function (code, numArgs) {
// code is a constant string on the heap, so we can cache these
if (!Runtime.asmConstCache) Runtime.asmConstCache = {};
var func = Runtime.asmConstCache[code];
if (func) return func;
var args = [];
for (var i = 0; i < numArgs; i++) {
args.push(String.fromCharCode(36) + i); // $0, $1 etc
}
code = Pointer_stringify(code);
if (code[0] === '"') {
// tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct
if (code.indexOf('"', 1) === code.length-1) {
code = code.substr(1, code.length-2);
} else {
// something invalid happened, e.g. EM_ASM("..code($0)..", input)
abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');
}
}
return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node
},
warnOnce: function (text) {
if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
if (!Runtime.warnOnce.shown[text]) {
Runtime.warnOnce.shown[text] = 1;
Module.printErr(text);
}
},
funcWrappers: {},
getFuncWrapper: function (func, sig) {
assert(sig);
if (!Runtime.funcWrappers[func]) {
Runtime.funcWrappers[func] = function dynCall_wrapper() {
return Runtime.dynCall(sig, func, arguments);
};
}
return Runtime.funcWrappers[func];
},
UTF8Processor: function () {
var buffer = [];
var needed = 0;
this.processCChar = function (code) {
code = code & 0xFF;
if (buffer.length == 0) {
if ((code & 0x80) == 0x00) { // 0xxxxxxx
return String.fromCharCode(code);
}
buffer.push(code);
if ((code & 0xE0) == 0xC0) { // 110xxxxx
needed = 1;
} else if ((code & 0xF0) == 0xE0) { // 1110xxxx
needed = 2;
} else { // 11110xxx
needed = 3;
}
return '';
}
if (needed) {
buffer.push(code);
needed--;
if (needed > 0) return '';
}
var c1 = buffer[0];
var c2 = buffer[1];
var c3 = buffer[2];
var c4 = buffer[3];
var ret;
if (buffer.length == 2) {
ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F));
} else if (buffer.length == 3) {
ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F));
} else {
// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
((c3 & 0x3F) << 6) | (c4 & 0x3F);
ret = String.fromCharCode(
Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,
(codePoint - 0x10000) % 0x400 + 0xDC00);
}
buffer.length = 0;
return ret;
}
this.processJSString = function processJSString(string) {
string = unescape(encodeURIComponent(string));
var ret = [];
for (var i = 0; i < string.length; i++) {
ret.push(string.charCodeAt(i));
}
return ret;
}
},
stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },
staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },
dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },
alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },
makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },
GLOBAL_BASE: 8,
QUANTUM_SIZE: 4,
__dummy__: 0
}
Module['Runtime'] = Runtime;
function jsCall() {
var args = Array.prototype.slice.call(arguments);
return Runtime.functionPointers[args[0]].apply(null, args.slice(1));
}
//========================================
// Runtime essentials
//========================================
var __THREW__ = 0; // Used in checking for thrown exceptions.
var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()
var EXITSTATUS = 0;
var undef = 0;
// tempInt is used for 32-bit signed values or smaller. tempBigInt is used
// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt
var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;
var tempI64, tempI64b;
var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;
function assert(condition, text) {
if (!condition) {
abort('Assertion failed: ' + text);
}
}
var globalScope = this;
// C calling interface. A convenient way to call C functions (in C files, or
// defined with extern "C").
//
// Note: LLVM optimizations can inline and remove functions, after which you will not be
// able to call them. Closure can also do so. To avoid that, add your function to
// the exports using something like
//
// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]'
//
// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C")
// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and
// 'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).
// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,
// except that 'array' is not possible (there is no way for us to know the length of the array)
// @param args An array of the arguments to the function, as native JS values (as in returnType)
// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).
// @return The return value, as a native JS value (as in returnType)
function ccall(ident, returnType, argTypes, args) {
return ccallFunc(getCFunc(ident), returnType, argTypes, args);
}
Module["ccall"] = ccall;
// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
try {
var func = Module['_' + ident]; // closure exported function
if (!func) func = eval('_' + ident); // explicit lookup
} catch(e) {
}
assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');
return func;
}
// Internal function that does a C call using a function, not an identifier
function ccallFunc(func, returnType, argTypes, args) {
var stack = 0;
function toC(value, type) {
if (type == 'string') {
if (value === null || value === undefined || value === 0) return 0; // null string
value = intArrayFromString(value);
type = 'array';
}
if (type == 'array') {
if (!stack) stack = Runtime.stackSave();
var ret = Runtime.stackAlloc(value.length);
writeArrayToMemory(value, ret);
return ret;
}
return value;
}
function fromC(value, type) {
if (type == 'string') {
return Pointer_stringify(value);
}
assert(type != 'array');
return value;
}
var i = 0;
var cArgs = args ? args.map(function(arg) {
return toC(arg, argTypes[i++]);
}) : [];
var ret = fromC(func.apply(null, cArgs), returnType);
if (stack) Runtime.stackRestore(stack);
return ret;
}
// Returns a native JS wrapper for a C function. This is similar to ccall, but
// returns a function you can call repeatedly in a normal way. For example:
//
// var my_function = cwrap('my_c_function', 'number', ['number', 'number']);
// alert(my_function(5, 22));
// alert(my_function(99, 12));
//
function cwrap(ident, returnType, argTypes) {
var func = getCFunc(ident);
return function() {
return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));
}
}
Module["cwrap"] = cwrap;
// Sets a value in memory in a dynamic way at run-time. Uses the
// type data. This is the same as makeSetValue, except that
// makeSetValue is done at compile-time and generates the needed
// code then, whereas this function picks the right code at
// run-time.
// Note that setValue and getValue only do *aligned* writes and reads!
// Note that ccall uses JS types as for defining types, while setValue and
// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation
function setValue(ptr, value, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
switch(type) {
case 'i1': HEAP8[(ptr)]=value; break;
case 'i8': HEAP8[(ptr)]=value; break;
case 'i16': HEAP16[((ptr)>>1)]=value; break;
case 'i32': HEAP32[((ptr)>>2)]=value; break;
case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break;
case 'float': HEAPF32[((ptr)>>2)]=value; break;
case 'double': HEAPF64[((ptr)>>3)]=value; break;
default: abort('invalid type for setValue: ' + type);
}
}
Module['setValue'] = setValue;
// Parallel to setValue.
function getValue(ptr, type, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
switch(type) {
case 'i1': return HEAP8[(ptr)];
case 'i8': return HEAP8[(ptr)];
case 'i16': return HEAP16[((ptr)>>1)];
case 'i32': return HEAP32[((ptr)>>2)];
case 'i64': return HEAP32[((ptr)>>2)];
case 'float': return HEAPF32[((ptr)>>2)];
case 'double': return HEAPF64[((ptr)>>3)];
default: abort('invalid type for setValue: ' + type);
}
return null;
}
Module['getValue'] = getValue;
var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
var ALLOC_STATIC = 2; // Cannot be freed
var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk
var ALLOC_NONE = 4; // Do not allocate
Module['ALLOC_NORMAL'] = ALLOC_NORMAL;
Module['ALLOC_STACK'] = ALLOC_STACK;
Module['ALLOC_STATIC'] = ALLOC_STATIC;
Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;
Module['ALLOC_NONE'] = ALLOC_NONE;
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
// normally not use allocate(), and instead allocate memory using _malloc(),
// initialize it with setValue(), and so forth.
// @slab: An array of data, or a number. If a number, then the size of the block to allocate,
// in *bytes* (note that this is sometimes confusing: the next parameter does not
// affect this!)
// @types: Either an array of types, one for each byte (or 0 if no type at that position),
// or a single type which is used for the entire block. This only matters if there
// is initial data - if @slab is a number, then this does not matter at all and is
// ignored.
// @allocator: How to allocate memory, see ALLOC_*
function allocate(slab, types, allocator, ptr) {
var zeroinit, size;
if (typeof slab === 'number') {
zeroinit = true;
size = slab;
} else {
zeroinit = false;
size = slab.length;
}
var singleType = typeof types === 'string' ? types : null;
var ret;
if (allocator == ALLOC_NONE) {
ret = ptr;
} else {
ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));
}
if (zeroinit) {
var ptr = ret, stop;
assert((ret & 3) == 0);
stop = ret + (size & ~3);
for (; ptr < stop; ptr += 4) {
HEAP32[((ptr)>>2)]=0;
}
stop = ret + size;
while (ptr < stop) {
HEAP8[((ptr++)|0)]=0;
}
return ret;
}
if (singleType === 'i8') {
if (slab.subarray || slab.slice) {
HEAPU8.set(slab, ret);
} else {
HEAPU8.set(new Uint8Array(slab), ret);
}
return ret;
}
var i = 0, type, typeSize, previousType;
while (i < size) {
var curr = slab[i];
if (typeof curr === 'function') {
curr = Runtime.getFunctionIndex(curr);
}
type = singleType || types[i];
if (type === 0) {
i++;
continue;
}
if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later
setValue(ret+i, curr, type);
// no need to look up size unless type changes, so cache it
if (previousType !== type) {
typeSize = Runtime.getNativeTypeSize(type);
previousType = type;
}
i += typeSize;
}
return ret;
}
Module['allocate'] = allocate;
function Pointer_stringify(ptr, /* optional */ length) {
// TODO: use TextDecoder
// Find the length, and check for UTF while doing so
var hasUtf = false;
var t;
var i = 0;
while (1) {
t = HEAPU8[(((ptr)+(i))|0)];
if (t >= 128) hasUtf = true;
else if (t == 0 && !length) break;
i++;
if (length && i == length) break;
}
if (!length) length = i;
var ret = '';
if (!hasUtf) {
var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack
var curr;
while (length > 0) {
curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
ret = ret ? ret + curr : curr;
ptr += MAX_CHUNK;
length -= MAX_CHUNK;
}
return ret;
}
var utf8 = new Runtime.UTF8Processor();
for (i = 0; i < length; i++) {
t = HEAPU8[(((ptr)+(i))|0)];
ret += utf8.processCChar(t);
}
return ret;
}
Module['Pointer_stringify'] = Pointer_stringify;
// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF16ToString(ptr) {
var i = 0;
var str = '';
while (1) {
var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
if (codeUnit == 0)
return str;
++i;
// fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
str += String.fromCharCode(codeUnit);
}
}
Module['UTF16ToString'] = UTF16ToString;
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.
function stringToUTF16(str, outPtr) {
for(var i = 0; i < str.length; ++i) {
// charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;
}
// Null-terminate the pointer to the HEAP.
HEAP16[(((outPtr)+(str.length*2))>>1)]=0;
}
Module['stringToUTF16'] = stringToUTF16;
// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.
function UTF32ToString(ptr) {
var i = 0;
var str = '';
while (1) {
var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
if (utf32 == 0)
return str;
++i;
// Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
if (utf32 >= 0x10000) {
var ch = utf32 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
} else {
str += String.fromCharCode(utf32);
}
}
}
Module['UTF32ToString'] = UTF32ToString;
// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,
// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.
function stringToUTF32(str, outPtr) {
var iChar = 0;
for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate
if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
var trailSurrogate = str.charCodeAt(++iCodeUnit);
codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
}
HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;
++iChar;
}
// Null-terminate the pointer to the HEAP.
HEAP32[(((outPtr)+(iChar*4))>>2)]=0;
}
Module['stringToUTF32'] = stringToUTF32;
function demangle(func) {
try {
// Special-case the entry point, since its name differs from other name mangling.
if (func == 'Object._main' || func == '_main') {
return 'main()';
}
if (typeof func === 'number') func = Pointer_stringify(func);
if (func[0] !== '_') return func;
if (func[1] !== '_') return func; // C function
if (func[2] !== 'Z') return func;
switch (func[3]) {
case 'n': return 'operator new()';
case 'd': return 'operator delete()';
}
var i = 3;
// params, etc.
var basicTypes = {
'v': 'void',
'b': 'bool',
'c': 'char',
's': 'short',
'i': 'int',
'l': 'long',
'f': 'float',
'd': 'double',
'w': 'wchar_t',
'a': 'signed char',
'h': 'unsigned char',
't': 'unsigned short',
'j': 'unsigned int',
'm': 'unsigned long',
'x': 'long long',
'y': 'unsigned long long',
'z': '...'
};
function dump(x) {
//return;
if (x) Module.print(x);
Module.print(func);
var pre = '';
for (var a = 0; a < i; a++) pre += ' ';
Module.print (pre + '^');
}
var subs = [];
function parseNested() {
i++;
if (func[i] === 'K') i++; // ignore const
var parts = [];
while (func[i] !== 'E') {
if (func[i] === 'S') { // substitution
i++;
var next = func.indexOf('_', i);
var num = func.substring(i, next) || 0;
parts.push(subs[num] || '?');
i = next+1;
continue;
}
if (func[i] === 'C') { // constructor
parts.push(parts[parts.length-1]);
i += 2;
continue;
}
var size = parseInt(func.substr(i));
var pre = size.toString().length;
if (!size || !pre) { i--; break; } // counter i++ below us
var curr = func.substr(i + pre, size);
parts.push(curr);
subs.push(curr);
i += pre + size;
}
i++; // skip E
return parts;
}
var first = true;
function parse(rawList, limit, allowVoid) { // main parser
limit = limit || Infinity;
var ret = '', list = [];
function flushList() {
return '(' + list.join(', ') + ')';
}
var name;
if (func[i] === 'N') {
// namespaced N-E
name = parseNested().join('::');
limit--;
if (limit === 0) return rawList ? [name] : name;
} else {
// not namespaced
if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'
var size = parseInt(func.substr(i));
if (size) {
var pre = size.toString().length;
name = func.substr(i + pre, size);
i += pre + size;
}
}
first = false;
if (func[i] === 'I') {
i++;
var iList = parse(true);
var iRet = parse(true, 1, true);
ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
} else {
ret = name;
}
paramLoop: while (i < func.length && limit-- > 0) {
//dump('paramLoop');
var c = func[i++];
if (c in basicTypes) {
list.push(basicTypes[c]);
} else {
switch (c) {
case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer
case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference
case 'L': { // literal
i++; // skip basic type
var end = func.indexOf('E', i);
var size = end - i;
list.push(func.substr(i, size));
i += size + 2; // size + 'EE'
break;
}
case 'A': { // array
var size = parseInt(func.substr(i));
i += size.toString().length;
if (func[i] !== '_') throw '?';
i++; // skip _
list.push(parse(true, 1, true)[0] + ' [' + size + ']');
break;
}
case 'E': break paramLoop;
default: ret += '?' + c; break paramLoop;
}
}
}
if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
return rawList ? list : ret + flushList();
}
return parse();
} catch(e) {
return func;
}
}
function demangleAll(text) {
return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });
}
function stackTrace() {
var stack = new Error().stack;
return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.
}
// Memory management
var PAGE_SIZE = 4096;
function alignMemoryPage(x) {
return (x+4095)&-4096;
}
var HEAP;
var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area
var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area
var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk
function enlargeMemory() {
abort('Cannot enlarge memory arrays in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', or (2) set Module.TOTAL_MEMORY before the program runs.');
}
var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;
var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 234881024;
var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;
var totalMemory = 4096;
while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {
if (totalMemory < 16*1024*1024) {
totalMemory *= 2;
} else {
totalMemory += 16*1024*1024
}
}
if (totalMemory !== TOTAL_MEMORY) {
Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');
TOTAL_MEMORY = totalMemory;
}
// Initialize the runtime's memory
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),
'Cannot fallback to non-typed array case: Code is too specialized');
var buffer = new ArrayBuffer(TOTAL_MEMORY);
HEAP8 = new Int8Array(buffer);
HEAP16 = new Int16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPU8 = new Uint8Array(buffer);
HEAPU16 = new Uint16Array(buffer);
HEAPU32 = new Uint32Array(buffer);
HEAPF32 = new Float32Array(buffer);
HEAPF64 = new Float64Array(buffer);
// Endianness check (note: assumes compiler arch was little-endian)
HEAP32[0] = 255;
assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');
Module['HEAP'] = HEAP;
Module['HEAP8'] = HEAP8;
Module['HEAP16'] = HEAP16;
Module['HEAP32'] = HEAP32;
Module['HEAPU8'] = HEAPU8;
Module['HEAPU16'] = HEAPU16;
Module['HEAPU32'] = HEAPU32;
Module['HEAPF32'] = HEAPF32;
Module['HEAPF64'] = HEAPF64;
function callRuntimeCallbacks(callbacks) {
while(callbacks.length > 0) {
var callback = callbacks.shift();
if (typeof callback == 'function') {
callback();
continue;
}
var func = callback.func;
if (typeof func === 'number') {
if (callback.arg === undefined) {
Runtime.dynCall('v', func);
} else {
Runtime.dynCall('vi', func, [callback.arg]);
}
} else {
func(callback.arg === undefined ? null : callback.arg);
}
}
}
var __ATPRERUN__ = []; // functions called before the runtime is initialized
var __ATINIT__ = []; // functions called during startup
var __ATMAIN__ = []; // functions called when main() is to be run
var __ATEXIT__ = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the runtime has exited
var runtimeInitialized = false;
function preRun() {
// compatibility - merge in anything from Module['preRun'] at this time
if (Module['preRun']) {
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
while (Module['preRun'].length) {
addOnPreRun(Module['preRun'].shift());
}
}
callRuntimeCallbacks(__ATPRERUN__);
}
function ensureInitRuntime() {
if (runtimeInitialized) return;
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function preMain() {
callRuntimeCallbacks(__ATMAIN__);
}
function exitRuntime() {
callRuntimeCallbacks(__ATEXIT__);
}
function postRun() {
// compatibility - merge in anything from Module['postRun'] at this time
if (Module['postRun']) {
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
while (Module['postRun'].length) {
addOnPostRun(Module['postRun'].shift());
}
}
callRuntimeCallbacks(__ATPOSTRUN__);
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb);
}
Module['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;
function addOnInit(cb) {
__ATINIT__.unshift(cb);
}
Module['addOnInit'] = Module.addOnInit = addOnInit;
function addOnPreMain(cb) {
__ATMAIN__.unshift(cb);
}
Module['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;
function addOnExit(cb) {
__ATEXIT__.unshift(cb);
}
Module['addOnExit'] = Module.addOnExit = addOnExit;
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb);
}
Module['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;
// Tools
// This processes a JS string into a C-line array of numbers, 0-terminated.
// For LLVM-originating strings, see parser.js:parseLLVMString function
function intArrayFromString(stringy, dontAddNull, length /* optional */) {
var ret = (new Runtime.UTF8Processor()).processJSString(stringy);
if (length) {
ret.length = length;
}
if (!dontAddNull) {
ret.push(0);
}
return ret;
}
Module['intArrayFromString'] = intArrayFromString;
function intArrayToString(array) {
var ret = [];
for (var i = 0; i < array.length; i++) {
var chr = array[i];
if (chr > 0xFF) {
chr &= 0xFF;
}
ret.push(String.fromCharCode(chr));
}
return ret.join('');
}
Module['intArrayToString'] = intArrayToString;
// Write a Javascript array to somewhere in the heap
function writeStringToMemory(string, buffer, dontAddNull) {
var array = intArrayFromString(string, dontAddNull);
var i = 0;
while (i < array.length) {
var chr = array[i];
HEAP8[(((buffer)+(i))|0)]=chr;
i = i + 1;
}
}
Module['writeStringToMemory'] = writeStringToMemory;
function writeArrayToMemory(array, buffer) {
for (var i = 0; i < array.length; i++) {
HEAP8[(((buffer)+(i))|0)]=array[i];
}
}
Module['writeArrayToMemory'] = writeArrayToMemory;
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; i++) {
HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);
}
if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;
}
Module['writeAsciiToMemory'] = writeAsciiToMemory;
function unSign(value, bits, ignore) {
if (value >= 0) {
return value;
}
return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts
: Math.pow(2, bits) + value;
}
function reSign(value, bits, ignore) {
if (value <= 0) {
return value;
}
var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32
: Math.pow(2, bits-1);
if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that
// but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors
// TODO: In i64 mode 1, resign the two parts separately and safely
value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts
}
return value;
}
// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )
if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {
var ah = a >>> 16;
var al = a & 0xffff;
var bh = b >>> 16;
var bl = b & 0xffff;
return (al*bl + ((ah*bl + al*bh) << 16))|0;
};
Math.imul = Math['imul'];
var Math_abs = Math.abs;
var Math_cos = Math.cos;
var Math_sin = Math.sin;
var Math_tan = Math.tan;
var Math_acos = Math.acos;
var Math_asin = Math.asin;
var Math_atan = Math.atan;
var Math_atan2 = Math.atan2;
var Math_exp = Math.exp;
var Math_log = Math.log;
var Math_sqrt = Math.sqrt;
var Math_ceil = Math.ceil;
var Math_floor = Math.floor;
var Math_pow = Math.pow;
var Math_imul = Math.imul;
var Math_fround = Math.fround;
var Math_min = Math.min;
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// PRE_RUN_ADDITIONS (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
}
Module['addRunDependency'] = addRunDependency;
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null;
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback(); // can add another dependenciesFulfilled
}
}
}
Module['removeRunDependency'] = removeRunDependency;
Module["preloadedImage
gitextract_5gtct1k9/
├── .dockerignore
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── push-image.yaml
│ └── test.yaml
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── cmd/
│ └── q3/
│ ├── app/
│ │ ├── cmd/
│ │ │ └── cmd.go
│ │ ├── content/
│ │ │ └── content.go
│ │ ├── proxy/
│ │ │ └── proxy.go
│ │ └── server/
│ │ └── server.go
│ └── main.go
├── config.yaml
├── example.yaml
├── go.mod
├── go.sum
├── internal/
│ ├── quake/
│ │ ├── client/
│ │ │ ├── proxy.go
│ │ │ ├── router.go
│ │ │ └── server.go
│ │ ├── content/
│ │ │ ├── download.go
│ │ │ ├── files.go
│ │ │ ├── maps.go
│ │ │ ├── router.go
│ │ │ └── router_test.go
│ │ ├── net/
│ │ │ └── net.go
│ │ └── server/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── eula.go
│ │ └── server.go
│ └── util/
│ ├── exec/
│ │ └── exec.go
│ └── net/
│ ├── http/
│ │ └── http.go
│ └── net.go
├── public/
│ ├── browserconfig.xml
│ ├── game.css
│ ├── index.html
│ ├── ioquake3.js
│ ├── manifest.json
│ └── zz_generated.static.go
└── tools/
└── genstatic.go
Showing preview only (332K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3457 symbols across 24 files)
FILE: cmd/q3/app/cmd/cmd.go
function NewCommand (line 5) | func NewCommand() *cobra.Command {
FILE: cmd/q3/app/content/content.go
function NewCommand (line 22) | func NewCommand() *cobra.Command {
FILE: cmd/q3/app/proxy/proxy.go
function NewCommand (line 19) | func NewCommand() *cobra.Command {
FILE: cmd/q3/app/server/server.go
function NewCommand (line 29) | func NewCommand() *cobra.Command {
FILE: cmd/q3/main.go
function main (line 18) | func main() {
FILE: internal/quake/client/proxy.go
type WebsocketUDPProxy (line 23) | type WebsocketUDPProxy struct
method ServeHTTP (line 37) | func (w *WebsocketUDPProxy) ServeHTTP(rw http.ResponseWriter, req *htt...
function NewProxy (line 29) | func NewProxy(addr string) (*WebsocketUDPProxy, error) {
FILE: internal/quake/client/router.go
type Config (line 17) | type Config struct
function NewRouter (line 24) | func NewRouter(cfg *Config) (*echo.Echo, error) {
type HostHeaderTransport (line 105) | type HostHeaderTransport struct
method RoundTrip (line 110) | func (t *HostHeaderTransport) RoundTrip(req *http.Request) (*http.Resp...
type TemplateRenderer (line 115) | type TemplateRenderer struct
method Render (line 119) | func (t *TemplateRenderer) Render(w io.Writer, name string, data inter...
FILE: internal/quake/client/server.go
type Server (line 11) | type Server struct
method Serve (line 17) | func (s *Server) Serve(l net.Listener) error {
method ListenAndServe (line 61) | func (s *Server) ListenAndServe() error {
FILE: internal/quake/content/download.go
function CopyAssets (line 20) | func CopyAssets(u *url.URL, dir string) error {
function getManifest (line 56) | func getManifest(url string) ([]*File, error) {
function extractDemoPack (line 71) | func extractDemoPack(path, dir string) error {
function extractPointPacks (line 115) | func extractPointPacks(path, dir string) error {
FILE: internal/quake/content/files.go
type File (line 11) | type File struct
function getAssets (line 17) | func getAssets(dir string) (files []*File, err error) {
function hasExts (line 31) | func hasExts(path string, exts ...string) bool {
function walk (line 40) | func walk(root string, walkFn filepath.WalkFunc, exts ...string) error {
FILE: internal/quake/content/maps.go
type Map (line 10) | type Map struct
function getMaps (line 15) | func getMaps(dir string) (result []*Map, err error) {
type MapPack (line 33) | type MapPack struct
method Maps (line 61) | func (m *MapPack) Maps() ([]*Map, error) {
function OpenMapPack (line 40) | func OpenMapPack(path string) (*MapPack, error) {
FILE: internal/quake/content/router.go
type Config (line 16) | type Config struct
function NewRouter (line 20) | func NewRouter(cfg *Config) (*echo.Echo, error) {
function trimAssetName (line 134) | func trimAssetName(s string) string {
FILE: internal/quake/content/router_test.go
function TestTrimAssetName (line 9) | func TestTrimAssetName(t *testing.T) {
FILE: internal/quake/net/net.go
constant OutOfBandHeader (line 14) | OutOfBandHeader = "\xff\xff\xff\xff"
constant GetInfoCommand (line 15) | GetInfoCommand = "getinfo"
constant GetStatusCommand (line 16) | GetStatusCommand = "getstatus"
function SendCommand (line 19) | func SendCommand(addr, cmd string) ([]byte, error) {
function parseMap (line 45) | func parseMap(data []byte) map[string]string {
type Player (line 59) | type Player struct
function parsePlayers (line 65) | func parsePlayers(data []byte) ([]Player, error) {
function GetInfo (line 93) | func GetInfo(addr string) (map[string]string, error) {
type StatusResponse (line 101) | type StatusResponse struct
function GetStatus (line 106) | func GetStatus(addr string) (*StatusResponse, error) {
FILE: internal/quake/server/config.go
type GameType (line 15) | type GameType
method String (line 25) | func (gt GameType) String() string {
method UnmarshalText (line 42) | func (gt *GameType) UnmarshalText(data []byte) error {
constant FreeForAll (line 18) | FreeForAll GameType = 0
constant Tournament (line 19) | Tournament GameType = 1
constant SinglePlayer (line 20) | SinglePlayer GameType = 2
constant TeamDeathmatch (line 21) | TeamDeathmatch GameType = 3
constant CaptureTheFlag (line 22) | CaptureTheFlag GameType = 4
type Config (line 60) | type Config struct
method Marshal (line 115) | func (c *Config) Marshal() ([]byte, error) {
type BotConfig (line 73) | type BotConfig struct
type GameConfig (line 78) | type GameConfig struct
type FileServerConfig (line 90) | type FileServerConfig struct
type ServerConfig (line 107) | type ServerConfig struct
function writeStruct (line 119) | func writeStruct(v reflect.Value) ([]byte, error) {
function toString (line 170) | func toString(name string, v reflect.Value) string {
function Default (line 198) | func Default() *Config {
type Map (line 228) | type Map struct
type Maps (line 237) | type Maps
method Marshal (line 239) | func (maps Maps) Marshal() ([]byte, error) {
FILE: internal/quake/server/config_test.go
constant config (line 11) | config = `
constant expectedConfig (line 45) | expectedConfig = `seta fraglimit "25"
function TestConfigMarshal (line 77) | func TestConfigMarshal(t *testing.T) {
FILE: internal/quake/server/eula.go
constant Q3DemoEULA (line 3) | Q3DemoEULA = `LIMITED USE SOFTWARE LICENSE AGREEMENT
FILE: internal/quake/server/server.go
type Server (line 42) | type Server struct
method Start (line 49) | func (s *Server) Start(ctx context.Context) error {
method reload (line 154) | func (s *Server) reload() error {
method watch (line 170) | func (s *Server) watch(ctx context.Context) (<-chan struct{}, error) {
FILE: internal/util/exec/exec.go
type Cmd (line 8) | type Cmd struct
method Restart (line 12) | func (cmd *Cmd) Restart(ctx context.Context) error {
function CommandContext (line 28) | func CommandContext(ctx context.Context, name string, args ...string) *C...
FILE: internal/util/net/http/http.go
function GetBody (line 11) | func GetBody(url string) ([]byte, error) {
function GetUntil (line 28) | func GetUntil(url string, stop <-chan struct{}) error {
FILE: internal/util/net/net.go
function DetectHostIPv4 (line 11) | func DetectHostIPv4() (string, error) {
FILE: public/ioquake3.js
function globalEval (line 139) | function globalEval(x) {
function jsCall (line 515) | function jsCall() {
function assert (line 543) | function assert(condition, text) {
function ccall (line 568) | function ccall(ident, returnType, argTypes, args) {
function getCFunc (line 574) | function getCFunc(ident) {
function ccallFunc (line 585) | function ccallFunc(func, returnType, argTypes, args) {
function cwrap (line 624) | function cwrap(ident, returnType, argTypes) {
function setValue (line 640) | function setValue(ptr, value, type, noSafe) {
function getValue (line 657) | function getValue(ptr, type, noSafe) {
function allocate (line 698) | function allocate(slab, types, allocator, ptr) {
function Pointer_stringify (line 770) | function Pointer_stringify(ptr, /* optional */ length) {
function UTF16ToString (line 810) | function UTF16ToString(ptr) {
function stringToUTF16 (line 827) | function stringToUTF16(str, outPtr) {
function UTF32ToString (line 840) | function UTF32ToString(ptr) {
function stringToUTF32 (line 863) | function stringToUTF32(str, outPtr) {
function demangle (line 880) | function demangle(func) {
function demangleAll (line 1024) | function demangleAll(text) {
function stackTrace (line 1028) | function stackTrace() {
function alignMemoryPage (line 1036) | function alignMemoryPage(x) {
function enlargeMemory (line 1047) | function enlargeMemory() {
function callRuntimeCallbacks (line 1097) | function callRuntimeCallbacks(callbacks) {
function preRun (line 1125) | function preRun() {
function ensureInitRuntime (line 1136) | function ensureInitRuntime() {
function preMain (line 1142) | function preMain() {
function exitRuntime (line 1146) | function exitRuntime() {
function postRun (line 1150) | function postRun() {
function addOnPreRun (line 1161) | function addOnPreRun(cb) {
function addOnInit (line 1166) | function addOnInit(cb) {
function addOnPreMain (line 1171) | function addOnPreMain(cb) {
function addOnExit (line 1176) | function addOnExit(cb) {
function addOnPostRun (line 1181) | function addOnPostRun(cb) {
function intArrayFromString (line 1190) | function intArrayFromString(stringy, dontAddNull, length /* optional */) {
function intArrayToString (line 1202) | function intArrayToString(array) {
function writeStringToMemory (line 1216) | function writeStringToMemory(string, buffer, dontAddNull) {
function writeArrayToMemory (line 1227) | function writeArrayToMemory(array, buffer) {
function writeAsciiToMemory (line 1234) | function writeAsciiToMemory(str, buffer, dontAddNull) {
function unSign (line 1242) | function unSign(value, bits, ignore) {
function reSign (line 1249) | function reSign(value, bits, ignore) {
function addRunDependency (line 1303) | function addRunDependency(id) {
function removeRunDependency (line 1310) | function removeRunDependency(id) {
function copyTempFloat (line 12066) | function copyTempFloat(ptr) { // functions, because inlining this code i...
function copyTempDouble (line 12078) | function copyTempDouble(ptr) {
function _emscripten_memcpy_big (line 12101) | function _emscripten_memcpy_big(dest, src, num) {
function _llvm_lifetime_start (line 12107) | function _llvm_lifetime_start() {}
function _isspace (line 12112) | function _isspace(chr) {
function ___setErrNo (line 12117) | function ___setErrNo(value) {
function __parseInt (line 12123) | function __parseInt(str, endptr, base, min, max, bits, unsign) {
function _strtol (line 12201) | function _strtol(str, endptr, base) {
function _atoi (line 12203) | function _atoi(ptr) {
function _llvm_lifetime_end (line 12214) | function _llvm_lifetime_end() {}
function isRealDir (line 12668) | function isRealDir(p) {
function toAbsolute (line 12671) | function toAbsolute(root) {
function done (line 12815) | function done(err) {
function _fflush (line 13091) | function _fflush(stream) {
function done (line 13446) | function done(err) {
function LazyUint8Array (line 14316) | function LazyUint8Array() {
function processData (line 14458) | function processData(byteArray) {
function finish (line 14510) | function finish() {
function finish (line 14541) | function finish() {
function trim (line 14647) | function trim(arr) {
function finish (line 14775) | function finish(audio) {
function fail (line 14781) | function fail() {
function encode64 (line 14799) | function encode64(data) {
function pointerLockChange (line 14849) | function pointerLockChange() {
function onContextCreationError (line 14884) | function onContextCreationError(event) {
function fullScreenChange (line 14926) | function fullScreenChange() {
function downloadedBytes (line 15238) | function downloadedBytes() {
function totalBytes (line 15242) | function totalBytes() {
function nextDownload (line 15246) | function nextDownload() {
function isInstaller (line 15284) | function isInstaller(name) {
function isCommon (line 15290) | function isCommon(name) {
function isMapPak (line 15295) | function isMapPak(name) {
function activePaks (line 15299) | function activePaks(entry) {
function formatManifestString (line 15303) | function formatManifestString(manifest) {
function nextEntry (line 15389) | function nextEntry() {
function _Sys_Milliseconds (line 15546) | function _Sys_Milliseconds() {
function _Sys_LowPhysicalMemory (line 15569) | function _Sys_LowPhysicalMemory() {
function _round (line 15574) | function _round(x) {
function _strchr (line 15591) | function _strchr(ptr, chr) {
function _isalnum (line 15601) | function _isalnum(chr) {
function _Sys_GetClipboardData (line 15613) | function _Sys_GetClipboardData() {
function _strrchr (line 15621) | function _strrchr(ptr, chr) {
function _rint (line 15638) | function _rint(x) {
function _Sys_SetEnv (line 15643) | function _Sys_SetEnv(name, value) {
function _Sys_GLimpSafeInit (line 15648) | function _Sys_GLimpSafeInit() {
function _Sys_GLimpInit (line 15651) | function _Sys_GLimpInit() {
function __getFloat (line 15667) | function __getFloat(text) {
function __scanString (line 15669) | function __scanString(format, get, unget, varargs) {
function _sscanf (line 15933) | function _sscanf(s, format, varargs) {
function __reallyNegative (line 15945) | function __reallyNegative(x) {
function __formatString (line 15947) | function __formatString(format, varargs) {
function _snprintf (line 16349) | function _snprintf(s, n, format, varargs) {
function _sprintf (line 16366) | function _sprintf(s, format, varargs) {
function _vsnprintf (line 16374) | function _vsnprintf(s, n, format, va_arg) {
function _llvm_va_end (line 16378) | function _llvm_va_end() {}
function _strpbrk (line 16384) | function _strpbrk(ptr1, ptr2) {
function _time (line 16401) | function _time(ptr) {
function _tzset (line 16420) | function _tzset() {
function _localtime_r (line 16437) | function _localtime_r(time, tmPtr) {
function _localtime (line 16459) | function _localtime(time) {
function _mktime (line 16467) | function _mktime(tmPtr) {
function _asctime_r (line 16481) | function _asctime_r(tmPtr, buf) {
function _asctime (line 16492) | function _asctime(tmPtr) {
function _mkport (line 16503) | function _mkport() { throw 'TODO' }
function handleOpen (line 16648) | function handleOpen() {
function handleMessage (line 16662) | function handleMessage(data) {
function handleClose (line 16685) | function handleClose() {
function _send (line 16994) | function _send(fd, buf, len, flags) {
function _pwrite (line 17004) | function _pwrite(fildes, buf, nbyte, offset) {
function _write (line 17019) | function _write(fildes, buf, nbyte) {
function _fileno (line 17038) | function _fileno(stream) {
function _fputc (line 17042) | function _fputc(c, stream) {
function _putchar (line 17056) | function _putchar(c) {
function _longjmp (line 17064) | function _longjmp(env, value) {
function _toupper (line 17071) | function _toupper(chr) {
function ___buildEnvironment (line 17083) | function ___buildEnvironment(env) {
function _getenv (line 17134) | function _getenv(name) {
function _Sys_RandomBytes (line 17146) | function _Sys_RandomBytes(string, len) {
function _Sys_Dialog (line 17150) | function _Sys_Dialog(type, message, title) {
function _srand (line 17154) | function _srand(seed) {
function _strstr (line 17158) | function _strstr(ptr1, ptr2) {
function _setvbuf (line 17177) | function _setvbuf(stream, buf, type, size) {
function _ftell (line 17184) | function _ftell(stream) {
function _lseek (line 17201) | function _lseek(fildes, offset, whence) {
function _fseek (line 17215) | function _fseek(stream, offset, whence) {
function _Sys_Mkdir (line 17228) | function _Sys_Mkdir(directory) {
function _unlink (line 17242) | function _unlink(path) {
function _rmdir (line 17255) | function _rmdir(path) {
function _remove (line 17266) | function _remove(path) {
function _Sys_FOpen (line 17274) | function _Sys_FOpen(ospath, mode) {
function _close (line 17279) | function _close(fildes) {
function _fsync (line 17296) | function _fsync(fildes) {
function _fclose (line 17307) | function _fclose(stream) {
function _rename (line 17315) | function _rename(old_path, new_path) {
function _Sys_Mkfifo (line 17329) | function _Sys_Mkfifo(path) {
function _recv (line 17335) | function _recv(fd, buf, len, flags) {
function _pread (line 17345) | function _pread(fildes, buf, nbyte, offset) {
function _read (line 17360) | function _read(fildes, buf, nbyte) {
function _fread (line 17377) | function _fread(ptr, size, nitems, stream) {
function _fwrite (line 17405) | function _fwrite(ptr, size, nitems, stream) {
function _Sys_ListFiles (line 17422) | function _Sys_ListFiles(directory, ext, filter, numfiles, dironly) {
function _Sys_FreeFileList (line 17479) | function _Sys_FreeFileList(list) {
function _qsort (line 17493) | function _qsort(base, num, size, cmp) {
function _Sys_FS_Shutdown (line 17512) | function _Sys_FS_Shutdown(context) {
function _Sys_DefaultHomePath (line 17529) | function _Sys_DefaultHomePath() {
function _Sys_FS_Startup (line 17533) | function _Sys_FS_Startup(context) {
function _llvm_uadd_with_overflow_i32 (line 17576) | function _llvm_uadd_with_overflow_i32(x, y) {
function _strerror_r (line 17583) | function _strerror_r(errnum, strerrbuf, buflen) {
function _strerror (line 17595) | function _strerror(errnum) {
function ___errno_location (line 17601) | function ___errno_location() {
function _htons (line 17606) | function _htons(value) {
function __inet_pton4_raw (line 17612) | function __inet_pton4_raw(str) {
function __inet_pton6_raw (line 17622) | function __inet_pton6_raw(str) {
function __write_sockaddr (line 17712) | function __write_sockaddr(sa, family, addr, port) {
function _recvfrom (line 17734) | function _recvfrom(fd, buf, len, flags, addr, addrlen) {
function __inet_ntop4_raw (line 17768) | function __inet_ntop4_raw(addr) {
function __inet_ntop6_raw (line 17772) | function __inet_ntop6_raw(ints) {
function __read_sockaddr (line 17867) | function __read_sockaddr(sa, salen) {
function _sendto (line 17898) | function _sendto(fd, message, length, flags, dest_addr, dest_len) {
function _socket (line 17924) | function _socket(family, type, protocol) {
function _ioctl (line 17930) | function _ioctl(fd, request, varargs) {
function _setsockopt (line 17947) | function _setsockopt(fd, level, optname, optval, optlen) {
function _bind (line 17953) | function _bind(fd, addrp, addrlen) {
function _if_nametoindex (line 17977) | function _if_nametoindex(a) {
function _gethostbyname (line 17981) | function _gethostbyname(name) {
function _connect (line 18003) | function _connect(fd, addrp, addrlen) {
function _select (line 18030) | function _select(nfds, readfds, writefds, exceptfds, timeout) {
function _gethostname (line 18113) | function _gethostname(name, namelen) {
function _htonl (line 18134) | function _htonl(value) {
function _getaddrinfo (line 18137) | function _getaddrinfo(node, service, hint, out) {
function _freeaddrinfo (line 18308) | function _freeaddrinfo(ai) {
function _getnameinfo (line 18314) | function _getnameinfo(sa, salen, node, nodelen, serv, servlen, flags) {
function _gai_strerror (line 18349) | function _gai_strerror(val) {
function _alcIsExtensionPresent (line 18473) | function _alcIsExtensionPresent(device, extName) {
function _alcGetString (line 18477) | function _alcGetString(device, param) {
function _alcOpenDevice (line 18540) | function _alcOpenDevice(deviceName) {
function _alcCreateContext (line 18550) | function _alcCreateContext(device, attrList) {
function _alcCloseDevice (line 18586) | function _alcCloseDevice(device) {
function _alcMakeContextCurrent (line 18590) | function _alcMakeContextCurrent(context) {
function _alDistanceModel (line 18600) | function _alDistanceModel(model) {
function _alDopplerFactor (line 18605) | function _alDopplerFactor(value) {
function _alDopplerVelocity (line 18608) | function _alDopplerVelocity(value) {
function _alGetString (line 18611) | function _alGetString(param) {
function _alBufferData (line 18657) | function _alBufferData(buffer, format, data, size, freq) {
function _alGetError (line 18712) | function _alGetError() {
function _alDeleteBuffers (line 18723) | function _alDeleteBuffers(count, buffers)
function _alGenBuffers (line 18764) | function _alGenBuffers(count, buffers) {
function _alGetSourcei (line 18775) | function _alGetSourcei(source, param, value) {
function _alSourceUnqueueBuffers (line 18838) | function _alSourceUnqueueBuffers(source, count, buffers) {
function _alSourceQueueBuffers (line 18869) | function _alSourceQueueBuffers(source, count, buffers) {
function _alSourcePlay (line 18896) | function _alSourcePlay(source) {
function _alSourcei (line 18908) | function _alSourcei(source, param, value) {
function _alSourceStop (line 18973) | function _alSourceStop(source) {
function _alGetSourcef (line 18985) | function _alGetSourcef(source, param, value) {
function _alSourcef (line 19034) | function _alSourcef(source, param, value) {
function _fmod (line 19078) | function _fmod(x, y) {
function _alSource3f (line 19083) | function _alSource3f(source, param, v1, v2, v3) {
function _alSourcefv (line 19106) | function _alSourcefv(source, param, value) {
function _alListenerfv (line 19113) | function _alListenerfv(param, values) {
function _alcDestroyContext (line 19149) | function _alcDestroyContext(context) {
function _alDeleteSources (line 19154) | function _alDeleteSources(count, sources) {
function _alGenSources (line 19164) | function _alGenSources(count, sources) {
function _llvm_bswap_i16 (line 19249) | function _llvm_bswap_i16(x) {
function _llvm_bswap_i32 (line 19253) | function _llvm_bswap_i32(x) {
function _open (line 19258) | function _open(path, oflag, varargs) {
function _fopen (line 19270) | function _fopen(filename, mode) {
function _ferror (line 19305) | function _ferror(stream) {
function PUSH_EXPR (line 19413) | function PUSH_EXPR(expr) {
function POP_EXPR (line 19417) | function POP_EXPR(type) {
function CAST_STR (line 19421) | function CAST_STR(type, expr) {
function BITCAST_STR (line 19437) | function BITCAST_STR(type, expr) {
function OFFSET_STR (line 19470) | function OFFSET_STR(expr) {
function CNST (line 19479) | function CNST(value) {
function LOCAL (line 19494) | function LOCAL(offset) {
function LOAD4 (line 19509) | function LOAD4(addr) {
function LOAD2 (line 19524) | function LOAD2(addr) {
function LOAD1 (line 19540) | function LOAD1(addr) {
function UNARY (line 19556) | function UNARY(type, op, expr) {
function BINARY (line 19592) | function BINARY(type, op, lhs, rhs) {
function CONVERT (line 19657) | function CONVERT(type, from_type, expr) {
function EmitStatement (line 19679) | function EmitStatement(str) {
function EmitEnter (line 19687) | function EmitEnter(frameSize) {
function EmitLeave (line 19698) | function EmitLeave(frameSize, ret) {
function EmitCall (line 19713) | function EmitCall(addr) {
function EmitJump (line 19826) | function EmitJump(label) {
function EmitConditionalJump (line 19831) | function EmitConditionalJump(lhs, rhs, cond, label) {
function EmitStore4 (line 19849) | function EmitStore4(addr, value) {
function EmitStore2 (line 19857) | function EmitStore2(addr, value) {
function EmitStore1 (line 19861) | function EmitStore1(addr, value) {
function EmitBlockCopy (line 19865) | function EmitBlockCopy(dest, src, bytes) {
function _VM_Destroy (line 20210) | function _VM_Destroy(vmp) {
function _VM_Compile (line 20214) | function _VM_Compile(vmp, headerp) {
function _VM_SuspendCompiled (line 20249) | function _VM_SuspendCompiled(vmp, stackOnEntry) {
function _VM_CallCompiled (line 20260) | function _VM_CallCompiled(vmp, args) {
function _fprintf (line 20327) | function _fprintf(stream, format, varargs) {
function _VM_IsSuspendedCompiled (line 20337) | function _VM_IsSuspendedCompiled(vmp) {
function _VM_ResumeCompiled (line 20349) | function _VM_ResumeCompiled(vmp) {
function _clock (line 20412) | function _clock() {
function _vfprintf (line 20417) | function _vfprintf(s, f, va_arg) {
function _strncat (line 20421) | function _strncat(pdest, psrc, num) {
function _ctime (line 20436) | function _ctime(timer) {
function _SDL_GetAppState (line 21030) | function _SDL_GetAppState() {
function _SDL_GetKeyboardState (line 21044) | function _SDL_GetKeyboardState(numKeys) {
function _SDL_Init (line 21052) | function _SDL_Init(initFlags) {
function _SDL_WasInit (line 21092) | function _SDL_WasInit() {
function _SDL_EnableUNICODE (line 21099) | function _SDL_EnableUNICODE(on) {
function _SDL_EnableKeyRepeat (line 21105) | function _SDL_EnableKeyRepeat(delay, interval) {
function _SDL_JoystickClose (line 21109) | function _SDL_JoystickClose(joystick) {
function _SDL_QuitSubSystem (line 21113) | function _SDL_QuitSubSystem(flags) {
function _SDL_GetError (line 21118) | function _SDL_GetError() {
function _SDL_NumJoysticks (line 21125) | function _SDL_NumJoysticks() {
function _SDL_JoystickName (line 21135) | function _SDL_JoystickName(deviceIndex) {
function _SDL_JoystickOpen (line 21147) | function _SDL_JoystickOpen(deviceIndex) {
function _SDL_JoystickNumAxes (line 21158) | function _SDL_JoystickNumAxes(joystick) {
function _SDL_JoystickNumHats (line 21166) | function _SDL_JoystickNumHats(joystick) { return 0; }
function _SDL_JoystickNumButtons (line 21168) | function _SDL_JoystickNumButtons(joystick) {
function _SDL_JoystickNumBalls (line 21176) | function _SDL_JoystickNumBalls(joystick) { return 0; }
function _SDL_JoystickEventState (line 21178) | function _SDL_JoystickEventState(state) {
function _SDL_ShowCursor (line 21186) | function _SDL_ShowCursor(toggle) {
function _SDL_WM_GrabInput (line 21209) | function _SDL_WM_GrabInput() {}
function _SDL_PumpEvents (line 21211) | function _SDL_PumpEvents(){
function _SDL_PeepEvents (line 21217) | function _SDL_PeepEvents(events, numEvents, action, from, to) {
function _SDL_WarpMouse (line 21236) | function _SDL_WarpMouse(x, y) {
function _SDL_PollEvent (line 21246) | function _SDL_PollEvent(ptr) {
function _SDL_GetKeyName (line 21259) | function _SDL_GetKeyName(key) {
function _SDL_JoystickUpdate (line 21266) | function _SDL_JoystickUpdate() {
function _SDL_JoystickGetBall (line 21270) | function _SDL_JoystickGetBall(joystick, ball, dxptr, dyptr) { return -1; }
function _SDL_JoystickGetButton (line 21272) | function _SDL_JoystickGetButton(joystick, button) {
function _SDL_JoystickGetHat (line 21280) | function _SDL_JoystickGetHat(joystick, hat) { return 0; }
function _SDL_JoystickGetAxis (line 21282) | function _SDL_JoystickGetAxis(joystick, axis) {
function _SDL_VideoDriverName (line 21291) | function _SDL_VideoDriverName(buf, max_size) {
function _SDL_AudioDriverName (line 21314) | function _SDL_AudioDriverName(buf, max_size) {
function _SDL_OpenAudio (line 21318) | function _SDL_OpenAudio(desired, obtained) {
function _SDL_PauseAudio (line 21524) | function _SDL_PauseAudio(pauseOn) {
function _SDL_CloseAudio (line 21559) | function _SDL_CloseAudio() {
function _SDL_UnlockAudio (line 21576) | function _SDL_UnlockAudio() {}
function _SDL_LockAudio (line 21578) | function _SDL_LockAudio() {}
function _Sys_Cwd (line 21580) | function _Sys_Cwd() {
function _Sys_PIDIsRunning (line 21585) | function _Sys_PIDIsRunning(pid) {
function _Sys_PID (line 21589) | function _Sys_PID() {
function _SDL_HasRDTSC (line 21593) | function _SDL_HasRDTSC() { return 0; }
function _SDL_HasMMX (line 21595) | function _SDL_HasMMX() { return 0; }
function _SDL_Has3DNow (line 21597) | function _SDL_Has3DNow() { return 0; }
function _SDL_HasSSE (line 21599) | function _SDL_HasSSE() { return 0; }
function _SDL_HasSSE2 (line 21601) | function _SDL_HasSSE2() { return 0; }
function _SDL_HasAltiVec (line 21603) | function _SDL_HasAltiVec() { return 0; }
function _Sys_GetCurrentUser (line 21605) | function _Sys_GetCurrentUser() {
function _fputs (line 21612) | function _fputs(s, stream) {
function _Sys_ErrorDialog (line 21619) | function _Sys_ErrorDialog(error) {
function _dlclose (line 21640) | function _dlclose(handle) {
function _dlopen (line 21659) | function _dlopen(filename, flag) {
function _dlerror (line 21725) | function _dlerror() {
function _dlsym (line 21739) | function _dlsym(handle, symbol) {
function _SDL_Linked_Version (line 21771) | function _SDL_Linked_Version() {
function _Sys_PlatformInit (line 21781) | function _Sys_PlatformInit() {
function _Sys_Dirname (line 21817) | function _Sys_Dirname(path) {
function _emscripten_exit_with_live_runtime (line 21824) | function _emscripten_exit_with_live_runtime() {
function _signal (line 21829) | function _signal(sig, func) {
function _emscripten_set_main_loop (line 21834) | function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop) {
function _SDL_Quit (line 21920) | function _SDL_Quit() {
function _Sys_PlatformExit (line 21932) | function _Sys_PlatformExit() {
function __exit (line 21960) | function __exit(status) {
function _exit (line 21964) | function _exit(status) {
function _exp2 (line 21977) | function _exp2(x) {
function _memchr (line 21981) | function _memchr(ptr, chr, num) {
function isIdentChar (line 22099) | function isIdentChar(ch) {
function roundedToNextMultipleOf (line 22152) | function roundedToNextMultipleOf(x, y) {
function shouldEnableAutomatically (line 22376) | function shouldEnableAutomatically(extension) {
function _glBindTexture (line 22434) | function _glBindTexture(target, texture) {
function _glDisable (line 22438) | function _glDisable(x0) { GLctx.disable(x0) }
function _glEnable (line 22440) | function _glEnable(x0) { GLctx.enable(x0) }
function _glCullFace (line 22442) | function _glCullFace(x0) { GLctx.cullFace(x0) }
function _glTexEnvf (line 22444) | function _glTexEnvf() { Runtime.warnOnce('glTexEnvf: TODO') }
function _glDepthFunc (line 22446) | function _glDepthFunc(x0) { GLctx.depthFunc(x0) }
function _glBlendFunc (line 22448) | function _glBlendFunc(x0, x1) { GLctx.blendFunc(x0, x1) }
function _glDepthMask (line 22450) | function _glDepthMask(x0) { GLctx.depthMask(x0) }
function _glPolygonMode (line 22452) | function _glPolygonMode(){}
function _glFinish (line 22454) | function _glFinish() { GLctx.finish() }
function _glClearColor (line 22456) | function _glClearColor(x0, x1, x2, x3) { GLctx.clearColor(x0, x1, x2, x3) }
function _glClear (line 22458) | function _glClear(x0) { GLctx.clear(x0) }
function _glDepthRange (line 22460) | function _glDepthRange(x0, x1) { GLctx.depthRange(x0, x1) }
function _glViewport (line 22462) | function _glViewport(x0, x1, x2, x3) { GLctx.viewport(x0, x1, x2, x3) }
function _glScissor (line 22464) | function _glScissor(x0, x1, x2, x3) { GLctx.scissor(x0, x1, x2, x3) }
function _glTexImage2D (line 22466) | function _glTexImage2D(target, level, internalFormat, width, height, bor...
function _glTexParameterf (line 22477) | function _glTexParameterf(x0, x1, x2) { GLctx.texParameterf(x0, x1, x2) }
function _glTexSubImage2D (line 22479) | function _glTexSubImage2D(target, level, xoffset, yoffset, width, height...
function _glColorMask (line 22489) | function _glColorMask(x0, x1, x2, x3) { GLctx.colorMask(x0, x1, x2, x3) }
function _glCopyTexImage2D (line 22491) | function _glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx.copyT...
function _glDrawBuffer (line 22495) | function _glDrawBuffer() { throw 'glDrawBuffer: TODO' }
function _glReadPixels (line 22497) | function _glReadPixels(x, y, width, height, format, type, pixels) {
function _glStencilMask (line 22516) | function _glStencilMask(x0) { GLctx.stencilMask(x0) }
function _glClearStencil (line 22518) | function _glClearStencil(x0) { GLctx.clearStencil(x0) }
function _glStencilFunc (line 22520) | function _glStencilFunc(x0, x1, x2) { GLctx.stencilFunc(x0, x1, x2) }
function _glStencilOp (line 22522) | function _glStencilOp(x0, x1, x2) { GLctx.stencilOp(x0, x1, x2) }
function _glGetError (line 22524) | function _glGetError() {
function _SDL_GL_GetProcAddress (line 22535) | function _SDL_GL_GetProcAddress(name_) {
function _glGetString (line 22539) | function _glGetString(name_) {
function _glGetIntegerv (line 22568) | function _glGetIntegerv(name_, p) {
function _glReadBuffer (line 22572) | function _glReadBuffer() { throw 'glReadBuffer: TODO' }
function _glGenTextures (line 22574) | function _glGenTextures(n, textures) {
function _glTexParameteri (line 22584) | function _glTexParameteri(x0, x1, x2) { GLctx.texParameteri(x0, x1, x2) }
function _glDeleteTextures (line 22588) | function _glDeleteTextures(n, textures) {
function _glTexParameterfv (line 22598) | function _glTexParameterfv(target, pname, params) {
function _glClearDepth (line 22605) | function _glClearDepth(x0) { GLctx.clearDepth(x0) }
function _glColor4f (line 22607) | function _glColor4f(r, g, b, a) {
function _glDrawElements (line 22630) | function _glDrawElements(mode, count, type, indices) {
function _glPolygonOffset (line 22636) | function _glPolygonOffset(x0, x1) { GLctx.polygonOffset(x0, x1) }
function _glIsEnabled (line 22642) | function _glIsEnabled(x0) { return GLctx.isEnabled(x0) }
function _glGetBooleanv (line 22644) | function _glGetBooleanv(name_, p) {
function _glCreateShader (line 22648) | function _glCreateShader(shaderType) {
function _glShaderSource (line 22654) | function _glShaderSource(shader, count, string, length) {
function _glCompileShader (line 22659) | function _glCompileShader(shader) {
function _glAttachShader (line 22663) | function _glAttachShader(program, shader) {
function _glDetachShader (line 22668) | function _glDetachShader(program, shader) {
function _glUseProgram (line 22673) | function _glUseProgram(program) {
function _glDeleteProgram (line 22677) | function _glDeleteProgram(program) {
function _glBindAttribLocation (line 22685) | function _glBindAttribLocation(program, index, name) {
function _glLinkProgram (line 22690) | function _glLinkProgram(program) {
function _glBindBuffer (line 22696) | function _glBindBuffer(target, buffer) {
function _glGetFloatv (line 22708) | function _glGetFloatv(name_, p) {
function _glHint (line 22712) | function _glHint(x0, x1) { GLctx.hint(x0, x1) }
function _glEnableVertexAttribArray (line 22714) | function _glEnableVertexAttribArray(index) {
function _glDisableVertexAttribArray (line 22718) | function _glDisableVertexAttribArray(index) {
function _glVertexAttribPointer (line 22722) | function _glVertexAttribPointer(index, size, type, normalized, stride, p...
function _glActiveTexture (line 22726) | function _glActiveTexture(x0) { GLctx.activeTexture(x0) }
function ensurePrecision (line 22922) | function ensurePrecision(source) {
function CNaiveListMap (line 23177) | function CNaiveListMap() {
function CMapTree (line 23225) | function CMapTree() {
function abort (line 23378) | function abort(info) {
function abort_noSupport (line 23382) | function abort_noSupport(info) {
function abort_sanity (line 23386) | function abort_sanity(info) {
function genTexUnitSampleExpr (line 23390) | function genTexUnitSampleExpr(texUnitID) {
function getTypeFromCombineOp (line 23418) | function getTypeFromCombineOp(op) {
function getCurTexUnit (line 23431) | function getCurTexUnit() {
function genCombinerSourceExpr (line 23435) | function genCombinerSourceExpr(texUnitID, constantExpr, previousVar,
function valToFloatLiteral (line 23477) | function valToFloatLiteral(val) {
function CTexEnv (line 23484) | function CTexEnv() {
function CTexUnit (line 23587) | function CTexUnit() {
function _glBegin (line 27002) | function _glBegin(mode) {
function _emscripten_glVertex3f (line 27024) | function _emscripten_glVertex3f(x, y, z) {
function _glVertex3fv (line 27029) | function _glVertex3fv(p) {
function _glEnd (line 27033) | function _glEnd() {
function _emscripten_glColor4f (line 27049) | function _emscripten_glColor4f(r, g, b, a) {
function _glColor3f (line 27070) | function _glColor3f(r, g, b) {
function _glLoadIdentity (line 27075) | function _glLoadIdentity() {
function _glVertex3f (line 27081) | function _glVertex3f(x, y, z) {
function _SDL_SetGammaRamp (line 27088) | function _SDL_SetGammaRamp(redTable, greenTable, blueTable) {
function _SDL_WM_IconifyWindow (line 27092) | function _SDL_WM_IconifyWindow() { throw 'SDL_WM_IconifyWindow TODO' }
function _SDL_GetVideoInfo (line 27094) | function _SDL_GetVideoInfo() {
function _SDL_GL_SetAttribute (line 27105) | function _SDL_GL_SetAttribute(attr, value) {
function _SDL_WM_SetCaption (line 27113) | function _SDL_WM_SetCaption(title, icon) {
function _SDL_SetVideoMode (line 27118) | function _SDL_SetVideoMode(width, height, depth, flags) {
function _SDL_SetGamma (line 27150) | function _SDL_SetGamma(r, g, b) {
function _SDL_GL_SwapBuffers (line 27154) | function _SDL_GL_SwapBuffers() {}
function _SDL_GetVideoSurface (line 27156) | function _SDL_GetVideoSurface() {
function _SDL_WM_ToggleFullScreen (line 27160) | function _SDL_WM_ToggleFullScreen(surf) {
function _SDL_ListModes (line 27174) | function _SDL_ListModes(format, flags) {
function _emscripten_glPixelStorei (line 27178) | function _emscripten_glPixelStorei(pname, param) {
function _emscripten_glGetString (line 27187) | function _emscripten_glGetString(name_) {
function _emscripten_glGetIntegerv (line 27216) | function _emscripten_glGetIntegerv(name_, p) {
function _emscripten_glGetFloatv (line 27220) | function _emscripten_glGetFloatv(name_, p) {
function _emscripten_glGetBooleanv (line 27224) | function _emscripten_glGetBooleanv(name_, p) {
function _emscripten_glGenTextures (line 27228) | function _emscripten_glGenTextures(n, textures) {
function _emscripten_glDeleteTextures (line 27238) | function _emscripten_glDeleteTextures(n, textures) {
function _emscripten_glCompressedTexImage2D (line 27248) | function _emscripten_glCompressedTexImage2D(target, level, internalForma...
function _emscripten_glCompressedTexSubImage2D (line 27258) | function _emscripten_glCompressedTexSubImage2D(target, level, xoffset, y...
function _emscripten_glTexImage2D (line 27267) | function _emscripten_glTexImage2D(target, level, internalFormat, width, ...
function _emscripten_glTexSubImage2D (line 27278) | function _emscripten_glTexSubImage2D(target, level, xoffset, yoffset, wi...
function _emscripten_glReadPixels (line 27288) | function _emscripten_glReadPixels(x, y, width, height, format, type, pix...
function _emscripten_glBindTexture (line 27305) | function _emscripten_glBindTexture(target, texture) {
function _emscripten_glGetTexParameterfv (line 27309) | function _emscripten_glGetTexParameterfv(target, pname, params) {
function _emscripten_glGetTexParameteriv (line 27313) | function _emscripten_glGetTexParameteriv(target, pname, params) {
function _emscripten_glTexParameterfv (line 27317) | function _emscripten_glTexParameterfv(target, pname, params) {
function _emscripten_glTexParameteriv (line 27322) | function _emscripten_glTexParameteriv(target, pname, params) {
function _emscripten_glIsTexture (line 27327) | function _emscripten_glIsTexture(texture) {
function _emscripten_glGenBuffers (line 27333) | function _emscripten_glGenBuffers(n, buffers) {
function _emscripten_glDeleteBuffers (line 27343) | function _emscripten_glDeleteBuffers(n, buffers) {
function _emscripten_glGetBufferParameteriv (line 27361) | function _emscripten_glGetBufferParameteriv(target, value, data) {
function _emscripten_glBufferData (line 27365) | function _emscripten_glBufferData(target, size, data, usage) {
function _emscripten_glBufferSubData (line 27387) | function _emscripten_glBufferSubData(target, offset, size, data) {
function _emscripten_glIsBuffer (line 27391) | function _emscripten_glIsBuffer(buffer) {
function _emscripten_glGenRenderbuffers (line 27397) | function _emscripten_glGenRenderbuffers(n, renderbuffers) {
function _emscripten_glDeleteRenderbuffers (line 27407) | function _emscripten_glDeleteRenderbuffers(n, renderbuffers) {
function _emscripten_glBindRenderbuffer (line 27417) | function _emscripten_glBindRenderbuffer(target, renderbuffer) {
function _emscripten_glGetRenderbufferParameteriv (line 27421) | function _emscripten_glGetRenderbufferParameteriv(target, pname, params) {
function _emscripten_glIsRenderbuffer (line 27425) | function _emscripten_glIsRenderbuffer(renderbuffer) {
function _emscripten_glGetUniformfv (line 27431) | function _emscripten_glGetUniformfv(program, location, params) {
function _emscripten_glGetUniformiv (line 27442) | function _emscripten_glGetUniformiv(program, location, params) {
function _emscripten_glGetUniformLocation (line 27453) | function _emscripten_glGetUniformLocation(program, name) {
function _emscripten_glGetVertexAttribfv (line 27483) | function _emscripten_glGetVertexAttribfv(index, pname, params) {
function _emscripten_glGetVertexAttribiv (line 27494) | function _emscripten_glGetVertexAttribiv(index, pname, params) {
function _emscripten_glGetVertexAttribPointerv (line 27505) | function _emscripten_glGetVertexAttribPointerv(index, pname, pointer) {
function _emscripten_glGetActiveUniform (line 27509) | function _emscripten_glGetActiveUniform(program, index, bufSize, length,...
function _emscripten_glUniform1f (line 27527) | function _emscripten_glUniform1f(location, v0) {
function _emscripten_glUniform2f (line 27532) | function _emscripten_glUniform2f(location, v0, v1) {
function _emscripten_glUniform3f (line 27537) | function _emscripten_glUniform3f(location, v0, v1, v2) {
function _emscripten_glUniform4f (line 27542) | function _emscripten_glUniform4f(location, v0, v1, v2, v3) {
function _emscripten_glUniform1i (line 27547) | function _emscripten_glUniform1i(location, v0) {
function _emscripten_glUniform2i (line 27552) | function _emscripten_glUniform2i(location, v0, v1) {
function _emscripten_glUniform3i (line 27557) | function _emscripten_glUniform3i(location, v0, v1, v2) {
function _emscripten_glUniform4i (line 27562) | function _emscripten_glUniform4i(location, v0, v1, v2, v3) {
function _emscripten_glUniform1iv (line 27567) | function _emscripten_glUniform1iv(location, count, value) {
function _emscripten_glUniform2iv (line 27573) | function _emscripten_glUniform2iv(location, count, value) {
function _emscripten_glUniform3iv (line 27580) | function _emscripten_glUniform3iv(location, count, value) {
function _emscripten_glUniform4iv (line 27587) | function _emscripten_glUniform4iv(location, count, value) {
function _emscripten_glUniform1fv (line 27594) | function _emscripten_glUniform1fv(location, count, value) {
function _emscripten_glUniform2fv (line 27607) | function _emscripten_glUniform2fv(location, count, value) {
function _emscripten_glUniform3fv (line 27621) | function _emscripten_glUniform3fv(location, count, value) {
function _emscripten_glUniform4fv (line 27636) | function _emscripten_glUniform4fv(location, count, value) {
function _emscripten_glUniformMatrix2fv (line 27652) | function _emscripten_glUniformMatrix2fv(location, count, transpose, valu...
function _emscripten_glUniformMatrix3fv (line 27667) | function _emscripten_glUniformMatrix3fv(location, count, transpose, valu...
function _emscripten_glUniformMatrix4fv (line 27682) | function _emscripten_glUniformMatrix4fv(location, count, transpose, valu...
function _emscripten_glBindBuffer (line 27697) | function _emscripten_glBindBuffer(target, buffer) {
function _emscripten_glVertexAttrib1fv (line 27709) | function _emscripten_glVertexAttrib1fv(index, v) {
function _emscripten_glVertexAttrib2fv (line 27714) | function _emscripten_glVertexAttrib2fv(index, v) {
function _emscripten_glVertexAttrib3fv (line 27719) | function _emscripten_glVertexAttrib3fv(index, v) {
function _emscripten_glVertexAttrib4fv (line 27724) | function _emscripten_glVertexAttrib4fv(index, v) {
function _emscripten_glGetAttribLocation (line 27729) | function _emscripten_glGetAttribLocation(program, name) {
function _emscripten_glGetActiveAttrib (line 27735) | function _emscripten_glGetActiveAttrib(program, index, bufSize, length, ...
function _emscripten_glCreateShader (line 27753) | function _emscripten_glCreateShader(shaderType) {
function _emscripten_glDeleteShader (line 27759) | function _emscripten_glDeleteShader(shader) {
function _emscripten_glGetAttachedShaders (line 27764) | function _emscripten_glGetAttachedShaders(program, maxCount, count, shad...
function _emscripten_glShaderSource (line 27777) | function _emscripten_glShaderSource(shader, count, string, length) {
function _emscripten_glGetShaderSource (line 27782) | function _emscripten_glGetShaderSource(shader, bufSize, length, source) {
function _emscripten_glCompileShader (line 27791) | function _emscripten_glCompileShader(shader) {
function _emscripten_glGetShaderInfoLog (line 27795) | function _emscripten_glGetShaderInfoLog(shader, maxLength, length, infoL...
function _emscripten_glGetShaderiv (line 27806) | function _emscripten_glGetShaderiv(shader, pname, p) {
function _emscripten_glGetProgramiv (line 27817) | function _emscripten_glGetProgramiv(program, pname, p) {
function _emscripten_glIsShader (line 27854) | function _emscripten_glIsShader(shader) {
function _emscripten_glCreateProgram (line 27860) | function _emscripten_glCreateProgram() {
function _emscripten_glDeleteProgram (line 27868) | function _emscripten_glDeleteProgram(program) {
function _emscripten_glAttachShader (line 27876) | function _emscripten_glAttachShader(program, shader) {
function _emscripten_glDetachShader (line 27881) | function _emscripten_glDetachShader(program, shader) {
function _emscripten_glGetShaderPrecisionFormat (line 27886) | function _emscripten_glGetShaderPrecisionFormat() { throw 'glGetShaderPr...
function _emscripten_glLinkProgram (line 27888) | function _emscripten_glLinkProgram(program) {
function _emscripten_glGetProgramInfoLog (line 27894) | function _emscripten_glGetProgramInfoLog(program, maxLength, length, inf...
function _emscripten_glUseProgram (line 27907) | function _emscripten_glUseProgram(program) {
function _emscripten_glValidateProgram (line 27911) | function _emscripten_glValidateProgram(program) {
function _emscripten_glIsProgram (line 27915) | function _emscripten_glIsProgram(program) {
function _emscripten_glBindAttribLocation (line 27921) | function _emscripten_glBindAttribLocation(program, index, name) {
function _emscripten_glBindFramebuffer (line 27926) | function _emscripten_glBindFramebuffer(target, framebuffer) {
function _emscripten_glGenFramebuffers (line 27930) | function _emscripten_glGenFramebuffers(n, ids) {
function _emscripten_glDeleteFramebuffers (line 27940) | function _emscripten_glDeleteFramebuffers(n, framebuffers) {
function _emscripten_glFramebufferRenderbuffer (line 27950) | function _emscripten_glFramebufferRenderbuffer(target, attachment, rende...
function _emscripten_glFramebufferTexture2D (line 27955) | function _emscripten_glFramebufferTexture2D(target, attachment, textarge...
function _emscripten_glGetFramebufferAttachmentParameteriv (line 27960) | function _emscripten_glGetFramebufferAttachmentParameteriv(target, attac...
function _emscripten_glIsFramebuffer (line 27965) | function _emscripten_glIsFramebuffer(framebuffer) {
function _emscripten_glDeleteObjectARB (line 27971) | function _emscripten_glDeleteObjectARB(id) {
function _emscripten_glGetObjectParameterivARB (line 27981) | function _emscripten_glGetObjectParameterivARB(id, type, result) {
function _emscripten_glGetInfoLogARB (line 28002) | function _emscripten_glGetInfoLogARB(id, maxLength, length, infoLog) {
function _emscripten_glBindProgramARB (line 28012) | function _emscripten_glBindProgramARB(type, id) {
function _emscripten_glGetPointerv (line 28015) | function _emscripten_glGetPointerv(name, p) {
function _emscripten_glDrawElements (line 28032) | function _emscripten_glDrawElements(mode, count, type, indices) {
function _emscripten_glDrawRangeElements (line 28036) | function _emscripten_glDrawRangeElements(mode, start, end, count, type, ...
function _emscripten_glEnableClientState (line 28040) | function _emscripten_glEnableClientState(cap) {
function _emscripten_glVertexPointer (line 28054) | function _emscripten_glVertexPointer(size, type, stride, pointer) {
function _emscripten_glTexCoordPointer (line 28058) | function _emscripten_glTexCoordPointer(size, type, stride, pointer) {
function _emscripten_glNormalPointer (line 28062) | function _emscripten_glNormalPointer(type, stride, pointer) {
function _emscripten_glColorPointer (line 28066) | function _emscripten_glColorPointer(size, type, stride, pointer) {
function _emscripten_glClientActiveTexture (line 28070) | function _emscripten_glClientActiveTexture(texture) {
function _emscripten_glGenVertexArrays (line 28074) | function _emscripten_glGenVertexArrays(n, vaos) {
function _emscripten_glDeleteVertexArrays (line 28089) | function _emscripten_glDeleteVertexArrays(n, vaos) {
function _emscripten_glEnableVertexAttribArray (line 28098) | function _emscripten_glEnableVertexAttribArray(index) {
function _emscripten_glVertexAttribPointer (line 28102) | function _emscripten_glVertexAttribPointer(index, size, type, normalized...
function _emscripten_glBindVertexArray (line 28104) | function _emscripten_glBindVertexArray(vao) {
function _emscripten_glMatrixMode (line 28135) | function _emscripten_glMatrixMode(mode) {
function _emscripten_glLoadIdentity (line 28148) | function _emscripten_glLoadIdentity() {
function _emscripten_glLoadMatrixf (line 28154) | function _emscripten_glLoadMatrixf(matrix) {
function _emscripten_glFrustum (line 28160) | function _emscripten_glFrustum(left, right, bottom, top_, nearVal, farVa...
function _emscripten_glRotatef (line 28167) | function _emscripten_glRotatef(angle, x, y, z) {
function _emscripten_glDisableVertexAttribArray (line 28175) | function _emscripten_glDisableVertexAttribArray(index) {
function _emscripten_glDrawArrays (line 28179) | function _emscripten_glDrawArrays(mode, first, count) {
function _emscripten_glShaderBinary (line 28186) | function _emscripten_glShaderBinary() {
function _emscripten_glReleaseShaderCompiler (line 28190) | function _emscripten_glReleaseShaderCompiler() {
function _emscripten_glGetError (line 28194) | function _emscripten_glGetError() {
function _emscripten_glVertexAttribDivisor (line 28205) | function _emscripten_glVertexAttribDivisor(index, divisor) {
function _emscripten_glDrawArraysInstanced (line 28209) | function _emscripten_glDrawArraysInstanced(mode, first, count, primcount) {
function _emscripten_glDrawElementsInstanced (line 28213) | function _emscripten_glDrawElementsInstanced(mode, count, type, indices,...
function _emscripten_glFinish (line 28217) | function _emscripten_glFinish() { GLctx.finish() }
function _emscripten_glFlush (line 28219) | function _emscripten_glFlush() { GLctx.flush() }
function _emscripten_glClearDepth (line 28221) | function _emscripten_glClearDepth(x0) { GLctx.clearDepth(x0) }
function _emscripten_glClearDepthf (line 28223) | function _emscripten_glClearDepthf(x0) { GLctx.clearDepth(x0) }
function _emscripten_glDepthFunc (line 28225) | function _emscripten_glDepthFunc(x0) { GLctx.depthFunc(x0) }
function _emscripten_glEnable (line 28227) | function _emscripten_glEnable(x0) { GLctx.enable(x0) }
function _emscripten_glDisable (line 28229) | function _emscripten_glDisable(x0) { GLctx.disable(x0) }
function _emscripten_glFrontFace (line 28231) | function _emscripten_glFrontFace(x0) { GLctx.frontFace(x0) }
function _emscripten_glCullFace (line 28233) | function _emscripten_glCullFace(x0) { GLctx.cullFace(x0) }
function _emscripten_glClear (line 28235) | function _emscripten_glClear(x0) { GLctx.clear(x0) }
function _emscripten_glLineWidth (line 28237) | function _emscripten_glLineWidth(x0) { GLctx.lineWidth(x0) }
function _emscripten_glClearStencil (line 28239) | function _emscripten_glClearStencil(x0) { GLctx.clearStencil(x0) }
function _emscripten_glDepthMask (line 28241) | function _emscripten_glDepthMask(x0) { GLctx.depthMask(x0) }
function _emscripten_glStencilMask (line 28243) | function _emscripten_glStencilMask(x0) { GLctx.stencilMask(x0) }
function _emscripten_glCheckFramebufferStatus (line 28245) | function _emscripten_glCheckFramebufferStatus(x0) { return GLctx.checkFr...
function _emscripten_glGenerateMipmap (line 28247) | function _emscripten_glGenerateMipmap(x0) { GLctx.generateMipmap(x0) }
function _emscripten_glActiveTexture (line 28249) | function _emscripten_glActiveTexture(x0) { GLctx.activeTexture(x0) }
function _emscripten_glBlendEquation (line 28251) | function _emscripten_glBlendEquation(x0) { GLctx.blendEquation(x0) }
function _emscripten_glIsEnabled (line 28253) | function _emscripten_glIsEnabled(x0) { return GLctx.isEnabled(x0) }
function _emscripten_glBlendFunc (line 28255) | function _emscripten_glBlendFunc(x0, x1) { GLctx.blendFunc(x0, x1) }
function _emscripten_glBlendEquationSeparate (line 28257) | function _emscripten_glBlendEquationSeparate(x0, x1) { GLctx.blendEquati...
function _emscripten_glDepthRange (line 28259) | function _emscripten_glDepthRange(x0, x1) { GLctx.depthRange(x0, x1) }
function _emscripten_glDepthRangef (line 28261) | function _emscripten_glDepthRangef(x0, x1) { GLctx.depthRange(x0, x1) }
function _emscripten_glStencilMaskSeparate (line 28263) | function _emscripten_glStencilMaskSeparate(x0, x1) { GLctx.stencilMaskSe...
function _emscripten_glHint (line 28265) | function _emscripten_glHint(x0, x1) { GLctx.hint(x0, x1) }
function _emscripten_glPolygonOffset (line 28267) | function _emscripten_glPolygonOffset(x0, x1) { GLctx.polygonOffset(x0, x...
function _emscripten_glVertexAttrib1f (line 28269) | function _emscripten_glVertexAttrib1f(x0, x1) { GLctx.vertexAttrib1f(x0,...
function _emscripten_glSampleCoverage (line 28271) | function _emscripten_glSampleCoverage(x0, x1) { GLctx.sampleCoverage(x0,...
function _emscripten_glTexParameteri (line 28273) | function _emscripten_glTexParameteri(x0, x1, x2) { GLctx.texParameteri(x...
function _emscripten_glTexParameterf (line 28275) | function _emscripten_glTexParameterf(x0, x1, x2) { GLctx.texParameterf(x...
function _emscripten_glVertexAttrib2f (line 28277) | function _emscripten_glVertexAttrib2f(x0, x1, x2) { GLctx.vertexAttrib2f...
function _emscripten_glStencilFunc (line 28279) | function _emscripten_glStencilFunc(x0, x1, x2) { GLctx.stencilFunc(x0, x...
function _emscripten_glStencilOp (line 28281) | function _emscripten_glStencilOp(x0, x1, x2) { GLctx.stencilOp(x0, x1, x...
function _emscripten_glViewport (line 28283) | function _emscripten_glViewport(x0, x1, x2, x3) { GLctx.viewport(x0, x1,...
function _emscripten_glClearColor (line 28285) | function _emscripten_glClearColor(x0, x1, x2, x3) { GLctx.clearColor(x0,...
function _emscripten_glScissor (line 28287) | function _emscripten_glScissor(x0, x1, x2, x3) { GLctx.scissor(x0, x1, x...
function _emscripten_glVertexAttrib3f (line 28289) | function _emscripten_glVertexAttrib3f(x0, x1, x2, x3) { GLctx.vertexAttr...
function _emscripten_glColorMask (line 28291) | function _emscripten_glColorMask(x0, x1, x2, x3) { GLctx.colorMask(x0, x...
function _emscripten_glRenderbufferStorage (line 28293) | function _emscripten_glRenderbufferStorage(x0, x1, x2, x3) { GLctx.rende...
function _emscripten_glBlendFuncSeparate (line 28295) | function _emscripten_glBlendFuncSeparate(x0, x1, x2, x3) { GLctx.blendFu...
function _emscripten_glBlendColor (line 28297) | function _emscripten_glBlendColor(x0, x1, x2, x3) { GLctx.blendColor(x0,...
function _emscripten_glStencilFuncSeparate (line 28299) | function _emscripten_glStencilFuncSeparate(x0, x1, x2, x3) { GLctx.stenc...
function _emscripten_glStencilOpSeparate (line 28301) | function _emscripten_glStencilOpSeparate(x0, x1, x2, x3) { GLctx.stencil...
function _emscripten_glVertexAttrib4f (line 28303) | function _emscripten_glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx.vertex...
function _emscripten_glCopyTexImage2D (line 28305) | function _emscripten_glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { ...
function _emscripten_glCopyTexSubImage2D (line 28307) | function _emscripten_glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7)...
function _abort (line 28309) | function _abort() {
function _sbrk (line 28313) | function _sbrk(bytes) {
function _sysconf (line 28331) | function _sysconf(name) {
function _copysign (line 28472) | function _copysign(a, b) {
function n (line 28485) | function n(e){throw e;}
function r (line 28485) | function r(e,c){var d=e.split("."),b=aa;!(d[0]in b)&&b.execScript&&b.exe...
function x (line 28485) | function x(e,c,d){var b,a="number"===typeof c?c:c=0,f="number"===typeof ...
function A (line 28485) | function A(){}
function C (line 28485) | function C(e){var c=e.length,d=0,b=Number.POSITIVE_INFINITY,a,f,g,k,m,q,...
function e (line 28485) | function e(a){switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[...
function G (line 28485) | function G(e,c){this.i=[];this.j=32768;this.d=this.f=this.c=this.n=0;thi...
function J (line 28485) | function J(e,c){for(var d=e.f,b=e.d,a=e.input,f=e.c,g;b<c;)g=a[f++],g===...
function Z (line 28485) | function Z(e,c){for(var d=e.f,b=e.d,a=e.input,f=e.c,g=c[0],k=c[1],m,q,t;...
function fa (line 28485) | function fa(e){function c(a,c,b){var d,e,f,g;for(g=0;g<a;)switch(d=Z(thi...
function $ (line 28485) | function $(e){this.input=e;this.c=0;this.m=[];this.s=!1}
function n (line 28486) | function n(e){var t=[];for(var n=0;n<e.length;n++){var r=e[n];if(r===0){...
function r (line 28486) | function r(e){var t=n(e);t=parseInt(t,8);return isNaN(t)?null:t}
function invoke_iiiiiiii (line 28515) | function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
function invoke_iiiiiif (line 28524) | function invoke_iiiiiif(index,a1,a2,a3,a4,a5,a6) {
function invoke_vif (line 28533) | function invoke_vif(index,a1,a2) {
function invoke_viiiiiifi (line 28542) | function invoke_viiiiiifi(index,a1,a2,a3,a4,a5,a6,a7,a8) {
function invoke_vf (line 28551) | function invoke_vf(index,a1) {
function invoke_viiiii (line 28560) | function invoke_viiiii(index,a1,a2,a3,a4,a5) {
function invoke_iiiiiiiiiifiii (line 28569) | function invoke_iiiiiiiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,...
function invoke_vii (line 28578) | function invoke_vii(index,a1,a2) {
function invoke_iiiiiii (line 28587) | function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) {
function invoke_ii (line 28596) | function invoke_ii(index,a1) {
function invoke_vffffffffi (line 28605) | function invoke_vffffffffi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
function invoke_viiiiiiiiiii (line 28614) | function invoke_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
function invoke_viifi (line 28623) | function invoke_viifi(index,a1,a2,a3,a4) {
function invoke_vd (line 28632) | function invoke_vd(index,a1) {
function invoke_iiiiiiiiiiiiii (line 28641) | function invoke_iiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,...
function invoke_iiifi (line 28650) | function invoke_iiifi(index,a1,a2,a3,a4) {
function invoke_if (line 28659) | function invoke_if(index,a1) {
function invoke_iiii (line 28668) | function invoke_iiii(index,a1,a2,a3) {
function invoke_viffff (line 28677) | function invoke_viffff(index,a1,a2,a3,a4,a5) {
function invoke_iiiiiiiiiiii (line 28686) | function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) {
function invoke_viffi (line 28695) | function invoke_viffi(index,a1,a2,a3,a4) {
function invoke_vi (line 28704) | function invoke_vi(index,a1) {
function invoke_vifi (line 28713) | function invoke_vifi(index,a1,a2,a3) {
function invoke_vifff (line 28722) | function invoke_vifff(index,a1,a2,a3,a4) {
function invoke_fii (line 28731) | function invoke_fii(index,a1,a2) {
function invoke_vdd (line 28740) | function invoke_vdd(index,a1,a2) {
function invoke_viiiiiiii (line 28749) | function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
function invoke_iiiiifi (line 28758) | function invoke_iiiiifi(index,a1,a2,a3,a4,a5,a6) {
function invoke_viff (line 28767) | function invoke_viff(index,a1,a2,a3) {
function invoke_iiiiiiiiiiiii (line 28776) | function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a...
function invoke_iiiifi (line 28785) | function invoke_iiiifi(index,a1,a2,a3,a4,a5) {
function invoke_iif (line 28794) | function invoke_iif(index,a1,a2) {
function invoke_viiiiiii (line 28803) | function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
function invoke_fiiff (line 28812) | function invoke_fiiff(index,a1,a2,a3,a4) {
function invoke_viiiiiiiii (line 28821) | function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {
function invoke_viiiiiiiiii (line 28830) | function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) {
function invoke_iii (line 28839) | function invoke_iii(index,a1,a2) {
function invoke_viiiiii (line 28848) | function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
function invoke_vfi (line 28857) | function invoke_vfi(index,a1,a2) {
function invoke_f (line 28866) | function invoke_f(index) {
function invoke_i (line 28875) | function invoke_i(index) {
function invoke_vff (line 28884) | function invoke_vff(index,a1,a2) {
function invoke_vffff (line 28893) | function invoke_vffff(index,a1,a2,a3,a4) {
function invoke_iiiiii (line 28902) | function invoke_iiiiii(index,a1,a2,a3,a4,a5) {
function invoke_vdddddd (line 28911) | function invoke_vdddddd(index,a1,a2,a3,a4,a5,a6) {
function invoke_viii (line 28920) | function invoke_viii(index,a1,a2,a3) {
function invoke_v (line 28929) | function invoke_v(index) {
function invoke_iiiiiiiii (line 28938) | function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {
function invoke_iiiii (line 28947) | function invoke_iiiii(index,a1,a2,a3,a4) {
function invoke_viif (line 28956) | function invoke_viif(index,a1,a2,a3) {
function invoke_viiii (line 28965) | function invoke_viiii(index,a1,a2,a3,a4) {
function asmPrintInt (line 28974) | function asmPrintInt(x, y) {
function asmPrintFloat (line 28977) | function asmPrintFloat(x, y) {
function ao (line 28983) | function ao(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;c[20453240+(a*1...
function bo (line 28983) | function bo(){var a=0,b=0;c[7094374]=0;a=0;do{if(!((a|0)==335|(a|0)==175...
function co (line 28983) | function co(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[20453244+(a*12|0)...
function eo (line 28983) | function eo(a,b,c){a=a|0;b=b|0;c=c|0;if((b|0)==0){co(a,c);return}else{ao...
function fo (line 28983) | function fo(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==127){i=b;return}d=c[5...
function go (line 28983) | function go(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function ho (line 28983) | function ho(){c[5497074]=1;return}
function io (line 28983) | function io(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[5721690]|0;f=e-...
function jo (line 28983) | function jo(){var a=0,b=0,d=0,e=0;a=i;i=i+8|0;b=a|0;if((c[5759927]|0)==0...
function ko (line 28983) | function ko(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function lo (line 28983) | function lo(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,...
function mo (line 28983) | function mo(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d|0;f=d+8|0;...
function no (line 28983) | function no(){var b=0,d=0,e=0,f=0,g=0;b=i;i=i+1024|0;d=b|0;e=d|0;TB(e,ct...
function oo (line 28983) | function oo(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;i=i+16424|0;b=a|0;...
function po (line 28983) | function po(){var a=0;a=c[5720394]|0;if((c[5759928]|0)==0|a>>>0>6>>>0){r...
function qo (line 28983) | function qo(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function ro (line 28983) | function ro(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;c[57599...
function so (line 28983) | function so(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+8|0;d=b|0;if((cq()|0)!=0){b...
function to (line 28983) | function to(){so(0);if((c[(c[5451068]|0)+32>>2]|0)==0){ms();lq();uo(0);r...
function uo (line 28983) | function uo(a){a=a|0;var b=0;b=c[5458838]|0;if((b|0)==0){return}if((c[b+...
function vo (line 28983) | function vo(){if((c[(c[5458548]|0)+32>>2]|0)!=0){c[5720394]=1;In(1);retu...
function wo (line 28983) | function wo(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function xo (line 28983) | function xo(){n$(23247128|0,0|0,1956976|0)|0;return}
function yo (line 28983) | function yo(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=or(0)|0;f=a[e]|0;...
function zo (line 28983) | function zo(){var a=0,b=0,d=0,e=0,f=0;a=i;if((c[5720394]|0)!=8|(c[575992...
function Ao (line 28983) | function Ao(){var a=0,b=0;a=i;Il();kt(120032,118640);b=c[5720394]|0;if((...
function Bo (line 28983) | function Bo(){var b=0,d=0,e=0;b=i;if((a[23208720]|0)==0){i=b;return}kt(1...
function Co (line 28983) | function Co(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+16|0;e=d|0...
function Do (line 28983) | function Do(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+1056|0;e=d|0;f=d+1...
function Eo (line 28983) | function Eo(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;i=i+1024|0;b=a|0;d=c[5...
function Fo (line 28983) | function Fo(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a>>2]|0;if((e|0)!=0){W_...
function Go (line 28983) | function Go(){var a=0,b=0,d=0,e=0;a=i;i=i+160|0;b=a|0;Sr(173800,(d=i,i=i...
function Ho (line 28983) | function Ho(){var a=0,b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0....
function Io (line 28983) | function Io(){Sx();c[5497076]=0;Ho();return}
function Jo (line 28983) | function Jo(){var a=0,b=0,d=0;a=i;b=Ju()|0;Sr(58624,(d=i,i=i+8|0,c[d>>2]...
function Ko (line 28983) | function Ko(){var a=0,b=0,d=0;a=i;b=Nu()|0;Sr(57728,(d=i,i=i+8|0,c[d>>2]...
function Lo (line 28983) | function Lo(){var a=0,b=0,d=0,e=0;a=i;if((c[5720394]|0)==8){b=0}else{Sr(...
function Mo (line 28983) | function Mo(){var a=0,b=0;a=i;Sr(56048,(b=i,i=i+1|0,i=i+7&-8,c[b>>2]=0,b...
function No (line 28983) | function No(a,b){a=a|0;b=b|0;var d=0;b=i;d=c[a>>2]|0;if((d|0)!=0){W_(d)}...
function Oo (line 28983) | function Oo(){var a=0;if((c[5759909]|0)!=0){c[5759909]=0;a=c[5721689]|0;...
function Po (line 28983) | function Po(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;Tr(52280,(e=i,i=i+16|0,...
function Qo (line 28983) | function Qo(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;do{if((a[23034240]|0)!...
function Ro (line 28983) | function Ro(){Oo();return}
function So (line 28983) | function So(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function To (line 28983) | function To(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=b...
function Uo (line 28983) | function Uo(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Vo (line 28983) | function Vo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Wo (line 28983) | function Wo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=a;a=i...
function Xo (line 28983) | function Xo(){var a=0;a=c[5811720]|0;if((c[a+32>>2]|0)==0){return(c[a+20...
function Yo (line 28983) | function Yo(){var a=0,b=0,d=0,e=0,f=0;a=i;if((c[5720394]|0)>>>0<5>>>0){i...
function Zo (line 28983) | function Zo(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0...
function _o (line 28983) | function _o(a){a=a|0;return fs(a,3)|0}
function $o (line 28983) | function $o(){var a=0.0;a=+(wf()|0);return~~(a*+g[(c[5451064]|0)+28>>2])|0}
function ap (line 28983) | function ap(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+411...
function bp (line 28983) | function bp(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+256|0;d=b|0;e=or(1)|0;...
function cp (line 28983) | function cp(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+40...
function dp (line 28983) | function dp(){bq()|0;return}
function ep (line 28983) | function ep(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;a=i;i=i+2064|0;b=a...
function fp (line 28983) | function fp(a,b){a=a|0;b=b|0;var d=0,e=0;a=i;i=i+16|0;if((b|0)!=2){i=a;r...
function gp (line 28983) | function gp(){var a=0,d=0,e=0,f=0,g=0;a=i;i=i+32|0;d=a|0;Sr(135952,(e=i,...
function hp (line 28983) | function hp(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+1056|0...
function ip (line 28983) | function ip(a,b){a=a|0;b=b|0;if((b|0)!=2){return}b=yC(a,1,105288)|0;if(!...
function jp (line 28983) | function jp(){var a=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function kp (line 28983) | function kp(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function lp (line 28983) | function lp(){ew();return}
function mp (line 28983) | function mp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;f=c[5458838]|0;if((f|0)...
function np (line 28983) | function np(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=a;a=i...
function op (line 28983) | function op(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function pp (line 28983) | function pp(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0...
function qp (line 28983) | function qp(c,d,e){c=c|0;d=d|0;e=e|0;do{if(!(c>>>0>31>>>0)){if((b[232128...
function rp (line 28983) | function rp(a){a=a|0;if(a>>>0>31>>>0){return}b[23212856+(a*1064|0)>>1]=0...
function sp (line 28983) | function sp(){var a=0,c=0,d=0,e=0,f=0;a=0;c=0;d=23212832;while(1){e=((b[...
function tp (line 28983) | function tp(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function up (line 28983) | function up(a,b){a=a|0;b=b|0;return 1}
function vp (line 28983) | function vp(a,b,d){a=a|0;b=b|0;d=d|0;if((a|0)==0){return}if((b|0)!=0){c[...
function wp (line 28983) | function wp(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;pv(b,5);Ov(a,c[b+20>>2]|0,c...
function xp (line 28983) | function xp(a,b){a=a|0;b=b|0;return(Pv(a,b)|0)!=0|0}
function yp (line 28983) | function yp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function zp (line 28983) | function zp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Ap (line 28983) | function Ap(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Bp (line 28983) | function Bp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Cp (line 28983) | function Cp(a,b){a=a|0;b=b|0;b=c[a>>2]|0;if((b|0)!=0){W_(b)}W_(a);c[6924...
function Dp (line 28983) | function Dp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i...
function Ep (line 28983) | function Ep(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[(c[...
function Fp (line 28983) | function Fp(){return 23017852}
function Gp (line 28983) | function Gp(){return 23021948}
function Hp (line 28983) | function Hp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0;f=+(c[57203...
function Ip (line 28983) | function Ip(a,b,d,e,f){a=+a;b=+b;d=+d;e=+e;f=f|0;var g=0.0,h=0.0;vk[c[49...
function Jp (line 28983) | function Jp(a,b,d,e,f){a=+a;b=+b;d=+d;e=+e;f=f|0;var g=0.0,h=0.0;g=+(c[5...
function Kp (line 28983) | function Kp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0;e=d&255;if((e|0...
function Lp (line 28983) | function Lp(b,d,e,f,h,j,k){b=b|0;d=d|0;e=+e;f=f|0;h=h|0;j=j|0;k=k|0;var ...
function Mp (line 28983) | function Mp(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0,h=0,j=0;f=i;...
function Np (line 28983) | function Np(b,d,e,f,h,j){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0...
function Op (line 28983) | function Op(a){a=+a;var b=0;b=c[5425932]|0;g[876392+(b<<2)>>2]=a;c[54259...
function Pp (line 28983) | function Pp(){var a=0,b=0,d=0,e=0,f=0,h=0.0,i=0,j=0.0,k=0;a=c[5720347]|0...
function Qp (line 28983) | function Qp(){c[5769182]=gt(161864,138048,512)|0;c[5811758]=gt(124968,13...
function Rp (line 28983) | function Rp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+1024|0;d=b|...
function Sp (line 28983) | function Sp(){var a=0,b=0,d=0;a=i;if((c[552998]|0)==0){i=a;return}b=c[70...
function Tp (line 28983) | function Tp(){var a=0,b=0,d=0;a=i;i=i+16|0;b=a|0;d=a+8|0;c[5711487]=0;c[...
function Up (line 28983) | function Up(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0...
function Vp (line 28983) | function Vp(){var a=0,b=0;a=i;In((Jn()|0)&-3);c[5497078]=0;b=c[236124]|0...
function Wp (line 28983) | function Wp(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;b=~~+at(47992);if((c[58117...
function Xp (line 28983) | function Xp(){var a=0,b=0,d=0,e=0;a=i;b=c[236124]|0;if((b|0)==0){d=0;i=a...
function Yp (line 28983) | function Yp(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function Zp (line 28983) | function Zp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((c[7094380]|0)!=0){d...
function _p (line 28983) | function _p(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function $p (line 28983) | function $p(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+8|0...
function aq (line 28983) | function aq(){if((c[7094380]|0)==0){return}fk[c[4917273]&127](c[7094405]...
function bq (line 28983) | function bq(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;d=...
function cq (line 28983) | function cq(){return c[7094380]|0}
function dq (line 28983) | function dq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0;b=i;d=(c[545885...
function eq (line 28983) | function eq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;d=c...
function fq (line 28983) | function fq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=(c[54...
function gq (line 28983) | function gq(b){b=b|0;var d=0,e=0,f=0,h=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0,p...
function hq (line 28983) | function hq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=c[a+4>>2]...
function iq (line 28983) | function iq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function jq (line 28983) | function jq(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function kq (line 28983) | function kq(){var b=0,d=0,e=0,f=0,h=0;c[7092324]=(c[5497045]|0)+((c[5497...
function lq (line 28983) | function lq(){n$(21988096|0,0|0,188|0)|0;uq();return}
function mq (line 28983) | function mq(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)<0){Ur(1,149992,(d=...
function nq (line 28983) | function nq(a){a=a|0;if((a|0)>-1&(c[5497054]|0)>(a|0)){i=i;return a|0}el...
function oq (line 28983) | function oq(){return c[5497054]|0}
function pq (line 28983) | function pq(){return c[5497063]|0}
function qq (line 28983) | function qq(a){a=a|0;if((a|0)>-1&(c[5497048]|0)>(a|0)){i=i;return c[(c[5...
function rq (line 28983) | function rq(a){a=a|0;if((a|0)>-1&(c[5497048]|0)>(a|0)){i=i;return c[(c[5...
function sq (line 28983) | function sq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0;g[7092326]=...
function tq (line 28983) | function tq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;if((a|0)<0)...
function uq (line 28983) | function uq(){c[5389054]=0;c[5389056]=0;return}
function vq (line 28983) | function vq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0;e=+g[a>>2];f=+g...
function wq (line 28983) | function wq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;e=c...
function xq (line 28983) | function xq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function yq (line 28983) | function yq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function cw (line 28987) | function cw(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function dw (line 28987) | function dw(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=b...
function ew (line 28987) | function ew(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+48|0;e=d|0;if((c[4...
function fw (line 28987) | function fw(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function gw (line 28987) | function gw(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0...
function hw (line 28987) | function hw(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;i=i+32|0;d=b|0;e=c[4939860...
function iw (line 28987) | function iw(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+8|0;e=d|0;...
function jw (line 28987) | function jw(){var a=0;a=c[2762]|0;if((a|0)==-1){return}if((a|0)==(c[4910...
function kw (line 28987) | function kw(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function lw (line 28987) | function lw(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function mw (line 28987) | function mw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+8|0;d=b|0;e...
function nw (line 28987) | function nw(){mw(1);Gr(118904,390);return}
function ow (line 28987) | function ow(){mw(1);return}
function pw (line 28987) | function pw(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0.0,l=0,m=0;b=i;i=i+1...
function qw (line 28987) | function qw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+136...
function rw (line 28987) | function rw(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;g=c[f>>2]|0;c[7092716]=...
function sw (line 28987) | function sw(a,b){a=a|0;b=b|0;var e=0,f=0;e=c[b>>2]|0;c[7092716]=e;f=(d[a...
function tw (line 28987) | function tw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function uw (line 28987) | function uw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function vw (line 28987) | function vw(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0...
function ww (line 28987) | function ww(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[b+20+(e<<2)>>2]...
function xw (line 28987) | function xw(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=c[b+8>>2]|0;i...
function yw (line 28987) | function yw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[7092716]=c[e>>2];xw(c[a+2...
function zw (line 28987) | function zw(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Aw (line 28987) | function Aw(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Bw (line 28987) | function Bw(a){a=a|0;var b=0;n$(a|0,0,57400)|0;c[a+28700>>2]=1;b=a+29752...
function Cw (line 28987) | function Cw(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0...
function Dw (line 28987) | function Dw(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0...
function Ew (line 28987) | function Ew(c,d){c=c|0;d=d|0;var e=0,f=0;e=i;i=i+8|0;f=e|0;a[f+2|0]=a[c+...
function Fw (line 28987) | function Fw(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i...
function Gw (line 28987) | function Gw(){var b=0,d=0;b=i;Sr(157976,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,...
function Hw (line 28987) | function Hw(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Iw (line 28987) | function Iw(){Jw();a[9184]=1;return}
function Jw (line 28987) | function Jw(){var b=0,d=0,e=0,f=0;b=i;if(!(a[9176]|0)){i=b;return}d=c[48...
function Kw (line 28987) | function Kw(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Lw (line 28987) | function Lw(){a[9184]=0;if((c[4780712]|0)!=0){return}ix();n$(19124952,0,...
function Mw (line 28987) | function Mw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0.0,m...
function Nw (line 28987) | function Nw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ow(a,b,c,d,0);return}
function Ow (line 28987) | function Ow(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0...
function Pw (line 28987) | function Pw(b,d){b=b|0;d=d|0;var e=0;e=i;if(a[9184]|a[9176]^1){i=e;retur...
function Qw (line 28987) | function Qw(){var b=0,d=0,e=0,f=0;b=i;if(!(a[9176]|0)){i=b;return}n$(198...
function Rw (line 28987) | function Rw(){var a=0;a=c[4886280]|0;if((a|0)==0){return}Yx(a);c[4886280...
function Sw (line 28987) | function Sw(a){a=a|0;c[19869720+(a*56|0)>>2]=0;c[19869724+(a*56|0)>>2]=0...
function Tw (line 28987) | function Tw(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=0}else{a=0;do{c[1986...
function Uw (line 28987) | function Uw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0.0,n...
function Vw (line 28987) | function Vw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;h=i;if(...
function Ww (line 28987) | function Ww(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Xw (line 28987) | function Xw(e,f,h,j,k,l,m,n){e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=+m;n=...
function Yw (line 28987) | function Yw(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(a>>>0>1023>>>0){Ur(1,136...
function Zw (line 28987) | function Zw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;f=i;i=i...
function _w (line 28987) | function _w(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if(a[9184]|a[9...
function $w (line 28987) | function $w(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function ax (line 28987) | function ax(){var b=0.0,d=0,e=0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;...
function bx (line 28987) | function bx(){var a=0,b=0.0,d=0.0,e=0,f=0;a=(c[5385957]|0)/(c[5385956]|0...
function cx (line 28987) | function cx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=(b|0)==0?28378640...
function dx (line 28987) | function dx(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;b=...
function ex (line 28987) | function ex(){if(!(a[9176]|0)){return}BL();jx();a[9176]=0;c[4780712]=0;I...
function fx (line 28987) | function fx(b){b=b|0;var d=0;if((b|0)==0){d=0;return d|0}c[4781234]=gt(1...
function gx (line 28987) | function gx(a){a=a|0;c[a>>2]=c[5145152];c[5145152]=a;c[5115572]=(c[51155...
function hx (line 28987) | function hx(){var a=0,b=0,d=0;a=c[5145152]|0;if((a|0)==0){while(1){dx();...
function ix (line 28987) | function ix(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;b=c[(gt(156232,178152,...
function jx (line 28987) | function jx(){W_(c[542622]|0);W_(c[6924892]|0);return}
function kx (line 28987) | function kx(a){a=a|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function lx (line 28987) | function lx(){var a=0,b=0,d=0;a=i;b=c[304336]|0;Sr(109832,(d=i,i=i+16|0,...
function mx (line 28987) | function mx(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[540150]=1...
function nx (line 28987) | function nx(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function ox (line 28987) | function ox(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0...
function px (line 28987) | function px(a,d,e,f,h){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0...
function qx (line 28987) | function qx(a,e,f,h,i){a=a|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0...
function rx (line 28987) | function rx(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function sx (line 28987) | function sx(a,d,e,f,h){a=a|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0...
function tx (line 28987) | function tx(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m...
function ux (line 28987) | function ux(a,e){a=a|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i...
function vx (line 28987) | function vx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[540185]|0;if((f...
function wx (line 28987) | function wx(a,b){a=a|0;b=b|0;var d=0;d=c[540186]|0;if((d|0)==0){return}h...
function xx (line 28987) | function xx(a,b){a=a|0;b=b|0;var d=0;d=c[540187]|0;if((d|0)==0){return}h...
function yx (line 28987) | function yx(){var a=0;a=c[540188]|0;if((a|0)==0){return}Uk[a&511]();return}
function zx (line 28987) | function zx(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=...
function Ax (line 28987) | function Ax(){var a=0;a=c[540190]|0;if((a|0)==0){return}Uk[a&511]();return}
function Bx (line 28987) | function Bx(a){a=a|0;var b=0;b=c[540191]|0;if((b|0)==0){return}vk[b&511]...
function Cx (line 28987) | function Cx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[540192]|0;if((f...
function Dx (line 28987) | function Dx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[540193]|0;if((f...
function Ex (line 28987) | function Ex(a){a=a|0;var b=0;b=c[540194]|0;if((b|0)==0){return}vk[b&511]...
function Fx (line 28987) | function Fx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[540195]|0;if((f...
function Gx (line 28987) | function Gx(a,b){a=a|0;b=b|0;var d=0;d=c[540196]|0;if((d|0)==0){return}h...
function Hx (line 28987) | function Hx(){var a=0,b=0,d=0,e=0;a=c[4781226]|0;b=a+32|0;d=(c[(c[478123...
function Ix (line 28987) | function Ix(){var a=0;a=c[540198]|0;if((a|0)==0){return}Uk[a&511]();return}
function Jx (line 28987) | function Jx(){var a=0;a=c[540199]|0;if((a|0)==0){return}Uk[a&511]();return}
function Kx (line 28987) | function Kx(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[540200]|0;if((d|0)==0){e=0;...
function Lx (line 28987) | function Lx(){var a=0;a=c[540201]|0;if((a|0)==0){return}Uk[a&511]();return}
function Mx (line 28987) | function Mx(){var a=0;a=c[540202]|0;if((a|0)==0){return}Uk[a&511]();return}
function Nx (line 28987) | function Nx(){var a=0;a=c[540203]|0;if((a|0)==0){return}Uk[a&511]();return}
function Ox (line 28987) | function Ox(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;if(!((c[540200]|0)!=0&(c[5...
function Px (line 28987) | function Px(){var a=0,b=0,d=0,e=0,f=0;a=i;if((c[540187]|0)==0){i=a;retur...
function Qx (line 28987) | function Qx(){var a=0;a=c[540188]|0;if((a|0)==0){return}Uk[a&511]();return}
function Rx (line 28987) | function Rx(){var a=0,b=0,d=0,e=0;a=i;Sr(149800,(b=i,i=i+1|0,i=i+7&-8,c[...
function Sx (line 28987) | function Sx(){var a=0;a=c[540184]|0;if((a|0)!=0){Uk[a&511]()}n$(2160736|...
function Tx (line 28987) | function Tx(){c[2693]=0;c[291]=10752;c[5458856]=1144;return}
function Ux (line 28987) | function Ux(){c[5458856]=0;return}
function Vx (line 28987) | function Vx(a,b){a=a|0;b=b|0;return Wx(a,b)|0}
function Wx (line 28987) | function Wx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Xx (line 28987) | function Xx(a){a=a|0;return Wx(a,0)|0}
function Yx (line 28987) | function Yx(a){a=a|0;vk[c[(c[a>>2]|0)+16>>2]&511](a);return}
function Zx (line 28987) | function Zx(a,b,d){a=a|0;b=b|0;d=d|0;return rk[c[(c[a>>2]|0)+12>>2]&63](...
function _x (line 28987) | function _x(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;f...
function $x (line 28987) | function $x(a){a=a|0;Yt(c[(c[a>>2]|0)+4>>2]|0);es(c[a>>2]|0);c[a>>2]=0;r...
function ay (line 28987) | function ay(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;c...
function by (line 28987) | function by(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+8|0;d=b|0;e=_x(a,1144)|...
function cy (line 28987) | function cy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=a+36|0;f=...
function dy (line 28987) | function dy(a){a=a|0;var b=0,d=0;b=i;i=i+8|0;d=b|0;c[d>>2]=a;$x(d);i=b;r...
function ey (line 28987) | function ey(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i...
function fy (line 28987) | function fy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i...
function gy (line 28987) | function gy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function hy (line 28987) | function hy(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+8|0;d=b...
function iy (line 28987) | function iy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function jy (line 28987) | function jy(a){a=a|0;var b=0,d=0;b=i;i=i+8|0;d=b|0;c[d>>2]=a;if((a|0)==0...
function ky (line 28987) | function ky(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((b|0)==0){c[(Fc()|0)...
function ly (line 28987) | function ly(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((a|0...
function my (line 28987) | function my(a){a=a|0;return 0}
function ny (line 28987) | function ny(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){c[(Fc()|0)>>2]=9;b=-1;...
function oy (line 28987) | function oy(a){a=a|0;return 1}
function py (line 28987) | function py(){return}
function qy (line 28987) | function qy(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function ry (line 28987) | function ry(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=...
function sy (line 28987) | function sy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0.0,l=0.0...
function ty (line 28987) | function ty(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if(!((a|0)>-1&(c[4938828]|0...
function uy (line 28987) | function uy(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0;vy();e=(b|0)!=0...
function vy (line 28987) | function vy(){var b=0;if(!(a[11040]|0)){return}nc(c[4939870]|0);gi(c[493...
function wy (line 28987) | function wy(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=+j;k=...
function xy (line 28987) | function xy(){var a=0,b=0,d=0,e=0,f=0;if((c[539052]|0)>0){a=0;do{Py(a);a...
function yy (line 28987) | function yy(a){a=a|0;var b=0,d=0;a=c[539052]|0;if((a|0)>0){b=0}else{retu...
function zy (line 28987) | function zy(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ty(1,d,b,c,a);return}
function Ay (line 28987) | function Ay(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ty(0,d,b,c,a);return}
function By (line 28987) | function By(a){a=a|0;if((c[21250948+(a*36|0)>>2]|0)==0){return}Py(c[2125...
function Cy (line 28987) | function Cy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0,l=0.0...
function Dy (line 28987) | function Dy(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,j=0,k=0.0,l=0.0,m...
function Ey (line 28987) | function Ey(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function Fy (line 28987) | function Fy(){xy();return}
function Gy (line 28987) | function Gy(){var b=0,d=0;if((c[4938828]|0)!=0){return}if(a[42992]|0){re...
function Hy (line 28987) | function Hy(a,b){a=a|0;b=b|0;b=Ly(a)|0;a=19945428+(b*124|0)|0;do{if((c[1...
function Iy (line 28987) | function Iy(){return}
function Jy (line 28987) | function Jy(){var a=0,b=0,d=0;a=i;Sr(132976,(b=i,i=i+1|0,i=i+7&-8,c[b>>2...
function Ky (line 28987) | function Ky(){return}
function Ly (line 28987) | function Ly(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;if((b|0...
function My (line 28987) | function My(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Ny (line 28987) | function Ny(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Oy (line 28987) | function Oy(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i...
function Py (line 28987) | function Py(a){a=a|0;var b=0,d=0,e=0,f=0;b=2145968+(a*80|0)|0;d=2146e3+(...
function Qy (line 28987) | function Qy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Ry (line 28987) | function Ry(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0...
function Sy (line 28987) | function Sy(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0;do{if...
function Ty (line 28987) | function Ty(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0...
function Uy (line 28987) | function Uy(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o...
function Vy (line 28987) | function Vy(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a=c[422837]|0;b=c[...
function Wy (line 28987) | function Wy(b){b=b|0;var d=0,e=0,f=0;d=i;do{if((b|0)>=0){if((c[(c[453930...
function Xy (line 28987) | function Xy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[5...
function Yy (line 28987) | function Yy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[538...
function Zy (line 28987) | function Zy(a){a=a|0;var b=0;b=c[5387004]|0;if((b|0)==0){return}c[b+(a*1...
function _y (line 28987) | function _y(a){a=a|0;var b=0,d=0;b=i;d=c[5120100]|0;if(!((c[7092712]|0)!...
function $y (line 28987) | function $y(){var a=0,b=0,d=0,e=0;a=i;if((c[7092712]|0)==0){b=0;i=a;retu...
function az (line 28987) | function az(){var a=0,b=0;a=c[7092486]|0;if((a|0)==0){b=-1;return b|0}b=...
function bz (line 28987) | function bz(){gt(46192,109544,0)|0;gt(185352,149544,512)|0;gt(177232,149...
function cz (line 28987) | function cz(){var a=0,b=0,d=0;a=i;i=i+88|0;b=a|0;d=c[5387004]|0;if((d|0)...
function dz (line 28987) | function dz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i...
function ez (line 28987) | function ez(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var...
function fz (line 28987) | function fz(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var...
function gz (line 28987) | function gz(a){a=a|0;return sB(a,-1)|0}
function hz (line 28987) | function hz(a,b){a=a|0;b=b|0;return wA(a,b)|0}
function iz (line 28987) | function iz(){return pq()|0}
function jz (line 28987) | function jz(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0...
function kz (line 28987) | function kz(a,b){a=a|0;b=b|0;eA((c[422837]|0)+(a*121936|0)|0,b,1);return}
function lz (line 28987) | function lz(a){a=a|0;return fs(a,2)|0}
function mz (line 28987) | function mz(a){a=a|0;es(a);return}
function nz (line 28987) | function nz(a){a=a|0;var b=0,d=0;b=i;if((qs()|0)==0){d=rs(a,0)|0;i=b;ret...
function oz (line 28987) | function oz(){var a=0,b=0,d=0,e=0,f=0,g=0;a=c[5387004]|0;if((a|0)==0){b=...
function pz (line 28987) | function pz(a){a=a|0;var b=0;b=c[5387004]|0;if((b|0)==0){return}c[b+(a*1...
function qz (line 28987) | function qz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0.0,l=0.0...
function rz (line 28987) | function rz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[422837]...
function sz (line 28987) | function sz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[422837]|0;e=c[d+(a*1219...
function tz (line 28987) | function tz(){c[422841]=-9999999;return}
function uz (line 28987) | function uz(){if(a[186392]|0){return}a[186392]=1;Gr(150720,368);Gr(17702...
function vz (line 28987) | function vz(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;if((c[(c[5451068]|0)+3...
function wz (line 28987) | function wz(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;if((c[(c[5451068]|0)+32>>2...
function xz (line 28987) | function xz(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;if((c[(c[5451068]|0)+32>>2...
function yz (line 28987) | function yz(){var a=0,b=0,d=0;a=i;if((c[(c[5451068]|0)+32>>2]|0)==0){Sr(...
function zz (line 28987) | function zz(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;if((c[(c[5451068]|...
function Az (line 28987) | function Az(){var a=0,b=0;a=i;if((c[(c[5451068]|0)+32>>2]|0)==0){Sr(1392...
function Bz (line 28987) | function Bz(){var a=0,b=0;a=i;if((c[(c[5451068]|0)+32>>2]|0)==0){Sr(1392...
function Cz (line 28987) | function Cz(){var a=0,b=0,d=0;a=i;if((c[(c[5451068]|0)+32>>2]|0)==0){Sr(...
function Dz (line 28987) | function Dz(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function Ez (line 28987) | function Ez(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+12...
function Fz (line 28987) | function Fz(a,b){a=a|0;b=b|0;if((b|0)!=2){return}Ss(105392,104608,1,0);r...
function Gz (line 28987) | function Gz(){MA(163368);return}
function Hz (line 28987) | function Hz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+1024|0;d=b|0;i...
function Iz (line 28987) | function Iz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+1024|0;d=b...
function Jz (line 28987) | function Jz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Kz (line 28987) | function Kz(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function Lz (line 28987) | function Lz(){Tz(0);return}
function Mz (line 28987) | function Mz(){Tz(1);return}
function Nz (line 28987) | function Nz(){Sz(0);return}
function Oz (line 28987) | function Oz(){Sz(1);return}
function Pz (line 28987) | function Pz(){var a=0,b=0;a=i;if((c[(c[5451068]|0)+32>>2]|0)==0){Sr(1392...
function Qz (line 28987) | function Qz(){return}
function Rz (line 28987) | function Rz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+192|0;...
function QI (line 28991) | function QI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0;d=b+8|0;do{if((oK(a,1...
function RI (line 28991) | function RI(a){a=a|0;var b=0;if((a|0)==0){return}b=c[a+24>>2]|0;if((b|0)...
function SI (line 28991) | function SI(a){a=a|0;var b=0,d=0,e=0;if(!(+RJ(45304)!=0.0)){return}b=a|0...
function TI (line 28991) | function TI(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function UI (line 28991) | function UI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function VI (line 28991) | function VI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[a>>2]|0;if((d|0...
function WI (line 28991) | function WI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0...
function XI (line 28991) | function XI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0...
function YI (line 28991) | function YI(a,b,d){a=a|0;b=b|0;d=d|0;return+(+WI(a,c[b+4+(d<<3)+4>>2]|0))}
function ZI (line 28991) | function ZI(a,b,d){a=a|0;b=b|0;d=d|0;return+(+XI(a,c[b+4+(d<<3)+4>>2]|0))}
function _I (line 28991) | function _I(a){a=a|0;var b=0,d=0,e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0;b...
function $I (line 28991) | function $I(a){a=a|0;var b=0,d=0;b=a|0;if((c[b>>2]|0)>0){d=0}else{return...
function aJ (line 28991) | function aJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,j=0,k=0,l=0;e=i;a...
function bJ (line 28991) | function bJ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=a|0;g=c[f...
function cJ (line 28991) | function cJ(){var a=0,b=0,d=0,e=0,f=0,g=0;a=0;do{b=187208+(a<<2)|0;d=c[b...
function dJ (line 28991) | function dJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[7092497]|0;f=pC...
function eJ (line 28991) | function eJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[7092497]|0;f=pC...
function fJ (line 28991) | function fJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function gJ (line 28991) | function gJ(a,b){a=a|0;b=b|0;hk[c[7092497]&255](a,b);return}
function hJ (line 28991) | function hJ(a,b){a=a|0;b=b|0;c[(c[7092488]|0)+(a*40|0)+36>>2]=b;return}
function iJ (line 28991) | function iJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function jJ (line 28991) | function jJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function kJ (line 28991) | function kJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function lJ (line 28991) | function lJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function mJ (line 28991) | function mJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;a=c[b>>2]|0;...
function nJ (line 28991) | function nJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;a=c[b>>2]|0;...
function oJ (line 28991) | function oJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function pJ (line 28991) | function pJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function qJ (line 28991) | function qJ(a,b){a=a|0;b=b|0;var d=0;d=(c[7092488]|0)+(a*40|0)+32|0;c[d>...
function rJ (line 28991) | function rJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function sJ (line 28991) | function sJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function tJ (line 28991) | function tJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function uJ (line 28991) | function uJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function vJ (line 28991) | function vJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function wJ (line 28991) | function wJ(a){a=a|0;var b=0;b=(c[7092488]|0)+(a*40|0)+32|0;c[b>>2]=c[b>...
function xJ (line 28991) | function xJ(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0;e=c[7092488]|0;g[e+(a*...
function yJ (line 28991) | function yJ(a,b){a=a|0;b=b|0;var d=0;d=c[7092488]|0;g[d+(a*40|0)+20>>2]=...
function zJ (line 28991) | function zJ(a,b){a=a|0;b=+b;return}
function AJ (line 28991) | function AJ(a,b,d){a=a|0;b=+b;d=d|0;var e=0;e=(c[7092488]|0)+(a*40|0)|0;...
function BJ (line 28991) | function BJ(a){a=a|0;var b=0,d=0;b=c[7092488]|0;d=b+(a*40|0)+32|0;n$(b+(...
function CJ (line 28991) | function CJ(){c[7092488]=aK((c[7092484]|0)*40|0)|0;return 0}
function DJ (line 28991) | function DJ(){bK(c[7092488]|0);c[7092488]=0;return}
function EJ (line 28991) | function EJ(){return((Qb()|0)*1e3|0|0)/1e6|0|0}
function FJ (line 28991) | function FJ(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+4096|0;d=~~+RJ(128...
function GJ (line 28991) | function GJ(){var a=0,b=0,d=0;a=i;if((c[7092482]|0)==0){Tk[c[7092490]&25...
function HJ (line 28991) | function HJ(a,b){a=a|0;b=b|0;VJ(a,b);return 0}
function IJ (line 28991) | function IJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=d-1|0;q$(c|0,QJ(b)|0,e|0)...
function JJ (line 28991) | function JJ(a){a=+a;var b=0,d=0,e=0;b=i;if((c[7092482]|0)==0){Tk[c[70924...
function KJ (line 28991) | function KJ(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[7092490]|0;if((c[709248...
function LJ (line 28991) | function LJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((c[7092482]|0)==...
function MJ (line 28991) | function MJ(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}
function NJ (line 28991) | function NJ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;m$(28369960,b|0,88)|0;n$(28...
function OJ (line 28991) | function OJ(a,c){a=a|0;c=c|0;var e=0,f=0,g=0,h=0,i=0;if((c|0)>0){e=-1;f=...
function PJ (line 28991) | function PJ(){var a=0,b=0;a=c[4984274]|0;if((a|0)==0){c[4984274]=0;retur...
function QJ (line 28991) | function QJ(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[4984274]|0;if((b|0)==0){d=2...
function RJ (line 28991) | function RJ(a){a=a|0;var b=0,d=0.0,e=0,f=0;b=c[4984274]|0;if((b|0)==0){d...
function SJ (line 28991) | function SJ(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0.0,k=0,l=0.0,m=0,n=0...
function TJ (line 28991) | function TJ(a,b){a=a|0;b=b|0;return c[(SJ(a,b)|0)+4>>2]|0}
function UJ (line 28991) | function UJ(a,b){a=a|0;b=b|0;return+(+g[(SJ(a,b)|0)+16>>2])}
function VJ (line 28991) | function VJ(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o...
function WJ (line 28991) | function WJ(b){b=b|0;var d=0,e=0,f=0;d=i;if(!(+UJ(125480,171448)!=0.0)){...
function XJ (line 28991) | function XJ(){var a=0,b=0,d=0;a=i;b=c[4982014]|0;if((b|0)==0){i=a;return...
function YJ (line 28991) | function YJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d|0;if((c[49...
function ZJ (line 28991) | function ZJ(a){a=a|0;var b=0,d=0;b=jk[c[7092498]&255](a+4|0)|0;if((b|0)=...
function _J (line 28991) | function _J(a){a=a|0;var b=0,d=0;b=jk[c[7092498]&255](a+4|0)|0;if((b|0)=...
function $J (line 28991) | function $J(a){a=a|0;var b=0,d=0;b=jk[c[7092501]&255](a+4|0)|0;if((b|0)=...
function aK (line 28991) | function aK(a){a=a|0;var b=0,d=0;b=jk[c[7092501]&255](a+4|0)|0;if((b|0)=...
function bK (line 28991) | function bK(a){a=a|0;var b=0;b=a-4|0;if((c[b>>2]|0)!=305419896){return}v...
function cK (line 28991) | function cK(){return Ok[c[7092500]&63]()|0}
function dK (line 28991) | function dK(){return}
function eK (line 28991) | function eK(){return}
function fK (line 28991) | function fK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+1040|0;...
function gK (line 28991) | function gK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+1040|0;...
function hK (line 28991) | function hK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function iK (line 28991) | function iK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0...
function jK (line 28991) | function jK(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0...
function kK (line 28991) | function kK(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0...
function lK (line 28991) | function lK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function mK (line 28991) | function mK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function nK (line 28991) | function nK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function oK (line 28991) | function oK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+1064|0;...
function pK (line 28991) | function pK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i...
function qK (line 28991) | function qK(a){a=a|0;var b=0,d=0;b=pK(a)|0;if((b|0)==0){d=0;return d|0}c...
function rK (line 28991) | function rK(){var a=0,b=0,d=0;a=c[5120102]|0;if((a|0)==0){return}else{b=...
function sK (line 28991) | function sK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function tK (line 28991) | function tK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function uK (line 28991) | function uK(a){a=a|0;return tK(a,8)|0}
function vK (line 28991) | function vK(a){a=a|0;return tK(a,16)|0}
function wK (line 28991) | function wK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=a+206...
function xK (line 28991) | function xK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=a+2068|0;e=c[d>>2...
function yK (line 28991) | function yK(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0...
function zK (line 28991) | function zK(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0...
function AK (line 28991) | function AK(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0...
function BK (line 28991) | function BK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+8|0...
function CK (line 28991) | function CK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+8|0;d=b|0;if((zK(a,...
function DK (line 28991) | function DK(a){a=a|0;var b=0;b=i;fK(a,52880,(a=i,i=i+1|0,i=i+7&-8,c[a>>2...
function EK (line 28991) | function EK(b){b=b|0;var d=0,e=0,f=0;d=i;i=i+1064|0;e=d|0;f=e|0;a[f]=0;h...
function FK (line 28991) | function FK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+106...
function GK (line 28991) | function GK(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i...
function HK (line 28991) | function HK(a){a=a|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;d...
function IK (line 28991) | function IK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function JK (line 28991) | function JK(a){a=a|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i...
function KK (line 28991) | function KK(a){a=a|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;d...
function LK (line 28991) | function LK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function MK (line 28991) | function MK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function NK (line 28991) | function NK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+1064|0;e=d|...
function OK (line 28991) | function OK(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0...
function PK (line 28991) | function PK(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((MK(a,b)|0)!=0){e=1;i=d;...
function QK (line 28991) | function QK(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=ZJ(1060)|0;if((d|0)==0){U...
function RK (line 28991) | function RK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function SK (line 28991) | function SK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a...
function TK (line 28991) | function TK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=1;while(1){d=2156224+(b<<...
function UK (line 28991) | function UK(a){a=a|0;var b=0,d=0,e=0;do{if((a-1|0)>>>0>62>>>0){b=0}else{...
function VK (line 28991) | function VK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0;d=i;i=i+106...
function WK (line 28991) | function WK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((a-1|0)>>>0>62>>...
function XK (line 28991) | function XK(a){a=a|0;nL(a);return}
function YK (line 28991) | function YK(){var a=0,b=0,d=0,e=0;a=i;b=1;do{d=c[2156224+(b<<2)>>2]|0;if...
function ZK (line 28991) | function ZK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function _K (line 28991) | function _K(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i...
function $K (line 28991) | function $K(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i...
function aL (line 28991) | function aL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function bL (line 28991) | function bL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function cL (line 28991) | function cL(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0,l=0,m...
function dL (line 28991) | function dL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function eL (line 28991) | function eL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function fL (line 28991) | function fL(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0...
function gL (line 28991) | function gL(b){b=b|0;var c=0;if((a[b]|0)==34){s$(b|0,b+1|0,o$(b|0)|0)|0}...
function hL (line 28991) | function hL(b){b=b|0;var c=0;if((a[b]|0)==39){s$(b|0,b+1|0,o$(b|0)|0)|0}...
function iL (line 28991) | function iL(a,b){a=a|0;b=b|0;c[a+1064>>2]=b;return}
function jL (line 28991) | function jL(a){a=a|0;return(c[a+1028>>2]|0)>>>0>=(c[a+1032>>2]|0)>>>0|0}
function kL (line 28991) | function kL(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+72|...
function lL (line 28991) | function lL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=_J(d+2141|0)|0;g=...
function mL (line 28991) | function mL(a){a=a|0;var b=0;b=c[a+1072>>2]|0;if((b|0)!=0){bK(b)}bK(a|0)...
function nL (line 28991) | function nL(a){a=a|0;var b=0,d=0;b=i;$B(28375504,64,46784,(d=i,i=i+8|0,c...
function oL (line 28991) | function oL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function pL (line 28991) | function pL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+1064|0;...
function qL (line 28991) | function qL(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;c=i;i=i+1064|0;e=c|...
function rL (line 28991) | function rL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function sL (line 28991) | function sL(){var b=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=...
function tL (line 28991) | function tL(){var b=0,d=0,e=0;b=i;i=i+48|0;if((ei(32)|0)==0){i=b;return}...
function uL (line 28991) | function uL(){var b=0,e=0,f=0,h=0,j=0,k=0,l=0;b=i;i=i+16384|0;if((ei(32)...
function vL (line 28991) | function vL(){var a=0;tL();c[4954362]=0;a=c[535074]|0;if((a|0)==0){rh(51...
function wL (line 28991) | function wL(){var a=0;a=c[535074]|0;if((a|0)!=0){og(a|0);c[535074]=0}rh(...
function xL (line 28991) | function xL(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function yL (line 28991) | function yL(){var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,...
function zL (line 28991) | function zL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function AL (line 28991) | function AL(){return c[5385954]|0}
function BL (line 28991) | function BL(){var a=0,b=0;a=i;Sr(159864,(b=i,i=i+1|0,i=i+7&-8,c[b>>2]=0,...
function CL (line 28991) | function CL(){return}
function DL (line 28991) | function DL(){return}
function EL (line 28991) | function EL(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=o$(b|...
function FL (line 28991) | function FL(){var b=0;if((a[20457448]|0)==0){b=xg()|0}else{b=20457448}re...
function GL (line 28991) | function GL(){wL();return}
function HL (line 28991) | function HL(){return YL()|0}
function IL (line 28991) | function IL(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+64|0;d=vc()|0;...
function JL (line 28991) | function JL(){KL(0)}
function KL (line 28991) | function KL(b){b=b|0;var d=0,e=0,f=0;WL();Te();do{if((b|0)<2){d=vc()|0;i...
function LL (line 28991) | function LL(){var a=0,b=0,c=0;a=(rg()|0)!=0|0;b=(vj()|0)==0;c=b?a:a|2;a=...
function ML (line 28991) | function ML(){Gr(117872,148);kt(107432,64088);kt(56280,cd()|0);return}
function NL (line 28991) | function NL(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0...
function OL (line 28991) | function OL(a){a=a|0;EL(a)|0;ZL(a);return}
function PL (line 28991) | function PL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+1040|0;e=d|0;f=d+16...
function QL (line 28991) | function QL(a){a=a|0;var b=0,d=0;b=i;if((a|0)==0){Sr(184152,(d=i,i=i+1|0...
function RL (line 28991) | function RL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;Sr(...
function SL (line 28991) | function SL(b){b=b|0;var d=0,e=0;if(a[186320]|0){Rc(c[p>>2]|0,136808,(d=...
function TL (line 28991) | function TL(){if((c[6924866]|0)!=0){return}sL();Ms();return}
function UL (line 28991) | function UL(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function VL (line 28991) | function VL(a,b){a=a|0;b=b|0;b=c[a>>2]|0;if((b|0)!=0){W_(b)}W_(a);c[6924...
function WL (line 28991) | function WL(){return}
function XL (line 28991) | function XL(){return}
function YL (line 28991) | function YL(){return 0}
function ZL (line 28991) | function ZL(a){a=a|0;var b=0;b=c[5458850]|0;do{if((b|0)!=0){if((c[b+32>>...
function _L (line 28991) | function _L(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+8|0;d=b|0;if((a-1|0)>>>...
function $L (line 28991) | function $L(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i...
function aM (line 28991) | function aM(e,f,g,h,i,j,k){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var...
function bM (line 28991) | function bM(d,e,f,g,h,j,k,l){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l...
function zq (line 28995) | function zq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Aq (line 28995) | function Aq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o...
function Bq (line 28995) | function Bq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Cq (line 28995) | function Cq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function Dq (line 28995) | function Dq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function Eq (line 28995) | function Eq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Fq (line 28995) | function Fq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Gq (line 28995) | function Gq(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0...
function Hq (line 28995) | function Hq(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p...
function Iq (line 28995) | function Iq(a){a=a|0;var b=0,d=0,e=0;b=i;d=a|0;if((c[d>>2]|0)==-55903061...
function Jq (line 28995) | function Jq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0;e...
function Kq (line 28995) | function Kq(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,h=0.0,j=0,k=0.0,l=0,m=0.0,...
function Lq (line 28995) | function Lq(a){a=a|0;var b=0,d=0,e=0,f=0;b=a|0;d=c[b>>2]|0;c[6924874]=(c...
function Mq (line 28995) | function Mq(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,h=0,j=0,k=0,l=0,m=0,n...
function Nq (line 28995) | function Nq(b){b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0;if((c[549...
function Oq (line 28995) | function Oq(a,b){a=a|0;b=b|0;var d=0,e=0;d=~b;if(!((c[(c[5497049]|0)+(d*...
function Pq (line 28995) | function Pq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;if((b|0)<0){d=b...
function Qq (line 28995) | function Qq(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0;h=i;i=i...
function Rq (line 28995) | function Rq(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o...
function Sq (line 28995) | function Sq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0...
function Tq (line 28995) | function Tq(a){a=a|0;var b=0;do{if((a|0)>=0){if(!((c[5497058]|0)>(a|0)&(...
function Uq (line 28995) | function Uq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[549...
function Vq (line 28995) | function Vq(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=(c[5497069]|0)+1|0;c...
function Wq (line 28995) | function Wq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function Xq (line 28995) | function Xq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[(c[5497022]|0)+32...
function Yq (line 28995) | function Yq(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[549...
function Zq (line 28995) | function Zq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(+g[b>>2]<+g[c>>2...
function _q (line 28995) | function _q(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0...
function $q (line 28995) | function $q(a,b){a=a|0;b=b|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n...
function ar (line 28995) | function ar(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function br (line 28995) | function br(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0,n...
function cr (line 28995) | function cr(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0...
function dr (line 28995) | function dr(a,b){a=a|0;b=b|0;var e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0...
function er (line 28995) | function er(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function fr (line 28995) | function fr(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,j=0,l=0.0,m=...
function gr (line 28995) | function gr(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=f|0;h=h|0;var j=0,l=0,m...
function hr (line 28995) | function hr(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ir (line 28995) | function ir(b,d,e,f,h,j){b=b|0;d=d|0;e=+e;f=+f;h=h|0;j=j|0;var k=0,l=0,m...
function jr (line 28995) | function jr(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j...
function kr (line 28995) | function kr(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h...
function lr (line 28995) | function lr(a,b,d,e,f,h,j,k,l,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j...
function mr (line 28995) | function mr(){var a=0,b=0;if((c[5497016]|0)==2){a=oj(c[5495993]|0)|0;b=(...
function nr (line 28995) | function nr(){return c[5497016]|0}
function or (line 28995) | function or(a){a=a|0;var b=0;if(!((c[5497016]|0)>>>0>a>>>0)){b=28378552;...
function pr (line 28995) | function pr(){c[5493934]=21844664;c[5493935]=131072;c[5493936]=0;return}
function qr (line 28995) | function qr(a){a=a|0;var b=0,d=0,e=0;b=i;d=o$(a|0)|0;e=c[5493936]|0;if((...
function rr (line 28995) | function rr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function sr (line 28995) | function sr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;Er(a,0);if((c[5497016]|0)==...
function tr (line 28995) | function tr(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function ur (line 28995) | function ur(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=...
function vr (line 28995) | function vr(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if((c[5497...
function wr (line 28995) | function wr(){var b=0,d=0,e=0,f=0;b=i;a[30283200]=0;if((c[5497016]|0)>1)...
function xr (line 28995) | function xr(){var b=0,d=0,e=0;a[30283200]=0;if((c[5497016]|0)>1){b=1}els...
function yr (line 28995) | function yr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[5497016]|0)>>>0>a>>>0...
function zr (line 28995) | function zr(b){b=b|0;var d=0,e=0;a[30284224]=0;d=(b|0)<0?0:b;if((d|0)<(c...
function Ar (line 28995) | function Ar(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;a[30283200]=0;if((c[5497016...
function Br (line 28995) | function Br(){return 21975776}
function Cr (line 28995) | function Cr(){var b=0,d=0,e=0;if((c[5497016]|0)>1){b=1}else{return}do{d=...
function Dr (line 28995) | function Dr(a){a=a|0;Er(a,0);return}
function Er (line 28995) | function Er(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function Fr (line 28995) | function Fr(a){a=a|0;Er(a,1);return}
function Gr (line 28995) | function Gr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=c[5493942]|0;a:do{if(...
function Hr (line 28995) | function Hr(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[5493942]|0;if((d|0)==0){ret...
function Ir (line 28995) | function Ir(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=21975768;while(1){d=c[b>>...
function Jr (line 28995) | function Jr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=c[5493942...
function Kr (line 28995) | function Kr(a){a=a|0;var b=0,d=0;b=c[5493942]|0;if((b|0)==0){return}else...
function Lr (line 28995) | function Lr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[5493942]|0;if((e|0)...
function Mr (line 28995) | function Mr(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;b=...
function Nr (line 28995) | function Nr(a,b){a=a|0;b=b|0;if((b|0)!=2){return}Ss(28378552,152184,0,1)...
function Or (line 28995) | function Or(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function Pr (line 28995) | function Pr(a,b){a=a|0;b=b|0;var d=0;d=X_(1,8)|0;c[d+4>>2]=a;if((b|0)!=0...
function Qr (line 28995) | function Qr(b,d,e){b=b|0;d=d|0;e=e|0;if((b|0)==0|(d|0)==0|(e|0)==0){retu...
function Rr (line 28995) | function Rr(){var a=0;a=c[4917276]|0;if((a|0)!=0){vk[a&511](c[4917280]|0...
function Sr (line 28995) | function Sr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Tr (line 28995) | function Tr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+4112|0;...
function Ur (line 28995) | function Ur(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+16|...
function Vr (line 28995) | function Vr(a){a=a|0;var b=0,d=0,e=0,f=0;b=1;d=0;e=i;i=i+168|0;c[e>>2]=0...
function Wr (line 28995) | function Wr(){var b=0;b=xr()|0;if((c[5458544]|0)!=0){JL()}kD();MA((a[b]|...
function Xr (line 28995) | function Xr(a,b){a=a|0;b=b|0;b=c[a>>2]|0;if((b|0)!=0){W_(b)}W_(a);c[6924...
function Yr (line 28995) | function Yr(){var b=0,d=0,e=0,f=0,g=0;if((c[5457484]|0)>0){b=0}else{d=0;...
function Zr (line 28995) | function Zr(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((c[5457484]|0)<=0){retur...
function _r (line 28995) | function _r(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function $r (line 28995) | function $r(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function as (line 28995) | function as(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function bs (line 28995) | function bs(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function cs (line 28995) | function cs(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+8|0;d=b|0;e=Xj(0)|0;c[d...
function ds (line 28995) | function ds(){var a=0;a=c[4954636]|0;return(c[a>>2]|0)-(c[a+4>>2]|0)|0}
function es (line 28995) | function es(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0...
function fs (line 28995) | function fs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function gs (line 28995) | function gs(a){a=a|0;var b=0;b=fs(a,1)|0;n$(b|0,0,a|0)|0;return b|0}
function hs (line 28995) | function hs(a){a=a|0;return fs(a,4)|0}
function is (line 28995) | function is(b){b=b|0;var c=0,d=0;c=a[b]|0;if(c<<24>>24==0){d=29668;retur...
function js (line 28995) | function js(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function ks (line 28995) | function ks(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;a=i;b=c[495463...
function ls (line 28995) | function ls(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;if((Ot()|0)!=0){Ur...
function ms (line 28995) | function ms(){var a=0,b=0;a=i;rl();Vp();yA();zl();n$(20462568|0,0|0,16|0...
function ns (line 28995) | function ns(){var a=0,b=0,d=0,e=0;a=c[5115643]|0;b=c[5115644]|0;d=c[5115...
function os (line 28995) | function os(){c[5115642]=c[5115643];c[5115646]=c[5115647];return}
function ps (line 28995) | function ps(){var a=0;a=c[5115642]|0;c[5115644]=a;c[5115643]=a;a=c[51156...
function qs (line 28995) | function qs(){return(c[5115646]|c[5115642]|0)!=0|0}
function rs (line 28995) | function rs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ss (line 28995) | function ss(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function ts (line 28995) | function ts(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[4883704]|0;if((...
function us (line 28995) | function us(){var a=0;if((c[4883704]|0)==0){return}a=c[5115638]|0;c[a+8>...
function vs (line 28995) | function vs(){var a=0,b=0,d=0,e=0;a=i;Zr(49088);b=gt(49088,48560,16)|0;c...
function ws (line 28995) | function ws(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0...
function xs (line 28995) | function xs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i...
function ys (line 28995) | function ys(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+48|0;d=b|0;...
function zs (line 28995) | function zs(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[(c[5451072]|0)+32>>2]...
function As (line 28995) | function As(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function Bs (line 28995) | function Bs(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;i=...
function Cs (line 28995) | function Cs(){var a=0,b=0,d=0,e=0;a=i;b=nr()|0;d=or(1)|0;if((b|0)>2){ic(...
function Ds (line 28995) | function Ds(){var b=0,d=0;rr(0,185824);tr();a:do{if((c[5457484]|0)>0){b=...
function Es (line 28995) | function Es(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(!((c[545...
function Fs (line 28995) | function Fs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;b=c[a>>2]|0;d=c[b+8>>2]|0;e...
function Gs (line 28995) | function Gs(){var a=0;a=or(1)|0;if((au(a,c[(c[5458848]|0)+4>>2]|0)|0)==0...
function Hs (line 28995) | function Hs(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Is (line 28995) | function Is(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Js (line 28995) | function Js(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=c[493034...
function Ks (line 28995) | function Ks(){var a=0,b=0,d=0;a=i;if((c[5457512]|0)==0){i=a;return}b=c[5...
function Ls (line 28995) | function Ls(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;i=i+64|0;b=a|0;if((nr()|0)...
function Ms (line 28995) | function Ms(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function Ns (line 28995) | function Ns(a){a=a|0;n$(a+12|0,0,256)|0;c[a>>2]=0;c[a+4>>2]=0;return}
function Os (line 28995) | function Os(){c[4954632]=0;a[2160832]=0;Xn(172);if((Qs()|0)!=0){return}X...
function Ps (line 28995) | function Ps(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[5450798]|0;if((...
function Qs (line 28995) | function Qs(){var a=0,b=0,d=0,e=0,f=0;a=i;if((c[4954632]|0)==0){b=1;i=a;...
function Rs (line 28995) | function Rs(a){a=a|0;var b=0,d=0;b=i;if((jC(a,2160832,o$(2160832)|0)|0)!...
function Ss (line 28995) | function Ss(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;c[4954632]=0;a[2160832]=0;Z...
function Ts (line 28995) | function Ts(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function Us (line 28995) | function Us(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+64|0;d=b|0;if((jC(a...
function Vs (line 28995) | function Vs(a){a=a|0;c[5450800]=a;Ts(a+12|0,1,1);return}
function Ws (line 28995) | function Ws(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((Jc(b|0,d|0)|0)!=0){...
function Xs (line 28995) | function Xs(){var b=0,c=0;b=Fp()|0;if((a[b]|0)!=0){c=b;return c|0}c=ct(1...
function Ys (line 28995) | function Ys(){var b=0,c=0;b=Gp()|0;if((a[b]|0)!=0){c=b;return c|0}c=ct(1...
function Zs (line 28995) | function Zs(){var a=0;if((nr()|0)>1){Ur(1,156984,(a=i,i=i+1|0,i=i+7&-8,c...
function _s (line 28995) | function _s(){ea(0);return}
function $s (line 28995) | function $s(){var a=0,b=0,d=0.0,e=0.0;a=i;if((nr()|0)!=2){Sr(157200,(b=i...
function at (line 28995) | function at(b){b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0,l=0;d=a[b]|0;if(d...
function bt (line 28995) | function bt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a[b]|0;if(d<<...
function ct (line 28995) | function ct(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a[b]|0;if(d<<...
function dt (line 28995) | function dt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=a[b]|0;if...
function et (line 28995) | function et(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=a[b]|0;if(d<<24>>...
function ft (line 28995) | function ft(a){a=a|0;var b=0,d=0;b=c[5389058]|0;if((b|0)==0){return}else...
function gt (line 28995) | function gt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function ht (line 28995) | function ht(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0.0,m=0.0,n=0...
function it (line 28995) | function it(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function jt (line 28995) | function jt(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;Sr(1011...
function kt (line 28995) | function kt(a,b){a=a|0;b=b|0;it(a,b,1)|0;return}
function lt (line 28995) | function lt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function mt (line 28995) | function mt(a,b){a=a|0;b=b|0;it(a,b,0)|0;return}
function nt (line 28995) | function nt(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,j=0;d=i;i=i+32|0;e=~~b;f...
function ot (line 28995) | function ot(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;i=i+32|0;e=d|0;if((iC(b)...
function pt (line 28995) | function pt(a){a=a|0;it(a,0,0)|0;return}
function qt (line 28995) | function qt(a){a=a|0;it(a,0,1)|0;return}
function rt (line 28995) | function rt(){var a=0,b=0,d=0;a=c[5389058]|0;if((a|0)==0){return}else{b=...
function st (line 28995) | function st(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=or(0)|0;d=a[...
function tt (line 28995) | function tt(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;if((nr()|0)!=2){Sr...
function ut (line 28999) | function ut(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function vt (line 28999) | function vt(){var b=0,d=0,e=0,f=0,g=0;b=i;d=nr()|0;e=or(0)|0;if((d|0)<2)...
function wt (line 28999) | function wt(){var a=0,b=0;a=i;if((nr()|0)==2){it(or(1)|0,0,0)|0;i=a;retu...
function xt (line 28999) | function xt(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function yt (line 28999) | function yt(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;if((nr...
function zt (line 28999) | function zt(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+52|0;d=c[b>>2]|0;e=...
function At (line 28999) | function At(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;if((nr...
function Bt (line 28999) | function Bt(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[5389058]|0;if((b|0)==0){ret...
function Ct (line 28999) | function Ct(){var a=0,b=0,d=0;a=c[5389058]|0;if((a|0)==0){return}else{b=...
function Dt (line 28999) | function Dt(b){b=b|0;var d=0,e=0;a[30271848]=0;d=c[5389058]|0;if((d|0)==...
function Et (line 28999) | function Et(b){b=b|0;var d=0,e=0;a[30272872]=0;d=c[5389058]|0;if((d|0)==...
function Ft (line 28999) | function Ft(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;a[30271848]=0;f=c[53890...
function Gt (line 28999) | function Gt(a,b,d,e){a=a|0;b=+b;d=+d;e=e|0;c[a+36>>2]=1;g[a+44>>2]=b;g[a...
function Ht (line 28999) | function Ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((e&6...
function It (line 28999) | function It(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0;b=i;d=c[a>>2]|0;if(!(d>...
function Jt (line 28999) | function Jt(a,b){a=a|0;b=b|0;if((b|0)!=2){return}b=yC(a,1,133136)|0;if(!...
function Kt (line 28999) | function Kt(){n$(21556256|0,0|0,147456|0)|0;n$(20479376|0,0|0,1024|0)|0;...
function Lt (line 28999) | function Lt(){return(c[5144096]|0)!=0|0}
function Mt (line 28999) | function Mt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Nt (line 28999) | function Nt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Ot (line 28999) | function Ot(){return c[5144108]|0}
function Pt (line 28999) | function Pt(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>62>>>0){Ur(1,176...
function Qt (line 28999) | function Qt(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>62>>>0){Ur(1,176...
function Rt (line 28999) | function Rt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+409...
function St (line 28999) | function St(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i...
function Tt (line 28999) | function Tt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+409...
function Ut (line 28999) | function Ut(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+4096|0;...
function Vt (line 28999) | function Vt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Wt (line 28999) | function Wt(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Xt (line 28999) | function Xt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Yt (line 28999) | function Yt(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[5144096]|0)==0){Ur(0,1817...
function Zt (line 28999) | function Zt(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i...
function _t (line 28999) | function _t(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i...
function $t (line 28999) | function $t(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i...
function au (line 28999) | function au(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c...
function bu (line 28999) | function bu(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0...
function cu (line 28999) | function cu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[514...
function du (line 28999) | function du(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0...
function eu (line 28999) | function eu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((c[51440...
function fu (line 28999) | function fu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function gu (line 28999) | function gu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function hu (line 28999) | function hu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+4112|0;...
function iu (line 28999) | function iu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function ju (line 28999) | function ju(a){a=a|0;var b=0,d=0;b=20492416+(a*288|0)|0;if((c[20492440+(...
function ku (line 28999) | function ku(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function lu (line 28999) | function lu(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0...
function mu (line 28999) | function mu(a,b){a=a|0;b=b|0;return lu(a,0,0,b)|0}
function nu (line 28999) | function nu(a){a=a|0;var b=0,d=0;b=i;if((c[5144096]|0)==0){Ur(0,181760,(...
function ou (line 28999) | function ou(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((c[5144096]|...
function pu (line 28999) | function pu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=qu(a,28378736)|0;if((b|0)...
function qu (line 28999) | function qu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function ru (line 28999) | function ru(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0...
function su (line 28999) | function su(a,b,c){a=a|0;b=b|0;c=c|0;return ru(a,b,0,c,0)|0}
function tu (line 28999) | function tu(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[5144096]|0)==0){Ur(0,...
function uu (line 28999) | function uu(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0...
function vu (line 28999) | function vu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function wu (line 28999) | function wu(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;i=i+8|0;b=a|0;do{i...
function xu (line 28999) | function xu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function yu (line 28999) | function yu(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+8|0;d=...
function zu (line 28999) | function zu(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;a=i;Sr(60688,(b=i,...
function Au (line 28999) | function Au(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;i=i+8|0;b=a|0;if((...
function Bu (line 28999) | function Bu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((bu(a,b,0,0,0)|0...
function Cu (line 28999) | function Cu(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=or(1)|0;e=a[d]|0...
function Du (line 28999) | function Du(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Eu (line 28999) | function Eu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=c...
function Fu (line 28999) | function Fu(a){a=a|0;if((ii(a|0,49032)|0)==0){return(ii(a|0,48544)|0)!=0...
function Gu (line 28999) | function Gu(a,b){a=a|0;b=b|0;var d=0;b=c[a>>2]|0;d=c[b>>2]|0;if((b|0)!=0...
function Hu (line 28999) | function Hu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i...
function Iu (line 28999) | function Iu(){var b=0,d=0,e=0,f=0,g=0;b=i;a[30255200]=0;d=c[5144096]|0;i...
function Ju (line 28999) | function Ju(){var b=0,d=0,e=0,f=0;a[30247008]=0;b=c[5144096]|0;if((b|0)=...
function Ku (line 28999) | function Ku(){var b=0,d=0,e=0,f=0,g=0;b=i;a[30238816]=0;d=c[5144096]|0;i...
function Lu (line 28999) | function Lu(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;a[30230624]=0;d=c[5144...
function Mu (line 28999) | function Mu(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Nu (line 28999) | function Nu(){var b=0,d=0,e=0,f=0;a[30222432]=0;b=c[5144096]|0;if((b|0)=...
function Ou (line 28999) | function Ou(a){a=a|0;var b=0,d=0,e=0;b=c[5144096]|0;if((b|0)==0){return}...
function Pu (line 28999) | function Pu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;Dr(b);b=nr()|0;...
function Qu (line 28999) | function Qu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;Dr(b);b=nr()|0;e=(b...
function Ru (line 28999) | function Ru(a,b){a=a|0;b=b|0;var d=0,e=0;b=i;d=c[a>>2]|0;e=c[d>>2]|0;if(...
function Su (line 28999) | function Su(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;Zr(1853...
function Tu (line 28999) | function Tu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;Sr(182608,(f=i,i=i+...
function Uu (line 28999) | function Uu(a,b){a=a|0;b=b|0;var d=0,e=0;d=Pr(102,8)|0;e=c[d>>2]|0;c[e>>...
function Vu (line 28999) | function Vu(a,b){a=a|0;b=b|0;var d=0;c[5145144]=c[c[a>>2]>>2];b=c[514409...
function Wu (line 28999) | function Wu(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function Xu (line 28999) | function Xu(a,b){a=a|0;b=b|0;var d=0,e=0;b=c[a>>2]|0;d=c[b+4>>2]|0;e=c[b...
function Yu (line 28999) | function Yu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function Zu (line 28999) | function Zu(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0...
function _u (line 28999) | function _u(){var b=0,d=0;b=c[(c[5144114]|0)+4>>2]|0;if((a[b]|0)!=0){d=b...
function $u (line 28999) | function $u(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=i;e=c[b>>2]|0;f=c[e+4...
function av (line 28999) | function av(a,b){a=a|0;b=b|0;b=c[a>>2]|0;if((b|0)!=0){W_(b)}W_(a);c[6924...
function bv (line 28999) | function bv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function cv (line 28999) | function cv(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function dv (line 28999) | function dv(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function ev (line 28999) | function ev(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function fv (line 28999) | function fv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function gv (line 28999) | function gv(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0...
function hv (line 28999) | function hv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(!(a[12080]|0...
function iv (line 28999) | function iv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(!(a[12080]|0...
function jv (line 28999) | function jv(a){a=a|0;c[a+20>>2]=0;c[a+4>>2]=0;c[a+28>>2]=0;return}
function kv (line 28999) | function kv(a){a=a|0;c[a+8>>2]=0;return}
function lv (line 28999) | function lv(a){a=a|0;c[a+24>>2]=0;c[a+28>>2]=0;c[a+8>>2]=1;return}
function mv (line 28999) | function mv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=e+20|0;if...
function nv (line 28999) | function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ov (line 28999) | function ov(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function pv (line 28999) | function pv(a,b){a=a|0;b=b|0;nv(a,b,8);return}
function qv (line 28999) | function qv(a,b,c){a=a|0;b=b|0;c=c|0;var e=0;if((c|0)>0){e=0}else{return...
function rv (line 28999) | function rv(a,b){a=a|0;b=b|0;nv(a,b,16);return}
function sv (line 28999) | function sv(a,b){a=a|0;b=b|0;nv(a,b,32);return}
function tv (line 28999) | function tv(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+1024|0;...
function uv (line 28999) | function uv(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+8192|0;...
function vv (line 28999) | function vv(a){a=a|0;var b=0;b=(ov(a,8)|0)&255;return((c[a+24>>2]|0)>(c[...
function wv (line 28999) | function wv(a){a=a|0;var b=0;b=(ov(a,16)|0)<<16>>16;return((c[a+24>>2]|0...
function xv (line 28999) | function xv(a){a=a|0;var b=0;b=ov(a,32)|0;return((c[a+24>>2]|0)>(c[a+20>...
function yv (line 28999) | function yv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b+24|0;e=b+20...
function zv (line 28999) | function zv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b+24|0;e=b+20...
function Av (line 28999) | function Av(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=b+24|0;e=b+20...
function Bv (line 28999) | function Bv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)<=0){re...
function Cv (line 28999) | function Cv(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;a:do{if((c|0)>0...
function Dv (line 28999) | function Dv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=f|0;h...
function Ev (line 28999) | function Ev(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0...
function Fv (line 28999) | function Fv(){var a=0,b=0,d=0,e=0;a=i;b=0;do{d=c[19721376+(b<<2)>>2]|0;i...
function Gv (line 28999) | function Gv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function Hv (line 28999) | function Hv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,l=0,m=0,n=0,o=0...
function Iv (line 28999) | function Iv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Jv (line 28999) | function Jv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,l=0,m=0,n=0,o=0,p=0...
function Kv (line 28999) | function Kv(a){a=a|0;var b=0,d=0,e=0;b=i;c[540204]=gt(161792,179008,256)...
function Lv (line 28999) | function Lv(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i...
function Mv (line 28999) | function Mv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Nv (line 28999) | function Nv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function Ov (line 28999) | function Ov(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function Pv (line 28999) | function Pv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function Qv (line 28999) | function Qv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[198...
function Rv (line 28999) | function Rv(){var a=0,b=0,d=0;if((c[4938792]|0)==0){return}while(1){a=wf...
function Sv (line 28999) | function Sv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i...
function Tv (line 28999) | function Tv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+328...
function Uv (line 28999) | function Uv(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function Vv (line 28999) | function Vv(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+128...
function Wv (line 28999) | function Wv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0...
function Xv (line 28999) | function Xv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=b...
function Yv (line 28999) | function Yv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+64|...
function Zv (line 28999) | function Zv(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+128|0;f=d;d...
function _v (line 28999) | function _v(e){e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+256|0;g...
function $v (line 28999) | function $v(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i...
function aw (line 28999) | function aw(a){a=a|0;var b=0,d=0;b=i;d=a;a=i;i=i+32|0;m$(a,d,32)|0;i=b;r...
function bw (line 28999) | function bw(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Sz (line 29003) | function Sz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Tz (line 29003) | function Tz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Uz (line 29003) | function Uz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;if((c[(c[5451068]|0)+3...
function Vz (line 29003) | function Vz(a,b){a=a|0;b=b|0;var d=0;b=c[a>>2]|0;d=c[b>>2]|0;if((b|0)!=0...
function Wz (line 29003) | function Wz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function Xz (line 29003) | function Xz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function Yz (line 29003) | function Yz(a){a=a|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function Zz (line 29003) | function Zz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i...
function _z (line 29003) | function _z(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b+4|0;TB(...
function $z (line 29003) | function $z(b){b=b|0;var d=0,e=0,f=0;_A(b);d=b+67744|0;e=c[d>>2]|0;if((e...
function aA (line 29003) | function aA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;Tr(124648,(e=i,...
function bA (line 29003) | function bA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function cA (line 29003) | function cA(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;if((c[(c[453930]|0)+32>>2]...
function dA (line 29003) | function dA(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;b=i;i=...
function eA (line 29003) | function eA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;Dr(...
function fA (line 29003) | function fA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=a+66588|0;f=b;c[e>>2]...
function gA (line 29003) | function gA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function hA (line 29003) | function hA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+16624|0;e=d|0;f...
function iA (line 29003) | function iA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function jA (line 29003) | function jA(a){a=a|0;var b=0,d=0;b=i;TB(a+4|0,or(1)|0,1024);_z(a);oD(c[5...
function kA (line 29003) | function kA(a){a=a|0;Zz(a,47208);return}
function lA (line 29003) | function lA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function mA (line 29003) | function mA(a){a=a|0;c[a+84968>>2]=0;c[a+84972>>2]=0;return}
function nA (line 29003) | function nA(b){b=b|0;var d=0,e=0,f=0,g=0;d=b+67744|0;e=c[d>>2]|0;if((e|0...
function oA (line 29003) | function oA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=oj(or(1)|0)|0;f=b+677...
function pA (line 29003) | function pA(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+67680|0;if((a[e]|0)!=0)...
function qA (line 29003) | function qA(a){a=a|0;var b=0,d=0;b=i;if((c[a>>2]|0)==4){i=b;return}Tr(52...
function rA (line 29003) | function rA(a){a=a|0;return(c[531802]|0)+(da(c[531803]|0,a)|0)|0}
function sA (line 29003) | function sA(a){a=a|0;return(c[531805]|0)+(da(c[531806]|0,a)|0)|0}
function tA (line 29003) | function tA(a){a=a|0;var b=0,d=0;b=i;do{if((a|0)!=0){d=c[a>>2]|0;if(d>>>...
function uA (line 29003) | function uA(a){a=a|0;return(c[531802]|0)+(da(c[531803]|0,(a-1820004|0)/3...
function vA (line 29003) | function vA(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|...
function wA (line 29003) | function wA(a,b){a=a|0;b=b|0;var c=0,e=0,f=0,g=0;c=Nq(a)|0;a=qq(c)|0;e=r...
function xA (line 29003) | function xA(b){b=b|0;var e=0,f=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0...
function yA (line 29003) | function yA(){var a=0,b=0;a=i;b=c[5120100]|0;if((b|0)==0){i=a;return}oD(...
function zA (line 29003) | function zA(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[5120100]|0;if((b|0)==0){i=...
function AA (line 29003) | function AA(){var a=0,b=0,d=0,e=0,f=0;a=i;b=gt(51160,46040,32)|0;if((b|0...
function BA (line 29003) | function BA(){var a=0,b=0,d=0,e=0;a=i;if((c[453968]|0)!=2){b=0;i=a;retur...
function CA (line 29003) | function CA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function DA (line 29003) | function DA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function EA (line 29003) | function EA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((e|0)<1){Ur(1,14...
function FA (line 29003) | function FA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;do{if((a|0)>=0){if((c[(...
function GA (line 29003) | function GA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((d|0)<1){Ur(1,99...
function HA (line 29003) | function HA(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;b=c[(c...
function IA (line 29003) | function IA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function JA (line 29003) | function JA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function KA (line 29003) | function KA(){var a=0,b=0,d=0;a=i;uz();gt(163320,170048,4)|0;gt(160568,1...
function LA (line 29003) | function LA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[453...
function MA (line 29003) | function MA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[5451068]|0;...
function NA (line 29003) | function NA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((c[a...
function OA (line 29003) | function OA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function PA (line 29003) | function PA(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function QA (line 29003) | function QA(){c[422841]=-9999;PA(160528);c[422841]=-9999;PA(160528);return}
function RA (line 29003) | function RA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function SA (line 29003) | function SA(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function TA (line 29003) | function TA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function UA (line 29003) | function UA(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function VA (line 29003) | function VA(){var a=0,b=0;a=c[453958]|0;if((a|0)==0){return 1}else{b=~~(...
function WA (line 29003) | function WA(a){a=a|0;var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function XA (line 29003) | function XA(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0;b=c[a+117824>>2]|0;...
function YA (line 29003) | function YA(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=cA()|0;b=(a|0)>-1?a:2147...
function ZA (line 29003) | function ZA(a){a=a|0;var b=0,d=0;b=i;Sv(1,1814248,56800,(d=i,i=i+8|0,c[d...
function _A (line 29003) | function _A(a){a=a|0;var b=0,d=0,e=0;b=a+117828|0;d=c[b>>2]|0;if((d|0)!=...
function $A (line 29003) | function $A(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((c[a+101420>>2]|...
function aB (line 29003) | function aB(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;pv(b,8);e=a+84976|0;do{if((...
function bB (line 29003) | function bB(a,b){a=a|0;b=b|0;return(Pv(a+84976|0,b)|0)!=0|0}
function cB (line 29003) | function cB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[a+66568>>2]...
function dB (line 29003) | function dB(a,b){a=a|0;b=b|0;var d=0;d=b+85024|0;c[b+68188+((c[d>>2]&31)...
function eB (line 29003) | function eB(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function fB (line 29003) | function fB(){var b=0,d=0,e=0,f=0;if((c[(c[453930]|0)+32>>2]|0)>0){b=0}e...
function gB (line 29003) | function gB(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function hB (line 29003) | function hB(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a>>2]|0;a=c[b>>2]|0;if(...
function iB (line 29003) | function iB(a){a=a|0;var b=0,d=0,e=0;if((c[a+432>>2]|0)!=0){b=nq(c[a+160...
function jB (line 29003) | function jB(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0;a=i;b=0;do{d=c[1814336+(b*...
function kB (line 29003) | function kB(){var a=0,b=0,d=0;a=i;i=i+32|0;n$(1814320,0,1280)|0;c[453922...
function lB (line 29003) | function lB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function mB (line 29003) | function mB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=tA(a)|0;c[a+416>>...
function nB (line 29003) | function nB(a){a=a|0;var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function oB (line 29003) | function oB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+24|0;g=...
function pB (line 29003) | function pB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function qB (line 29003) | function qB(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j...
function rB (line 29003) | function rB(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k...
function sB (line 29003) | function sB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function tB (line 29003) | function tB(a){a=a|0;if((a|0)<-128){return-128|0}else{return((a|0)>127?1...
function uB (line 29003) | function uB(a,b,c,d){a=+a;b=+b;c=+c;d=+d;return(~~(b*255.0)&255)<<8|~~(a...
function vB (line 29003) | function vB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j...
function wB (line 29003) | function wB(a){a=a|0;var b=0.0,c=0,d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;b=+...
function xB (line 29003) | function xB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0,h=0.0,j=0.0,k=0....
function yB (line 29003) | function yB(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,h=0.0,j=0.0,k=0,l=0...
function zB (line 29003) | function zB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0...
function AB (line 29003) | function AB(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0...
function BB (line 29003) | function BB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0;e=+g[...
function CB (line 29003) | function CB(a){a=a|0;g[a>>2]=1.0;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=...
function DB (line 29003) | function DB(a,b){a=a|0;b=b|0;g[b>>2]=+g[a>>2];g[b+4>>2]=+g[a+4>>2];g[b+8...
function EB (line 29003) | function EB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0,h=0,i=0.0,j=0,k...
function FB (line 29003) | function FB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+4|0;e=a+8|0;g[c>>2]...
function GB (line 29003) | function GB(a){a=+a;var b=0.0;b=(c[k>>2]=1597463007-((g[k>>2]=a,c[k>>2]|...
function HB (line 29003) | function HB(b){b=b|0;var c=0,d=0,e=0,f=0;c=+g[b>>2]<0.0|0;d=+g[b+4>>2]<0...
function IB (line 29003) | function IB(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,j=0,k=0.0,l=0,m=0,n...
function JB (line 29003) | function JB(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0;c=+S(+(+g...
function KB (line 29003) | function KB(a,b){a=a|0;b=b|0;g[a+8>>2]=99999.0;g[a+4>>2]=99999.0;g[a>>2]...
function LB (line 29003) | function LB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0,h=0,i=0.0,j=0.0...
function MB (line 29003) | function MB(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0,h=0.0,i=0.0,j=0.0;c...
function NB (line 29003) | function NB(a){a=+a;return(2139095040-((g[k>>2]=a,c[k>>2]|0)&2147483647)...
function OB (line 29003) | function OB(a){a=+a;var b=0.0,c=0.0;b=+Y(a);a=b;if(a>3.141592653589793){...
function PB (line 29003) | function PB(a,b,c){a=+a;b=+b;c=+c;var d=0.0;if(c<a){d=a}else{d=c>b?b:c}r...
function QB (line 29003) | function QB(b){b=b|0;var c=0,d=0,e=0;c=b;d=b;while(1){b=a[d]|0;if((b<<24...
function RB (line 29003) | function RB(a){a=a|0;var b=0,c=0;b=ge(a|0,46)|0;if((b|0)==0){return 2837...
function SB (line 29003) | function SB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=ge(b|...
function TB (line 29003) | function TB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if((b|0)==0){Ur(0,5...
function UB (line 29003) | function UB(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function VB (line 29003) | function VB(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function WB (line 29003) | function WB(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ge(a|0,46)|0;do{if((d...
function XB (line 29003) | function XB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=o$(b|...
function YB (line 29003) | function YB(a){a=a|0;return Wj(a|0)|0}
function ZB (line 29003) | function ZB(a){a=a|0;return Ue(a|0)|0}
function _B (line 29003) | function _B(a){a=a|0;var b=0,d=0;b=i;c[5457496]=1;c[5450806]=0;$B(218289...
function $B (line 29003) | function $B(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|...
function aC (line 29003) | function aC(){var a=0;a=c[5450806]|0;return((a|0)==0?c[5457496]|0:a)|0}
function bC (line 29003) | function bC(a){a=a|0;cC(a,1)|0;return 21803232}
function cC (line 29003) | function cC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function dC (line 29003) | function dC(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function eC (line 29003) | function eC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=d;while(1){cC(b,1)|0;...
function fC (line 29003) | function fC(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){e=d+1|0;f=...
function gC (line 29003) | function gC(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==0){c=...
function hC (line 29003) | function hC(b){b=b|0;var d=0,e=0,f=0;d=i;i=i+8|0;e=d|0;if((a[b]|0)==0){f...
function iC (line 29003) | function iC(a){a=+a;return+(~~a|0)==a|0}
function jC (line 29003) | function jC(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function kC (line 29003) | function kC(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b;b=d;d=c...
function lC (line 29003) | function lC(b){b=b|0;var c=0,d=0,e=0;c=a[b]|0;if(c<<24>>24==0){return b|...
function mC (line 29003) | function mC(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function nC (line 29003) | function nC(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=a[b]|0;if...
function oC (line 29003) | function oC(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a[b]|0;if(d<<...
function pC (line 29003) | function pC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d|0;f=c[...
function qC (line 29003) | function qC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=o$(d|0)|0...
function dF (line 29007) | function dF(a,d){a=a|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function eF (line 29007) | function eF(){var a=0,b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,...
function fF (line 29007) | function fF(a,d){a=a|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function gF (line 29007) | function gF(a){a=a|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function hF (line 29007) | function hF(){var a=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function iF (line 29007) | function iF(a){a=+a;var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,...
function jF (line 29007) | function jF(){var a=0,b=0,d=0,e=0;if((c[7094478]|0)==0){return}do{if((c[...
function kF (line 29007) | function kF(){var a=0,b=0;a=i;Tk[c[7092490]&255](1,131632,(b=i,i=i+8|0,c...
function lF (line 29007) | function lF(a){a=a|0;var b=0,d=0;b=a&16777215;if(b>>>0>31>>>0){d=1;retur...
function mF (line 29007) | function mF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function nF (line 29007) | function nF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=c[(c[7094...
function oF (line 29007) | function oF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if(!((a|0)>...
function pF (line 29007) | function pF(a){a=a|0;return c[(c[7094585]|0)+(a<<2)>>2]|0}
function qF (line 29007) | function qF(){var a=0,b=0,d=0,e=0,f=0,g=0;a=c[7094585]|0;if((a|0)!=0){bK...
function rF (line 29007) | function rF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function sF (line 29007) | function sF(){var a=0,d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function tF (line 29007) | function tF(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function uF (line 29007) | function uF(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=...
function vF (line 29007) | function vF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=...
function wF (line 29007) | function wF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=...
function xF (line 29007) | function xF(){var a=0,b=0,d=0,e=0,f=0,g=0;a=c[7094586]|0;if((a|0)!=0){bK...
function yF (line 29007) | function yF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;i=i+16|...
function zF (line 29007) | function zF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function AF (line 29007) | function AF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function BF (line 29007) | function BF(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function CF (line 29007) | function CF(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a=0;do{c[28378...
function DF (line 29007) | function DF(){var a=0;vF();wF();a=c[7094590]|0;if((a|0)!=0){bK(a)}c[7094...
function EF (line 29007) | function EF(d){d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0...
function FF (line 29007) | function FF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function GF (line 29007) | function GF(a){a=a|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function HF (line 29007) | function HF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function IF (line 29007) | function IF(a,f,h,j,k,l){a=a|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0...
function JF (line 29007) | function JF(a,b,d,f,h,j,k,l,m,n,o){a=a|0;b=b|0;d=d|0;f=f|0;h=h|0;j=j|0;k...
function KF (line 29007) | function KF(a,b){a=a|0;b=b|0;var d=0;if((c[7094479]|0)==0){n$(b|0,0,44)|...
function LF (line 29007) | function LF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((c[7094479]|...
function MF (line 29007) | function MF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[7094534]|0;do{i...
function NF (line 29007) | function NF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[(c[549707...
function OF (line 29007) | function OF(a,d,f,h,j,k,l,m){a=a|0;d=d|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m...
function PF (line 29007) | function PF(){var a=0;a=c[4954620]|0;if((a|0)!=0){bK(a)}c[4954620]=ZJ(c[...
function QF (line 29007) | function QF(){var a=0;a=c[4954620]|0;if((a|0)!=0){bK(a)}c[4954620]=0;a=c...
function RF (line 29007) | function RF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;i=i+80|0;f=...
function SF (line 29007) | function SF(){var a=0,b=0,d=0,e=0,f=0,g=0;a=c[7094547]|0;b=c[7094546]|0;...
function TF (line 29007) | function TF(){var a=0;a=c[7094546]|0;if((a|0)!=0){bK(a)}c[7094546]=0;c[7...
function UF (line 29007) | function UF(){var a=0;if((c[7094478]|0)==0){return}a=c[7094549]|0;if((a|...
function VF (line 29007) | function VF(){var a=0;a=c[7094549]|0;if((a|0)!=0){bK(a)}c[7094549]=0;ret...
function WF (line 29007) | function WF(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,j=0.0,k=0,l=0;b=i;if((c...
function XF (line 29007) | function XF(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0...
function YF (line 29007) | function YF(a){a=a|0;var b=0,d=0;b=i;if((c[7094478]|0)==0){d=0;i=b;retur...
function ZF (line 29007) | function ZF(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,i=0.0,j=0,k=0;if((c[709...
function _F (line 29007) | function _F(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0...
function $F (line 29007) | function $F(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0...
function aG (line 29007) | function aG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0...
function bG (line 29007) | function bG(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0....
function cG (line 29007) | function cG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if((a|0)==0){return}els...
function dG (line 29007) | function dG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function eG (line 29007) | function eG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function fG (line 29007) | function fG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=d...
function gG (line 29007) | function gG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=0;i=d;re...
function hG (line 29007) | function hG(a){a=a|0;var b=0;if((c[7094478]|0)==0){b=0;return b|0}b=(c[7...
function iG (line 29007) | function iG(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0.0;d=i;YJ(146632,(e=i,i=...
function jG (line 29007) | function jG(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if(!(+RJ(45488)!=0.0)){...
function kG (line 29007) | function kG(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function lG (line 29007) | function lG(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,...
function mG (line 29007) | function mG(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0;e=lG(146288,d,0)...
function nG (line 29007) | function nG(b,d,e){b=b|0;d=d|0;e=+e;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,...
function oG (line 29007) | function oG(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0,...
function pG (line 29007) | function pG(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0;e=i;if((b-1|0)>>>0>63...
function qG (line 29007) | function qG(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var j=0,k=0,l=0.0,m=0,n=0.0;j...
function rG (line 29007) | function rG(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;if((b-1|0)>>>0>63>>...
function sG (line 29007) | function sG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0;h=i...
function tG (line 29007) | function tG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if((b-1...
function uG (line 29007) | function uG(){var b=0,d=0,e=0,f=0;b=1;do{d=28370576+(b<<2)|0;e=c[d>>2]|0...
function vG (line 29007) | function vG(){var a=0,b=0,d=0,e=0,f=0;a=c[5425940]|0;if((a|0)!=0){bK(a)}...
function wG (line 29007) | function wG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((a-1|0)>...
function xG (line 29007) | function xG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;e=i;if(...
function yG (line 29007) | function yG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;if((a-1|0)>>>0>63>>...
function zG (line 29007) | function zG(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function AG (line 29007) | function AG(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function BG (line 29007) | function BG(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function CG (line 29007) | function CG(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function DG (line 29007) | function DG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=CG(a,b,0)...
function EG (line 29007) | function EG(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function FG (line 29007) | function FG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[422832]|0;i...
function GG (line 29007) | function GG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function HG (line 29007) | function HG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function IG (line 29007) | function IG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function JG (line 29007) | function JG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function KG (line 29007) | function KG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function LG (line 29007) | function LG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0...
function MG (line 29007) | function MG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=d|0;q$(f|0,b|...
function NG (line 29007) | function NG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;if(d>>>...
function OG (line 29007) | function OG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function PG (line 29007) | function PG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if((a|0)==0){return...
function QG (line 29007) | function QG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function RG (line 29007) | function RG(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function SG (line 29007) | function SG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function TG (line 29007) | function TG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function UG (line 29011) | function UG(b,d,e,f,h,j){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0...
function VG (line 29011) | function VG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0...
function WG (line 29011) | function WG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((a-1...
function XG (line 29011) | function XG(b,d,e,f,g,h,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j...
function YG (line 29011) | function YG(b,d,e,f,h,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0...
function ZG (line 29011) | function ZG(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function _G (line 29011) | function _G(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function $G (line 29011) | function $G(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if((b-1...
function aH (line 29011) | function aH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((a-1|0)>>>0>63>>>0){...
function bH (line 29011) | function bH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((b-1|0)>>>0>...
function cH (line 29011) | function cH(){var a=0,b=0,d=0,e=0,f=0;a=1;while(1){b=28370312+(a<<2)|0;d...
function dH (line 29011) | function dH(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function eH (line 29011) | function eH(){c[422832]=EG(TJ(44568,44168)|0)|0;c[4917286]=IG(TJ(43784,4...
function fH (line 29011) | function fH(){var a=0,b=0,d=0,e=0,f=0,g=0;a=0;while(1){if((c[28370312+(a...
function gH (line 29011) | function gH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0...
function hH (line 29011) | function hH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if((...
function iH (line 29011) | function iH(a,b){a=a|0;b=b|0;return}
function jH (line 29011) | function jH(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=i;if((a-1|0)>>>0>63>>>0){T...
function kH (line 29011) | function kH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function lH (line 29011) | function lH(){var a=0,b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,...
function mH (line 29011) | function mH(){var a=0,b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function nH (line 29011) | function nH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[5114358]|0;...
function oH (line 29011) | function oH(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function pH (line 29011) | function pH(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r...
function qH (line 29011) | function qH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0;d=i;if((a...
function rH (line 29011) | function rH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0,j=0,k=0,l=0.0,m=0;d=i...
function sH (line 29011) | function sH(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0....
function tH (line 29011) | function tH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0...
function uH (line 29011) | function uH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=c[4954634]|0;if((d|0)...
function vH (line 29011) | function vH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0;d=(a|0)<0?0:a;a=c[6...
function wH (line 29011) | function wH(){var a=0,b=0,d=0,e=0,f=0,h=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,...
function xH (line 29011) | function xH(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i...
function yH (line 29011) | function yH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a-1|0)>>>0>...
function zH (line 29011) | function zH(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function AH (line 29011) | function AH(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function BH (line 29011) | function BH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((a-1|0)>>>0>63>>...
function CH (line 29011) | function CH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;if((a-1|0)>>>0>63>>...
function DH (line 29011) | function DH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function EH (line 29011) | function EH(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var j=0,k=0,...
function FH (line 29011) | function FH(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0...
function GH (line 29011) | function GH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function HH (line 29011) | function HH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function IH (line 29011) | function IH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if(...
function JH (line 29011) | function JH(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function KH (line 29011) | function KH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=1;while(1){d=28370048+(b<...
function LH (line 29011) | function LH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function MH (line 29011) | function MH(){var a=0,b=0,d=0;a=i;c[5123034]=~~+UJ(107144,106104);b=kH(T...
function NH (line 29011) | function NH(){var a=0,b=0,d=0,e=0;a=c[5114358]|0;if((a|0)!=0){bK(a)}c[51...
function OH (line 29011) | function OH(){var a=0,b=0,d=0,e=0,f=0;a=1;while(1){b=28369656+(a<<2)|0;d...
function PH (line 29011) | function PH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function QH (line 29011) | function QH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0;d=i;if(...
function RH (line 29011) | function RH(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function SH (line 29011) | function SH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function TH (line 29011) | function TH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function UH (line 29011) | function UH(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+25...
function VH (line 29011) | function VH(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0...
function WH (line 29011) | function WH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0...
function XH (line 29011) | function XH(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0;f=i;if((a-1|...
function YH (line 29011) | function YH(a,b,d,f,h,j,k,l,m,n,o,p){a=a|0;b=b|0;d=d|0;f=f|0;h=h|0;j=j|0...
function ZH (line 29011) | function ZH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var h=0,j=0,k=0,l=0,...
function _H (line 29011) | function _H(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0...
function $H (line 29011) | function $H(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function aI (line 29011) | function aI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n...
function bI (line 29011) | function bI(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,...
function cI (line 29011) | function cI(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,...
function dI (line 29011) | function dI(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,h=0,j=0,k=0,l=0;f=i;...
function eI (line 29011) | function eI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function fI (line 29011) | function fI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function gI (line 29011) | function gI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0;e...
function hI (line 29011) | function hI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n...
function iI (line 29011) | function iI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function jI (line 29011) | function jI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function kI (line 29011) | function kI(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0...
function lI (line 29011) | function lI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function mI (line 29011) | function mI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function nI (line 29011) | function nI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function oI (line 29011) | function oI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function pI (line 29011) | function pI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function qI (line 29011) | function qI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n...
function rI (line 29011) | function rI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function sI (line 29011) | function sI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function tI (line 29011) | function tI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function uI (line 29011) | function uI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function vI (line 29011) | function vI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function wI (line 29011) | function wI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function xI (line 29011) | function xI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function yI (line 29011) | function yI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function zI (line 29011) | function zI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function AI (line 29011) | function AI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0...
function BI (line 29011) | function BI(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function CI (line 29011) | function CI(a){a=a|0;var b=0,d=0,e=0,f=0.0;b=i;if((a-1|0)>>>0>63>>>0){Tk...
function DI (line 29011) | function DI(a){a=a|0;var b=0,d=0,e=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c[709...
function EI (line 29011) | function EI(){UH();c[453928]=SJ(162880,160128)|0;c[453932]=SJ(157496,155...
function FI (line 29011) | function FI(){var a=0,b=0,d=0;a=1;do{b=28369656+(a<<2)|0;d=c[b>>2]|0;if(...
function GI (line 29011) | function GI(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function HI (line 29011) | function HI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;if((a-1|0)>...
function II (line 29011) | function II(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;do{if((b|0)>=1)...
function JI (line 29011) | function JI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0.0,l=0,m=0.0...
function KI (line 29011) | function KI(a){a=a|0;return}
function LI (line 29011) | function LI(){var a=0,b=0,d=0,e=0,f=0;a=1;while(1){b=28369392+(a<<2)|0;d...
function MI (line 29011) | function MI(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a-1|0)>>>0>63>>>0){Tk[c...
function NI (line 29011) | function NI(){var a=0,b=0,d=0;a=i;b=GI(TJ(151024,148752)|0)|0;c[46930]=b...
function OI (line 29011) | function OI(){var a=0,b=0,d=0,e=0;a=c[46930]|0;if((a|0)!=0){bK(a)}c[4693...
function PI (line 29011) | function PI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0;d=i;i=i+1064|0;e=d|...
function uT (line 29015) | function uT(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0...
function vT (line 29015) | function vT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((c[5120177]|0)==0){Ag(4,...
function wT (line 29015) | function wT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0;e=c[a+416>>...
function xT (line 29015) | function xT(){var a=0,b=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function yT (line 29015) | function yT(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function zT (line 29015) | function zT(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0;a=i;i=i+16|0;b=a|0;d=c...
function AT (line 29015) | function AT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0...
function BT (line 29015) | function BT(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0...
function CT (line 29015) | function CT(a,b){a=a|0;b=b|0;var d=0,e=0;if((c[a+84>>2]|0)!=0){d=c[51201...
function DT (line 29015) | function DT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ET (line 29015) | function ET(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0.0,l=0.0,m=0.0;d...
function FT (line 29015) | function FT(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0,j=0,k=0,l=0,m=0.0,n=0.0,o...
function GT (line 29015) | function GT(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p...
function HT (line 29015) | function HT(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q...
function IT (line 29015) | function IT(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function JT (line 29015) | function JT(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0,l=0,m=0.0,n=0.0...
function KT (line 29015) | function KT(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0;b=i...
function LT (line 29015) | function LT(b){b=b|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0.0;e=i;i=i+8e3|0;f=e...
function MT (line 29015) | function MT(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0...
function NT (line 29015) | function NT(a,b,c){a=a|0;b=b|0;c=c|0;g[c>>2]=+g[a+12>>2]+ +g[340895]*+g[...
function OT (line 29015) | function OT(a,b){a=a|0;b=b|0;g[b>>2]=+g[a>>2];g[b+8>>2]=0.0;g[b+16>>2]=0...
function PT (line 29015) | function PT(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;c=+g[340895];d=c*+g[a...
function QT (line 29015) | function QT(a,b){a=a|0;b=b|0;g[b>>2]=+g[a+24>>2];g[b+8>>2]=+g[a+32>>2];g...
function RT (line 29015) | function RT(a,b){a=+a;b=b|0;var c=0,d=0.0,e=0.0,f=0.0;c=~~(+g[340895]*a*...
function ST (line 29015) | function ST(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function TT (line 29015) | function TT(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function UT (line 29015) | function UT(a){a=a|0;var b=0,d=0,e=0;b=i;do{if((a|0)<0){Tk[c[4886344]&25...
function VT (line 29015) | function VT(b){b=b|0;var d=0,e=0;d=i;e=cC(b,0)|0;if((a[e]|0)==0){Tk[c[48...
function WT (line 29015) | function WT(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function XT (line 29015) | function XT(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function YT (line 29015) | function YT(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function ZT (line 29015) | function ZT(a){a=a|0;var b=0,d=0,e=0;b=i;if((o$(a|0)|0)>>>0>63>>>0){Tk[c...
function _T (line 29015) | function _T(a){a=a|0;var b=0,d=0,e=0;b=i;if((o$(a|0)|0)>>>0>63>>>0){Tk[c...
function $T (line 29015) | function $T(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;a=i;Tk[c[48863...
function aU (line 29015) | function aU(){var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=...
function bU (line 29015) | function bU(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;e=i;if((k$(cC(b...
function cU (line 29015) | function cU(b,d){b=b|0;d=d|0;var e=0,f=0,h=0;e=i;f=cC(b,0)|0;if((a[f]|0)...
function dU (line 29015) | function dU(a){a=a|0;var b=0,d=0,e=0;b=i;do{if((VB(a,168088)|0)==0){d=1}...
function eU (line 29015) | function eU(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function fU (line 29015) | function fU(){var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=...
function gU (line 29015) | function gU(){if((c[(c[4917346]|0)+32>>2]|0)!=2|(c[5123020]|0)<4){return...
function hU (line 29015) | function hU(){var a=0.0,b=0.0,d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=...
function iU (line 29015) | function iU(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o...
function jU (line 29015) | function jU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0...
function kU (line 29015) | function kU(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o...
function lU (line 29015) | function lU(a){a=+a;var b=0,c=0,d=0,e=0,f=0,h=0,j=0.0,k=0,l=0,m=0,n=0.0,...
function mU (line 29015) | function mU(a,b,d,e,f){a=+a;b=+b;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0...
function nU (line 29015) | function nU(a,b){a=+a;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0,...
function rC (line 29019) | function rC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function sC (line 29019) | function sC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=c[b>>2]|0...
function tC (line 29019) | function tC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function uC (line 29019) | function uC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function vC (line 29019) | function vC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function wC (line 29019) | function wC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function xC (line 29019) | function xC(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==0...
function yC (line 29019) | function yC(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0...
function zC (line 29019) | function zC(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function AC (line 29019) | function AC(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function BC (line 29019) | function BC(a){a=a|0;var b=0,d=0;if((a|0)==0){b=-102;return b|0}c[a+52>>...
function CC (line 29019) | function CC(a){a=a|0;return zC(a,0)|0}
function DC (line 29019) | function DC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)==0){b=-102;return ...
function EC (line 29019) | function EC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)==0){b=-102;return ...
function FC (line 29019) | function FC(a,b){a=a|0;b=b|0;var d=0,e=0;if((a|0)==0){d=-102;return d|0}...
function GC (line 29019) | function GC(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h...
function HC (line 29019) | function HC(b,e,f,g,h,j,k,l,m){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0...
function IC (line 29019) | function IC(a){a=a|0;var b=0,d=0,e=0,f=0;if((a|0)==0){b=-102;return b|0}...
function JC (line 29019) | function JC(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0...
function KC (line 29019) | function KC(a){a=a|0;return JC(a,0,0,0,0)|0}
function LC (line 29019) | function LC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0...
function MC (line 29019) | function MC(a){a=a|0;var b=0,d=0;do{if((a|0)==0){b=-102}else{d=c[a+156>>...
function NC (line 29019) | function NC(a){a=a|0;var b=0,d=0;if((a|0)==0){b=-102;return b|0}if((c[a+...
function OC (line 29019) | function OC(a,b){a=a|0;b=b|0;var d=0;if((a|0)==0){d=-102;return d|0}c[a+...
function PC (line 29019) | function PC(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;do{if((c&3|0)==1){d=136...
function QC (line 29019) | function QC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Dj(c|0,1,d|0,b|0)|0}
function RC (line 29019) | function RC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ad(c|0,1,d|0,b|0)|0}
function SC (line 29019) | function SC(a,b){a=a|0;b=b|0;return Ii(b|0)|0}
function TC (line 29019) | function TC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(!(d>>>0<3>>>0)){...
function UC (line 29019) | function UC(a,b){a=a|0;b=b|0;return kb(b|0)|0}
function VC (line 29019) | function VC(a,b){a=a|0;b=b|0;return je(b|0)|0}
function WC (line 29019) | function WC(a){a=a|0;c[a>>2]=6;c[a+4>>2]=14;c[a+8>>2]=30;c[a+12>>2]=114;...
function XC (line 29019) | function XC(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0...
function YC (line 29019) | function YC(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0...
function ZC (line 29019) | function ZC(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function _C (line 29019) | function _C(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0...
function $C (line 29019) | function $C(a){a=a|0;c[218970]=a;return}
function aD (line 29019) | function aD(){gt(135816,174256,1)|0;gt(147592,174256,1)|0;gt(129824,1742...
function bD (line 29019) | function bD(){var a=0,b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0,...
function cD (line 29019) | function cD(){var b=0,d=0,e=0,f=0,g=0;b=i;Sr(126784,(d=i,i=i+1|0,i=i+7&-...
function dD (line 29019) | function dD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function eD (line 29019) | function eD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+80|0;e=d|0;...
function fD (line 29019) | function fD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function gD (line 29019) | function gD(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){i=d;return}do{...
function hD (line 29019) | function hD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+64|...
function iD (line 29019) | function iD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function jD (line 29019) | function jD(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;d=0;while(1){e=875...
function kD (line 29019) | function kD(){a[20840]=1;return}
function lD (line 29019) | function lD(){a[20840]=0;return}
function mD (line 29019) | function mD(a){a=a|0;var b=0,d=0,e=0;do{if((a|0)==0){b=0}else{d=c[542593...
function nD (line 29019) | function nD(a,b){a=a|0;b=b|0;var d=0,e=0;if((b|0)==0|(c[5425930]|0)==0){...
function oD (line 29019) | function oD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function pD (line 29019) | function pD(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[(c[a>>2]|0)+8>>2]|0;a=c[(c[...
function qD (line 29019) | function qD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=c[5425930...
function rD (line 29019) | function rD(a){a=a|0;var b=0;if((c[a+92>>2]|0)==0){b=0;return b|0}b=rf(a...
function sD (line 29019) | function sD(a){a=a|0;var b=0,d=0;b=i;if((c[a+92>>2]|0)==0){Ur(0,112832,(...
function tD (line 29019) | function tD(){return c[5425930]|0}
function uD (line 29019) | function uD(a){a=a|0;c[5425930]=a;return}
function vD (line 29019) | function vD(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function wD (line 29019) | function wD(f,h){f=f|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0...
function xD (line 29019) | function xD(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var...
function yD (line 29019) | function yD(a){a=a|0;return jk[c[7092493]&255](a)|0}
function zD (line 29019) | function zD(a,b,d,e,f,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var...
function AD (line 29019) | function AD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;fk[c[7092496]&127](...
function BD (line 29019) | function BD(a){a=a|0;return}
function CD (line 29019) | function CD(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}
function DD (line 29019) | function DD(a){a=a|0;var b=0;b=a+1|0;return((a|0)>-1&(b|0)<(c[7090275]|0...
function ED (line 29019) | function ED(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i...
function FD (line 29019) | function FD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function GD (line 29019) | function GD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function HD (line 29019) | function HD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ID (line 29019) | function ID(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function JD (line 29019) | function JD(){var a=0,b=0,d=0,e=0,f=0,g=0;a=c[7090275]|0;if((a|0)>1){b=1...
function KD (line 29019) | function KD(){var a=0,b=0;JD();a=(o$(Ok[c[7092495]&63]()|0)|0)+1|0;c[709...
function LD (line 29019) | function LD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i...
function MD (line 29019) | function MD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0...
function ND (line 29019) | function ND(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=c[709...
function OD (line 29019) | function OD(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function PD (line 29019) | function PD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0...
function QD (line 29019) | function QD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0...
function RD (line 29019) | function RD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function SD (line 29019) | function SD(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=...
function TD (line 29019) | function TD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=0;whi...
function UD (line 29019) | function UD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Ok[c[7092507]&63]()|0;Yk[...
function VD (line 29019) | function VD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0.0,n=0,o...
function WD (line 29019) | function WD(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[7094479]|0)==0){Tk[c[...
function XD (line 29019) | function XD(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)>-1&(c[7094550]|0)>(a|0...
function YD (line 29019) | function YD(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[7094479]|0)==0){d=0;i=b;r...
function ZD (line 29019) | function ZD(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[7094479]|0)==0){d=0;i=b;r...
function _D (line 29019) | function _D(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0;d=c[7094550]|0;...
function $D (line 29019) | function $D(){var a=0,b=0;a=c[7094550]|0;if((a|0)>0){b=0}else{return}do{...
function aE (line 29019) | function aE(){var a=0,b=0;if((c[7094550]|0)<=0){return}a=c[7094552]|0;b=...
function bE (line 29019) | function bE(){var a=0,b=0,d=0,e=0,f=0;a=c[7094550]|0;if((a|0)>0){b=0;d=a...
function cE (line 29019) | function cE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((c[7094478]|0)==0){b=0;r...
function dE (line 29019) | function dE(){var a=0;c[7094516]=0;a=c[7094517]|0;if((a|0)!=0){bK(a)}c[7...
function eE (line 29019) | function eE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i...
function fE (line 29019) | function fE(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function gE (line 29019) | function gE(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function hE (line 29019) | function hE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+1040|0;e=d+1024...
function iE (line 29019) | function iE(){return c[7094478]|0}
function jE (line 29019) | function jE(){return c[7094479]|0}
function kE (line 29019) | function kE(a){a=+a;var b=0,d=0,e=0,f=0,g=0;b=i;if((c[7094478]|0)==0|(c[...
function lE (line 29019) | function lE(a){a=+a;var b=0,d=0;g[7094482]=a;bE();aE();kE(a);c[7094588]=...
function mE (line 29019) | function mE(){return+(+g[7094482])}
function nE (line 29019) | function nE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0...
function oE (line 29019) | function oE(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+64|0;if((a|0)==0){d=0;i...
function pE (line 29019) | function pE(){var a=0;c[7094551]=~~+UJ(172816,169680);c[7094550]=~~+UJ(1...
function qE (line 29019) | function qE(){var a=0,b=0;a=i;QF();JD();DF();TF();VF();dE();b=c[7094552]...
function rE (line 29019) | function rE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0...
function sE (line 29019) | function sE(){g[7094598]=0.0;g[7094599]=0.0;g[7094600]=-1.0;g[7094601]=+...
function tE (line 29019) | function tE(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0...
function uE (line 29019) | function uE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;e=i;i=i...
function vE (line 29019) | function vE(a){a=a|0;var b=0,c=0,d=0;b=i;i=i+16|0;c=b|0;d=c|0;g[d>>2]=+g...
function wE (line 29019) | function wE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0...
function xE (line 29019) | function xE(a,b,c,d,e,f,g,h,j,k,l,m,n){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f...
function yE (line 29019) | function yE(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0....
function zE (line 29019) | function zE(a){a=a|0;return+(+yE(a,120.0))}
function AE (line 29019) | function AE(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0...
function oU (line 29023) | function oU(){var a=0,b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=...
function pU (line 29023) | function pU(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;do{if(((c[340902]|0)+a|0)<1...
function qU (line 29023) | function qU(a,b,d,e,f,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;j=+j;k=+k...
function rU (line 29023) | function rU(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qU(a,b,c,d,0.0,0.0,1.0,1.0)...
function sU (line 29023) | function sU(a,b){a=a|0;b=b|0;cV(139600);c[340900]=0;g[310890]=+g[a>>2];g...
function tU (line 29023) | function tU(a){a=a|0;var b=0,c=0;b=i;i=i+32|0;c=b|0;g[c>>2]=0.0;g[c+4>>2...
function uU (line 29023) | function uU(a){a=a|0;var b=0,d=0,e=0.0;cV(125816);b=a+28|0;if((c[b>>2]|0...
function vU (line 29023) | function vU(a){a=a|0;var b=0;a=i;Tk[c[4886344]&255](0,115416,(b=i,i=i+1|...
function wU (line 29023) | function wU(a){a=a|0;return}
function xU (line 29023) | function xU(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+80|0;d=a+72|0;e=a+4|0;f=a+8...
function yU (line 29023) | function yU(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0...
function zU (line 29023) | function zU(a){a=a|0;var b=0,d=0,e=0,f=0;b=a+80|0;d=a+72|0;e=a+4|0;f=a+8...
function AU (line 29023) | function AU(a){a=a|0;var b=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function BU (line 29023) | function BU(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p...
function CU (line 29023) | function CU(a){a=a|0;if((c[(c[4917502]|0)+32>>2]|0)==0){return}yQ(a,c[34...
function DU (line 29023) | function DU(a){a=a|0;var b=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0...
function EU (line 29023) | function EU(a){a=a|0;FU(c[a+104>>2]|0,c[a+108>>2]|0,c[a+80>>2]|0,c[a+72>...
function FU (line 29023) | function FU(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h...
function GU (line 29023) | function GU(a,b,e,f,h){a=a|0;b=b|0;e=e|0;f=+f;h=+h;var i=0.0,j=0,k=0,l=0...
function HU (line 29023) | function HU(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0...
function IU (line 29023) | function IU(a){a=a|0;var b=0.0,d=0;b=+g[a+12>>2];if((c[5120198]|0)==3364...
function JU (line 29023) | function JU(a){a=a|0;var b=0.0,d=0;b=+g[a+8>>2];if((c[5120198]|0)==33640...
function KU (line 29023) | function KU(a,b){a=a|0;b=b|0;if((c[5120198]|0)==33640){g[a>>2]=+((b&1023...
function LU (line 29023) | function LU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((e|0...
function MU (line 29023) | function MU(b,e,f,h,j){b=b|0;e=e|0;f=f|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0...
function NU (line 29023) | function NU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if((e|0...
function OU (line 29023) | function OU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0...
function PU (line 29023) | function PU(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){Tk[c[4886345]&255]...
function QU (line 29023) | function QU(){cV(174944);if((c[5120125]|0)==0){KR(125760,680);return}hk[...
function RU (line 29023) | function RU(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==0){Tk[c[4886345]&255]...
function SU (line 29023) | function SU(){cV(165224);if((c[5120126]|0)==0){return}hk[c[4920092]&255]...
function TU (line 29023) | function TU(){var a=0,b=0;a=i;Tk[c[4886344]&255](0,162088,(b=i,i=i+1|0,i...
function UU (line 29023) | function UU(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;Tk[c[4886344]&255]...
function VU (line 29023) | function VU(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;cV(136544);c[7094292]=(c[70...
function WU (line 29023) | function WU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=c[(SS(c[a+8>>...
function XU (line 29023) | function XU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0.0,k=0,l=0,
Copy disabled (too large)
Download .json
Condensed preview — 41 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (11,025K chars).
[
{
"path": ".dockerignore",
"chars": 16,
"preview": "bin\nchart\ntools\n"
},
{
"path": ".gitattributes",
"chars": 37,
"preview": "public/ioquake3.js linguist-vendored\n"
},
{
"path": ".github/workflows/push-image.yaml",
"chars": 2576,
"preview": "name: Push Image\n\non:\n push:\n # Sequence of patterns matched against refs/tags\n tags:\n - 'v*' # Push events to"
},
{
"path": ".github/workflows/test.yaml",
"chars": 463,
"preview": "name: Tests\n\non:\n push:\n branches: [ master ]\n pull_request:\n branches: [ master ]\n\njobs:\n test:\n runs-on: u"
},
{
"path": ".gitignore",
"chars": 272,
"preview": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Ou"
},
{
"path": "Dockerfile",
"chars": 886,
"preview": "FROM golang:1.13 as builder\n\nWORKDIR /workspace\nCOPY go.mod go.mod\nCOPY go.sum go.sum\nARG GOPROXY\nARG GOSUMDB\nRUN go mod"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 676,
"preview": "BIN_DIR ?= bin\nLDFLAGS := -s -w\nGOFLAGS = -gcflags \"all=-trimpath=$(PWD)\" -asmflags \"all=-trimpath=$(PWD)\"\nGO_BUILD_ENV_"
},
{
"path": "README.md",
"chars": 7848,
"preview": "# Due to changes in the priorities, this project is currently not being supported. The project is archived as of 11/17/2"
},
{
"path": "cmd/q3/app/cmd/cmd.go",
"chars": 253,
"preview": "package cmd\n\nimport \"github.com/spf13/cobra\"\n\nfunc NewCommand() *cobra.Command {\n\tcmd := &cobra.Command{\n\t\tUse: \"cmd\","
},
{
"path": "cmd/q3/app/content/content.go",
"chars": 1669,
"preview": "package content\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/spf13/cobra\"\n\n\tquak"
},
{
"path": "cmd/q3/app/proxy/proxy.go",
"chars": 1092,
"preview": "package proxy\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/spf13/cobra\"\n\n\tquakeclient \"github.com/criticalstack/quake-kube"
},
{
"path": "cmd/q3/app/server/server.go",
"chars": 2785,
"preview": "package server\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/spf13/cobra\"\n\n\tquak"
},
{
"path": "cmd/q3/main.go",
"chars": 698,
"preview": "package main\n\nimport (\n\t\"log\"\n\n\t\"github.com/spf13/cobra\"\n\n\tq3cmd \"github.com/criticalstack/quake-kube/cmd/q3/app/cmd\"\n\tq"
},
{
"path": "config.yaml",
"chars": 592,
"preview": "fragLimit: 25\ntimeLimit: 15m\nbot:\n minPlayers: 3\ngame:\n motd: \"Welcome to Critical Stack\"\n type: FreeForAll\n forceRe"
},
{
"path": "example.yaml",
"chars": 2496,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: quake\nspec:\n selector:\n matchLabels:\n run: quake\n repli"
},
{
"path": "go.mod",
"chars": 545,
"preview": "module github.com/criticalstack/quake-kube\n\ngo 1.14\n\nrequire (\n\tgithub.com/cockroachdb/cmux v0.0.0-20170110192607-30d10b"
},
{
"path": "go.sum",
"chars": 26029,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/BurntSushi/toml v0.3.1/go."
},
{
"path": "internal/quake/client/proxy.go",
"chars": 2397,
"preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gorilla/websocket\"\n)"
},
{
"path": "internal/quake/client/router.go",
"chars": 2843,
"preview": "package client\n\nimport (\n\t\"html/template\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/labstack/echo/v4\"\n\t\"gi"
},
{
"path": "internal/quake/client/server.go",
"chars": 1242,
"preview": "package client\n\nimport (\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/cockroachdb/cmux\"\n)\n\ntype Server struct {\n\tAddr "
},
{
"path": "internal/quake/content/download.go",
"chars": 3271,
"preview": "package content\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/url\""
},
{
"path": "internal/quake/content/files.go",
"chars": 1120,
"preview": "package content\n\nimport (\n\t\"hash/crc32\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\ntype File struct {\n\tName "
},
{
"path": "internal/quake/content/maps.go",
"chars": 1270,
"preview": "package content\n\nimport (\n\t\"archive/zip\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\ntype Map struct {\n\tFile string `json:\"file"
},
{
"path": "internal/quake/content/router.go",
"chars": 3448,
"preview": "package content\n\nimport (\n\t\"archive/zip\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/labsta"
},
{
"path": "internal/quake/content/router_test.go",
"chars": 692,
"preview": "package content\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n)\n\nfunc TestTrimAssetName(t *testing.T) {\n\tcases :"
},
{
"path": "internal/quake/net/net.go",
"chars": 2735,
"preview": "package net\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n)\n\nconst (\n\tOutOfBandHeader ="
},
{
"path": "internal/quake/server/config.go",
"chars": 6612,
"preview": "package server\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n\tmetav1 \"k8s"
},
{
"path": "internal/quake/server/config_test.go",
"chars": 1954,
"preview": "package server\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"sigs.k8s.io/yaml\"\n)\n\nconst config = `\nfrag"
},
{
"path": "internal/quake/server/eula.go",
"chars": 9920,
"preview": "package server\n\nconst Q3DemoEULA = `LIMITED USE SOFTWARE LICENSE AGREEMENT\n\nThis Limited Use Software License Agreement "
},
{
"path": "internal/quake/server/server.go",
"chars": 4071,
"preview": "package server\n\nimport (\n\t\"context\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/prometheus/c"
},
{
"path": "internal/util/exec/exec.go",
"chars": 595,
"preview": "package exec\n\nimport (\n\t\"context\"\n\t\"os/exec\"\n)\n\ntype Cmd struct {\n\t*exec.Cmd\n}\n\nfunc (cmd *Cmd) Restart(ctx context.Cont"
},
{
"path": "internal/util/net/http/http.go",
"chars": 767,
"preview": "package http\n\nimport (\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n)\n\nfunc GetBody(url string) ([]byte, e"
},
{
"path": "internal/util/net/net.go",
"chars": 566,
"preview": "package net\n\nimport (\n\t\"net\"\n\n\t\"github.com/pkg/errors\"\n)\n\n// DetectHostIPv4 attempts to determine the host IPv4 address "
},
{
"path": "public/browserconfig.xml",
"chars": 330,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n\t<msapplication>\n\t\t<tile>\n\t\t\t<square70x70logo src=\"/images/ms-ico"
},
{
"path": "public/game.css",
"chars": 38751,
"preview": "html, body {\n\theight: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: #000;\n}\n\n#bg {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;"
},
{
"path": "public/index.html",
"chars": 6166,
"preview": "{{define \"index\"}}<!DOCTYPE html>\n<html>\n <head>\n <title>QuakeJS Local</title>\n <link rel=\"stylesheet\" href=\"game"
},
{
"path": "public/ioquake3.js",
"chars": 4055314,
"preview": "// Note: For maximum-speed code, see \"Optimizing Code\" on the Emscripten wiki, https://github.com/kripken/emscripten/wik"
},
{
"path": "public/manifest.json",
"chars": 769,
"preview": "{\n \"name\": \"App\",\n \"icons\": [\n {\n \"src\": \"\\/images\\/android-icon-36x36.png\",\n \"sizes\": \"36x36\",\n \"type\": \"image\\/"
},
{
"path": "public/zz_generated.static.go",
"chars": 5416700,
"preview": "// Code generated by vfsgen; DO NOT EDIT.\n\n// +build !dev\n\npackage public\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"i"
},
{
"path": "tools/genstatic.go",
"chars": 1355,
"preview": "// +build ignore\n\npackage main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/shurcooL/httpfs"
}
]
About this extraction
This page contains the full source code of the criticalstack/quake-kube GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 41 files (9.2 MB), approximately 2.4M tokens, and a symbol index with 3457 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.